使用web3.php调用BSC合约含uint256与address[]参数时遇参数错误
使用web3.php调用BSC合约quote方法的参数传递问题
我在用web3.php调用BSC链上的智能合约时,无参方法(比如WETH)调用正常:
$web3 = new Web3('https://bsc-dataseed.binance.org'); $contract = new Contract($web3->provider, $abi); $contract->at('0x10ED43C718714eb63d5aA57B78B54704E256024E')->call('WETH', function($err, $result) { print_r($result); });
但调用带uint256和address[]参数的quote方法时,始终抛出错误:
InvalidArgumentException
Please make sure you have put all function params and callback.
我之前的错误调用代码是:
$contract->at('0x10ED43C718714eb63d5aA57B78B54704E256024E')->call('quote', [ '25000000000000000000', '[0x8C851d1a123Ff703BD1f9dabe631b69902Df5f97, 0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56]', ], function($err, $result) { print_r($result); });
问题原因
错误核心是address[]参数的传递方式:你把数组转成了字符串,web3.php无法识别这种格式,必须直接传递原生PHP数组。另外要注意uint256大数值用字符串传递可避免溢出。
正确调用方式
直接将path参数以PHP数组形式传递:
$contract->at('0x10ED43C718714eb63d5aA57B78B54704E256024E')->call('quote', [ '25000000000000000000', // uint256类型的amountIn,用字符串避免数值溢出 [ '0x8C851d1a123Ff703BD1f9dabe631b69902Df5f97', '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56' ] // address[]类型的path,直接传PHP数组 ], function($err, $result) { if ($err) { var_dump($err); return; } print_r($result); });
如果想用带参数名的关联数组传递,格式如下:
$contract->at('0x10ED43C718714eb63d5aA57B78B54704E256024E')->call('quote', [ 'amountIn' => '25000000000000000000', 'path' => [ '0x8C851d1a123Ff703BD1f9dabe631b69902Df5f97', '0xe9e7CEA3DedcA5984780Bafc599bD69ADd087D56' ] ], function($err, $result) { if ($err) { var_dump($err); return; } print_r($result); });
注意事项
uint256类型的大数值必须用字符串传递,防止PHP整数溢出;- 数组类型参数(如
address[])必须直接传PHP数组,不能转为字符串; - 确保ABI中
quote方法的参数定义和你传递的顺序/名称完全匹配,参数不匹配也会触发该错误。
内容的提问来源于stack exchange,提问作者GPaul
相关产品推荐
相关产品推荐

