Fix regression in DevUtils (#2449)
* fix bug in OrderTransferSimulationUtils causing failures for 721 assets * Patched the regression and added tests * Added regression test for fillable order * Created a test for in and out of process ganache * Split up DevUtils into two contracts * Updated migration * Remove the in and out of process ganache test * Fixed contract addresses * Appease linter * Addressed review comments and updated artifacts, wrappers, and snapshots * Fixed regression after refactor * Update DevUtils and libTransactionDecoder contracts on mainnet and testnets * Addressed @mzhu's review feedback * Addressed @hysz's review feedback * Updated devUtils address on testnets and mainnet after deployment Co-authored-by: mzhu25 <mchl.zhu.96@gmail.com> Co-authored-by: Fabio B <kandinsky454@protonmail.ch>
This commit is contained in:
		@@ -7,7 +7,7 @@
 | 
			
		||||
        "evmVersion": "istanbul",
 | 
			
		||||
        "optimizer": {
 | 
			
		||||
            "enabled": true,
 | 
			
		||||
            "runs": 200,
 | 
			
		||||
            "runs": 5000,
 | 
			
		||||
            "details": { "yul": true, "deduplicate": true, "cse": true, "constantOptimizer": true }
 | 
			
		||||
        },
 | 
			
		||||
        "outputSelection": {
 | 
			
		||||
 
 | 
			
		||||
@@ -26,14 +26,12 @@ import "@0x/contracts-utils/contracts/src/LibEIP712.sol";
 | 
			
		||||
import "@0x/contracts-utils/contracts/src/LibBytes.sol";
 | 
			
		||||
import "./OrderValidationUtils.sol";
 | 
			
		||||
import "./OrderTransferSimulationUtils.sol";
 | 
			
		||||
import "./LibTransactionDecoder.sol";
 | 
			
		||||
import "./EthBalanceChecker.sol";
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
// solhint-disable no-empty-blocks
 | 
			
		||||
contract DevUtils is
 | 
			
		||||
    OrderValidationUtils,
 | 
			
		||||
    LibTransactionDecoder,
 | 
			
		||||
    LibEIP712ExchangeDomain,
 | 
			
		||||
    EthBalanceChecker
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,10 @@ contract OrderTransferSimulationUtils is
 | 
			
		||||
        TransfersSuccessful       // All transfers in the order were successful
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // NOTE(jalextowle): This is a random address that we use to avoid issues that addresses like `address(1)`
 | 
			
		||||
    // may cause later.
 | 
			
		||||
    address constant internal UNUSED_ADDRESS = address(0x377f698C4c287018D09b516F415317aEC5919332);
 | 
			
		||||
 | 
			
		||||
    // keccak256(abi.encodeWithSignature("Error(string)", "TRANSFERS_SUCCESSFUL"));
 | 
			
		||||
    bytes32 constant internal _TRANSFERS_SUCCESSFUL_RESULT_HASH = 0xf43f26ea5a94b478394a975e856464913dc1a8a1ca70939d974aa7c238aa0ce0;
 | 
			
		||||
 | 
			
		||||
@@ -82,13 +86,13 @@ contract OrderTransferSimulationUtils is
 | 
			
		||||
        // Transfer `makerAsset` from maker to taker
 | 
			
		||||
        assetData[0] = order.makerAssetData;
 | 
			
		||||
        fromAddresses[0] = order.makerAddress;
 | 
			
		||||
        toAddresses[0] = takerAddress;
 | 
			
		||||
        toAddresses[0] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress;
 | 
			
		||||
        amounts[0] = fillResults.makerAssetFilledAmount;
 | 
			
		||||
 | 
			
		||||
        // Transfer `makerFeeAsset` from maker to feeRecipient
 | 
			
		||||
        assetData[1] = order.makerFeeAssetData;
 | 
			
		||||
        fromAddresses[1] = order.makerAddress;
 | 
			
		||||
        toAddresses[1] = order.feeRecipientAddress;
 | 
			
		||||
        toAddresses[1] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress;
 | 
			
		||||
        amounts[1] = fillResults.makerFeePaid;
 | 
			
		||||
 | 
			
		||||
        return _simulateTransferFromCalls(
 | 
			
		||||
@@ -134,19 +138,19 @@ contract OrderTransferSimulationUtils is
 | 
			
		||||
        // Transfer `makerAsset` from maker to taker
 | 
			
		||||
        assetData[1] = order.makerAssetData;
 | 
			
		||||
        fromAddresses[1] = order.makerAddress;
 | 
			
		||||
        toAddresses[1] = takerAddress;
 | 
			
		||||
        toAddresses[1] = takerAddress == address(0) ? UNUSED_ADDRESS : takerAddress;
 | 
			
		||||
        amounts[1] = fillResults.makerAssetFilledAmount;
 | 
			
		||||
 | 
			
		||||
        // Transfer `takerFeeAsset` from taker to feeRecipient
 | 
			
		||||
        assetData[2] = order.takerFeeAssetData;
 | 
			
		||||
        fromAddresses[2] = takerAddress;
 | 
			
		||||
        toAddresses[2] = order.feeRecipientAddress;
 | 
			
		||||
        toAddresses[2] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress;
 | 
			
		||||
        amounts[2] = fillResults.takerFeePaid;
 | 
			
		||||
 | 
			
		||||
        // Transfer `makerFeeAsset` from maker to feeRecipient
 | 
			
		||||
        assetData[3] = order.makerFeeAssetData;
 | 
			
		||||
        fromAddresses[3] = order.makerAddress;
 | 
			
		||||
        toAddresses[3] = order.feeRecipientAddress;
 | 
			
		||||
        toAddresses[3] = order.feeRecipientAddress == address(0) ? UNUSED_ADDRESS : order.feeRecipientAddress;
 | 
			
		||||
        amounts[3] = fillResults.makerFeePaid;
 | 
			
		||||
 | 
			
		||||
        return _simulateTransferFromCalls(
 | 
			
		||||
 
 | 
			
		||||
@@ -133,6 +133,18 @@ contract OrderValidationUtils is
 | 
			
		||||
            fillableTakerAssetAmount
 | 
			
		||||
        ) == OrderTransferResults.TransfersSuccessful ? fillableTakerAssetAmount : 0;
 | 
			
		||||
 | 
			
		||||
        if (!_isAssetDataValid(order.takerAssetData)) {
 | 
			
		||||
            fillableTakerAssetAmount = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (order.takerFee != 0 && !_isAssetDataValid(order.takerFeeAssetData)) {
 | 
			
		||||
            fillableTakerAssetAmount = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (orderInfo.orderStatus != LibOrder.OrderStatus.FILLABLE) {
 | 
			
		||||
            fillableTakerAssetAmount = 0;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return (orderInfo, fillableTakerAssetAmount, isValidSignature);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -185,4 +197,63 @@ contract OrderValidationUtils is
 | 
			
		||||
        transferableAssetAmount = LibSafeMath.min256(balance, allowance);
 | 
			
		||||
        return transferableAssetAmount;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// @dev This function handles the edge cases around taker validation. This function
 | 
			
		||||
    ///      currently attempts to find duplicate ERC721 token's in the taker
 | 
			
		||||
    ///      multiAssetData.
 | 
			
		||||
    /// @param assetData The asset data that should be validated.
 | 
			
		||||
    /// @return Whether or not the order should be considered valid.
 | 
			
		||||
    function _isAssetDataValid(bytes memory assetData)
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bool)
 | 
			
		||||
    {
 | 
			
		||||
        // Asset data must be composed of an asset proxy Id and a bytes segment with
 | 
			
		||||
        // a length divisible by 32.
 | 
			
		||||
        if (assetData.length % 32 != 4) {
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Only process the taker asset data if it is multiAssetData.
 | 
			
		||||
        bytes4 assetProxyId = assetData.readBytes4(0);
 | 
			
		||||
        if (assetProxyId != IAssetData(address(0)).MultiAsset.selector) {
 | 
			
		||||
            return true;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        // Get array of values and array of assetDatas
 | 
			
		||||
        (, uint256[] memory assetAmounts, bytes[] memory nestedAssetData) = decodeMultiAssetData(assetData);
 | 
			
		||||
 | 
			
		||||
        uint256 length = nestedAssetData.length;
 | 
			
		||||
        for (uint256 i = 0; i != length; i++) {
 | 
			
		||||
            // TODO(jalextowle): Implement similar validation for non-fungible ERC1155 asset data.
 | 
			
		||||
            bytes4 nestedAssetProxyId = nestedAssetData[i].readBytes4(0);
 | 
			
		||||
            if (nestedAssetProxyId == IAssetData(address(0)).ERC721Token.selector) {
 | 
			
		||||
                if (_isAssetDataDuplicated(nestedAssetData, i)) {
 | 
			
		||||
                    return false;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /// Determines whether or not asset data is duplicated later in the nested asset data.
 | 
			
		||||
    /// @param nestedAssetData The asset data to scan for duplication.
 | 
			
		||||
    /// @param startIdx The index where the scan should begin.
 | 
			
		||||
    /// @return A boolean reflecting whether or not the starting asset data was duplicated.
 | 
			
		||||
    function _isAssetDataDuplicated(
 | 
			
		||||
        bytes[] memory nestedAssetData,
 | 
			
		||||
        uint256 startIdx
 | 
			
		||||
    )
 | 
			
		||||
        internal
 | 
			
		||||
        pure
 | 
			
		||||
        returns (bool)
 | 
			
		||||
    {
 | 
			
		||||
        uint256 length = nestedAssetData.length;
 | 
			
		||||
        for (uint256 i = startIdx + 1; i < length; i++) {
 | 
			
		||||
            if (nestedAssetData[startIdx].equals(nestedAssetData[i])) {
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -155,6 +155,19 @@ blockchainTests.resets('OrderValidationUtils/OrderTransferSimulatorUtils', env =
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should correctly validate fillable order', async () => {
 | 
			
		||||
            signedOrder = await maker.signOrderAsync({
 | 
			
		||||
                makerAssetData: erc721AssetData,
 | 
			
		||||
                makerAssetAmount: new BigNumber(1),
 | 
			
		||||
                makerFee: constants.ZERO_AMOUNT,
 | 
			
		||||
                takerFee: constants.ZERO_AMOUNT,
 | 
			
		||||
            });
 | 
			
		||||
            await taker.configureERC20TokenAsync(erc20Token2);
 | 
			
		||||
            const [, fillableTakerAssetAmount] = await devUtils
 | 
			
		||||
                .getOrderRelevantState(signedOrder, signedOrder.signature)
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            expect(fillableTakerAssetAmount).to.bignumber.greaterThan(constants.ZERO_AMOUNT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should return a fillableTakerAssetAmount of 0 when balances/allowances of one asset within a multiAssetData are insufficient (ERC20)', async () => {
 | 
			
		||||
            const multiAssetData = await devUtils
 | 
			
		||||
                .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc20AssetData, erc20AssetData2])
 | 
			
		||||
@@ -222,6 +235,34 @@ blockchainTests.resets('OrderValidationUtils/OrderTransferSimulatorUtils', env =
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should return a fillableTakerAssetAmount of 0 when an erc721 asset is duplicated in the maker fee side of a multi-asset proxy order', async () => {
 | 
			
		||||
            const multiAssetData = await devUtils
 | 
			
		||||
                .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc721AssetData, erc721AssetData])
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            signedOrder = await maker.signOrderAsync({
 | 
			
		||||
                makerFeeAssetData: multiAssetData,
 | 
			
		||||
                makerFee: new BigNumber(1),
 | 
			
		||||
                takerFee: constants.ZERO_AMOUNT,
 | 
			
		||||
            });
 | 
			
		||||
            const [, fillableTakerAssetAmount] = await devUtils
 | 
			
		||||
                .getOrderRelevantState(signedOrder, signedOrder.signature)
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should return a fillableTakerAssetAmount of 0 when an erc721 asset is duplicated in the taker fee side of a multi-asset proxy order', async () => {
 | 
			
		||||
            const multiAssetData = await devUtils
 | 
			
		||||
                .encodeMultiAssetData([new BigNumber(1), new BigNumber(1)], [erc721AssetData, erc721AssetData])
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            signedOrder = await maker.signOrderAsync({
 | 
			
		||||
                makerFee: constants.ZERO_AMOUNT,
 | 
			
		||||
                takerFeeAssetData: multiAssetData,
 | 
			
		||||
                takerFee: new BigNumber(1),
 | 
			
		||||
            });
 | 
			
		||||
            const [, fillableTakerAssetAmount] = await devUtils
 | 
			
		||||
                .getOrderRelevantState(signedOrder, signedOrder.signature)
 | 
			
		||||
                .callAsync();
 | 
			
		||||
            expect(fillableTakerAssetAmount).to.bignumber.equal(constants.ZERO_AMOUNT);
 | 
			
		||||
        });
 | 
			
		||||
        it('should return the correct fillableTakerAssetAmount when fee balances/allowances are partially sufficient', async () => {
 | 
			
		||||
            await erc20Token.setBalance(maker.address, signedOrder.makerAssetAmount).awaitTransactionSuccessAsync();
 | 
			
		||||
            await erc20Token.approve(erc20Proxy.address, signedOrder.makerAssetAmount).awaitTransactionSuccessAsync({
 | 
			
		||||
 
 | 
			
		||||
@@ -196,7 +196,6 @@ export class DeploymentManager {
 | 
			
		||||
            exchange,
 | 
			
		||||
            staking.stakingProxy,
 | 
			
		||||
        ]);
 | 
			
		||||
 | 
			
		||||
        const devUtils = await DevUtilsContract.deployFrom0xArtifactAsync(
 | 
			
		||||
            devUtilsArtifacts.DevUtils,
 | 
			
		||||
            environment.provider,
 | 
			
		||||
 
 | 
			
		||||
@@ -13,13 +13,14 @@
 | 
			
		||||
        "dutchAuction": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "coordinatorRegistry": "0x45797531b873fd5e519477a070a955764c1a5b07",
 | 
			
		||||
        "coordinator": "0x38a795580d0f687e399913a00ddef6a17612c722",
 | 
			
		||||
        "libTransactionDecoder": "0x5f20e82643ce007d87692eb1b3d3fc059588b224",
 | 
			
		||||
        "multiAssetProxy": "0xef701d5389ae74503d633396c4d654eabedc9d78",
 | 
			
		||||
        "staticCallProxy": "0x3517b88c19508c08650616019062b898ab65ed29",
 | 
			
		||||
        "erc1155Proxy": "0x7eefbd48fd63d441ec7435d024ec7c5131019add",
 | 
			
		||||
        "zrxVault": "0xba7f8b5fb1b19c1211c5d49550fcd149177a5eaf",
 | 
			
		||||
        "staking": "0x2a17c35ff147b32f13f19f2e311446eeb02503f3",
 | 
			
		||||
        "stakingProxy": "0xa26e80e7dea86279c6d778d702cc413e6cffa777",
 | 
			
		||||
        "devUtils": "0x5f53f2aa72cb3a9371bf3c58e8fb3a313478b2f4",
 | 
			
		||||
        "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd",
 | 
			
		||||
        "erc20BridgeProxy": "0x8ed95d1746bf1e4dab58d8ed4724f1ef95b20db0",
 | 
			
		||||
        "uniswapBridge": "0x533344cfdf2a3e911e2cf4c6f5ed08e791f5355f",
 | 
			
		||||
        "erc20BridgeSampler": "0x25840bf3582cb9e5acabbf45148b3092ac3f6b56",
 | 
			
		||||
@@ -42,10 +43,11 @@
 | 
			
		||||
        "dutchAuction": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "coordinatorRegistry": "0x403cc23e88c17c4652fb904784d1af640a6722d9",
 | 
			
		||||
        "coordinator": "0x6ff734d96104965c9c1b0108f83abc46e6e501df",
 | 
			
		||||
        "libTransactionDecoder": "0xb20f3b07afb0e38b6151b9be4f53218bdd7dc231",
 | 
			
		||||
        "multiAssetProxy": "0xab8fbd189c569ccdee3a4d929bb7f557be4028f6",
 | 
			
		||||
        "staticCallProxy": "0xe1b97e47aa3796276033a5341e884d2ba46b6ac1",
 | 
			
		||||
        "erc1155Proxy": "0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d",
 | 
			
		||||
        "devUtils": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04",
 | 
			
		||||
        "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd",
 | 
			
		||||
        "zrxVault": "0xffd161026865ad8b4ab28a76840474935eec4dfa",
 | 
			
		||||
        "staking": "0x986b588e472b712385579d172494fe2685669504",
 | 
			
		||||
        "stakingProxy": "0xfaabcee42ab6b9c649794ac6c133711071897ee9",
 | 
			
		||||
@@ -67,6 +69,7 @@
 | 
			
		||||
        "assetProxyOwner": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "zeroExGovernor": "0x3f46b98061a3e1e1f41dff296ec19402c298f8a9",
 | 
			
		||||
        "forwarder": "0xd67f2f346f6e85db70632d9f18f50e04192ab54d",
 | 
			
		||||
        "libTransactionDecoder": "0x34b37611db8190469b735fb2a007d8236c29eb88",
 | 
			
		||||
        "orderValidator": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "dutchAuction": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "coordinatorRegistry": "0x1084b6a398e47907bae43fec3ff4b677db6e4fee",
 | 
			
		||||
@@ -74,7 +77,7 @@
 | 
			
		||||
        "multiAssetProxy": "0xb34cde0ad3a83d04abebc0b66e75196f22216621",
 | 
			
		||||
        "staticCallProxy": "0xe1b97e47aa3796276033a5341e884d2ba46b6ac1",
 | 
			
		||||
        "erc1155Proxy": "0x19bb6caa3bc34d39e5a23cedfa3e6c7e7f3c931d",
 | 
			
		||||
        "devUtils": "0x09a379ef7218bcfd8913faa8b281ebc5a2e0bc04",
 | 
			
		||||
        "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd",
 | 
			
		||||
        "zrxVault": "0xa5bf6ac73bc40790fc6ffc9dbbbce76c9176e224",
 | 
			
		||||
        "staking": "0x7cbe3c09cba24f26db24d9100ee915fa9fa21f5b",
 | 
			
		||||
        "stakingProxy": "0xc6ad5277ea225ac05e271eb14a7ebb480cd9dd9f",
 | 
			
		||||
@@ -97,13 +100,14 @@
 | 
			
		||||
        "zeroExGovernor": "0x6ff734d96104965c9c1b0108f83abc46e6e501df",
 | 
			
		||||
        "forwarder": "0x2759a4c639fa4882d6d64973630ef81faf901d27",
 | 
			
		||||
        "orderValidator": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "libTransactionDecoder": "0x067b5997c9058eade0bb03d8fb5e6db7feda80a3",
 | 
			
		||||
        "dutchAuction": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "coordinatorRegistry": "0x09fb99968c016a3ff537bf58fb3d9fe55a7975d5",
 | 
			
		||||
        "coordinator": "0xd29e59e51e8ab5f94121efaeebd935ca4214e257",
 | 
			
		||||
        "multiAssetProxy": "0xf6313a772c222f51c28f2304c0703b8cf5428fd8",
 | 
			
		||||
        "staticCallProxy": "0x48e94bdb9033640d45ea7c721e25f380f8bffa43",
 | 
			
		||||
        "erc1155Proxy": "0x64517fa2b480ba3678a2a3c0cf08ef7fd4fad36f",
 | 
			
		||||
        "devUtils": "0xeb27220f95f364e1d9531992c48613f231839f53",
 | 
			
		||||
        "devUtils": "0x161793cdca4ff9e766a706c2c49c36ac1340bbcd",
 | 
			
		||||
        "zrxVault": "0xf36eabdfe986b35b62c8fd5a98a7f2aebb79b291",
 | 
			
		||||
        "staking": "0x32b06d5611a03737a5f1834a24ccd641033fd89c",
 | 
			
		||||
        "stakingProxy": "0xbab9145f1d57cd4bb0c9aa2d1ece0a5b6e734d34",
 | 
			
		||||
@@ -125,6 +129,7 @@
 | 
			
		||||
        "assetProxyOwner": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "erc20BridgeProxy": "0x8ea76477cfaca8f7ea06477fd3c09a740ac6012a",
 | 
			
		||||
        "zeroExGovernor": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "libTransactionDecoder": "0xb48e1b16829c7f5bd62b76cb878a6bb1c4625d7a",
 | 
			
		||||
        "forwarder": "0x5d3ad3561a1235273cbcb4e82fce63a0073d19be",
 | 
			
		||||
        "orderValidator": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
        "dutchAuction": "0x0000000000000000000000000000000000000000",
 | 
			
		||||
 
 | 
			
		||||
@@ -14,6 +14,7 @@ export interface ContractAddresses {
 | 
			
		||||
    forwarder: string;
 | 
			
		||||
    coordinatorRegistry: string;
 | 
			
		||||
    coordinator: string;
 | 
			
		||||
    libTransactionDecoder: string;
 | 
			
		||||
    multiAssetProxy: string;
 | 
			
		||||
    staticCallProxy: string;
 | 
			
		||||
    erc1155Proxy: string;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										45
									
								
								packages/contract-artifacts/artifacts/DevUtils.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										45
									
								
								packages/contract-artifacts/artifacts/DevUtils.json
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										84
									
								
								packages/contract-artifacts/artifacts/LibTransactionDecoder.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										84
									
								
								packages/contract-artifacts/artifacts/LibTransactionDecoder.json
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -15,6 +15,7 @@ import * as Forwarder from '../artifacts/Forwarder.json';
 | 
			
		||||
import * as IAssetProxy from '../artifacts/IAssetProxy.json';
 | 
			
		||||
import * as IValidator from '../artifacts/IValidator.json';
 | 
			
		||||
import * as IWallet from '../artifacts/IWallet.json';
 | 
			
		||||
import * as LibTransactionDecoder from '../artifacts/LibTransactionDecoder.json';
 | 
			
		||||
import * as MultiAssetProxy from '../artifacts/MultiAssetProxy.json';
 | 
			
		||||
import * as Staking from '../artifacts/Staking.json';
 | 
			
		||||
import * as StakingProxy from '../artifacts/StakingProxy.json';
 | 
			
		||||
@@ -42,6 +43,7 @@ export {
 | 
			
		||||
    IAssetProxy,
 | 
			
		||||
    IValidator,
 | 
			
		||||
    IWallet,
 | 
			
		||||
    LibTransactionDecoder,
 | 
			
		||||
    MultiAssetProxy,
 | 
			
		||||
    StaticCallProxy,
 | 
			
		||||
    WETH9,
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@
 | 
			
		||||
        "./artifacts/ERC721Token.json",
 | 
			
		||||
        "./artifacts/Exchange.json",
 | 
			
		||||
        "./artifacts/Forwarder.json",
 | 
			
		||||
        "./artifacts/LibTransactionDecoder.json",
 | 
			
		||||
        "./artifacts/IAssetProxy.json",
 | 
			
		||||
        "./artifacts/IValidator.json",
 | 
			
		||||
        "./artifacts/IWallet.json",
 | 
			
		||||
 
 | 
			
		||||
@@ -31,7 +31,7 @@
 | 
			
		||||
        "wrappers:generate": "abi-gen --abis  ${npm_package_config_abis} --output src/generated-wrappers --backend ethers"
 | 
			
		||||
    },
 | 
			
		||||
    "config": {
 | 
			
		||||
        "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler).json"
 | 
			
		||||
        "abis": "../contract-artifacts/artifacts/@(DevUtils|ERC20Token|ERC721Token|Exchange|Forwarder|IAssetData|LibTransactionDecoder|WETH9|Coordinator|Staking|StakingProxy|IERC20BridgeSampler).json"
 | 
			
		||||
    },
 | 
			
		||||
    "repository": {
 | 
			
		||||
        "type": "git",
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,7 @@ import { ERC20TokenContract } from './generated-wrappers/erc20_token';
 | 
			
		||||
import { ERC721TokenContract } from './generated-wrappers/erc721_token';
 | 
			
		||||
import { ExchangeContract } from './generated-wrappers/exchange';
 | 
			
		||||
import { ForwarderContract } from './generated-wrappers/forwarder';
 | 
			
		||||
import { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder';
 | 
			
		||||
import { StakingContract } from './generated-wrappers/staking';
 | 
			
		||||
import { WETH9Contract } from './generated-wrappers/weth9';
 | 
			
		||||
import { ContractWrappersConfig } from './types';
 | 
			
		||||
@@ -46,9 +47,13 @@ export class ContractWrappers {
 | 
			
		||||
     */
 | 
			
		||||
    public coordinator: CoordinatorContract;
 | 
			
		||||
    /**
 | 
			
		||||
     * An instance of the StakingContract class containing methods for interacting with the Coordinator extension contract.
 | 
			
		||||
     * An instance of the StakingContract class containing methods for interacting with the Staking contracts.
 | 
			
		||||
     */
 | 
			
		||||
    public staking: StakingContract;
 | 
			
		||||
    /**
 | 
			
		||||
     * An instance of the LibTransactionDecoder class containing methods for interacting with the LibTransactionDecoder smart contract.
 | 
			
		||||
     */
 | 
			
		||||
    public libTransactionDecoder: LibTransactionDecoderContract;
 | 
			
		||||
 | 
			
		||||
    private readonly _web3Wrapper: Web3Wrapper;
 | 
			
		||||
    /**
 | 
			
		||||
@@ -73,6 +78,7 @@ export class ContractWrappers {
 | 
			
		||||
            ForwarderContract,
 | 
			
		||||
            StakingContract,
 | 
			
		||||
            WETH9Contract,
 | 
			
		||||
            LibTransactionDecoderContract,
 | 
			
		||||
        ];
 | 
			
		||||
        contractsArray.forEach(contract => {
 | 
			
		||||
            this._web3Wrapper.abiDecoder.addABI(contract.ABI(), contract.contractName);
 | 
			
		||||
@@ -87,6 +93,10 @@ export class ContractWrappers {
 | 
			
		||||
        this.staking = new StakingContract(contractAddresses.stakingProxy, this.getProvider());
 | 
			
		||||
        this.devUtils = new DevUtilsContract(contractAddresses.devUtils, this.getProvider());
 | 
			
		||||
        this.coordinator = new CoordinatorContract(contractAddresses.coordinator, this.getProvider());
 | 
			
		||||
        this.libTransactionDecoder = new LibTransactionDecoderContract(
 | 
			
		||||
            contractAddresses.libTransactionDecoder,
 | 
			
		||||
            this.getProvider(),
 | 
			
		||||
        );
 | 
			
		||||
        this.contractAddresses = contractAddresses;
 | 
			
		||||
    }
 | 
			
		||||
    /**
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										367
									
								
								packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										367
									
								
								packages/contract-wrappers/src/generated-wrappers/lib_transaction_decoder.ts
									
									
									
										generated
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -2,6 +2,7 @@ export { ContractAddresses } from '@0x/contract-addresses';
 | 
			
		||||
 | 
			
		||||
export { ContractWrappers } from './contract_wrappers';
 | 
			
		||||
export { DevUtilsContract } from './generated-wrappers/dev_utils';
 | 
			
		||||
export { LibTransactionDecoderContract } from './generated-wrappers/lib_transaction_decoder';
 | 
			
		||||
export { IAssetDataContract } from './generated-wrappers/i_asset_data'; // used for synchronously encoding and decoding asset data
 | 
			
		||||
export {
 | 
			
		||||
    ERC20TokenEventArgs,
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ import {
 | 
			
		||||
    StaticCallProxyContract,
 | 
			
		||||
} from '@0x/contracts-asset-proxy';
 | 
			
		||||
import { CoordinatorContract, CoordinatorRegistryContract } from '@0x/contracts-coordinator';
 | 
			
		||||
import { DevUtilsContract } from '@0x/contracts-dev-utils';
 | 
			
		||||
import { DevUtilsContract, LibTransactionDecoderContract } from '@0x/contracts-dev-utils';
 | 
			
		||||
import { ERC1155MintableContract } from '@0x/contracts-erc1155';
 | 
			
		||||
import { DummyERC20TokenContract, WETH9Contract } from '@0x/contracts-erc20';
 | 
			
		||||
import { DummyERC721TokenContract } from '@0x/contracts-erc721';
 | 
			
		||||
@@ -254,6 +254,14 @@ export async function runMigrationsAsync(
 | 
			
		||||
        etherToken.address,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    // LibTransactionDecoder
 | 
			
		||||
    const libTransactionDecoder = await LibTransactionDecoderContract.deployFrom0xArtifactAsync(
 | 
			
		||||
        artifacts.LibTransactionDecoder,
 | 
			
		||||
        provider,
 | 
			
		||||
        txDefaults,
 | 
			
		||||
        artifacts,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const contractAddresses = {
 | 
			
		||||
        erc20Proxy: erc20Proxy.address,
 | 
			
		||||
        erc721Proxy: erc721Proxy.address,
 | 
			
		||||
@@ -265,6 +273,7 @@ export async function runMigrationsAsync(
 | 
			
		||||
        erc20BridgeProxy: erc20BridgeProxy.address,
 | 
			
		||||
        zeroExGovernor: constants.NULL_ADDRESS,
 | 
			
		||||
        forwarder: forwarder.address,
 | 
			
		||||
        libTransactionDecoder: libTransactionDecoder.address,
 | 
			
		||||
        orderValidator: constants.NULL_ADDRESS,
 | 
			
		||||
        dutchAuction: constants.NULL_ADDRESS,
 | 
			
		||||
        coordinatorRegistry: coordinatorRegistry.address,
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,11 @@ import {
 | 
			
		||||
    UniswapBridgeContract,
 | 
			
		||||
} from '@0x/contracts-asset-proxy';
 | 
			
		||||
import { artifacts as coordinatorArtifacts, CoordinatorContract } from '@0x/contracts-coordinator';
 | 
			
		||||
import { artifacts as devUtilsArtifacts, DevUtilsContract } from '@0x/contracts-dev-utils';
 | 
			
		||||
import {
 | 
			
		||||
    artifacts as devUtilsArtifacts,
 | 
			
		||||
    DevUtilsContract,
 | 
			
		||||
    LibTransactionDecoderContract,
 | 
			
		||||
} from '@0x/contracts-dev-utils';
 | 
			
		||||
import { artifacts as exchangeArtifacts, ExchangeContract } from '@0x/contracts-exchange';
 | 
			
		||||
import { artifacts as forwarderArtifacts, ForwarderContract } from '@0x/contracts-exchange-forwarder';
 | 
			
		||||
import {
 | 
			
		||||
@@ -272,6 +276,13 @@ export async function runMigrationsAsync(supportedProvider: SupportedProvider, t
 | 
			
		||||
        deployedAddresses.exchangeV2,
 | 
			
		||||
        deployedAddresses.etherToken,
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    await LibTransactionDecoderContract.deployFrom0xArtifactAsync(
 | 
			
		||||
        devUtilsArtifacts.LibTransactionDecoder,
 | 
			
		||||
        provider,
 | 
			
		||||
        txDefaults,
 | 
			
		||||
        devUtilsArtifacts,
 | 
			
		||||
    );
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
(async () => {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user