@0x/contracts-zero-ex: Switch rich revert style.

`@0x/contracts-zero-ex`: Merge `FixinOwnable` -> `FixinCommon`.
This commit is contained in:
Lawrence Forman 2020-04-29 12:30:34 -04:00
parent 0f689e8051
commit f2e16dfb21
11 changed files with 53 additions and 84 deletions

View File

@ -19,16 +19,15 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../migrations/LibBootstrap.sol"; import "../migrations/LibBootstrap.sol";
import "../fixins/FixinCommon.sol";
import "../storage/LibProxyStorage.sol"; import "../storage/LibProxyStorage.sol";
import "./IBootstrap.sol"; import "./IBootstrap.sol";
/// @dev Detachable `bootstrap()` feature. /// @dev Detachable `bootstrap()` feature.
contract Bootstrap is contract Bootstrap is
IBootstrap, IBootstrap
FixinCommon
{ {
// solhint-disable state-visibility,indent // solhint-disable state-visibility,indent
/// @dev The ZeroEx contract. /// @dev The ZeroEx contract.
@ -42,6 +41,8 @@ contract Bootstrap is
address immutable private _bootstrapCaller; address immutable private _bootstrapCaller;
// solhint-enable state-visibility,indent // solhint-enable state-visibility,indent
using LibRichErrorsV06 for bytes;
/// @dev Construct this contract and set the bootstrap migration contract. /// @dev Construct this contract and set the bootstrap migration contract.
/// After constructing this contract, `bootstrap()` should be called /// After constructing this contract, `bootstrap()` should be called
/// to seed the initial feature set. /// to seed the initial feature set.
@ -60,10 +61,10 @@ contract Bootstrap is
function bootstrap(address target, bytes calldata callData) external override { function bootstrap(address target, bytes calldata callData) external override {
// Only the bootstrap caller can call this function. // Only the bootstrap caller can call this function.
if (msg.sender != _bootstrapCaller) { if (msg.sender != _bootstrapCaller) {
_rrevert(LibProxyRichErrors.InvalidBootstrapCallerError( LibProxyRichErrors.InvalidBootstrapCallerError(
msg.sender, msg.sender,
_bootstrapCaller _bootstrapCaller
)); ).rrevert();
} }
// Deregister. // Deregister.
LibProxyStorage.getStorage().impls[this.bootstrap.selector] = address(0); LibProxyStorage.getStorage().impls[this.bootstrap.selector] = address(0);
@ -77,7 +78,7 @@ contract Bootstrap is
/// Can only be called by the deployer. /// Can only be called by the deployer.
function die() external { function die() external {
if (msg.sender != _deployer) { if (msg.sender != _deployer) {
_rrevert(LibProxyRichErrors.InvalidDieCallerError(msg.sender, _deployer)); LibProxyRichErrors.InvalidDieCallerError(msg.sender, _deployer).rrevert();
} }
selfdestruct(msg.sender); selfdestruct(msg.sender);
} }

View File

@ -19,7 +19,8 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "../fixins/FixinOwnable.sol"; import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../fixins/FixinCommon.sol";
import "../errors/LibOwnableRichErrors.sol"; import "../errors/LibOwnableRichErrors.sol";
import "../storage/LibOwnableStorage.sol"; import "../storage/LibOwnableStorage.sol";
import "../migrations/LibBootstrap.sol"; import "../migrations/LibBootstrap.sol";
@ -33,7 +34,7 @@ import "./ISimpleFunctionRegistry.sol";
contract Ownable is contract Ownable is
IFeature, IFeature,
IOwnable, IOwnable,
FixinOwnable FixinCommon
{ {
// solhint-disable const-name-snakecase // solhint-disable const-name-snakecase
@ -48,6 +49,8 @@ contract Ownable is
address immutable private _implementation; address immutable private _implementation;
// solhint-enable // solhint-enable
using LibRichErrorsV06 for bytes;
constructor() public { constructor() public {
_implementation = address(this); _implementation = address(this);
} }
@ -79,7 +82,7 @@ contract Ownable is
LibOwnableStorage.Storage storage proxyStor = LibOwnableStorage.getStorage(); LibOwnableStorage.Storage storage proxyStor = LibOwnableStorage.getStorage();
if (newOwner == address(0)) { if (newOwner == address(0)) {
_rrevert(LibOwnableRichErrors.TransferOwnerToZeroError()); LibOwnableRichErrors.TransferOwnerToZeroError().rrevert();
} else { } else {
proxyStor.owner = newOwner; proxyStor.owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner); emit OwnershipTransferred(msg.sender, newOwner);
@ -103,7 +106,7 @@ contract Ownable is
address prevOwner = stor.owner; address prevOwner = stor.owner;
if (prevOwner == address(this)) { if (prevOwner == address(this)) {
// If the owner is already set to ourselves then we've reentered. // If the owner is already set to ourselves then we've reentered.
_rrevert(LibOwnableRichErrors.AlreadyMigratingError()); LibOwnableRichErrors.AlreadyMigratingError().rrevert();
} }
// Temporarily set the owner to ourselves so we can perform admin functions. // Temporarily set the owner to ourselves so we can perform admin functions.
stor.owner = address(this); stor.owner = address(this);

View File

@ -19,7 +19,8 @@
pragma solidity ^0.6.5; pragma solidity ^0.6.5;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "../fixins/FixinOwnable.sol"; import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../fixins/FixinCommon.sol";
import "../storage/LibProxyStorage.sol"; import "../storage/LibProxyStorage.sol";
import "../storage/LibSimpleFunctionRegistryStorage.sol"; import "../storage/LibSimpleFunctionRegistryStorage.sol";
import "../errors/LibSimpleFunctionRegistryRichErrors.sol"; import "../errors/LibSimpleFunctionRegistryRichErrors.sol";
@ -32,7 +33,7 @@ import "./ISimpleFunctionRegistry.sol";
contract SimpleFunctionRegistry is contract SimpleFunctionRegistry is
IFeature, IFeature,
ISimpleFunctionRegistry, ISimpleFunctionRegistry,
FixinOwnable FixinCommon
{ {
// solhint-disable const-name-snakecase // solhint-disable const-name-snakecase
@ -47,6 +48,8 @@ contract SimpleFunctionRegistry is
address immutable private _implementation; address immutable private _implementation;
// solhint-enable // solhint-enable
using LibRichErrorsV06 for bytes;
constructor() public { constructor() public {
_implementation = address(this); _implementation = address(this);
} }
@ -95,12 +98,10 @@ contract SimpleFunctionRegistry is
} }
} }
if (i == 0) { if (i == 0) {
_rrevert( LibSimpleFunctionRegistryRichErrors.NotInRollbackHistoryError(
LibSimpleFunctionRegistryRichErrors.NotInRollbackHistoryError( selector,
selector, targetImpl
targetImpl ).rrevert();
)
);
} }
proxyStor.impls[selector] = targetImpl; proxyStor.impls[selector] = targetImpl;
emit ProxyFunctionUpdated(selector, currentImpl, targetImpl); emit ProxyFunctionUpdated(selector, currentImpl, targetImpl);

View File

@ -21,22 +21,40 @@ pragma experimental ABIEncoderV2;
import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol"; import "@0x/contracts-utils/contracts/src/v06/errors/LibRichErrorsV06.sol";
import "../errors/LibCommonRichErrors.sol"; import "../errors/LibCommonRichErrors.sol";
import "../errors/LibOwnableRichErrors.sol";
import "../storage/LibOwnableStorage.sol";
/// @dev Common utilities. /// @dev Common utilities.
contract FixinCommon { contract FixinCommon {
using LibRichErrorsV06 for bytes;
/// @dev The caller must be this contract. /// @dev The caller must be this contract.
modifier onlySelf() { modifier onlySelf() {
if (msg.sender != address(this)) { if (msg.sender != address(this)) {
_rrevert(LibCommonRichErrors.OnlyCallableBySelfError(msg.sender)); LibCommonRichErrors.OnlyCallableBySelfError(msg.sender).rrevert();
} }
_; _;
} }
/// @dev Reverts with arbitrary data `errorData`. /// @dev The caller of this function must be the owner.
/// @param errorData ABI encoded error data. modifier onlyOwner() {
function _rrevert(bytes memory errorData) internal pure { {
LibRichErrorsV06.rrevert(errorData); address owner = _getOwner();
if (msg.sender != owner) {
LibOwnableRichErrors.OnlyOwnerError(
msg.sender,
owner
).rrevert();
}
}
_;
}
/// @dev Get the owner of this contract.
/// @return owner The owner of this contract.
function _getOwner() internal view returns (address owner) {
return LibOwnableStorage.getStorage().owner;
} }
} }

View File

@ -1,50 +0,0 @@
/*
Copyright 2020 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.6.5;
pragma experimental ABIEncoderV2;
import "../errors/LibOwnableRichErrors.sol";
import "../storage/LibOwnableStorage.sol";
import "./FixinCommon.sol";
/// @dev A feature mixin for restricting callers to owners.
contract FixinOwnable is
FixinCommon
{
/// @dev The caller of this function must be the owner.
modifier onlyOwner() {
{
address owner = _getOwner();
if (msg.sender != owner) {
_rrevert(LibOwnableRichErrors.OnlyOwnerError(
msg.sender,
owner
));
}
}
_;
}
/// @dev Get the owner of this contract.
/// @return owner The owner of this contract.
function _getOwner() internal view returns (address owner) {
return LibOwnableStorage.getStorage().owner;
}
}

View File

@ -29,6 +29,8 @@ library LibBootstrap {
/// This is `keccack('BOOTSTRAP_SUCCESS')`. /// This is `keccack('BOOTSTRAP_SUCCESS')`.
bytes4 internal constant BOOTSTRAP_SUCCESS = 0xd150751b; bytes4 internal constant BOOTSTRAP_SUCCESS = 0xd150751b;
using LibRichErrorsV06 for bytes;
/// @dev Perform a delegatecall and ensure it returns the magic bytes. /// @dev Perform a delegatecall and ensure it returns the magic bytes.
/// @param target The call target. /// @param target The call target.
/// @param data The call data. /// @param data The call data.
@ -43,9 +45,7 @@ library LibBootstrap {
resultData.length != 32 || resultData.length != 32 ||
abi.decode(resultData, (bytes4)) != BOOTSTRAP_SUCCESS) abi.decode(resultData, (bytes4)) != BOOTSTRAP_SUCCESS)
{ {
LibRichErrorsV06.rrevert( LibProxyRichErrors.BootstrapCallFailedError(target, resultData).rrevert();
LibProxyRichErrors.BootstrapCallFailedError(target, resultData)
);
} }
} }
} }

View File

@ -29,6 +29,8 @@ library LibMigrate {
/// This is `keccack('MIGRATE_SUCCESS')`. /// This is `keccack('MIGRATE_SUCCESS')`.
bytes4 internal constant MIGRATE_SUCCESS = 0x2c64c5ef; bytes4 internal constant MIGRATE_SUCCESS = 0x2c64c5ef;
using LibRichErrorsV06 for bytes;
/// @dev Perform a delegatecall and ensure it returns the magic bytes. /// @dev Perform a delegatecall and ensure it returns the magic bytes.
/// @param target The call target. /// @param target The call target.
/// @param data The call data. /// @param data The call data.
@ -43,9 +45,7 @@ library LibMigrate {
resultData.length != 32 || resultData.length != 32 ||
abi.decode(resultData, (bytes4)) != MIGRATE_SUCCESS) abi.decode(resultData, (bytes4)) != MIGRATE_SUCCESS)
{ {
LibRichErrorsV06.rrevert( LibOwnableRichErrors.MigrateCallFailedError(target, resultData).rrevert();
LibOwnableRichErrors.MigrateCallFailedError(target, resultData)
);
} }
} }
} }

View File

@ -40,7 +40,7 @@
"config": { "config": {
"publicInterfaceContracts": "ZeroEx,IOwnable,ISimpleFunctionRegistry", "publicInterfaceContracts": "ZeroEx,IOwnable,ISimpleFunctionRegistry",
"abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.", "abis:comment": "This list is auto-generated by contracts-gen. Don't edit manually.",
"abis": "./test/generated-artifacts/@(Bootstrap|FixinCommon|FixinOwnable|IBootstrap|IFeature|IOwnable|ISimpleFunctionRegistry|ITestSimpleFunctionRegistryFeature|InitialMigration|LibBootstrap|LibCommonRichErrors|LibMigrate|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|Ownable|SimpleFunctionRegistry|TestInitialMigration|TestMigrator|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestZeroExFeature|ZeroEx).json" "abis": "./test/generated-artifacts/@(Bootstrap|FixinCommon|IBootstrap|IFeature|IOwnable|ISimpleFunctionRegistry|ITestSimpleFunctionRegistryFeature|InitialMigration|LibBootstrap|LibCommonRichErrors|LibMigrate|LibOwnableRichErrors|LibOwnableStorage|LibProxyRichErrors|LibProxyStorage|LibSimpleFunctionRegistryRichErrors|LibSimpleFunctionRegistryStorage|LibStorage|Ownable|SimpleFunctionRegistry|TestInitialMigration|TestMigrator|TestSimpleFunctionRegistryFeatureImpl1|TestSimpleFunctionRegistryFeatureImpl2|TestZeroExFeature|ZeroEx).json"
}, },
"repository": { "repository": {
"type": "git", "type": "git",

View File

@ -7,7 +7,6 @@ import { ContractArtifact } from 'ethereum-types';
import * as Bootstrap from '../test/generated-artifacts/Bootstrap.json'; import * as Bootstrap from '../test/generated-artifacts/Bootstrap.json';
import * as FixinCommon from '../test/generated-artifacts/FixinCommon.json'; import * as FixinCommon from '../test/generated-artifacts/FixinCommon.json';
import * as FixinOwnable from '../test/generated-artifacts/FixinOwnable.json';
import * as IBootstrap from '../test/generated-artifacts/IBootstrap.json'; import * as IBootstrap from '../test/generated-artifacts/IBootstrap.json';
import * as IFeature from '../test/generated-artifacts/IFeature.json'; import * as IFeature from '../test/generated-artifacts/IFeature.json';
import * as InitialMigration from '../test/generated-artifacts/InitialMigration.json'; import * as InitialMigration from '../test/generated-artifacts/InitialMigration.json';
@ -46,7 +45,6 @@ export const artifacts = {
Ownable: Ownable as ContractArtifact, Ownable: Ownable as ContractArtifact,
SimpleFunctionRegistry: SimpleFunctionRegistry as ContractArtifact, SimpleFunctionRegistry: SimpleFunctionRegistry as ContractArtifact,
FixinCommon: FixinCommon as ContractArtifact, FixinCommon: FixinCommon as ContractArtifact,
FixinOwnable: FixinOwnable as ContractArtifact,
InitialMigration: InitialMigration as ContractArtifact, InitialMigration: InitialMigration as ContractArtifact,
LibBootstrap: LibBootstrap as ContractArtifact, LibBootstrap: LibBootstrap as ContractArtifact,
LibMigrate: LibMigrate as ContractArtifact, LibMigrate: LibMigrate as ContractArtifact,

View File

@ -5,7 +5,6 @@
*/ */
export * from '../test/generated-wrappers/bootstrap'; export * from '../test/generated-wrappers/bootstrap';
export * from '../test/generated-wrappers/fixin_common'; export * from '../test/generated-wrappers/fixin_common';
export * from '../test/generated-wrappers/fixin_ownable';
export * from '../test/generated-wrappers/i_bootstrap'; export * from '../test/generated-wrappers/i_bootstrap';
export * from '../test/generated-wrappers/i_feature'; export * from '../test/generated-wrappers/i_feature';
export * from '../test/generated-wrappers/i_ownable'; export * from '../test/generated-wrappers/i_ownable';

View File

@ -8,7 +8,6 @@
"generated-artifacts/ZeroEx.json", "generated-artifacts/ZeroEx.json",
"test/generated-artifacts/Bootstrap.json", "test/generated-artifacts/Bootstrap.json",
"test/generated-artifacts/FixinCommon.json", "test/generated-artifacts/FixinCommon.json",
"test/generated-artifacts/FixinOwnable.json",
"test/generated-artifacts/IBootstrap.json", "test/generated-artifacts/IBootstrap.json",
"test/generated-artifacts/IFeature.json", "test/generated-artifacts/IFeature.json",
"test/generated-artifacts/IOwnable.json", "test/generated-artifacts/IOwnable.json",