首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >0x:是否有可能从一份智能合同中填写订单?

0x:是否有可能从一份智能合同中填写订单?
EN

Ethereum用户
提问于 2019-02-12 10:46:35
回答 1查看 693关注 0票数 2

当我试图用合同中的资金填写订单时,我会得到以下一般性错误:

错误:事务: 0x1d3161cd7f318c3b0b28fc34b2c6bca0cbf4efdb3b11fcf7ec3af7c9adfd821b退出时出现错误(状态0)。给出理由: TRANSFER_FAILED。请检查事务:-满足Solidity require语句设置的所有条件。-不触发可靠的revert语句。

我有以下合同:

代码语言:javascript
复制
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订单创建如下:

代码语言:javascript
复制
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);

然后,我使用以下方法调用智能契约函数:

代码语言:javascript
复制
    const res = await contract.fillOrder(
        signedOrder,
        new zeroX.BigNumber("5e17").toFixed(),
        signature,
        {from: maker, value: new zeroX.BigNumber("1e18").toFixed()}
    );
EN

回答 1

Ethereum用户

回答已采纳

发布于 2019-02-12 18:51:01

您的合同需要批准0x ERC20Proxy来移动ERC20令牌。

例如,查看货代合同,它在构造函数中执行此操作。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/66975

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档