SDK Quickstart
Get cross-chain execution working in your dApp in 5 minutes.
Installation
npm install @pons-network/pons.js viem
Basic Usage
import { PonsClient, Chain, calculateFeesSync } from '@pons-network/pons.js';
import { parseUnits } from 'viem';
// 1. Initialize the client
const pons = await PonsClient.create({
from: Chain.SEPOLIA,
to: Chain.ARC_TESTNET,
sourceRpcUrl: 'https://eth-sepolia.g.alchemy.com/v2/YOUR_KEY',
destinationRpcUrl: 'https://rpc.testnet.arc.network',
});
// 2. Calculate fees
const amount = parseUnits('15', 6); // 15 USDC
const fees = calculateFeesSync(amount);
console.log('Sending:', amount);
console.log('User receives:', fees.amountForAction);
// 3. Execute cross-chain transfer
const result = await pons.execute({
amount: fees.burnAmount,
action: {
target: '0x0000000000000000000000000000000000000000', // Simple bridge (no action)
callData: '0x',
feeConfig: {
paymentToken: USDC_ADDRESS,
indexerFee: fees.indexerFee,
resolverFee: fees.resolverFee,
},
funding: { maxReimbursement: fees.amountForAction },
},
}, walletClient);
console.log('Transaction:', result.txHash);
console.log('Smart Account:', result.smartAccountAddress);
With a Contract Action
Execute any contract call on the destination chain:
import { ActionBuilder } from '@pons-network/pons.js';
import { encodeFunctionData } from 'viem';
// Encode your contract call
const swapCalldata = encodeFunctionData({
abi: UNISWAP_ABI,
functionName: 'exactInputSingle',
args: [{ /* swap params */ }],
});
// Build the action
const action = new ActionBuilder()
.addCall(UNISWAP_ROUTER, swapCalldata)
.withFees(USDC_ADDRESS, fees.indexerFee, fees.resolverFee)
.build(nonce, deadline, fees.expectedAmount);
// Execute
await pons.execute({ amount: fees.burnAmount, action }, walletClient);
Track Transfer Status
import { TransferStatus } from '@pons-network/pons.js';
const tracker = pons.trackTransfer(
result.txHash,
result.smartAccountAddress,
result.nonce
);
tracker.on('statusChange', (status) => {
switch (status) {
case TransferStatus.SENT:
console.log('Message sent on source chain');
break;
case TransferStatus.INDEXED:
console.log('Assets received on destination');
break;
case TransferStatus.EXECUTED:
console.log('Action executed!');
break;
}
});
// Or wait for completion
await tracker.waitForStatus(TransferStatus.EXECUTED, {
timeout: 30 * 60 * 1000, // 30 minutes
});
Choose Your Speed
Dynamic fees let users choose speed vs cost:
// Fast (2x fees → ~5-10 min)
const fast = calculateFeesSync(amount, {
indexerFee: parseUnits('0.2', 6),
resolverFee: parseUnits('0.3', 6),
});
// Standard (~15-20 min)
const standard = calculateFeesSync(amount);
// Economy (0.5x fees → ~30+ min)
const economy = calculateFeesSync(amount, {
indexerFee: parseUnits('0.05', 6),
resolverFee: parseUnits('0.08', 6),
});
Next Steps
- Integration Guide: Full walkthrough with error handling
- Fee Calculations: Deep dive into the fee system
- API Reference: Complete SDK documentation