Bako Safe SDK
CLI & API Token
Examples

CLI Examples

Complete working examples for CLI and script usage with the Bako Safe SDK.

Setup

Project Structure

my-bako-script/
├── src/
│   └── index.ts
├── .env
├── package.json
└── tsconfig.json

package.json

{
  "name": "bako-cli-example",
  "version": "1.0.0",
  "scripts": {
    "start": "ts-node src/index.ts"
  },
  "dependencies": {
    "bakosafe": "^0.1.9",
    "fuels": "^0.99.0",
    "dotenv": "^16.5.0"
  },
  "devDependencies": {
    "ts-node": "^10.9.2",
    "typescript": "^5.8.3",
    "@types/node": "^20.4.3"
  }
}

.env

NETWORK_URL=https://mainnet.fuel.network/v1/graphql
BAKO_API_TOKEN=your-api-token-here
VAULT_ADDRESS=fuel1your-vault-address

Example 1: Check Vault Balance

// src/check-balance.ts
import { BakoProvider, Vault } from 'bakosafe';
import 'dotenv/config';
 
async function checkBalance() {
  // Authenticate
  const provider = await BakoProvider.create(
    process.env.NETWORK_URL!,
    { apiToken: process.env.BAKO_API_TOKEN! }
  );
 
  // Get vault
  const vault = await Vault.fromAddress(
    process.env.VAULT_ADDRESS!,
    provider
  );
 
  // Get balances
  const balances = await vault.getBalances();
 
  console.log('Vault:', vault.address.toString());
  console.log('Balances:');
  balances.forEach(balance => {
    console.log(`  ${balance.assetId}: ${balance.amount.toString()}`);
  });
}
 
checkBalance().catch(console.error);

Example 2: Create Transfer Transaction

// src/transfer.ts
import { BakoProvider, Vault } from 'bakosafe';
import 'dotenv/config';
 
const ETH_ASSET_ID = '0xf8f8b6283d7fa5b672b530cbb84fcccb4ff8dc40f8176ef4544ddb1f1952ad07';
 
async function createTransfer() {
  const provider = await BakoProvider.create(
    process.env.NETWORK_URL!,
    { apiToken: process.env.BAKO_API_TOKEN! }
  );
 
  const vault = await Vault.fromAddress(
    process.env.VAULT_ADDRESS!,
    provider
  );
 
  // Create transaction
  const { tx, hashTxId } = await vault.transaction({
    name: 'CLI Transfer',
    assets: [{
      assetId: ETH_ASSET_ID,
      amount: '100000', // 0.0001 ETH
      to: 'fuel1recipient-address-here'
    }]
  });
 
  console.log('Transaction created!');
  console.log('Hash:', hashTxId);
  console.log('');
  console.log('Next steps:');
  console.log('1. Go to https://safe.bako.global');
  console.log('2. Sign the transaction with required signers');
  console.log('3. Transaction will be sent automatically');
}
 
createTransfer().catch(console.error);

Example 3: Contract Interaction

Based on bako-wallet-snippet (opens in a new tab):

// src/contract-call.ts
import { BakoProvider, Vault } from 'bakosafe';
import { Contract, Provider } from 'fuels';
import 'dotenv/config';
 
// Import your contract ABI
import { MyContractAbi__factory } from './contracts';
 
async function callContract() {
  // Setup provider
  const provider = await BakoProvider.create(
    process.env.NETWORK_URL!,
    { apiToken: process.env.BAKO_API_TOKEN! }
  );
 
  // Get vault (acts as wallet)
  const vault = await Vault.fromAddress(
    process.env.VAULT_ADDRESS!,
    provider
  );
 
  // Connect to contract
  const contract = MyContractAbi__factory.connect(
    process.env.CONTRACT_ID!,
    vault as any
  );
 
  // Call contract function
  const { transactionId } = await contract.functions
    .my_function(arg1, arg2)
    .call();
 
  console.log('Contract call initiated:', transactionId);
  console.log('Waiting for signatures at https://safe.bako.global');
 
  // Poll for completion
  const interval = setInterval(() => {
    console.log('⏳ Waiting for required signatures...');
  }, 5000);
 
  try {
    const result = await contract.functions
      .my_function(arg1, arg2)
      .call();
 
    console.log('✅ Transaction completed!');
    console.log('Result:', result.value);
  } finally {
    clearInterval(interval);
  }
}
 
callContract().catch(console.error);

Example 4: Monitor Transaction Status

// src/monitor.ts
import { BakoProvider, Vault, TransactionStatus } from 'bakosafe';
import 'dotenv/config';
 
async function monitorTransaction(txHash: string) {
  const provider = await BakoProvider.create(
    process.env.NETWORK_URL!,
    { apiToken: process.env.BAKO_API_TOKEN! }
  );
 
  const vault = await Vault.fromAddress(
    process.env.VAULT_ADDRESS!,
    provider
  );
 
  // Get transaction status
  const tx = await vault.transactionFromHash(txHash);
 
  console.log('Transaction:', txHash);
  console.log('Status:', tx.status);
  console.log('Signatures:', `${tx.witnesses.length}/${tx.requiredSigners}`);
 
  // Status meanings
  switch (tx.status) {
    case TransactionStatus.AWAIT_REQUIREMENTS:
      console.log('⏳ Waiting for more signatures');
      break;
    case TransactionStatus.PENDING_SENDER:
      console.log('📤 Ready to send');
      break;
    case TransactionStatus.PROCESS_ON_CHAIN:
      console.log('⛓️ Processing on chain');
      break;
    case TransactionStatus.SUCCESS:
      console.log('✅ Completed successfully');
      break;
    case TransactionStatus.FAILED:
      console.log('❌ Transaction failed');
      break;
    case TransactionStatus.DECLINED:
      console.log('🚫 Transaction declined');
      break;
  }
}
 
const txHash = process.argv[2];
if (!txHash) {
  console.error('Usage: ts-node src/monitor.ts <tx-hash>');
  process.exit(1);
}
 
monitorTransaction(txHash).catch(console.error);

Example 5: Batch Operations

// src/batch.ts
import { BakoProvider, Vault } from 'bakosafe';
import 'dotenv/config';
 
interface Transfer {
  to: string;
  amount: string;
  assetId: string;
}
 
async function batchTransfers(transfers: Transfer[]) {
  const provider = await BakoProvider.create(
    process.env.NETWORK_URL!,
    { apiToken: process.env.BAKO_API_TOKEN! }
  );
 
  const vault = await Vault.fromAddress(
    process.env.VAULT_ADDRESS!,
    provider
  );
 
  // Create transaction with multiple assets
  const { tx, hashTxId } = await vault.transaction({
    name: 'Batch Transfer',
    assets: transfers
  });
 
  console.log('Batch transaction created:', hashTxId);
  console.log(`${transfers.length} transfers pending signatures`);
 
  return hashTxId;
}
 
// Usage
const transfers = [
  { to: 'fuel1addr1...', amount: '100000', assetId: '0x...' },
  { to: 'fuel1addr2...', amount: '200000', assetId: '0x...' },
  { to: 'fuel1addr3...', amount: '300000', assetId: '0x...' },
];
 
batchTransfers(transfers).catch(console.error);

Running Examples

# Install dependencies
pnpm install
 
# Run examples
pnpm ts-node src/check-balance.ts
pnpm ts-node src/transfer.ts
pnpm ts-node src/monitor.ts <tx-hash>

Reference Repository

For a complete working example, see: github.com/guimroque/bako-wallet-snippet (opens in a new tab)

Next Steps