ChainPortalChainPortal Docs
SDK Reference
SDK Reference

Code Examples

Common integration patterns for @chainportal/sdk -- token creation, NFT minting, airdrops, and more.

All examples below use EVM hooks (wagmi + viem). Solana, Cosmos, Aptos, SUI, and NEAR hooks follow the exact same pattern — just swap the import and hook name.

Token Creation with Error Handling

import { useTokenCreation } from '@chainportal/sdk';
import { useState } from 'react';
 
function TokenCreator() {
  const { createToken, isCreating, error, result } = useTokenCreation();
  const [name, setName] = useState('');
  const [symbol, setSymbol] = useState('');
  const [supply, setSupply] = useState('1000000');
 
  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault();
    try {
      const tx = await createToken({
        name,
        symbol,
        decimals: 18,
        initialSupply: supply,
        features: { mintable: true, burnable: true },
      });
      console.log('Token deployed at:', tx.contractAddress);
    } catch (err) {
      console.error('Creation failed:', err);
    }
  };
 
  return (
    <form onSubmit={handleSubmit}>
      <input value={name} onChange={(e) => setName(e.target.value)} placeholder="Token Name" />
      <input value={symbol} onChange={(e) => setSymbol(e.target.value)} placeholder="Symbol" />
      <input value={supply} onChange={(e) => setSupply(e.target.value)} placeholder="Supply" />
      <button type="submit" disabled={isCreating}>
        {isCreating ? 'Deploying...' : 'Create Token'}
      </button>
      {error && <p className="text-red-500">{error.message}</p>}
      {result && (
        <p className="text-green-500">
          Deployed: <code>{result.contractAddress}</code>
        </p>
      )}
    </form>
  );
}

Multi-Chain Token Management

import { useTokenManagement } from '@chainportal/sdk';
import { useAccount } from 'wagmi';
 
function TokenManager({ contractAddress }: { contractAddress: string }) {
  const { address } = useAccount();
  const {
    mint,
    burn,
    pause,
    unpause,
    isLoading,
  } = useTokenManagement(contractAddress);
 
  return (
    <div className="space-y-4">
      <button onClick={() => mint(address!, '1000')}>
        Mint 1,000 Tokens
      </button>
      <button onClick={() => burn('500')}>
        Burn 500 Tokens
      </button>
      <button onClick={() => pause()}>
        Pause Transfers
      </button>
      <button onClick={() => unpause()}>
        Resume Transfers
      </button>
    </div>
  );
}

Airdrop with CSV Upload

import { useAirdrop } from '@chainportal/sdk';
 
function AirdropForm({ tokenAddress }: { tokenAddress: string }) {
  const { distribute, isLoading } = useAirdrop();
 
  const handleFileUpload = async (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0];
    if (!file) return;
 
    const text = await file.text();
    const recipients = text
      .trim()
      .split('\n')
      .slice(1) // skip header
      .map((line) => {
        const [address, amount] = line.split(',');
        return { address: address.trim(), amount: amount.trim() };
      });
 
    await distribute({
      tokenAddress,
      recipients,
    });
  };
 
  return (
    <div>
      <label>
        Upload CSV (address,amount):
        <input type="file" accept=".csv" onChange={handleFileUpload} />
      </label>
      {isLoading && <p>Distributing tokens...</p>}
    </div>
  );
}

Check Factory Status

import { useFactoryStatus, getTokenReadyChains } from '@chainportal/sdk';
 
function ChainStatus() {
  // Check specific chain
  const { isReady } = useFactoryStatus(11155111); // Sepolia
 
  // Get all ready chains
  const readyChains = getTokenReadyChains();
 
  return (
    <div>
      <p>Sepolia ready: {isReady ? 'Yes' : 'No'}</p>
      <p>Total ready chains: {readyChains.length}</p>
      <ul>
        {readyChains.map((chain) => (
          <li key={chain.id}>{chain.name}</li>
        ))}
      </ul>
    </div>
  );
}

Solana Token Creation

import { useSolanaTokenCreation } from '@chainportal/sdk';
import { useWallet } from '@solana/wallet-adapter-react';
 
function SolanaTokenCreator() {
  const wallet = useWallet();
  const { createToken, isCreating } = useSolanaTokenCreation();
 
  const handleCreate = async () => {
    if (!wallet.publicKey) return;
 
    await createToken({
      name: 'My Solana Token',
      symbol: 'MST',
      decimals: 9,
      initialSupply: '1000000',
      mintAuthority: wallet.publicKey.toBase58(),
    });
  };
 
  return (
    <button onClick={handleCreate} disabled={isCreating || !wallet.connected}>
      Create SPL Token
    </button>
  );
}

On this page

Edit on GitHub