Update and add tests
This commit is contained in:
committed by
Remco Bloemen
parent
1681361aed
commit
8ddcb6c841
@@ -10,11 +10,12 @@ import {
|
||||
ExecutionFailureContractEventArgs,
|
||||
SubmissionContractEventArgs,
|
||||
} from '../src/generated_contract_wrappers/asset_proxy_owner';
|
||||
import { MixinAuthorizableContract } from '../src/generated_contract_wrappers/mixin_authorizable';
|
||||
import { TestAssetProxyOwnerContract} from '../src/generated_contract_wrappers/test_asset_proxy_owner';
|
||||
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 {
|
||||
expectRevertOrAlwaysFailingTransactionAsync,
|
||||
expectRevertOrContractCallFailedAsync,
|
||||
} from '../src/utils/assertions';
|
||||
import { chaiSetup } from '../src/utils/chai_setup';
|
||||
import { constants } from '../src/utils/constants';
|
||||
@@ -34,7 +35,6 @@ describe('AssetProxyOwner', () => {
|
||||
|
||||
let erc20Proxy: MixinAuthorizableContract;
|
||||
let erc721Proxy: MixinAuthorizableContract;
|
||||
let multiSig: AssetProxyOwnerContract;
|
||||
let testAssetProxyOwner: TestAssetProxyOwnerContract;
|
||||
let multiSigWrapper: MultiSigWrapper;
|
||||
|
||||
@@ -59,16 +59,6 @@ describe('AssetProxyOwner', () => {
|
||||
txDefaults,
|
||||
);
|
||||
const defaultAssetProxyContractAddresses: string[] = [];
|
||||
multiSig = await AssetProxyOwnerContract.deployFrom0xArtifactAsync(
|
||||
artifacts.AssetProxyOwner,
|
||||
provider,
|
||||
txDefaults,
|
||||
owners,
|
||||
defaultAssetProxyContractAddresses,
|
||||
REQUIRED_APPROVALS,
|
||||
SECONDS_TIME_LOCKED,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(multiSig, provider);
|
||||
testAssetProxyOwner = await TestAssetProxyOwnerContract.deployFrom0xArtifactAsync(
|
||||
artifacts.TestAssetProxyOwner,
|
||||
provider,
|
||||
@@ -78,12 +68,17 @@ describe('AssetProxyOwner', () => {
|
||||
REQUIRED_APPROVALS,
|
||||
SECONDS_TIME_LOCKED,
|
||||
);
|
||||
multiSigWrapper = new MultiSigWrapper(testAssetProxyOwner, provider);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await erc20Proxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: initialOwner }),
|
||||
await erc20Proxy.transferOwnership.sendTransactionAsync(testAssetProxyOwner.address, {
|
||||
from: initialOwner,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
await web3Wrapper.awaitTransactionSuccessAsync(
|
||||
await erc721Proxy.transferOwnership.sendTransactionAsync(multiSig.address, { from: initialOwner }),
|
||||
await erc721Proxy.transferOwnership.sendTransactionAsync(testAssetProxyOwner.address, {
|
||||
from: initialOwner,
|
||||
}),
|
||||
constants.AWAIT_TRANSACTION_MINED_MS,
|
||||
);
|
||||
});
|
||||
@@ -127,25 +122,28 @@ describe('AssetProxyOwner', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('isFunctionRemoveAuthorizedAddress', () => {
|
||||
it('should return false if data is not for removeAuthorizedAddress', async () => {
|
||||
describe('isFunctionRemoveAuthorizedAddressAtIndex', () => {
|
||||
it('should return false if data is not for removeAuthorizedAddressAtIndex', async () => {
|
||||
const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
|
||||
owners[0],
|
||||
);
|
||||
const result = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddress.callAsync(
|
||||
|
||||
const isFunctionRemoveAuthorizedAddressAtIndex = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddressAtIndex.callAsync(
|
||||
notRemoveAuthorizedAddressData,
|
||||
);
|
||||
expect(result).to.be.false();
|
||||
expect(isFunctionRemoveAuthorizedAddressAtIndex).to.be.false();
|
||||
});
|
||||
|
||||
it('should return true if data is for removeAuthorizedAddress', async () => {
|
||||
const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
|
||||
it('should return true if data is for removeAuthorizedAddressAtIndex', async () => {
|
||||
const index = new BigNumber(0);
|
||||
const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
owners[0],
|
||||
index,
|
||||
);
|
||||
const result = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddress.callAsync(
|
||||
removeAuthorizedAddressData,
|
||||
const isFunctionRemoveAuthorizedAddressAtIndex = await testAssetProxyOwner.isFunctionRemoveAuthorizedAddressAtIndex.callAsync(
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
);
|
||||
expect(result).to.be.true();
|
||||
expect(isFunctionRemoveAuthorizedAddressAtIndex).to.be.true();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -153,19 +151,21 @@ describe('AssetProxyOwner', () => {
|
||||
it('should throw if not called by multisig', async () => {
|
||||
const isRegistered = true;
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
multiSig.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, isRegistered, { from: owners[0] }),
|
||||
testAssetProxyOwner.registerAssetProxy.sendTransactionAsync(erc20Proxy.address, isRegistered, {
|
||||
from: owners[0],
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
it('should register an address if called by multisig after timelock', async () => {
|
||||
const addressToRegister = erc20Proxy.address;
|
||||
const isRegistered = true;
|
||||
const registerAssetProxyData = multiSig.registerAssetProxy.getABIEncodedTransactionData(
|
||||
const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
|
||||
addressToRegister,
|
||||
isRegistered,
|
||||
);
|
||||
const submitTxRes = await multiSigWrapper.submitTransactionAsync(
|
||||
multiSig.address,
|
||||
testAssetProxyOwner.address,
|
||||
registerAssetProxyData,
|
||||
owners[0],
|
||||
);
|
||||
@@ -181,19 +181,21 @@ describe('AssetProxyOwner', () => {
|
||||
expect(registerLog.args.assetProxyContract).to.equal(addressToRegister);
|
||||
expect(registerLog.args.isRegistered).to.equal(isRegistered);
|
||||
|
||||
const isAssetProxyRegistered = await multiSig.isAssetProxyRegistered.callAsync(addressToRegister);
|
||||
const isAssetProxyRegistered = await testAssetProxyOwner.isAssetProxyRegistered.callAsync(
|
||||
addressToRegister,
|
||||
);
|
||||
expect(isAssetProxyRegistered).to.equal(isRegistered);
|
||||
});
|
||||
|
||||
it('should fail if registering a null address', async () => {
|
||||
const addressToRegister = constants.NULL_ADDRESS;
|
||||
const isRegistered = true;
|
||||
const registerAssetProxyData = multiSig.registerAssetProxy.getABIEncodedTransactionData(
|
||||
const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
|
||||
addressToRegister,
|
||||
isRegistered,
|
||||
);
|
||||
const submitTxRes = await multiSigWrapper.submitTransactionAsync(
|
||||
multiSig.address,
|
||||
testAssetProxyOwner.address,
|
||||
registerAssetProxyData,
|
||||
owners[0],
|
||||
);
|
||||
@@ -207,22 +209,26 @@ describe('AssetProxyOwner', () => {
|
||||
const failureLog = executeTxRes.logs[0] as LogWithDecodedArgs<ExecutionFailureContractEventArgs>;
|
||||
expect(failureLog.args.transactionId).to.be.bignumber.equal(txId);
|
||||
|
||||
const isAssetProxyRegistered = await multiSig.isAssetProxyRegistered.callAsync(addressToRegister);
|
||||
const isAssetProxyRegistered = await testAssetProxyOwner.isAssetProxyRegistered.callAsync(
|
||||
addressToRegister,
|
||||
);
|
||||
expect(isAssetProxyRegistered).to.equal(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe('executeRemoveAuthorizedAddress', () => {
|
||||
describe('Calling removeAuthorizedAddressAtIndex', () => {
|
||||
const erc20Index = new BigNumber(0);
|
||||
const erc721Index = new BigNumber(1);
|
||||
before('authorize both proxies and register erc20 proxy', async () => {
|
||||
// Only register ERC20 proxy
|
||||
const addressToRegister = erc20Proxy.address;
|
||||
const isRegistered = true;
|
||||
const registerAssetProxyData = multiSig.registerAssetProxy.getABIEncodedTransactionData(
|
||||
const registerAssetProxyData = testAssetProxyOwner.registerAssetProxy.getABIEncodedTransactionData(
|
||||
addressToRegister,
|
||||
isRegistered,
|
||||
);
|
||||
const registerAssetProxySubmitRes = await multiSigWrapper.submitTransactionAsync(
|
||||
multiSig.address,
|
||||
testAssetProxyOwner.address,
|
||||
registerAssetProxyData,
|
||||
owners[0],
|
||||
);
|
||||
@@ -259,113 +265,180 @@ describe('AssetProxyOwner', () => {
|
||||
await multiSigWrapper.executeTransactionAsync(erc721AddAuthorizedAddressTxId, owners[0]);
|
||||
});
|
||||
|
||||
it('should throw without the required confirmations', async () => {
|
||||
const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
describe('validRemoveAuthorizedAddressAtIndexTx', () => {
|
||||
it('should revert if data is not for removeAuthorizedAddressAtIndex and proxy is registered', async () => {
|
||||
const notRemoveAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
);
|
||||
const submitTxRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
notRemoveAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const log = submitTxRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
return expectRevertOrContractCallFailedAsync(
|
||||
testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
|
||||
);
|
||||
});
|
||||
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
|
||||
);
|
||||
it('should return true if data is for removeAuthorizedAddressAtIndex and proxy is registered', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc20Index,
|
||||
);
|
||||
const submitTxRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const log = submitTxRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
const isValidRemoveAuthorizedAddressAtIndexTx = await testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(
|
||||
txId,
|
||||
);
|
||||
expect(isValidRemoveAuthorizedAddressAtIndexTx).to.be.true();
|
||||
});
|
||||
|
||||
it('should revert if data is for removeAuthorizedAddressAtIndex and proxy is not registered', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc721Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc721Index,
|
||||
);
|
||||
const submitTxRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc721Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const log = submitTxRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
return expectRevertOrContractCallFailedAsync(
|
||||
testAssetProxyOwner.testValidRemoveAuthorizedAddressAtIndexTx.callAsync(txId),
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('should throw if tx destination is not registered', async () => {
|
||||
const removeAuthorizedAddressData = erc721Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc721Proxy.address,
|
||||
removeAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
describe('executeRemoveAuthorizedAddressAtIndex', () => {
|
||||
it('should throw without the required confirmations', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc20Index,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
|
||||
from: owners[1],
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
|
||||
);
|
||||
});
|
||||
it('should throw if tx destination is not registered', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc721Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc721Index,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc721Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
|
||||
it('should throw if tx data is not for removeAuthorizedAddress', async () => {
|
||||
const newAuthorized = owners[1];
|
||||
const addAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
|
||||
newAuthorized,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
addAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
|
||||
from: owners[1],
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
|
||||
);
|
||||
});
|
||||
it('should throw if tx data is not for removeAuthorizedAddressAtIndex', async () => {
|
||||
const newAuthorized = owners[1];
|
||||
const addAuthorizedAddressData = erc20Proxy.addAuthorizedAddress.getABIEncodedTransactionData(
|
||||
newAuthorized,
|
||||
);
|
||||
const res = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
addAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const log = res.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = log.args.transactionId;
|
||||
|
||||
it('should execute removeAuthorizedAddress for registered address if fully confirmed', async () => {
|
||||
const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
);
|
||||
const submitRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const submitLog = submitRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = submitLog.args.transactionId;
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
|
||||
from: owners[1],
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAsync(txId, owners[0]);
|
||||
const execLog = execRes.logs[0] as LogWithDecodedArgs<ExecutionContractEventArgs>;
|
||||
expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
|
||||
it('should execute removeAuthorizedAddressAtIndex for registered address if fully confirmed', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc20Index,
|
||||
);
|
||||
const submitRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const submitLog = submitRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = submitLog.args.transactionId;
|
||||
|
||||
const tx = await multiSig.transactions.callAsync(txId);
|
||||
const isExecuted = tx[3];
|
||||
expect(isExecuted).to.equal(true);
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
|
||||
const isAuthorized = await erc20Proxy.authorized.callAsync(authorized);
|
||||
expect(isAuthorized).to.equal(false);
|
||||
});
|
||||
const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAtIndexAsync(txId, owners[0]);
|
||||
const execLog = execRes.logs[0] as LogWithDecodedArgs<ExecutionContractEventArgs>;
|
||||
expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
|
||||
|
||||
it('should throw if already executed', async () => {
|
||||
const removeAuthorizedAddressData = erc20Proxy.removeAuthorizedAddress.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
);
|
||||
const submitRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressData,
|
||||
owners[0],
|
||||
);
|
||||
const submitLog = submitRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = submitLog.args.transactionId;
|
||||
const tx = await testAssetProxyOwner.transactions.callAsync(txId);
|
||||
const isExecuted = tx[3];
|
||||
expect(isExecuted).to.equal(true);
|
||||
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
const isAuthorized = await erc20Proxy.authorized.callAsync(authorized);
|
||||
expect(isAuthorized).to.equal(false);
|
||||
});
|
||||
|
||||
const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAsync(txId, owners[0]);
|
||||
const execLog = execRes.logs[0] as LogWithDecodedArgs<ExecutionContractEventArgs>;
|
||||
expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
|
||||
it('should throw if already executed', async () => {
|
||||
const removeAuthorizedAddressAtIndexData = erc20Proxy.removeAuthorizedAddressAtIndex.getABIEncodedTransactionData(
|
||||
authorized,
|
||||
erc20Index,
|
||||
);
|
||||
const submitRes = await multiSigWrapper.submitTransactionAsync(
|
||||
erc20Proxy.address,
|
||||
removeAuthorizedAddressAtIndexData,
|
||||
owners[0],
|
||||
);
|
||||
const submitLog = submitRes.logs[0] as LogWithDecodedArgs<SubmissionContractEventArgs>;
|
||||
const txId = submitLog.args.transactionId;
|
||||
|
||||
const tx = await multiSig.transactions.callAsync(txId);
|
||||
const isExecuted = tx[3];
|
||||
expect(isExecuted).to.equal(true);
|
||||
await multiSigWrapper.confirmTransactionAsync(txId, owners[1]);
|
||||
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
multiSig.executeRemoveAuthorizedAddress.sendTransactionAsync(txId, { from: owners[1] }),
|
||||
);
|
||||
const execRes = await multiSigWrapper.executeRemoveAuthorizedAddressAtIndexAsync(txId, owners[0]);
|
||||
const execLog = execRes.logs[0] as LogWithDecodedArgs<ExecutionContractEventArgs>;
|
||||
expect(execLog.args.transactionId).to.be.bignumber.equal(txId);
|
||||
|
||||
const tx = await testAssetProxyOwner.transactions.callAsync(txId);
|
||||
const isExecuted = tx[3];
|
||||
expect(isExecuted).to.equal(true);
|
||||
|
||||
return expectRevertOrAlwaysFailingTransactionAsync(
|
||||
testAssetProxyOwner.executeRemoveAuthorizedAddressAtIndex.sendTransactionAsync(txId, {
|
||||
from: owners[1],
|
||||
}),
|
||||
);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@@ -131,55 +131,52 @@ describe('LibBytes', () => {
|
||||
|
||||
describe('equals', () => {
|
||||
it('should return true if byte arrays are equal (both arrays < 32 bytes)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayShorterThan32Bytes,
|
||||
byteArrayShorterThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.true();
|
||||
return expect(isEqual).to.be.true();
|
||||
});
|
||||
it('should return true if byte arrays are equal (both arrays > 32 bytes)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayLongerThan32Bytes,
|
||||
byteArrayLongerThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.true();
|
||||
return expect(isEqual).to.be.true();
|
||||
});
|
||||
it('should return false if byte arrays are not equal (first array < 32 bytes, second array > 32 bytes)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayShorterThan32Bytes,
|
||||
byteArrayLongerThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.false();
|
||||
return expect(isEqual).to.be.false();
|
||||
});
|
||||
it('should return false if byte arrays are not equal (first array > 32 bytes, second array < 32 bytes)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayLongerThan32Bytes,
|
||||
byteArrayShorterThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.false();
|
||||
return expect(isEqual).to.be.false();
|
||||
});
|
||||
it('should return false if byte arrays are not equal (same length, but a byte in first word differs)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayLongerThan32BytesFirstBytesSwapped,
|
||||
byteArrayLongerThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.false();
|
||||
return expect(isEqual).to.be.false();
|
||||
});
|
||||
it('should return false if byte arrays are not equal (same length, but a byte in last word differs)', async () => {
|
||||
const equals = await libBytes.publicEquals.callAsync(
|
||||
const isEqual = await libBytes.publicEquals.callAsync(
|
||||
byteArrayLongerThan32BytesLastBytesSwapped,
|
||||
byteArrayLongerThan32Bytes,
|
||||
);
|
||||
return expect(equals).to.be.false();
|
||||
return expect(isEqual).to.be.false();
|
||||
});
|
||||
|
||||
describe('should ignore trailing data', () => {
|
||||
it('should return true when both < 32 bytes', async () => {
|
||||
const equals = await libBytes.publicEqualsPop1.callAsync(
|
||||
'0x0102',
|
||||
'0x0103',
|
||||
);
|
||||
return expect(equals).to.be.true();
|
||||
const isEqual = await libBytes.publicEqualsPop1.callAsync('0x0102', '0x0103');
|
||||
return expect(isEqual).to.be.true();
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -464,16 +461,12 @@ describe('LibBytes', () => {
|
||||
it('should revert if byte array has a length < 4', async () => {
|
||||
const byteArrayLessThan4Bytes = '0x010101';
|
||||
return expectRevertOrOtherErrorAsync(
|
||||
libBytes.publicReadBytes4.callAsync(
|
||||
byteArrayLessThan4Bytes,
|
||||
new BigNumber(0)),
|
||||
libBytes.publicReadBytes4.callAsync(byteArrayLessThan4Bytes, new BigNumber(0)),
|
||||
constants.LIB_BYTES_GREATER_OR_EQUAL_TO_4_LENGTH_REQUIRED,
|
||||
);
|
||||
});
|
||||
it('should return the first 4 bytes of a byte array of arbitrary length', async () => {
|
||||
const first4Bytes = await libBytes.publicReadBytes4.callAsync(
|
||||
byteArrayLongerThan32Bytes,
|
||||
new BigNumber(0));
|
||||
const first4Bytes = await libBytes.publicReadBytes4.callAsync(byteArrayLongerThan32Bytes, new BigNumber(0));
|
||||
const expectedFirst4Bytes = byteArrayLongerThan32Bytes.slice(0, 10);
|
||||
expect(first4Bytes).to.equal(expectedFirst4Bytes);
|
||||
});
|
||||
@@ -554,7 +547,11 @@ describe('LibBytes', () => {
|
||||
it('should successfully write short, nested array of bytes when it takes up the whole array)', async () => {
|
||||
const testBytesOffset = new BigNumber(0);
|
||||
const emptyByteArray = ethUtil.bufferToHex(new Buffer(shortTestBytesAsBuffer.byteLength));
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, testBytesOffset, shortData);
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
testBytesOffset,
|
||||
shortData,
|
||||
);
|
||||
const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
|
||||
return expect(bytesRead).to.be.equal(shortData);
|
||||
});
|
||||
@@ -566,10 +563,18 @@ describe('LibBytes', () => {
|
||||
const emptyByteArray = ethUtil.bufferToHex(
|
||||
new Buffer(prefixDataAsBuffer.byteLength + shortTestBytesAsBuffer.byteLength),
|
||||
);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, prefixOffset, prefixData);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
prefixOffset,
|
||||
prefixData,
|
||||
);
|
||||
// Write data after prefix
|
||||
const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
|
||||
bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(bytesWritten, testBytesOffset, shortData);
|
||||
bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
bytesWritten,
|
||||
testBytesOffset,
|
||||
shortData,
|
||||
);
|
||||
// Read data after prefix and validate
|
||||
const bytes = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
|
||||
return expect(bytes).to.be.equal(shortData);
|
||||
@@ -577,7 +582,11 @@ describe('LibBytes', () => {
|
||||
it('should successfully write a nested array of bytes - one word in length - when it takes up the whole array', async () => {
|
||||
const testBytesOffset = new BigNumber(0);
|
||||
const emptyByteArray = ethUtil.bufferToHex(new Buffer(wordOfTestBytesAsBuffer.byteLength));
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, testBytesOffset, wordOfData);
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
testBytesOffset,
|
||||
wordOfData,
|
||||
);
|
||||
const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
|
||||
return expect(bytesRead).to.be.equal(wordOfData);
|
||||
});
|
||||
@@ -589,10 +598,18 @@ describe('LibBytes', () => {
|
||||
const emptyByteArray = ethUtil.bufferToHex(
|
||||
new Buffer(prefixDataAsBuffer.byteLength + wordOfTestBytesAsBuffer.byteLength),
|
||||
);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, prefixOffset, prefixData);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
prefixOffset,
|
||||
prefixData,
|
||||
);
|
||||
// Write data after prefix
|
||||
const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
|
||||
bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(bytesWritten, testBytesOffset, wordOfData);
|
||||
bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
bytesWritten,
|
||||
testBytesOffset,
|
||||
wordOfData,
|
||||
);
|
||||
// Read data after prefix and validate
|
||||
const bytes = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
|
||||
return expect(bytes).to.be.equal(wordOfData);
|
||||
@@ -600,7 +617,11 @@ describe('LibBytes', () => {
|
||||
it('should successfully write a long, nested bytes when it takes up the whole array', async () => {
|
||||
const testBytesOffset = new BigNumber(0);
|
||||
const emptyByteArray = ethUtil.bufferToHex(new Buffer(longTestBytesAsBuffer.byteLength));
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, testBytesOffset, longData);
|
||||
const bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
testBytesOffset,
|
||||
longData,
|
||||
);
|
||||
const bytesRead = await libBytes.publicReadBytesWithLength.callAsync(bytesWritten, testBytesOffset);
|
||||
return expect(bytesRead).to.be.equal(longData);
|
||||
});
|
||||
@@ -612,7 +633,11 @@ describe('LibBytes', () => {
|
||||
const emptyByteArray = ethUtil.bufferToHex(
|
||||
new Buffer(prefixDataAsBuffer.byteLength + longTestBytesAsBuffer.byteLength),
|
||||
);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(emptyByteArray, prefixOffset, prefixData);
|
||||
let bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(
|
||||
emptyByteArray,
|
||||
prefixOffset,
|
||||
prefixData,
|
||||
);
|
||||
// Write data after prefix
|
||||
const testBytesOffset = new BigNumber(prefixDataAsBuffer.byteLength);
|
||||
bytesWritten = await libBytes.publicWriteBytesWithLength.callAsync(bytesWritten, testBytesOffset, longData);
|
||||
@@ -641,6 +666,7 @@ describe('LibBytes', () => {
|
||||
describe('memCopy', () => {
|
||||
// Create memory 0x000102...FF
|
||||
const memSize = 256;
|
||||
// tslint:disable:no-shadowed-variable
|
||||
const memory = new Uint8Array(memSize).map((_, i) => i);
|
||||
const memHex = toHex(memory);
|
||||
|
||||
|
Reference in New Issue
Block a user