npm package: @riftresearch/sdk
Description: SDK for swapping between bitcoin and evm chains
Latest version: 0.19.0

# @riftresearch/sdk

SDK for swapping between Bitcoin and EVM chains.

## Quickstart

Install the SDK:

```bash
npm install @riftresearch/sdk
```

Then use it:

```ts
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({
  fromAsset: Currencies.Ethereum.USDC,
  toAsset: Currencies.Bitcoin.BTC,
  amount: '100000000', // 100 USDC (6 decimals)
  mode: 'exact_input',
  slippageBps: 100, // 1%
})

console.log(`Swapping ${quote.fromAsset.expected} USDC for ${quote.toAsset.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(`Order ID: ${swap.orderId}`)

// Check status
const status = await sdk.getOrderStatus(swap.orderId)
console.log(`Status: ${status.status}`)

// List orders with filters and cursor pagination
const page = await sdk.getOrders({
  sender: '0x1234...',
  status: 'unfilled',
  orderType: 'limit',
  limit: 20,
})

console.log(`Fetched ${page.items.length} orders`)
console.log(`Next cursor: ${page.nextCursor}`)
```

## Limit Orders

You can place limit orders with a fixed price instead of using a market quote:

```ts
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({
  fromAsset: Currencies.Base.USDC,
  toAsset: 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.orderId}`)
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:

```ts
const cancel = await sdk.cancelOrder({
  orderId: result.orderId,
  walletClient,
})

console.log(`Cancel accepted: ${cancel.accepted}`)
```