7. Examples
Real-world usage examples for the Amadeus Protocol SDK.
Basic SDK Usage
Initialize SDK and Query Chain
import { AmadeusSDK } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK({
baseUrl: 'https://nodes.amadeus.bot/api'
})
// Get chain tip
const tip = await sdk.chain.getTip()
console.log('Current height:', tip.entry.height)
console.log('Chain hash:', tip.entry.hash)
// Get chain statistics
const stats = await sdk.chain.getStats()
console.log('Total entries:', stats.stats.total_entries)
console.log('Total transactions:', stats.stats.total_transactions)
Key Generation
Generate and Use Keypair
import { generateKeypair, derivePublicKeyFromSeedBase58 } from '@amadeus-protocol/sdk'
// Generate new keypair
const keypair = generateKeypair()
console.log('Public Key (Address):', keypair.publicKey)
console.log('Private Key (Seed):', keypair.privateKey) // Keep secret!
// Derive public key from existing seed
const publicKey = derivePublicKeyFromSeedBase58(keypair.privateKey)
console.log('Derived Public Key:', publicKey)
Wallet Operations
Check Balance
import { AmadeusSDK } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const address = '5Kd3N...'
// Get specific token balance
const balance = await sdk.wallet.getBalance(address, 'AMA')
console.log('AMA Balance:', balance.balance.float)
// Get all token balances
const allBalances = await sdk.wallet.getAllBalances(address)
Object.entries(allBalances.balances).forEach(([symbol, balance]) => {
console.log(`${symbol}: ${balance.float}`)
})
Get Transaction History
import { AmadeusSDK } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const address = '5Kd3N...'
// Get recent transactions
const { txs, cursor } = await sdk.wallet.getTransactions(address, {
limit: 10,
sort: 'desc'
})
txs.forEach((tx) => {
console.log('Hash:', tx.hash)
console.log('Action:', tx.tx.action)
console.log('Receipt:', tx.receipt)
})
Transaction Building
Simple Token Transfer
import { AmadeusSDK, TransactionBuilder, generateKeypair } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
// Generate or use existing keypair
const keypair = generateKeypair()
const builder = new TransactionBuilder(keypair.privateKey)
// Build and sign transfer
const { txHash, txPacked } = builder.transfer({
recipient: '5Kd3N...',
amount: 10.5,
symbol: 'AMA'
})
console.log('Transaction hash:', txHash)
// Submit transaction
const result = await sdk.transaction.submit(txPacked)
if (result.error === 'ok') {
console.log('Transaction submitted:', result.hash)
} else {
console.error('Error:', result.error)
}
Transfer with Confirmation
import { AmadeusSDK, TransactionBuilder, generateKeypair } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const keypair = generateKeypair()
const builder = new TransactionBuilder(keypair.privateKey)
// Build and sign
const { txHash, txPacked } = builder.transfer({
recipient: '5Kd3N...',
amount: 10.5,
symbol: 'AMA'
})
// Submit and wait for confirmation
try {
const result = await sdk.transaction.submitAndWait(txPacked)
if (result.error === 'ok') {
console.log('Transaction confirmed!')
console.log('Hash:', result.hash)
console.log('Entry hash:', result.metadata?.entry_hash)
console.log('Receipt:', result.receipt)
} else {
console.error('Transaction error:', result.error)
}
} catch (error) {
console.error('Transaction failed or timed out:', error)
}
Custom Contract Call
import { AmadeusSDK, TransactionBuilder, fromBase58, toAtomicAma } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const builder = new TransactionBuilder(privateKey)
// Build custom contract call
const { txHash, txPacked } = builder.buildAndSign('MyContract', 'myMethod', [
fromBase58('5Kd3N...'),
toAtomicAma(100).toString(),
'AMA',
'additional-arg'
])
const result = await sdk.transaction.submit(txPacked)
Build Unsigned, Inspect, Then Sign
import { TransactionBuilder } from '@amadeus-protocol/sdk'
const builder = new TransactionBuilder(privateKey)
// Build unsigned transaction
const unsignedTx = builder.buildTransfer({
recipient: '5Kd3N...',
amount: 10.5,
symbol: 'AMA'
})
// Inspect transaction
console.log('Nonce:', unsignedTx.tx.nonce.toString())
console.log('Signer:', unsignedTx.tx.signer)
console.log('Action:', unsignedTx.tx.action)
console.log('Hash:', unsignedTx.hash)
// Sign the transaction
const { txHash, txPacked } = builder.sign(unsignedTx)
Contract Interactions
Read Contract Data
import { AmadeusSDK, fromBase58 } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
// Get contract data by key
const key = fromBase58('5Kd3N...')
const data = await sdk.contract.get(key)
console.log('Contract data:', data)
// Get contract data by prefix
const prefixData = await sdk.contract.getPrefix(key)
prefixData.forEach((item) => {
console.log('Key:', item.key)
console.log('Value:', item.value)
})
Validate Bytecode
import { AmadeusSDK } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
// Load WASM bytecode
const wasmBytecode = await fetch('contract.wasm').then((r) => r.arrayBuffer())
// Validate bytecode
const result = await sdk.contract.validateBytecode(wasmBytecode)
if (result.error === 'ok') {
console.log('Bytecode is valid')
} else {
console.error('Validation error:', result.error)
}
Get Richlist
import { AmadeusSDK } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const { richlist } = await sdk.contract.getRichlist()
richlist.slice(0, 10).forEach((entry) => {
console.log(`Rank ${entry.rank}: ${entry.address} - ${entry.balance} ${entry.symbol}`)
})
Encryption
Encrypt and Store Private Key
import { encryptWithPassword, decryptWithPassword, generateKeypair } from '@amadeus-protocol/sdk'
// Generate keypair
const keypair = generateKeypair()
// Encrypt private key with user password
const encrypted = await encryptWithPassword(keypair.privateKey, 'user-password-123')
// Store encrypted data (in real app, use secure storage)
const storage = {
encryptedData: encrypted.encryptedData,
iv: encrypted.iv,
salt: encrypted.salt
}
// Later: Decrypt when user enters password
const decryptedKey = await decryptWithPassword(
{
encryptedData: storage.encryptedData,
iv: storage.iv,
salt: storage.salt
},
'user-password-123'
)
console.log('Decrypted key matches:', decryptedKey === keypair.privateKey)
Error Handling
Comprehensive Error Handling
import { AmadeusSDK, AmadeusSDKError } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
async function safeGetBalance(address: string, symbol: string) {
try {
const balance = await sdk.wallet.getBalance(address, symbol)
return balance
} catch (error) {
if (error instanceof AmadeusSDKError) {
if (error.status === 404) {
console.log('Address not found or has no balance')
return null
} else if (error.status === 400) {
console.error('Invalid address format')
throw new Error('Invalid address')
} else {
console.error('SDK Error:', error.message)
throw error
}
} else {
console.error('Unexpected error:', error)
throw error
}
}
}
Complete Transaction Flow
End-to-End Transaction Example
import { AmadeusSDK, TransactionBuilder, generateKeypair, toAtomicAma } from '@amadeus-protocol/sdk'
async function completeTransferFlow() {
// Initialize SDK
const sdk = new AmadeusSDK({
baseUrl: 'https://nodes.amadeus.bot/api'
})
// Generate or load keypair
const keypair = generateKeypair()
const senderAddress = keypair.publicKey
const recipientAddress = '5Kd3N...' // Recipient's address
// Check sender balance
const balance = await sdk.wallet.getBalance(senderAddress, 'AMA')
const amount = 10.5
const transferAmount = toAtomicAma(amount)
if (balance.balance.flat < transferAmount) {
throw new Error('Insufficient balance')
}
console.log(`Balance: ${balance.balance.float} AMA`)
console.log(`Transferring: ${amount} AMA`)
// Build and sign transaction
const builder = new TransactionBuilder(keypair.privateKey)
const { txHash, txPacked } = builder.transfer({
recipient: recipientAddress,
amount: amount,
symbol: 'AMA'
})
console.log('Transaction hash:', txHash)
// Submit transaction
const submitResult = await sdk.transaction.submit(txPacked)
if (submitResult.error !== 'ok') {
throw new Error(`Transaction error: ${submitResult.error}`)
}
console.log('Transaction submitted:', submitResult.hash)
// Wait for confirmation
try {
const confirmResult = await sdk.transaction.submitAndWait(txPacked)
if (confirmResult.error === 'ok') {
console.log('Transaction confirmed!')
console.log('Entry hash:', confirmResult.metadata?.entry_hash)
console.log('Receipt:', confirmResult.receipt)
}
} catch (error) {
console.error('Confirmation timeout:', error)
}
// Verify transaction
const tx = await sdk.transaction.get(txHash)
console.log('Verified transaction:', tx.hash)
}
// Run the flow
completeTransferFlow().catch(console.error)
Batch Operations
Submit Multiple Transactions
import { AmadeusSDK, TransactionBuilder } from '@amadeus-protocol/sdk'
const sdk = new AmadeusSDK()
const builder = new TransactionBuilder(privateKey)
async function submitBatch(transfers: Array<{ recipient: string; amount: number }>) {
const results = []
for (const transfer of transfers) {
try {
// Build and sign
const { txHash, txPacked } = builder.transfer({
recipient: transfer.recipient,
amount: transfer.amount,
symbol: 'AMA'
})
// Submit
const result = await sdk.transaction.submit(txPacked)
results.push({
recipient: transfer.recipient,
hash: result.hash,
error: result.error
})
// Small delay to avoid nonce collisions
await new Promise((resolve) => setTimeout(resolve, 100))
} catch (error) {
results.push({
recipient: transfer.recipient,
error: error.message
})
}
}
return results
}