diff --git a/contracts/zero-ex/contracts/test/TestFundRecoveryFeature.sol b/contracts/zero-ex/contracts/test/TestFundRecoveryFeature.sol new file mode 100644 index 0000000000..b11f915f45 --- /dev/null +++ b/contracts/zero-ex/contracts/test/TestFundRecoveryFeature.sol @@ -0,0 +1,17 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity ^0.6; +pragma experimental ABIEncoderV2; +import "../src/features/FundRecoveryFeature.sol"; + +contract TestFundRecoveryFeature is FundRecoveryFeature { + constructor( + // IERC20TokenV06 erc20, + // uint256 amountOut, + // address payable recipientWallet + ) + FundRecoveryFeature() + public + {} + + receive() external payable {} +} \ No newline at end of file diff --git a/contracts/zero-ex/package.json b/contracts/zero-ex/package.json index 17a46624f0..845d353861 100644 --- a/contracts/zero-ex/package.json +++ b/contracts/zero-ex/package.json @@ -15,11 +15,15 @@ "build:ts": "tsc -b", "pre_build": "run-s compile contracts:gen generate_contract_wrappers contracts:copy", "test": "yarn run_mocha", + "test:funds": " yarn run-s build run_mocha_fund", + "retest": "yarn run-s run_mocha_fund", + "test:recovery": "mocha --grep 'FundRecovery'", "rebuild_and_test": "run-s build test", "test:coverage": "SOLIDITY_COVERAGE=true run-s build run_mocha coverage:report:text coverage:report:lcov", "test:profiler": "SOLIDITY_PROFILER=true run-s build run_mocha profiler:report:html", "test:trace": "SOLIDITY_REVERT_TRACE=true run-s build run_mocha", "run_mocha": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/**/*.js' --timeout 100000 --bail --exit", + "run_mocha_fund": "mocha --require source-map-support/register --require make-promises-safe 'lib/test/features/fund_recovery_tests.js' --timeout 10000000 --bail --exit", "compile": "sol-compiler", "watch": "sol-compiler -w", "clean": "shx rm -rf lib test/generated-artifacts test/generated-wrappers generated-artifacts generated-wrappers", @@ -43,11 +47,15 @@ "config": { "publicInterfaceContracts": "IZeroEx,ZeroEx,FullMigration,InitialMigration,IFlashWallet,IERC20Transformer,IOwnableFeature,ISimpleFunctionRegistryFeature,ITransformERC20Feature,FillQuoteTransformer,PayTakerTransformer,PositiveSlippageFeeTransformer,WethTransformer,OwnableFeature,SimpleFunctionRegistryFeature,TransformERC20Feature,AffiliateFeeTransformer,MetaTransactionsFeature,LogMetadataTransformer,BridgeAdapter,LiquidityProviderFeature,ILiquidityProviderFeature,NativeOrdersFeature,INativeOrdersFeature,FeeCollectorController,FeeCollector,CurveLiquidityProvider,BatchFillNativeOrdersFeature,IBatchFillNativeOrdersFeature,MultiplexFeature,IMultiplexFeature,OtcOrdersFeature,IOtcOrdersFeature", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", +<<<<<<< HEAD <<<<<<< HEAD "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IFeature|IFlashWallet|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinBalancer|MixinBalancerV2|MixinBancor|MixinClipper|MixinCoFiX|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|MultiplexLiquidityProvider|MultiplexOtc|MultiplexRfq|MultiplexTransformERC20|MultiplexUniswapV2|MultiplexUniswapV3|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV2Factory|TestUniswapV2Pool|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json" ======= "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|EpFundRecoveryFeature|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IEpFundRecoveryFeature|IFeature|IFlashWallet|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinBalancer|MixinBalancerV2|MixinBancor|MixinClipper|MixinCoFiX|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json" >>>>>>> 1c8800668 (fixed compilation errors for EpFundsRecovery) +======= + "abis": "./test/generated-artifacts/@(AffiliateFeeTransformer|BatchFillNativeOrdersFeature|BootstrapFeature|BridgeAdapter|BridgeProtocols|CurveLiquidityProvider|FeeCollector|FeeCollectorController|FillQuoteTransformer|FixinCommon|FixinEIP712|FixinProtocolFees|FixinReentrancyGuard|FixinTokenSpender|FlashWallet|FullMigration|FundRecoveryFeature|IBatchFillNativeOrdersFeature|IBootstrapFeature|IBridgeAdapter|IERC20Bridge|IERC20Transformer|IFeature|IFlashWallet|IFundRecoveryFeature|ILiquidityProvider|ILiquidityProviderFeature|ILiquidityProviderSandbox|IMetaTransactionsFeature|IMooniswapPool|IMultiplexFeature|INativeOrdersEvents|INativeOrdersFeature|IOtcOrdersFeature|IOwnableFeature|IPancakeSwapFeature|ISimpleFunctionRegistryFeature|IStaking|ITestSimpleFunctionRegistryFeature|ITokenSpenderFeature|ITransformERC20Feature|IUniswapFeature|IUniswapV2Pair|IUniswapV3Feature|IUniswapV3Pool|IZeroEx|InitialMigration|LibBootstrap|LibCommonRichErrors|LibERC20Transformer|LibFeeCollector|LibLiquidityProviderRichErrors|LibMetaTransactionsRichErrors|LibMetaTransactionsStorage|LibMigrate|LibNativeOrder|LibNativeOrdersRichErrors|LibNativeOrdersStorage|LibOtcOrdersStorage|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibReentrancyGuardStorage|LibSignature|LibSignatureRichErrors|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|LibTransformERC20RichErrors|LibTransformERC20Storage|LibWalletRichErrors|LiquidityProviderFeature|LiquidityProviderSandbox|LogMetadataTransformer|MetaTransactionsFeature|MixinBalancer|MixinBalancerV2|MixinBancor|MixinClipper|MixinCoFiX|MixinCryptoCom|MixinCurve|MixinCurveV2|MixinDodo|MixinDodoV2|MixinKyber|MixinKyberDmm|MixinLido|MixinMStable|MixinMakerPSM|MixinMooniswap|MixinNerve|MixinOasis|MixinShell|MixinUniswap|MixinUniswapV2|MixinUniswapV3|MixinZeroExBridge|MooniswapLiquidityProvider|MultiplexFeature|NativeOrdersCancellation|NativeOrdersFeature|NativeOrdersInfo|NativeOrdersProtocolFees|NativeOrdersSettlement|OtcOrdersFeature|OwnableFeature|PancakeSwapFeature|PayTakerTransformer|PermissionlessTransformerDeployer|PositiveSlippageFeeTransformer|SimpleFunctionRegistryFeature|TestBridge|TestCallTarget|TestCurve|TestDelegateCaller|TestFeeCollectorController|TestFillQuoteTransformerBridge|TestFillQuoteTransformerExchange|TestFillQuoteTransformerHost|TestFixinProtocolFees|TestFixinTokenSpender|TestFullMigration|TestFundRecoveryFeature|TestInitialMigration|TestLibNativeOrder|TestLibSignature|TestLiquidityProvider|TestMetaTransactionsNativeOrdersFeature|TestMetaTransactionsTransformERC20Feature|TestMigrator|TestMintTokenERC20Transformer|TestMintableERC20Token|TestMooniswap|TestNativeOrdersFeature|TestNoEthRecipient|TestOrderSignerRegistryWithContractWallet|TestPermissionlessTransformerDeployerSuicidal|TestPermissionlessTransformerDeployerTransformer|TestRfqOriginRegistration|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestStaking|TestTokenSpenderERC20Token|TestTransformERC20|TestTransformerBase|TestTransformerDeployerTransformer|TestTransformerHost|TestUniswapV3Factory|TestUniswapV3Feature|TestUniswapV3Pool|TestWeth|TestWethTransformerHost|TestZeroExFeature|TransformERC20Feature|Transformer|TransformerDeployer|UniswapFeature|UniswapV3Feature|WethTransformer|ZeroEx|ZeroExOptimized).json" +>>>>>>> f299718f7 (added testing for amount -1 transfer and erc-20 token transfer) }, "repository": { "type": "git", diff --git a/contracts/zero-ex/test/artifacts.ts b/contracts/zero-ex/test/artifacts.ts index f74943a9a6..8f1f935716 100644 --- a/contracts/zero-ex/test/artifacts.ts +++ b/contracts/zero-ex/test/artifacts.ts @@ -11,7 +11,6 @@ import * as BootstrapFeature from '../test/generated-artifacts/BootstrapFeature. import * as BridgeAdapter from '../test/generated-artifacts/BridgeAdapter.json'; import * as BridgeProtocols from '../test/generated-artifacts/BridgeProtocols.json'; import * as CurveLiquidityProvider from '../test/generated-artifacts/CurveLiquidityProvider.json'; -import * as EpFundRecoveryFeature from '../test/generated-artifacts/EpFundRecoveryFeature.json'; import * as FeeCollector from '../test/generated-artifacts/FeeCollector.json'; import * as FeeCollectorController from '../test/generated-artifacts/FeeCollectorController.json'; import * as FillQuoteTransformer from '../test/generated-artifacts/FillQuoteTransformer.json'; @@ -22,14 +21,15 @@ import * as FixinReentrancyGuard from '../test/generated-artifacts/FixinReentran import * as FixinTokenSpender from '../test/generated-artifacts/FixinTokenSpender.json'; import * as FlashWallet from '../test/generated-artifacts/FlashWallet.json'; import * as FullMigration from '../test/generated-artifacts/FullMigration.json'; +import * as FundRecoveryFeature from '../test/generated-artifacts/FundRecoveryFeature.json'; import * as IBatchFillNativeOrdersFeature from '../test/generated-artifacts/IBatchFillNativeOrdersFeature.json'; import * as IBootstrapFeature from '../test/generated-artifacts/IBootstrapFeature.json'; import * as IBridgeAdapter from '../test/generated-artifacts/IBridgeAdapter.json'; -import * as IEpFundRecoveryFeature from '../test/generated-artifacts/IEpFundRecoveryFeature.json'; import * as IERC20Bridge from '../test/generated-artifacts/IERC20Bridge.json'; import * as IERC20Transformer from '../test/generated-artifacts/IERC20Transformer.json'; import * as IFeature from '../test/generated-artifacts/IFeature.json'; import * as IFlashWallet from '../test/generated-artifacts/IFlashWallet.json'; +import * as IFundRecoveryFeature from '../test/generated-artifacts/IFundRecoveryFeature.json'; import * as ILiquidityProvider from '../test/generated-artifacts/ILiquidityProvider.json'; import * as ILiquidityProviderFeature from '../test/generated-artifacts/ILiquidityProviderFeature.json'; import * as ILiquidityProviderSandbox from '../test/generated-artifacts/ILiquidityProviderSandbox.json'; @@ -135,6 +135,7 @@ import * as TestFillQuoteTransformerHost from '../test/generated-artifacts/TestF import * as TestFixinProtocolFees from '../test/generated-artifacts/TestFixinProtocolFees.json'; import * as TestFixinTokenSpender from '../test/generated-artifacts/TestFixinTokenSpender.json'; import * as TestFullMigration from '../test/generated-artifacts/TestFullMigration.json'; +import * as TestFundRecoveryFeature from '../test/generated-artifacts/TestFundRecoveryFeature.json'; import * as TestInitialMigration from '../test/generated-artifacts/TestInitialMigration.json'; import * as TestLibNativeOrder from '../test/generated-artifacts/TestLibNativeOrder.json'; import * as TestLibSignature from '../test/generated-artifacts/TestLibSignature.json'; @@ -200,7 +201,7 @@ export const artifacts = { TransformerDeployer: TransformerDeployer as ContractArtifact, BatchFillNativeOrdersFeature: BatchFillNativeOrdersFeature as ContractArtifact, BootstrapFeature: BootstrapFeature as ContractArtifact, - EpFundRecoveryFeature: EpFundRecoveryFeature as ContractArtifact, + FundRecoveryFeature: FundRecoveryFeature as ContractArtifact, LiquidityProviderFeature: LiquidityProviderFeature as ContractArtifact, MetaTransactionsFeature: MetaTransactionsFeature as ContractArtifact, NativeOrdersFeature: NativeOrdersFeature as ContractArtifact, @@ -213,8 +214,8 @@ export const artifacts = { UniswapV3Feature: UniswapV3Feature as ContractArtifact, IBatchFillNativeOrdersFeature: IBatchFillNativeOrdersFeature as ContractArtifact, IBootstrapFeature: IBootstrapFeature as ContractArtifact, - IEpFundRecoveryFeature: IEpFundRecoveryFeature as ContractArtifact, IFeature: IFeature as ContractArtifact, + IFundRecoveryFeature: IFundRecoveryFeature as ContractArtifact, ILiquidityProviderFeature: ILiquidityProviderFeature as ContractArtifact, IMetaTransactionsFeature: IMetaTransactionsFeature as ContractArtifact, IMultiplexFeature: IMultiplexFeature as ContractArtifact, @@ -314,6 +315,7 @@ export const artifacts = { TestFixinProtocolFees: TestFixinProtocolFees as ContractArtifact, TestFixinTokenSpender: TestFixinTokenSpender as ContractArtifact, TestFullMigration: TestFullMigration as ContractArtifact, + TestFundRecoveryFeature: TestFundRecoveryFeature as ContractArtifact, TestInitialMigration: TestInitialMigration as ContractArtifact, TestLibNativeOrder: TestLibNativeOrder as ContractArtifact, TestLibSignature: TestLibSignature as ContractArtifact, diff --git a/contracts/zero-ex/test/features/fund_recovery_tests.ts b/contracts/zero-ex/test/features/fund_recovery_tests.ts index e69de29bb2..bd5e1d6b87 100644 --- a/contracts/zero-ex/test/features/fund_recovery_tests.ts +++ b/contracts/zero-ex/test/features/fund_recovery_tests.ts @@ -0,0 +1,126 @@ +import { + blockchainTests, + constants, + describe, + expect, + getRandomPortion, + provider, + randomAddress, +} from '@0x/contracts-test-utils'; +import { BigNumber, hexUtils } from '@0x/utils'; +import { artifacts as erc20Artifacts, DummyERC20TokenContract } from '@0x/contracts-erc20'; +import { LogWithDecodedArgs } from 'ethereum-types'; +import { IOwnableFeatureContract, IZeroExContract, LiquidityProviderFeatureContract } from '../../src/wrappers'; +import {TestWethContract} from '../wrappers'; +import { artifacts } from '../artifacts'; +import { abis } from '../utils/abis'; +import { fullMigrateAsync } from '../utils/migration'; +import { TestInitialMigrationContract } from '../generated-wrappers/test_initial_migration'; +import { FundRecoveryFeatureContract } from '../generated-wrappers/fund_recovery_feature'; +import { Web3Wrapper } from '@0x/web3-wrapper'; +import { Address } from '@0x/utils/lib/src/abi_encoder'; + + blockchainTests('FundRecovery', async env => { + + let owner: string; + let designatedAddress: string; + let testAddress: string; + let zeroEx: IZeroExContract; + let token: DummyERC20TokenContract; + let weth: TestWethContract; + let feature: FundRecoveryFeatureContract; + + before(async () => { + env.blockchainLifecycle.startAsync(); + const ZERO_EX_EXCHANGE_PROXY = '0xdef1c0ded9bec7f1a1670819833240f027b25eff'; + [owner, designatedAddress, testAddress] = await env.getAccountAddressesAsync(); + + console.log(owner); + //EP Migration + zeroEx = await fullMigrateAsync(owner, env.provider, env.txDefaults, {}); + + //deploy dummy erc20 token + token = await DummyERC20TokenContract.deployFrom0xArtifactAsync( + erc20Artifacts.DummyERC20Token, + env.provider, + env.txDefaults, + erc20Artifacts, + constants.DUMMY_TOKEN_NAME, + constants.DUMMY_TOKEN_SYMBOL, + constants.DUMMY_TOKEN_DECIMALS, + constants.DUMMY_TOKEN_TOTAL_SUPPLY, + + ); + + await token.setBalance(zeroEx.address, constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync(); + const bal = await token.balanceOf(ZERO_EX_EXCHANGE_PROXY).callAsync(); + + weth = await TestWethContract.deployFrom0xArtifactAsync( + artifacts.TestWeth, + env.provider, + env.txDefaults, + artifacts, + ); + await weth.mint(zeroEx.address, constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync(); + await weth.mint(ZERO_EX_EXCHANGE_PROXY, constants.INITIAL_ERC20_BALANCE).awaitTransactionSuccessAsync(); + const balweth = await weth.balanceOf(zeroEx.address).callAsync(); + + //CREATE CONTRACT AND DEPLOY FEATURE + feature = new FundRecoveryFeatureContract(zeroEx.address, env.provider, env.txDefaults, abis); + const featureImpl = await FundRecoveryFeatureContract.deployFrom0xArtifactAsync( + artifacts.FundRecoveryFeature, + env.provider, + env.txDefaults, + artifacts + ); + + await new IOwnableFeatureContract(zeroEx.address, env.provider, env.txDefaults, abis) + .migrate(featureImpl.address, featureImpl.migrate().getABIEncodedTransactionData(), owner) + .awaitTransactionSuccessAsync(); + + }); + blockchainTests.resets('Should delegatecall `transferTrappedTokensTo` from the exchange proxy', () => { + const ETH_TOKEN_ADDRESS = '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE'; + const ZERO_EX_EXCHANGE_PROXY = '0xdef1c0ded9bec7f1a1670819833240f027b25eff'; + it('Tranfers an arbitrary ERC-20 Token', async () => { + const amountOut = Web3Wrapper.toBaseUnitAmount(new BigNumber(100), 18); + const designatedAddressBalance = await token.balanceOf(designatedAddress).callAsync(); + const epBalance = await token.balanceOf(zeroEx.address).callAsync(); + await zeroEx.transferTrappedTokensTo(token.address, amountOut, designatedAddress).awaitTransactionSuccessAsync({ from: owner }); + const epBalanceNew = await token.balanceOf(zeroEx.address).callAsync(); + const designatedAddressBalanceAferTransfer = await token.balanceOf(designatedAddress).callAsync(); + expect(designatedAddressBalanceAferTransfer.c![0]).to.equal(amountOut.c![0]); + }); + it('Amount -1 transfers entire balance', async () => { + const designatedAddressBalance = await token.balanceOf(designatedAddress).callAsync(); + const balanceOwner = await token.balanceOf(zeroEx.address).callAsync(); + const tx = await zeroEx.transferTrappedTokensTo(token.address, constants.MAX_UINT256 , designatedAddress).awaitTransactionSuccessAsync({ from: owner }); + const balanceNew = await token.balanceOf(zeroEx.address).callAsync(); + const designatedAddressBalanceAferTransfer = await token.balanceOf(designatedAddress).callAsync(); + expect(balanceNew.c![0]).to.equal(0); + expect(designatedAddressBalanceAferTransfer.c![0]).to.equal(balanceOwner.c![0]); + }); + it('Transfers ETH ', async () => { + //connect to mainnet contract address + const zrxContractMainnet = new IZeroExContract(ZERO_EX_EXCHANGE_PROXY, env.provider, env.txDefaults); + //await weth.withdraw(wethBal); + const bal = await env.web3Wrapper.getBalanceInWeiAsync(zrxContractMainnet.address); + //const designatedAddressBalance = await token.balanceOf(designatedAddress).callAsync(); + const tx = await zrxContractMainnet.transferTrappedTokensTo(ETH_TOKEN_ADDRESS, constants.MAX_UINT256 , designatedAddress).awaitTransactionSuccessAsync({ from: owner }); + //const bal2 = await env.web3Wrapper.getBalanceInWeiAsync(zrxContractMainnet.address); + const designatedAddressBalance = await env.web3Wrapper.getBalanceInWeiAsync(zrxContractMainnet.address); + + + }); + it('Feature `transferTrappedTokensTo` can only be called by owner', async () => { + //need to be able to change caller context. + const zrxContractMainnet = new IZeroExContract(ZERO_EX_EXCHANGE_PROXY, env.provider, env.txDefaults); + const tx = await zrxContractMainnet.transferTrappedTokensTo(ETH_TOKEN_ADDRESS, constants.MAX_UINT256 , designatedAddress).awaitTransactionSuccessAsync({ from: owner }); + + }); + + }); + + + + }); diff --git a/contracts/zero-ex/test/wrappers.ts b/contracts/zero-ex/test/wrappers.ts index da1a3fe44e..865b38971b 100644 --- a/contracts/zero-ex/test/wrappers.ts +++ b/contracts/zero-ex/test/wrappers.ts @@ -9,7 +9,6 @@ export * from '../test/generated-wrappers/bootstrap_feature'; export * from '../test/generated-wrappers/bridge_adapter'; export * from '../test/generated-wrappers/bridge_protocols'; export * from '../test/generated-wrappers/curve_liquidity_provider'; -export * from '../test/generated-wrappers/ep_fund_recovery_feature'; export * from '../test/generated-wrappers/fee_collector'; export * from '../test/generated-wrappers/fee_collector_controller'; export * from '../test/generated-wrappers/fill_quote_transformer'; @@ -20,14 +19,15 @@ export * from '../test/generated-wrappers/fixin_reentrancy_guard'; export * from '../test/generated-wrappers/fixin_token_spender'; export * from '../test/generated-wrappers/flash_wallet'; export * from '../test/generated-wrappers/full_migration'; +export * from '../test/generated-wrappers/fund_recovery_feature'; export * from '../test/generated-wrappers/i_batch_fill_native_orders_feature'; export * from '../test/generated-wrappers/i_bootstrap_feature'; export * from '../test/generated-wrappers/i_bridge_adapter'; -export * from '../test/generated-wrappers/i_ep_fund_recovery_feature'; export * from '../test/generated-wrappers/i_erc20_bridge'; export * from '../test/generated-wrappers/i_erc20_transformer'; export * from '../test/generated-wrappers/i_feature'; export * from '../test/generated-wrappers/i_flash_wallet'; +export * from '../test/generated-wrappers/i_fund_recovery_feature'; export * from '../test/generated-wrappers/i_liquidity_provider'; export * from '../test/generated-wrappers/i_liquidity_provider_feature'; export * from '../test/generated-wrappers/i_liquidity_provider_sandbox'; @@ -133,6 +133,7 @@ export * from '../test/generated-wrappers/test_fill_quote_transformer_host'; export * from '../test/generated-wrappers/test_fixin_protocol_fees'; export * from '../test/generated-wrappers/test_fixin_token_spender'; export * from '../test/generated-wrappers/test_full_migration'; +export * from '../test/generated-wrappers/test_fund_recovery_feature'; export * from '../test/generated-wrappers/test_initial_migration'; export * from '../test/generated-wrappers/test_lib_native_order'; export * from '../test/generated-wrappers/test_lib_signature'; diff --git a/contracts/zero-ex/tsconfig.json b/contracts/zero-ex/tsconfig.json index 8227507aae..299010124f 100644 --- a/contracts/zero-ex/tsconfig.json +++ b/contracts/zero-ex/tsconfig.json @@ -42,7 +42,6 @@ "test/generated-artifacts/BridgeAdapter.json", "test/generated-artifacts/BridgeProtocols.json", "test/generated-artifacts/CurveLiquidityProvider.json", - "test/generated-artifacts/EpFundRecoveryFeature.json", "test/generated-artifacts/FeeCollector.json", "test/generated-artifacts/FeeCollectorController.json", "test/generated-artifacts/FillQuoteTransformer.json", @@ -53,14 +52,15 @@ "test/generated-artifacts/FixinTokenSpender.json", "test/generated-artifacts/FlashWallet.json", "test/generated-artifacts/FullMigration.json", + "test/generated-artifacts/FundRecoveryFeature.json", "test/generated-artifacts/IBatchFillNativeOrdersFeature.json", "test/generated-artifacts/IBootstrapFeature.json", "test/generated-artifacts/IBridgeAdapter.json", "test/generated-artifacts/IERC20Bridge.json", "test/generated-artifacts/IERC20Transformer.json", - "test/generated-artifacts/IEpFundRecoveryFeature.json", "test/generated-artifacts/IFeature.json", "test/generated-artifacts/IFlashWallet.json", + "test/generated-artifacts/IFundRecoveryFeature.json", "test/generated-artifacts/ILiquidityProvider.json", "test/generated-artifacts/ILiquidityProviderFeature.json", "test/generated-artifacts/ILiquidityProviderSandbox.json", @@ -166,6 +166,7 @@ "test/generated-artifacts/TestFixinProtocolFees.json", "test/generated-artifacts/TestFixinTokenSpender.json", "test/generated-artifacts/TestFullMigration.json", + "test/generated-artifacts/TestFundRecoveryFeature.json", "test/generated-artifacts/TestInitialMigration.json", "test/generated-artifacts/TestLibNativeOrder.json", "test/generated-artifacts/TestLibSignature.json",