feat: add balancer v2 executor
This commit is contained in:
@@ -0,0 +1,293 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
// solhint-disable
|
||||
|
||||
/**
|
||||
* @dev Reverts if `condition` is false, with a revert reason containing `errorCode`. Only codes up to 999 are
|
||||
* supported.
|
||||
* Uses the default 'BAL' prefix for the error code
|
||||
*/
|
||||
function _require(bool condition, uint256 errorCode) pure {
|
||||
if (!condition) _revert(errorCode);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Reverts if `condition` is false, with a revert reason containing `errorCode`. Only codes up to 999 are
|
||||
* supported.
|
||||
*/
|
||||
function _require(
|
||||
bool condition,
|
||||
uint256 errorCode,
|
||||
bytes3 prefix
|
||||
) pure {
|
||||
if (!condition) _revert(errorCode, prefix);
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Reverts with a revert reason containing `errorCode`. Only codes up to 999 are supported.
|
||||
* Uses the default 'BAL' prefix for the error code
|
||||
*/
|
||||
function _revert(uint256 errorCode) pure {
|
||||
_revert(errorCode, 0x42414c); // This is the raw byte representation of "BAL"
|
||||
}
|
||||
|
||||
/**
|
||||
* @dev Reverts with a revert reason containing `errorCode`. Only codes up to 999 are supported.
|
||||
*/
|
||||
function _revert(uint256 errorCode, bytes3 prefix) pure {
|
||||
uint256 prefixUint = uint256(uint24(prefix));
|
||||
// We're going to dynamically create a revert string based on the error code, with the following format:
|
||||
// 'BAL#{errorCode}'
|
||||
// where the code is left-padded with zeroes to three digits (so they range from 000 to 999).
|
||||
//
|
||||
// We don't have revert strings embedded in the contract to save bytecode size: it takes much less space to store a
|
||||
// number (8 to 16 bits) than the individual string characters.
|
||||
//
|
||||
// The dynamic string creation algorithm that follows could be implemented in Solidity, but assembly allows for a
|
||||
// much denser implementation, again saving bytecode size. Given this function unconditionally reverts, this is a
|
||||
// safe place to rely on it without worrying about how its usage might affect e.g. memory contents.
|
||||
assembly {
|
||||
// First, we need to compute the ASCII representation of the error code. We assume that it is in the 0-999
|
||||
// range, so we only need to convert three digits. To convert the digits to ASCII, we add 0x30, the value for
|
||||
// the '0' character.
|
||||
|
||||
let units := add(mod(errorCode, 10), 0x30)
|
||||
|
||||
errorCode := div(errorCode, 10)
|
||||
let tenths := add(mod(errorCode, 10), 0x30)
|
||||
|
||||
errorCode := div(errorCode, 10)
|
||||
let hundreds := add(mod(errorCode, 10), 0x30)
|
||||
|
||||
// With the individual characters, we can now construct the full string.
|
||||
// We first append the '#' character (0x23) to the prefix. In the case of 'BAL', it results in 0x42414c23 ('BAL#')
|
||||
// Then, we shift this by 24 (to provide space for the 3 bytes of the error code), and add the
|
||||
// characters to it, each shifted by a multiple of 8.
|
||||
// The revert reason is then shifted left by 200 bits (256 minus the length of the string, 7 characters * 8 bits
|
||||
// per character = 56) to locate it in the most significant part of the 256 slot (the beginning of a byte
|
||||
// array).
|
||||
let formattedPrefix := shl(24, add(0x23, shl(8, prefixUint)))
|
||||
|
||||
let revertReason := shl(200, add(formattedPrefix, add(add(units, shl(8, tenths)), shl(16, hundreds))))
|
||||
|
||||
// We can now encode the reason in memory, which can be safely overwritten as we're about to revert. The encoded
|
||||
// message will have the following layout:
|
||||
// [ revert reason identifier ] [ string location offset ] [ string length ] [ string contents ]
|
||||
|
||||
// The Solidity revert reason identifier is 0x08c739a0, the function selector of the Error(string) function. We
|
||||
// also write zeroes to the next 28 bytes of memory, but those are about to be overwritten.
|
||||
mstore(0x0, 0x08c379a000000000000000000000000000000000000000000000000000000000)
|
||||
// Next is the offset to the location of the string, which will be placed immediately after (20 bytes away).
|
||||
mstore(0x04, 0x0000000000000000000000000000000000000000000000000000000000000020)
|
||||
// The string length is fixed: 7 characters.
|
||||
mstore(0x24, 7)
|
||||
// Finally, the string itself is stored.
|
||||
mstore(0x44, revertReason)
|
||||
|
||||
// Even if the string is only 7 bytes long, we need to return a full 32 byte slot containing it. The length of
|
||||
// the encoded message is therefore 4 + 32 + 32 + 32 = 100.
|
||||
revert(0, 100)
|
||||
}
|
||||
}
|
||||
|
||||
library Errors {
|
||||
// Math
|
||||
uint256 internal constant ADD_OVERFLOW = 0;
|
||||
uint256 internal constant SUB_OVERFLOW = 1;
|
||||
uint256 internal constant SUB_UNDERFLOW = 2;
|
||||
uint256 internal constant MUL_OVERFLOW = 3;
|
||||
uint256 internal constant ZERO_DIVISION = 4;
|
||||
uint256 internal constant DIV_INTERNAL = 5;
|
||||
uint256 internal constant X_OUT_OF_BOUNDS = 6;
|
||||
uint256 internal constant Y_OUT_OF_BOUNDS = 7;
|
||||
uint256 internal constant PRODUCT_OUT_OF_BOUNDS = 8;
|
||||
uint256 internal constant INVALID_EXPONENT = 9;
|
||||
|
||||
// Input
|
||||
uint256 internal constant OUT_OF_BOUNDS = 100;
|
||||
uint256 internal constant UNSORTED_ARRAY = 101;
|
||||
uint256 internal constant UNSORTED_TOKENS = 102;
|
||||
uint256 internal constant INPUT_LENGTH_MISMATCH = 103;
|
||||
uint256 internal constant ZERO_TOKEN = 104;
|
||||
uint256 internal constant INSUFFICIENT_DATA = 105;
|
||||
|
||||
// Shared pools
|
||||
uint256 internal constant MIN_TOKENS = 200;
|
||||
uint256 internal constant MAX_TOKENS = 201;
|
||||
uint256 internal constant MAX_SWAP_FEE_PERCENTAGE = 202;
|
||||
uint256 internal constant MIN_SWAP_FEE_PERCENTAGE = 203;
|
||||
uint256 internal constant MINIMUM_BPT = 204;
|
||||
uint256 internal constant CALLER_NOT_VAULT = 205;
|
||||
uint256 internal constant UNINITIALIZED = 206;
|
||||
uint256 internal constant BPT_IN_MAX_AMOUNT = 207;
|
||||
uint256 internal constant BPT_OUT_MIN_AMOUNT = 208;
|
||||
uint256 internal constant EXPIRED_PERMIT = 209;
|
||||
uint256 internal constant NOT_TWO_TOKENS = 210;
|
||||
uint256 internal constant DISABLED = 211;
|
||||
|
||||
// Pools
|
||||
uint256 internal constant MIN_AMP = 300;
|
||||
uint256 internal constant MAX_AMP = 301;
|
||||
uint256 internal constant MIN_WEIGHT = 302;
|
||||
uint256 internal constant MAX_STABLE_TOKENS = 303;
|
||||
uint256 internal constant MAX_IN_RATIO = 304;
|
||||
uint256 internal constant MAX_OUT_RATIO = 305;
|
||||
uint256 internal constant MIN_BPT_IN_FOR_TOKEN_OUT = 306;
|
||||
uint256 internal constant MAX_OUT_BPT_FOR_TOKEN_IN = 307;
|
||||
uint256 internal constant NORMALIZED_WEIGHT_INVARIANT = 308;
|
||||
uint256 internal constant INVALID_TOKEN = 309;
|
||||
uint256 internal constant UNHANDLED_JOIN_KIND = 310;
|
||||
uint256 internal constant ZERO_INVARIANT = 311;
|
||||
uint256 internal constant ORACLE_INVALID_SECONDS_QUERY = 312;
|
||||
uint256 internal constant ORACLE_NOT_INITIALIZED = 313;
|
||||
uint256 internal constant ORACLE_QUERY_TOO_OLD = 314;
|
||||
uint256 internal constant ORACLE_INVALID_INDEX = 315;
|
||||
uint256 internal constant ORACLE_BAD_SECS = 316;
|
||||
uint256 internal constant AMP_END_TIME_TOO_CLOSE = 317;
|
||||
uint256 internal constant AMP_ONGOING_UPDATE = 318;
|
||||
uint256 internal constant AMP_RATE_TOO_HIGH = 319;
|
||||
uint256 internal constant AMP_NO_ONGOING_UPDATE = 320;
|
||||
uint256 internal constant STABLE_INVARIANT_DIDNT_CONVERGE = 321;
|
||||
uint256 internal constant STABLE_GET_BALANCE_DIDNT_CONVERGE = 322;
|
||||
uint256 internal constant RELAYER_NOT_CONTRACT = 323;
|
||||
uint256 internal constant BASE_POOL_RELAYER_NOT_CALLED = 324;
|
||||
uint256 internal constant REBALANCING_RELAYER_REENTERED = 325;
|
||||
uint256 internal constant GRADUAL_UPDATE_TIME_TRAVEL = 326;
|
||||
uint256 internal constant SWAPS_DISABLED = 327;
|
||||
uint256 internal constant CALLER_IS_NOT_LBP_OWNER = 328;
|
||||
uint256 internal constant PRICE_RATE_OVERFLOW = 329;
|
||||
uint256 internal constant INVALID_JOIN_EXIT_KIND_WHILE_SWAPS_DISABLED = 330;
|
||||
uint256 internal constant WEIGHT_CHANGE_TOO_FAST = 331;
|
||||
uint256 internal constant LOWER_GREATER_THAN_UPPER_TARGET = 332;
|
||||
uint256 internal constant UPPER_TARGET_TOO_HIGH = 333;
|
||||
uint256 internal constant UNHANDLED_BY_LINEAR_POOL = 334;
|
||||
uint256 internal constant OUT_OF_TARGET_RANGE = 335;
|
||||
uint256 internal constant UNHANDLED_EXIT_KIND = 336;
|
||||
uint256 internal constant UNAUTHORIZED_EXIT = 337;
|
||||
uint256 internal constant MAX_MANAGEMENT_SWAP_FEE_PERCENTAGE = 338;
|
||||
uint256 internal constant UNHANDLED_BY_MANAGED_POOL = 339;
|
||||
uint256 internal constant UNHANDLED_BY_PHANTOM_POOL = 340;
|
||||
uint256 internal constant TOKEN_DOES_NOT_HAVE_RATE_PROVIDER = 341;
|
||||
uint256 internal constant INVALID_INITIALIZATION = 342;
|
||||
uint256 internal constant OUT_OF_NEW_TARGET_RANGE = 343;
|
||||
uint256 internal constant FEATURE_DISABLED = 344;
|
||||
uint256 internal constant UNINITIALIZED_POOL_CONTROLLER = 345;
|
||||
uint256 internal constant SET_SWAP_FEE_DURING_FEE_CHANGE = 346;
|
||||
uint256 internal constant SET_SWAP_FEE_PENDING_FEE_CHANGE = 347;
|
||||
uint256 internal constant CHANGE_TOKENS_DURING_WEIGHT_CHANGE = 348;
|
||||
uint256 internal constant CHANGE_TOKENS_PENDING_WEIGHT_CHANGE = 349;
|
||||
uint256 internal constant MAX_WEIGHT = 350;
|
||||
uint256 internal constant UNAUTHORIZED_JOIN = 351;
|
||||
uint256 internal constant MAX_MANAGEMENT_AUM_FEE_PERCENTAGE = 352;
|
||||
uint256 internal constant FRACTIONAL_TARGET = 353;
|
||||
uint256 internal constant ADD_OR_REMOVE_BPT = 354;
|
||||
uint256 internal constant INVALID_CIRCUIT_BREAKER_BOUNDS = 355;
|
||||
uint256 internal constant CIRCUIT_BREAKER_TRIPPED = 356;
|
||||
uint256 internal constant MALICIOUS_QUERY_REVERT = 357;
|
||||
uint256 internal constant JOINS_EXITS_DISABLED = 358;
|
||||
|
||||
// Lib
|
||||
uint256 internal constant REENTRANCY = 400;
|
||||
uint256 internal constant SENDER_NOT_ALLOWED = 401;
|
||||
uint256 internal constant PAUSED = 402;
|
||||
uint256 internal constant PAUSE_WINDOW_EXPIRED = 403;
|
||||
uint256 internal constant MAX_PAUSE_WINDOW_DURATION = 404;
|
||||
uint256 internal constant MAX_BUFFER_PERIOD_DURATION = 405;
|
||||
uint256 internal constant INSUFFICIENT_BALANCE = 406;
|
||||
uint256 internal constant INSUFFICIENT_ALLOWANCE = 407;
|
||||
uint256 internal constant ERC20_TRANSFER_FROM_ZERO_ADDRESS = 408;
|
||||
uint256 internal constant ERC20_TRANSFER_TO_ZERO_ADDRESS = 409;
|
||||
uint256 internal constant ERC20_MINT_TO_ZERO_ADDRESS = 410;
|
||||
uint256 internal constant ERC20_BURN_FROM_ZERO_ADDRESS = 411;
|
||||
uint256 internal constant ERC20_APPROVE_FROM_ZERO_ADDRESS = 412;
|
||||
uint256 internal constant ERC20_APPROVE_TO_ZERO_ADDRESS = 413;
|
||||
uint256 internal constant ERC20_TRANSFER_EXCEEDS_ALLOWANCE = 414;
|
||||
uint256 internal constant ERC20_DECREASED_ALLOWANCE_BELOW_ZERO = 415;
|
||||
uint256 internal constant ERC20_TRANSFER_EXCEEDS_BALANCE = 416;
|
||||
uint256 internal constant ERC20_BURN_EXCEEDS_ALLOWANCE = 417;
|
||||
uint256 internal constant SAFE_ERC20_CALL_FAILED = 418;
|
||||
uint256 internal constant ADDRESS_INSUFFICIENT_BALANCE = 419;
|
||||
uint256 internal constant ADDRESS_CANNOT_SEND_VALUE = 420;
|
||||
uint256 internal constant SAFE_CAST_VALUE_CANT_FIT_INT256 = 421;
|
||||
uint256 internal constant GRANT_SENDER_NOT_ADMIN = 422;
|
||||
uint256 internal constant REVOKE_SENDER_NOT_ADMIN = 423;
|
||||
uint256 internal constant RENOUNCE_SENDER_NOT_ALLOWED = 424;
|
||||
uint256 internal constant BUFFER_PERIOD_EXPIRED = 425;
|
||||
uint256 internal constant CALLER_IS_NOT_OWNER = 426;
|
||||
uint256 internal constant NEW_OWNER_IS_ZERO = 427;
|
||||
uint256 internal constant CODE_DEPLOYMENT_FAILED = 428;
|
||||
uint256 internal constant CALL_TO_NON_CONTRACT = 429;
|
||||
uint256 internal constant LOW_LEVEL_CALL_FAILED = 430;
|
||||
uint256 internal constant NOT_PAUSED = 431;
|
||||
uint256 internal constant ADDRESS_ALREADY_ALLOWLISTED = 432;
|
||||
uint256 internal constant ADDRESS_NOT_ALLOWLISTED = 433;
|
||||
uint256 internal constant ERC20_BURN_EXCEEDS_BALANCE = 434;
|
||||
uint256 internal constant INVALID_OPERATION = 435;
|
||||
uint256 internal constant CODEC_OVERFLOW = 436;
|
||||
uint256 internal constant IN_RECOVERY_MODE = 437;
|
||||
uint256 internal constant NOT_IN_RECOVERY_MODE = 438;
|
||||
uint256 internal constant INDUCED_FAILURE = 439;
|
||||
uint256 internal constant EXPIRED_SIGNATURE = 440;
|
||||
uint256 internal constant MALFORMED_SIGNATURE = 441;
|
||||
uint256 internal constant SAFE_CAST_VALUE_CANT_FIT_UINT64 = 442;
|
||||
uint256 internal constant UNHANDLED_FEE_TYPE = 443;
|
||||
uint256 internal constant BURN_FROM_ZERO = 444;
|
||||
|
||||
// Vault
|
||||
uint256 internal constant INVALID_POOL_ID = 500;
|
||||
uint256 internal constant CALLER_NOT_POOL = 501;
|
||||
uint256 internal constant SENDER_NOT_ASSET_MANAGER = 502;
|
||||
uint256 internal constant USER_DOESNT_ALLOW_RELAYER = 503;
|
||||
uint256 internal constant INVALID_SIGNATURE = 504;
|
||||
uint256 internal constant EXIT_BELOW_MIN = 505;
|
||||
uint256 internal constant JOIN_ABOVE_MAX = 506;
|
||||
uint256 internal constant SWAP_LIMIT = 507;
|
||||
uint256 internal constant SWAP_DEADLINE = 508;
|
||||
uint256 internal constant CANNOT_SWAP_SAME_TOKEN = 509;
|
||||
uint256 internal constant UNKNOWN_AMOUNT_IN_FIRST_SWAP = 510;
|
||||
uint256 internal constant MALCONSTRUCTED_MULTIHOP_SWAP = 511;
|
||||
uint256 internal constant INTERNAL_BALANCE_OVERFLOW = 512;
|
||||
uint256 internal constant INSUFFICIENT_INTERNAL_BALANCE = 513;
|
||||
uint256 internal constant INVALID_ETH_INTERNAL_BALANCE = 514;
|
||||
uint256 internal constant INVALID_POST_LOAN_BALANCE = 515;
|
||||
uint256 internal constant INSUFFICIENT_ETH = 516;
|
||||
uint256 internal constant UNALLOCATED_ETH = 517;
|
||||
uint256 internal constant ETH_TRANSFER = 518;
|
||||
uint256 internal constant CANNOT_USE_ETH_SENTINEL = 519;
|
||||
uint256 internal constant TOKENS_MISMATCH = 520;
|
||||
uint256 internal constant TOKEN_NOT_REGISTERED = 521;
|
||||
uint256 internal constant TOKEN_ALREADY_REGISTERED = 522;
|
||||
uint256 internal constant TOKENS_ALREADY_SET = 523;
|
||||
uint256 internal constant TOKENS_LENGTH_MUST_BE_2 = 524;
|
||||
uint256 internal constant NONZERO_TOKEN_BALANCE = 525;
|
||||
uint256 internal constant BALANCE_TOTAL_OVERFLOW = 526;
|
||||
uint256 internal constant POOL_NO_TOKENS = 527;
|
||||
uint256 internal constant INSUFFICIENT_FLASH_LOAN_BALANCE = 528;
|
||||
|
||||
// Fees
|
||||
uint256 internal constant SWAP_FEE_PERCENTAGE_TOO_HIGH = 600;
|
||||
uint256 internal constant FLASH_LOAN_FEE_PERCENTAGE_TOO_HIGH = 601;
|
||||
uint256 internal constant INSUFFICIENT_FLASH_LOAN_FEE_AMOUNT = 602;
|
||||
uint256 internal constant AUM_FEE_PERCENTAGE_TOO_HIGH = 603;
|
||||
|
||||
// FeeSplitter
|
||||
uint256 internal constant SPLITTER_FEE_PERCENTAGE_TOO_HIGH = 700;
|
||||
|
||||
// Misc
|
||||
uint256 internal constant UNIMPLEMENTED = 998;
|
||||
uint256 internal constant SHOULD_NOT_HAPPEN = 999;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
interface IAuthentication {
|
||||
/**
|
||||
* @dev Returns the action identifier associated with the external function described by `selector`.
|
||||
*/
|
||||
function getActionId(bytes4 selector) external view returns (bytes32);
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface for the OptionalOnlyCaller helper, used to opt in to a caller
|
||||
* verification for a given address to methods that are otherwise callable by any address.
|
||||
*/
|
||||
interface IOptionalOnlyCaller {
|
||||
/**
|
||||
* @dev Emitted every time setOnlyCallerCheck is called.
|
||||
*/
|
||||
event OnlyCallerOptIn(address user, bool enabled);
|
||||
|
||||
/**
|
||||
* @dev Enables / disables verification mechanism for caller.
|
||||
* @param enabled - True if caller verification shall be enabled, false otherwise.
|
||||
*/
|
||||
function setOnlyCallerCheck(bool enabled) external;
|
||||
|
||||
function setOnlyCallerCheckWithSignature(
|
||||
address user,
|
||||
bool enabled,
|
||||
bytes memory signature
|
||||
) external;
|
||||
|
||||
/**
|
||||
* @dev Returns true if caller verification is enabled for the given user, false otherwise.
|
||||
*/
|
||||
function isOnlyCallerEnabled(address user) external view returns (bool);
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface for the SignatureValidator helper, used to support meta-transactions.
|
||||
*/
|
||||
interface ISignaturesValidator {
|
||||
/**
|
||||
* @dev Returns the EIP712 domain separator.
|
||||
*/
|
||||
function getDomainSeparator() external view returns (bytes32);
|
||||
|
||||
/**
|
||||
* @dev Returns the next nonce used by an address to sign messages.
|
||||
*/
|
||||
function getNextNonce(address user) external view returns (uint256);
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface for the TemporarilyPausable helper.
|
||||
*/
|
||||
interface ITemporarilyPausable {
|
||||
/**
|
||||
* @dev Emitted every time the pause state changes by `_setPaused`.
|
||||
*/
|
||||
event PausedStateChanged(bool paused);
|
||||
|
||||
/**
|
||||
* @dev Returns the current paused state.
|
||||
*/
|
||||
function getPausedState()
|
||||
external
|
||||
view
|
||||
returns (
|
||||
bool paused,
|
||||
uint256 pauseWindowEndTime,
|
||||
uint256 bufferPeriodEndTime
|
||||
);
|
||||
}
|
||||
@@ -0,0 +1,72 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
import "../openzeppelin/IERC20.sol";
|
||||
|
||||
interface IERC4626 is IERC20 {
|
||||
/**
|
||||
* @dev `caller` has exchanged `assets` for `shares`, and transferred those `shares` to `owner`.
|
||||
*/
|
||||
event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);
|
||||
|
||||
/**
|
||||
* @dev `caller` has exchanged `shares`, owned by `owner`, for `assets`,
|
||||
* and transferred those `assets` to `receiver`.
|
||||
*/
|
||||
event Withdraw(
|
||||
address indexed caller,
|
||||
address indexed receiver,
|
||||
address indexed owner,
|
||||
uint256 assets,
|
||||
uint256 shares
|
||||
);
|
||||
|
||||
/**
|
||||
* @dev Mints `shares` Vault shares to `receiver` by depositing exactly `amount` of underlying tokens.
|
||||
*/
|
||||
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
|
||||
|
||||
/**
|
||||
* @dev Burns exactly `shares` from `owner` and sends `assets` of underlying tokens to `receiver`.
|
||||
*/
|
||||
function redeem(
|
||||
uint256 shares,
|
||||
address receiver,
|
||||
address owner
|
||||
) external returns (uint256 assets);
|
||||
|
||||
/**
|
||||
* @dev The address of the underlying token that the Vault uses for accounting, depositing, and withdrawing.
|
||||
*/
|
||||
function asset() external view returns (address);
|
||||
|
||||
/**
|
||||
* @dev Total amount of the underlying asset that is “managed” by Vault.
|
||||
*/
|
||||
function totalAssets() external view returns (uint256);
|
||||
|
||||
/**
|
||||
* @dev The amount of `assets` that the Vault would exchange for the amount
|
||||
* of `shares` provided, in an ideal scenario where all the conditions are met.
|
||||
*/
|
||||
function convertToAssets(uint256 shares) external view returns (uint256 assets);
|
||||
|
||||
/**
|
||||
* @dev The amount of `shares` that the Vault would exchange for the amount
|
||||
* of `assets` provided, in an ideal scenario where all the conditions are met.
|
||||
*/
|
||||
function convertToShares(uint256 assets) external view returns (uint256 shares);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
// This program is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
import "../openzeppelin/IERC20.sol";
|
||||
|
||||
/**
|
||||
* @dev Interface for WETH9.
|
||||
* See https://github.com/gnosis/canonical-weth/blob/0dd1ea3e295eef916d0c6223ec63141137d22d67/contracts/WETH9.sol
|
||||
*/
|
||||
interface IWETH is IERC20 {
|
||||
function deposit() external payable;
|
||||
|
||||
function withdraw(uint256 amount) external;
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1271.sol)
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface of the ERC1271 standard signature validation method for
|
||||
* contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].
|
||||
*
|
||||
* _Available since v4.1._
|
||||
*/
|
||||
interface IERC1271 {
|
||||
/**
|
||||
* @dev Should return whether the signature provided is valid for the provided data
|
||||
* @param hash Hash of the data to be signed
|
||||
* @param signature Signature byte array associated with _data
|
||||
*/
|
||||
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface of the ERC20 standard as defined in the EIP.
|
||||
*/
|
||||
interface IERC20 {
|
||||
/**
|
||||
* @dev Returns the amount of tokens in existence.
|
||||
*/
|
||||
function totalSupply() external view returns (uint256);
|
||||
|
||||
/**
|
||||
* @dev Returns the amount of tokens owned by `account`.
|
||||
*/
|
||||
function balanceOf(address account) external view returns (uint256);
|
||||
|
||||
/**
|
||||
* @dev Moves `amount` tokens from the caller's account to `recipient`.
|
||||
*
|
||||
* Returns a boolean value indicating whether the operation succeeded.
|
||||
*
|
||||
* Emits a {Transfer} event.
|
||||
*/
|
||||
function transfer(address recipient, uint256 amount) external returns (bool);
|
||||
|
||||
/**
|
||||
* @dev Returns the remaining number of tokens that `spender` will be
|
||||
* allowed to spend on behalf of `owner` through {transferFrom}. This is
|
||||
* zero by default.
|
||||
*
|
||||
* This value changes when {approve} or {transferFrom} are called.
|
||||
*/
|
||||
function allowance(address owner, address spender) external view returns (uint256);
|
||||
|
||||
/**
|
||||
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
|
||||
*
|
||||
* Returns a boolean value indicating whether the operation succeeded.
|
||||
*
|
||||
* IMPORTANT: Beware that changing an allowance with this method brings the risk
|
||||
* that someone may use both the old and the new allowance by unfortunate
|
||||
* transaction ordering. One possible solution to mitigate this race
|
||||
* condition is to first reduce the spender's allowance to 0 and set the
|
||||
* desired value afterwards:
|
||||
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
|
||||
*
|
||||
* Emits an {Approval} event.
|
||||
*/
|
||||
function approve(address spender, uint256 amount) external returns (bool);
|
||||
|
||||
/**
|
||||
* @dev Moves `amount` tokens from `sender` to `recipient` using the
|
||||
* allowance mechanism. `amount` is then deducted from the caller's
|
||||
* allowance.
|
||||
*
|
||||
* Returns a boolean value indicating whether the operation succeeded.
|
||||
*
|
||||
* Emits a {Transfer} event.
|
||||
*/
|
||||
function transferFrom(
|
||||
address sender,
|
||||
address recipient,
|
||||
uint256 amount
|
||||
) external returns (bool);
|
||||
|
||||
/**
|
||||
* @dev Emitted when `value` tokens are moved from one account (`from`) to
|
||||
* another (`to`).
|
||||
*
|
||||
* Note that `value` may be zero.
|
||||
*/
|
||||
event Transfer(address indexed from, address indexed to, uint256 value);
|
||||
|
||||
/**
|
||||
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
|
||||
* a call to {approve}. `value` is the new allowance.
|
||||
*/
|
||||
event Approval(address indexed owner, address indexed spender, uint256 value);
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
/**
|
||||
* @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
|
||||
* https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
|
||||
*
|
||||
* Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
|
||||
* presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't
|
||||
* need to send a transaction, and thus is not required to hold Ether at all.
|
||||
*/
|
||||
interface IERC20Permit {
|
||||
/**
|
||||
* @dev Sets `value` as the allowance of `spender` over `owner`'s tokens,
|
||||
* given `owner`'s signed approval.
|
||||
*
|
||||
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
|
||||
* ordering also apply here.
|
||||
*
|
||||
* Emits an {Approval} event.
|
||||
*
|
||||
* Requirements:
|
||||
*
|
||||
* - `spender` cannot be the zero address.
|
||||
* - `deadline` must be a timestamp in the future.
|
||||
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
|
||||
* over the EIP712-formatted function arguments.
|
||||
* - the signature must use ``owner``'s current nonce (see {nonces}).
|
||||
*
|
||||
* For more information on the signature format, see the
|
||||
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
|
||||
* section].
|
||||
*/
|
||||
function permit(
|
||||
address owner,
|
||||
address spender,
|
||||
uint256 value,
|
||||
uint256 deadline,
|
||||
uint8 v,
|
||||
bytes32 r,
|
||||
bytes32 s
|
||||
) external;
|
||||
|
||||
/**
|
||||
* @dev Returns the current nonce for `owner`. This value must be
|
||||
* included whenever a signature is generated for {permit}.
|
||||
*
|
||||
* Every successful call to {permit} increases ``owner``'s nonce by one. This
|
||||
* prevents a signature from being used multiple times.
|
||||
*/
|
||||
function nonces(address owner) external view returns (uint256);
|
||||
|
||||
/**
|
||||
* @dev Returns the domain separator used in the encoding of the signature for `permit`, as defined by {EIP712}.
|
||||
*/
|
||||
// solhint-disable-next-line func-name-mixedcase
|
||||
function DOMAIN_SEPARATOR() external view returns (bytes32);
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
// SPDX-License-Identifier: MIT
|
||||
|
||||
pragma solidity >=0.7.0 <0.9.0;
|
||||
|
||||
interface IERC20PermitDAI {
|
||||
/**
|
||||
* @notice update allowance with a signed permit
|
||||
* @param holder Token owner's address (Authorizer)
|
||||
* @param spender Spender's address
|
||||
* @param nonce The permit nonce
|
||||
* @param expiry The time at which this expires (unix time)
|
||||
* @param allowed Whether the spender is allowed or disallowed from spending
|
||||
* @param v v of the signature
|
||||
* @param r r of the signature
|
||||
* @param s s of the signature
|
||||
*/
|
||||
function permit(
|
||||
address holder,
|
||||
address spender,
|
||||
uint256 nonce,
|
||||
uint256 expiry,
|
||||
bool allowed,
|
||||
uint8 v,
|
||||
bytes32 r,
|
||||
bytes32 s
|
||||
) external;
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2020 zOS Global Limited
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
@@ -0,0 +1,11 @@
|
||||
## Ports from OpenZeppelin Contracts
|
||||
|
||||
Files in this directory are based on the [OpenZeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts) library, and as such are licensed under the MIT License: see [LICENSE](./LICENSE).
|
||||
|
||||
Most of the modifications fall under one of these categories:
|
||||
|
||||
- removal of functions unused in Balancer V2 source code
|
||||
- replacement of `require` statements with the `_require` function from the `BalancerErrors.sol` contract
|
||||
- modification or addition of functionality to reduce bytecode size (see `ReentrancyGuard.sol`) or gas usage (see `EnumerableSet`, `EnumerableMap` or `SafeERC20`)
|
||||
|
||||
Non-trivial modifications in this last category have associated source code comments that explain the changes and motivation.
|
||||
Reference in New Issue
Block a user