Satora.Sdk
0.1.0-ci.20260706.26.sha-3d28a8b
dotnet add package Satora.Sdk --version 0.1.0-ci.20260706.26.sha-3d28a8b
NuGet\Install-Package Satora.Sdk -Version 0.1.0-ci.20260706.26.sha-3d28a8b
<PackageReference Include="Satora.Sdk" Version="0.1.0-ci.20260706.26.sha-3d28a8b" />
<PackageVersion Include="Satora.Sdk" Version="0.1.0-ci.20260706.26.sha-3d28a8b" />
<PackageReference Include="Satora.Sdk" />
paket add Satora.Sdk --version 0.1.0-ci.20260706.26.sha-3d28a8b
#r "nuget: Satora.Sdk, 0.1.0-ci.20260706.26.sha-3d28a8b"
#:package Satora.Sdk@0.1.0-ci.20260706.26.sha-3d28a8b
#addin nuget:?package=Satora.Sdk&version=0.1.0-ci.20260706.26.sha-3d28a8b&prerelease
#tool nuget:?package=Satora.Sdk&version=0.1.0-ci.20260706.26.sha-3d28a8b&prerelease
Satora.Sdk
.NET bindings for the Satora swap SDK. A thin idiomatic-C# wrapper over a Rust core via UniFFI; native libraries are shipped per-RID inside the package.
Install
dotnet add package Satora.Sdk --prerelease
using Satora.Sdk;
Quick start
using Satora.Sdk;
// One constructor. Mnemonic is required and drives both the EVM
// signer and the Arkade identity (consumers don't get to mismatch
// them). All other knobs default off the chosen network.
using var client = new Client(
mnemonic: "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about");
var version = await client.GetVersionAsync();
Console.WriteLine($"Server: {version.Tag} ({version.CommitHash})");
// Dev / mutinynet
using var client = new Client(mnemonic, BitcoinNetwork.Signet);
// Full override (rare — e.g. pointing at a local stack)
using var client = new Client(
mnemonic,
BitcoinNetwork.Regtest,
baseUrl: "http://localhost:3333",
arkadeServerUrl: "http://localhost:7070",
esploraUrl: "http://localhost:3000");
Network defaults
BitcoinNetwork |
baseUrl |
arkadeServerUrl |
esploraUrl |
|---|---|---|---|
Mainnet |
https://api.satora.io |
https://arkade.computer |
https://mempool.space/api |
Testnet |
https://mutinynetswap.lendasat.com |
https://mutinynet.arkade.sh |
https://mutinynet.com/api |
Signet |
https://mutinynetswap.lendasat.com |
https://mutinynet.arkade.sh |
https://mutinynet.com/api |
Regtest |
http://localhost:3333 |
http://localhost:7070 |
http://localhost:3000 |
Testnet and Signet both route to mutinynet — vanilla Bitcoin testnet
isn't supported by the Arkade infrastructure.
Supported swap pairs
The SDK currently exposes EVM-stablecoin → BTC on Arkade through
CreateSwapAsync. Other directions the backend supports (Lightning ↔
Arkade, Bitcoin ↔ EVM, Arkade → EVM, etc.) will land as we add
direction-specific entry points — open an issue if you need one
prioritised.
Source tokens (use as sourceToken with the matching sourceChain):
| Token | Chain | TokenId | ChainId |
|---|---|---|---|
| USDC | Polygon | TokenId.UsdcPolygon |
ChainId.Polygon |
| USDC | Arbitrum | TokenId.UsdcArbitrum |
ChainId.Arbitrum |
| USDC | Ethereum | TokenId.UsdcEthereum |
ChainId.Ethereum |
| USDT | Polygon | TokenId.UsdtPolygon |
ChainId.Polygon |
| USDT | Ethereum | TokenId.UsdtEthereum |
ChainId.Ethereum |
| USDT0 | Arbitrum | TokenId.Usdt0Arbitrum |
ChainId.Arbitrum |
| WBTC | Polygon | TokenId.WbtcPolygon |
ChainId.Polygon |
| WBTC | Arbitrum | TokenId.WbtcArbitrum |
ChainId.Arbitrum |
| WBTC | Ethereum | TokenId.WbtcEthereum |
ChainId.Ethereum |
Target is always TokenId.Btc on ChainId.Arkade. gasless: true is
supported on every pair.
Notes:
- Pass
receiveTo: nulltoCreateSwapAsyncto land funds in the SDK's own Arkade wallet (the identity derived from your mnemonic). Otherwise pass anAddress.Arkade("tark1q…").
Funding swaps (gasless)
For an EVM-funded swap the typical sequence is:
CreateSwapAsync— backend returns a depositor EOA address.- Tell the customer to send the source token there.
- Poll
CheckDepositAsync(swapId)untilHasSufficientSourceToken— single-shot, returns immediately. No timeout, no throw. FundSwapAsync(swapId)— submits the gasless funding userOp.
var status = await client.CheckDepositAsync(swapId);
if (status.HasSufficientSourceToken)
{
var receipt = await client.FundSwapAsync(swapId);
}
else
{
// show "waiting for customer payment" — try again later
}
FundSwapAsync(swapId) and CheckDepositAsync(swapId) both pick
the node RPC URL from the swap's deposit chain via the same
per-chain defaults.
Defaults come from the Rust core (KnownChain::default_node_rpc_url),
which currently points at the public RPCs for Arbitrum / Ethereum /
Polygon — fine for low-volume use. For production volume, custom
paymaster context, or gas overrides, use the explicit overload:
var status = await client.CheckDepositAsync(swapId, nodeRpcUrl: "https://your-private-rpc.example/v3/<key>");
var receipt = await client.FundSwapAsync(
swapId,
new GaslessOpts(
nodeRpcUrl: "https://your-private-rpc.example/v3/<key>",
paymasterContextJson: null,
gasOverrides: null));
Supported runtimes
The package ships native cdylibs for:
osx-arm64(Apple Silicon)osx-x64(Intel Mac)linux-x64linux-arm64win-x64
Other RIDs are not yet packaged — open an issue if you need one.
Plugin-host environments (BTCPay Server, etc.)
The SDK installs a NativeLibrary.SetDllImportResolver at module load
time that finds satora_sdk_ffi under runtimes/<rid>/native/
relative to the SDK assembly. A single portable publish works in
plugin hosts that use a custom AssemblyLoadContext and don't honor
the consumer's deps.json for native libs — no special configuration
needed:
dotnet publish -c Release # all RIDs bundled under runtimes/
Legacy: forcing a flat layout
The <SatoraSdkFlattenNativeLibs>true</SatoraSdkFlattenNativeLibs>
property and the build/Satora.Sdk.targets flatten step are still
available for consumers who need the native lib directly next to the
SDK assembly. Note that this forces one-arch-per-bundle on Linux
because linux-x64 and linux-arm64 share the libsatora_sdk_ffi.so
filename. Prefer the RID-scoped layout (no flatten) unless you have a
specific reason.
Errors
All FFI failures surface as SdkException (subclass of Exception) so
standard try/catch works. The inner Kind enum carries a tagged
variant identifying the underlying Rust error.
Links
- Source: https://github.com/satoraHQ/lendaswap-sdk
- API host: https://api.satora.io
- License: MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.1.0-ci.20260706.26... | 70 | 7/6/2026 |
| 0.1.0-ci.20260625.25... | 70 | 6/25/2026 |
| 0.1.0-ci.20260526.24... | 86 | 5/26/2026 |
| 0.1.0-ci.20260526.23... | 57 | 5/26/2026 |
| 0.1.0-ci.20260526.22... | 55 | 5/26/2026 |
| 0.1.0-ci.20260526.21... | 56 | 5/26/2026 |
| 0.1.0-ci.20260526.20... | 58 | 5/26/2026 |
| 0.0.1-ci.20260526.19... | 52 | 5/26/2026 |
| 0.0.1-ci.20260526.18... | 52 | 5/26/2026 |
| 0.0.1-ci.20260526.17... | 59 | 5/26/2026 |
| 0.0.1-ci.20260526.15... | 54 | 5/26/2026 |
| 0.0.1-ci.20260525.14... | 63 | 5/25/2026 |
| 0.0.1-ci.20260525.13... | 61 | 5/25/2026 |
| 0.0.1-ci.20260522.12... | 60 | 5/22/2026 |
| 0.0.1-ci.20260521.11... | 66 | 5/21/2026 |
| 0.0.1-ci.20260521.10... | 57 | 5/21/2026 |
| 0.0.1-ci.20260521.9... | 52 | 5/21/2026 |
| 0.0.1-ci.20260521.8... | 66 | 5/21/2026 |