Satora.Sdk 0.1.0-ci.20260706.26.sha-3d28a8b

This is a prerelease version of Satora.Sdk.
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
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Satora.Sdk" Version="0.1.0-ci.20260706.26.sha-3d28a8b" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Satora.Sdk" Version="0.1.0-ci.20260706.26.sha-3d28a8b" />
                    
Directory.Packages.props
<PackageReference Include="Satora.Sdk" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
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"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Satora.Sdk@0.1.0-ci.20260706.26.sha-3d28a8b
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Satora.Sdk&version=0.1.0-ci.20260706.26.sha-3d28a8b&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=Satora.Sdk&version=0.1.0-ci.20260706.26.sha-3d28a8b&prerelease
                    
Install as a Cake Tool

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: null to CreateSwapAsync to land funds in the SDK's own Arkade wallet (the identity derived from your mnemonic). Otherwise pass an Address.Arkade("tark1q…").

Funding swaps (gasless)

For an EVM-funded swap the typical sequence is:

  1. CreateSwapAsync — backend returns a depositor EOA address.
  2. Tell the customer to send the source token there.
  3. Poll CheckDepositAsync(swapId) until HasSufficientSourceToken — single-shot, returns immediately. No timeout, no throw.
  4. 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-x64
  • linux-arm64
  • win-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.

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • 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