`@0x/contracts-zero-ex`: Rename all feature contracts to have `Feature` suffix. `@0x/contracts-zero-ex`: Return an `IZeroExContract` instance from `fullMigrateAsync()`.
111 lines
4.7 KiB
TypeScript
111 lines
4.7 KiB
TypeScript
import { blockchainTests, expect, LogDecoder, randomAddress, verifyEventsFromLogs } from '@0x/contracts-test-utils';
|
|
import { hexUtils, OwnableRevertErrors, StringRevertError, ZeroExRevertErrors } from '@0x/utils';
|
|
|
|
import { artifacts } from '../artifacts';
|
|
import { initialMigrateAsync } from '../utils/migration';
|
|
import { IOwnableFeatureContract, IOwnableFeatureEvents, TestMigratorContract, TestMigratorEvents } from '../wrappers';
|
|
|
|
blockchainTests.resets('Ownable feature', env => {
|
|
const notOwner = randomAddress();
|
|
let owner: string;
|
|
let ownable: IOwnableFeatureContract;
|
|
let testMigrator: TestMigratorContract;
|
|
let succeedingMigrateFnCallData: string;
|
|
let failingMigrateFnCallData: string;
|
|
let revertingMigrateFnCallData: string;
|
|
let logDecoder: LogDecoder;
|
|
|
|
before(async () => {
|
|
[owner] = await env.getAccountAddressesAsync();
|
|
logDecoder = new LogDecoder(env.web3Wrapper, artifacts);
|
|
const zeroEx = await initialMigrateAsync(owner, env.provider, env.txDefaults);
|
|
ownable = new IOwnableFeatureContract(zeroEx.address, env.provider, env.txDefaults);
|
|
testMigrator = await TestMigratorContract.deployFrom0xArtifactAsync(
|
|
artifacts.TestMigrator,
|
|
env.provider,
|
|
env.txDefaults,
|
|
artifacts,
|
|
);
|
|
succeedingMigrateFnCallData = testMigrator.succeedingMigrate().getABIEncodedTransactionData();
|
|
failingMigrateFnCallData = testMigrator.failingMigrate().getABIEncodedTransactionData();
|
|
revertingMigrateFnCallData = testMigrator.revertingMigrate().getABIEncodedTransactionData();
|
|
});
|
|
|
|
describe('transferOwnership()', () => {
|
|
it('non-owner cannot transfer ownership', async () => {
|
|
const newOwner = randomAddress();
|
|
const tx = ownable.transferOwnership(newOwner).callAsync({ from: notOwner });
|
|
return expect(tx).to.revertWith(new OwnableRevertErrors.OnlyOwnerError(notOwner, owner));
|
|
});
|
|
|
|
it('owner can transfer ownership', async () => {
|
|
const newOwner = randomAddress();
|
|
const receipt = await ownable.transferOwnership(newOwner).awaitTransactionSuccessAsync({ from: owner });
|
|
verifyEventsFromLogs(
|
|
receipt.logs,
|
|
[
|
|
{
|
|
previousOwner: owner,
|
|
newOwner,
|
|
},
|
|
],
|
|
IOwnableFeatureEvents.OwnershipTransferred,
|
|
);
|
|
expect(await ownable.owner().callAsync()).to.eq(newOwner);
|
|
});
|
|
});
|
|
|
|
describe('migrate()', () => {
|
|
const newOwner = randomAddress();
|
|
|
|
it('non-owner cannot call migrate()', async () => {
|
|
const tx = ownable
|
|
.migrate(testMigrator.address, succeedingMigrateFnCallData, newOwner)
|
|
.awaitTransactionSuccessAsync({ from: notOwner });
|
|
return expect(tx).to.revertWith(new OwnableRevertErrors.OnlyOwnerError(notOwner, owner));
|
|
});
|
|
|
|
it('can successfully execute a migration', async () => {
|
|
const receipt = await ownable
|
|
.migrate(testMigrator.address, succeedingMigrateFnCallData, newOwner)
|
|
.awaitTransactionSuccessAsync({ from: owner });
|
|
const { logs } = logDecoder.decodeReceiptLogs(receipt);
|
|
verifyEventsFromLogs(
|
|
logs,
|
|
[
|
|
{
|
|
callData: succeedingMigrateFnCallData,
|
|
owner: ownable.address,
|
|
},
|
|
],
|
|
TestMigratorEvents.TestMigrateCalled,
|
|
);
|
|
expect(await ownable.owner().callAsync()).to.eq(newOwner);
|
|
});
|
|
|
|
it('failing migration reverts', async () => {
|
|
const tx = ownable
|
|
.migrate(testMigrator.address, failingMigrateFnCallData, newOwner)
|
|
.awaitTransactionSuccessAsync({ from: owner });
|
|
return expect(tx).to.revertWith(
|
|
new ZeroExRevertErrors.Ownable.MigrateCallFailedError(
|
|
testMigrator.address,
|
|
hexUtils.rightPad('0xdeadbeef'),
|
|
),
|
|
);
|
|
});
|
|
|
|
it('reverting migration reverts', async () => {
|
|
const tx = ownable
|
|
.migrate(testMigrator.address, revertingMigrateFnCallData, newOwner)
|
|
.awaitTransactionSuccessAsync({ from: owner });
|
|
return expect(tx).to.revertWith(
|
|
new ZeroExRevertErrors.Ownable.MigrateCallFailedError(
|
|
testMigrator.address,
|
|
new StringRevertError('OOPSIE').encode(),
|
|
),
|
|
);
|
|
});
|
|
});
|
|
});
|