@0x/contracts-staking
: Add rich reverts.
`@0x/utils`: Add `LibFixedMath` `RevertError` types. `@0x/order-utils`: Add `InvalidCobbDouglasAlphaerror` `RevertError` type.
This commit is contained in:
parent
a09cd03ce6
commit
7b5e3dab17
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
Copyright 2018 ZeroEx Intl.
|
Copyright 2019 ZeroEx Intl.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -68,10 +68,11 @@ contract MixinExchangeFees is
|
|||||||
external
|
external
|
||||||
onlyOwner
|
onlyOwner
|
||||||
{
|
{
|
||||||
if (int256(numerator) < 0 ||
|
if (int256(numerator) < 0 || int256(denominator) <= 0 || numerator > denominator) {
|
||||||
int256(denominator) <= 0 ||
|
LibRichErrors.rrevert(LibStakingRichErrors.InvalidCobbDouglasAlphaError(
|
||||||
numerator > denominator) {
|
numerator,
|
||||||
revert("INVALID_ALPHA");
|
denominator
|
||||||
|
));
|
||||||
}
|
}
|
||||||
cobbDouglasAlphaNumerator = numerator;
|
cobbDouglasAlphaNumerator = numerator;
|
||||||
cobbDouglasAlphaDenomintor = denominator;
|
cobbDouglasAlphaDenomintor = denominator;
|
||||||
@ -307,9 +308,7 @@ contract MixinExchangeFees is
|
|||||||
pure
|
pure
|
||||||
returns (uint256 ownerRewards)
|
returns (uint256 ownerRewards)
|
||||||
{
|
{
|
||||||
assert(ownerFees <= totalFees);
|
assert(alphaNumerator > alphaDenominator);
|
||||||
assert(ownerStake <= totalStake);
|
|
||||||
assert(alphaNumerator <= alphaDenominator);
|
|
||||||
int256 feeRatio = LibFixedMath._toFixed(ownerFees, totalFees);
|
int256 feeRatio = LibFixedMath._toFixed(ownerFees, totalFees);
|
||||||
int256 stakeRatio = LibFixedMath._toFixed(ownerStake, totalStake);
|
int256 stakeRatio = LibFixedMath._toFixed(ownerStake, totalStake);
|
||||||
int256 alpha = LibFixedMath._toFixed(alphaNumerator, alphaDenominator);
|
int256 alpha = LibFixedMath._toFixed(alphaNumerator, alphaDenominator);
|
||||||
@ -323,7 +322,7 @@ contract MixinExchangeFees is
|
|||||||
int256 n = LibFixedMath._exp(
|
int256 n = LibFixedMath._exp(
|
||||||
LibFixedMath._mul(
|
LibFixedMath._mul(
|
||||||
alpha,
|
alpha,
|
||||||
LibFixedMath._ln(feeRatio) - LibFixedMath._ln(stakeRatio)
|
LibFixedMath._sub(LibFixedMath._ln(feeRatio), LibFixedMath._ln(stakeRatio))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
// Multiply the above with totalRewards * stakeRatio
|
// Multiply the above with totalRewards * stakeRatio
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
pragma solidity ^0.5.9;
|
pragma solidity ^0.5.9;
|
||||||
|
|
||||||
|
import "./LibFixedMathRichErrors.sol";
|
||||||
|
|
||||||
/// @dev Signed, fixed-point, 127-bit precision math library.
|
/// @dev Signed, fixed-point, 127-bit precision math library.
|
||||||
library LibFixedMath {
|
library LibFixedMath {
|
||||||
@ -31,8 +32,18 @@ library LibFixedMath {
|
|||||||
int256 private constant EXP_MIN_VAL = int256(0xffffffffffffffffffffffffffffffdd7612c00c0077ada1b83518e8cafc0e90);
|
int256 private constant EXP_MIN_VAL = int256(0xffffffffffffffffffffffffffffffdd7612c00c0077ada1b83518e8cafc0e90);
|
||||||
|
|
||||||
/// @dev Get one as a fixed-point number.
|
/// @dev Get one as a fixed-point number.
|
||||||
function _one() internal pure returns (int256 c) {
|
function _one() internal pure returns (int256 f) {
|
||||||
c = FIXED_1;
|
f = FIXED_1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Returns the addition of two fixed point numbers, reverting on overflow.
|
||||||
|
function _add(int256 a, int256 b) internal pure returns (int256 c) {
|
||||||
|
c = __add(a, -b, LibFixedMathRichErrors.BinOpErrorCodes.SUBTRACTION_OVERFLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @dev Returns the addition of two fixed point numbers, reverting on overflow.
|
||||||
|
function _sub(int256 a, int256 b) internal pure returns (int256 c) {
|
||||||
|
c = __add(a, -b, LibFixedMathRichErrors.BinOpErrorCodes.SUBTRACTION_OVERFLOW);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Returns the multiplication of two fixed point numbers, reverting on overflow.
|
/// @dev Returns the multiplication of two fixed point numbers, reverting on overflow.
|
||||||
@ -49,7 +60,12 @@ library LibFixedMath {
|
|||||||
/// number with an integer, reverting if the multiplication overflows.
|
/// number with an integer, reverting if the multiplication overflows.
|
||||||
/// Negative results are clamped to zero.
|
/// Negative results are clamped to zero.
|
||||||
function _uintMul(int256 f, uint256 u) internal pure returns (uint256) {
|
function _uintMul(int256 f, uint256 u) internal pure returns (uint256) {
|
||||||
require(int256(u) >= int256(0), "FIXED_MATH_INTEGER_TOO_LARGE");
|
if (int256(u) < int256(0)) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathUnsignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
u
|
||||||
|
));
|
||||||
|
}
|
||||||
int256 c = __mul(f, int256(u));
|
int256 c = __mul(f, int256(u));
|
||||||
if (c <= 0) {
|
if (c <= 0) {
|
||||||
return 0;
|
return 0;
|
||||||
@ -79,14 +95,30 @@ library LibFixedMath {
|
|||||||
/// @dev Convert unsigned `n` / 1 to a fixed-point number.
|
/// @dev Convert unsigned `n` / 1 to a fixed-point number.
|
||||||
/// Reverts if `n` is too large to fit in a fixed-point number.
|
/// Reverts if `n` is too large to fit in a fixed-point number.
|
||||||
function _toFixed(uint256 n) internal pure returns (int256 f) {
|
function _toFixed(uint256 n) internal pure returns (int256 f) {
|
||||||
require(int256(n) >= 0, "FIXED_MATH_INTEGER_TOO_LARGE");
|
if (int256(n) < int256(0)) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathUnsignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
n
|
||||||
|
));
|
||||||
|
}
|
||||||
f = __mul(int256(n), FIXED_1);
|
f = __mul(int256(n), FIXED_1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Convert unsigned `n` / `d` to a fixed-point number.
|
/// @dev Convert unsigned `n` / `d` to a fixed-point number.
|
||||||
/// Reverts if `n` / `d` is too large to fit in a fixed-point number.
|
/// Reverts if `n` / `d` is too large to fit in a fixed-point number.
|
||||||
function _toFixed(uint256 n, uint256 d) internal pure returns (int256 f) {
|
function _toFixed(uint256 n, uint256 d) internal pure returns (int256 f) {
|
||||||
require(int256(n) >= 0 && int256(d) >= 0, "FIXED_MATH_INTEGER_TOO_LARGE");
|
if (int256(n) < int256(0)) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathUnsignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
n
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if (int256(d) < int256(0)) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathUnsignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
d
|
||||||
|
));
|
||||||
|
}
|
||||||
f = __div(__mul(int256(n), FIXED_1), int256(d));
|
f = __div(__mul(int256(n), FIXED_1), int256(d));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +132,18 @@ library LibFixedMath {
|
|||||||
if (x == FIXED_1) {
|
if (x == FIXED_1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
assert(x < LN_MAX_VAL && x > 0);
|
if (x > LN_MAX_VAL) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathSignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
x
|
||||||
|
));
|
||||||
|
}
|
||||||
|
if (x <= 0) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathSignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_SMALL,
|
||||||
|
x
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
int256 y;
|
int256 y;
|
||||||
int256 z;
|
int256 z;
|
||||||
@ -177,7 +220,12 @@ library LibFixedMath {
|
|||||||
if (x == 0) {
|
if (x == 0) {
|
||||||
return FIXED_1;
|
return FIXED_1;
|
||||||
}
|
}
|
||||||
assert(x < 0);
|
if (x > 0) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathSignedValueError(
|
||||||
|
LibFixedMathRichErrors.ValueErrorCodes.TOO_LARGE,
|
||||||
|
x
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// Rewrite the input as a product of positive natural exponents and a
|
// Rewrite the input as a product of positive natural exponents and a
|
||||||
// single residual q, where q is a number of small magnitude.
|
// single residual q, where q is a number of small magnitude.
|
||||||
@ -269,12 +317,44 @@ library LibFixedMath {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
c = a * b;
|
c = a * b;
|
||||||
require(c / a == b, "FIXED_MATH_MULTIPLICATION_OVERFLOW");
|
if (c / a != b) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathBinOpError(
|
||||||
|
LibFixedMathRichErrors.BinOpErrorCodes.MULTIPLICATION_OVERFLOW,
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @dev Returns the division of two numbers, reverting on division by zero.
|
/// @dev Returns the division of two numbers, reverting on division by zero.
|
||||||
function __div(int256 a, int256 b) private pure returns (int256 c) {
|
function __div(int256 a, int256 b) private pure returns (int256 c) {
|
||||||
require(b != 0, "FIXED_MATH_DIVISION_BY_ZERO");
|
if (b == 0) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathBinOpError(
|
||||||
|
LibFixedMathRichErrors.BinOpErrorCodes.DIVISION_BY_ZERO,
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
));
|
||||||
|
}
|
||||||
c = a / b;
|
c = a / b;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// @dev Adds two numbers, reverting on overflow.
|
||||||
|
function __add(
|
||||||
|
int256 a,
|
||||||
|
int256 b,
|
||||||
|
LibFixedMathRichErrors.BinOpErrorCodes errorCode
|
||||||
|
)
|
||||||
|
private
|
||||||
|
pure
|
||||||
|
returns (int256 c)
|
||||||
|
{
|
||||||
|
c = a + b;
|
||||||
|
if ((c > 0 && a < 0 && b < 0) || (c < 0 && a > 0 && b > 0)) {
|
||||||
|
LibRichErrors.rrevert(LibFixedMathRichErrors.FixedMathBinOpError(
|
||||||
|
errorCode,
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,97 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2019 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.5.9;
|
||||||
|
|
||||||
|
import "@0x/contracts-utils/contracts/src/LibRichErrors.sol";
|
||||||
|
|
||||||
|
|
||||||
|
library LibFixedMathRichErrors {
|
||||||
|
|
||||||
|
enum ValueErrorCodes {
|
||||||
|
TOO_SMALL,
|
||||||
|
TOO_LARGE
|
||||||
|
}
|
||||||
|
|
||||||
|
enum BinOpErrorCodes {
|
||||||
|
ADDITION_OVERFLOW,
|
||||||
|
SUBTRACTION_OVERFLOW,
|
||||||
|
MULTIPLICATION_OVERFLOW,
|
||||||
|
DIVISION_BY_ZERO
|
||||||
|
}
|
||||||
|
|
||||||
|
// bytes4(keccak256("FixedMathSignedValueError(uint8,int256)"))
|
||||||
|
bytes4 internal constant SIGNED_VALUE_ERROR_SELECTOR =
|
||||||
|
0x0edd9c46;
|
||||||
|
|
||||||
|
// bytes4(keccak256("FixedMathUnsignedValueError(uint8,uint256)"))
|
||||||
|
bytes4 internal constant UNSIGNED_VALUE_ERROR_SELECTOR =
|
||||||
|
0x38e93856;
|
||||||
|
|
||||||
|
// bytes4(keccak256("FixedMathBinOpError(uint8,int256,int256)"))
|
||||||
|
bytes4 internal constant BIN_OP_ERROR_SELECTOR =
|
||||||
|
0x2bd3386e;
|
||||||
|
|
||||||
|
// solhint-disable func-name-mixedcase
|
||||||
|
function FixedMathSignedValueError(
|
||||||
|
ValueErrorCodes error,
|
||||||
|
int256 n
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
SIGNED_VALUE_ERROR_SELECTOR,
|
||||||
|
uint8(error),
|
||||||
|
n
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function FixedMathUnsignedValueError(
|
||||||
|
ValueErrorCodes error,
|
||||||
|
uint256 n
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
UNSIGNED_VALUE_ERROR_SELECTOR,
|
||||||
|
uint8(error),
|
||||||
|
n
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function FixedMathBinOpError(
|
||||||
|
BinOpErrorCodes error,
|
||||||
|
int256 a,
|
||||||
|
int256 b
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
BIN_OP_ERROR_SELECTOR,
|
||||||
|
uint8(error),
|
||||||
|
a,
|
||||||
|
b
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -118,6 +118,10 @@ library LibStakingRichErrors {
|
|||||||
bytes4 internal constant POOL_ALREADY_EXISTS_ERROR_SELECTOR =
|
bytes4 internal constant POOL_ALREADY_EXISTS_ERROR_SELECTOR =
|
||||||
0x2a5e4dcf;
|
0x2a5e4dcf;
|
||||||
|
|
||||||
|
// bytes4(keccak256("InvalidCobbDouglasAlphaError(uint256,uint256)"))
|
||||||
|
bytes4 internal constant INVALID_COBB_DOUGLAS_ALPHA_ERROR_SELECTOR =
|
||||||
|
0x8f8e73de;
|
||||||
|
|
||||||
// solhint-disable func-name-mixedcase
|
// solhint-disable func-name-mixedcase
|
||||||
function MiscalculatedRewardsError(
|
function MiscalculatedRewardsError(
|
||||||
uint256 totalRewardsPaid,
|
uint256 totalRewardsPaid,
|
||||||
@ -443,4 +447,19 @@ library LibStakingRichErrors {
|
|||||||
poolId
|
poolId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function InvalidCobbDouglasAlphaError(
|
||||||
|
uint256 numerator,
|
||||||
|
uint256 denominator
|
||||||
|
)
|
||||||
|
internal
|
||||||
|
pure
|
||||||
|
returns (bytes memory)
|
||||||
|
{
|
||||||
|
return abi.encodeWithSelector(
|
||||||
|
INVALID_COBB_DOUGLAS_ALPHA_ERROR_SELECTOR,
|
||||||
|
numerator,
|
||||||
|
denominator
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
49
contracts/staking/contracts/test/TestCobbDouglas.sol
Normal file
49
contracts/staking/contracts/test/TestCobbDouglas.sol
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2019 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.5.9;
|
||||||
|
|
||||||
|
import "../src/Staking.sol";
|
||||||
|
|
||||||
|
|
||||||
|
contract TestCobbDouglas is
|
||||||
|
Staking
|
||||||
|
{
|
||||||
|
function cobbDouglas(
|
||||||
|
uint256 totalRewards,
|
||||||
|
uint256 ownerFees,
|
||||||
|
uint256 totalFees,
|
||||||
|
uint256 ownerStake,
|
||||||
|
uint256 totalStake,
|
||||||
|
uint256 alphaNumerator,
|
||||||
|
uint256 alphaDenominator
|
||||||
|
)
|
||||||
|
external
|
||||||
|
pure
|
||||||
|
returns (uint256 ownerRewards)
|
||||||
|
{
|
||||||
|
ownerRewards = _cobbDouglas(
|
||||||
|
totalRewards,
|
||||||
|
ownerFees,
|
||||||
|
totalFees,
|
||||||
|
ownerStake,
|
||||||
|
totalStake,
|
||||||
|
alphaNumerator,
|
||||||
|
alphaDenominator
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
80
contracts/staking/contracts/test/TestLibFixedMath.sol
Normal file
80
contracts/staking/contracts/test/TestLibFixedMath.sol
Normal file
@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
|
||||||
|
Copyright 2019 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.5.9;
|
||||||
|
|
||||||
|
import "../src/libs/LibFixedMath.sol";
|
||||||
|
|
||||||
|
|
||||||
|
contract TestLibFixedMath {
|
||||||
|
|
||||||
|
function one() external pure returns (int256) {
|
||||||
|
return LibFixedMath._one();
|
||||||
|
}
|
||||||
|
|
||||||
|
function mul(int256 a, int256 b) external pure returns (int256) {
|
||||||
|
return LibFixedMath._mul(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
function div(int256 a, int256 b) external pure returns (int256) {
|
||||||
|
return LibFixedMath._div(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
function add(int256 a, int256 b) external pure returns (int256) {
|
||||||
|
return LibFixedMath._add(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
function sub(int256 a, int256 b) external pure returns (int256) {
|
||||||
|
return LibFixedMath._sub(a, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
function uintMul(int256 f, uint256 u) internal pure returns (uint256) {
|
||||||
|
return LibFixedMath._uintMul(f, u);
|
||||||
|
}
|
||||||
|
|
||||||
|
function abs(int256 a) external pure returns (int256) {
|
||||||
|
return LibFixedMath._abs(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFixedSigned(int256 n, int256 d) external pure returns (int256) {
|
||||||
|
return LibFixedMath._toFixed(n, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFixedSigned(int256 n) external pure returns (int256) {
|
||||||
|
return LibFixedMath._toFixed(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFixedUnsigned(uint256 n, uint256 d) external pure returns (int256) {
|
||||||
|
return LibFixedMath._toFixed(n, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toFixedUnsigned(uint256 n) external pure returns (int256) {
|
||||||
|
return LibFixedMath._toFixed(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
function toInteger(int256 f) external pure returns (int256) {
|
||||||
|
return LibFixedMath._toInteger(f);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ln(int256 x) internal pure returns (int256 r) {
|
||||||
|
return LibFixedMath._ln(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
function exp(int256 x) internal pure returns (int256 r) {
|
||||||
|
return LibFixedMath._exp(x);
|
||||||
|
}
|
||||||
|
}
|
@ -36,7 +36,7 @@
|
|||||||
"compile:truffle": "truffle compile"
|
"compile:truffle": "truffle compile"
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"abis": "./generated-artifacts/@(IStaking|IStakingEvents|IStakingPoolRewardVault|IStakingProxy|IStructs|IVaultCore|IWallet|IZrxVault|LibEIP712Hash|LibFixedMath|LibRewardMath|LibSafeMath|LibSafeMath64|LibSafeMath96|LibSignatureValidator|LibStakingRichErrors|MixinConstants|MixinDelegatedStake|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinOwnable|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakingPool|MixinStakingPoolRewardVault|MixinStakingPoolRewards|MixinStorage|MixinTimeLockedStake|MixinVaultCore|MixinZrxVault|Staking|StakingPoolRewardVault|StakingProxy|ZrxVault).json",
|
"abis": "./generated-artifacts/@(IStaking|IStakingEvents|IStakingPoolRewardVault|IStakingProxy|IStructs|IVaultCore|IWallet|IZrxVault|LibEIP712Hash|LibFixedMath|LibFixedMathRichErrors|LibRewardMath|LibSafeMath|LibSafeMath64|LibSafeMath96|LibSignatureValidator|LibStakingRichErrors|MixinConstants|MixinDelegatedStake|MixinDeploymentConstants|MixinExchangeFees|MixinExchangeManager|MixinOwnable|MixinScheduler|MixinStake|MixinStakeBalances|MixinStakingPool|MixinStakingPoolRewardVault|MixinStakingPoolRewards|MixinStorage|MixinTimeLockedStake|MixinVaultCore|MixinZrxVault|Staking|StakingPoolRewardVault|StakingProxy|TestCobbDouglas|TestLibFixedMath|ZrxVault).json",
|
||||||
"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."
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
|
@ -15,6 +15,7 @@ import * as IWallet from '../generated-artifacts/IWallet.json';
|
|||||||
import * as IZrxVault from '../generated-artifacts/IZrxVault.json';
|
import * as IZrxVault from '../generated-artifacts/IZrxVault.json';
|
||||||
import * as LibEIP712Hash from '../generated-artifacts/LibEIP712Hash.json';
|
import * as LibEIP712Hash from '../generated-artifacts/LibEIP712Hash.json';
|
||||||
import * as LibFixedMath from '../generated-artifacts/LibFixedMath.json';
|
import * as LibFixedMath from '../generated-artifacts/LibFixedMath.json';
|
||||||
|
import * as LibFixedMathRichErrors from '../generated-artifacts/LibFixedMathRichErrors.json';
|
||||||
import * as LibRewardMath from '../generated-artifacts/LibRewardMath.json';
|
import * as LibRewardMath from '../generated-artifacts/LibRewardMath.json';
|
||||||
import * as LibSafeDowncast from '../generated-artifacts/LibSafeDowncast.json';
|
import * as LibSafeDowncast from '../generated-artifacts/LibSafeDowncast.json';
|
||||||
import * as LibSignatureValidator from '../generated-artifacts/LibSignatureValidator.json';
|
import * as LibSignatureValidator from '../generated-artifacts/LibSignatureValidator.json';
|
||||||
@ -28,8 +29,8 @@ import * as MixinScheduler from '../generated-artifacts/MixinScheduler.json';
|
|||||||
import * as MixinStake from '../generated-artifacts/MixinStake.json';
|
import * as MixinStake from '../generated-artifacts/MixinStake.json';
|
||||||
import * as MixinStakeBalances from '../generated-artifacts/MixinStakeBalances.json';
|
import * as MixinStakeBalances from '../generated-artifacts/MixinStakeBalances.json';
|
||||||
import * as MixinStakingPool from '../generated-artifacts/MixinStakingPool.json';
|
import * as MixinStakingPool from '../generated-artifacts/MixinStakingPool.json';
|
||||||
import * as MixinStakingPoolRewardVault from '../generated-artifacts/MixinStakingPoolRewardVault.json';
|
|
||||||
import * as MixinStakingPoolRewards from '../generated-artifacts/MixinStakingPoolRewards.json';
|
import * as MixinStakingPoolRewards from '../generated-artifacts/MixinStakingPoolRewards.json';
|
||||||
|
import * as MixinStakingPoolRewardVault from '../generated-artifacts/MixinStakingPoolRewardVault.json';
|
||||||
import * as MixinStorage from '../generated-artifacts/MixinStorage.json';
|
import * as MixinStorage from '../generated-artifacts/MixinStorage.json';
|
||||||
import * as MixinTimeLockedStake from '../generated-artifacts/MixinTimeLockedStake.json';
|
import * as MixinTimeLockedStake from '../generated-artifacts/MixinTimeLockedStake.json';
|
||||||
import * as MixinVaultCore from '../generated-artifacts/MixinVaultCore.json';
|
import * as MixinVaultCore from '../generated-artifacts/MixinVaultCore.json';
|
||||||
@ -57,6 +58,7 @@ export const artifacts = {
|
|||||||
IZrxVault: IZrxVault as ContractArtifact,
|
IZrxVault: IZrxVault as ContractArtifact,
|
||||||
LibEIP712Hash: LibEIP712Hash as ContractArtifact,
|
LibEIP712Hash: LibEIP712Hash as ContractArtifact,
|
||||||
LibFixedMath: LibFixedMath as ContractArtifact,
|
LibFixedMath: LibFixedMath as ContractArtifact,
|
||||||
|
LibFixedMathRichErrors: LibFixedMathRichErrors as ContractArtifact,
|
||||||
LibRewardMath: LibRewardMath as ContractArtifact,
|
LibRewardMath: LibRewardMath as ContractArtifact,
|
||||||
LibSafeDowncast: LibSafeDowncast as ContractArtifact,
|
LibSafeDowncast: LibSafeDowncast as ContractArtifact,
|
||||||
LibSignatureValidator: LibSignatureValidator as ContractArtifact,
|
LibSignatureValidator: LibSignatureValidator as ContractArtifact,
|
||||||
|
@ -13,6 +13,7 @@ export * from '../generated-wrappers/i_wallet';
|
|||||||
export * from '../generated-wrappers/i_zrx_vault';
|
export * from '../generated-wrappers/i_zrx_vault';
|
||||||
export * from '../generated-wrappers/lib_e_i_p712_hash';
|
export * from '../generated-wrappers/lib_e_i_p712_hash';
|
||||||
export * from '../generated-wrappers/lib_fixed_math';
|
export * from '../generated-wrappers/lib_fixed_math';
|
||||||
|
export * from '../generated-wrappers/lib_fixed_math_rich_errors';
|
||||||
export * from '../generated-wrappers/lib_reward_math';
|
export * from '../generated-wrappers/lib_reward_math';
|
||||||
export * from '../generated-wrappers/lib_safe_downcast';
|
export * from '../generated-wrappers/lib_safe_downcast';
|
||||||
export * from '../generated-wrappers/lib_signature_validator';
|
export * from '../generated-wrappers/lib_signature_validator';
|
||||||
|
@ -13,6 +13,7 @@
|
|||||||
"generated-artifacts/IZrxVault.json",
|
"generated-artifacts/IZrxVault.json",
|
||||||
"generated-artifacts/LibEIP712Hash.json",
|
"generated-artifacts/LibEIP712Hash.json",
|
||||||
"generated-artifacts/LibFixedMath.json",
|
"generated-artifacts/LibFixedMath.json",
|
||||||
|
"generated-artifacts/LibFixedMathRichErrors.json",
|
||||||
"generated-artifacts/LibRewardMath.json",
|
"generated-artifacts/LibRewardMath.json",
|
||||||
"generated-artifacts/LibSafeDowncast.json",
|
"generated-artifacts/LibSafeDowncast.json",
|
||||||
"generated-artifacts/LibSignatureValidator.json",
|
"generated-artifacts/LibSignatureValidator.json",
|
||||||
|
@ -69,6 +69,10 @@
|
|||||||
{
|
{
|
||||||
"note": "Add EIP712 types for Staking",
|
"note": "Add EIP712 types for Staking",
|
||||||
"pr": 1910
|
"pr": 1910
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `InvalidCobbDouglasAlphaError` `RevertError` type to `StakingRevertErrors`",
|
||||||
|
"pr": "TODO"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
@ -195,6 +195,16 @@ export class PoolAlreadyExistsError extends RevertError {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export class InvalidCobbDouglasAlphaError extends RevertError {
|
||||||
|
constructor(numerator: BigNumber | number | string, denominator: BigNumber | number | string) {
|
||||||
|
super(
|
||||||
|
'InvalidCobbDouglasAlphaError',
|
||||||
|
'InvalidCobbDouglasAlphaError(uint256 numerator, uint256 denominator)',
|
||||||
|
{ numerator, denominator },
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const types = [
|
const types = [
|
||||||
MiscalculatedRewardsError,
|
MiscalculatedRewardsError,
|
||||||
OnlyCallableByExchangeError,
|
OnlyCallableByExchangeError,
|
||||||
@ -220,6 +230,7 @@ const types = [
|
|||||||
AmountExceedsBalanceOfPoolError,
|
AmountExceedsBalanceOfPoolError,
|
||||||
OperatorShareMustBeBetween0And100Error,
|
OperatorShareMustBeBetween0And100Error,
|
||||||
PoolAlreadyExistsError,
|
PoolAlreadyExistsError,
|
||||||
|
InvalidCobbDouglasAlphaError,
|
||||||
];
|
];
|
||||||
|
|
||||||
// Register the types we've defined.
|
// Register the types we've defined.
|
||||||
|
@ -5,6 +5,10 @@
|
|||||||
{
|
{
|
||||||
"note": "Allow for array types in `RevertError`s.",
|
"note": "Allow for array types in `RevertError`s.",
|
||||||
"pr": 2075
|
"pr": 2075
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"note": "Add `LibFixedMath` `RevertError` types.",
|
||||||
|
"pr": "TODO"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
51
packages/utils/src/fixed_math_revert_errors.ts
Normal file
51
packages/utils/src/fixed_math_revert_errors.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { BigNumber } from './configured_bignumber';
|
||||||
|
import { RevertError } from './revert_error';
|
||||||
|
|
||||||
|
// tslint:disable:max-classes-per-file
|
||||||
|
|
||||||
|
export enum ValueErrorCodes {
|
||||||
|
TooSmall,
|
||||||
|
TooLarge,
|
||||||
|
}
|
||||||
|
|
||||||
|
export enum BinOpErrorCodes {
|
||||||
|
AdditionOverflow,
|
||||||
|
MultiplicationOverflow,
|
||||||
|
SubtractionUnderflow,
|
||||||
|
DivisionByZero,
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FixedMathSignedValueError extends RevertError {
|
||||||
|
constructor(error?: ValueErrorCodes, n?: BigNumber | number | string) {
|
||||||
|
super('FixedMathSignedValueError', 'FixedMathSignedValueError(uint8 error, int256 n)', {
|
||||||
|
error,
|
||||||
|
n,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FixedMathUnsignedValueError extends RevertError {
|
||||||
|
constructor(error?: ValueErrorCodes, n?: BigNumber | number | string) {
|
||||||
|
super('FixedMathUnsignedValueError', 'FixedMathUnsignedValueError(uint8 error, uint256 n)', {
|
||||||
|
error,
|
||||||
|
n,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class FixedMathBinOpError extends RevertError {
|
||||||
|
constructor(error?: BinOpErrorCodes, a?: BigNumber | number | string, b?: BigNumber | number | string) {
|
||||||
|
super('FixedMathBinOpError', 'FixedMathBinOpError(uint8 error, uint256 a, uint256 b)', {
|
||||||
|
error,
|
||||||
|
a,
|
||||||
|
b,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const types = [ FixedMathSignedValueError, FixedMathSignedValueError, FixedMathBinOpError ];
|
||||||
|
|
||||||
|
// Register the types we've defined.
|
||||||
|
for (const type of types) {
|
||||||
|
RevertError.registerType(type);
|
||||||
|
}
|
@ -1,4 +1,5 @@
|
|||||||
import * as AuthorizableRevertErrors from './authorizable_revert_errors';
|
import * as AuthorizableRevertErrors from './authorizable_revert_errors';
|
||||||
|
import * as FixedMathRevertErrors from './fixed_math_revert_errors';
|
||||||
import * as LibAddressArrayRevertErrors from './lib_address_array_revert_errors';
|
import * as LibAddressArrayRevertErrors from './lib_address_array_revert_errors';
|
||||||
import * as LibBytesRevertErrors from './lib_bytes_revert_errors';
|
import * as LibBytesRevertErrors from './lib_bytes_revert_errors';
|
||||||
import * as OwnableRevertErrors from './ownable_revert_errors';
|
import * as OwnableRevertErrors from './ownable_revert_errors';
|
||||||
@ -34,6 +35,7 @@ export {
|
|||||||
|
|
||||||
export {
|
export {
|
||||||
AuthorizableRevertErrors,
|
AuthorizableRevertErrors,
|
||||||
|
FixedMathRevertErrors,
|
||||||
LibAddressArrayRevertErrors,
|
LibAddressArrayRevertErrors,
|
||||||
LibBytesRevertErrors,
|
LibBytesRevertErrors,
|
||||||
OwnableRevertErrors,
|
OwnableRevertErrors,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user