@riftresearch/sdk
v0.14.0
Published
SDK for swapping between bitcoin and evm chains
Readme
@riftresearch/sdk
SDK for swapping between Bitcoin and EVM chains.
Quickstart
Install the SDK:
npm install @riftresearch/sdkThen use it:
import { RiftSdk, Currencies, createCurrency } from '@riftresearch/sdk'
import { createPublicClient, createWalletClient, http } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
import { mainnet } from 'viem/chains'
// Setup viem clients
const account = privateKeyToAccount('0x...')
const publicClient = createPublicClient({ chain: mainnet, transport: http(process.env.ETH_RPC) })
const walletClient = createWalletClient({
account,
chain: mainnet,
transport: http(process.env.ETH_RPC),
})
// Initialize SDK (use your app name for analytics/support)
const sdk = new RiftSdk({
integratorName: "sdk-demo",
})
// Optionally create a custom ERC-20
const ethereumPepe = createCurrency({
chainId: 1,
address: '0x6982508145454Ce325dDbE47a25d4ec3d2311933',
decimals: 18,
})
// Get a quote
const { quote, executeSwap } = await sdk.getQuote({
from: Currencies.Ethereum.USDC,
to: Currencies.Bitcoin.BTC,
amount: '100000000', // 100 USDC (6 decimals)
mode: 'exact_input',
slippageBps: 100, // 1%
})
console.log(`Swapping ${quote.from.expected} USDC for ${quote.to.expected} sats`)
console.log(`Fees: $${quote.fees.totalUsd.toFixed(2)}`)
// Execute the swap
const swap = await executeSwap({
destinationAddress: 'bc1q...',
publicClient,
walletClient,
sendBitcoin: async ({ recipient, amountSats }) => {
// Call your bitcoin wallet's transfer function here
},
})
console.log(`Swap ID: ${swap.swapId}`)
// Check status
const status = await sdk.getSwapStatus(swap.swapId)
console.log(`Status: ${status.status}`)Limit Orders
You can place limit orders with a fixed price instead of using a market quote:
import { RiftSdk, Currencies } from '@riftresearch/sdk'
import { createPublicClient, createWalletClient, http } from 'viem'
import { base } from 'viem/chains'
import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount('0x...')
const publicClient = createPublicClient({ chain: base, transport: http() })
const walletClient = createWalletClient({ account, chain: base, transport: http() })
const sdk = new RiftSdk({ integratorName: 'my-app' })
const result = await sdk.createLimitOrder({
from: Currencies.Base.USDC,
to: Currencies.Bitcoin.BTC,
pricing: {
sellAmount: '1000000', // 1 USDC (6 decimals)
buyAmount: '2500', // 2500 sats
},
destinationAddress: 'bc1q...',
refundAddress: '0x...',
walletClient,
publicClient,
validUntil: Math.floor(Date.now() / 1000) + 3600, // optional: order expires in 1 hour
})
console.log(`Order ID: ${result.swapId}`)
console.log(`Status: ${result.status}`)For supported limit orders, you can later cancel the order. The SDK will fetch the correct typed-data payload from the router, sign it with your wallet, and submit the cancellation:
const cancel = await sdk.cancelOrder({
swapId: result.swapId,
walletClient,
})
console.log(`Cancel accepted: ${cancel.accepted}`)