Skip to main content

Use our SDKs

We provide various language SDKs to make integrations easier for developers.

Available SDKsโ€‹

LanguageRepositoryStatus
Goark-network/ark/pkg/client-sdkExperimental ๐Ÿšง
TypeScriptArkLabsHQ/wallet-sdkExperimental ๐Ÿšง
RustArkLabsHQ/ark-rsExperimental ๐Ÿšง

Install the SDKโ€‹

go get github.com/ark-network/ark/pkg/client-sdk

Initialize the Clientโ€‹

storeSvc, err := store.NewStore(store.Config{
ConfigStoreType: arksdktypes.FileStore,
AppDataStoreType: arksdktypes.SQLStore,
BaseDir: "path/to/datadir",
})
if err != nil {
log.Fatalf("failed to setup client db: %s", err)
}

clientSvc, err := arksdk.LoadArkClient(storeSvc)
if err != nil {
clientSvc, err = arksdk.NewArkClient(storeSvc)
if err != nil {
log.Fatalf("failed to setup ark client: %s", err)
}
}

Creating a walletโ€‹

password := "password"
serverUrl := "localhost:7070"
ctx := context.Background()

if err := clientSvc.Init(ctx, arksdk.InitArgs{
WalletType: arksdk.SingleKeyWallet,
ClientType: arksdk.GrpcClient,
ServerUrl: serverUrl,
Password: password,
}); err != nil {
log.Fatalf("failed to initialize ark client: %s", err)
}

if err := clientSvc.Unlock(ctx, password); err != nil {
log.Fatalf("failed to unlock ark client: %s", err)
}

Load an existing walletโ€‹

password := "password"
ctx := context.Background()

if err := clientSvc.Unlock(ctx, password); err != nil {
log.Fatalf("failed to unlock ark client: %s", err)
}

Receiving fundsโ€‹

myOffchainAddr, myBoardingAddr, err := clientSvc.Receive(context.Backgroud())
if err != nil {
log.Fatalf("failed to fetch address: %s", err)
}

fmt.Printf("offchain address: %s\nboarding address: %s\n", myOffchainAddr, myBoardingAddr)

Sending fundsโ€‹

ctx := context.Background()
receivers := []arksdk.Receiver{
arksdk.NewBitcoinReceiver(destOffchainAddr, amountInSats),
}

var change []arksdktypes.Vtxo
var err error

wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
change, err = clientSvc.NotifyIncomingFunds(ctx, myOffchainAddr)
wg.Done()
}()

withExpiryCoinSelection := true
withZeroFees := true

txid, err := clientSvc.SendOffChain(ctx, !withExpiryCoinSelection, receivers, withZeroFees)
if err != nil {
log.Fatalf("failed to send offchain: %s", err)
}

wg.Wait()

if err != nil {
log.Fatalf("failed to fetch incoming funds: %s", err)
}
log.Printf("sent funds offchain: %s\nchange vtxos: %+v\n", txid, change)

Detect incoming fundsโ€‹

vtxos, err := clientSvc.NotifyIncomingFunds(ctx, myOffchainAddr)
if err != nil {
log.Fatalf("failed to fetch incoming funds: %s", err)
}

fmt.Printf("vtxos: %+v\n", vtxos)

Fetch your balanceโ€‹

computeExpiry := true
skipComputeExpiry := !computeExpiry
balance, err := clientSvc.Balance(context.Background(), skipComputeExpiry)
if err != nil {
log.Fatal(err)
}

fmt.Printf("offchain balance: %+v\nonchain balance: %+v\n", balance.OffchainBalance, balance.OnchainBalance)

Batch Swapโ€‹

ctx := context.Background()

var vtxos []arksdktypes.Vtxo
var err error

wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
vtxos, err = clientSvc.NotifyIncomingFunds(ctx, myOffchainAddr)
wg.Done()
}()

commitmenTxid, err := clientSvc.Settle(ctx)
if err != nil {
log.Fatalf("failed to settle: %s", err)
}

wg.Wait()
if err != nil {
log.Fatalf("failed to fetch incoming funds: %s", err)
}

fmt.Printf("vtxos settled in commitment tx: %s\nsettled vtxos: %+v\n", commitmenTxid, vtxos)

Collaborative Exitโ€‹

ctx := context.Background()

var change []arksdktypes.Vtxo
var err error

wg := &sync.WaitGroup{}
wg.Add(1)
go func() {
change, err = clientSvc.NotifyIncomingFunds(ctx, myOffchainAddr)
wg.Done()
}()

withExpiryCoinSelection := true

commitmentTxid, err := clientSvc.CollaborativeExit(ctx, destOnchainAddr, amountInSats, !withExpiryCoinSelection)
if err != nil {
log.Fatalf("failed to send onchain: %s", err)
}

wg.Wait()

if err != nil {
log.Fatalf("failed to fetch incoming funds: %s", err)
}
log.Printf("sent funds onchain in commitment tx: %s\nchange vtxos: %+v\n", commitmentTxid, change)

Unilateral Exitโ€‹

if err := clientSvc.StartUnilateralExit(ctx context.Context); err != nil {
log.Fatalf("failed to unilaterally exit offchain funds: %s", err)
}

fmt.Println("all vtxos have been unrolled, wait until locktime expiration to move the funds to your wallet")

// Once all branches are onchain, the user can move the funds only after a locktime of usually 24h.
// As soon as the locktime expires, the user can move the unrolled funds to his own onchain wallet with:
txid, err := clientSvc.CompleteUnilateralExit(ctx context.Context, myOnchainWalletAddr string) (string, error)
if err != nil {
log.Fatalf("failed to move funds to your wallet: %s", err)
}
fmt.Printf("moved funds to your wallet: %s\n", txid)