TON平台FunC Jetton合约测试报错:调用非活跃合约get方法
解决TON Jetton合约测试中“Trying to run get method on non-active contract”错误
核心问题分析
这个错误的本质是:调用合约get方法时,目标合约地址在测试链上还处于未激活状态——要么部署交易没被确认,要么合约根本没被正确部署(比如Jetton Wallet是Minter动态创建的,没触发创建逻辑)。
针对性修复步骤
1. 部署Minter后必须等待交易确认
TypeScript测试里,部署合约后不能立刻调用get方法,必须等交易上链确认。示例代码:
// 部署Minter合约 const minter = await deployMinter(...); // 等待合约部署完成(用TON测试框架的内置方法) await minter.waitForDeploy(); // 或者直接等待交易处理结束 await provider.waitForTransaction(minter.address);
2. 正确触发Jetton Wallet的创建逻辑
Jetton Wallet是由Minter通过internal_transfer或mint操作动态创建的,直接调用Wallet的get方法会因为合约不存在报错。正确流程:
- 先调用Minter的
get_wallet_address获取目标Wallet地址 - 触发Minter的
mint操作(内部转账会自动创建Wallet),或者给Wallet地址转小额TON激活 - 等待Wallet合约创建完成后,再调用其get方法
示例代码片段:
// 获取用户的Jetton Wallet地址 const walletAddress = await minter.getWalletAddress(userAddress); // 执行Mint操作触发Wallet创建 await minter.sendMint(userAddress, amount); // 等待Wallet合约激活 await provider.waitForTransaction(walletAddress); // 现在可以正常调用Wallet的get方法 const jettonWallet = new JettonWallet(provider, walletAddress); const balance = await jettonWallet.getBalance();
3. 验证测试链状态
- 确保用的是本地TON节点(如
ton-local-node)或测试网(testnet.ton.org),且节点同步正常 - 检查部署交易的状态,确认已上链:
const txStatus = await provider.getTransaction(txHash); if (txStatus.status !== 'finalized') { throw new Error('部署交易未完成确认'); }
4. 检查合约初始化逻辑
- 确认Minter合约的
init函数正确初始化了Jetton参数(名称、符号、供应量等),没有导致部署失败 - 检查Wallet合约的
recv_internal函数是否正确处理Minter的创建调用,确保合约能正常激活
完整测试流程示例
// 1. 初始化测试环境 const provider = new TonProvider(...); const userWallet = await provider.openWallet(userPrivateKey); // 2. 部署Minter并等待确认 const minterCode = await compileFunc('minter.fc'); const minter = new MinterContract(provider, minterCode); const deployTx = await minter.deploy(userWallet.sender); await provider.waitForTransaction(deployTx.hash); // 3. 执行Mint操作,触发Wallet创建 const mintAmount = toNano('1000'); const mintTx = await minter.sendMint(userWallet.address, mintAmount, userWallet.sender); await provider.waitForTransaction(mintTx.hash); // 4. 获取并访问Jetton Wallet const jettonWalletAddress = await minter.getWalletAddress(userWallet.address); const jettonWallet = new JettonWallet(provider, jettonWalletAddress); // 5. 调用get方法验证 const balance = await jettonWallet.getBalance(); console.log(`用户Jetton余额: ${fromNano(balance)}`);
内容的提问来源于stack exchange,提问作者Aditya Thakkar
相关产品推荐
相关产品推荐

