当我试图用合同中的资金填写订单时,我会得到以下一般性错误:
错误:事务: 0x1d3161cd7f318c3b0b28fc34b2c6bca0cbf4efdb3b11fcf7ec3af7c9adfd821b退出时出现错误(状态0)。给出理由: TRANSFER_FAILED。请检查事务:-满足Solidity
require语句设置的所有条件。-不触发可靠的revert语句。
我有以下合同:
pragma solidity >=0.4.24;
Exchange exchange;
EthForERC20Token crowdsale;
WrapERC20Token wrapERC20Token;
constructor(
address _exchangeAddress
)
public
{
// The local 0x exchange intstance
exchange = Exchange(_exchangeAddress);
// Grand unlimited allownace to the exchange contract.
wrapERC20Token = new WrapERC20Token(address(exchange));
}
function fillOrder (
Exchange.Order memory _order,
uint256 _assetFillAmount,
bytes memory _signature
)
public
payable
{
exchange.fillOrder(_order,_assetFillAmount, _signature);
}
function getWrappedERC20Address()
public
view
returns(address) {
return address(wrapERC20Token);
}我进行了测试,合同拥有足够的WrappedERC20Token,这只是一个ERC20令牌,可以选择预先批准一个地址,并提供无限的补贴。
我的0x订单创建如下:
const wrappedShareAddress = await contract.getWrappedShareAddress();
const maker = accounts[0];
const makerAssetData = zeroX.assetDataUtils.encodeERC20AssetData(etherToken);
const takerAssetData = zeroX.assetDataUtils.encodeERC20AssetData(wrappedShareAddress);
const contractWrappers = new zeroX.ContractWrappers(providerEngine, { networkId: 50 });
const order = {
exchangeAddress: exchange,
makerAddress: maker.toLowerCase(),
takerAddress: NULL_ADDRESS,
senderAddress: NULL_ADDRESS,
feeRecipientAddress: NULL_ADDRESS,
expirationTimeSeconds: (1581437362).toString(),
salt: zeroX.generatePseudoRandomSalt().toString(),
makerAssetAmount: new zeroX.BigNumber("5e17").toFixed(),
takerAssetAmount: new zeroX.BigNumber("5e17").toFixed(),
makerAssetData,
takerAssetData,
makerFee: new zeroX.BigNumber("0").toFixed(),
takerFee: new zeroX.BigNumber("0").toFixed(),
};
// console.log(order);
// Generate the order hash and sign it
const orderHashHex = zeroX.orderHashUtils.getOrderHashHex(order);
signature = await zeroX.signatureUtils.ecSignHashAsync(providerEngine, orderHashHex, maker);
signedOrder = {...order, signature};
const makerWETHApprovalTxHash = await contractWrappers.erc20Token.setUnlimitedProxyAllowanceAsync(
etherToken,
maker,
);
await toTxhash.mineTx(makerWETHApprovalTxHash);
const makerWETHDepositTxHash = await contractWrappers.etherToken.depositAsync(
etherToken,
new zeroX.BigNumber("2e18"),
maker,
);
await toTxhash.mineTx(makerWETHDepositTxHash);然后,我使用以下方法调用智能契约函数:
const res = await contract.fillOrder(
signedOrder,
new zeroX.BigNumber("5e17").toFixed(),
signature,
{from: maker, value: new zeroX.BigNumber("1e18").toFixed()}
);发布于 2019-02-12 18:51:01
您的合同需要批准0x ERC20Proxy来移动ERC20令牌。
例如,查看货代合同,它在构造函数中执行此操作。
https://ethereum.stackexchange.com/questions/66975
复制相似问题