More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
54395211 | 1 min ago | 0.111486 AVAX | ||||
54395211 | 1 min ago | 0.111486 AVAX | ||||
54395137 | 3 mins ago | 0.10435611 AVAX | ||||
54395137 | 3 mins ago | 0.10435611 AVAX | ||||
54395095 | 5 mins ago | 0.13250856 AVAX | ||||
54395095 | 5 mins ago | 0.13250856 AVAX | ||||
54395094 | 5 mins ago | 0.13418253 AVAX | ||||
54395094 | 5 mins ago | 0.13418253 AVAX | ||||
54395048 | 7 mins ago | 0.1337337 AVAX | ||||
54395048 | 7 mins ago | 0.1337337 AVAX | ||||
54394979 | 9 mins ago | 0.11398104 AVAX | ||||
54394979 | 9 mins ago | 0.11398104 AVAX | ||||
54394807 | 15 mins ago | 0.11349186 AVAX | ||||
54394807 | 15 mins ago | 0.11349186 AVAX | ||||
54394782 | 16 mins ago | 0.11395575 AVAX | ||||
54394782 | 16 mins ago | 0.11395575 AVAX | ||||
54394709 | 18 mins ago | 0.13259217 AVAX | ||||
54394709 | 18 mins ago | 0.13259217 AVAX | ||||
54394597 | 22 mins ago | 0.11392059 AVAX | ||||
54394597 | 22 mins ago | 0.11392059 AVAX | ||||
54394510 | 25 mins ago | 0.11742714 AVAX | ||||
54394510 | 25 mins ago | 0.11742714 AVAX | ||||
54394479 | 26 mins ago | 0.14588739 AVAX | ||||
54394479 | 26 mins ago | 0.14588739 AVAX | ||||
54394462 | 27 mins ago | 0.13280475 AVAX |
Loading...
Loading
Contract Name:
OrderVault
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 10 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "../bank/StrictBank.sol"; // @title OrderVault // @dev Vault for orders contract OrderVault is StrictBank { constructor(RoleStore _roleStore, DataStore _dataStore) StrictBank(_roleStore, _dataStore) {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/draft-IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/math/SafeCast.sol) pragma solidity ^0.8.0; /** * @dev Wrappers over Solidity's uintXX/intXX casting operators with added overflow * checks. * * Downcasting from uint256/int256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. * * Can be combined with {SafeMath} and {SignedSafeMath} to extend it to smaller types, by performing * all math on `uint256` and `int256` and then downcasting. */ library SafeCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toUint248(uint256 value) internal pure returns (uint248) { require(value <= type(uint248).max, "SafeCast: value doesn't fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toUint240(uint256 value) internal pure returns (uint240) { require(value <= type(uint240).max, "SafeCast: value doesn't fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toUint232(uint256 value) internal pure returns (uint232) { require(value <= type(uint232).max, "SafeCast: value doesn't fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.2._ */ function toUint224(uint256 value) internal pure returns (uint224) { require(value <= type(uint224).max, "SafeCast: value doesn't fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toUint216(uint256 value) internal pure returns (uint216) { require(value <= type(uint216).max, "SafeCast: value doesn't fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toUint208(uint256 value) internal pure returns (uint208) { require(value <= type(uint208).max, "SafeCast: value doesn't fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toUint200(uint256 value) internal pure returns (uint200) { require(value <= type(uint200).max, "SafeCast: value doesn't fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toUint192(uint256 value) internal pure returns (uint192) { require(value <= type(uint192).max, "SafeCast: value doesn't fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toUint184(uint256 value) internal pure returns (uint184) { require(value <= type(uint184).max, "SafeCast: value doesn't fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toUint176(uint256 value) internal pure returns (uint176) { require(value <= type(uint176).max, "SafeCast: value doesn't fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toUint168(uint256 value) internal pure returns (uint168) { require(value <= type(uint168).max, "SafeCast: value doesn't fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toUint160(uint256 value) internal pure returns (uint160) { require(value <= type(uint160).max, "SafeCast: value doesn't fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toUint152(uint256 value) internal pure returns (uint152) { require(value <= type(uint152).max, "SafeCast: value doesn't fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toUint144(uint256 value) internal pure returns (uint144) { require(value <= type(uint144).max, "SafeCast: value doesn't fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toUint136(uint256 value) internal pure returns (uint136) { require(value <= type(uint136).max, "SafeCast: value doesn't fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v2.5._ */ function toUint128(uint256 value) internal pure returns (uint128) { require(value <= type(uint128).max, "SafeCast: value doesn't fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toUint120(uint256 value) internal pure returns (uint120) { require(value <= type(uint120).max, "SafeCast: value doesn't fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toUint112(uint256 value) internal pure returns (uint112) { require(value <= type(uint112).max, "SafeCast: value doesn't fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toUint104(uint256 value) internal pure returns (uint104) { require(value <= type(uint104).max, "SafeCast: value doesn't fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.2._ */ function toUint96(uint256 value) internal pure returns (uint96) { require(value <= type(uint96).max, "SafeCast: value doesn't fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toUint88(uint256 value) internal pure returns (uint88) { require(value <= type(uint88).max, "SafeCast: value doesn't fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toUint80(uint256 value) internal pure returns (uint80) { require(value <= type(uint80).max, "SafeCast: value doesn't fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint72 from uint256, reverting on * overflow (when the input is greater than largest uint72). * * Counterpart to Solidity's `uint72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toUint72(uint256 value) internal pure returns (uint72) { require(value <= type(uint72).max, "SafeCast: value doesn't fit in 72 bits"); return uint72(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v2.5._ */ function toUint64(uint256 value) internal pure returns (uint64) { require(value <= type(uint64).max, "SafeCast: value doesn't fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toUint56(uint256 value) internal pure returns (uint56) { require(value <= type(uint56).max, "SafeCast: value doesn't fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toUint48(uint256 value) internal pure returns (uint48) { require(value <= type(uint48).max, "SafeCast: value doesn't fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toUint40(uint256 value) internal pure returns (uint40) { require(value <= type(uint40).max, "SafeCast: value doesn't fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v2.5._ */ function toUint32(uint256 value) internal pure returns (uint32) { require(value <= type(uint32).max, "SafeCast: value doesn't fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toUint24(uint256 value) internal pure returns (uint24) { require(value <= type(uint24).max, "SafeCast: value doesn't fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v2.5._ */ function toUint16(uint256 value) internal pure returns (uint16) { require(value <= type(uint16).max, "SafeCast: value doesn't fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v2.5._ */ function toUint8(uint256 value) internal pure returns (uint8) { require(value <= type(uint8).max, "SafeCast: value doesn't fit in 8 bits"); return uint8(value); } /** * @dev Converts a signed int256 into an unsigned uint256. * * Requirements: * * - input must be greater than or equal to 0. * * _Available since v3.0._ */ function toUint256(int256 value) internal pure returns (uint256) { require(value >= 0, "SafeCast: value must be positive"); return uint256(value); } /** * @dev Returns the downcasted int248 from int256, reverting on * overflow (when the input is less than smallest int248 or * greater than largest int248). * * Counterpart to Solidity's `int248` operator. * * Requirements: * * - input must fit into 248 bits * * _Available since v4.7._ */ function toInt248(int256 value) internal pure returns (int248) { require(value >= type(int248).min && value <= type(int248).max, "SafeCast: value doesn't fit in 248 bits"); return int248(value); } /** * @dev Returns the downcasted int240 from int256, reverting on * overflow (when the input is less than smallest int240 or * greater than largest int240). * * Counterpart to Solidity's `int240` operator. * * Requirements: * * - input must fit into 240 bits * * _Available since v4.7._ */ function toInt240(int256 value) internal pure returns (int240) { require(value >= type(int240).min && value <= type(int240).max, "SafeCast: value doesn't fit in 240 bits"); return int240(value); } /** * @dev Returns the downcasted int232 from int256, reverting on * overflow (when the input is less than smallest int232 or * greater than largest int232). * * Counterpart to Solidity's `int232` operator. * * Requirements: * * - input must fit into 232 bits * * _Available since v4.7._ */ function toInt232(int256 value) internal pure returns (int232) { require(value >= type(int232).min && value <= type(int232).max, "SafeCast: value doesn't fit in 232 bits"); return int232(value); } /** * @dev Returns the downcasted int224 from int256, reverting on * overflow (when the input is less than smallest int224 or * greater than largest int224). * * Counterpart to Solidity's `int224` operator. * * Requirements: * * - input must fit into 224 bits * * _Available since v4.7._ */ function toInt224(int256 value) internal pure returns (int224) { require(value >= type(int224).min && value <= type(int224).max, "SafeCast: value doesn't fit in 224 bits"); return int224(value); } /** * @dev Returns the downcasted int216 from int256, reverting on * overflow (when the input is less than smallest int216 or * greater than largest int216). * * Counterpart to Solidity's `int216` operator. * * Requirements: * * - input must fit into 216 bits * * _Available since v4.7._ */ function toInt216(int256 value) internal pure returns (int216) { require(value >= type(int216).min && value <= type(int216).max, "SafeCast: value doesn't fit in 216 bits"); return int216(value); } /** * @dev Returns the downcasted int208 from int256, reverting on * overflow (when the input is less than smallest int208 or * greater than largest int208). * * Counterpart to Solidity's `int208` operator. * * Requirements: * * - input must fit into 208 bits * * _Available since v4.7._ */ function toInt208(int256 value) internal pure returns (int208) { require(value >= type(int208).min && value <= type(int208).max, "SafeCast: value doesn't fit in 208 bits"); return int208(value); } /** * @dev Returns the downcasted int200 from int256, reverting on * overflow (when the input is less than smallest int200 or * greater than largest int200). * * Counterpart to Solidity's `int200` operator. * * Requirements: * * - input must fit into 200 bits * * _Available since v4.7._ */ function toInt200(int256 value) internal pure returns (int200) { require(value >= type(int200).min && value <= type(int200).max, "SafeCast: value doesn't fit in 200 bits"); return int200(value); } /** * @dev Returns the downcasted int192 from int256, reverting on * overflow (when the input is less than smallest int192 or * greater than largest int192). * * Counterpart to Solidity's `int192` operator. * * Requirements: * * - input must fit into 192 bits * * _Available since v4.7._ */ function toInt192(int256 value) internal pure returns (int192) { require(value >= type(int192).min && value <= type(int192).max, "SafeCast: value doesn't fit in 192 bits"); return int192(value); } /** * @dev Returns the downcasted int184 from int256, reverting on * overflow (when the input is less than smallest int184 or * greater than largest int184). * * Counterpart to Solidity's `int184` operator. * * Requirements: * * - input must fit into 184 bits * * _Available since v4.7._ */ function toInt184(int256 value) internal pure returns (int184) { require(value >= type(int184).min && value <= type(int184).max, "SafeCast: value doesn't fit in 184 bits"); return int184(value); } /** * @dev Returns the downcasted int176 from int256, reverting on * overflow (when the input is less than smallest int176 or * greater than largest int176). * * Counterpart to Solidity's `int176` operator. * * Requirements: * * - input must fit into 176 bits * * _Available since v4.7._ */ function toInt176(int256 value) internal pure returns (int176) { require(value >= type(int176).min && value <= type(int176).max, "SafeCast: value doesn't fit in 176 bits"); return int176(value); } /** * @dev Returns the downcasted int168 from int256, reverting on * overflow (when the input is less than smallest int168 or * greater than largest int168). * * Counterpart to Solidity's `int168` operator. * * Requirements: * * - input must fit into 168 bits * * _Available since v4.7._ */ function toInt168(int256 value) internal pure returns (int168) { require(value >= type(int168).min && value <= type(int168).max, "SafeCast: value doesn't fit in 168 bits"); return int168(value); } /** * @dev Returns the downcasted int160 from int256, reverting on * overflow (when the input is less than smallest int160 or * greater than largest int160). * * Counterpart to Solidity's `int160` operator. * * Requirements: * * - input must fit into 160 bits * * _Available since v4.7._ */ function toInt160(int256 value) internal pure returns (int160) { require(value >= type(int160).min && value <= type(int160).max, "SafeCast: value doesn't fit in 160 bits"); return int160(value); } /** * @dev Returns the downcasted int152 from int256, reverting on * overflow (when the input is less than smallest int152 or * greater than largest int152). * * Counterpart to Solidity's `int152` operator. * * Requirements: * * - input must fit into 152 bits * * _Available since v4.7._ */ function toInt152(int256 value) internal pure returns (int152) { require(value >= type(int152).min && value <= type(int152).max, "SafeCast: value doesn't fit in 152 bits"); return int152(value); } /** * @dev Returns the downcasted int144 from int256, reverting on * overflow (when the input is less than smallest int144 or * greater than largest int144). * * Counterpart to Solidity's `int144` operator. * * Requirements: * * - input must fit into 144 bits * * _Available since v4.7._ */ function toInt144(int256 value) internal pure returns (int144) { require(value >= type(int144).min && value <= type(int144).max, "SafeCast: value doesn't fit in 144 bits"); return int144(value); } /** * @dev Returns the downcasted int136 from int256, reverting on * overflow (when the input is less than smallest int136 or * greater than largest int136). * * Counterpart to Solidity's `int136` operator. * * Requirements: * * - input must fit into 136 bits * * _Available since v4.7._ */ function toInt136(int256 value) internal pure returns (int136) { require(value >= type(int136).min && value <= type(int136).max, "SafeCast: value doesn't fit in 136 bits"); return int136(value); } /** * @dev Returns the downcasted int128 from int256, reverting on * overflow (when the input is less than smallest int128 or * greater than largest int128). * * Counterpart to Solidity's `int128` operator. * * Requirements: * * - input must fit into 128 bits * * _Available since v3.1._ */ function toInt128(int256 value) internal pure returns (int128) { require(value >= type(int128).min && value <= type(int128).max, "SafeCast: value doesn't fit in 128 bits"); return int128(value); } /** * @dev Returns the downcasted int120 from int256, reverting on * overflow (when the input is less than smallest int120 or * greater than largest int120). * * Counterpart to Solidity's `int120` operator. * * Requirements: * * - input must fit into 120 bits * * _Available since v4.7._ */ function toInt120(int256 value) internal pure returns (int120) { require(value >= type(int120).min && value <= type(int120).max, "SafeCast: value doesn't fit in 120 bits"); return int120(value); } /** * @dev Returns the downcasted int112 from int256, reverting on * overflow (when the input is less than smallest int112 or * greater than largest int112). * * Counterpart to Solidity's `int112` operator. * * Requirements: * * - input must fit into 112 bits * * _Available since v4.7._ */ function toInt112(int256 value) internal pure returns (int112) { require(value >= type(int112).min && value <= type(int112).max, "SafeCast: value doesn't fit in 112 bits"); return int112(value); } /** * @dev Returns the downcasted int104 from int256, reverting on * overflow (when the input is less than smallest int104 or * greater than largest int104). * * Counterpart to Solidity's `int104` operator. * * Requirements: * * - input must fit into 104 bits * * _Available since v4.7._ */ function toInt104(int256 value) internal pure returns (int104) { require(value >= type(int104).min && value <= type(int104).max, "SafeCast: value doesn't fit in 104 bits"); return int104(value); } /** * @dev Returns the downcasted int96 from int256, reverting on * overflow (when the input is less than smallest int96 or * greater than largest int96). * * Counterpart to Solidity's `int96` operator. * * Requirements: * * - input must fit into 96 bits * * _Available since v4.7._ */ function toInt96(int256 value) internal pure returns (int96) { require(value >= type(int96).min && value <= type(int96).max, "SafeCast: value doesn't fit in 96 bits"); return int96(value); } /** * @dev Returns the downcasted int88 from int256, reverting on * overflow (when the input is less than smallest int88 or * greater than largest int88). * * Counterpart to Solidity's `int88` operator. * * Requirements: * * - input must fit into 88 bits * * _Available since v4.7._ */ function toInt88(int256 value) internal pure returns (int88) { require(value >= type(int88).min && value <= type(int88).max, "SafeCast: value doesn't fit in 88 bits"); return int88(value); } /** * @dev Returns the downcasted int80 from int256, reverting on * overflow (when the input is less than smallest int80 or * greater than largest int80). * * Counterpart to Solidity's `int80` operator. * * Requirements: * * - input must fit into 80 bits * * _Available since v4.7._ */ function toInt80(int256 value) internal pure returns (int80) { require(value >= type(int80).min && value <= type(int80).max, "SafeCast: value doesn't fit in 80 bits"); return int80(value); } /** * @dev Returns the downcasted int72 from int256, reverting on * overflow (when the input is less than smallest int72 or * greater than largest int72). * * Counterpart to Solidity's `int72` operator. * * Requirements: * * - input must fit into 72 bits * * _Available since v4.7._ */ function toInt72(int256 value) internal pure returns (int72) { require(value >= type(int72).min && value <= type(int72).max, "SafeCast: value doesn't fit in 72 bits"); return int72(value); } /** * @dev Returns the downcasted int64 from int256, reverting on * overflow (when the input is less than smallest int64 or * greater than largest int64). * * Counterpart to Solidity's `int64` operator. * * Requirements: * * - input must fit into 64 bits * * _Available since v3.1._ */ function toInt64(int256 value) internal pure returns (int64) { require(value >= type(int64).min && value <= type(int64).max, "SafeCast: value doesn't fit in 64 bits"); return int64(value); } /** * @dev Returns the downcasted int56 from int256, reverting on * overflow (when the input is less than smallest int56 or * greater than largest int56). * * Counterpart to Solidity's `int56` operator. * * Requirements: * * - input must fit into 56 bits * * _Available since v4.7._ */ function toInt56(int256 value) internal pure returns (int56) { require(value >= type(int56).min && value <= type(int56).max, "SafeCast: value doesn't fit in 56 bits"); return int56(value); } /** * @dev Returns the downcasted int48 from int256, reverting on * overflow (when the input is less than smallest int48 or * greater than largest int48). * * Counterpart to Solidity's `int48` operator. * * Requirements: * * - input must fit into 48 bits * * _Available since v4.7._ */ function toInt48(int256 value) internal pure returns (int48) { require(value >= type(int48).min && value <= type(int48).max, "SafeCast: value doesn't fit in 48 bits"); return int48(value); } /** * @dev Returns the downcasted int40 from int256, reverting on * overflow (when the input is less than smallest int40 or * greater than largest int40). * * Counterpart to Solidity's `int40` operator. * * Requirements: * * - input must fit into 40 bits * * _Available since v4.7._ */ function toInt40(int256 value) internal pure returns (int40) { require(value >= type(int40).min && value <= type(int40).max, "SafeCast: value doesn't fit in 40 bits"); return int40(value); } /** * @dev Returns the downcasted int32 from int256, reverting on * overflow (when the input is less than smallest int32 or * greater than largest int32). * * Counterpart to Solidity's `int32` operator. * * Requirements: * * - input must fit into 32 bits * * _Available since v3.1._ */ function toInt32(int256 value) internal pure returns (int32) { require(value >= type(int32).min && value <= type(int32).max, "SafeCast: value doesn't fit in 32 bits"); return int32(value); } /** * @dev Returns the downcasted int24 from int256, reverting on * overflow (when the input is less than smallest int24 or * greater than largest int24). * * Counterpart to Solidity's `int24` operator. * * Requirements: * * - input must fit into 24 bits * * _Available since v4.7._ */ function toInt24(int256 value) internal pure returns (int24) { require(value >= type(int24).min && value <= type(int24).max, "SafeCast: value doesn't fit in 24 bits"); return int24(value); } /** * @dev Returns the downcasted int16 from int256, reverting on * overflow (when the input is less than smallest int16 or * greater than largest int16). * * Counterpart to Solidity's `int16` operator. * * Requirements: * * - input must fit into 16 bits * * _Available since v3.1._ */ function toInt16(int256 value) internal pure returns (int16) { require(value >= type(int16).min && value <= type(int16).max, "SafeCast: value doesn't fit in 16 bits"); return int16(value); } /** * @dev Returns the downcasted int8 from int256, reverting on * overflow (when the input is less than smallest int8 or * greater than largest int8). * * Counterpart to Solidity's `int8` operator. * * Requirements: * * - input must fit into 8 bits * * _Available since v3.1._ */ function toInt8(int256 value) internal pure returns (int8) { require(value >= type(int8).min && value <= type(int8).max, "SafeCast: value doesn't fit in 8 bits"); return int8(value); } /** * @dev Converts an unsigned uint256 into a signed int256. * * Requirements: * * - input must be less than or equal to maxInt256. * * _Available since v3.0._ */ function toInt256(uint256 value) internal pure returns (int256) { // Note: Unsafe cast below is okay because `type(int256).max` is guaranteed to be positive require(value <= uint256(type(int256).max), "SafeCast: value doesn't fit in an int256"); return int256(value); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/structs/EnumerableSet.sol) pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../token/TokenUtils.sol"; import "../role/RoleModule.sol"; // @title Bank // @dev Contract to handle storing and transferring of tokens contract Bank is RoleModule { using SafeERC20 for IERC20; DataStore public immutable dataStore; constructor(RoleStore _roleStore, DataStore _dataStore) RoleModule(_roleStore) { dataStore = _dataStore; } receive() external payable { address wnt = TokenUtils.wnt(dataStore); if (msg.sender != wnt) { revert Errors.InvalidNativeTokenSender(msg.sender); } } // @dev transfer tokens from this contract to a receiver // // @param token the token to transfer // @param amount the amount to transfer // @param receiver the address to transfer to function transferOut( address token, address receiver, uint256 amount ) external onlyController { _transferOut(token, receiver, amount); } // @dev transfer tokens from this contract to a receiver // handles native token transfers as well // // @param token the token to transfer // @param amount the amount to transfer // @param receiver the address to transfer to // @param shouldUnwrapNativeToken whether to unwrap the wrapped native token // before transferring function transferOut( address token, address receiver, uint256 amount, bool shouldUnwrapNativeToken ) external onlyController { address wnt = TokenUtils.wnt(dataStore); if (token == wnt && shouldUnwrapNativeToken) { _transferOutNativeToken(token, receiver, amount); } else { _transferOut(token, receiver, amount); } } // @dev transfer native tokens from this contract to a receiver // // @param token the token to transfer // @param amount the amount to transfer // @param receiver the address to transfer to // @param shouldUnwrapNativeToken whether to unwrap the wrapped native token // before transferring function transferOutNativeToken( address receiver, uint256 amount ) external onlyController { address wnt = TokenUtils.wnt(dataStore); _transferOutNativeToken(wnt, receiver, amount); } // @dev transfer tokens from this contract to a receiver // // @param token the token to transfer // @param amount the amount to transfer // @param receiver the address to transfer to function _transferOut( address token, address receiver, uint256 amount ) internal { if (receiver == address(this)) { revert Errors.SelfTransferNotSupported(receiver); } TokenUtils.transfer(dataStore, token, receiver, amount); _afterTransferOut(token); } // @dev unwrap wrapped native tokens and transfer the native tokens from // this contract to a receiver // // @param token the token to transfer // @param amount the amount to transfer // @param receiver the address to transfer to function _transferOutNativeToken( address token, address receiver, uint256 amount ) internal { if (receiver == address(this)) { revert Errors.SelfTransferNotSupported(receiver); } TokenUtils.withdrawAndSendNativeToken( dataStore, token, receiver, amount ); _afterTransferOut(token); } function _afterTransferOut(address /* token */) internal virtual {} }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./Bank.sol"; // @title StrictBank // @dev a stricter version of Bank // // the Bank contract does not have functions to validate the amount of tokens // transferred in // the Bank contract will mainly assume that safeTransferFrom calls work correctly // and that tokens were transferred into it if there was no revert // // the StrictBank contract keeps track of its internal token balance // and uses recordTransferIn to compare its change in balance and return // the amount of tokens received contract StrictBank is Bank { using SafeERC20 for IERC20; // used to record token balances to evaluate amounts transferred in mapping (address => uint256) public tokenBalances; constructor(RoleStore _roleStore, DataStore _dataStore) Bank(_roleStore, _dataStore) {} // @dev records a token transfer into the contract // @param token the token to record the transfer for // @return the amount of tokens transferred in function recordTransferIn(address token) external onlyController returns (uint256) { return _recordTransferIn(token); } // @dev this can be used to update the tokenBalances in case of token burns // or similar balance changes // the prevBalance is not validated to be more than the nextBalance as this // could allow someone to block this call by transferring into the contract // @param token the token to record the burn for // @return the new balance function syncTokenBalance(address token) external onlyController returns (uint256) { uint256 nextBalance = IERC20(token).balanceOf(address(this)); tokenBalances[token] = nextBalance; return nextBalance; } // @dev records a token transfer into the contract // @param token the token to record the transfer for // @return the amount of tokens transferred in function _recordTransferIn(address token) internal returns (uint256) { uint256 prevBalance = tokenBalances[token]; uint256 nextBalance = IERC20(token).balanceOf(address(this)); tokenBalances[token] = nextBalance; return nextBalance - prevBalance; } // @dev update the internal balance after tokens have been transferred out // this is called from the Bank contract // @param token the token that was transferred out function _afterTransferOut(address token) internal override { tokenBalances[token] = IERC20(token).balanceOf(address(this)); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "../role/RoleModule.sol"; import "../utils/Calc.sol"; import "../utils/Printer.sol"; // @title DataStore // @dev DataStore for all general state values contract DataStore is RoleModule { using SafeCast for int256; using EnumerableSet for EnumerableSet.Bytes32Set; using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.UintSet; using EnumerableValues for EnumerableSet.Bytes32Set; using EnumerableValues for EnumerableSet.AddressSet; using EnumerableValues for EnumerableSet.UintSet; // store for uint values mapping(bytes32 => uint256) public uintValues; // store for int values mapping(bytes32 => int256) public intValues; // store for address values mapping(bytes32 => address) public addressValues; // store for bool values mapping(bytes32 => bool) public boolValues; // store for string values mapping(bytes32 => string) public stringValues; // store for bytes32 values mapping(bytes32 => bytes32) public bytes32Values; // store for uint[] values mapping(bytes32 => uint256[]) public uintArrayValues; // store for int[] values mapping(bytes32 => int256[]) public intArrayValues; // store for address[] values mapping(bytes32 => address[]) public addressArrayValues; // store for bool[] values mapping(bytes32 => bool[]) public boolArrayValues; // store for string[] values mapping(bytes32 => string[]) public stringArrayValues; // store for bytes32[] values mapping(bytes32 => bytes32[]) public bytes32ArrayValues; // store for bytes32 sets mapping(bytes32 => EnumerableSet.Bytes32Set) internal bytes32Sets; // store for address sets mapping(bytes32 => EnumerableSet.AddressSet) internal addressSets; // store for uint256 sets mapping(bytes32 => EnumerableSet.UintSet) internal uintSets; constructor(RoleStore _roleStore) RoleModule(_roleStore) {} // @dev get the uint value for the given key // @param key the key of the value // @return the uint value for the key function getUint(bytes32 key) external view returns (uint256) { return uintValues[key]; } // @dev set the uint value for the given key // @param key the key of the value // @param value the value to set // @return the uint value for the key function setUint(bytes32 key, uint256 value) external onlyController returns (uint256) { uintValues[key] = value; return value; } // @dev delete the uint value for the given key // @param key the key of the value function removeUint(bytes32 key) external onlyController { delete uintValues[key]; } // @dev add the input int value to the existing uint value // @param key the key of the value // @param value the input int value // @return the new uint value function applyDeltaToUint(bytes32 key, int256 value, string memory errorMessage) external onlyController returns (uint256) { uint256 currValue = uintValues[key]; if (value < 0 && (-value).toUint256() > currValue) { revert(errorMessage); } uint256 nextUint = Calc.sumReturnUint256(currValue, value); uintValues[key] = nextUint; return nextUint; } // @dev add the input uint value to the existing uint value // @param key the key of the value // @param value the input int value // @return the new uint value function applyDeltaToUint(bytes32 key, uint256 value) external onlyController returns (uint256) { uint256 currValue = uintValues[key]; uint256 nextUint = currValue + value; uintValues[key] = nextUint; return nextUint; } // @dev add the input int value to the existing uint value, prevent the uint // value from becoming negative // @param key the key of the value // @param value the input int value // @return the new uint value function applyBoundedDeltaToUint(bytes32 key, int256 value) external onlyController returns (uint256) { uint256 uintValue = uintValues[key]; if (value < 0 && (-value).toUint256() > uintValue) { uintValues[key] = 0; return 0; } uint256 nextUint = Calc.sumReturnUint256(uintValue, value); uintValues[key] = nextUint; return nextUint; } // @dev add the input uint value to the existing uint value // @param key the key of the value // @param value the input uint value // @return the new uint value function incrementUint(bytes32 key, uint256 value) external onlyController returns (uint256) { uint256 nextUint = uintValues[key] + value; uintValues[key] = nextUint; return nextUint; } // @dev subtract the input uint value from the existing uint value // @param key the key of the value // @param value the input uint value // @return the new uint value function decrementUint(bytes32 key, uint256 value) external onlyController returns (uint256) { uint256 nextUint = uintValues[key] - value; uintValues[key] = nextUint; return nextUint; } // @dev get the int value for the given key // @param key the key of the value // @return the int value for the key function getInt(bytes32 key) external view returns (int256) { return intValues[key]; } // @dev set the int value for the given key // @param key the key of the value // @param value the value to set // @return the int value for the key function setInt(bytes32 key, int256 value) external onlyController returns (int256) { intValues[key] = value; return value; } function removeInt(bytes32 key) external onlyController { delete intValues[key]; } // @dev add the input int value to the existing int value // @param key the key of the value // @param value the input int value // @return the new int value function applyDeltaToInt(bytes32 key, int256 value) external onlyController returns (int256) { int256 nextInt = intValues[key] + value; intValues[key] = nextInt; return nextInt; } // @dev add the input int value to the existing int value // @param key the key of the value // @param value the input int value // @return the new int value function incrementInt(bytes32 key, int256 value) external onlyController returns (int256) { int256 nextInt = intValues[key] + value; intValues[key] = nextInt; return nextInt; } // @dev subtract the input int value from the existing int value // @param key the key of the value // @param value the input int value // @return the new int value function decrementInt(bytes32 key, int256 value) external onlyController returns (int256) { int256 nextInt = intValues[key] - value; intValues[key] = nextInt; return nextInt; } // @dev get the address value for the given key // @param key the key of the value // @return the address value for the key function getAddress(bytes32 key) external view returns (address) { return addressValues[key]; } // @dev set the address value for the given key // @param key the key of the value // @param value the value to set // @return the address value for the key function setAddress(bytes32 key, address value) external onlyController returns (address) { addressValues[key] = value; return value; } // @dev delete the address value for the given key // @param key the key of the value function removeAddress(bytes32 key) external onlyController { delete addressValues[key]; } // @dev get the bool value for the given key // @param key the key of the value // @return the bool value for the key function getBool(bytes32 key) external view returns (bool) { return boolValues[key]; } // @dev set the bool value for the given key // @param key the key of the value // @param value the value to set // @return the bool value for the key function setBool(bytes32 key, bool value) external onlyController returns (bool) { boolValues[key] = value; return value; } // @dev delete the bool value for the given key // @param key the key of the value function removeBool(bytes32 key) external onlyController { delete boolValues[key]; } // @dev get the string value for the given key // @param key the key of the value // @return the string value for the key function getString(bytes32 key) external view returns (string memory) { return stringValues[key]; } // @dev set the string value for the given key // @param key the key of the value // @param value the value to set // @return the string value for the key function setString(bytes32 key, string memory value) external onlyController returns (string memory) { stringValues[key] = value; return value; } // @dev delete the string value for the given key // @param key the key of the value function removeString(bytes32 key) external onlyController { delete stringValues[key]; } // @dev get the bytes32 value for the given key // @param key the key of the value // @return the bytes32 value for the key function getBytes32(bytes32 key) external view returns (bytes32) { return bytes32Values[key]; } // @dev set the bytes32 value for the given key // @param key the key of the value // @param value the value to set // @return the bytes32 value for the key function setBytes32(bytes32 key, bytes32 value) external onlyController returns (bytes32) { bytes32Values[key] = value; return value; } // @dev delete the bytes32 value for the given key // @param key the key of the value function removeBytes32(bytes32 key) external onlyController { delete bytes32Values[key]; } // @dev get the uint array for the given key // @param key the key of the uint array // @return the uint array for the key function getUintArray(bytes32 key) external view returns (uint256[] memory) { return uintArrayValues[key]; } // @dev set the uint array for the given key // @param key the key of the uint array // @param value the value of the uint array function setUintArray(bytes32 key, uint256[] memory value) external onlyController { uintArrayValues[key] = value; } // @dev delete the uint array for the given key // @param key the key of the uint array // @param value the value of the uint array function removeUintArray(bytes32 key) external onlyController { delete uintArrayValues[key]; } // @dev get the int array for the given key // @param key the key of the int array // @return the int array for the key function getIntArray(bytes32 key) external view returns (int256[] memory) { return intArrayValues[key]; } // @dev set the int array for the given key // @param key the key of the int array // @param value the value of the int array function setIntArray(bytes32 key, int256[] memory value) external onlyController { intArrayValues[key] = value; } // @dev delete the int array for the given key // @param key the key of the int array // @param value the value of the int array function removeIntArray(bytes32 key) external onlyController { delete intArrayValues[key]; } // @dev get the address array for the given key // @param key the key of the address array // @return the address array for the key function getAddressArray(bytes32 key) external view returns (address[] memory) { return addressArrayValues[key]; } // @dev set the address array for the given key // @param key the key of the address array // @param value the value of the address array function setAddressArray(bytes32 key, address[] memory value) external onlyController { addressArrayValues[key] = value; } // @dev delete the address array for the given key // @param key the key of the address array // @param value the value of the address array function removeAddressArray(bytes32 key) external onlyController { delete addressArrayValues[key]; } // @dev get the bool array for the given key // @param key the key of the bool array // @return the bool array for the key function getBoolArray(bytes32 key) external view returns (bool[] memory) { return boolArrayValues[key]; } // @dev set the bool array for the given key // @param key the key of the bool array // @param value the value of the bool array function setBoolArray(bytes32 key, bool[] memory value) external onlyController { boolArrayValues[key] = value; } // @dev delete the bool array for the given key // @param key the key of the bool array // @param value the value of the bool array function removeBoolArray(bytes32 key) external onlyController { delete boolArrayValues[key]; } // @dev get the string array for the given key // @param key the key of the string array // @return the string array for the key function getStringArray(bytes32 key) external view returns (string[] memory) { return stringArrayValues[key]; } // @dev set the string array for the given key // @param key the key of the string array // @param value the value of the string array function setStringArray(bytes32 key, string[] memory value) external onlyController { stringArrayValues[key] = value; } // @dev delete the string array for the given key // @param key the key of the string array // @param value the value of the string array function removeStringArray(bytes32 key) external onlyController { delete stringArrayValues[key]; } // @dev get the bytes32 array for the given key // @param key the key of the bytes32 array // @return the bytes32 array for the key function getBytes32Array(bytes32 key) external view returns (bytes32[] memory) { return bytes32ArrayValues[key]; } // @dev set the bytes32 array for the given key // @param key the key of the bytes32 array // @param value the value of the bytes32 array function setBytes32Array(bytes32 key, bytes32[] memory value) external onlyController { bytes32ArrayValues[key] = value; } // @dev delete the bytes32 array for the given key // @param key the key of the bytes32 array // @param value the value of the bytes32 array function removeBytes32Array(bytes32 key) external onlyController { delete bytes32ArrayValues[key]; } // @dev check whether the given value exists in the set // @param setKey the key of the set // @param value the value to check function containsBytes32(bytes32 setKey, bytes32 value) external view returns (bool) { return bytes32Sets[setKey].contains(value); } // @dev get the length of the set // @param setKey the key of the set function getBytes32Count(bytes32 setKey) external view returns (uint256) { return bytes32Sets[setKey].length(); } // @dev get the values of the set in the given range // @param setKey the key of the set // @param the start of the range, values at the start index will be returned // in the result // @param the end of the range, values at the end index will not be returned // in the result function getBytes32ValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (bytes32[] memory) { return bytes32Sets[setKey].valuesAt(start, end); } // @dev add the given value to the set // @param setKey the key of the set // @param value the value to add function addBytes32(bytes32 setKey, bytes32 value) external onlyController { bytes32Sets[setKey].add(value); } // @dev remove the given value from the set // @param setKey the key of the set // @param value the value to remove function removeBytes32(bytes32 setKey, bytes32 value) external onlyController { bytes32Sets[setKey].remove(value); } // @dev check whether the given value exists in the set // @param setKey the key of the set // @param value the value to check function containsAddress(bytes32 setKey, address value) external view returns (bool) { return addressSets[setKey].contains(value); } // @dev get the length of the set // @param setKey the key of the set function getAddressCount(bytes32 setKey) external view returns (uint256) { return addressSets[setKey].length(); } // @dev get the values of the set in the given range // @param setKey the key of the set // @param the start of the range, values at the start index will be returned // in the result // @param the end of the range, values at the end index will not be returned // in the result function getAddressValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (address[] memory) { return addressSets[setKey].valuesAt(start, end); } // @dev add the given value to the set // @param setKey the key of the set // @param value the value to add function addAddress(bytes32 setKey, address value) external onlyController { addressSets[setKey].add(value); } // @dev remove the given value from the set // @param setKey the key of the set // @param value the value to remove function removeAddress(bytes32 setKey, address value) external onlyController { addressSets[setKey].remove(value); } // @dev check whether the given value exists in the set // @param setKey the key of the set // @param value the value to check function containsUint(bytes32 setKey, uint256 value) external view returns (bool) { return uintSets[setKey].contains(value); } // @dev get the length of the set // @param setKey the key of the set function getUintCount(bytes32 setKey) external view returns (uint256) { return uintSets[setKey].length(); } // @dev get the values of the set in the given range // @param setKey the key of the set // @param the start of the range, values at the start index will be returned // in the result // @param the end of the range, values at the end index will not be returned // in the result function getUintValuesAt(bytes32 setKey, uint256 start, uint256 end) external view returns (uint256[] memory) { return uintSets[setKey].valuesAt(start, end); } // @dev add the given value to the set // @param setKey the key of the set // @param value the value to add function addUint(bytes32 setKey, uint256 value) external onlyController { uintSets[setKey].add(value); } // @dev remove the given value from the set // @param setKey the key of the set // @param value the value to remove function removeUint(bytes32 setKey, uint256 value) external onlyController { uintSets[setKey].remove(value); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; // @title Keys // @dev Keys for values in the DataStore library Keys { // @dev key for the address of the wrapped native token bytes32 public constant WNT = keccak256(abi.encode("WNT")); // @dev key for the nonce value used in NonceUtils bytes32 public constant NONCE = keccak256(abi.encode("NONCE")); // @dev for sending received fees bytes32 public constant FEE_RECEIVER = keccak256(abi.encode("FEE_RECEIVER")); // @dev for holding tokens that could not be sent out bytes32 public constant HOLDING_ADDRESS = keccak256(abi.encode("HOLDING_ADDRESS")); // @dev key for the minimum gas that should be forwarded for execution error handling bytes32 public constant MIN_HANDLE_EXECUTION_ERROR_GAS = keccak256(abi.encode("MIN_HANDLE_EXECUTION_ERROR_GAS")); // @dev for a global reentrancy guard bytes32 public constant REENTRANCY_GUARD_STATUS = keccak256(abi.encode("REENTRANCY_GUARD_STATUS")); // @dev key for deposit fees bytes32 public constant DEPOSIT_FEE_TYPE = keccak256(abi.encode("DEPOSIT_FEE_TYPE")); // @dev key for withdrawal fees bytes32 public constant WITHDRAWAL_FEE_TYPE = keccak256(abi.encode("WITHDRAWAL_FEE_TYPE")); // @dev key for swap fees bytes32 public constant SWAP_FEE_TYPE = keccak256(abi.encode("SWAP_FEE_TYPE")); // @dev key for position fees bytes32 public constant POSITION_FEE_TYPE = keccak256(abi.encode("POSITION_FEE_TYPE")); // @dev key for ui deposit fees bytes32 public constant UI_DEPOSIT_FEE_TYPE = keccak256(abi.encode("UI_DEPOSIT_FEE_TYPE")); // @dev key for ui withdrawal fees bytes32 public constant UI_WITHDRAWAL_FEE_TYPE = keccak256(abi.encode("UI_WITHDRAWAL_FEE_TYPE")); // @dev key for ui swap fees bytes32 public constant UI_SWAP_FEE_TYPE = keccak256(abi.encode("UI_SWAP_FEE_TYPE")); // @dev key for ui position fees bytes32 public constant UI_POSITION_FEE_TYPE = keccak256(abi.encode("UI_POSITION_FEE_TYPE")); // @dev key for ui fee factor bytes32 public constant UI_FEE_FACTOR = keccak256(abi.encode("UI_FEE_FACTOR")); // @dev key for max ui fee receiver factor bytes32 public constant MAX_UI_FEE_FACTOR = keccak256(abi.encode("MAX_UI_FEE_FACTOR")); // @dev key for the claimable fee amount bytes32 public constant CLAIMABLE_FEE_AMOUNT = keccak256(abi.encode("CLAIMABLE_FEE_AMOUNT")); // @dev key for the claimable ui fee amount bytes32 public constant CLAIMABLE_UI_FEE_AMOUNT = keccak256(abi.encode("CLAIMABLE_UI_FEE_AMOUNT")); // @dev key for the market list bytes32 public constant MARKET_LIST = keccak256(abi.encode("MARKET_LIST")); // @dev key for the deposit list bytes32 public constant DEPOSIT_LIST = keccak256(abi.encode("DEPOSIT_LIST")); // @dev key for the account deposit list bytes32 public constant ACCOUNT_DEPOSIT_LIST = keccak256(abi.encode("ACCOUNT_DEPOSIT_LIST")); // @dev key for the withdrawal list bytes32 public constant WITHDRAWAL_LIST = keccak256(abi.encode("WITHDRAWAL_LIST")); // @dev key for the account withdrawal list bytes32 public constant ACCOUNT_WITHDRAWAL_LIST = keccak256(abi.encode("ACCOUNT_WITHDRAWAL_LIST")); // @dev key for the position list bytes32 public constant POSITION_LIST = keccak256(abi.encode("POSITION_LIST")); // @dev key for the account position list bytes32 public constant ACCOUNT_POSITION_LIST = keccak256(abi.encode("ACCOUNT_POSITION_LIST")); // @dev key for the order list bytes32 public constant ORDER_LIST = keccak256(abi.encode("ORDER_LIST")); // @dev key for the account order list bytes32 public constant ACCOUNT_ORDER_LIST = keccak256(abi.encode("ACCOUNT_ORDER_LIST")); // @dev key for is market disabled bytes32 public constant IS_MARKET_DISABLED = keccak256(abi.encode("IS_MARKET_DISABLED")); // @dev key for the max swap path length allowed bytes32 public constant MAX_SWAP_PATH_LENGTH = keccak256(abi.encode("MAX_SWAP_PATH_LENGTH")); // @dev key used to store markets observed in a swap path, to ensure that a swap path contains unique markets bytes32 public constant SWAP_PATH_MARKET_FLAG = keccak256(abi.encode("SWAP_PATH_MARKET_FLAG")); // @dev key for whether the create deposit feature is disabled bytes32 public constant CREATE_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode("CREATE_DEPOSIT_FEATURE_DISABLED")); // @dev key for whether the cancel deposit feature is disabled bytes32 public constant CANCEL_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode("CANCEL_DEPOSIT_FEATURE_DISABLED")); // @dev key for whether the execute deposit feature is disabled bytes32 public constant EXECUTE_DEPOSIT_FEATURE_DISABLED = keccak256(abi.encode("EXECUTE_DEPOSIT_FEATURE_DISABLED")); // @dev key for whether the create withdrawal feature is disabled bytes32 public constant CREATE_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode("CREATE_WITHDRAWAL_FEATURE_DISABLED")); // @dev key for whether the cancel withdrawal feature is disabled bytes32 public constant CANCEL_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode("CANCEL_WITHDRAWAL_FEATURE_DISABLED")); // @dev key for whether the execute withdrawal feature is disabled bytes32 public constant EXECUTE_WITHDRAWAL_FEATURE_DISABLED = keccak256(abi.encode("EXECUTE_WITHDRAWAL_FEATURE_DISABLED")); // @dev key for whether the create order feature is disabled bytes32 public constant CREATE_ORDER_FEATURE_DISABLED = keccak256(abi.encode("CREATE_ORDER_FEATURE_DISABLED")); // @dev key for whether the execute order feature is disabled bytes32 public constant EXECUTE_ORDER_FEATURE_DISABLED = keccak256(abi.encode("EXECUTE_ORDER_FEATURE_DISABLED")); // @dev key for whether the execute adl feature is disabled // for liquidations, it can be disabled by using the EXECUTE_ORDER_FEATURE_DISABLED key with the Liquidation // order type, ADL orders have a MarketDecrease order type, so a separate key is needed to disable it bytes32 public constant EXECUTE_ADL_FEATURE_DISABLED = keccak256(abi.encode("EXECUTE_ADL_FEATURE_DISABLED")); // @dev key for whether the update order feature is disabled bytes32 public constant UPDATE_ORDER_FEATURE_DISABLED = keccak256(abi.encode("UPDATE_ORDER_FEATURE_DISABLED")); // @dev key for whether the cancel order feature is disabled bytes32 public constant CANCEL_ORDER_FEATURE_DISABLED = keccak256(abi.encode("CANCEL_ORDER_FEATURE_DISABLED")); // @dev key for whether the claim funding fees feature is disabled bytes32 public constant CLAIM_FUNDING_FEES_FEATURE_DISABLED = keccak256(abi.encode("CLAIM_FUNDING_FEES_FEATURE_DISABLED")); // @dev key for whether the claim collateral feature is disabled bytes32 public constant CLAIM_COLLATERAL_FEATURE_DISABLED = keccak256(abi.encode("CLAIM_COLLATERAL_FEATURE_DISABLED")); // @dev key for whether the claim affiliate rewards feature is disabled bytes32 public constant CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED = keccak256(abi.encode("CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED")); // @dev key for whether the claim ui fees feature is disabled bytes32 public constant CLAIM_UI_FEES_FEATURE_DISABLED = keccak256(abi.encode("CLAIM_UI_FEES_FEATURE_DISABLED")); // @dev key for the minimum required oracle signers for an oracle observation bytes32 public constant MIN_ORACLE_SIGNERS = keccak256(abi.encode("MIN_ORACLE_SIGNERS")); // @dev key for the minimum block confirmations before blockhash can be excluded for oracle signature validation bytes32 public constant MIN_ORACLE_BLOCK_CONFIRMATIONS = keccak256(abi.encode("MIN_ORACLE_BLOCK_CONFIRMATIONS")); // @dev key for the maximum usable oracle price age in seconds bytes32 public constant MAX_ORACLE_PRICE_AGE = keccak256(abi.encode("MAX_ORACLE_PRICE_AGE")); // @dev key for the maximum oracle price deviation factor from the ref price bytes32 public constant MAX_ORACLE_REF_PRICE_DEVIATION_FACTOR = keccak256(abi.encode("MAX_ORACLE_REF_PRICE_DEVIATION_FACTOR")); // @dev key for the percentage amount of position fees to be received bytes32 public constant POSITION_FEE_RECEIVER_FACTOR = keccak256(abi.encode("POSITION_FEE_RECEIVER_FACTOR")); // @dev key for the percentage amount of swap fees to be received bytes32 public constant SWAP_FEE_RECEIVER_FACTOR = keccak256(abi.encode("SWAP_FEE_RECEIVER_FACTOR")); // @dev key for the percentage amount of borrowing fees to be received bytes32 public constant BORROWING_FEE_RECEIVER_FACTOR = keccak256(abi.encode("BORROWING_FEE_RECEIVER_FACTOR")); // @dev key for the base gas limit used when estimating execution fee bytes32 public constant ESTIMATED_GAS_FEE_BASE_AMOUNT = keccak256(abi.encode("ESTIMATED_GAS_FEE_BASE_AMOUNT")); // @dev key for the multiplier used when estimating execution fee bytes32 public constant ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR = keccak256(abi.encode("ESTIMATED_GAS_FEE_MULTIPLIER_FACTOR")); // @dev key for the base gas limit used when calculating execution fee bytes32 public constant EXECUTION_GAS_FEE_BASE_AMOUNT = keccak256(abi.encode("EXECUTION_GAS_FEE_BASE_AMOUNT")); // @dev key for the multiplier used when calculating execution fee bytes32 public constant EXECUTION_GAS_FEE_MULTIPLIER_FACTOR = keccak256(abi.encode("EXECUTION_GAS_FEE_MULTIPLIER_FACTOR")); // @dev key for the estimated gas limit for deposits bytes32 public constant DEPOSIT_GAS_LIMIT = keccak256(abi.encode("DEPOSIT_GAS_LIMIT")); // @dev key for the estimated gas limit for withdrawals bytes32 public constant WITHDRAWAL_GAS_LIMIT = keccak256(abi.encode("WITHDRAWAL_GAS_LIMIT")); // @dev key for the estimated gas limit for single swaps bytes32 public constant SINGLE_SWAP_GAS_LIMIT = keccak256(abi.encode("SINGLE_SWAP_GAS_LIMIT")); // @dev key for the estimated gas limit for increase orders bytes32 public constant INCREASE_ORDER_GAS_LIMIT = keccak256(abi.encode("INCREASE_ORDER_GAS_LIMIT")); // @dev key for the estimated gas limit for decrease orders bytes32 public constant DECREASE_ORDER_GAS_LIMIT = keccak256(abi.encode("DECREASE_ORDER_GAS_LIMIT")); // @dev key for the estimated gas limit for swap orders bytes32 public constant SWAP_ORDER_GAS_LIMIT = keccak256(abi.encode("SWAP_ORDER_GAS_LIMIT")); // @dev key for the amount of gas to forward for token transfers bytes32 public constant TOKEN_TRANSFER_GAS_LIMIT = keccak256(abi.encode("TOKEN_TRANSFER_GAS_LIMIT")); // @dev key for the amount of gas to forward for native token transfers bytes32 public constant NATIVE_TOKEN_TRANSFER_GAS_LIMIT = keccak256(abi.encode("NATIVE_TOKEN_TRANSFER_GAS_LIMIT")); // @dev key for the maximum request block age, after which the request will be considered expired bytes32 public constant REQUEST_EXPIRATION_BLOCK_AGE = keccak256(abi.encode("REQUEST_EXPIRATION_BLOCK_AGE")); bytes32 public constant MAX_CALLBACK_GAS_LIMIT = keccak256(abi.encode("MAX_CALLBACK_GAS_LIMIT")); bytes32 public constant SAVED_CALLBACK_CONTRACT = keccak256(abi.encode("SAVED_CALLBACK_CONTRACT")); // @dev key for the min collateral factor bytes32 public constant MIN_COLLATERAL_FACTOR = keccak256(abi.encode("MIN_COLLATERAL_FACTOR")); // @dev key for the min collateral factor for open interest multiplier bytes32 public constant MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER = keccak256(abi.encode("MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER")); // @dev key for the min allowed collateral in USD bytes32 public constant MIN_COLLATERAL_USD = keccak256(abi.encode("MIN_COLLATERAL_USD")); // @dev key for the min allowed position size in USD bytes32 public constant MIN_POSITION_SIZE_USD = keccak256(abi.encode("MIN_POSITION_SIZE_USD")); // @dev key for the virtual id of tokens bytes32 public constant VIRTUAL_TOKEN_ID = keccak256(abi.encode("VIRTUAL_TOKEN_ID")); // @dev key for the virtual id of markets bytes32 public constant VIRTUAL_MARKET_ID = keccak256(abi.encode("VIRTUAL_MARKET_ID")); // @dev key for the virtual inventory for swaps bytes32 public constant VIRTUAL_INVENTORY_FOR_SWAPS = keccak256(abi.encode("VIRTUAL_INVENTORY_FOR_SWAPS")); // @dev key for the virtual inventory for positions bytes32 public constant VIRTUAL_INVENTORY_FOR_POSITIONS = keccak256(abi.encode("VIRTUAL_INVENTORY_FOR_POSITIONS")); // @dev key for the position impact factor bytes32 public constant POSITION_IMPACT_FACTOR = keccak256(abi.encode("POSITION_IMPACT_FACTOR")); // @dev key for the position impact exponent factor bytes32 public constant POSITION_IMPACT_EXPONENT_FACTOR = keccak256(abi.encode("POSITION_IMPACT_EXPONENT_FACTOR")); // @dev key for the max decrease position impact factor bytes32 public constant MAX_POSITION_IMPACT_FACTOR = keccak256(abi.encode("MAX_POSITION_IMPACT_FACTOR")); // @dev key for the max position impact factor for liquidations bytes32 public constant MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS = keccak256(abi.encode("MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS")); // @dev key for the position fee factor bytes32 public constant POSITION_FEE_FACTOR = keccak256(abi.encode("POSITION_FEE_FACTOR")); // @dev key for the swap impact factor bytes32 public constant SWAP_IMPACT_FACTOR = keccak256(abi.encode("SWAP_IMPACT_FACTOR")); // @dev key for the swap impact exponent factor bytes32 public constant SWAP_IMPACT_EXPONENT_FACTOR = keccak256(abi.encode("SWAP_IMPACT_EXPONENT_FACTOR")); // @dev key for the swap fee factor bytes32 public constant SWAP_FEE_FACTOR = keccak256(abi.encode("SWAP_FEE_FACTOR")); // @dev key for the oracle type bytes32 public constant ORACLE_TYPE = keccak256(abi.encode("ORACLE_TYPE")); // @dev key for open interest bytes32 public constant OPEN_INTEREST = keccak256(abi.encode("OPEN_INTEREST")); // @dev key for open interest in tokens bytes32 public constant OPEN_INTEREST_IN_TOKENS = keccak256(abi.encode("OPEN_INTEREST_IN_TOKENS")); // @dev key for collateral sum for a market bytes32 public constant COLLATERAL_SUM = keccak256(abi.encode("COLLATERAL_SUM")); // @dev key for pool amount bytes32 public constant POOL_AMOUNT = keccak256(abi.encode("POOL_AMOUNT")); // @dev key for max pool amount bytes32 public constant MAX_POOL_AMOUNT = keccak256(abi.encode("MAX_POOL_AMOUNT")); // @dev key for max open interest bytes32 public constant MAX_OPEN_INTEREST = keccak256(abi.encode("MAX_OPEN_INTEREST")); // @dev key for position impact pool amount bytes32 public constant POSITION_IMPACT_POOL_AMOUNT = keccak256(abi.encode("POSITION_IMPACT_POOL_AMOUNT")); // @dev key for swap impact pool amount bytes32 public constant SWAP_IMPACT_POOL_AMOUNT = keccak256(abi.encode("SWAP_IMPACT_POOL_AMOUNT")); // @dev key for price feed bytes32 public constant PRICE_FEED = keccak256(abi.encode("PRICE_FEED")); // @dev key for price feed multiplier bytes32 public constant PRICE_FEED_MULTIPLIER = keccak256(abi.encode("PRICE_FEED_MULTIPLIER")); // @dev key for price feed heartbeat bytes32 public constant PRICE_FEED_HEARTBEAT_DURATION = keccak256(abi.encode("PRICE_FEED_HEARTBEAT_DURATION")); // @dev key for stable price bytes32 public constant STABLE_PRICE = keccak256(abi.encode("STABLE_PRICE")); // @dev key for reserve factor bytes32 public constant RESERVE_FACTOR = keccak256(abi.encode("RESERVE_FACTOR")); // @dev key for open interest reserve factor bytes32 public constant OPEN_INTEREST_RESERVE_FACTOR = keccak256(abi.encode("OPEN_INTEREST_RESERVE_FACTOR")); // @dev key for max pnl factor bytes32 public constant MAX_PNL_FACTOR = keccak256(abi.encode("MAX_PNL_FACTOR")); // @dev key for max pnl factor bytes32 public constant MAX_PNL_FACTOR_FOR_TRADERS = keccak256(abi.encode("MAX_PNL_FACTOR_FOR_TRADERS")); // @dev key for max pnl factor for adl bytes32 public constant MAX_PNL_FACTOR_FOR_ADL = keccak256(abi.encode("MAX_PNL_FACTOR_FOR_ADL")); // @dev key for min pnl factor for adl bytes32 public constant MIN_PNL_FACTOR_AFTER_ADL = keccak256(abi.encode("MIN_PNL_FACTOR_AFTER_ADL")); // @dev key for max pnl factor bytes32 public constant MAX_PNL_FACTOR_FOR_DEPOSITS = keccak256(abi.encode("MAX_PNL_FACTOR_FOR_DEPOSITS")); // @dev key for max pnl factor for withdrawals bytes32 public constant MAX_PNL_FACTOR_FOR_WITHDRAWALS = keccak256(abi.encode("MAX_PNL_FACTOR_FOR_WITHDRAWALS")); // @dev key for latest ADL block bytes32 public constant LATEST_ADL_BLOCK = keccak256(abi.encode("LATEST_ADL_BLOCK")); // @dev key for whether ADL is enabled bytes32 public constant IS_ADL_ENABLED = keccak256(abi.encode("IS_ADL_ENABLED")); // @dev key for funding factor bytes32 public constant FUNDING_FACTOR = keccak256(abi.encode("FUNDING_FACTOR")); // @dev key for stable funding factor bytes32 public constant STABLE_FUNDING_FACTOR = keccak256(abi.encode("STABLE_FUNDING_FACTOR")); // @dev key for funding exponent factor bytes32 public constant FUNDING_EXPONENT_FACTOR = keccak256(abi.encode("FUNDING_EXPONENT_FACTOR")); // @dev key for funding fee amount per size bytes32 public constant FUNDING_FEE_AMOUNT_PER_SIZE = keccak256(abi.encode("FUNDING_FEE_AMOUNT_PER_SIZE")); // @dev key for claimable funding amount per size bytes32 public constant CLAIMABLE_FUNDING_AMOUNT_PER_SIZE = keccak256(abi.encode("CLAIMABLE_FUNDING_AMOUNT_PER_SIZE")); // @dev key for when funding was last updated at bytes32 public constant FUNDING_UPDATED_AT = keccak256(abi.encode("FUNDING_UPDATED_AT")); // @dev key for claimable funding amount bytes32 public constant CLAIMABLE_FUNDING_AMOUNT = keccak256(abi.encode("CLAIMABLE_FUNDING_AMOUNT")); // @dev key for claimable collateral amount bytes32 public constant CLAIMABLE_COLLATERAL_AMOUNT = keccak256(abi.encode("CLAIMABLE_COLLATERAL_AMOUNT")); // @dev key for claimable collateral factor bytes32 public constant CLAIMABLE_COLLATERAL_FACTOR = keccak256(abi.encode("CLAIMABLE_COLLATERAL_FACTOR")); // @dev key for claimable collateral time divisor bytes32 public constant CLAIMABLE_COLLATERAL_TIME_DIVISOR = keccak256(abi.encode("CLAIMABLE_COLLATERAL_TIME_DIVISOR")); // @dev key for claimed collateral amount bytes32 public constant CLAIMED_COLLATERAL_AMOUNT = keccak256(abi.encode("CLAIMED_COLLATERAL_AMOUNT")); // @dev key for borrowing factor bytes32 public constant BORROWING_FACTOR = keccak256(abi.encode("BORROWING_FACTOR")); // @dev key for borrowing factor bytes32 public constant BORROWING_EXPONENT_FACTOR = keccak256(abi.encode("BORROWING_EXPONENT_FACTOR")); // @dev key for skipping the borrowing factor for the smaller side bytes32 public constant SKIP_BORROWING_FEE_FOR_SMALLER_SIDE = keccak256(abi.encode("SKIP_BORROWING_FEE_FOR_SMALLER_SIDE")); // @dev key for cumulative borrowing factor bytes32 public constant CUMULATIVE_BORROWING_FACTOR = keccak256(abi.encode("CUMULATIVE_BORROWING_FACTOR")); // @dev key for when the cumulative borrowing factor was last updated at bytes32 public constant CUMULATIVE_BORROWING_FACTOR_UPDATED_AT = keccak256(abi.encode("CUMULATIVE_BORROWING_FACTOR_UPDATED_AT")); // @dev key for total borrowing amount bytes32 public constant TOTAL_BORROWING = keccak256(abi.encode("TOTAL_BORROWING")); // @dev key for affiliate reward bytes32 public constant AFFILIATE_REWARD = keccak256(abi.encode("AFFILIATE_REWARD")); // @dev constant for user initiated cancel reason string public constant USER_INITIATED_CANCEL = "USER_INITIATED_CANCEL"; // @dev key for the account deposit list // @param account the account for the list function accountDepositListKey(address account) internal pure returns (bytes32) { return keccak256(abi.encode(ACCOUNT_DEPOSIT_LIST, account)); } // @dev key for the account withdrawal list // @param account the account for the list function accountWithdrawalListKey(address account) internal pure returns (bytes32) { return keccak256(abi.encode(ACCOUNT_WITHDRAWAL_LIST, account)); } // @dev key for the account position list // @param account the account for the list function accountPositionListKey(address account) internal pure returns (bytes32) { return keccak256(abi.encode(ACCOUNT_POSITION_LIST, account)); } // @dev key for the account order list // @param account the account for the list function accountOrderListKey(address account) internal pure returns (bytes32) { return keccak256(abi.encode(ACCOUNT_ORDER_LIST, account)); } // @dev key for the claimable fee amount // @param market the market for the fee // @param token the token for the fee function claimableFeeAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode(CLAIMABLE_FEE_AMOUNT, market, token)); } // @dev key for the claimable ui fee amount // @param market the market for the fee // @param token the token for the fee // @param account the account that can claim the ui fee function claimableUiFeeAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode(CLAIMABLE_UI_FEE_AMOUNT, market, token)); } // @dev key for the claimable ui fee amount for account // @param market the market for the fee // @param token the token for the fee // @param account the account that can claim the ui fee function claimableUiFeeAmountKey(address market, address token, address account) internal pure returns (bytes32) { return keccak256(abi.encode(CLAIMABLE_UI_FEE_AMOUNT, market, token, account)); } // @dev key for deposit gas limit // @param singleToken whether a single token or pair tokens are being deposited // @return key for deposit gas limit function depositGasLimitKey(bool singleToken) internal pure returns (bytes32) { return keccak256(abi.encode( DEPOSIT_GAS_LIMIT, singleToken )); } // @dev key for withdrawal gas limit // @return key for withdrawal gas limit function withdrawalGasLimitKey() internal pure returns (bytes32) { return keccak256(abi.encode( WITHDRAWAL_GAS_LIMIT )); } // @dev key for single swap gas limit // @return key for single swap gas limit function singleSwapGasLimitKey() internal pure returns (bytes32) { return SINGLE_SWAP_GAS_LIMIT; } // @dev key for increase order gas limit // @return key for increase order gas limit function increaseOrderGasLimitKey() internal pure returns (bytes32) { return INCREASE_ORDER_GAS_LIMIT; } // @dev key for decrease order gas limit // @return key for decrease order gas limit function decreaseOrderGasLimitKey() internal pure returns (bytes32) { return DECREASE_ORDER_GAS_LIMIT; } // @dev key for swap order gas limit // @return key for swap order gas limit function swapOrderGasLimitKey() internal pure returns (bytes32) { return SWAP_ORDER_GAS_LIMIT; } function swapPathMarketFlagKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( SWAP_PATH_MARKET_FLAG, market )); } // @dev key for whether create deposit is disabled // @param the create deposit module // @return key for whether create deposit is disabled function createDepositFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CREATE_DEPOSIT_FEATURE_DISABLED, module )); } // @dev key for whether cancel deposit is disabled // @param the cancel deposit module // @return key for whether cancel deposit is disabled function cancelDepositFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CANCEL_DEPOSIT_FEATURE_DISABLED, module )); } // @dev key for whether execute deposit is disabled // @param the execute deposit module // @return key for whether execute deposit is disabled function executeDepositFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( EXECUTE_DEPOSIT_FEATURE_DISABLED, module )); } // @dev key for whether create withdrawal is disabled // @param the create withdrawal module // @return key for whether create withdrawal is disabled function createWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CREATE_WITHDRAWAL_FEATURE_DISABLED, module )); } // @dev key for whether cancel withdrawal is disabled // @param the cancel withdrawal module // @return key for whether cancel withdrawal is disabled function cancelWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CANCEL_WITHDRAWAL_FEATURE_DISABLED, module )); } // @dev key for whether execute withdrawal is disabled // @param the execute withdrawal module // @return key for whether execute withdrawal is disabled function executeWithdrawalFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( EXECUTE_WITHDRAWAL_FEATURE_DISABLED, module )); } // @dev key for whether create order is disabled // @param the create order module // @return key for whether create order is disabled function createOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) { return keccak256(abi.encode( CREATE_ORDER_FEATURE_DISABLED, module, orderType )); } // @dev key for whether execute order is disabled // @param the execute order module // @return key for whether execute order is disabled function executeOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) { return keccak256(abi.encode( EXECUTE_ORDER_FEATURE_DISABLED, module, orderType )); } // @dev key for whether execute adl is disabled // @param the execute adl module // @return key for whether execute adl is disabled function executeAdlFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) { return keccak256(abi.encode( EXECUTE_ADL_FEATURE_DISABLED, module, orderType )); } // @dev key for whether update order is disabled // @param the update order module // @return key for whether update order is disabled function updateOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) { return keccak256(abi.encode( UPDATE_ORDER_FEATURE_DISABLED, module, orderType )); } // @dev key for whether cancel order is disabled // @param the cancel order module // @return key for whether cancel order is disabled function cancelOrderFeatureDisabledKey(address module, uint256 orderType) internal pure returns (bytes32) { return keccak256(abi.encode( CANCEL_ORDER_FEATURE_DISABLED, module, orderType )); } // @dev key for whether claim funding fees is disabled // @param the claim funding fees module function claimFundingFeesFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIM_FUNDING_FEES_FEATURE_DISABLED, module )); } // @dev key for whether claim colltareral is disabled // @param the claim funding fees module function claimCollateralFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIM_COLLATERAL_FEATURE_DISABLED, module )); } // @dev key for whether claim affiliate rewards is disabled // @param the claim affiliate rewards module function claimAffiliateRewardsFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIM_AFFILIATE_REWARDS_FEATURE_DISABLED, module )); } // @dev key for whether claim ui fees is disabled // @param the claim ui fees module function claimUiFeesFeatureDisabledKey(address module) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIM_UI_FEES_FEATURE_DISABLED, module )); } // @dev key for ui fee factor // @param account the fee receiver account // @return key for ui fee factor function uiFeeFactorKey(address account) internal pure returns (bytes32) { return keccak256(abi.encode( UI_FEE_FACTOR, account )); } // @dev key for gas to forward for token transfer // @param the token to check // @return key for gas to forward for token transfer function tokenTransferGasLimit(address token) internal pure returns (bytes32) { return keccak256(abi.encode( TOKEN_TRANSFER_GAS_LIMIT, token )); } // @dev the default callback contract // @param account the user's account // @param market the address of the market // @param callbackContract the callback contract function savedCallbackContract(address account, address market) internal pure returns (bytes32) { return keccak256(abi.encode( SAVED_CALLBACK_CONTRACT, account, market )); } // @dev the min collateral factor key // @param the market for the min collateral factor function minCollateralFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( MIN_COLLATERAL_FACTOR, market )); } // @dev the min collateral factor for open interest multiplier key // @param the market for the factor function minCollateralFactorForOpenInterestMultiplierKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( MIN_COLLATERAL_FACTOR_FOR_OPEN_INTEREST_MULTIPLIER, market, isLong )); } // @dev the key for the virtual token id // @param the token to get the virtual id for function virtualTokenIdKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( VIRTUAL_TOKEN_ID, token )); } // @dev the key for the virtual market id // @param the market to get the virtual id for function virtualMarketIdKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( VIRTUAL_MARKET_ID, market )); } // @dev the key for the virtual inventory for positions // @param the virtualTokenId the virtual token id function virtualInventoryForPositionsKey(bytes32 virtualTokenId) internal pure returns (bytes32) { return keccak256(abi.encode( VIRTUAL_INVENTORY_FOR_POSITIONS, virtualTokenId )); } // @dev the key for the virtual inventory for swaps // @param the virtualMarketId the virtual market id // @param the token to check the inventory for function virtualInventoryForSwapsKey(bytes32 virtualMarketId, bool isLongToken) internal pure returns (bytes32) { return keccak256(abi.encode( VIRTUAL_INVENTORY_FOR_SWAPS, virtualMarketId, isLongToken )); } // @dev key for position impact factor // @param market the market address to check // @param isPositive whether the impact is positive or negative // @return key for position impact factor function positionImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) { return keccak256(abi.encode( POSITION_IMPACT_FACTOR, market, isPositive )); } // @dev key for position impact exponent factor // @param market the market address to check // @return key for position impact exponent factor function positionImpactExponentFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( POSITION_IMPACT_EXPONENT_FACTOR, market )); } // @dev key for the max position impact factor // @param market the market address to check // @return key for the max position impact factor function maxPositionImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) { return keccak256(abi.encode( MAX_POSITION_IMPACT_FACTOR, market, isPositive )); } // @dev key for the max position impact factor for liquidations // @param market the market address to check // @return key for the max position impact factor function maxPositionImpactFactorForLiquidationsKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( MAX_POSITION_IMPACT_FACTOR_FOR_LIQUIDATIONS, market )); } // @dev key for position fee factor // @param market the market address to check // @param forPositiveImpact whether the fee is for an action that has a positive price impact // @return key for position fee factor function positionFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) { return keccak256(abi.encode( POSITION_FEE_FACTOR, market, forPositiveImpact )); } // @dev key for swap impact factor // @param market the market address to check // @param isPositive whether the impact is positive or negative // @return key for swap impact factor function swapImpactFactorKey(address market, bool isPositive) internal pure returns (bytes32) { return keccak256(abi.encode( SWAP_IMPACT_FACTOR, market, isPositive )); } // @dev key for swap impact exponent factor // @param market the market address to check // @return key for swap impact exponent factor function swapImpactExponentFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( SWAP_IMPACT_EXPONENT_FACTOR, market )); } // @dev key for swap fee factor // @param market the market address to check // @return key for swap fee factor function swapFeeFactorKey(address market, bool forPositiveImpact) internal pure returns (bytes32) { return keccak256(abi.encode( SWAP_FEE_FACTOR, market, forPositiveImpact )); } // @dev key for oracle type // @param token the token to check // @return key for oracle type function oracleTypeKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( ORACLE_TYPE, token )); } // @dev key for open interest // @param market the market to check // @param collateralToken the collateralToken to check // @param isLong whether to check the long or short open interest // @return key for open interest function openInterestKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( OPEN_INTEREST, market, collateralToken, isLong )); } // @dev key for open interest in tokens // @param market the market to check // @param collateralToken the collateralToken to check // @param isLong whether to check the long or short open interest // @return key for open interest in tokens function openInterestInTokensKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( OPEN_INTEREST_IN_TOKENS, market, collateralToken, isLong )); } // @dev key for collateral sum for a market // @param market the market to check // @param collateralToken the collateralToken to check // @param isLong whether to check the long or short open interest // @return key for collateral sum function collateralSumKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( COLLATERAL_SUM, market, collateralToken, isLong )); } // @dev key for amount of tokens in a market's pool // @param market the market to check // @param token the token to check // @return key for amount of tokens in a market's pool function poolAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( POOL_AMOUNT, market, token )); } // @dev the key for the max amount of pool tokens // @param market the market for the pool // @param token the token for the pool function maxPoolAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( MAX_POOL_AMOUNT, market, token )); } // @dev the key for the max open interest // @param market the market for the pool // @param isLong whether the key is for the long or short side function maxOpenInterestKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( MAX_OPEN_INTEREST, market, isLong )); } // @dev key for amount of tokens in a market's position impact pool // @param market the market to check // @return key for amount of tokens in a market's position impact pool function positionImpactPoolAmountKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( POSITION_IMPACT_POOL_AMOUNT, market )); } // @dev key for amount of tokens in a market's swap impact pool // @param market the market to check // @param token the token to check // @return key for amount of tokens in a market's swap impact pool function swapImpactPoolAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( SWAP_IMPACT_POOL_AMOUNT, market, token )); } // @dev key for reserve factor // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for reserve factor function reserveFactorKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( RESERVE_FACTOR, market, isLong )); } // @dev key for open interest reserve factor // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for open interest reserve factor function openInterestReserveFactorKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( OPEN_INTEREST_RESERVE_FACTOR, market, isLong )); } // @dev key for max pnl factor // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for max pnl factor function maxPnlFactorKey(bytes32 pnlFactorType, address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( MAX_PNL_FACTOR, pnlFactorType, market, isLong )); } // @dev the key for min PnL factor after ADL // @param market the market for the pool // @param isLong whether the key is for the long or short side function minPnlFactorAfterAdlKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( MIN_PNL_FACTOR_AFTER_ADL, market, isLong )); } // @dev key for latest adl block // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for latest adl block function latestAdlBlockKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( LATEST_ADL_BLOCK, market, isLong )); } // @dev key for whether adl is enabled // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for whether adl is enabled function isAdlEnabledKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( IS_ADL_ENABLED, market, isLong )); } // @dev key for funding factor // @param market the market to check // @return key for funding factor function fundingFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( FUNDING_FACTOR, market )); } // @dev key for stable funding factor // @param market the market to check // @return key for stable funding factor function stableFundingFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( STABLE_FUNDING_FACTOR, market )); } // @dev the key for funding exponent // @param market the market for the pool function fundingExponentFactorKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( FUNDING_EXPONENT_FACTOR, market )); } // @dev key for funding fee amount per size // @param market the market to check // @param collateralToken the collateralToken to get the key for // @param isLong whether to get the key for the long or short side // @return key for funding fee amount per size function fundingFeeAmountPerSizeKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( FUNDING_FEE_AMOUNT_PER_SIZE, market, collateralToken, isLong )); } // @dev key for claimabel funding amount per size // @param market the market to check // @param collateralToken the collateralToken to get the key for // @param isLong whether to get the key for the long or short side // @return key for claimable funding amount per size function claimableFundingAmountPerSizeKey(address market, address collateralToken, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_FUNDING_AMOUNT_PER_SIZE, market, collateralToken, isLong )); } // @dev key for when funding was last updated // @param market the market to check // @return key for when funding was last updated function fundingUpdatedAtKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( FUNDING_UPDATED_AT, market )); } // @dev key for claimable funding amount // @param market the market to check // @param token the token to check // @return key for claimable funding amount function claimableFundingAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_FUNDING_AMOUNT, market, token )); } // @dev key for claimable funding amount by account // @param market the market to check // @param token the token to check // @param account the account to check // @return key for claimable funding amount function claimableFundingAmountKey(address market, address token, address account) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_FUNDING_AMOUNT, market, token, account )); } // @dev key for claimable collateral amount // @param market the market to check // @param token the token to check // @param account the account to check // @param timeKey the time key for the claimable amount // @return key for claimable funding amount function claimableCollateralAmountKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_COLLATERAL_AMOUNT, market, token )); } // @dev key for claimable collateral amount for a timeKey for an account // @param market the market to check // @param token the token to check // @param account the account to check // @param timeKey the time key for the claimable amount // @return key for claimable funding amount function claimableCollateralAmountKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_COLLATERAL_AMOUNT, market, token, timeKey, account )); } // @dev key for claimable collateral factor for a timeKey // @param market the market to check // @param token the token to check // @param timeKey the time key for the claimable amount // @return key for claimable funding amount function claimableCollateralFactorKey(address market, address token, uint256 timeKey) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_COLLATERAL_FACTOR, market, token, timeKey )); } // @dev key for claimable collateral factor for a timeKey for an account // @param market the market to check // @param token the token to check // @param timeKey the time key for the claimable amount // @param account the account to check // @return key for claimable funding amount function claimableCollateralFactorKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMABLE_COLLATERAL_FACTOR, market, token, timeKey, account )); } // @dev key for claimable collateral factor // @param market the market to check // @param token the token to check // @param account the account to check // @param timeKey the time key for the claimable amount // @return key for claimable funding amount function claimedCollateralAmountKey(address market, address token, uint256 timeKey, address account) internal pure returns (bytes32) { return keccak256(abi.encode( CLAIMED_COLLATERAL_AMOUNT, market, token, timeKey, account )); } // @dev key for borrowing factor // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for borrowing factor function borrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( BORROWING_FACTOR, market, isLong )); } // @dev the key for borrowing exponent // @param market the market for the pool // @param isLong whether to get the key for the long or short side function borrowingExponentFactorKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( BORROWING_EXPONENT_FACTOR, market, isLong )); } // @dev key for cumulative borrowing factor // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for cumulative borrowing factor function cumulativeBorrowingFactorKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( CUMULATIVE_BORROWING_FACTOR, market, isLong )); } // @dev key for cumulative borrowing factor updated at // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for cumulative borrowing factor updated at function cumulativeBorrowingFactorUpdatedAtKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( CUMULATIVE_BORROWING_FACTOR_UPDATED_AT, market, isLong )); } // @dev key for total borrowing amount // @param market the market to check // @param isLong whether to get the key for the long or short side // @return key for total borrowing amount function totalBorrowingKey(address market, bool isLong) internal pure returns (bytes32) { return keccak256(abi.encode( TOTAL_BORROWING, market, isLong )); } // @dev key for affiliate reward amount // @param market the market to check // @param token the token to get the key for // @param account the account to get the key for // @return key for affiliate reward amount function affiliateRewardKey(address market, address token) internal pure returns (bytes32) { return keccak256(abi.encode( AFFILIATE_REWARD, market, token )); } // @dev key for affiliate reward amount for an account // @param market the market to check // @param token the token to get the key for // @param account the account to get the key for // @return key for affiliate reward amount function affiliateRewardKey(address market, address token, address account) internal pure returns (bytes32) { return keccak256(abi.encode( AFFILIATE_REWARD, market, token, account )); } // @dev key for is market disabled // @param market the market to check // @return key for is market disabled function isMarketDisabledKey(address market) internal pure returns (bytes32) { return keccak256(abi.encode( IS_MARKET_DISABLED, market )); } // @dev key for price feed address // @param token the token to get the key for // @return key for price feed address function priceFeedKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( PRICE_FEED, token )); } // @dev key for price feed multiplier // @param token the token to get the key for // @return key for price feed multiplier function priceFeedMultiplierKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( PRICE_FEED_MULTIPLIER, token )); } function priceFeedHeartbeatDurationKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( PRICE_FEED_HEARTBEAT_DURATION, token )); } // @dev key for stable price value // @param token the token to get the key for // @return key for stable price value function stablePriceKey(address token) internal pure returns (bytes32) { return keccak256(abi.encode( STABLE_PRICE, token )); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library Errors { // AdlUtils errors error InvalidSizeDeltaForAdl(uint256 sizeDeltaUsd, uint256 positionSizeInUsd); error AdlNotEnabled(); // Bank errors error SelfTransferNotSupported(address receiver); error InvalidNativeTokenSender(address msgSender); // CallbackUtils errors error MaxCallbackGasLimitExceeded(uint256 callbackGasLimit, uint256 maxCallbackGasLimit); // Config errors error InvalidBaseKey(bytes32 baseKey); error InvalidFeeFactor(bytes32 baseKey, uint256 value); // Timelock errors error ActionAlreadySignalled(); error ActionNotSignalled(); error SignalTimeNotYetPassed(uint256 signalTime); error InvalidTimelockDelay(uint256 timelockDelay); error MaxTimelockDelayExceeded(uint256 timelockDelay); error InvalidFeeReceiver(address receiver); error InvalidOracleSigner(address receiver); // DepositStoreUtils errors error DepositNotFound(bytes32 key); // DepositUtils errors error EmptyDeposit(); error EmptyDepositAmounts(); // ExecuteDepositUtils errors error MinMarketTokens(uint256 received, uint256 expected); error EmptyDepositAmountsAfterSwap(); error InvalidPoolValueForDeposit(int256 poolValue); error InvalidSwapOutputToken(address outputToken, address expectedOutputToken); // AdlHandler errors error AdlNotRequired(int256 pnlToPoolFactor, uint256 maxPnlFactorForAdl); error InvalidAdl(int256 nextPnlToPoolFactor, int256 pnlToPoolFactor); error PnlOvercorrected(int256 nextPnlToPoolFactor, uint256 minPnlFactorForAdl); // ExchangeUtils errors error RequestNotYetCancellable(uint256 requestAge, uint256 requestExpirationAge, string requestType); // OrderHandler errors error OrderNotUpdatable(uint256 orderType); error InvalidKeeperForFrozenOrder(address keeper); // FeatureUtils errors error DisabledFeature(bytes32 key); // FeeHandler errors error InvalidClaimFeesInput(uint256 marketsLength, uint256 tokensLength); // GasUtils errors error InsufficientExecutionFee(uint256 minExecutionFee, uint256 executionFee); error InsufficientWntAmountForExecutionFee(uint256 wntAmount, uint256 executionFee); error InsufficientExecutionGas(uint256 startingGas, uint256 minHandleErrorGas); // MarketFactory errors error MarketAlreadyExists(bytes32 salt, address existingMarketAddress); // MarketStoreUtils errors error MarketNotFound(address key); // MarketUtils errors error EmptyMarket(); error DisabledMarket(address market); error MaxSwapPathLengthExceeded(uint256 swapPathLengh, uint256 maxSwapPathLength); error InsufficientPoolAmount(uint256 poolAmount, uint256 amount); error InsufficientReserve(uint256 reservedUsd, uint256 maxReservedUsd); error InsufficientReserveForOpenInterest(uint256 reservedUsd, uint256 maxReservedUsd); error UnableToGetOppositeToken(address inputToken, address market); error UnexpectedTokenForVirtualInventory(address token, address market); error EmptyMarketTokenSupply(); error InvalidSwapMarket(address market); error UnableToGetCachedTokenPrice(address token, address market); error CollateralAlreadyClaimed(uint256 adjustedClaimableAmount, uint256 claimedAmount); error OpenInterestCannotBeUpdatedForSwapOnlyMarket(address market); error MaxOpenInterestExceeded(uint256 openInterest, uint256 maxOpenInterest); error MaxPoolAmountExceeded(uint256 poolAmount, uint256 maxPoolAmount); error UnexpectedBorrowingFactor(uint256 positionBorrowingFactor, uint256 cumulativeBorrowingFactor); error UnableToGetBorrowingFactorEmptyPoolUsd(); error UnableToGetFundingFactorEmptyOpenInterest(); error InvalidPositionMarket(address market); error InvalidCollateralTokenForMarket(address market, address token); error PnlFactorExceededForLongs(int256 pnlToPoolFactor, uint256 maxPnlFactor); error PnlFactorExceededForShorts(int256 pnlToPoolFactor, uint256 maxPnlFactor); error InvalidUiFeeFactor(uint256 uiFeeFactor, uint256 maxUiFeeFactor); error EmptyAddressInMarketTokenBalanceValidation(address market, address token); error InvalidMarketTokenBalance(address market, address token, uint256 balance, uint256 expectedMinBalance); error InvalidMarketTokenBalanceForCollateralAmount(address market, address token, uint256 balance, uint256 collateralAmount); error InvalidMarketTokenBalanceForClaimableFunding(address market, address token, uint256 balance, uint256 claimableFundingFeeAmount); error UnexpectedPoolValue(int256 poolValue); // Oracle errors error EmptySigner(uint256 signerIndex); error InvalidBlockNumber(uint256 minOracleBlockNumber, uint256 currentBlockNumber); error InvalidMinMaxBlockNumber(uint256 minOracleBlockNumber, uint256 maxOracleBlockNumber); error MaxPriceAgeExceeded(uint256 oracleTimestamp, uint256 currentTimestamp); error MinOracleSigners(uint256 oracleSigners, uint256 minOracleSigners); error MaxOracleSigners(uint256 oracleSigners, uint256 maxOracleSigners); error BlockNumbersNotSorted(uint256 minOracleBlockNumber, uint256 prevMinOracleBlockNumber); error MinPricesNotSorted(address token, uint256 price, uint256 prevPrice); error MaxPricesNotSorted(address token, uint256 price, uint256 prevPrice); error EmptyPriceFeedMultiplier(address token); error InvalidFeedPrice(address token, int256 price); error PriceFeedNotUpdated(address token, uint256 timestamp, uint256 heartbeatDuration); error MaxSignerIndex(uint256 signerIndex, uint256 maxSignerIndex); error InvalidOraclePrice(address token); error InvalidSignerMinMaxPrice(uint256 minPrice, uint256 maxPrice); error InvalidMedianMinMaxPrice(uint256 minPrice, uint256 maxPrice); error DuplicateTokenPrice(address token); error NonEmptyTokensWithPrices(uint256 tokensWithPricesLength); error EmptyPriceFeed(address token); error PriceAlreadySet(address token, uint256 minPrice, uint256 maxPrice); error MaxRefPriceDeviationExceeded( address token, uint256 price, uint256 refPrice, uint256 maxRefPriceDeviationFactor ); // OracleModule errors error InvalidPrimaryPricesForSimulation(uint256 primaryTokensLength, uint256 primaryPricesLength); error EndOfOracleSimulation(); // OracleUtils errors error EmptyCompactedPrice(uint256 index); error EmptyCompactedBlockNumber(uint256 index); error EmptyCompactedTimestamp(uint256 index); error InvalidSignature(address recoveredSigner, address expectedSigner); error EmptyPrimaryPrice(address token); error OracleBlockNumbersAreSmallerThanRequired(uint256[] oracleBlockNumbers, uint256 expectedBlockNumber); error OracleBlockNumberNotWithinRange( uint256[] minOracleBlockNumbers, uint256[] maxOracleBlockNumbers, uint256 blockNumber ); // BaseOrderUtils errors error EmptyOrder(); error UnsupportedOrderType(); error InvalidOrderPrices( uint256 primaryPriceMin, uint256 primaryPriceMax, uint256 triggerPrice, uint256 orderType ); error EmptySizeDeltaInTokens(); error PriceImpactLargerThanOrderSize(int256 priceImpactUsd, uint256 sizeDeltaUsd); error NegativeExecutionPrice(int256 executionPrice, uint256 price, uint256 positionSizeInUsd, int256 priceImpactUsd, uint256 sizeDeltaUsd); error OrderNotFulfillableAtAcceptablePrice(uint256 price, uint256 acceptablePrice); // IncreaseOrderUtils errors error UnexpectedPositionState(); // OrderUtils errors error OrderTypeCannotBeCreated(uint256 orderType); error OrderAlreadyFrozen(); // OrderStoreUtils errors error OrderNotFound(bytes32 key); // SwapOrderUtils errors error UnexpectedMarket(); // DecreasePositionCollateralUtils errors error InsufficientFundsToPayForCosts(uint256 remainingCostUsd, string step); error InvalidOutputToken(address tokenOut, address expectedTokenOut); // DecreasePositionUtils errors error InvalidDecreaseOrderSize(uint256 sizeDeltaUsd, uint256 positionSizeInUsd); error UnableToWithdrawCollateral(int256 estimatedRemainingCollateralUsd); error InvalidDecreasePositionSwapType(uint256 decreasePositionSwapType); error PositionShouldNotBeLiquidated(); // IncreasePositionUtils errors error InsufficientCollateralAmount(uint256 collateralAmount, int256 collateralDeltaAmount); error InsufficientCollateralUsd(int256 remainingCollateralUsd); // PositionStoreUtils errors error PositionNotFound(bytes32 key); // PositionUtils errors error LiquidatablePosition(string reason); error EmptyPosition(); error InvalidPositionSizeValues(uint256 sizeInUsd, uint256 sizeInTokens); error MinPositionSize(uint256 positionSizeInUsd, uint256 minPositionSizeUsd); // PositionPricingUtils errors error UsdDeltaExceedsLongOpenInterest(int256 usdDelta, uint256 longOpenInterest); error UsdDeltaExceedsShortOpenInterest(int256 usdDelta, uint256 shortOpenInterest); // SwapPricingUtils errors error UsdDeltaExceedsPoolValue(int256 usdDelta, uint256 poolUsd); // RoleModule errors error Unauthorized(address msgSender, string role); // RoleStore errors error ThereMustBeAtLeastOneRoleAdmin(); error ThereMustBeAtLeastOneTimelockMultiSig(); // ExchangeRouter errors error InvalidClaimFundingFeesInput(uint256 marketsLength, uint256 tokensLength); error InvalidClaimCollateralInput(uint256 marketsLength, uint256 tokensLength, uint256 timeKeysLength); error InvalidClaimAffiliateRewardsInput(uint256 marketsLength, uint256 tokensLength); error InvalidClaimUiFeesInput(uint256 marketsLength, uint256 tokensLength); // SwapUtils errors error InvalidTokenIn(address tokenIn, address market); error InsufficientOutputAmount(uint256 outputAmount, uint256 minOutputAmount); error InsufficientSwapOutputAmount(uint256 outputAmount, uint256 minOutputAmount); error DuplicatedMarketInSwapPath(address market); error SwapPriceImpactExceedsAmountIn(uint256 amountAfterFees, int256 negativeImpactAmount); // TokenUtils errors error EmptyTokenTranferGasLimit(address token); error TokenTransferError(address token, address receiver, uint256 amount); error EmptyHoldingAddress(); // AccountUtils errors error EmptyAccount(); error EmptyReceiver(); // Array errors error CompactedArrayOutOfBounds( uint256[] compactedValues, uint256 index, uint256 slotIndex, string label ); error ArrayOutOfBoundsUint256( uint256[] values, uint256 index, string label ); error ArrayOutOfBoundsBytes( bytes[] values, uint256 index, string label ); // WithdrawalStoreUtils errors error WithdrawalNotFound(bytes32 key); // WithdrawalUtils errors error EmptyWithdrawal(); error EmptyWithdrawalAmount(); error MinLongTokens(uint256 received, uint256 expected); error MinShortTokens(uint256 received, uint256 expected); error InsufficientMarketTokens(uint256 balance, uint256 expected); error InsufficientWntAmount(uint256 wntAmount, uint256 executionFee); error InvalidPoolValueForWithdrawal(int256 poolValue); // Uint256Mask errors error MaskIndexOutOfBounds(uint256 index, string label); error DuplicatedIndex(uint256 index, string label); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; library ErrorUtils { // To get the revert reason, referenced from https://ethereum.stackexchange.com/a/83577 function getRevertMessage(bytes memory result) internal pure returns (string memory, bool) { // If the result length is less than 68, then the transaction either panicked or failed silently if (result.length < 68) { return ("", false); } bytes4 errorSelector = getErrorSelectorFromData(result); // 0x08c379a0 is the selector for Error(string) // referenced from https://blog.soliditylang.org/2021/04/21/custom-errors/ if (errorSelector == bytes4(0x08c379a0)) { assembly { result := add(result, 0x04) } return (abi.decode(result, (string)), true); } // error may be a custom error, return an empty string for this case return ("", false); } function getErrorSelectorFromData(bytes memory data) internal pure returns (bytes4) { bytes4 errorSelector; assembly { errorSelector := mload(add(data, 0x20)) } return errorSelector; } function revertWithParsedMessage(bytes memory result) internal pure { (string memory revertMessage, bool hasRevertMessage) = getRevertMessage(result); if (hasRevertMessage) { revert(revertMessage); } else { revertWithCustomError(result); } } function revertWithCustomError(bytes memory result) internal pure { // referenced from https://ethereum.stackexchange.com/a/123588 uint256 length = result.length; assembly { revert(add(result, 0x20), length) } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; /** * @title Role * @dev Library for role keys */ library Role { /** * @dev The ROLE_ADMIN role. */ bytes32 public constant ROLE_ADMIN = keccak256(abi.encode("ROLE_ADMIN")); /** * @dev The TIMELOCK_ADMIN role. */ bytes32 public constant TIMELOCK_ADMIN = keccak256(abi.encode("TIMELOCK_ADMIN")); /** * @dev The TIMELOCK_MULTISIG role. */ bytes32 public constant TIMELOCK_MULTISIG = keccak256(abi.encode("TIMELOCK_MULTISIG")); /** * @dev The CONFIG_KEEPER role. */ bytes32 public constant CONFIG_KEEPER = keccak256(abi.encode("CONFIG_KEEPER")); /** * @dev The CONTROLLER role. */ bytes32 public constant CONTROLLER = keccak256(abi.encode("CONTROLLER")); /** * @dev The ROUTER_PLUGIN role. */ bytes32 public constant ROUTER_PLUGIN = keccak256(abi.encode("ROUTER_PLUGIN")); /** * @dev The MARKET_KEEPER role. */ bytes32 public constant MARKET_KEEPER = keccak256(abi.encode("MARKET_KEEPER")); /** * @dev The FEE_KEEPER role. */ bytes32 public constant FEE_KEEPER = keccak256(abi.encode("FEE_KEEPER")); /** * @dev The ORDER_KEEPER role. */ bytes32 public constant ORDER_KEEPER = keccak256(abi.encode("ORDER_KEEPER")); /** * @dev The FROZEN_ORDER_KEEPER role. */ bytes32 public constant FROZEN_ORDER_KEEPER = keccak256(abi.encode("FROZEN_ORDER_KEEPER")); /** * @dev The PRICING_KEEPER role. */ bytes32 public constant PRICING_KEEPER = keccak256(abi.encode("PRICING_KEEPER")); /** * @dev The LIQUIDATION_KEEPER role. */ bytes32 public constant LIQUIDATION_KEEPER = keccak256(abi.encode("LIQUIDATION_KEEPER")); /** * @dev The ADL_KEEPER role. */ bytes32 public constant ADL_KEEPER = keccak256(abi.encode("ADL_KEEPER")); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "./RoleStore.sol"; /** * @title RoleModule * @dev Contract for role validation functions */ contract RoleModule { RoleStore public immutable roleStore; /** * @dev Constructor that initializes the role store for this contract. * * @param _roleStore The contract instance to use as the role store. */ constructor(RoleStore _roleStore) { roleStore = _roleStore; } /** * @dev Only allows the contract's own address to call the function. */ modifier onlySelf() { if (msg.sender != address(this)) { revert Errors.Unauthorized(msg.sender, "SELF"); } _; } /** * @dev Only allows addresses with the TIMELOCK_MULTISIG role to call the function. */ modifier onlyTimelockMultisig() { _validateRole(Role.TIMELOCK_MULTISIG, "TIMELOCK_MULTISIG"); _; } /** * @dev Only allows addresses with the TIMELOCK_ADMIN role to call the function. */ modifier onlyTimelockAdmin() { _validateRole(Role.TIMELOCK_ADMIN, "TIMELOCK_ADMIN"); _; } /** * @dev Only allows addresses with the CONFIG_KEEPER role to call the function. */ modifier onlyConfigKeeper() { _validateRole(Role.CONFIG_KEEPER, "CONFIG_KEEPER"); _; } /** * @dev Only allows addresses with the CONTROLLER role to call the function. */ modifier onlyController() { _validateRole(Role.CONTROLLER, "CONTROLLER"); _; } /** * @dev Only allows addresses with the ROUTER_PLUGIN role to call the function. */ modifier onlyRouterPlugin() { _validateRole(Role.ROUTER_PLUGIN, "ROUTER_PLUGIN"); _; } /** * @dev Only allows addresses with the MARKET_KEEPER role to call the function. */ modifier onlyMarketKeeper() { _validateRole(Role.MARKET_KEEPER, "MARKET_KEEPER"); _; } /** * @dev Only allows addresses with the FEE_KEEPER role to call the function. */ modifier onlyFeeKeeper() { _validateRole(Role.FEE_KEEPER, "FEE_KEEPER"); _; } /** * @dev Only allows addresses with the ORDER_KEEPER role to call the function. */ modifier onlyOrderKeeper() { _validateRole(Role.ORDER_KEEPER, "ORDER_KEEPER"); _; } /** * @dev Only allows addresses with the PRICING_KEEPER role to call the function. */ modifier onlyPricingKeeper() { _validateRole(Role.PRICING_KEEPER, "PRICING_KEEPER"); _; } /** * @dev Only allows addresses with the LIQUIDATION_KEEPER role to call the function. */ modifier onlyLiquidationKeeper() { _validateRole(Role.LIQUIDATION_KEEPER, "LIQUIDATION_KEEPER"); _; } /** * @dev Only allows addresses with the ADL_KEEPER role to call the function. */ modifier onlyAdlKeeper() { _validateRole(Role.ADL_KEEPER, "ADL_KEEPER"); _; } /** * @dev Validates that the caller has the specified role. * * If the caller does not have the specified role, the transaction is reverted. * * @param role The key of the role to validate. * @param roleName The name of the role to validate. */ function _validateRole(bytes32 role, string memory roleName) internal view { if (!roleStore.hasRole(msg.sender, role)) { revert Errors.Unauthorized(msg.sender, roleName); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; import "../utils/EnumerableValues.sol"; import "./Role.sol"; import "../error/Errors.sol"; /** * @title RoleStore * @dev Stores roles and their members. */ contract RoleStore { using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.Bytes32Set; using EnumerableValues for EnumerableSet.AddressSet; using EnumerableValues for EnumerableSet.Bytes32Set; EnumerableSet.Bytes32Set internal roles; mapping(bytes32 => EnumerableSet.AddressSet) internal roleMembers; // checking if an account has a role is a frequently used function // roleCache helps to save gas by offering a more efficient lookup // vs calling roleMembers[key].contains(account) mapping(address => mapping (bytes32 => bool)) roleCache; modifier onlyRoleAdmin() { if (!hasRole(msg.sender, Role.ROLE_ADMIN)) { revert Errors.Unauthorized(msg.sender, "ROLE_ADMIN"); } _; } constructor() { _grantRole(msg.sender, Role.ROLE_ADMIN); } /** * @dev Grants the specified role to the given account. * * @param account The address of the account. * @param roleKey The key of the role to grant. */ function grantRole(address account, bytes32 roleKey) external onlyRoleAdmin { _grantRole(account, roleKey); } /** * @dev Revokes the specified role from the given account. * * @param account The address of the account. * @param roleKey The key of the role to revoke. */ function revokeRole(address account, bytes32 roleKey) external onlyRoleAdmin { _revokeRole(account, roleKey); } /** * @dev Returns true if the given account has the specified role. * * @param account The address of the account. * @param roleKey The key of the role. * @return True if the account has the role, false otherwise. */ function hasRole(address account, bytes32 roleKey) public view returns (bool) { return roleCache[account][roleKey]; } /** * @dev Returns the number of roles stored in the contract. * * @return The number of roles. */ function getRoleCount() external view returns (uint256) { return roles.length(); } /** * @dev Returns the keys of the roles stored in the contract. * * @param start The starting index of the range of roles to return. * @param end The ending index of the range of roles to return. * @return The keys of the roles. */ function getRoles(uint256 start, uint256 end) external view returns (bytes32[] memory) { return roles.valuesAt(start, end); } /** * @dev Returns the number of members of the specified role. * * @param roleKey The key of the role. * @return The number of members of the role. */ function getRoleMemberCount(bytes32 roleKey) external view returns (uint256) { return roleMembers[roleKey].length(); } /** * @dev Returns the members of the specified role. * * @param roleKey The key of the role. * @param start the start index, the value for this index will be included. * @param end the end index, the value for this index will not be included. * @return The members of the role. */ function getRoleMembers(bytes32 roleKey, uint256 start, uint256 end) external view returns (address[] memory) { return roleMembers[roleKey].valuesAt(start, end); } function _grantRole(address account, bytes32 roleKey) internal { roles.add(roleKey); roleMembers[roleKey].add(account); roleCache[account][roleKey] = true; } function _revokeRole(address account, bytes32 roleKey) internal { roleMembers[roleKey].remove(account); roleCache[account][roleKey] = false; if (roleMembers[roleKey].length() == 0) { if (roleKey == Role.ROLE_ADMIN) { revert Errors.ThereMustBeAtLeastOneRoleAdmin(); } if (roleKey == Role.TIMELOCK_MULTISIG) { revert Errors.ThereMustBeAtLeastOneTimelockMultiSig(); } } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; /** * @title IWNT * @dev Interface for Wrapped Native Tokens, e.g. WETH * The contract is named WNT instead of WETH for a more general reference name * that can be used on any blockchain */ interface IWNT { function deposit() external payable; function withdraw(uint256 amount) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "../data/DataStore.sol"; import "../data/Keys.sol"; import "../error/ErrorUtils.sol"; import "../utils/AccountUtils.sol"; import "./IWNT.sol"; /** * @title TokenUtils * @dev Library for token functions, helps with transferring of tokens and * native token functions */ library TokenUtils { using Address for address; using SafeERC20 for IERC20; event TokenTransferReverted(string reason, bytes returndata); event NativeTokenTransferReverted(string reason); /** * @dev Returns the address of the WNT token. * @param dataStore DataStore contract instance where the address of the WNT token is stored. * @return The address of the WNT token. */ function wnt(DataStore dataStore) internal view returns (address) { return dataStore.getAddress(Keys.WNT); } /** * @dev Transfers the specified amount of `token` from the caller to `receiver`. * limit the amount of gas forwarded so that a user cannot intentionally * construct a token call that would consume all gas and prevent necessary * actions like request cancellation from being executed * * @param dataStore The data store that contains the `tokenTransferGasLimit` for the specified `token`. * @param token The address of the ERC20 token that is being transferred. * @param receiver The address of the recipient of the `token` transfer. * @param amount The amount of `token` to transfer. */ function transfer( DataStore dataStore, address token, address receiver, uint256 amount ) internal { if (amount == 0) { return; } AccountUtils.validateReceiver(receiver); uint256 gasLimit = dataStore.getUint(Keys.tokenTransferGasLimit(token)); if (gasLimit == 0) { revert Errors.EmptyTokenTranferGasLimit(token); } (bool success0, /* bytes memory returndata */) = nonRevertingTransferWithGasLimit( IERC20(token), receiver, amount, gasLimit ); if (success0) { return; } address holdingAddress = dataStore.getAddress(Keys.HOLDING_ADDRESS); if (holdingAddress == address(0)) { revert Errors.EmptyHoldingAddress(); } // in case transfers to the receiver fail due to blacklisting or other reasons // send the tokens to a holding address to avoid possible gaming through reverting // transfers (bool success1, bytes memory returndata) = nonRevertingTransferWithGasLimit( IERC20(token), holdingAddress, amount, gasLimit ); if (success1) { return; } (string memory reason, /* bool hasRevertMessage */) = ErrorUtils.getRevertMessage(returndata); emit TokenTransferReverted(reason, returndata); // throw custom errors to prevent spoofing of errors // this is necessary because contracts like DepositHandler, WithdrawalHandler, OrderHandler // do not cancel requests for specific errors revert Errors.TokenTransferError(token, receiver, amount); } /** * Deposits the specified amount of native token and sends the specified * amount of wrapped native token to the specified receiver address. * * @param dataStore the data store to use for storing and retrieving data * @param receiver the address of the recipient of the wrapped native token transfer * @param amount the amount of native token to deposit and the amount of wrapped native token to send */ function depositAndSendWrappedNativeToken( DataStore dataStore, address receiver, uint256 amount ) internal { if (amount == 0) { return; } AccountUtils.validateReceiver(receiver); address _wnt = wnt(dataStore); IWNT(_wnt).deposit{value: amount}(); transfer( dataStore, _wnt, receiver, amount ); } /** * @dev Withdraws the specified amount of wrapped native token and sends the * corresponding amount of native token to the specified receiver address. * * limit the amount of gas forwarded so that a user cannot intentionally * construct a token call that would consume all gas and prevent necessary * actions like request cancellation from being executed * * @param dataStore the data store to use for storing and retrieving data * @param _wnt the address of the WNT contract to withdraw the wrapped native token from * @param receiver the address of the recipient of the native token transfer * @param amount the amount of wrapped native token to withdraw and the amount of native token to send */ function withdrawAndSendNativeToken( DataStore dataStore, address _wnt, address receiver, uint256 amount ) internal { if (amount == 0) { return; } AccountUtils.validateReceiver(receiver); IWNT(_wnt).withdraw(amount); uint256 gasLimit = dataStore.getUint(Keys.NATIVE_TOKEN_TRANSFER_GAS_LIMIT); bool success; // use an assembly call to avoid loading large data into memory // input mem[in…(in+insize)] // output area mem[out…(out+outsize))] assembly { success := call( gasLimit, // gas limit receiver, // receiver amount, // value 0, // in 0, // insize 0, // out 0 // outsize ) } if (success) { return; } // if the transfer failed, re-wrap the token and send it to the receiver depositAndSendWrappedNativeToken( dataStore, receiver, amount ); } /** * @dev Transfers the specified amount of ERC20 token to the specified receiver * address, with a gas limit to prevent the transfer from consuming all available gas. * adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/utils/SafeERC20.sol * * @param token the ERC20 contract to transfer the tokens from * @param to the address of the recipient of the token transfer * @param amount the amount of tokens to transfer * @param gasLimit the maximum amount of gas that the token transfer can consume * @return a tuple containing a boolean indicating the success or failure of the * token transfer, and a bytes value containing the return data from the token transfer */ function nonRevertingTransferWithGasLimit( IERC20 token, address to, uint256 amount, uint256 gasLimit ) internal returns (bool, bytes memory) { bytes memory data = abi.encodeWithSelector(token.transfer.selector, to, amount); (bool success, bytes memory returndata) = address(token).call{ gas: gasLimit }(data); if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (!address(token).isContract()) { return (false, "Call to non-contract"); } } // some tokens do not revert on a failed transfer, they will return a boolean instead // validate that the returned boolean is true, otherwise indicate that the token transfer failed if (returndata.length > 0 && !abi.decode(returndata, (bool))) { return (false, returndata); } // transfers on some tokens do not return a boolean value, they will just revert if a transfer fails // for these tokens, if success is true then the transfer should have completed return (true, returndata); } return (false, returndata); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "../error/Errors.sol"; library AccountUtils { function validateAccount(address account) internal pure { if (account == address(0)) { revert Errors.EmptyAccount(); } } function validateReceiver(address receiver) internal pure { if (receiver == address(0)) { revert Errors.EmptyReceiver(); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SignedMath.sol"; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; /** * @title Calc * @dev Library for math functions */ library Calc { using SignedMath for int256; using SafeCast for uint256; /** * @dev Calculates the result of dividing the first number by the second number, * rounded up to the nearest integer. * * @param a the dividend * @param b the divisor * @return the result of dividing the first number by the second number, rounded up to the nearest integer */ function roundUpDivision(uint256 a, uint256 b) internal pure returns (uint256) { return (a + b - 1) / b; } /** * Calculates the result of dividing the first number by the second number, * rounded up to the nearest integer. * The rounding is purely on the magnitude of a, if a is negative the result * is a larger magnitude negative * * @param a the dividend * @param b the divisor * @return the result of dividing the first number by the second number, rounded up to the nearest integer */ function roundUpMagnitudeDivision(int256 a, uint256 b) internal pure returns (int256) { if (a < 0) { return (a - b.toInt256() + 1) / b.toInt256(); } return (a + b.toInt256() - 1) / b.toInt256(); } /** * Adds two numbers together and return a uint256 value, treating the second number as a signed integer. * * @param a the first number * @param b the second number * @return the result of adding the two numbers together */ function sumReturnUint256(uint256 a, int256 b) internal pure returns (uint256) { if (b > 0) { return a + b.abs(); } return a - b.abs(); } /** * Adds two numbers together and return an int256 value, treating the second number as a signed integer. * * @param a the first number * @param b the second number * @return the result of adding the two numbers together */ function sumReturnInt256(uint256 a, int256 b) internal pure returns (int256) { return a.toInt256() + b; } /** * @dev Calculates the absolute difference between two numbers. * * @param a the first number * @param b the second number * @return the absolute difference between the two numbers */ function diff(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a - b : b - a; } /** * Adds two numbers together, the result is bounded to prevent overflows. * * @param a the first number * @param b the second number * @return the result of adding the two numbers together */ function boundedAdd(int256 a, int256 b) internal pure returns (int256) { // if either a or b is zero or if the signs are different there should not be any overflows if (a == 0 || b == 0 || (a < 0 && b > 0) || (a > 0 && b < 0)) { return a + b; } // if adding `b` to `a` would result in a value less than the min int256 value // then return the min int256 value if (a < 0 && b <= type(int256).min - a) { return type(int256).min; } // if adding `b` to `a` would result in a value more than the max int256 value // then return the max int256 value if (a > 0 && b >= type(int256).max - a) { return type(int256).max; } return a + b; } /** * Returns a - b, the result is bounded to prevent overflows. * Note that this will revert if b is type(int256).min because of the usage of "-b". * * @param a the first number * @param b the second number * @return the bounded result of a - b */ function boundedSub(int256 a, int256 b) internal pure returns (int256) { // if either a or b is zero or the signs are the same there should not be any overflow if (a == 0 || b == 0 || (a > 0 && b > 0) || (a < 0 && b < 0)) { return a - b; } // if adding `-b` to `a` would result in a value greater than the max int256 value // then return the max int256 value if (a > 0 && -b >= type(int256).max - a) { return type(int256).max; } // if subtracting `b` from `a` would result in a value less than the min int256 value // then return the min int256 value if (a < 0 && -b <= type(int256).min - a) { return type(int256).min; } return a - b; } /** * Converts the given unsigned integer to a signed integer, using the given * flag to determine whether the result should be positive or negative. * * @param a the unsigned integer to convert * @param isPositive whether the result should be positive (if true) or negative (if false) * @return the signed integer representation of the given unsigned integer */ function toSigned(uint256 a, bool isPositive) internal pure returns (int256) { if (isPositive) { return a.toInt256(); } else { return -a.toInt256(); } } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol"; /** * @title EnumerableValues * @dev Library to extend the EnumerableSet library with functions to get * valuesAt for a range */ library EnumerableValues { using EnumerableSet for EnumerableSet.Bytes32Set; using EnumerableSet for EnumerableSet.AddressSet; using EnumerableSet for EnumerableSet.UintSet; /** * Returns an array of bytes32 values from the given set, starting at the given * start index and ending before the given end index. * * @param set The set to get the values from. * @param start The starting index. * @param end The ending index. * @return An array of bytes32 values. */ function valuesAt(EnumerableSet.Bytes32Set storage set, uint256 start, uint256 end) internal view returns (bytes32[] memory) { uint256 max = set.length(); if (end > max) { end = max; } bytes32[] memory items = new bytes32[](end - start); for (uint256 i = start; i < end; i++) { items[i - start] = set.at(i); } return items; } /** * Returns an array of address values from the given set, starting at the given * start index and ending before the given end index. * * @param set The set to get the values from. * @param start The starting index. * @param end The ending index. * @return An array of address values. */ function valuesAt(EnumerableSet.AddressSet storage set, uint256 start, uint256 end) internal view returns (address[] memory) { uint256 max = set.length(); if (end > max) { end = max; } address[] memory items = new address[](end - start); for (uint256 i = start; i < end; i++) { items[i - start] = set.at(i); } return items; } /** * Returns an array of uint256 values from the given set, starting at the given * start index and ending before the given end index, the item at the end index will not be returned. * * @param set The set to get the values from. * @param start The starting index (inclusive, item at the start index will be returned). * @param end The ending index (exclusive, item at the end index will not be returned). * @return An array of uint256 values. */ function valuesAt(EnumerableSet.UintSet storage set, uint256 start, uint256 end) internal view returns (uint256[] memory) { if (start >= set.length()) { return new uint256[](0); } uint256 max = set.length(); if (end > max) { end = max; } uint256[] memory items = new uint256[](end - start); for (uint256 i = start; i < end; i++) { items[i - start] = set.at(i); } return items; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/math/SafeCast.sol"; import "hardhat/console.sol"; /** * @title Printer * @dev Library for console functions */ library Printer { using SafeCast for int256; function log(string memory label, int256 value) internal view { if (value < 0) { console.log( "%s -%s", label, (-value).toUint256() ); } else { console.log( "%s +%s", label, value.toUint256() ); } } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 10, "details": { "constantOptimizer": true } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract RoleStore","name":"_roleStore","type":"address"},{"internalType":"contract DataStore","name":"_dataStore","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EmptyHoldingAddress","type":"error"},{"inputs":[],"name":"EmptyReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"EmptyTokenTranferGasLimit","type":"error"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"}],"name":"InvalidNativeTokenSender","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"SelfTransferNotSupported","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenTransferError","type":"error"},{"inputs":[{"internalType":"address","name":"msgSender","type":"address"},{"internalType":"string","name":"role","type":"string"}],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"dataStore","outputs":[{"internalType":"contract DataStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recordTransferIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roleStore","outputs":[{"internalType":"contract RoleStore","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"syncTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"shouldUnwrapNativeToken","type":"bool"}],"name":"transferOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferOutNativeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b506040516112c03803806112c083398101604081905261002f9161005e565b6001600160a01b039182166080521660a052610098565b6001600160a01b038116811461005b57600080fd5b50565b6000806040838503121561007157600080fd5b825161007c81610046565b602084015190925061008d81610046565b809150509250929050565b60805160a0516111da6100e660003960008181607b015281816101cf0152818161035d015281816103fe015281816105ba015261061a01526000818161016101526104ed01526111da6000f3fe60806040526004361061006f5760003560e01c8063078d3b79146100dc5780632fb12605146100fc578063352f9aed1461011c5780634a4a7b041461014f578063523fba7f14610190578063660d0d67146101bd578063d443ca94146101f1578063eb40133f1461021157600080fd5b366100d757600061009f7f0000000000000000000000000000000000000000000000000000000000000000610231565b9050336001600160a01b038216146100d5573360405163738d28df60e11b81526004016100cc9190610e58565b60405180910390fd5b005b600080fd5b3480156100e857600080fd5b506100d56100f7366004610e81565b6102e4565b34801561010857600080fd5b506100d5610117366004610ed0565b610344565b34801561012857600080fd5b5061013c610137366004610f23565b6103c8565b6040519081526020015b60405180910390f35b34801561015b57600080fd5b506101837f000000000000000000000000000000000000000000000000000000000000000081565b6040516101469190610e58565b34801561019c57600080fd5b5061013c6101ab366004610f23565b60006020819052908152604090205481565b3480156101c957600080fd5b506101837f000000000000000000000000000000000000000000000000000000000000000081565b3480156101fd57600080fd5b506100d561020c366004610f47565b6103e5565b34801561021d57600080fd5b5061013c61022c366004610f23565b61042f565b6000816001600160a01b03166321f8a7216040516020016102699060208082526003908201526215d39560ea1b604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161029d91815260200190565b602060405180830381865afa1580156102ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102de9190610f73565b92915050565b6103346040516020016102f690610f90565b604051602081830303815290604052805190602001206040518060400160405280600a81526020016921a7a72a2927a62622a960b11b8152506104d6565b61033f83838361058a565b505050565b6103566040516020016102f690610f90565b60006103817f0000000000000000000000000000000000000000000000000000000000000000610231565b9050806001600160a01b0316856001600160a01b03161480156103a15750815b156103b6576103b18585856105ea565b6103c1565b6103c185858561058a565b5050505050565b60006103dc6040516020016102f690610f90565b6102de82610641565b6103f76040516020016102f690610f90565b60006104227f0000000000000000000000000000000000000000000000000000000000000000610231565b905061033f8184846105ea565b60006104436040516020016102f690610f90565b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190610472903090600401610e58565b602060405180830381865afa15801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610fb4565b6001600160a01b0384166000908152602081905260409020819055915050919050565b60405163ac4ab3fb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ac4ab3fb906105249033908690600401610fcd565b602060405180830381865afa158015610541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105659190610fe6565b61058657338160405163a35b150b60e01b81526004016100cc929190611053565b5050565b306001600160a01b038316036105b55781604051637387c8a960e11b81526004016100cc9190610e58565b6105e17f00000000000000000000000000000000000000000000000000000000000000008484846106f2565b61033f83610942565b306001600160a01b038316036106155781604051637387c8a960e11b81526004016100cc9190610e58565b6105e17f00000000000000000000000000000000000000000000000000000000000000008484846109cb565b6001600160a01b0381166000818152602081905260408082205490516370a0823160e01b8152919290918391906370a0823190610682903090600401610e58565b602060405180830381865afa15801561069f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c39190610fb4565b6001600160a01b038516600090815260208190526040902081905590506106ea8282611077565b949350505050565b801561093c5761070182610b2b565b6000846001600160a01b031663bd02d0f561071b86610b55565b6040518263ffffffff1660e01b815260040161073991815260200190565b602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190610fb4565b90508060000361079f5783604051634fe14bfd60e11b81526004016100cc9190610e58565b60006107ad85858585610bdd565b50905080156107bd57505061093c565b6000866001600160a01b03166321f8a721604051602001610801906020808252600f908201526e484f4c44494e475f4144445245535360881b604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161083591815260200190565b602060405180830381865afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190610f73565b90506001600160a01b03811661089f57604051633a6de2f560e21b815260040160405180910390fd5b6000806108ae88848888610bdd565b9150915081156108c257505050505061093c565b60006108cd82610d45565b5090507fc9f14d9a0a9b46470c7c0b6c508f8283abaab7f795f153953c58cd4250824dae8183604051610901929190611098565b60405180910390a160405163012f3b8f60e71b81526001600160a01b03808b16600483015289166024820152604481018890526064016100cc565b50505050565b6040516370a0823160e01b81526001600160a01b038216906370a082319061096e903090600401610e58565b602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190610fb4565b6001600160a01b03909116600090815260208190526040902055565b801561093c576109da82610b2b565b604051632e1a7d4d60e01b8152600481018290526001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b505050506000846001600160a01b031663bd02d0f5604051602001610a86906020808252601f908201527f4e41544956455f544f4b454e5f5452414e534645525f4741535f4c494d495400604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401610aba91815260200190565b602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190610fb4565b90506000806000806000868887f190508015610b1857505061093c565b610b23868585610dd5565b505050505050565b6001600160a01b038116610b525760405163d551823d60e01b815260040160405180910390fd5b50565b6000604051602001610b93906020808252601890820152771513d2d15397d514905394d1915497d1d054d7d31253525560421b604082015260600190565b60408051601f198184030181528282528051602091820120908301526001600160a01b03841690820152606001604051602081830303815290604052805190602001209050919050565b60006060600063a9059cbb60e01b8686604051602401610bfe929190610fcd565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080886001600160a01b03168684604051610c4f91906110c6565b60006040518083038160008787f1925050503d8060008114610c8d576040519150601f19603f3d011682016040523d82523d6000602084013e610c92565b606091505b50915091508115610d33578051600003610cf0576001600160a01b0389163b610cf05760006040518060400160405280601481526020017310d85b1b081d1bc81b9bdb8b58dbdb9d1c9858dd60621b81525094509450505050610d3c565b60008151118015610d12575080806020019051810190610d109190610fe6565b155b15610d2557600094509250610d3c915050565b600194509250610d3c915050565b60009450925050505b94509492505050565b60606000604483511015610d6c575050604080516020810190915260008082529092909150565b6000610d79846020015190565b90506307b9e43360e51b6001600160e01b0319821601610db85760048401935083806020019051810190610dad91906110f8565b946001945092505050565b600060405180602001604052806000815250909250925050915091565b80600003610de257505050565b610deb82610b2b565b6000610df684610231565b9050806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e3357600080fd5b505af1158015610e47573d6000803e3d6000fd5b505050505061093c848285856106f2565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114610b5257600080fd5b600080600060608486031215610e9657600080fd5b8335610ea181610e6c565b92506020840135610eb181610e6c565b929592945050506040919091013590565b8015158114610b5257600080fd5b60008060008060808587031215610ee657600080fd5b8435610ef181610e6c565b93506020850135610f0181610e6c565b9250604085013591506060850135610f1881610ec2565b939692955090935050565b600060208284031215610f3557600080fd5b8135610f4081610e6c565b9392505050565b60008060408385031215610f5a57600080fd5b8235610f6581610e6c565b946020939093013593505050565b600060208284031215610f8557600080fd5b8151610f4081610e6c565b6020808252600a908201526921a7a72a2927a62622a960b11b604082015260600190565b600060208284031215610fc657600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610ff857600080fd5b8151610f4081610ec2565b60005b8381101561101e578181015183820152602001611006565b50506000910152565b6000815180845261103f816020860160208601611003565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906106ea90830184611027565b818103818111156102de57634e487b7160e01b600052601160045260246000fd5b6040815260006110ab6040830185611027565b82810360208401526110bd8185611027565b95945050505050565b600082516110d8818460208701611003565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561110a57600080fd5b81516001600160401b038082111561112157600080fd5b818401915084601f83011261113557600080fd5b815181811115611147576111476110e2565b604051601f8201601f19908116603f0116810190838211818310171561116f5761116f6110e2565b8160405282815287602084870101111561118857600080fd5b611199836020830160208801611003565b97965050505050505056fea2646970667358221220198a913a620ed4418cd55d6fddb21471b5284e7ce9076023e8ad0bb04d95a15964736f6c63430008120033000000000000000000000000a44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6
Deployed Bytecode
0x60806040526004361061006f5760003560e01c8063078d3b79146100dc5780632fb12605146100fc578063352f9aed1461011c5780634a4a7b041461014f578063523fba7f14610190578063660d0d67146101bd578063d443ca94146101f1578063eb40133f1461021157600080fd5b366100d757600061009f7f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6610231565b9050336001600160a01b038216146100d5573360405163738d28df60e11b81526004016100cc9190610e58565b60405180910390fd5b005b600080fd5b3480156100e857600080fd5b506100d56100f7366004610e81565b6102e4565b34801561010857600080fd5b506100d5610117366004610ed0565b610344565b34801561012857600080fd5b5061013c610137366004610f23565b6103c8565b6040519081526020015b60405180910390f35b34801561015b57600080fd5b506101837f000000000000000000000000a44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd81565b6040516101469190610e58565b34801561019c57600080fd5b5061013c6101ab366004610f23565b60006020819052908152604090205481565b3480156101c957600080fd5b506101837f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f681565b3480156101fd57600080fd5b506100d561020c366004610f47565b6103e5565b34801561021d57600080fd5b5061013c61022c366004610f23565b61042f565b6000816001600160a01b03166321f8a7216040516020016102699060208082526003908201526215d39560ea1b604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161029d91815260200190565b602060405180830381865afa1580156102ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102de9190610f73565b92915050565b6103346040516020016102f690610f90565b604051602081830303815290604052805190602001206040518060400160405280600a81526020016921a7a72a2927a62622a960b11b8152506104d6565b61033f83838361058a565b505050565b6103566040516020016102f690610f90565b60006103817f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6610231565b9050806001600160a01b0316856001600160a01b03161480156103a15750815b156103b6576103b18585856105ea565b6103c1565b6103c185858561058a565b5050505050565b60006103dc6040516020016102f690610f90565b6102de82610641565b6103f76040516020016102f690610f90565b60006104227f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6610231565b905061033f8184846105ea565b60006104436040516020016102f690610f90565b6040516370a0823160e01b81526000906001600160a01b038416906370a0823190610472903090600401610e58565b602060405180830381865afa15801561048f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104b39190610fb4565b6001600160a01b0384166000908152602081905260409020819055915050919050565b60405163ac4ab3fb60e01b81526001600160a01b037f000000000000000000000000a44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd169063ac4ab3fb906105249033908690600401610fcd565b602060405180830381865afa158015610541573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105659190610fe6565b61058657338160405163a35b150b60e01b81526004016100cc929190611053565b5050565b306001600160a01b038316036105b55781604051637387c8a960e11b81526004016100cc9190610e58565b6105e17f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f68484846106f2565b61033f83610942565b306001600160a01b038316036106155781604051637387c8a960e11b81526004016100cc9190610e58565b6105e17f0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f68484846109cb565b6001600160a01b0381166000818152602081905260408082205490516370a0823160e01b8152919290918391906370a0823190610682903090600401610e58565b602060405180830381865afa15801561069f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106c39190610fb4565b6001600160a01b038516600090815260208190526040902081905590506106ea8282611077565b949350505050565b801561093c5761070182610b2b565b6000846001600160a01b031663bd02d0f561071b86610b55565b6040518263ffffffff1660e01b815260040161073991815260200190565b602060405180830381865afa158015610756573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077a9190610fb4565b90508060000361079f5783604051634fe14bfd60e11b81526004016100cc9190610e58565b60006107ad85858585610bdd565b50905080156107bd57505061093c565b6000866001600160a01b03166321f8a721604051602001610801906020808252600f908201526e484f4c44494e475f4144445245535360881b604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b815260040161083591815260200190565b602060405180830381865afa158015610852573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108769190610f73565b90506001600160a01b03811661089f57604051633a6de2f560e21b815260040160405180910390fd5b6000806108ae88848888610bdd565b9150915081156108c257505050505061093c565b60006108cd82610d45565b5090507fc9f14d9a0a9b46470c7c0b6c508f8283abaab7f795f153953c58cd4250824dae8183604051610901929190611098565b60405180910390a160405163012f3b8f60e71b81526001600160a01b03808b16600483015289166024820152604481018890526064016100cc565b50505050565b6040516370a0823160e01b81526001600160a01b038216906370a082319061096e903090600401610e58565b602060405180830381865afa15801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190610fb4565b6001600160a01b03909116600090815260208190526040902055565b801561093c576109da82610b2b565b604051632e1a7d4d60e01b8152600481018290526001600160a01b03841690632e1a7d4d90602401600060405180830381600087803b158015610a1c57600080fd5b505af1158015610a30573d6000803e3d6000fd5b505050506000846001600160a01b031663bd02d0f5604051602001610a86906020808252601f908201527f4e41544956455f544f4b454e5f5452414e534645525f4741535f4c494d495400604082015260600190565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b8152600401610aba91815260200190565b602060405180830381865afa158015610ad7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610afb9190610fb4565b90506000806000806000868887f190508015610b1857505061093c565b610b23868585610dd5565b505050505050565b6001600160a01b038116610b525760405163d551823d60e01b815260040160405180910390fd5b50565b6000604051602001610b93906020808252601890820152771513d2d15397d514905394d1915497d1d054d7d31253525560421b604082015260600190565b60408051601f198184030181528282528051602091820120908301526001600160a01b03841690820152606001604051602081830303815290604052805190602001209050919050565b60006060600063a9059cbb60e01b8686604051602401610bfe929190610fcd565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050509050600080886001600160a01b03168684604051610c4f91906110c6565b60006040518083038160008787f1925050503d8060008114610c8d576040519150601f19603f3d011682016040523d82523d6000602084013e610c92565b606091505b50915091508115610d33578051600003610cf0576001600160a01b0389163b610cf05760006040518060400160405280601481526020017310d85b1b081d1bc81b9bdb8b58dbdb9d1c9858dd60621b81525094509450505050610d3c565b60008151118015610d12575080806020019051810190610d109190610fe6565b155b15610d2557600094509250610d3c915050565b600194509250610d3c915050565b60009450925050505b94509492505050565b60606000604483511015610d6c575050604080516020810190915260008082529092909150565b6000610d79846020015190565b90506307b9e43360e51b6001600160e01b0319821601610db85760048401935083806020019051810190610dad91906110f8565b946001945092505050565b600060405180602001604052806000815250909250925050915091565b80600003610de257505050565b610deb82610b2b565b6000610df684610231565b9050806001600160a01b031663d0e30db0836040518263ffffffff1660e01b81526004016000604051808303818588803b158015610e3357600080fd5b505af1158015610e47573d6000803e3d6000fd5b505050505061093c848285856106f2565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114610b5257600080fd5b600080600060608486031215610e9657600080fd5b8335610ea181610e6c565b92506020840135610eb181610e6c565b929592945050506040919091013590565b8015158114610b5257600080fd5b60008060008060808587031215610ee657600080fd5b8435610ef181610e6c565b93506020850135610f0181610e6c565b9250604085013591506060850135610f1881610ec2565b939692955090935050565b600060208284031215610f3557600080fd5b8135610f4081610e6c565b9392505050565b60008060408385031215610f5a57600080fd5b8235610f6581610e6c565b946020939093013593505050565b600060208284031215610f8557600080fd5b8151610f4081610e6c565b6020808252600a908201526921a7a72a2927a62622a960b11b604082015260600190565b600060208284031215610fc657600080fd5b5051919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215610ff857600080fd5b8151610f4081610ec2565b60005b8381101561101e578181015183820152602001611006565b50506000910152565b6000815180845261103f816020860160208601611003565b601f01601f19169290920160200192915050565b6001600160a01b03831681526040602082018190526000906106ea90830184611027565b818103818111156102de57634e487b7160e01b600052601160045260246000fd5b6040815260006110ab6040830185611027565b82810360208401526110bd8185611027565b95945050505050565b600082516110d8818460208701611003565b9190910192915050565b634e487b7160e01b600052604160045260246000fd5b60006020828403121561110a57600080fd5b81516001600160401b038082111561112157600080fd5b818401915084601f83011261113557600080fd5b815181811115611147576111476110e2565b604051601f8201601f19908116603f0116810190838211818310171561116f5761116f6110e2565b8160405282815287602084870101111561118857600080fd5b611199836020830160208801611003565b97965050505050505056fea2646970667358221220198a913a620ed4418cd55d6fddb21471b5284e7ce9076023e8ad0bb04d95a15964736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6
-----Decoded View---------------
Arg [0] : _roleStore (address): 0xA44F830B6a2B6fa76657a3B92C1fe74fcB7C6AfD
Arg [1] : _dataStore (address): 0x2F0b22339414ADeD7D5F06f9D604c7fF5b2fe3f6
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a44f830b6a2b6fa76657a3b92c1fe74fcb7c6afd
Arg [1] : 0000000000000000000000002f0b22339414aded7d5f06f9d604c7ff5b2fe3f6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.