NEXUS

Controllers

These controllers handle the core functionality of the SDK.

AccountController

This controller is responsible for account-related operations.

// React Example
import { AccountController } from '@to-nexus/sdk/react'

// Get wallet address
const FROM_ADDRESS = AccountController.state.address as `0x${string}`

// Prepare updated token balance list
const balance = account?.tokenBalance?.map((token) => {
  if (token.address === ERC20_ADDRESS.toLowerCase()) {
    return {
      ...token,
      quantity: {
        ...token.quantity,
        numeric: amount  // actual balance read from the contract
      }
    };
  }
  return token;
})

// Update token balance
await AccountController.updateTokenBalance(balance)

// Fetch token balance
await AccountController.fetchTokenBalance()
// Vanilla JS Example
import { AccountController, ConnectionController } from '@to-nexus/sdk';

// Get wallet address
const FROM_ADDRESS = AccountController.state.address;

// Fetch ERC20 balance from contract and update token balance
const ERC20_ADDRESS = '0xe934057Ac314cD9bA9BC17AE2378959fd39Aa2E3';
const sampleErc20ABI = /* ... ABI ... */;
const amount = await ConnectionController.readContract({
  contractAddress: ERC20_ADDRESS,
  method: 'balanceOf',
  abi: sampleErc20ABI,
  args: [FROM_ADDRESS]
});
const balance = AccountController.state.tokenBalance?.map(token => {
  if (token.address === ERC20_ADDRESS.toLowerCase()) {
    return {
      ...token,
      quantity: {
        ...token.quantity,
        numeric: amount // actual balance read from the contract
      }
    };
  }
  return token;
});
await AccountController.updateTokenBalance(balance);

// Fetch token balance from network
await AccountController.fetchTokenBalance();

Key Features

  • state: Object managing current account state
    • address: Wallet address of the connected user
    • tokenBalance: Token balance information
    • balance: Native token balance
    • balanceSymbol: Native token symbol
  • updateTokenBalance: Function to update ERC-20 token balances
  • fetchTokenBalance: Function to fetch token balances

ConnectionController

This controller handles blockchain connection and interaction.

// React Example
import { ConnectionController } from '@to-nexus/sdk/react'

// Read from contract
const amount = await ConnectionController.readContract({
  contractAddress: ERC20_ADDRESS,
  method: 'balanceOf',
  abi: sampleErc20ABI,
  args: [FROM_ADDRESS]
})

// Write to contract
const resTx = await ConnectionController.writeContract({
  fromAddress: FROM_ADDRESS,
  contractAddress: ERC721_ADDRESS,
  args: [FROM_ADDRESS, tokenId],
  method: 'mint',
  abi: sampleErc721ABI,
  chainNamespace: network?.caipNetwork?.chainNamespace
})

// Sign message
const signedMessage = await ConnectionController.signMessage({ 
  message: `Hello, world! ${Date.now()}`,
  customData: {
    metadata: "Message signing"
  }
})

// Sign EIP-712
const resSignedEIP712 = await ConnectionController.signEIP712({
  contractAddress: PERMIT_CONTRACT_ADDRESS,
  fromAddress: FROM_ADDRESS,
  spenderAddress: PERMIT_SPENDER_ADDRESS,
  value: PERMIT_VALUE,
  abi: sampleEIP721,
  customData: {
    metadata: "EIP712 signing"
  }
})

// Convert units
const amountInWei = ConnectionController.parseUnits(amount.toString(), decimals)
const amountInEth = ConnectionController.formatUnits(BigInt(amount), decimals)
// Vanilla JS Example
import { ConnectionController, ConstantsUtil } from '@to-nexus/sdk';

// Read from contract
const ERC20_ADDRESS = '0xe934057Ac314cD9bA9BC17AE2378959fd39Aa2E3';
const sampleErc20ABI = /* ... ABI ... */;
const FROM_ADDRESS = /* your address */;
const amount = await ConnectionController.readContract({
  contractAddress: ERC20_ADDRESS,
  method: 'balanceOf',
  abi: sampleErc20ABI,
  args: [FROM_ADDRESS]
});

// Write to contract
const ERC721_ADDRESS = '0xaD31a95fE6bAc89Bc4Cf84dEfb23ebBCA080c013';
const sampleErc721ABI = /* ... ABI ... */;
const tokenId = /* your tokenId */;
const network = /* your network object */;
const resTx = await ConnectionController.writeContract({
  fromAddress: FROM_ADDRESS,
  contractAddress: ERC721_ADDRESS,
  args: [FROM_ADDRESS, tokenId],
  method: 'mint',
  abi: sampleErc721ABI,
  chainNamespace: network?.caipNetwork?.chainNamespace,
  customData: {
    metadata: {
      activity: 'You are about to mint an NFT.',
      txTime: new Date().toISOString()
    }
  },
  type: ConstantsUtil.TRANSACTION_TYPE.LEGACY
});

// Sign message
const signedMessage = await ConnectionController.signMessage({
  message: `Hello, world! ${Date.now()}`,
  customData: {
    metadata: 'This is metadata for signed message'
  }
});

// Sign EIP-712
const PERMIT_CONTRACT_ADDRESS = '0x7aa0c7864455cf7a967409c158ae4cd41a2c5585';
const PERMIT_SPENDER_ADDRESS = '0xC87D72172cd8839DdB26a7478025883af783571e';
const PERMIT_VALUE = 1000000000000000000n;
const sampleEIP712 = /* ... ABI ... */;
const resSignedEIP712 = await ConnectionController.signEIP712({
  contractAddress: PERMIT_CONTRACT_ADDRESS,
  fromAddress: FROM_ADDRESS,
  spenderAddress: PERMIT_SPENDER_ADDRESS,
  value: PERMIT_VALUE,
  abi: sampleEIP712,
  customData: {
    metadata: 'This is metadata for signed EIP712'
  }
});

// Convert units
const amountInWei = ConnectionController.parseUnits('1', 18);
const amountInEth = ConnectionController.formatUnits(BigInt('1000000000000000000'), 18);

Key Features

  • readContract: Reads data from a smart contract
  • writeContract: Writes to a smart contract (state change)
  • signMessage: Signs an arbitrary message
  • signEIP712: Signs typed data using EIP-712
  • parseUnits: Converts token units (e.g., ETH to Wei)
  • formatUnits: Converts token units (e.g., Wei to ETH)

SendController

This controller handles token transfers.

// React Example
import { SendController } from '@to-nexus/sdk/react'

// Send native token
const resTx = await SendController.sendNativeToken({
  receiverAddress: RECEIVER_ADDRESS,
  sendTokenAmount: SEND_CROSS_AMOUNT,
  decimals: '18',
  customData: {
    metadata: "CROSS token transfer"
  }
})

// Send ERC20 token
const resTx = await SendController.sendERC20Token({
  receiverAddress: RECEIVER_ADDRESS,
  contractAddress: ERC20_CAIP_ADDRESS,
  sendTokenAmount: SEND_ERC20_AMOUNT,
  decimals: '18',
  customData: {
    metadata: "ERC20 token transfer"
  }
})
// Vanilla JS Example
import { SendController, ConstantsUtil } from '@to-nexus/sdk';

// Send native token
const RECEIVER_ADDRESS = '0xB09f7E5309982523310Af3eA1422Fcc2e3a9c379';
const SEND_CROSS_AMOUNT = 1;
const resTx = await SendController.sendNativeToken({
  data: '0x',
  receiverAddress: RECEIVER_ADDRESS,
  sendTokenAmount: SEND_CROSS_AMOUNT, // in eth (not wei)
  decimals: '18',
  customData: {
    metadata: 'You are about to send 1 CROSS to the receiver address. This is plain text formatted custom data.'
  },
  type: ConstantsUtil.TRANSACTION_TYPE.LEGACY
});

// Send ERC20 token
const ERC20_ADDRESS = '0xe934057Ac314cD9bA9BC17AE2378959fd39Aa2E3';
const networkState = /* your network state */;
const ERC20_CAIP_ADDRESS = `${networkState.caipNetworkId}:${ERC20_ADDRESS}`;
const SEND_ERC20_AMOUNT = 1;
const resTx2 = await SendController.sendERC20Token({
  receiverAddress: RECEIVER_ADDRESS,
  contractAddress: ERC20_CAIP_ADDRESS,
  sendTokenAmount: SEND_ERC20_AMOUNT, // in eth (not wei)
  decimals: '18',
  customData: {
    metadata: `<DOCTYPE html><html><head><title>Game Developer can add custom data to the transaction</title></head><body><h1>Game Developer can add custom data to the transaction</h1><p>This is a HTML text formatted custom data.</p></body></html>`
  },
  type: ConstantsUtil.TRANSACTION_TYPE.LEGACY
});

Key Features

  • sendNativeToken: Sends native tokens (e.g., CROSS)
  • sendERC20Token: Sends ERC-20 tokens

© 2025 NEXUS Co., Ltd. All Rights Reserved.