Skip to content

TypeScript SDK

The ACDC TypeScript SDK (@acdc/sdk) provides a comprehensive interface for interacting with the Alpha and Delta chains from JavaScript and TypeScript applications.

Installation

npm install @acdc/sdk

Requirements: - Node.js 18+ or modern browser - TypeScript 5.0+ (for TypeScript users)

Client Setup

Basic Setup

import { AcdcClient } from '@acdc/sdk';

const client = new AcdcClient({
  chain: 'delta',
  network: 'mainnet'
});

Advanced Configuration

import { AcdcClient, LogLevel } from '@acdc/sdk';

const client = new AcdcClient({
  chain: 'delta',
  network: 'mainnet',

  // Custom endpoints
  rpcUrl: 'https://my-rpc.example.com',
  wsUrl: 'wss://my-ws.example.com',

  // Authentication
  apiKey: process.env.ACDC_API_KEY,

  // Timeouts and retries
  timeout: 30000,
  retries: 3,
  retryDelay: 1000,

  // Logging
  logLevel: LogLevel.Debug,

  // Custom fetch (for server-side)
  fetch: customFetch,
});

Wallet Management

Creating Wallets

import { Wallet } from '@acdc/sdk';

// Generate new wallet
const wallet = Wallet.create();
console.log('Address:', wallet.address);
console.log('Mnemonic:', wallet.mnemonic);

// From mnemonic
const restored = Wallet.fromMnemonic(
  'abandon abandon abandon ...',
  { path: "m/44'/60'/0'/0/0" }
);

// From private key
const imported = Wallet.fromPrivateKey('0xprivatekey...');

Connecting Wallet to Client

// Connect wallet to client for signing
const connectedWallet = wallet.connect(client);

// Now you can send transactions
const tx = await connectedWallet.sendTransaction({
  to: 'dx1recipient...',
  value: parseUnits('1.0', 18)
});

HD Wallet Derivation

import { HDWallet } from '@acdc/sdk';

const hdWallet = HDWallet.fromMnemonic('abandon abandon ...');

// Derive accounts
const account0 = hdWallet.derive(0);
const account1 = hdWallet.derive(1);

// Custom derivation path
const custom = hdWallet.derivePath("m/44'/60'/0'/0/5");

Querying Data

Account Information

// Get balance
const balance = await client.getBalance('dx1abc...');
console.log(`Balance: ${balance.formatted} ACDC`);

// Get nonce
const nonce = await client.getNonce('dx1abc...');

// Get account details
const account = await client.getAccount('dx1abc...');
console.log(`Nonce: ${account.nonce}`);
console.log(`Balance: ${account.balance}`);
console.log(`Code Hash: ${account.codeHash}`);

Block Information

// Get latest block
const latest = await client.getBlock('latest');
console.log(`Block ${latest.number}: ${latest.hash}`);

// Get specific block
const block = await client.getBlock(1234567);

// Get block with transactions
const blockWithTx = await client.getBlock(1234567, true);
for (const tx of blockWithTx.transactions) {
  console.log(`  TX: ${tx.hash}`);
}

Transaction Information

// Get transaction by hash
const tx = await client.getTransaction('0xtxhash...');
console.log(`From: ${tx.from}`);
console.log(`To: ${tx.to}`);
console.log(`Value: ${formatUnits(tx.value, 18)} ACDC`);

// Get transaction receipt
const receipt = await client.getTransactionReceipt('0xtxhash...');
console.log(`Status: ${receipt.status === 1 ? 'Success' : 'Failed'}`);
console.log(`Gas Used: ${receipt.gasUsed}`);

Sending Transactions

Simple Transfer

const tx = await connectedWallet.sendTransaction({
  to: 'dx1recipient...',
  value: parseUnits('1.0', 18)
});

// Wait for 1 confirmation
const receipt = await tx.wait(1);
console.log(`Confirmed in block ${receipt.blockNumber}`);

Advanced Transaction Options

const tx = await connectedWallet.sendTransaction({
  to: 'dx1recipient...',
  value: parseUnits('1.0', 18),

  // Gas settings
  gasLimit: 21000n,
  gasPrice: parseUnits('10', 9),  // 10 gwei

  // Or use EIP-1559 gas
  maxFeePerGas: parseUnits('20', 9),
  maxPriorityFeePerGas: parseUnits('2', 9),

  // Nonce (optional, auto-fetched if omitted)
  nonce: 42,

  // Data for contract calls
  data: '0x...',
});

Estimating Gas

const gasEstimate = await client.estimateGas({
  from: 'dx1sender...',
  to: 'dx1recipient...',
  value: parseUnits('1.0', 18)
});

console.log(`Estimated gas: ${gasEstimate}`);

Contract Interaction

Reading Contract State

import { Contract } from '@acdc/sdk';

const tokenAbi = [
  'function balanceOf(address owner) view returns (uint256)',
  'function symbol() view returns (string)',
  'function decimals() view returns (uint8)',
];

const token = new Contract('dx1tokencontract...', tokenAbi, client);

const balance = await token.balanceOf('dx1holder...');
const symbol = await token.symbol();
const decimals = await token.decimals();

console.log(`${formatUnits(balance, decimals)} ${symbol}`);

Writing to Contracts

const tokenAbi = [
  'function transfer(address to, uint256 amount) returns (bool)',
  'function approve(address spender, uint256 amount) returns (bool)',
];

const token = new Contract('dx1tokencontract...', tokenAbi, connectedWallet);

// Transfer tokens
const tx = await token.transfer(
  'dx1recipient...',
  parseUnits('100', 18)
);
await tx.wait();

// Approve spending
const approveTx = await token.approve(
  'dx1spender...',
  parseUnits('1000', 18)
);
await approveTx.wait();

Listening to Contract Events

const tokenAbi = [
  'event Transfer(address indexed from, address indexed to, uint256 value)',
];

const token = new Contract('dx1tokencontract...', tokenAbi, client);

// Listen to all Transfer events
token.on('Transfer', (from, to, value, event) => {
  console.log(`Transfer: ${from} -> ${to}: ${formatUnits(value, 18)}`);
});

// Filter events
const filter = token.filters.Transfer(null, 'dx1myaddress...');
token.on(filter, (from, to, value) => {
  console.log(`Received ${formatUnits(value, 18)} from ${from}`);
});

// Query past events
const events = await token.queryFilter(
  token.filters.Transfer(),
  1234567,  // fromBlock
  1234667   // toBlock
);

WebSocket Subscriptions

Subscribing to Events

// Subscribe to new blocks
const unsubBlocks = client.subscribe('newBlocks', (block) => {
  console.log(`Block ${block.number}`);
});

// Subscribe to pending transactions
const unsubTx = client.subscribe('pendingTransactions', (tx) => {
  console.log(`Pending: ${tx.hash}`);
});

// Subscribe to address activity
const unsubAddr = client.subscribe('address', {
  address: 'dx1myaddress...',
  includeTokenTransfers: true
}, (event) => {
  console.log(`Activity: ${event.hash}`);
});

// Unsubscribe
unsubBlocks();
unsubTx();
unsubAddr();

Connection Management

// Check WebSocket status
console.log(`WS Connected: ${client.ws.isConnected}`);

// Reconnect
await client.ws.reconnect();

// Close connection
client.ws.close();

Staking (Delta Chain)

import { Staking } from '@acdc/sdk';

const staking = new Staking(connectedWallet);

// Delegate stake
const delegateTx = await staking.delegate(
  'dx1validator...',
  parseUnits('1000', 18)
);
await delegateTx.wait();

// Get stake info
const stakeInfo = await staking.getStake('dx1myaddress...');
console.log(`Staked: ${formatUnits(stakeInfo.amount, 18)} ACDC`);
console.log(`Rewards: ${formatUnits(stakeInfo.rewards, 18)} ACDC`);

// Claim rewards
const claimTx = await staking.claimRewards();
await claimTx.wait();

// Unstake
const unstakeTx = await staking.unstake(parseUnits('500', 18));
await unstakeTx.wait();

Governance (Delta Chain)

import { Governance } from '@acdc/sdk';

const governance = new Governance(connectedWallet);

// Get active proposals
const proposals = await governance.getProposals({ status: 'active' });

for (const proposal of proposals) {
  console.log(`#${proposal.id}: ${proposal.title}`);
  console.log(`  For: ${proposal.votesFor}`);
  console.log(`  Against: ${proposal.votesAgainst}`);
}

// Vote on proposal
const voteTx = await governance.vote(42, 'yes');
await voteTx.wait();

// Create proposal
const proposeTx = await governance.propose({
  title: 'Increase Block Gas Limit',
  description: 'Proposal to increase...',
  actions: [
    {
      target: 'dx1paramcontract...',
      data: '0x...'
    }
  ]
});
await proposeTx.wait();

Alpha Chain (Privacy)

import { AlphaClient } from '@acdc/sdk';

const alphaClient = new AlphaClient({
  network: 'mainnet'
});

// Generate a view key
const viewKey = alphaClient.generateViewKey(wallet.privateKey);

// Scan for records
const records = await alphaClient.scanRecords(viewKey);
for (const record of records) {
  console.log(`Record: ${record.commitment}`);
  console.log(`  Value: ${formatUnits(record.value, 18)}`);
}

// Create private transfer
const privateTx = await alphaClient.createPrivateTransfer({
  wallet: connectedWallet,
  to: 'ax1recipient...',
  value: parseUnits('10', 18),
  records: records.slice(0, 2)  // Input records
});

// Submit transaction
const submitted = await alphaClient.submitTransaction(privateTx);
console.log(`TX Hash: ${submitted.hash}`);

Utilities

Unit Conversion

import { parseUnits, formatUnits, parseAcdc, formatAcdc } from '@acdc/sdk';

// Generic conversion
const wei = parseUnits('1.5', 18);     // 1500000000000000000n
const eth = formatUnits(wei, 18);      // "1.5"

// ACDC-specific helpers
const acdcWei = parseAcdc('1.5');      // 1500000000000000000n
const acdc = formatAcdc(acdcWei);      // "1.5"

Address Utilities

import { isValidAddress, getAddressChain, checksumAddress } from '@acdc/sdk';

// Validate address
isValidAddress('dx1abc...');           // true
isValidAddress('invalid');             // false

// Get chain from address
getAddressChain('dx1abc...');          // 'delta'
getAddressChain('ax1xyz...');          // 'alpha'

// Checksum address
checksumAddress('dx1abc...');          // 'dx1Abc...'

Hashing

import { keccak256, sha256, hashMessage } from '@acdc/sdk';

const hash = keccak256('0xdata...');
const msgHash = hashMessage('Sign this message');

TypeScript Types

import type {
  Block,
  Transaction,
  TransactionReceipt,
  Log,
  Balance,
  Account,
  Validator,
  Proposal,
  StakeInfo
} from '@acdc/sdk';

// Type-safe contract interaction
interface ERC20 {
  balanceOf(owner: string): Promise<bigint>;
  transfer(to: string, amount: bigint): Promise<Transaction>;
}

const token = new Contract('dx1token...', abi, client) as unknown as ERC20;
const balance: bigint = await token.balanceOf('dx1holder...');

Browser Usage

<script type="module">
  import { AcdcClient, Wallet } from 'https://cdn.jsdelivr.net/npm/@acdc/sdk/dist/esm/index.js';

  const client = new AcdcClient({
    chain: 'delta',
    network: 'mainnet'
  });

  const balance = await client.getBalance('dx1abc...');
  console.log(balance.formatted);
</script>

Error Reference

Error Class Description
RpcError JSON-RPC error from node
NetworkError Connection/timeout error
InvalidAddressError Invalid address format
InsufficientFundsError Not enough balance
NonceError Nonce mismatch
SignatureError Invalid signature