Auto-XDM Package
Introduction
The Autonomys Auto XDM SDK (@autonomys/auto-xdm) provides functionalities for cross-domain transfer of native tokens.
Features
- Cross-Domain Transfer: Enable token transfers between consensus and domain wallets.
- TypeScript Support: Full TypeScript type definitions for an enhanced developer experience.
Installation
Install the package via npm or yarn:
# Using npm
npm install @autonomys/auto-xdm
# Using yarn
yarn add @autonomys/auto-xdmImporting
Import the auto-xdm functions you need into your project:
// Import specific functions
import {
transferToConsensus,
transferToDomainAccount20Type,
transferToDomainAccount32Type
} from '@autonomys/auto-xdm';
// Or import everything
import * as xdm from '@autonomys/auto-xdm';Available functions
Transfer functions
Note: All transfer functions return a
SubmittableExtrinsicthat must be signed and sent. Theamountparameter expects the smallest unit of the token (Shannon). For 18 decimals, multiply by 10^18 or useformatTokenAmountfromauto-utils. Ensure a sufficient balance in the sending account to cover both the transfer and fees. Cross-domain transfers may take a few blocks to complete.
transfer(api, destination, amount): Promise<SubmittableExtrinsic>: Base transfer function for cross-domain transfers.transferToConsensus(api, accountId32, amount): Promise<SubmittableExtrinsic>: Transfer tokens from a domain to the consensus chain.transferToDomainAccount20Type(api, destinationDomainId, accountId20, amount): Promise<SubmittableExtrinsic>: Transfer tokens from the consensus chain to an EVM address.transferToDomainAccount32Type(api, destinationDomainId, accountId32, amount): Promise<SubmittableExtrinsic>: Transfer tokens from the consensus chain to a Substrate address.
Query functions
Note: Monitor transfer status using query functions.
chainAllowlist(api): Promise<Codec>: Retrieves the list of allowed chains.channels(api, chainId): Promise<Codec>: Retrieves the list of channelsconsensusChannels(api): Promise<Codec>: Retrieves the list of consensus channelsdomainChannels(api, domainId): Promise<Codec>: Retrieves the list of domain channelsallCancelledTransfers(api): Promise<Codec>: Retrieves all cancelled transfers.chainTransfers(api): Promise<Codec>: Retrieves all chain transfers.allDomainBalances(api): Promise<Codec>: Retrieves balances across all domains.domainBalances(api, domainId): Promise<Codec>: Retrieves balances for a specific domain.allUnconfirmedTransfers(api): Promise<Codec>: Retrieves pending transfers.
Type definitions
type Amount = BigInt | number | string;
type Consensus = {
type: 'consensus';
};
type Domain = {
type: 'domain';
domainId: number;
};
type ChainOrDomain = Consensus | Domain;Usage examples
1. Transfer from Consensus to Domain (EVM address)
import { activateWallet } from '@autonomys/auto-utils'
import { transferToDomainAccount20Type } from '@autonomys/auto-xdm'
const api = await activateWallet({ networkId: 'chronos', uri: '//alice' })
const tx = await transferToDomainAccount20Type(
api,
0, // Receiver domain (0 is Auto EVM on Chronos Testnet)
'0x1234567890abcdef', // Receiver domain account
'1000000000000000000',
)
2. Transfer from Consensus to Domain (Substrate address)
import { activateWallet } from '@autonomys/auto-utils'
import { transferToDomainAccount32Type } from '@autonomys/auto-xdm'
const api = await activateWallet({ networkId: 'chronos', uri: '//alice' })
const tx = await transferToDomainAccount32Type(
api,
0, // Receiver domain (0 is Auto EVM on Chronos Testnet)
'su1234567890abcdef', // Receiver domain account
'1000000000000000000',
)3. Transfer from Domain to Consensus
import { activateWallet } from '@autonomys/auto-utils'
import { transferToConsensus } from '@autonomys/auto-xdm'
const api = await activateWallet({ networkId: 'chronos', domainId: 0, uri: '//alice' })
const tx = await transferToConsensus(
api,
'su1234567890abcdef', // Receiver consensus account,
'1000000000000000000',
)4. Query domain balances
import { activateWallet } from '@autonomys/auto-utils';
import { domainBalances } from '@autonomys/auto-xdm';
(async () => {
const { api } = await activateWallet({
networkId: 'chronos'
});
// Get balances for domain 0 (Auto EVM on the Chronos testnet)
const balances = await domainBalances(api, 0);
console.log('Domain balances:', balances.toString());
})();Best practices
-
Error Handling: Wrap asynchronous calls and transactions in
try...catchblocks to handle potential errors gracefully:try { const tx = await transferToConsensus(api, receiver, amount); await tx.signAndSend(account); } catch (error) { console.error('Transfer failed:', error); } -
Amount Formatting: Use appropriate decimal places for token amounts:
- The
amountparameter expects the smallest unit of the token (Shannon). - For 18 decimals, multiply by 10^18 or use
formatTokenAmountfromauto-utils.
- The
-
API Management: > Always disconnect the API instance after your operations are complete to free up resources:
try { // ... your code ... } finally { await api.disconnect(); }