Examples

End-to-end example scripts for easy implementation using the SDK V2.

Example 1: Complete Rune Purchase Flow

Below is a complete example flow for buying runes using the simplified SDK V2, including waiting for user input for signed PSBTs:

import { SatsTerminal } from 'satsterminal-sdk';
import readlineSync from 'readline-sync';

// Configuration
const CONFIG = {
  apiKey: 'your_api_key_here',
};

// Trade Parameters
const TRADE_PARAMS = {
  fromToken: 'BTC',
  toToken: 'LOBO•THE•WOLF•PUP',
  address: 'bc1p...',
  publicKey: '...',
  paymentAddress: '3Pc...',
  paymentPublicKey: '...',
  amount: '0.0001',
  protocol: 'runes'
};

// Initialize the SDK
const satsTerminal = new SatsTerminal(CONFIG);

// Function to get user input for signed PSBTs (V2 can have multiple)
const getSignedPSBTs = (psbts) => {
  console.log(`\nPlease sign ${psbts.length} PSBT(s):`);
  const signedPsbts = [];
  
  for (let i = 0; i < psbts.length; i++) {
    console.log(`\nPSBT ${i + 1} hex: ${psbts[i].hex}`);
    const signed = readlineSync.question(`Enter signed PSBT ${i + 1} hex: `);
    signedPsbts.push(signed);
  }
  
  return signedPsbts;
};

// Main execution
(async () => {
  try {
    // 1. Get a quote for the swap
    console.log('\n1. Fetching swap quote...');
    const quote = await satsTerminal.swapQuote({
      amount: TRADE_PARAMS.amount,
      fromToken: TRADE_PARAMS.fromToken,
      toToken: TRADE_PARAMS.toToken,
      address: TRADE_PARAMS.address,
      protocol: TRADE_PARAMS.protocol,
      params: {}
    });
  
    console.log('Best marketplace:', quote.bestMarketplace);
    console.log('Swap ID:', quote.swapId);
    console.log('From token amount:', quote.fromTokenAmount);
    console.log('To token amount:', quote.toTokenAmount);
    console.log('Available marketplaces:', Object.keys(quote.marketplaces));

    // 2. Create PSBT(s) for the swap
    console.log('\n2. Creating PSBT(s)...');
    const psbtResponse = await satsTerminal.swapPSBT({
      marketplace: quote.bestMarketplace,
      swapId: quote.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      feeRate: 5,
      slippage: 9,
      themeID: null
    });
  
    console.log(`Created ${psbtResponse.psbts.length} PSBT(s)`);
    console.log('Updated swap ID:', psbtResponse.swapId);
  
    // Wait for user to sign all PSBTs
    const signedPsbts = getSignedPSBTs(psbtResponse.psbts);

    // 3. Submit the signed PSBTs
    console.log('\n3. Submitting signed PSBTs...');
    const result = await satsTerminal.swapSubmit({
      marketplace: quote.bestMarketplace,
      swapId: psbtResponse.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      signedPsbts: signedPsbts
    });
  
    console.log('✅ Swap completed successfully!');
    console.log('Transaction ID:', result.txid);
    console.log('Marketplace used:', result.marketplace);

  } catch (error) {
    console.error('Error:', error.message);
  }
})();

Example 2: Selling Runes for BTC

// Import the SDK
import { SatsTerminal } from 'satsterminal-sdk';
import readlineSync from 'readline-sync';


// Configuration
const CONFIG = {
  // Your API key for SatsTerminal
  apiKey: 'your_api_key_here',
};

// Trade Parameters
const TRADE_PARAMS = {
  // Clear direction: selling runes for BTC
  fromToken: 'DOG•GO•TO•THE•MOON',  // What we're selling
  toToken: 'BTC',                   // What we want to receive
  address: 'bc1puxa2cwvfw47vaadt4lfxwgl4zln9epqtfsq3y7cl7vr5wvfayz6s22mmwp',
  publicKey: 'dd4c950d7a5f86e92235687cffeee1bfb61b5c8a9e15b80751077c3d4315821c',
  paymentAddress: '3PcP9J6C9ZNQpTRHrtqFBhP3LoBjSmMkZq',
  paymentPublicKey: '02af6d71243386e3a24a23ebf47ea91dcf0d114b8ec29163ed9716e9b14a8fe3d8',
  sellAmount: "10000",              // Amount of runes to sell
  protocol: 'runes'
};

// Initialize the SDK
const satsTerminal = new SatsTerminal(CONFIG);

// Function to get user input for signed PSBTs
const getSignedPSBTs = (psbts) => {
  console.log(`\nFound ${psbts.length} PSBT(s) to sign:`);
  const signedPsbts = [];
  
  for (let i = 0; i < psbts.length; i++) {
    console.log(`\nPSBT ${i + 1}:`);
    console.log(`Base64: ${psbts[i].base64.substring(0, 50)}...`);
    console.log(`Hex: ${psbts[i].hex.substring(0, 50)}...`);
    console.log(`Inputs: [${psbts[i].inputs.join(', ')}]`);
    
    const signed = readlineSync.question(`Enter signed PSBT ${i + 1} hex: `);
    signedPsbts.push(signed);
  }
  
  return signedPsbts;
};

// Main execution block (sell runes for BTC)
(async () => {
  try {
    // 1. Get a quote for selling runes
    console.log('\n1. Fetching sell quote...');
    console.log('Trade parameters:', TRADE_PARAMS);
    
    const quote = await satsTerminal.swapQuote({
      amount: TRADE_PARAMS.sellAmount,
      fromToken: TRADE_PARAMS.fromToken,  // Selling runes
      toToken: TRADE_PARAMS.toToken,      // For BTC
      address: TRADE_PARAMS.address,
      protocol: TRADE_PARAMS.protocol,
      params: {}
    });
    
    console.log('✅ Quote received:');
    console.log('Best marketplace:', quote.bestMarketplace);
    console.log('Swap ID:', quote.swapId);
    console.log('Selling:', quote.fromTokenAmount, TRADE_PARAMS.fromToken);
    console.log('Receiving:', quote.toTokenAmount, 'BTC');
    
    // Show all available marketplaces
    console.log('\nAvailable marketplaces:');
    Object.entries(quote.marketplaces).forEach(([name, data]) => {
      console.log(`- ${name}: ${data.fromTokenAmount} → ${data.toTokenAmount} BTC`);
    });

    // 2. Create PSBT(s) for the swap
    console.log('\n2. Creating PSBT(s)...');
    const psbtResponse = await satsTerminal.swapPSBT({
      marketplace: quote.bestMarketplace,
      swapId: quote.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      feeRate: 5,
      slippage: 9,
      themeID: null
    });
    
    console.log(`✅ Created ${psbtResponse.psbts.length} PSBT(s)`);
    console.log('Updated swap ID:', psbtResponse.swapId);
    
    // Wait for user to sign all PSBTs
    const signedPsbts = getSignedPSBTs(psbtResponse.psbts);
    
    // 3. Submit the signed PSBTs
    console.log('\n3. Submitting signed PSBTs...');
    const confirmation = await satsTerminal.swapSubmit({
      marketplace: quote.bestMarketplace,
      swapId: psbtResponse.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      signedPsbts: signedPsbts
    });
    
    console.log('✅ Sell order completed successfully!');
    console.log('Transaction ID:', confirmation.txid);
    console.log('Marketplace:', confirmation.marketplace);
    

  } catch (error) {
    console.error('Error:', error.message);
  }
})();

Example 3: Alkanes Swap

import { SatsTerminal } from 'satsterminal-sdk';
import readlineSync from 'readline-sync';

/**
 * This example demonstrates swapping BTC for alkanes tokens using V2 API
 */

// Configuration
const CONFIG = {
  apiKey: 'your_api_key_here',
};

// Trade Parameters for Alkanes
const TRADE_PARAMS = {
  fromToken: 'BTC',
  toToken: 'GOLD DUST',              // Alkanes token
  address: 'bc1p4mffk7l9a040dgqrl8spunwkguxn68ldwx848urafar9sj85nnrq9rcvyj',
  publicKey: '03962e74f53d3620f82aab9ecfadbaa2d2b34ab1d794b346f53deb4c1a9d287bfc',
  paymentAddress: 'bc1qjtyqu4uqrpnvsfg9tq0wzzsdge3e559wzk4epc',
  paymentPublicKey: '02325fb34ee9ff76df92b34d13059fa8d14008a9426fb1de52f038bfdca5075588',
  amount: '0.00008',
  protocol: 'alkanes'               // Different protocol
};

const satsTerminal = new SatsTerminal(CONFIG);

const getSignedPSBTs = (psbts) => {
  console.log(`\nPlease sign ${psbts.length} PSBT(s) for alkanes swap:`);
  const signedPsbts = [];
  
  psbts.forEach((psbt, index) => {
    console.log(`\nPSBT ${index + 1} details:`);
    console.log(`- Inputs: [${psbt.inputs.join(', ')}]`);
    console.log(`- Hex length: ${psbt.hex.length} characters`);
    
    const signed = readlineSync.question(`Enter signed PSBT ${index + 1} hex: `);
    signedPsbts.push(signed);
  });
  
  return signedPsbts;
};

(async () => {
  try {
    console.log('🔄 Starting alkanes token swap...');
    
    // 1. Get quote for alkanes swap
    console.log('\n1. Getting alkanes swap quote...');
    const quote = await satsTerminal.swapQuote({
      amount: TRADE_PARAMS.amount,
      fromToken: TRADE_PARAMS.fromToken,
      toToken: TRADE_PARAMS.toToken,
      address: TRADE_PARAMS.address,
      protocol: TRADE_PARAMS.protocol,
      params: {}
    });
    
    console.log('✅ Alkanes quote received:');
    console.log(`Swapping ${quote.fromTokenAmount} BTC → ${quote.toTokenAmount} ${TRADE_PARAMS.toToken}`);
    console.log('Best marketplace:', quote.bestMarketplace);
    
    // Show metrics for different marketplaces
    if (quote.metrics) {
      console.log('\nMarketplace performance:');
      Object.entries(quote.metrics).forEach(([marketplace, metrics]) => {
        console.log(`- ${marketplace}: ${metrics.percentFulfilled}% fulfilled, avg price: ${metrics.averageUnitPrice}`);
      });
    }

    // 2. Create PSBTs
    console.log('\n2. Creating alkanes swap PSBTs...');
    const psbtResponse = await satsTerminal.swapPSBT({
      marketplace: quote.bestMarketplace,
      swapId: quote.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      feeRate: 3,
      slippage: 5,
      themeID: null
    });
    
    console.log(`✅ Generated ${psbtResponse.psbts.length} PSBT(s) for alkanes swap`);
    
    // Sign PSBTs
    const signedPsbts = getSignedPSBTs(psbtResponse.psbts);
    
    // 3. Submit alkanes swap
    console.log('\n3. Executing alkanes swap...');
    const result = await satsTerminal.swapSubmit({
      marketplace: quote.bestMarketplace,
      swapId: psbtResponse.swapId,
      address: TRADE_PARAMS.address,
      publicKey: TRADE_PARAMS.publicKey,
      paymentAddress: TRADE_PARAMS.paymentAddress,
      paymentPublicKey: TRADE_PARAMS.paymentPublicKey,
      protocol: TRADE_PARAMS.protocol,
      signedPsbts: signedPsbts
    });
    
    console.log('🎉 Alkanes swap completed!');
    console.log('Transaction ID:', result.txid);
    console.log(`Successfully swapped BTC for ${TRADE_PARAMS.toToken}`);

  } catch (error) {
    console.error('Error:', error.message);
  }
})();

Last updated