Move isFunctionRemoveAuthorizedAddress to test

This commit is contained in:
Remco Bloemen
2018-06-13 20:21:01 +02:00
parent 19ba272d62
commit 6a6f98299d
6 changed files with 70 additions and 22 deletions

View File

@@ -30,6 +30,7 @@
"MixinAuthorizable", "MixinAuthorizable",
"MultiSigWallet", "MultiSigWallet",
"MultiSigWalletWithTimeLock", "MultiSigWalletWithTimeLock",
"TestAssetProxyOwner",
"TestAssetDataDecoders", "TestAssetDataDecoders",
"TestAssetProxyDispatcher", "TestAssetProxyDispatcher",
"TestLibBytes", "TestLibBytes",

View File

@@ -34,7 +34,7 @@
}, },
"config": { "config": {
"abis": "abis":
"../migrations/artifacts/2.0.0/@(AssetProxyOwner|DummyERC20Token|DummyERC721Receiver|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|ExchangeWrapper|MixinAuthorizable|MultiSigWallet|MultiSigWalletWithTimeLock|TestAssetDataDecoders|TestAssetProxyDispatcher|TestLibBytes|TestLibs|TestSignatureValidator|TestValidator|TestWallet|TokenRegistry|Whitelist|WETH9|ZRXToken).json" "../migrations/artifacts/2.0.0/@(AssetProxyOwner|DummyERC20Token|DummyERC721Receiver|DummyERC721Token|ERC20Proxy|ERC721Proxy|Exchange|ExchangeWrapper|MixinAuthorizable|MultiSigWallet|MultiSigWalletWithTimeLock|TestAssetProxyOwner|TestAssetDataDecoders|TestAssetProxyDispatcher|TestLibBytes|TestLibs|TestSignatureValidator|TestValidator|TestWallet|TokenRegistry|Whitelist|WETH9|ZRXToken).json"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@@ -39,7 +39,7 @@ contract AssetProxyOwner is
modifier validRemoveAuthorizedAddressTx(uint256 transactionId) { modifier validRemoveAuthorizedAddressTx(uint256 transactionId) {
Transaction storage tx = transactions[transactionId]; Transaction storage tx = transactions[transactionId];
require(isAssetProxyRegistered[tx.destination]); require(isAssetProxyRegistered[tx.destination]);
require(isFunctionRemoveAuthorizedAddress(tx.data)); require(tx.data.readBytes4(0) == REMOVE_AUTHORIZED_ADDRESS_SELECTOR);
_; _;
} }
@@ -95,17 +95,4 @@ contract AssetProxyOwner is
tx.executed = false; tx.executed = false;
} }
} }
/// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function selector.
/// @param data Transaction data.
/// @return Successful if data is a call to removeAuthorizedAddress.
function isFunctionRemoveAuthorizedAddress(bytes memory data)
public
pure
returns (bool)
{
bytes4 first4Bytes = data.readBytes4(0);
require(REMOVE_AUTHORIZED_ADDRESS_SELECTOR == first4Bytes);
return true;
}
} }

View File

@@ -0,0 +1,47 @@
/*
Copyright 2018 ZeroEx Intl.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
pragma solidity ^0.4.24;
import "../../protocol/AssetProxyOwner/AssetProxyOwner.sol";
contract TestAssetProxyOwner is
AssetProxyOwner
{
constructor(
address[] memory _owners,
address[] memory _assetProxyContracts,
uint256 _required,
uint256 _secondsTimeLocked
)
public
AssetProxyOwner(_owners, _assetProxyContracts, _required, _secondsTimeLocked)
{
}
/// @dev Compares first 4 bytes of byte array to removeAuthorizedAddress function selector.
/// @param data Transaction data.
/// @return Successful if data is a call to removeAuthorizedAddress.
function isFunctionRemoveAuthorizedAddress(bytes memory data)
public
pure
returns (bool)
{
return data.readBytes4(0) == REMOVE_AUTHORIZED_ADDRESS_SELECTOR;
}
}

View File

@@ -13,6 +13,7 @@ import * as MultiSigWallet from '../artifacts/MultiSigWallet.json';
import * as MultiSigWalletWithTimeLock from '../artifacts/MultiSigWalletWithTimeLock.json'; import * as MultiSigWalletWithTimeLock from '../artifacts/MultiSigWalletWithTimeLock.json';
import * as TestAssetDataDecoders from '../artifacts/TestAssetDataDecoders.json'; import * as TestAssetDataDecoders from '../artifacts/TestAssetDataDecoders.json';
import * as TestAssetProxyDispatcher from '../artifacts/TestAssetProxyDispatcher.json'; import * as TestAssetProxyDispatcher from '../artifacts/TestAssetProxyDispatcher.json';
import * as TestAssetProxyOwner from '../artifacts/TestAssetProxyOwner.json';
import * as TestLibBytes from '../artifacts/TestLibBytes.json'; import * as TestLibBytes from '../artifacts/TestLibBytes.json';
import * as TestLibs from '../artifacts/TestLibs.json'; import * as TestLibs from '../artifacts/TestLibs.json';
import * as TestSignatureValidator from '../artifacts/TestSignatureValidator.json'; import * as TestSignatureValidator from '../artifacts/TestSignatureValidator.json';
@@ -36,6 +37,7 @@ export const artifacts = {
MixinAuthorizable: (MixinAuthorizable as any) as ContractArtifact, MixinAuthorizable: (MixinAuthorizable as any) as ContractArtifact,
MultiSigWallet: (MultiSigWallet as any) as ContractArtifact, MultiSigWallet: (MultiSigWallet as any) as ContractArtifact,
MultiSigWalletWithTimeLock: (MultiSigWalletWithTimeLock as any) as ContractArtifact, MultiSigWalletWithTimeLock: (MultiSigWalletWithTimeLock as any) as ContractArtifact,
TestAssetProxyOwner: (TestAssetProxyOwner as any) as ContractArtifact,
TestAssetProxyDispatcher: (TestAssetProxyDispatcher as any) as ContractArtifact, TestAssetProxyDispatcher: (TestAssetProxyDispatcher as any) as ContractArtifact,
TestAssetDataDecoders: (TestAssetDataDecoders as any) as ContractArtifact, TestAssetDataDecoders: (TestAssetDataDecoders as any) as ContractArtifact,
TestLibBytes: (TestLibBytes as any) as ContractArtifact, TestLibBytes: (TestLibBytes as any) as ContractArtifact,

View File

@@ -10,11 +10,11 @@ import {
ExecutionFailureContractEventArgs, ExecutionFailureContractEventArgs,
SubmissionContractEventArgs, SubmissionContractEventArgs,
} from '../src/generated_contract_wrappers/asset_proxy_owner'; } from '../src/generated_contract_wrappers/asset_proxy_owner';
import { MixinAuthorizableContract } from '../src/generated_contract_wrappers/mixin_authorizable'; import { MixinAuthorizableContract } from '../src/generated_contract_wrappers/mixin_authorizable';
import { TestAssetProxyOwnerContract} from '../src/generated_contract_wrappers/test_asset_proxy_owner';
import { artifacts } from '../src/utils/artifacts'; import { artifacts } from '../src/utils/artifacts';
import { import {
expectRevertOrAlwaysFailingTransactionAsync, expectRevertOrAlwaysFailingTransactionAsync,
expectRevertOrContractCallFailedAsync,
} from '../src/utils/assertions'; } from '../src/utils/assertions';
import { chaiSetup } from '../src/utils/chai_setup'; import { chaiSetup } from '../src/utils/chai_setup';
import { constants } from '../src/utils/constants'; import { constants } from '../src/utils/constants';
@@ -35,6 +35,7 @@ describe('AssetProxyOwner', () => {
let erc20Proxy: MixinAuthorizableContract; let erc20Proxy: MixinAuthorizableContract;
let erc721Proxy: MixinAuthorizableContract; let erc721Proxy: MixinAuthorizableContract;
let multiSig: AssetProxyOwnerContract; let multiSig: AssetProxyOwnerContract;
let testAssetProxyOwner: TestAssetProxyOwnerContract;
let multiSigWrapper: MultiSigWrapper; let multiSigWrapper: MultiSigWrapper;
before(async () => { before(async () => {
@@ -68,6 +69,15 @@ describe('AssetProxyOwner', () => {
SECONDS_TIME_LOCKED, SECONDS_TIME_LOCKED,
); );
multiSigWrapper = new MultiSigWrapper(multiSig, provider); multiSigWrapper = new MultiSigWrapper(multiSig, provider);
testAssetProxyOwner = await TestAssetProxyOwnerContract.deployFrom0xArtifactAsync(
artifacts.TestAssetProxyOwner,
provider,
txDefaults,
owners,
defaultAssetProxyContractAddresses,
REQUIRED_APPROVALS,
SECONDS_TIME_LOCKED,
);
await web3Wrapper.awaitTransactionSuccessAsync( await web3Wrapper.awaitTransactionSuccessAsync(
await erc20Proxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: initialOwner }), await erc20Proxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: initialOwner }),
constants.AWAIT_TRANSACTION_MINED_MS, constants.AWAIT_TRANSACTION_MINED_MS,
@@ -118,23 +128,24 @@ describe('AssetProxyOwner', () => {
}); });
describe('isFunctionRemoveAuthorizedAddress', () => { describe('isFunctionRemoveAuthorizedAddress', () => {
it('should throw if data is not for removeAuthorizedAddress', async () => { it('should return false if data is not for removeAuthorizedAddress', async () => {
const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData( const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
owners[0], owners[0],
); );
return expectRevertOrContractCallFailedAsync( const result = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddress.callAsync(
multiSig.isFunctionRemoveAuthorizedAddress.callAsync(notRemoveAuthorizedAddressData), notRemoveAuthorizedAddressData,
); );
expect(result).to.be.false();
}); });
it('should return true if data is for removeAuthorizedAddress', async () => { it('should return true if data is for removeAuthorizedAddress', async () => {
const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData( const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
owners[0], owners[0],
); );
const isFunctionRemoveAuthorizedAddress = await multiSig.isFunctionRemoveAuthorizedAddress.callAsync( const result = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddress.callAsync(
removeAuthorizedAddressData, removeAuthorizedAddressData,
); );
expect(isFunctionRemoveAuthorizedAddress).to.be.true(); expect(result).to.be.true();
}); });
}); });