Axelar跨链转账失败:调用sendToMany触发算术溢出错误
Axelar跨链aUSDC转账执行失败排查(算术溢出/下溢错误)
我尝试通过Axelar将aUSDC从Optimism Goerli跨链转账至Base Goerli,已分别在两条测试链部署OPSender.sol和BaseReceiver.sol合约。调用OPSender的sendToMany函数时,出现「Transaction mined but execution failed」错误,经Tenderly调试提示算术溢出/下溢,但合约未涉及复杂运算。
调用参数
{ "string _destChain": "Base", "string _destContractAddr": "0x291b1B6EB9DE79f0cb181bCF68Ae1ea70d9B8760", "address[] _destinationAddrs": [ "0xD1872508B5A49eD6Ea5EefD93e643623c0F83a78" ], "string _symbol": "aUSDC", "uint256 _amount": "100" }
附加原生代币金额:10000000000000000 wei
OPSender.sol 合约代码
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC20 } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IERC20.sol'; import { IAxelarGateway } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarExecutable.sol'; import { IAxelarGasService } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGasService.sol'; contract OPSender { IAxelarGasService gasReceiver; IAxelarGateway gateway; constructor ( address _gateway, address _gasReceiver ) { gateway = IAxelarGateway(_gateway); gasReceiver = IAxelarGasService(_gasReceiver); } function sendToMany( string memory _destChain, string memory _destContractAddr, address[] calldata _destinationAddrs, string memory _symbol, uint256 _amount ) external payable { require(msg.value > 0, "Gas payment required"); // get token address from symbol address tokenAddress = gateway.tokenAddresses(_symbol); // send funds to this contract IERC20(tokenAddress).transferFrom(msg.sender, address(this), _amount); // approve gateway to spend funds IERC20(tokenAddress).approve(address(gateway), _amount); // encode recipient addresses tx on destination chain bytes memory _payload = abi.encode(_destinationAddrs); //pay gas from source chain gasReceiver.payNativeGasForContractCallWithToken{value: msg.value} ( address(this), _destChain, _destContractAddr, _payload, _symbol, _amount, msg.sender ); // send token and execute call gateway.callContractWithToken( _destChain, _destContractAddr, _payload, _symbol, _amount ); } }
BaseReceiver.sol 合约代码
//SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import { IERC20 } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IERC20.sol'; import { IAxelarExecutable } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarExecutable.sol'; import { IAxelarGasService } from '@axelar-network/axelar-cgp-solidity/contracts/interfaces/IAxelarGasService.sol'; contract BaseReceiver is IAxelarExecutable { IAxelarGasService public immutable gasService; constructor (address _gateway, address _gasService) IAxelarExecutable(_gateway) { gasService = IAxelarGasService(_gasService); } event Executed(); function _executeWithToken( string memory, string memory, bytes calldata _payload, string memory _tokenSymbol, uint256 _amount ) internal override { // decode recipients address[] memory recipients = abi.decode(_payload, (address[])); // get token addr address tokenAddress = gateway.tokenAddresses(_tokenSymbol); // get first address address recipient = recipients[0]; // transfer to recipient IERC20(tokenAddress).transfer(recipient, _amount); emit Executed(); } }
问题核心
调用sendToMany函数触发交易执行失败,Tenderly提示算术溢出/下溢错误,但合约代码中未包含复杂算术运算,不清楚错误触发原因。
内容的提问来源于stack exchange,提问作者benjamin852
相关产品推荐
相关产品推荐

