Skip to main content

10. Integration Guide

This guide is for developers who want to integrate the Amadeus Wallet Extension into their decentralized applications (dApps).

Overview​

The Amadeus Wallet Extension provides a JavaScript API that dApps can use to interact with user wallets. This allows users to sign transactions and interact with smart contracts directly from web applications.

API Reference​

Checking Wallet Availability​

Before using the wallet API, check if it's available:

if (typeof window.amadeus !== 'undefined') {
// Wallet is available
console.log('Amadeus wallet detected')
} else {
// Wallet not installed
console.log('Amadeus wallet not found')
}

Requesting Accounts​

Request access to user's wallet accounts:

try {
const accounts = await window.amadeus.requestAccounts()
console.log('Connected accounts:', accounts)
// Returns: ['5KJvsngHeMoo884xkJ6Cyb5StvnRN6f9tYiqwqJzLpQq']
} catch (error) {
console.error('Failed to connect:', error.message)
}

Response:

  • Array of account addresses (Base58 encoded)
  • User must approve connection request
  • Returns current account if already connected

Signing Transactions​

Sign a transaction request:

try {
const result = await window.amadeus.signTransaction({
contract: 'Coin',
method: 'transfer',
args: [
'5KJvsngHeMoo884xkJ6Cyb5StvnRN6f9tYiqwqJzLpQq', // recipient
'1000000000', // amount (in atomic units)
'AMA' // token symbol
],
description: 'Send 100 AMA tokens'
})

console.log('Transaction signed:', result.txHash)
console.log('Packed transaction:', result.txPacked)

// Submit to blockchain
// ... your submission logic
} catch (error) {
console.error('Transaction rejected:', error.message)
}

Parameters:

  • contract (string): Contract name or address
  • method (string): Function name to call
  • args (array): Function arguments
  • description (string, optional): Human-readable description

Response:

  • txHash (string): Transaction hash
  • txPacked (Uint8Array): Packed transaction bytes

Event Listeners​

Listen for wallet connection/disconnection:

// Listen for account changes
window.amadeus.on('accountsChanged', (accounts) => {
console.log('Accounts changed:', accounts)
// Update UI with new accounts
})

// Listen for disconnect
window.amadeus.on('disconnect', () => {
console.log('Wallet disconnected')
// Handle disconnection
})

Integration Examples​

Basic Connection Flow​

async function connectWallet() {
try {
// Check if wallet is available
if (typeof window.amadeus === 'undefined') {
alert('Please install Amadeus Wallet Extension')
return
}

// Request accounts
const accounts = await window.amadeus.requestAccounts()

if (accounts.length === 0) {
alert('No accounts found')
return
}

// Use first account
const userAddress = accounts[0]
console.log('Connected:', userAddress)

// Update UI
updateUI(userAddress)
} catch (error) {
console.error('Connection failed:', error)
alert('Failed to connect wallet: ' + error.message)
}
}

Token Transfer Example​

async function transferTokens(recipient, amount, symbol = 'AMA') {
try {
// Convert amount to atomic units
const atomicAmount = toAtomicUnits(amount)

// Request signature
const result = await window.amadeus.signTransaction({
contract: 'Coin',
method: 'transfer',
args: [recipient, atomicAmount.toString(), symbol],
description: `Send ${amount} ${symbol} to ${recipient}`
})

// Submit transaction to blockchain
const txResult = await submitTransaction(result.txPacked)

console.log('Transaction submitted:', txResult.hash)
return txResult
} catch (error) {
if (error.message === 'User rejected') {
console.log('User rejected transaction')
} else {
console.error('Transfer failed:', error)
}
throw error
}
}

// Helper function to convert to atomic units
function toAtomicUnits(amount) {
return Math.floor(amount * 1e8) // 8 decimal places
}

Contract Interaction Example​

async function callContract(contractAddress, method, args, description) {
try {
const result = await window.amadeus.signTransaction({
contract: contractAddress,
method: method,
args: args,
description: description || `Call ${method} on ${contractAddress}`
})

// Submit to blockchain
return await submitTransaction(result.txPacked)
} catch (error) {
console.error('Contract call failed:', error)
throw error
}
}

// Example usage
await callContract('0x1234...', 'approve', ['0x5678...', '1000000000'], 'Approve token spending')

Error Handling​

Common Errors​

try {
await window.amadeus.signTransaction({...})
} catch (error) {
switch (error.message) {
case 'User rejected':
// User clicked reject
console.log('Transaction rejected by user')
break
case 'Wallet is locked':
// Wallet needs to be unlocked
console.log('Please unlock your wallet')
break
case 'No accounts':
// No accounts available
console.log('Please connect your wallet')
break
default:
// Other errors
console.error('Error:', error.message)
}
}

Best Practices​

User Experience​

  1. Check Availability First

    if (typeof window.amadeus === 'undefined') {
    // Show install prompt
    }
  2. Handle Rejections Gracefully

    try {
    await window.amadeus.signTransaction({...})
    } catch (error) {
    if (error.message === 'User rejected') {
    // Don't show error, user intentionally rejected
    return
    }
    // Show error for other cases
    }
  3. Provide Clear Descriptions

    description: 'Send 100 AMA to Alice for payment'
    // Better than: 'Transfer'
  4. Show Loading States

    setLoading(true)
    try {
    const result = await window.amadeus.signTransaction({...})
    // Handle success
    } finally {
    setLoading(false)
    }

Security​

  1. Validate Inputs
    • Verify addresses before requesting signatures
    • Validate amounts and parameters
    • Check contract addresses
  2. Handle Errors Properly
    • Don't expose sensitive information
    • Provide helpful error messages
    • Log errors for debugging
  3. Verify Transactions
    • Verify transaction hash after signing
    • Check transaction status on blockchain
    • Handle failed transactions

TypeScript Support​

If using TypeScript, you can define types:

interface AmadeusWallet {
requestAccounts(): Promise<string[]>
signTransaction(params: {
contract: string
method: string
args: any[]
description?: string
}): Promise<{
txHash: string
txPacked: Uint8Array
}>
on(event: string, callback: Function): void
removeListener(event: string, callback: Function): void
}

declare global {
interface Window {
amadeus?: AmadeusWallet
}
}

Testing​

Testnet Testing​

Always test on Testnet first:

  1. Ensure users are on Testnet
  2. Use Testnet tokens for testing
  3. Verify transactions on Testnet explorer

Mock Implementation​

For development without extension:

// Mock wallet for testing
window.amadeus = {
async requestAccounts() {
return ['5KJvsngHeMoo884xkJ6Cyb5StvnRN6f9tYiqwqJzLpQq']
},
async signTransaction(params) {
console.log('Mock signing:', params)
return {
txHash: 'mock-hash',
txPacked: new Uint8Array()
}
},
on() {},
removeListener() {}
}

React Integration Example​

We provide a complete React + TypeScript demo application that showcases how to integrate the Amadeus Wallet Extension into a modern React application.

Repository​

GitHub: amadeus-wallet-extension-react-demo

Live Demo: amadeus-wallet-extension-react-demo.vercel.app

Features Demonstrated​

The demo includes working examples of:

  • Provider Detection: Automatically detects wallet availability and listens for initialization events
  • Account Management: Connect/disconnect flows with requestAccounts() and accountsChanged event handling
  • Token Transfers: Complete AMA token transfer flow with signing and submission
  • Custom Contract Calls: Sign arbitrary contract calls with custom arguments
  • Transaction History: Track signed transactions with status updates
  • Event Logging: Real-time event logging for debugging and observability
  • Network Configuration: Configurable API endpoint for local node testing

Tech Stack​

  • React 19
  • TypeScript
  • Vite
  • Tailwind CSS
  • shadcn/ui components

Getting Started​

# Clone the repository
git clone https://github.com/amadeusprotocol/amadeus-wallet-extension-react-demo.git
cd amadeus-wallet-extension-react-demo

# Install dependencies
bun install

# Start development server
bun run dev

Key Hooks and Components​

The demo provides reusable React hooks:

  • useAmadeus(): Core wallet integration hook
  • useWallet(): Wallet connection state management
  • useTransfer(): Token transfer operations
  • useCustomCall(): Custom contract call handling
  • useTransactionHistory(): Transaction tracking

These hooks can be adapted for your own React applications. See the repository's README for detailed documentation on each hook and component.

Resources​

Support​

For integration support:

  • Check extension documentation
  • Review SDK documentation
  • Test on Testnet first
  • Report issues through official channels