跳到主要内容

TON 钱包集成

TON 钱包集成提供了完整的钱包管理功能,包括多种钱包合约版本和操作接口。

🏦 钱包合约版本

WalletContractV3R2

最基础的 TON 钱包合约,支持基本的转账功能:

import { WalletContractV3R2 } from '@ton/ton';

async function createV3R2Wallet(keyPair: KeyPair) {
const workchain = 0; // 通常使用 workchain 0
const wallet = WalletContractV3R2.create({
workchain,
publicKey: keyPair.publicKey
});

const contract = client.open(wallet);
const address = contract.address.toString({ bounceable: false, urlSafe: true });

console.log('v3r2 address:', address);

// 获取余额
const balance: bigint = await contract.getBalance();
console.log('balance:', balance);

return contract;
}

WalletContractV4

增强版钱包合约,支持更多功能:

import { WalletContractV4 } from '@ton/ton';

async function createV4R2Wallet(keyPair: KeyPair) {
const workchain = 0;
const wallet = WalletContractV4.create({
workchain,
publicKey: keyPair.publicKey
});

const contract = client.open(wallet);
const address = contract.address.toString({ bounceable: false, urlSafe: true });

console.log('v4r2 address:', address);

// 获取余额
const balance: bigint = await contract.getBalance();
console.log('balance:', balance);

return contract;
}

WalletContractV5R1

最新版本的钱包合约,提供最佳性能和功能:

import { WalletContractV5R1 } from '@ton/ton';

async function createV5R1Wallet(keyPair: KeyPair) {
const wallet = WalletContractV5R1.create({
publicKey: keyPair.publicKey
});

const contract = client.open(wallet);
const address = contract.address.toString({ bounceable: false, urlSafe: true });

console.log('v5 address:', address);

// 获取余额
const balance: bigint = await contract.getBalance();
console.log('balance:', balance);

return contract;
}

🔄 钱包操作

获取序列号

const seqno = await contract.getSeqno();
console.log('Current sequence number:', seqno);

检查合约状态

const isDeployed = await client.isContractDeployed(walletAddress);
console.log('Wallet deployed:', isDeployed);

if (isDeployed) {
const state = await client.getContractState(walletAddress);
console.log('Contract state:', state);
}

获取合约数据

const contractData = await contract.getData();
console.log('Contract data:', contractData);

💸 转账操作

创建转账交易

import { internal, SendMode, toNano } from '@ton/ton';

const transfer = contract.createTransfer({
seqno,
secretKey: keyPair.secretKey,
messages: [
internal({
value: toNano('0.01'), // 转账金额
to: recipientAddress, // 接收地址
body: 'Hello TON!', // 消息内容
bounce: false, // 是否允许退回
}),
],
sendMode: SendMode.NONE,
});

发送交易

// 发送交易
await contract.send(transfer);

// 或者使用 sendBoc
const boc = transfer.toBoc();
await contract.sendBoc(boc);

🔧 配置选项

客户端配置

const client = new TonClient({
endpoint: 'https://toncenter.com/api/v2/jsonRPC',
apiKey: 'YOUR_API_KEY',
timeout: 30000, // 30 秒超时
});

📝 完整示例

import { mnemonicToPrivateKey } from '@ton/crypto';
import { TonClient, WalletContractV4, internal, SendMode, toNano } from '@ton/ton';

async function walletOperations() {
// 创建客户端
const client = new TonClient({
endpoint: 'https://toncenter.com/api/v2/jsonRPC',
apiKey: 'YOUR_API_KEY'
});

// 从助记词生成密钥对
const mnemonics = process.env.TON_MNEMONIC;
const keyPair = await mnemonicToPrivateKey(mnemonics.split(' '));

// 创建钱包合约
const wallet = WalletContractV4.create({
workchain: 0,
publicKey: keyPair.publicKey
});
const contract = client.open(wallet);

// 获取钱包信息
const address = contract.address;
const balance = await contract.getBalance();
const seqno = await contract.getSeqno();
const isDeployed = await client.isContractDeployed(address);

console.log('Wallet Address:', address.toString({ bounceable: false }));
console.log('Balance:', balance.toString());
console.log('Sequence Number:', seqno);
console.log('Deployed:', isDeployed);

// 创建转账交易
const recipientAddress = 'UQCK8IqcjCaiKtWR4Jl0r3HmTNb2WFTMIAO7yh5cIgb8aKes';

const transfer = contract.createTransfer({
seqno,
secretKey: keyPair.secretKey,
messages: [
internal({
value: toNano('0.01'),
to: recipientAddress,
body: 'Hello from TON wallet!',
bounce: false,
}),
],
sendMode: SendMode.NONE,
});

// 发送交易
await contract.send(transfer);
console.log('Transaction sent successfully!');

return { contract, address, balance, seqno };
}

// 使用示例
walletOperations().catch(console.error);