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
Updated about 1 month ago