More Info
Private Name Tags
ContractCreator
Multichain Info
No addresses found
Latest 25 from a total of 270 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 14943532 | 77 days ago | IN | 0 ETH | 0.00000046 | ||||
Exit | 12433273 | 135 days ago | IN | 0 ETH | 0.00000042 | ||||
Exit | 6795825 | 266 days ago | IN | 0 ETH | 0.00000098 | ||||
Exit | 6477630 | 273 days ago | IN | 0 ETH | 0.00000042 | ||||
Exit | 5829985 | 288 days ago | IN | 0 ETH | 0.00000079 | ||||
Exit | 5458512 | 297 days ago | IN | 0 ETH | 0.00000193 | ||||
Exit | 5375099 | 299 days ago | IN | 0 ETH | 0.00000176 | ||||
Exit | 5373075 | 299 days ago | IN | 0 ETH | 0.00000166 | ||||
Exit | 5301371 | 300 days ago | IN | 0 ETH | 0.00119454 | ||||
Exit | 4292152 | 324 days ago | IN | 0 ETH | 0.00000193 | ||||
Exit | 4242178 | 325 days ago | IN | 0 ETH | 0.00000702 | ||||
Exit | 4120969 | 328 days ago | IN | 0 ETH | 0.0000017 | ||||
Exit | 4112797 | 328 days ago | IN | 0 ETH | 0.00000106 | ||||
Exit | 3104610 | 351 days ago | IN | 0 ETH | 0.00000168 | ||||
Exit | 3007745 | 354 days ago | IN | 0 ETH | 0 | ||||
Exit | 2869225 | 357 days ago | IN | 0 ETH | 0.00000015 | ||||
Exit | 2420314 | 367 days ago | IN | 0 ETH | 0.00000017 | ||||
Exit | 2199189 | 372 days ago | IN | 0 ETH | 0.00000018 | ||||
Exit | 2127816 | 374 days ago | IN | 0 ETH | 0.00000019 | ||||
Exit | 2098135 | 375 days ago | IN | 0 ETH | 0.00000017 | ||||
Exit | 2092082 | 375 days ago | IN | 0 ETH | 0.0000002 | ||||
Exit | 2091964 | 375 days ago | IN | 0 ETH | 0.00000021 | ||||
Exit | 2073843 | 375 days ago | IN | 0 ETH | 0.00000021 | ||||
Exit | 2071278 | 375 days ago | IN | 0 ETH | 0.00000017 | ||||
Claim All | 2064022 | 375 days ago | IN | 0 ETH | 0.00000012 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
14943532 | 77 days ago | 0.03086739 ETH | ||||
12433273 | 135 days ago | 0.00409126 ETH | ||||
6795825 | 266 days ago | 0.01516999 ETH | ||||
6477630 | 273 days ago | 0.00809831 ETH | ||||
5829985 | 288 days ago | 0.03025966 ETH | ||||
5458512 | 297 days ago | 0.00302903 ETH | ||||
5375099 | 299 days ago | 0.00020174 ETH | ||||
5373075 | 299 days ago | 0.01010183 ETH | ||||
5301371 | 300 days ago | 0.01008383 ETH | ||||
4292152 | 324 days ago | 0.01009196 ETH | ||||
4242178 | 325 days ago | 0.20151112 ETH | ||||
4120969 | 328 days ago | 0.33202867 ETH | ||||
4112797 | 328 days ago | 0.50384714 ETH | ||||
3104610 | 351 days ago | 0.01005103 ETH | ||||
3007745 | 354 days ago | 0.20086192 ETH | ||||
2869225 | 357 days ago | 0.00000007 ETH | ||||
2420314 | 367 days ago | 0.01006615 ETH | ||||
2199189 | 372 days ago | 0.00100265 ETH | ||||
2127816 | 374 days ago | 0.10037396 ETH | ||||
2098135 | 375 days ago | 25.16317746 ETH | ||||
2092082 | 375 days ago | 26.15354038 ETH | ||||
2091964 | 375 days ago | 0.00301013 ETH | ||||
2073843 | 375 days ago | 0.10027544 ETH | ||||
2071278 | 375 days ago | 0.050035 ETH | ||||
2062448 | 375 days ago | 0.60141617 ETH |
Loading...
Loading
Contract Name:
PtyPoolSellHigh
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "./PtyPool.sol"; contract PtyPoolSellHigh is PtyPool { using SafeMath for uint256; constructor( address _wandProtocol, address _settings, address _vault_, address _stakingYieldsToken_, address _matchingYieldsToken_ ) PtyPool(_wandProtocol, _settings, _vault_, _stakingYieldsToken_, _matchingYieldsToken_) { _stakingToken = _vault.assetToken(); _targetToken = wandProtocol.usbToken(); require(_stakingToken == _stakingYieldsToken, "PtyPoolSellHigh: staking token and staking yields token mismatch"); } /* ========== VIEWS ========== */ function earnedStakingYields(address) public override pure returns (uint256) { revert("Staking yields is auto rebased"); } /* ========== MUTATIVE FUNCTIONS ========== */ function getStakingYields() public override pure { revert("Staking yields is auto rebased"); } function claimAll() external override { getMatchingOutTokens(); getMatchingYields(); } function exit() external override { withdraw(_userStakingBalance(_msgSender(), 0)); getMatchingYields(); getMatchingOutTokens(); } /* ========== RESTRICTED FUNCTIONS ========== */ function addStakingYields(uint256 yieldsAmount) external payable override nonReentrant updateStakingYields(address(0)) onlyVault { require(yieldsAmount > 0, "Too small yields amount"); require(_totalStakingShares > 0, "No user stakes"); emit StakingYieldsAdded(yieldsAmount); } function notifyBuyLowTriggered(uint256) external override pure { revert("PtyPoolSellHigh: notifyBuyLowTriggered not allowed"); } function notifySellHighTriggered(uint256 assetAmountMatched, uint256 usbSharesReceived) external override nonReentrant updateTargetTokens(address(0)) onlyVault { require(_vault.vaultMode() == Constants.VaultMode.AdjustmentAboveAARU, "Vault not in adjustment above AARU mode"); TokensTransfer.transferTokens(_stakingToken, address(this), _msgSender(), assetAmountMatched); _targetTokensPerShare = _targetTokensPerShare.add(usbSharesReceived.mul(1e18).div(_totalStakingShares)); emit MatchedTokensAdded(usbSharesReceived); if (_accruedMatchingYields > 0) { _matchingYieldsPerShare = _matchingYieldsPerShare.add(_accruedMatchingYields.mul(1e18).div(_totalStakingShares)); _accruedMatchingYields = 0; } } /* ================= INTERNAL Functions ================ */ function _totalStakingBalance(uint256 msgValue) internal override view returns (uint256) { if (_stakingToken == Constants.NATIVE_TOKEN) { return address(this).balance.sub(msgValue); } else { return IERC20(_stakingToken).balanceOf(address(this)); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/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.9.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.9.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/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; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ 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)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ 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"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Compatible with tokens that require the approval to be set to * 0 before setting it to a non-zero value. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ 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"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation 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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { 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 require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; enum YieldMode { AUTOMATIC, VOID, CLAIMABLE } enum GasMode { VOID, CLAIMABLE } interface IBlast{ // configure function configureContract(address contractAddress, YieldMode _yield, GasMode gasMode, address governor) external; function configure(YieldMode _yield, GasMode gasMode, address governor) external; // base configuration options function configureClaimableYield() external; function configureClaimableYieldOnBehalf(address contractAddress) external; function configureAutomaticYield() external; function configureAutomaticYieldOnBehalf(address contractAddress) external; function configureVoidYield() external; function configureVoidYieldOnBehalf(address contractAddress) external; function configureClaimableGas() external; function configureClaimableGasOnBehalf(address contractAddress) external; function configureVoidGas() external; function configureVoidGasOnBehalf(address contractAddress) external; function configureGovernor(address _governor) external; function configureGovernorOnBehalf(address _newGovernor, address contractAddress) external; // claim yield function claimYield(address contractAddress, address recipientOfYield, uint256 amount) external returns (uint256); function claimAllYield(address contractAddress, address recipientOfYield) external returns (uint256); // claim gas function claimAllGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGasAtMinClaimRate(address contractAddress, address recipientOfGas, uint256 minClaimRateBips) external returns (uint256); function claimMaxGas(address contractAddress, address recipientOfGas) external returns (uint256); function claimGas(address contractAddress, address recipientOfGas, uint256 gasToClaim, uint256 gasSecondsToConsume) external returns (uint256); // read functions function readClaimableYield(address contractAddress) external view returns (uint256); function readYieldConfiguration(address contractAddress) external view returns (uint8); function readGasParams(address contractAddress) external view returns (uint256 etherSeconds, uint256 etherBalance, uint256 lastUpdated, GasMode); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; interface IBlastPoints { function configurePointsOperator(address operator) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; interface IProtocolSettings { function treasury() external view returns (address); function decimals() external view returns (uint256); function isValidParam(bytes32 param, uint256 value) external view returns (bool); function paramDefaultValue(bytes32 param) external view returns (uint256); function vaultParamValue(address vault, bytes32 param) external view returns (uint256); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IUsb is IERC20 { function decimals() external view returns (uint8); function getBalanceByShares(uint256 sharesAmount) external view returns (uint256); function getSharesByBalance(uint256 balance) external view returns (uint256); function configureBlastYieldsAndGas() external; function mint(address to, uint256 amount) external returns (uint256); function burn(address account, uint256 amount) external returns (uint256); function transferShares(address to, uint256 sharesAmount) external returns (uint256); function rebase(uint256 addedSupply) external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "../libs/Constants.sol"; interface IVault { function vaultType() external pure returns (Constants.VaultType); function AARDecimals() external pure returns (uint256); function usbToken() external view returns (address); function assetToken() external view returns (address); function assetTokenDecimals() external view returns (uint8); function assetTokenPrice() external view returns (uint256, uint256); function assetBalance() external view returns (uint256); function usbTotalSupply() external view returns (uint256); function marginToken() external view returns (address); function vaultMode() external view returns (Constants.VaultMode); function paramValue(bytes32 param) external view returns (uint256); function AARBelowSafeLineTime() external view returns (uint256); function AARBelowCircuitBreakerLineTime() external view returns (uint256); function configureBlastYieldsAndGas() external; function configureBlastPoints() external; }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; interface IWandProtocol { function protocolOwner() external view returns (address); function usbToken() external view returns (address); function blastAddress() external view returns (address); function blastPointsAddress() external view returns (address); function blastPointsOperator() external view returns (address); function isVault(address vaultAddress) external view returns (bool); function isVaultAsset(address assetToken) external view returns (bool); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; library Constants { /** * @notice The address interpreted as native token of the chain. */ address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE; uint256 public constant PROTOCOL_DECIMALS = 10; struct Terms { uint256 T1; uint256 T2; uint256 T3; uint256 T4; uint256 T5; uint256 T6; uint256 T7; uint256 T8; } enum VaultType { Volatile, Stable } enum VaultMode { Empty, Stability, AdjustmentBelowAARS, AdjustmentAboveAARU } struct VaultState { uint256 M_ETH; uint256 P_ETH; uint256 P_ETH_DECIMALS; uint256 M_USB_ETH; uint256 M_ETHx; uint256 aar; uint256 AART; uint256 AARS; uint256 AARU; uint256 AARC; uint256 AARDecimals; uint256 RateR; uint256 AARBelowSafeLineTime; uint256 AARBelowCircuitBreakerLineTime; } struct StableVaultState { uint256 M_USDC; uint256 P_USDC; uint256 P_USDC_DECIMALS; uint256 M_USB_USDC; uint256 M_USDCx; uint256 aar; // uint256 AART; uint256 AARS; // uint256 AARU; // uint256 AARC; uint256 AARDecimals; uint256 RateR; uint256 AARBelowSafeLineTime; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./Constants.sol"; library TokensTransfer { using SafeERC20 for IERC20; /// @dev Transfers a given amount of token. function transferTokens( address token, address from, address to, uint256 amount ) internal { if (token == Constants.NATIVE_TOKEN) { safeTransferNativeToken(from, to, amount); } else { safeTransferERC20(token, from, to, amount); } } /// @dev Transfers `amount` of native token to `to`. function safeTransferNativeToken(address from, address to, uint256 amount) internal { require(from != to, "Same address"); require(from != address(0) && to != address(0), "Zero address"); require(from == address(this) || to == address(this), "One of the addresses must be this contract"); require(amount > 0, "Amount must be greater than 0"); if (to == address(this)) { require(msg.value == amount, "Incorrect msg.value"); return; } // solhint-disable avoid-low-level-calls // slither-disable-next-line low-level-calls (bool success, ) = to.call{ value: amount }(""); require(success, "Native token transfer failed"); } /// @dev Transfer `amount` of ERC20 token from `from` to `to`. function safeTransferERC20( address token, address from, address to, uint256 amount ) internal { require(from != to, "Same address"); require(from != address(0) && to != address(0), "Zero address"); // require(from == address(this) || to == address(this), "One of the addresses must be this contract"); require(amount > 0, "Amount must be greater than 0"); if (from == address(this)) { IERC20(token).safeTransfer(to, amount); } else { IERC20(token).safeTransferFrom(from, to, amount); } } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "@openzeppelin/contracts/utils/Context.sol"; import "../interfaces/IWandProtocol.sol"; abstract contract ProtocolOwner is Context { IWandProtocol public immutable wandProtocol; constructor(address _wandProtocol_) { require(_wandProtocol_ != address(0), "Zero address detected"); wandProtocol = IWandProtocol(_wandProtocol_); } modifier onlyProtocol() { require(_msgSender() == address(wandProtocol), "Ownable: caller is not the protocol"); _; } modifier onlyOwner() { require(_msgSender() == IWandProtocol(wandProtocol).protocolOwner(), "Ownable: caller is not the owner"); _; } function owner() public view returns(address) { return IWandProtocol(wandProtocol).protocolOwner(); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.18; import "hardhat/console.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; import "../libs/Constants.sol"; import "../libs/TokensTransfer.sol"; import "../interfaces/IBlast.sol"; import "../interfaces/IBlastPoints.sol"; import "../interfaces/IProtocolSettings.sol"; import "../interfaces/IUsb.sol"; import "../interfaces/IVault.sol"; import "../interfaces/IWandProtocol.sol"; import "../settings/ProtocolOwner.sol"; abstract contract PtyPool is ProtocolOwner, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /* ========== STATE VARIABLES ========== */ IProtocolSettings public immutable settings; IVault internal immutable _vault; address internal _stakingToken; address internal _targetToken; address internal _stakingYieldsToken; address internal _matchingYieldsToken; uint256 internal _totalStakingShares; mapping(address => uint256) internal _userStakingShares; uint256 internal _accruedMatchingYields; uint256 internal _matchingYieldsPerShare; // For MintUsbAboveAARU pools, matching yields is paid in USB shares (since it's rebasable token) mapping(address => uint256) internal _userMatchingYieldsPerSharePaid; mapping(address => uint256) internal _userMatchingYields; uint256 internal _targetTokensPerShare; mapping(address => uint256) internal _userTargetTokenSharesPerSharePaid; mapping(address => uint256) internal _userTargetTokenShares; /* ========== CONSTRUCTOR ========== */ constructor( address _wandProtocol, address _settings, address _vault_, address _stakingYieldsToken_, address _matchingYieldsToken_ ) ProtocolOwner(_wandProtocol) { settings = IProtocolSettings(_settings); _vault = IVault(_vault_); _stakingYieldsToken = _stakingYieldsToken_; _matchingYieldsToken = _matchingYieldsToken_; } receive() external payable {} /* ========== VIEWS ========== */ function vault() public view returns (address) { return address(_vault); } function stakingToken() public view returns (address) { return _stakingToken; } function targetToken() public view returns (address) { return _targetToken; } function stakingYieldsToken() public view returns (address) { return _stakingYieldsToken; } function machingYieldsToken() public view returns (address) { return _matchingYieldsToken; } function totalStakingShares() public view returns (uint256) { return _totalStakingShares; } function totalStakingBalance() external view returns (uint256) { return _totalStakingBalance(0); } function userStakingShares(address account) public view returns (uint256) { return _userStakingShares[account]; } function userStakingBalance(address account) external view returns (uint256) { return _userStakingBalance(account, 0); } function earnedStakingYields(address account) public view virtual returns (uint256); function earnedMatchingYields(address account) public view returns (uint256) { return _userStakingShares[account].mul(_matchingYieldsPerShare.sub(_userMatchingYieldsPerSharePaid[account])).div(1e18).add(_userMatchingYields[account]); } function earnedMatchedToken(address account) public view returns (uint256) { return _userStakingShares[account].mul(_targetTokensPerShare.sub(_userTargetTokenSharesPerSharePaid[account])).div(1e18).add(_userTargetTokenShares[account]); } function getStakingSharesByBalance(uint256 stakingBalance) external view returns (uint256) { return _getStakingSharesByBalance(stakingBalance, 0); } function getStakingBalanceByShares(uint256 stakingShares) external view returns (uint256) { return _getStakingBalanceByShares(stakingShares, 0); } function getAccruedMatchingYields() public view returns(uint256){ return _accruedMatchingYields; } /* ========== MUTATIVE FUNCTIONS ========== */ function stake(uint256 amount) external payable nonReentrant onUserAction updateStakingYields(_msgSender()) updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) { require(amount > 0, "Cannot stake 0"); uint256 sharesAmount = _getStakingSharesByBalance(amount, msg.value); _totalStakingShares = _totalStakingShares.add(sharesAmount); _userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].add(sharesAmount); TokensTransfer.transferTokens(_stakingToken, _msgSender(), address(this), amount); emit Staked(_msgSender(), amount); } function withdraw(uint256 amount) public nonReentrant onUserAction updateStakingYields(_msgSender()) updateMatchingYields(_msgSender()) updateTargetTokens(_msgSender()) { require(amount > 0, "Cannot withdraw 0"); require(amount <= _userStakingBalance(_msgSender(), 0), "Insufficient balance"); uint256 sharesAmount = _getStakingSharesByBalance(amount, 0); _totalStakingShares = _totalStakingShares.sub(sharesAmount); _userStakingShares[_msgSender()] = _userStakingShares[_msgSender()].sub(sharesAmount); TokensTransfer.transferTokens(_stakingToken, address(this), _msgSender(), amount); emit Withdrawn(_msgSender(), amount); } function getStakingYields() public virtual; function getMatchingYields() public nonReentrant onUserAction updateMatchingYields(_msgSender()) { uint256 userYields = _userMatchingYields[_msgSender()]; if (userYields > 0) { _userMatchingYields[_msgSender()] = 0; TokensTransfer.transferTokens(_matchingYieldsToken, address(this), _msgSender(), userYields); emit MatchingYieldsPaid(_msgSender(), userYields); } } function getMatchingOutTokens() public nonReentrant onUserAction updateTargetTokens(_msgSender()) { uint256 userYields = _userTargetTokenShares[_msgSender()]; if (userYields > 0) { _userTargetTokenShares[_msgSender()] = 0; TokensTransfer.transferTokens(_targetToken, address(this), _msgSender(), userYields); emit MatchedTokenPaid(_msgSender(), userYields); } } /** * @notice Useful for Pty Pools Buy Low, since matching out tokens and yields tokens are all asset tokens. */ function getMatchingTokensAndYields() external { getMatchingOutTokens(); getMatchingYields(); } function claimAll() external virtual; function exit() external virtual; /* ========== RESTRICTED FUNCTIONS ========== */ function configureBlastYieldsAndGas() external nonReentrant onlyVault { address blastAddress = wandProtocol.blastAddress(); if (blastAddress != address(0)) { IBlast blast = IBlast(wandProtocol.blastAddress()); if (_stakingToken == Constants.NATIVE_TOKEN) { blast.configureAutomaticYield(); } blast.configureClaimableGas(); } } function configureBlastPoints() external nonReentrant onlyVault { address blastPointsAddress = wandProtocol.blastPointsAddress(); address blastPointsOperatorAddress = wandProtocol.blastPointsOperator(); if (blastPointsAddress != address(0) && blastPointsOperatorAddress != address(0)) { IBlastPoints blastPoints = IBlastPoints(blastPointsAddress); blastPoints.configurePointsOperator(blastPointsOperatorAddress); } } function addStakingYields(uint256 yieldsAmount) external payable virtual; function addMatchingYields(uint256 yieldsAmount) external nonReentrant updateMatchingYields(address(0)) onlyVault { require(yieldsAmount > 0, "Too small yields amount"); require(_totalStakingShares > 0, "No user stakes"); _accruedMatchingYields = _accruedMatchingYields.add(yieldsAmount); emit MatchingYieldsAdded(yieldsAmount); } function notifyBuyLowTriggered(uint256 assetAmountAdded) external virtual; function notifySellHighTriggered(uint256 assetAmountMatched, uint256 usbSharesReceived) external virtual; /* ================= INTERNAL Functions ================ */ function _userStakingBalance(address account, uint256 msgValue) internal view returns (uint256) { return _getStakingBalanceByShares(_userStakingShares[account], msgValue); } function _totalStakingBalance(uint256 msgValue) internal view virtual returns (uint256); function _getStakingSharesByBalance(uint256 stakingBalance, uint256 msgValue) internal view returns (uint256) { if (_totalStakingBalance(msgValue) == 0 || _totalStakingShares == 0) return stakingBalance; return stakingBalance .mul(_totalStakingShares) .div(_totalStakingBalance(msgValue)); } function _getStakingBalanceByShares(uint256 stakingShares, uint256 msgValue) internal view returns (uint256) { if (_totalStakingShares == 0) return 0; return stakingShares .mul(_totalStakingBalance(msgValue)) .div(_totalStakingShares); } function _doUpdateStakingYields(address account) internal virtual {} /* ========== MODIFIERS ========== */ modifier onUserAction() { _; address blastAddress = wandProtocol.blastAddress(); if (blastAddress != address(0)) { IBlast blast = IBlast(blastAddress); (uint256 etherSeconds, uint256 etherBalance, ,) = blast.readGasParams(address(this)); if (etherSeconds > 0 && etherBalance > 0) { blast.claimAllGas(address(this), settings.treasury()); } } } modifier onlyVault() { require(_msgSender() == address(_vault), "Caller is not Vault"); _; } modifier updateStakingYields(address account) { _doUpdateStakingYields(account); _; } modifier updateMatchingYields(address account) { if (account != address(0)) { _userMatchingYields[account] = earnedMatchingYields(account); _userMatchingYieldsPerSharePaid[account] = _matchingYieldsPerShare; } _; } modifier updateTargetTokens(address account) { if (account != address(0)) { _userTargetTokenShares[account] = earnedMatchedToken(account); _userTargetTokenSharesPerSharePaid[account] = _targetTokensPerShare; } _; } /* ========== EVENTS ========== */ event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event StakingYieldsAdded(uint256 yields); event MatchingYieldsAdded(uint256 yields); event MatchedTokensAdded(uint256 amount); event StakingYieldsPaid(address indexed user, uint256 yields); event MatchingYieldsPaid(address indexed user, uint256 yields); event MatchedTokenPaid(address indexed user, uint256 amount); }
// 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)); } }
{ "metadata": { "bytecodeHash": "ipfs" }, "optimizer": { "enabled": true, "runs": 100, "details": { "yulDetails": { "optimizerSteps": "u" } } }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_wandProtocol","type":"address"},{"internalType":"address","name":"_settings","type":"address"},{"internalType":"address","name":"_vault_","type":"address"},{"internalType":"address","name":"_stakingYieldsToken_","type":"address"},{"internalType":"address","name":"_matchingYieldsToken_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokenPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MatchedTokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"MatchingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"yields","type":"uint256"}],"name":"StakingYieldsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"yieldsAmount","type":"uint256"}],"name":"addStakingYields","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureBlastPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"configureBlastYieldsAndGas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"earnedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earnedStakingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAccruedMatchingYields","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMatchingOutTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingTokensAndYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getMatchingYields","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingShares","type":"uint256"}],"name":"getStakingBalanceByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingBalance","type":"uint256"}],"name":"getStakingSharesByBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingYields","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"machingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"notifyBuyLowTriggered","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetAmountMatched","type":"uint256"},{"internalType":"uint256","name":"usbSharesReceived","type":"uint256"}],"name":"notifySellHighTriggered","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"settings","outputs":[{"internalType":"contract IProtocolSettings","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingYieldsToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"targetToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"userStakingShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wandProtocol","outputs":[{"internalType":"contract IWandProtocol","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e0604052346200008057620000226200001862000163565b9392909262000299565b6040516125ea6200053b82396080518181816103a9015281816106f601528181610ab501528181611b9b0152611da7015260a0518181816105f80152610bb2015260c05181818161077f01528181611b69015261238701526125ea90f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b90601f01601f191681019081106001600160401b03821117620000bd57604052565b62000085565b90620000da620000d260405190565b92836200009b565b565b6001600160a01b031690565b90565b6001600160a01b038116036200008057565b90505190620000da82620000eb565b919060a0838203126200008057620001258184620000fd565b92620001358260208301620000fd565b92620000e8620001498460408501620000fd565b93620001598160608601620000fd565b93608001620000fd565b6200018662002b25803803806200017a81620000c3565b9283398101906200010c565b9091929394565b620000e890620000dc906001600160a01b031682565b620000e8906200018d565b620000e890620001a3565b906020828203126200008057620000e891620000fd565b6040513d6000823e3d90fd5b906001600160a01b03905b9181191691161790565b9062000205620000e86200020d92620001ae565b8254620001dc565b9055565b6020808252620000e891016040808252906020017f507479506f6f6c53656c6c486967683a207374616b696e6720746f6b656e206181527f6e64207374616b696e67207969656c647320746f6b656e206d69736d6174636860208201520190565b156200027a57565b60405162461bcd60e51b815280620002956004820162000211565b0390fd5b90620002a89493929162000403565b620002e46020620002cb620002c560c0516001600160a01b031690565b620001ae565b631083f76190620002db60405190565b93849260e01b90565b825260049082905afa8015620003da576200030b91600091620003e0575b506001620001f1565b62000338602062000328620002c56080516001600160a01b031690565b632e20712190620002db60405190565b825260049082905afa8015620003da576200035f91600091620003a5575b506002620001f1565b620000da620003766001546001600160a01b031690565b6200039e62000391620000dc6003546001600160a01b031690565b916001600160a01b031690565b1462000272565b620003cb915060203d8111620003d2575b620003c281836200009b565b810190620001b9565b3862000356565b503d620003b6565b620001d0565b620003fc915060203d8111620003d257620003c281836200009b565b3862000302565b620004369262000422620000da969593620002c56200042b9462000481565b60a052620001ae565b60c0526003620001f1565b6004620001f1565b620000e8620000e8620000e89290565b620000e860016200043e565b9060001990620001e7565b9062000479620000e86200020d926200043e565b82546200045a565b6200048c906200050a565b620000da6200049a6200044e565b600062000465565b620000dc620000e8620000e89290565b620000e890620004a2565b15620004c557565b60405162461bcd60e51b815260206004820152601560248201527f5a65726f206164647265737320646574656374656400000000000000000000006044820152606490fd5b6200053590620002c562000523620000dc6000620004b2565b6001600160a01b0383161415620004bd565b60805256fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f319146102165780630777e629146102115780630e58f7ab1461020c5780631b2a1914146102075780632e1a7d4d14610202578063327107f7146101fd57806339db85c5146101f85780633fef6dc1146101f35780634445f730146101ee5780634e29a333146101e957806350c29a87146101e45780636e9b6bf7146101df57806370c6a17e146101da57806372f702f3146101d557806374b0244a146101d0578063819b3b6c146101cb5780638da5cb5b146101c657806392a15942146101c1578063966d13ee146101bc578063a61fa677146101b7578063a694fc3a146101b2578063b1a48a79146101ad578063ba4ef6d5146101a8578063c55bc29f146101a3578063d1058e59146101a3578063d9a023e01461019e578063ddef195314610199578063e06174e414610194578063e766c8351461018f578063e833e07c1461018a578063e9fad8ee146101855763fbfa77cf0361000e57610667565b61064f565b610637565b61061c565b6105e3565b6105cb565b6105b0565b610598565b61057d565b610562565b61054f565b610534565b610519565b610504565b6104e9565b6104d4565b6104b9565b61049e565b610483565b610468565b610453565b610411565b6103f8565b610394565b61033d565b610322565b61030a565b6102f7565b6102d0565b61027f565b61022b565b600091031261022657565b600080fd5b346102265761023b36600461021b565b610243611a28565b604051005b0390f35b805b0361022657565b905035906102628261024c565b565b906020828203126102265761027891610255565b90565b9052565b346102265761024861029a610295366004610264565b6109ab565b6040515b9182918290815260200190565b6001600160a01b031690565b61027b906102ab565b60208101929161026291906102b7565b34610226576102e036600461021b565b6102486102eb6107ca565b604051918291826102c0565b610243610305366004610264565b6121fa565b346102265761024361031d366004610264565b611953565b346102265761033236600461021b565b6102486102eb6107c0565b3461022657610243610350366004610264565b61206c565b610278906102ab906001600160a01b031682565b61027890610355565b61027890610369565b61027b90610372565b602081019291610262919061037b565b34610226576103a436600461021b565b6102487f00000000000000000000000000000000000000000000000000000000000000005b60405191829182610384565b919060408382031261022657610278906103ef8185610255565b93602001610255565b346102265761024361040b3660046103d5565b906124fb565b346102265761042136600461021b565b610243611d83565b61024e816102ab565b9050359061026282610429565b906020828203126102265761027891610432565b346102265761046336600461043f565b612131565b346102265761024861029a61047e366004610264565b6109bf565b346102265761049336600461021b565b61024861029a6107ef565b34610226576104ae36600461021b565b6102486102eb6107b6565b346102265761024861029a6104cf36600461043f565b610830565b34610226576104e436600461021b565b612177565b34610226576104f936600461021b565b6102486102eb6106ec565b3461022657610514366004610264565b612203565b346102265761024861029a61052f36600461043f565b61084c565b346102265761054436600461021b565b61024861029a6109d3565b61024361055d366004610264565b610ed9565b346102265761057236600461021b565b6102486102eb6107d4565b346102265761024861029a61059336600461043f565b610860565b34610226576105a836600461021b565b610243611af7565b346102265761024861029a6105c636600461043f565b61096a565b34610226576105db36600461021b565b610243611f02565b34610226576105f336600461021b565b6102487f00000000000000000000000000000000000000000000000000000000000000006103c9565b346102265761062c36600461021b565b61024861029a610806565b346102265761064736600461021b565b610243611aef565b346102265761065f36600461021b565b61024361217f565b346102265761067736600461021b565b6102486102eb61077a565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176106ba57604052565b610682565b9050519061026282610429565b9060208282031261022657610278916106bf565b6040513d6000823e3d90fd5b610732602061071a7f0000000000000000000000000000000000000000000000000000000000000000610372565b63c1d6ba699061072960405190565b93849260e01b90565b825260049082905afa9081156107755760009161074d575090565b610278915060203d811161076e575b6107668183610698565b8101906106cc565b503d61075c565b6106e0565b6102787f0000000000000000000000000000000000000000000000000000000000000000610372565b610278906102ab565b61027890546107a3565b61027860016107ac565b61027860026107ac565b61027860036107ac565b61027860046107ac565b6102789081565b61027890546107de565b61027860056107e5565b6102786102786102789290565b61027861081360006107f9565b612505565b9061082290610372565b600052602052604060002090565b6108476102789161083f600090565b506006610818565b6107e5565b6102789061085a60006107f9565b90612075565b610278906108c46108476108bc6108a561087e610847866006610818565b61089f61088b60086107e5565b610899610847896009610818565b90610909565b90610926565b6108b6670de0b6b3a76400006107f9565b90610960565b92600a610818565b906108f2565b634e487b7160e01b600052601160045260246000fd5b919082018092116108ed57565b6108ca565b61027891906108e0565b919082039182116108ed57565b61027891906108fc565b818102929181159184041417156108ed57565b6102789190610913565b634e487b7160e01b600052601260045260246000fd5b90610950565b9190565b90811561095b570490565b610930565b6102789190610946565b610278906108c46108476109a36108a5610988610847866006610818565b61089f610995600b6107e5565b61089961084789600c610818565b92600d610818565b610278906109b960006107f9565b9061208d565b610278906109cd60006107f9565b906120eb565b61027860076107e5565b6109ee906109e9610f38565b610aa2565b610262610f6a565b6102ab6102786102789290565b610278906109f6565b905051906102628261024c565b6002111561022657565b9050519061026282610a19565b60808183031261022657610a448282610a0c565b92610278610a558460208501610a0c565b93610a638160408601610a0c565b93606001610a23565b906020828203126102265761027891610a0c565b916020610262929493610a9b604082019660008301906102b7565b01906102b7565b610aab90610cfa565b610ae86020610ad97f0000000000000000000000000000000000000000000000000000000000000000610372565b6349d3d5e19061072960405190565b825260049082905afa90811561077557600091610cdc575b50600090610b15610b1083610a03565b6102ab565b610b1e826102ab565b03610b27575050565b610b33610b3891610372565b610372565b63dde798a4610b4630610372565b90610b5a610b5360405190565b9160e01b90565b815260808180610b6d85600483016102c0565b0381865afa8015610775576000918291610ca9575b50610b8f61094c866107f9565b119081610c94575b50610ba157505050565b610bee9163954fa5ee936020610bd67f0000000000000000000000000000000000000000000000000000000000000000610372565b6361d027b390610be560405190565b96879260e01b90565b825260049082905afa93841561077557600094610c6e575b50610c289060209495610c33610c1b60405190565b9788968795869460e01b90565b845260048401610a80565b03925af1801561077557610c445750565b610c649060203d8111610c67575b610c5c8183610698565b810190610a6c565b50565b503d610c52565b6020945090610c8c610c2892863d811161076e576107668183610698565b945090610c06565b9050610ca261094c856107f9565b1138610b97565b9050610ccc915060803d8111610cd5575b610cc48183610698565b810190610a30565b50919091610b82565b503d610cba565b610cf4915060203d811161076e576107668183610698565b38610b00565b61026290610d17565b90610278610278610d13926107f9565b9055565b6102629033610d29610b106000610a03565b610d32826102ab565b03610d3e575b50610d79565b80610d5e610d4e610d7393610860565b610d5983600a610818565b610d03565b610d59610d6b60086107e5565b916009610818565b38610d38565b6102629033610d8b610b106000610a03565b610d94826102ab565b03610da0575b50610e1b565b80610dbb610db0610dd09361096a565b610d5983600d610818565b610d59610dc8600b6107e5565b91600c610818565b38610d9a565b0190565b15610de157565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b610e2f610e2860006107f9565b8211610dda565b610e79610e7f610e3f348461208d565b610e5c610e5582610e5060056107e5565b6108f2565b6005610d03565b610d59600691610e693390565b948591610e506108478487610818565b92610818565b610e9d82610e8d60016107ac565b83610e9730610372565b91610f75565b610ed4610eca7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92610372565b9261029e60405190565b0390a2565b610262906109dd565b61027860026107f9565b15610ef357565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610262610f4560006107e5565b610f59610f50610ee2565b91821415610eec565b6000610d03565b61027860016107f9565b610262610f59610f60565b929190610f9573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b610f9e856102ab565b03610fad5761026293506111cc565b610262936112df565b15610fbd57565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b15610ff857565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561103357565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b1561109257565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b156110de57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b9061026261112660405190565b9283610698565b67ffffffffffffffff81116106ba57602090601f01601f19160190565b9061115c6111578361112d565b611119565b918252565b3d1561117b576111703d61114a565b903d6000602084013e565b606090565b1561118757565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b906111e96111d9826102ab565b6111e2846102ab565b1415610fb6565b61125d60009261121c6111fb85610a03565b611204816102ab565b61120d846102ab565b141590816112c4575b50610ff1565b61122530610372565b90611238611232836102ab565b916102ab565b1480156112a6575b6112499061102c565b610b10611255856107f9565b865b1161108b565b611266826102ab565b1461128f5781906102629361127a60405190565b90818003925af1611289611161565b50611180565b5050610262906112a061094c349290565b146110d7565b506112496112b3826102ab565b6112bc856102ab565b149050611240565b6112ce91506102ab565b6112d7856102ab565b141538611216565b9291906112f76112ee836102ab565b6111e2836102ab565b611336611330600061132b61130b82610a03565b611314816102ab565b61131d876102ab565b141590816113735750610ff1565b6107f9565b84611257565b611342610b1030610372565b61134b826102ab565b03611362575061135d61026293610372565b6113cb565b61136e61026294610372565b61143d565b61137d91506102ab565b6112d7876102ab565b61139f6113996102789263ffffffff1690565b60e01b90565b6001600160e01b03191690565b9160206102629294936113c7604082019660008301906102b7565b0152565b61140e6004926113ff610262956113e563a9059cbb611386565b926113ef60405190565b96879460208601908152016113ac565b60208201810382520383610698565b611536565b6040906113c76102629496959396611433606084019860008501906102b7565b60208301906102b7565b9061140e906113ff610262956004956114596323b872dd611386565b9361146360405190565b9788956020870190815201611413565b61147d602061114a565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b610278611473565b80151561024e565b90505190610262826114ae565b9060208282031261022657610278916114b6565b156114de57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102629161154661155592610372565b9061154f6114a6565b91611593565b805161156461094c60006107f9565b14908115611573575b506114d7565b61158d91506020611582825190565b8183010191016114c3565b3861156d565b61027892916115a260006107f9565b91611603565b156115af57565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061027894938192611615606090565b5061162c61162230610372565b83903110156115a8565b60208101905191855af161163e611161565b91611690565b1561164b57565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156116c2575081516116a861094c60006107f9565b146116b1575090565b6116bd610278916116c8565b611644565b82611742565b3b6116d661094c60006107f9565b1190565b60005b8381106116ed5750506000910152565b81810151838201526020016116dd565b61171e611727602093610dd693611712815190565b80835293849260200190565b958691016116da565b601f01601f191690565b6020808252610278929101906116fd565b9061174b825190565b61175861094c60006107f9565b11156117675750805190602001fd5b610e179061177460405190565b62461bcd60e51b815291829160048301611731565b6109ee90611795610f38565b610aab90610262908190336117ad610b106000610a03565b6117b6826102ab565b036117c2575b506117d8565b80610d5e610d4e6117d293610860565b386117bc565b61026290336117ea610b106000610a03565b6117f3826102ab565b036117ff575b50611898565b80610dbb610db061180f9361096a565b386117f9565b1561181c57565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b1561185c57565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b60006118ad6118a6826107f9565b8311611815565b6119086118db6118bd33936107f9565b6118d56118cd6102788387612075565b861115611855565b8461208d565b6118f1610e55826118ec60056107e5565b610909565b610d5983610e796006936118ec6108478487610818565b611926828261191760016107ac565b61192030610372565b90610f75565b610ed4610eca7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592610372565b61026290611789565b611964610f38565b6109ee610aab33611978610b106000610a03565b611981826102ab565b03611990575b506102626119a6565b80610d5e610d4e6119a093610860565b38611987565b600a336119b66108478284610818565b916000906119c3826107f9565b84116119d0575b50505050565b610d5983610e796119e0946107f9565b6119ef828261191760046107ac565b611a1c610eca7f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a792610372565b0390a2388080806119ca565b61026261195c565b611a38610f38565b6109ee610aab33611a4c610b106000610a03565b611a55826102ab565b03611a64575b50610262611a7a565b80610dbb610db0611a749361096a565b38611a5b565b600d33611a8a6108478284610818565b91600090611a97826107f9565b8411611aa35750505050565b610d5983610e79611ab3946107f9565b611ac2828261191760026107ac565b611a1c610eca7f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f0166092610372565b610262611a30565b611aff611aef565b610262611a28565b611b0f610f38565b6109ee611b59565b15611b1e57565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b611b93335b611b8d611232610b107f0000000000000000000000000000000000000000000000000000000000000000610372565b14611b17565b610262611bbf7f0000000000000000000000000000000000000000000000000000000000000000610372565b6349d3d5e1611bcd60405190565b91611bd88260e01b90565b8352602083600481845afa92831561077557600093611d63575b50600092611c05611232610b1086610a03565b03611c0f57505050565b611c1f9160209161072960405190565b825260049082905afa801561077557611c4091600091611d45575b50610372565b611c4a60016107ac565b611c6a61123273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b14611cd7575b611c7990610372565b634e606c4790803b1561022657611c9591839161072960405190565b8252818381600481015b03925af1801561077557611cb1575050565b8161026292903d10611cd0575b611cc88183610698565b81019061021b565b503d611cbe565b611ce081610372565b90637114177a91803b1561022657611d06928491611cfd60405190565b94859260e01b90565b8252600490829084905af191821561077557611c7992611d29575b509050611c70565b611d3f90843d8611611cd057611cc88183610698565b38611d21565b611d5d915060203d811161076e576107668183610698565b38611c3a565b611d7c91935060203d811161076e576107668183610698565b9138611bf2565b610262611b07565b611d93610f38565b6109ee611d9f33611b5e565b610262611dcb7f0000000000000000000000000000000000000000000000000000000000000000610372565b63095f363c90611de4611ddd60405190565b9260e01b90565b8252602082600481845afa91821561077557600092611edc575b506020611e14916340ae3e149061072960405190565b825260049082905afa90811561077557600091611ebe575b50600091611e3983610a03565b611e42816102ab565b611e4b836102ab565b14159081611ea3575b50611e5e57505050565b610b33611e6a91610372565b906336b91f2b90823b1561022657611c9f92611e98858094611e8b60405190565b9687958694859360e01b90565b8352600483016102c0565b611ead91506102ab565b611eb6836102ab565b141538611e54565b611ed6915060203d811161076e576107668183610698565b38611e2c565b611e14919250611efa602091823d811161076e576107668183610698565b929150611dfe565b610262611d8b565b6109ee90611f16610f38565b61026290611f246000610a03565b611f2d816102ab565b611f36826102ab565b03611f42575b50611f58565b80610d5e610d4e611f5293610860565b38611f3c565b61026290611f6533611b5e565b611fed565b15611f7157565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b15611fb757565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b6120216000612005611ffe826107f9565b8411611f6a565b61201b61094c61201560056107e5565b926107f9565b11611fb0565b61203961203282610e5060076107e5565b6007610d03565b6120677f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c69161029e60405190565b0390a1565b61026290611f0a565b906120886108476102789361083f600090565b6120eb565b9061209781612505565b6000906120a661094c836107f9565b149081156120d2575b506120ce576108b66120c86102789361089f60056107e5565b91612505565b5090565b90506120e461094c61201560056107e5565b14386120af565b906120f660056107e5565b60009061210561094c836107f9565b1461212557506102789161089f61211b92612505565b6108b660056107e5565b905061027891506107f9565b6040515b62461bcd60e51b815260206004820152601e60248201527f5374616b696e67207969656c6473206973206175746f207265626173656400006044820152606490fd5b604051612135565b61219061031d3361085a60006107f9565b612198611a28565b610262611aef565b6109ee906121ac610f38565b6102629081906121bb33611b5e565b6121cc6000612005611ffe826107f9565b6120677fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b9161029e60405190565b610262906121a0565b60405162461bcd60e51b815260206004820152603260248201527f507479506f6f6c53656c6c486967683a206e6f746966794275794c6f7754726960448201527119d9d95c9959081b9bdd08185b1b1bddd95960721b6064820152608490fd5b906109ee91612270610f38565b906102629161227f6000610a03565b612288816102ab565b612291826102ab565b0361229d575b506122b3565b80610dbb610db06122ad9361096a565b38612297565b61026291906122c133611b5e565b61237c565b6004111561022657565b90505190610262826122c6565b9060208282031261022657610278916122d0565b634e487b7160e01b600052602160045260246000fd5b6004111561231157565b6122f1565b9061026282612307565b1561232757565b60405162461bcd60e51b815260206004820152602760248201527f5661756c74206e6f7420696e2061646a7573746d656e742061626f76652041416044820152665255206d6f646560c81b6064820152608490fd5b6123ba9060206123ab7f0000000000000000000000000000000000000000000000000000000000000000610372565b63e0851a8890611cfd60405190565b825260049082905afa9182156107755761240d926123f4916000916124cd575b506123ee6123e86003612316565b91612316565b14612320565b6123fe60016107ac565b61240730610372565b33610e97565b612417600b6107e5565b9061244461243d61242f670de0b6b3a76400006107f9565b936108c461211b8686610926565b600b610d03565b6124727f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f99161029e60405190565b0390a161247f60076107e5565b9060009161248f61094c846107f9565b11612498575050565b6102629161132b6124c6612032936108c461211b6124b660086107e5565b926124c160076107e5565b610926565b6008610d03565b6124ee915060203d81116124f4575b6124e68183610698565b8101906122dd565b386123da565b503d6124dc565b9061026291612263565b61250f60016107ac565b61252f61123273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b03612547576102789061254130610372565b31610909565b50612586602061255d610b33610b3360016107ac565b6370a0823190611e9861256f30610372565b9261257960405190565b9586948593849360e01b90565b03915afa9081156107755760009161259c575090565b610278915060203d8111610c6757610c5c818361069856fea26469706673582212200f729f24f9817afbee0a0d46268f4f6cb5022282e6f95a8f31fc2ec8ee568b7064736f6c6343000812003300000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000005a7651dd5c9d72fc4fdd4f9706193f33dfb4122d
Deployed Bytecode
0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c80630245f319146102165780630777e629146102115780630e58f7ab1461020c5780631b2a1914146102075780632e1a7d4d14610202578063327107f7146101fd57806339db85c5146101f85780633fef6dc1146101f35780634445f730146101ee5780634e29a333146101e957806350c29a87146101e45780636e9b6bf7146101df57806370c6a17e146101da57806372f702f3146101d557806374b0244a146101d0578063819b3b6c146101cb5780638da5cb5b146101c657806392a15942146101c1578063966d13ee146101bc578063a61fa677146101b7578063a694fc3a146101b2578063b1a48a79146101ad578063ba4ef6d5146101a8578063c55bc29f146101a3578063d1058e59146101a3578063d9a023e01461019e578063ddef195314610199578063e06174e414610194578063e766c8351461018f578063e833e07c1461018a578063e9fad8ee146101855763fbfa77cf0361000e57610667565b61064f565b610637565b61061c565b6105e3565b6105cb565b6105b0565b610598565b61057d565b610562565b61054f565b610534565b610519565b610504565b6104e9565b6104d4565b6104b9565b61049e565b610483565b610468565b610453565b610411565b6103f8565b610394565b61033d565b610322565b61030a565b6102f7565b6102d0565b61027f565b61022b565b600091031261022657565b600080fd5b346102265761023b36600461021b565b610243611a28565b604051005b0390f35b805b0361022657565b905035906102628261024c565b565b906020828203126102265761027891610255565b90565b9052565b346102265761024861029a610295366004610264565b6109ab565b6040515b9182918290815260200190565b6001600160a01b031690565b61027b906102ab565b60208101929161026291906102b7565b34610226576102e036600461021b565b6102486102eb6107ca565b604051918291826102c0565b610243610305366004610264565b6121fa565b346102265761024361031d366004610264565b611953565b346102265761033236600461021b565b6102486102eb6107c0565b3461022657610243610350366004610264565b61206c565b610278906102ab906001600160a01b031682565b61027890610355565b61027890610369565b61027b90610372565b602081019291610262919061037b565b34610226576103a436600461021b565b6102487f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b5b60405191829182610384565b919060408382031261022657610278906103ef8185610255565b93602001610255565b346102265761024361040b3660046103d5565b906124fb565b346102265761042136600461021b565b610243611d83565b61024e816102ab565b9050359061026282610429565b906020828203126102265761027891610432565b346102265761046336600461043f565b612131565b346102265761024861029a61047e366004610264565b6109bf565b346102265761049336600461021b565b61024861029a6107ef565b34610226576104ae36600461021b565b6102486102eb6107b6565b346102265761024861029a6104cf36600461043f565b610830565b34610226576104e436600461021b565b612177565b34610226576104f936600461021b565b6102486102eb6106ec565b3461022657610514366004610264565b612203565b346102265761024861029a61052f36600461043f565b61084c565b346102265761054436600461021b565b61024861029a6109d3565b61024361055d366004610264565b610ed9565b346102265761057236600461021b565b6102486102eb6107d4565b346102265761024861029a61059336600461043f565b610860565b34610226576105a836600461021b565b610243611af7565b346102265761024861029a6105c636600461043f565b61096a565b34610226576105db36600461021b565b610243611f02565b34610226576105f336600461021b565b6102487f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f879336103c9565b346102265761062c36600461021b565b61024861029a610806565b346102265761064736600461021b565b610243611aef565b346102265761065f36600461021b565b61024361217f565b346102265761067736600461021b565b6102486102eb61077a565b634e487b7160e01b600052604160045260246000fd5b90601f01601f1916810190811067ffffffffffffffff8211176106ba57604052565b610682565b9050519061026282610429565b9060208282031261022657610278916106bf565b6040513d6000823e3d90fd5b610732602061071a7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610372565b63c1d6ba699061072960405190565b93849260e01b90565b825260049082905afa9081156107755760009161074d575090565b610278915060203d811161076e575b6107668183610698565b8101906106cc565b503d61075c565b6106e0565b6102787f000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901610372565b610278906102ab565b61027890546107a3565b61027860016107ac565b61027860026107ac565b61027860036107ac565b61027860046107ac565b6102789081565b61027890546107de565b61027860056107e5565b6102786102786102789290565b61027861081360006107f9565b612505565b9061082290610372565b600052602052604060002090565b6108476102789161083f600090565b506006610818565b6107e5565b6102789061085a60006107f9565b90612075565b610278906108c46108476108bc6108a561087e610847866006610818565b61089f61088b60086107e5565b610899610847896009610818565b90610909565b90610926565b6108b6670de0b6b3a76400006107f9565b90610960565b92600a610818565b906108f2565b634e487b7160e01b600052601160045260246000fd5b919082018092116108ed57565b6108ca565b61027891906108e0565b919082039182116108ed57565b61027891906108fc565b818102929181159184041417156108ed57565b6102789190610913565b634e487b7160e01b600052601260045260246000fd5b90610950565b9190565b90811561095b570490565b610930565b6102789190610946565b610278906108c46108476109a36108a5610988610847866006610818565b61089f610995600b6107e5565b61089961084789600c610818565b92600d610818565b610278906109b960006107f9565b9061208d565b610278906109cd60006107f9565b906120eb565b61027860076107e5565b6109ee906109e9610f38565b610aa2565b610262610f6a565b6102ab6102786102789290565b610278906109f6565b905051906102628261024c565b6002111561022657565b9050519061026282610a19565b60808183031261022657610a448282610a0c565b92610278610a558460208501610a0c565b93610a638160408601610a0c565b93606001610a23565b906020828203126102265761027891610a0c565b916020610262929493610a9b604082019660008301906102b7565b01906102b7565b610aab90610cfa565b610ae86020610ad97f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610372565b6349d3d5e19061072960405190565b825260049082905afa90811561077557600091610cdc575b50600090610b15610b1083610a03565b6102ab565b610b1e826102ab565b03610b27575050565b610b33610b3891610372565b610372565b63dde798a4610b4630610372565b90610b5a610b5360405190565b9160e01b90565b815260808180610b6d85600483016102c0565b0381865afa8015610775576000918291610ca9575b50610b8f61094c866107f9565b119081610c94575b50610ba157505050565b610bee9163954fa5ee936020610bd67f0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933610372565b6361d027b390610be560405190565b96879260e01b90565b825260049082905afa93841561077557600094610c6e575b50610c289060209495610c33610c1b60405190565b9788968795869460e01b90565b845260048401610a80565b03925af1801561077557610c445750565b610c649060203d8111610c67575b610c5c8183610698565b810190610a6c565b50565b503d610c52565b6020945090610c8c610c2892863d811161076e576107668183610698565b945090610c06565b9050610ca261094c856107f9565b1138610b97565b9050610ccc915060803d8111610cd5575b610cc48183610698565b810190610a30565b50919091610b82565b503d610cba565b610cf4915060203d811161076e576107668183610698565b38610b00565b61026290610d17565b90610278610278610d13926107f9565b9055565b6102629033610d29610b106000610a03565b610d32826102ab565b03610d3e575b50610d79565b80610d5e610d4e610d7393610860565b610d5983600a610818565b610d03565b610d59610d6b60086107e5565b916009610818565b38610d38565b6102629033610d8b610b106000610a03565b610d94826102ab565b03610da0575b50610e1b565b80610dbb610db0610dd09361096a565b610d5983600d610818565b610d59610dc8600b6107e5565b91600c610818565b38610d9a565b0190565b15610de157565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b0390fd5b610e2f610e2860006107f9565b8211610dda565b610e79610e7f610e3f348461208d565b610e5c610e5582610e5060056107e5565b6108f2565b6005610d03565b610d59600691610e693390565b948591610e506108478487610818565b92610818565b610e9d82610e8d60016107ac565b83610e9730610372565b91610f75565b610ed4610eca7f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d92610372565b9261029e60405190565b0390a2565b610262906109dd565b61027860026107f9565b15610ef357565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b610262610f4560006107e5565b610f59610f50610ee2565b91821415610eec565b6000610d03565b61027860016107f9565b610262610f59610f60565b929190610f9573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b610f9e856102ab565b03610fad5761026293506111cc565b610262936112df565b15610fbd57565b60405162461bcd60e51b815260206004820152600c60248201526b53616d65206164647265737360a01b6044820152606490fd5b15610ff857565b60405162461bcd60e51b815260206004820152600c60248201526b5a65726f206164647265737360a01b6044820152606490fd5b1561103357565b60405162461bcd60e51b815260206004820152602a60248201527f4f6e65206f662074686520616464726573736573206d757374206265207468696044820152691cc818dbdb9d1c9858dd60b21b6064820152608490fd5b1561109257565b60405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e20300000006044820152606490fd5b156110de57565b60405162461bcd60e51b8152602060048201526013602482015272496e636f7272656374206d73672e76616c756560681b6044820152606490fd5b9061026261112660405190565b9283610698565b67ffffffffffffffff81116106ba57602090601f01601f19160190565b9061115c6111578361112d565b611119565b918252565b3d1561117b576111703d61114a565b903d6000602084013e565b606090565b1561118757565b60405162461bcd60e51b815260206004820152601c60248201527f4e617469766520746f6b656e207472616e73666572206661696c6564000000006044820152606490fd5b906111e96111d9826102ab565b6111e2846102ab565b1415610fb6565b61125d60009261121c6111fb85610a03565b611204816102ab565b61120d846102ab565b141590816112c4575b50610ff1565b61122530610372565b90611238611232836102ab565b916102ab565b1480156112a6575b6112499061102c565b610b10611255856107f9565b865b1161108b565b611266826102ab565b1461128f5781906102629361127a60405190565b90818003925af1611289611161565b50611180565b5050610262906112a061094c349290565b146110d7565b506112496112b3826102ab565b6112bc856102ab565b149050611240565b6112ce91506102ab565b6112d7856102ab565b141538611216565b9291906112f76112ee836102ab565b6111e2836102ab565b611336611330600061132b61130b82610a03565b611314816102ab565b61131d876102ab565b141590816113735750610ff1565b6107f9565b84611257565b611342610b1030610372565b61134b826102ab565b03611362575061135d61026293610372565b6113cb565b61136e61026294610372565b61143d565b61137d91506102ab565b6112d7876102ab565b61139f6113996102789263ffffffff1690565b60e01b90565b6001600160e01b03191690565b9160206102629294936113c7604082019660008301906102b7565b0152565b61140e6004926113ff610262956113e563a9059cbb611386565b926113ef60405190565b96879460208601908152016113ac565b60208201810382520383610698565b611536565b6040906113c76102629496959396611433606084019860008501906102b7565b60208301906102b7565b9061140e906113ff610262956004956114596323b872dd611386565b9361146360405190565b9788956020870190815201611413565b61147d602061114a565b7f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564602082015290565b610278611473565b80151561024e565b90505190610262826114ae565b9060208282031261022657610278916114b6565b156114de57565b60405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608490fd5b6102629161154661155592610372565b9061154f6114a6565b91611593565b805161156461094c60006107f9565b14908115611573575b506114d7565b61158d91506020611582825190565b8183010191016114c3565b3861156d565b61027892916115a260006107f9565b91611603565b156115af57565b60405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608490fd5b90600061027894938192611615606090565b5061162c61162230610372565b83903110156115a8565b60208101905191855af161163e611161565b91611690565b1561164b57565b60405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606490fd5b919290156116c2575081516116a861094c60006107f9565b146116b1575090565b6116bd610278916116c8565b611644565b82611742565b3b6116d661094c60006107f9565b1190565b60005b8381106116ed5750506000910152565b81810151838201526020016116dd565b61171e611727602093610dd693611712815190565b80835293849260200190565b958691016116da565b601f01601f191690565b6020808252610278929101906116fd565b9061174b825190565b61175861094c60006107f9565b11156117675750805190602001fd5b610e179061177460405190565b62461bcd60e51b815291829160048301611731565b6109ee90611795610f38565b610aab90610262908190336117ad610b106000610a03565b6117b6826102ab565b036117c2575b506117d8565b80610d5e610d4e6117d293610860565b386117bc565b61026290336117ea610b106000610a03565b6117f3826102ab565b036117ff575b50611898565b80610dbb610db061180f9361096a565b386117f9565b1561181c57565b60405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b6044820152606490fd5b1561185c57565b60405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b6044820152606490fd5b60006118ad6118a6826107f9565b8311611815565b6119086118db6118bd33936107f9565b6118d56118cd6102788387612075565b861115611855565b8461208d565b6118f1610e55826118ec60056107e5565b610909565b610d5983610e796006936118ec6108478487610818565b611926828261191760016107ac565b61192030610372565b90610f75565b610ed4610eca7f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d592610372565b61026290611789565b611964610f38565b6109ee610aab33611978610b106000610a03565b611981826102ab565b03611990575b506102626119a6565b80610d5e610d4e6119a093610860565b38611987565b600a336119b66108478284610818565b916000906119c3826107f9565b84116119d0575b50505050565b610d5983610e796119e0946107f9565b6119ef828261191760046107ac565b611a1c610eca7f16170af92486b13822506c799b60d90566db7dd7a9948d206c487895e7f1c7a792610372565b0390a2388080806119ca565b61026261195c565b611a38610f38565b6109ee610aab33611a4c610b106000610a03565b611a55826102ab565b03611a64575b50610262611a7a565b80610dbb610db0611a749361096a565b38611a5b565b600d33611a8a6108478284610818565b91600090611a97826107f9565b8411611aa35750505050565b610d5983610e79611ab3946107f9565b611ac2828261191760026107ac565b611a1c610eca7f028a7618a2d8f77fcfce10a6c69e1a551ddbdcc42846c1041a449b94d2f0166092610372565b610262611a30565b611aff611aef565b610262611a28565b611b0f610f38565b6109ee611b59565b15611b1e57565b60405162461bcd60e51b815260206004820152601360248201527210d85b1b195c881a5cc81b9bdd0815985d5b1d606a1b6044820152606490fd5b611b93335b611b8d611232610b107f000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901610372565b14611b17565b610262611bbf7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610372565b6349d3d5e1611bcd60405190565b91611bd88260e01b90565b8352602083600481845afa92831561077557600093611d63575b50600092611c05611232610b1086610a03565b03611c0f57505050565b611c1f9160209161072960405190565b825260049082905afa801561077557611c4091600091611d45575b50610372565b611c4a60016107ac565b611c6a61123273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b14611cd7575b611c7990610372565b634e606c4790803b1561022657611c9591839161072960405190565b8252818381600481015b03925af1801561077557611cb1575050565b8161026292903d10611cd0575b611cc88183610698565b81019061021b565b503d611cbe565b611ce081610372565b90637114177a91803b1561022657611d06928491611cfd60405190565b94859260e01b90565b8252600490829084905af191821561077557611c7992611d29575b509050611c70565b611d3f90843d8611611cd057611cc88183610698565b38611d21565b611d5d915060203d811161076e576107668183610698565b38611c3a565b611d7c91935060203d811161076e576107668183610698565b9138611bf2565b610262611b07565b611d93610f38565b6109ee611d9f33611b5e565b610262611dcb7f00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b610372565b63095f363c90611de4611ddd60405190565b9260e01b90565b8252602082600481845afa91821561077557600092611edc575b506020611e14916340ae3e149061072960405190565b825260049082905afa90811561077557600091611ebe575b50600091611e3983610a03565b611e42816102ab565b611e4b836102ab565b14159081611ea3575b50611e5e57505050565b610b33611e6a91610372565b906336b91f2b90823b1561022657611c9f92611e98858094611e8b60405190565b9687958694859360e01b90565b8352600483016102c0565b611ead91506102ab565b611eb6836102ab565b141538611e54565b611ed6915060203d811161076e576107668183610698565b38611e2c565b611e14919250611efa602091823d811161076e576107668183610698565b929150611dfe565b610262611d8b565b6109ee90611f16610f38565b61026290611f246000610a03565b611f2d816102ab565b611f36826102ab565b03611f42575b50611f58565b80610d5e610d4e611f5293610860565b38611f3c565b61026290611f6533611b5e565b611fed565b15611f7157565b60405162461bcd60e51b8152602060048201526017602482015276151bdbc81cdb585b1b081e5a595b191cc8185b5bdd5b9d604a1b6044820152606490fd5b15611fb757565b60405162461bcd60e51b815260206004820152600e60248201526d4e6f2075736572207374616b657360901b6044820152606490fd5b6120216000612005611ffe826107f9565b8411611f6a565b61201b61094c61201560056107e5565b926107f9565b11611fb0565b61203961203282610e5060076107e5565b6007610d03565b6120677f2c73fdf4d1f9c370b0d2bf8570e6b5e4d9fbb6369480509c6c4f6f2e01e090c69161029e60405190565b0390a1565b61026290611f0a565b906120886108476102789361083f600090565b6120eb565b9061209781612505565b6000906120a661094c836107f9565b149081156120d2575b506120ce576108b66120c86102789361089f60056107e5565b91612505565b5090565b90506120e461094c61201560056107e5565b14386120af565b906120f660056107e5565b60009061210561094c836107f9565b1461212557506102789161089f61211b92612505565b6108b660056107e5565b905061027891506107f9565b6040515b62461bcd60e51b815260206004820152601e60248201527f5374616b696e67207969656c6473206973206175746f207265626173656400006044820152606490fd5b604051612135565b61219061031d3361085a60006107f9565b612198611a28565b610262611aef565b6109ee906121ac610f38565b6102629081906121bb33611b5e565b6121cc6000612005611ffe826107f9565b6120677fef9997e3cc5a6aa364e4fcd642a78d1829153c8cc7d9c1d1f8a4d8a8f550340b9161029e60405190565b610262906121a0565b60405162461bcd60e51b815260206004820152603260248201527f507479506f6f6c53656c6c486967683a206e6f746966794275794c6f7754726960448201527119d9d95c9959081b9bdd08185b1b1bddd95960721b6064820152608490fd5b906109ee91612270610f38565b906102629161227f6000610a03565b612288816102ab565b612291826102ab565b0361229d575b506122b3565b80610dbb610db06122ad9361096a565b38612297565b61026291906122c133611b5e565b61237c565b6004111561022657565b90505190610262826122c6565b9060208282031261022657610278916122d0565b634e487b7160e01b600052602160045260246000fd5b6004111561231157565b6122f1565b9061026282612307565b1561232757565b60405162461bcd60e51b815260206004820152602760248201527f5661756c74206e6f7420696e2061646a7573746d656e742061626f76652041416044820152665255206d6f646560c81b6064820152608490fd5b6123ba9060206123ab7f000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901610372565b63e0851a8890611cfd60405190565b825260049082905afa9182156107755761240d926123f4916000916124cd575b506123ee6123e86003612316565b91612316565b14612320565b6123fe60016107ac565b61240730610372565b33610e97565b612417600b6107e5565b9061244461243d61242f670de0b6b3a76400006107f9565b936108c461211b8686610926565b600b610d03565b6124727f548c13486a320e74478d352afe4d4686c434957a45d93c376a871a8a4b9fa6f99161029e60405190565b0390a161247f60076107e5565b9060009161248f61094c846107f9565b11612498575050565b6102629161132b6124c6612032936108c461211b6124b660086107e5565b926124c160076107e5565b610926565b6008610d03565b6124ee915060203d81116124f4575b6124e68183610698565b8101906122dd565b386123da565b503d6124dc565b9061026291612263565b61250f60016107ac565b61252f61123273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee6102ab565b03612547576102789061254130610372565b31610909565b50612586602061255d610b33610b3360016107ac565b6370a0823190611e9861256f30610372565b9261257960405190565b9586948593849360e01b90565b03915afa9081156107755760009161259c575090565b610278915060203d8111610c6757610c5c818361069856fea26469706673582212200f729f24f9817afbee0a0d46268f4f6cb5022282e6f95a8f31fc2ec8ee568b7064736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee0000000000000000000000005a7651dd5c9d72fc4fdd4f9706193f33dfb4122d
-----Decoded View---------------
Arg [0] : _wandProtocol (address): 0x31e9026bf3A20FA3250a94caD5E6BFbE203B001B
Arg [1] : _settings (address): 0x7449dc43a03e70050c4AcD3F8A6acab9A7F87933
Arg [2] : _vault_ (address): 0xbb31D4f1F763341039eaB555C777aA9eAAfe8901
Arg [3] : _stakingYieldsToken_ (address): 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE
Arg [4] : _matchingYieldsToken_ (address): 0x5A7651Dd5C9d72fc4FDD4f9706193F33DFb4122d
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000031e9026bf3a20fa3250a94cad5e6bfbe203b001b
Arg [1] : 0000000000000000000000007449dc43a03e70050c4acd3f8a6acab9a7f87933
Arg [2] : 000000000000000000000000bb31d4f1f763341039eab555c777aa9eaafe8901
Arg [3] : 000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
Arg [4] : 0000000000000000000000005a7651dd5c9d72fc4fdd4f9706193f33dfb4122d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.