More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 2,857 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Emergency Withdr... | 21550462 | 7 days ago | IN | 0 ETH | 0.0004631 | ||||
Emergency Withdr... | 21509687 | 12 days ago | IN | 0 ETH | 0.00020311 | ||||
Emergency Withdr... | 21427992 | 24 days ago | IN | 0 ETH | 0.00058137 | ||||
Emergency Withdr... | 21396678 | 28 days ago | IN | 0 ETH | 0.00058262 | ||||
Emergency Withdr... | 21338796 | 36 days ago | IN | 0 ETH | 0.00092464 | ||||
Emergency Withdr... | 21192623 | 57 days ago | IN | 0 ETH | 0.00084079 | ||||
Emergency Withdr... | 21191681 | 57 days ago | IN | 0 ETH | 0.00091777 | ||||
Emergency Withdr... | 21061424 | 75 days ago | IN | 0 ETH | 0.00049694 | ||||
Emergency Withdr... | 20855992 | 104 days ago | IN | 0 ETH | 0.00049218 | ||||
Emergency Withdr... | 20648018 | 133 days ago | IN | 0 ETH | 0.00006356 | ||||
Emergency Withdr... | 20381177 | 170 days ago | IN | 0 ETH | 0.0002884 | ||||
Emergency Withdr... | 20296499 | 182 days ago | IN | 0 ETH | 0.00016249 | ||||
Emergency Withdr... | 20253142 | 188 days ago | IN | 0 ETH | 0.00009744 | ||||
Emergency Withdr... | 20221568 | 192 days ago | IN | 0 ETH | 0.00051931 | ||||
Emergency Withdr... | 20221566 | 192 days ago | IN | 0 ETH | 0.00050984 | ||||
Emergency Withdr... | 20172387 | 199 days ago | IN | 0 ETH | 0.00027372 | ||||
Emergency Withdr... | 20145775 | 203 days ago | IN | 0 ETH | 0.00027509 | ||||
Emergency Withdr... | 20107523 | 208 days ago | IN | 0 ETH | 0.00030434 | ||||
Emergency Withdr... | 20071462 | 213 days ago | IN | 0 ETH | 0.00088581 | ||||
Emergency Withdr... | 20057921 | 215 days ago | IN | 0 ETH | 0.00025416 | ||||
Emergency Withdr... | 20031548 | 219 days ago | IN | 0 ETH | 0.00110044 | ||||
Emergency Withdr... | 19967367 | 228 days ago | IN | 0 ETH | 0.00097449 | ||||
Emergency Withdr... | 19938825 | 232 days ago | IN | 0 ETH | 0.00048785 | ||||
Emergency Withdr... | 19916181 | 235 days ago | IN | 0 ETH | 0.00053325 | ||||
Emergency Withdr... | 19877144 | 240 days ago | IN | 0 ETH | 0.00058347 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
17368889 | 592 days ago | 0.00684546 ETH | ||||
17366262 | 592 days ago | 0.01152778 ETH | ||||
17365524 | 592 days ago | 0.01557513 ETH | ||||
17363074 | 593 days ago | 0.00786316 ETH | ||||
17360454 | 593 days ago | 0.00977306 ETH | ||||
17356433 | 594 days ago | 0.00721277 ETH | ||||
17355748 | 594 days ago | 0.00852904 ETH | ||||
17355513 | 594 days ago | 0.00798132 ETH | ||||
17352970 | 594 days ago | 0.00692375 ETH | ||||
17351903 | 594 days ago | 0.00686077 ETH | ||||
17350407 | 595 days ago | 0.00658796 ETH | ||||
17350383 | 595 days ago | 0.00658796 ETH | ||||
17350129 | 595 days ago | 0.00724699 ETH | ||||
17350122 | 595 days ago | 0.00792399 ETH | ||||
17350051 | 595 days ago | 0.00719368 ETH | ||||
17349227 | 595 days ago | 0.00796394 ETH | ||||
17348769 | 595 days ago | 0.00722756 ETH | ||||
17343940 | 596 days ago | 0.01174587 ETH | ||||
17342187 | 596 days ago | 0.01037598 ETH | ||||
17341419 | 596 days ago | 0.00761464 ETH | ||||
17339130 | 596 days ago | 0.00868068 ETH | ||||
17337417 | 596 days ago | 0.02487819 ETH | ||||
17320260 | 599 days ago | 0.01364382 ETH | ||||
17317953 | 599 days ago | 0.01082842 ETH | ||||
17314227 | 600 days ago | 0.00976523 ETH |
Loading...
Loading
Contract Name:
StakingRewardsProxy
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./interfaces/ILayerZeroReceiver.sol"; import "./interfaces/ILayerZeroUserApplicationConfig.sol"; import "./interfaces/ILayerZeroEndpoint.sol"; import "./LZ/LzApp.sol"; import "./LZ/NonBlockingLzApp.sol"; import "./Sign.sol"; contract StakingRewardsProxy is NonblockingLzApp, Sign { using ERC165Checker for address; using SafeERC20 for IERC20; bytes32 constant internal ACTION_STAKE = "stake"; bytes32 constant internal ACTION_WITHDRAW = "withdraw"; bytes32 constant internal ACTION_CLAIM = "claim"; uint16 public immutable controllerChainId = 12; uint8 public paused; address public controller; address public fund; IERC20 public immutable stakingToken; struct GasAmounts { uint256 proxyWithdraw; uint256 proxyClaim; uint256 controllerStake; uint256 controllerWithdraw; uint256 controllerClaim; } GasAmounts public gasAmounts; mapping(uint64 => bool) private nonceRegistry; mapping(address => bytes32) public actionInQueue; mapping(address => bytes) public signatures; mapping(address => uint256) public balances; event StakeInitiated(address indexed user, uint256 amount); event WithdrawalInitiated(address indexed user); event ClaimInitiated(address indexed user); event Withdrawn(address indexed user, uint256 amount); event Claimed(address indexed user, uint256 amount); modifier notPaused() { require(paused == 0, "RadarStakingProxy: Contract is paused"); _; } modifier notInQueue(address account) { require(actionInQueue[account] == bytes32(0x0), "RadarStakingProxy: In queue already! Wait till the callback comes."); _; } constructor(address _owner, address _endpoint, address _fund, address _controller, address _stakingToken) NonblockingLzApp(_endpoint) { transferOwnership(_owner); require(_controller != address(0), "RadarStakingProxy: invalid controller address"); require(_stakingToken != address(0), "RadarStakingProxy: invalid staking token address"); require(_fund != address(0), "RadarStakingProxy: invalid fund address"); controller = _controller; fund = _fund; stakingToken = IERC20(_stakingToken); gasAmounts.proxyWithdraw = 260000; gasAmounts.proxyClaim = 240000; gasAmounts.controllerStake = 280000; gasAmounts.controllerWithdraw = 360000; gasAmounts.controllerClaim = 380000; } function estimateFees(bytes32 _action, uint256 _amount, bytes memory _signature, uint256 controllerGas) public view returns (uint256 messageFee){ bytes memory adapterParams = getAdapterParams(_action, controllerGas); bytes memory payload = abi.encode(msg.sender, _action, _amount, _signature); // get the fees we need to pay to LayerZero for message delivery (messageFee,) = lzEndpoint.estimateFees(controllerChainId, controller, payload, false, adapterParams); } function getGasAmount(bytes32 _action, bool _isProxy) internal view returns (uint256 gasAmount) { gasAmount = 0; if (_isProxy) { if (_action == ACTION_CLAIM) { gasAmount = gasAmounts.proxyClaim; } else if (_action == ACTION_WITHDRAW) { gasAmount = gasAmounts.proxyWithdraw; } } else { if (_action == ACTION_CLAIM) { gasAmount = gasAmounts.controllerClaim; } else if (_action == ACTION_WITHDRAW) { gasAmount = gasAmounts.controllerWithdraw; } else if (_action == ACTION_STAKE) { gasAmount = gasAmounts.controllerStake; } } require(gasAmount > 0, "StakingRewardsProxy: unable to retrieve gas amount"); } function getAdapterParams(bytes32 _action, uint256 controllerGas) internal view returns (bytes memory adapterParams) { if (_action == ACTION_STAKE) { uint16 version = 1; uint256 gasForDestinationLzReceive = getGasAmount(_action, false); adapterParams = abi.encodePacked(version, gasForDestinationLzReceive); } else { uint16 version = 2; uint256 gasForDestinationLzReceive = getGasAmount(_action, false); adapterParams = abi.encodePacked(version, gasForDestinationLzReceive, controllerGas, controller); } } function _sendMessage(bytes32 _action, uint256 _amount, bytes memory _signature, uint256 controllerGas) internal { require(msg.value > 0, "StakingRewardsProxy: msg.value is 0"); if (_action == ACTION_STAKE) { StakeData memory actionData = StakeData(bytes32ToString(_action), _amount); verify(msg.sender, actionData, _signature); } else { ClaimWithdrawData memory actionData = ClaimWithdrawData(bytes32ToString(_action)); verify(msg.sender, actionData, _signature); } bytes memory payload = abi.encode(msg.sender, _action, _amount, _signature); // use adapterParams v1 to specify more gas for the destination bytes memory adapterParams = getAdapterParams(_action, controllerGas); // get the fees we need to pay to LayerZero for message delivery (uint256 messageFee,) = lzEndpoint.estimateFees(controllerChainId, controller, payload, false, adapterParams); require(msg.value >= messageFee, "StakingRewardsProxy: msg.value < messageFee"); _lzSend(// {value: messageFee} will be paid out of this contract! controllerChainId, // destination chainId payload, // abi.encode()'ed bytes payable(msg.sender), // refund address (LayerZero will refund any extra gas back to caller of send() address(0x0), // future param, unused for this example adapterParams // v1 adapterParams, specify custom destination gas qty ); } function stake(uint256 _amount, bytes memory _signature) external payable notPaused { stakingToken.safeTransferFrom(msg.sender, address(this), _amount); balances[msg.sender] += _amount; uint256 controllerGas = 0; emit StakeInitiated(msg.sender, _amount); _sendMessage(ACTION_STAKE, _amount, _signature, controllerGas); } function withdraw(bytes memory _signature, uint256 _controllerGas) external payable notPaused notInQueue(msg.sender) { require(balances[msg.sender] > 0, "StakingRewardsProxy: Nothing to withdraw"); actionInQueue[msg.sender] = ACTION_WITHDRAW; signatures[msg.sender] = _signature; uint256 amount = 0; emit WithdrawalInitiated(msg.sender); _sendMessage(ACTION_WITHDRAW, amount, _signature, _controllerGas); } function claim(bytes memory _signature, uint256 _controllerGas) external payable notPaused notInQueue(msg.sender) { actionInQueue[msg.sender] = ACTION_CLAIM; signatures[msg.sender] = _signature; uint256 amount = 0; emit ClaimInitiated(msg.sender); _sendMessage(ACTION_CLAIM, amount, _signature, _controllerGas); } function _nonblockingLzReceive( uint16, /*_srcChainId*/ bytes memory, /*_srcAddress*/ uint64 _nonce, bytes memory _payload ) internal override notPaused { require(!nonceRegistry[_nonce], "This nonce was already processed"); (address payable target, uint256 rewardAmount, uint256 withdrawAmount, bytes memory signature) = abi.decode(_payload, (address, uint256, uint256, bytes)); ClaimWithdrawData memory actionData = ClaimWithdrawData(bytes32ToString(actionInQueue[target])); verify(target, actionData, signature); require(actionInQueue[target] != bytes32(0x0), "StakingRewardsProxy: No claim or withdrawal is in queue for this address"); require(keccak256(signatures[target]) == keccak256(signature), "StakingRewardsProxy: Invalid signature"); if (withdrawAmount > 0) { require(balances[target] > 0, "StakingRewardsProxy: Invalid withdrawal, no deposits done"); require(stakingToken.balanceOf(address(this)) >= withdrawAmount, "StakingRewardsProxy: Insufficient proxy token balance"); stakingToken.safeTransfer(target, withdrawAmount); balances[target] = balances[target] - withdrawAmount; emit Withdrawn(target, withdrawAmount); } if (rewardAmount > 0) { require(stakingToken.balanceOf(fund) >= rewardAmount, "StakingRewardsProxy: Insufficient fund token balance"); stakingToken.safeTransferFrom(fund, target, rewardAmount); emit Claimed(target, rewardAmount); } nonceRegistry[_nonce] = true; delete actionInQueue[target]; delete signatures[target]; } function emergency() external onlyOwner { paused = 1; (bool success, ) = payable(msg.sender).call{value: address(this).balance}(""); require(success, "StakingRewardsProxy: unable to send value, recipient may have reverted"); } function emergencyWithdraw() external { require(paused == 1, "StakingRewardsProxy: contract is not paused"); require(balances[msg.sender] > 0, "StakingRewardsProxy: Invalid withdrawal, no deposits done"); uint256 balance = balances[msg.sender]; balances[msg.sender] = 0; stakingToken.safeTransfer(msg.sender, balance); emit Withdrawn(msg.sender, balance); } function setGasAmounts(uint256 _proxyWithdraw, uint256 _proxyClaim, uint256 _controllerStake, uint256 _controllerWithdraw, uint256 _controllerClaim) public onlyOwner { if (_proxyWithdraw > 0) { gasAmounts.proxyWithdraw = _proxyWithdraw; } if (_proxyClaim > 0) { gasAmounts.proxyClaim = _proxyClaim; } if (_controllerStake > 0) { gasAmounts.controllerStake = _controllerStake; } if (_controllerWithdraw > 0) { gasAmounts.controllerWithdraw = _controllerWithdraw; } if (_controllerClaim > 0) { gasAmounts.controllerClaim = _controllerClaim; } } receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface, */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return _supportsERC165Interface(account, type(IERC165).interfaceId) && !_supportsERC165Interface(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && _supportsERC165Interface(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = _supportsERC165Interface(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in _interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!_supportsERC165Interface(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * Interface identification is specified in ERC-165. */ function _supportsERC165Interface(address account, bytes4 interfaceId) private view returns (bool) { bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); (bool success, bytes memory result) = account.staticcall{gas: 30000}(encodedParams); if (result.length < 32) return false; return success && abi.decode(result, (bool)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
pragma solidity 0.8.4; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
pragma solidity 0.8.4; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
pragma solidity 0.8.4; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. e.g. receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a lzApp from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
pragma solidity 0.8.4; import "@openzeppelin/contracts/access/Ownable.sol"; import "../interfaces/ILayerZeroReceiver.sol"; import "../interfaces/ILayerZeroUserApplicationConfig.sol"; import "../interfaces/ILayerZeroEndpoint.sol"; /* * a generic LzReceiver implementation */ abstract contract LzApp is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { ILayerZeroEndpoint internal immutable lzEndpoint; mapping(uint16 => bytes) internal trustedRemoteLookup; event SetTrustedRemote(uint16 _srcChainId, bytes _srcAddress); constructor(address _endpoint) { lzEndpoint = ILayerZeroEndpoint(_endpoint); } function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external override { // lzReceive must be called by the endpoint for security require(_msgSender() == address(lzEndpoint)); // if will still block the message pathway from (srcChainId, srcAddress). should not receive message from untrusted remote. require(_srcAddress.length == trustedRemoteLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(trustedRemoteLookup[_srcChainId]), "LzReceiver: invalid source sending contract"); _blockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } // abstract function - the default behaviour of LayerZero is blocking. See: NonblockingLzApp if you dont need to enforce ordered messaging function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function _lzSend(uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{value: msg.value}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } function _lzSendWithCustomValue(uint256 messageFee, uint16 _dstChainId, bytes memory _payload, address payable _refundAddress, address _zroPaymentAddress, bytes memory _adapterParams) internal virtual { bytes memory trustedRemote = trustedRemoteLookup[_dstChainId]; require(trustedRemote.length != 0, "LzApp: destination chain is not a trusted source"); lzEndpoint.send{value: messageFee}(_dstChainId, trustedRemote, _payload, _refundAddress, _zroPaymentAddress, _adapterParams); } //---------------------------UserApplication config---------------------------------------- function getConfig(uint16, uint16 _chainId, address, uint _configType) external view returns (bytes memory) { return lzEndpoint.getConfig(lzEndpoint.getSendVersion(address(this)), _chainId, address(this), _configType); } // generic config for LayerZero user Application function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external override onlyOwner { lzEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 _version) external override onlyOwner { lzEndpoint.setSendVersion(_version); } function setReceiveVersion(uint16 _version) external override onlyOwner { lzEndpoint.setReceiveVersion(_version); } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { lzEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } // allow owner to set it multiple times. function setTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external onlyOwner { trustedRemoteLookup[_srcChainId] = _srcAddress; emit SetTrustedRemote(_srcChainId, _srcAddress); } function isTrustedRemote(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool) { bytes memory trustedSource = trustedRemoteLookup[_srcChainId]; return keccak256(trustedSource) == keccak256(_srcAddress); } //--------------------------- VIEW FUNCTION ---------------------------------------- // interacting with the LayerZero Endpoint and remote contracts function getTrustedRemote(uint16 _chainId) external view returns (bytes memory) { return trustedRemoteLookup[_chainId]; } function getLzEndpoint() external view returns (address) { return address(lzEndpoint); } }
pragma solidity 0.8.4; import "./LzApp.sol"; /* * the default LayerZero messaging behaviour is blocking, i.e. any failed message will block the channel * this abstract class try-catch all fail messages and store locally for future retry. hence, non-blocking * NOTE: if the srcAddress is not configured properly, it will still block the message pathway from (srcChainId, srcAddress) */ abstract contract NonblockingLzApp is LzApp { constructor(address _endpoint) LzApp(_endpoint) {} mapping(uint16 => mapping(bytes => mapping(uint => bytes32))) public failedMessages; event MessageFailed(uint16 _srcChainId, bytes _srcAddress, uint64 _nonce, bytes _payload); // overriding the virtual function in LzReceiver function _blockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual override { // try-catch all errors/exceptions // try this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); // { // do nothing // } catch { // error / exception // failedMessages[_srcChainId][_srcAddress][_nonce] = keccak256(_payload); // emit MessageFailed(_srcChainId, _srcAddress, _nonce, _payload); // } } function nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) public virtual { // only internal transaction require(_msgSender() == address(this), "LzReceiver: caller must be Bridge."); _nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } //@notice override this function function _nonblockingLzReceive(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload) internal virtual; function retryMessage(uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes calldata _payload) external payable virtual { // assert there is message to retry bytes32 payloadHash = failedMessages[_srcChainId][_srcAddress][_nonce]; require(payloadHash != bytes32(0), "LzReceiver: no stored message"); require(keccak256(_payload) == payloadHash, "LzReceiver: invalid payload"); // clear the stored message failedMessages[_srcChainId][_srcAddress][_nonce] = bytes32(0); // execute the message. revert if it fails again this.nonblockingLzReceive(_srcChainId, _srcAddress, _nonce, _payload); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.4; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165Checker.sol"; import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol"; import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "hardhat/console.sol"; abstract contract Sign is EIP712 { constructor() EIP712("RADAR Cross-Chain Staking", "1") {} struct StakeData { string action; uint256 amount; } struct ClaimWithdrawData { string action; } bytes32 private constant STAKE_DATA_TYPEHASH = keccak256("StakeData(string action,uint256 amount)"); bytes32 private constant CLAIM_WITHDRAW_DATA_TYPEHASH = keccak256("ClaimWithdrawData(string action)"); bytes32 private constant EIP712_DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,string version)"); bytes32 private constant DOMAIN_SEPARATOR = keccak256(abi.encode( EIP712_DOMAIN_TYPEHASH, keccak256("RADAR Cross-Chain Staking"), keccak256("1") )); function hashActionData(StakeData memory actionData) private view returns (bytes32) { return keccak256(abi.encode( STAKE_DATA_TYPEHASH, keccak256(abi.encodePacked(actionData.action)), actionData.amount )); } function hashActionData(ClaimWithdrawData memory actionData) private view returns (bytes32) { return keccak256(abi.encode( CLAIM_WITHDRAW_DATA_TYPEHASH, keccak256(abi.encodePacked(actionData.action)) )); } function verify(address user, StakeData memory actionData, bytes memory signature) public view virtual { bytes32 digest = _hashTypedDataV4(hashActionData(actionData)); _verify(user, digest, signature); } function verify(address user, ClaimWithdrawData memory actionData, bytes memory signature) public view virtual { bytes32 digest = _hashTypedDataV4(hashActionData(actionData)); _verify(user, digest, signature); } function _verify(address user, bytes32 digest, bytes memory signature) internal view virtual { (address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(digest, signature); require(error == ECDSA.RecoverError.NoError && recovered == user, "Sign: Invalid signature"); } function bytes32ToString(bytes32 _bytes32) public pure returns (string memory) { uint8 i = 0; while(i < 32 && _bytes32[i] != 0) { i++; } bytes memory bytesArray = new bytes(i); for (i = 0; i < 32 && _bytes32[i] != 0; i++) { bytesArray[i] = _bytes32[i]; } return string(bytesArray); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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 * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ECDSA.sol"; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash)); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } }
// 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(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", 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(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", 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, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", 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, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", 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(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", 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, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", 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, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", 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, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", 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(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", 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, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", 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, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", 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, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_fund","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"ClaimInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"_nonce","type":"uint64"},{"indexed":false,"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"MessageFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"SetTrustedRemote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"WithdrawalInitiated","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":"address","name":"","type":"address"}],"name":"actionInQueue","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_bytes32","type":"bytes32"}],"name":"bytes32ToString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_controllerGas","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_action","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"controllerGas","type":"uint256"}],"name":"estimateFees","outputs":[{"internalType":"uint256","name":"messageFee","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"failedMessages","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gasAmounts","outputs":[{"internalType":"uint256","name":"proxyWithdraw","type":"uint256"},{"internalType":"uint256","name":"proxyClaim","type":"uint256"},{"internalType":"uint256","name":"controllerStake","type":"uint256"},{"internalType":"uint256","name":"controllerWithdraw","type":"uint256"},{"internalType":"uint256","name":"controllerClaim","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_configType","type":"uint256"}],"name":"getConfig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLzEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getTrustedRemote","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"isTrustedRemote","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"nonblockingLzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"retryMessage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_proxyWithdraw","type":"uint256"},{"internalType":"uint256","name":"_proxyClaim","type":"uint256"},{"internalType":"uint256","name":"_controllerStake","type":"uint256"},{"internalType":"uint256","name":"_controllerWithdraw","type":"uint256"},{"internalType":"uint256","name":"_controllerClaim","type":"uint256"}],"name":"setGasAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"setTrustedRemote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signatures","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"string","name":"action","type":"string"}],"internalType":"struct Sign.ClaimWithdrawData","name":"actionData","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"components":[{"internalType":"string","name":"action","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Sign.StakeData","name":"actionData","type":"tuple"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"verify","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_controllerGas","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
610180604052600360f21b610140523480156200001b57600080fd5b50604051620041f7380380620041f78339810160408190526200003e9162000442565b6040518060400160405280601981526020017f52414441522043726f73732d436861696e205374616b696e6700000000000000815250604051806040016040528060018152602001603160f81b8152508580620000aa620000a46200030060201b60201c565b62000304565b606090811b6001600160601b0319166080908152845160209586012084519486019490942060e08590526101008190524660c052604080517fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c381890181905281830197909752808501929092528051808303909401845291019052805193019290922060a0526101205250620001408562000354565b6001600160a01b038216620001b25760405162461bcd60e51b815260206004820152602d60248201527f52616461725374616b696e6750726f78793a20696e76616c696420636f6e747260448201526c6f6c6c6572206164647265737360981b60648201526084015b60405180910390fd5b6001600160a01b038116620002235760405162461bcd60e51b815260206004820152603060248201527f52616461725374616b696e6750726f78793a20696e76616c6964207374616b6960448201526f6e6720746f6b656e206164647265737360801b6064820152608401620001a9565b6001600160a01b0383166200028b5760405162461bcd60e51b815260206004820152602760248201527f52616461725374616b696e6750726f78793a20696e76616c69642066756e64206044820152666164647265737360c81b6064820152608401620001a9565b60038054610100600160a81b0319166101006001600160a01b0394851602179055600480546001600160a01b0319169390921692909217905560601b6001600160601b0319166101605250506203f7a06005556203a980600655620445c060075562057e406008556205cc60600955620004b1565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b03163314620003b05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001a9565b6001600160a01b038116620004175760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401620001a9565b620004228162000304565b50565b80516001600160a01b03811681146200043d57600080fd5b919050565b600080600080600060a086880312156200045a578081fd5b620004658662000425565b9450620004756020870162000425565b9350620004856040870162000425565b9250620004956060870162000425565b9150620004a56080870162000425565b90509295509295909350565b60805160601c60a05160c05160e05161010051610120516101405160f01c6101605160601c613c596200059e6000396000818161043a0152818161099c0152818161173401528181611fb1015281816120ac0152818161217c01526122740152600081816105a001528181610f4801528181611c140152611d040152600061292b0152600061297a01526000612955015260006128d90152600061290201526000818161065f015281816107400152818161090401528181610a7c01528181610c8b01528181610f1a01528181611468015281816118e201528181611be6015261285a0152613c596000f3fe6080604052600436106102075760003560e01c80638da5cb5b11610118578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b714610698578063f087a1e5146106b8578063f2fde38b146106d8578063f5ecbdbc146106f8578063f77c47911461071857600080fd5b8063cbed8b9c1461061d578063d1deba1f1461063d578063dacbcbe214610650578063db2e21bc1461068357600080fd5b8063b60d4288116100e7578063b60d42881461056e578063bb87b71b1461058e578063c7012626146105d5578063c792f36d146105e8578063caa6fea41461060857600080fd5b80638da5cb5b146104b45780638ee74912146104d25780639201de55146105215780639bdedc721461054157600080fd5b806342d65a8d1161019b5780636f62114d1161016a5780636f62114d146103f3578063715018a61461041357806372f702f31461042857806377544e841461047457806389b0c4fe1461049457600080fd5b806342d65a8d1461035a5780635c975abb1461037a57806366ad5c8a146103a657806369b41f95146103c657600080fd5b806310ddb137116101d757806310ddb137146102bc57806327e235e3146102dc5780633a33f3e0146103175780633d8b38f61461032a57600080fd5b80621d35671461021357806307e0db17146102355780630cdf16c9146102555780630e89439b146102a957600080fd5b3661020e57005b600080fd5b34801561021f57600080fd5b5061023361022e36600461334b565b61073d565b005b34801561024157600080fd5b506102336102503660046132c1565b6108c1565b34801561026157600080fd5b5060055460065460075460085460095461027c949392919085565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6102336102b73660046135fb565b61096c565b3480156102c857600080fd5b506102336102d73660046132c1565b610a39565b3480156102e857600080fd5b506103096102f7366004612fe5565b600d6020526000908152604090205481565b6040519081526020016102a0565b61023361032536600461327f565b610ab3565b34801561033657600080fd5b5061034a6103453660046132f9565b610b7d565b60405190151581526020016102a0565b34801561036657600080fd5b506102336103753660046132f9565b610c4a565b34801561038657600080fd5b506003546103949060ff1681565b60405160ff90911681526020016102a0565b3480156103b257600080fd5b506102336103c13660046134bd565b610cfb565b3480156103d257600080fd5b506103e66103e13660046132c1565b610d61565b6040516102a091906137ef565b3480156103ff57600080fd5b5061023361040e366004613662565b610e08565b34801561041f57600080fd5b50610233610e71565b34801561043457600080fd5b5061045c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a0565b34801561048057600080fd5b5061023361048f366004613063565b610ea7565b3480156104a057600080fd5b506103096104af3660046131f8565b610ec7565b3480156104c057600080fd5b506000546001600160a01b031661045c565b3480156104de57600080fd5b506103096104ed3660046133dd565b6002602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561052d57600080fd5b506103e661053c3660046131e0565b610fda565b34801561054d57600080fd5b5061030961055c366004612fe5565b600b6020526000908152604090205481565b34801561057a57600080fd5b5060045461045c906001600160a01b031681565b34801561059a57600080fd5b506105c27f000000000000000000000000000000000000000000000000000000000000000081565b60405161ffff90911681526020016102a0565b6102336105e336600461327f565b61114f565b3480156105f457600080fd5b506103e6610603366004612fe5565b611286565b34801561061457600080fd5b50610233611320565b34801561062957600080fd5b50610233610638366004613584565b611427565b61023361064b366004613433565b6114de565b34801561065c57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061045c565b34801561068f57600080fd5b50610233611684565b3480156106a457600080fd5b506102336106b33660046132f9565b61179b565b3480156106c457600080fd5b506102336106d3366004613117565b611824565b3480156106e457600080fd5b506102336106f3366004612fe5565b611832565b34801561070457600080fd5b506103e6610713366004613534565b6118ca565b34801561072457600080fd5b5060035461045c9061010090046001600160a01b031681565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461077257600080fd5b61ffff86166000908152600160205260409020805461079090613b77565b8514905080156107de575061ffff86166000908152600160205260409081902090516107bc919061371d565b604051809103902085856040516107d49291906136f1565b6040518091039020145b6108435760405162461bcd60e51b815260206004820152602b60248201527f4c7a52656365697665723a20696e76616c696420736f757263652073656e646960448201526a1b99c818dbdb9d1c9858dd60aa1b60648201526084015b60405180910390fd5b6108b98686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611a0092505050565b505050505050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161083a906138a4565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b5050505050565b60035460ff161561098f5760405162461bcd60e51b815260040161083a90613802565b6109c46001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611a61565b336000908152600d6020526040812080548492906109e3908490613b1c565b909155505060405182815260009033907fc60b9da75711e6d42d3406e0ff0625e12c63e7820e83ee169736c720c224dd4c9060200160405180910390a2610a34647374616b6560d81b848484611acc565b505050565b6000546001600160a01b03163314610a635760405162461bcd60e51b815260040161083a906138a4565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906310ddb13790602401610937565b60035460ff1615610ad65760405162461bcd60e51b815260040161083a90613802565b336000818152600b602052604090205415610b035760405162461bcd60e51b815260040161083a906138d9565b336000908152600b6020908152604080832064636c61696d60d81b9055600c82529091208451610b3592860190612db3565b5060405160009033907f0b559f3edd2f7695377aca21bda71e88238d36f616a95615d66d79bd7c157b39908390a2610b7764636c61696d60d81b828686611acc565b50505050565b61ffff831660009081526001602052604081208054829190610b9e90613b77565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90613b77565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b505050505090508383604051610c2e9291906136f1565b60405180910390208180519060200120149150505b9392505050565b6000546001600160a01b03163314610c745760405162461bcd60e51b815260040161083a906138a4565b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610cc490869086908690600401613995565b600060405180830381600087803b158015610cde57600080fd5b505af1158015610cf2573d6000803e3d6000fd5b50505050505050565b333014610d555760405162461bcd60e51b815260206004820152602260248201527f4c7a52656365697665723a2063616c6c6572206d757374206265204272696467604482015261329760f11b606482015260840161083a565b610b7784848484611d2d565b61ffff81166000908152600160205260409020805460609190610d8390613b77565b80601f0160208091040260200160405190810160405280929190818152602001828054610daf90613b77565b8015610dfc5780601f10610dd157610100808354040283529160200191610dfc565b820191906000526020600020905b815481529060010190602001808311610ddf57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610e325760405162461bcd60e51b815260040161083a906138a4565b8415610e3e5760058590555b8315610e4a5760068490555b8215610e565760078390555b8115610e625760088290555b80156109655760095550505050565b6000546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161083a906138a4565b610ea5600061232e565b565b6000610eba610eb58461237e565b612403565b9050610b77848284612457565b600080610ed486846124f5565b9050600033878787604051602001610eef94939291906137b8565b60408051601f198184030181529082905260035463040a7bb160e41b83529092506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340a7bb1092610f7f927f000000000000000000000000000000000000000000000000000000000000000092610100909204169086906000908990600401613941565b604080518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce919061363f565b50979650505050505050565b606060005b60208160ff161080156110215750828160ff166020811061101057634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b15611038578061103081613bb2565b915050610fdf565b60008160ff166001600160401b0381111561106357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561108d576020820181803683370190505b509050600091505b60208260ff161080156110d75750838260ff16602081106110c657634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b15610c4357838260ff16602081106110ff57634e487b7160e01b600052603260045260246000fd5b1a60f81b818360ff168151811061112657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161114781613bb2565b925050611095565b60035460ff16156111725760405162461bcd60e51b815260040161083a90613802565b336000818152600b60205260409020541561119f5760405162461bcd60e51b815260040161083a906138d9565b336000908152600d602052604090205461120c5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e675265776172647350726f78793a204e6f7468696e6720746f20604482015267776974686472617760c01b606482015260840161083a565b336000908152600b6020908152604080832067776974686472617760c01b9055600c8252909120845161124192860190612db3565b5060405160009033907f7ffb073c78e535aa33c7eb547f62fbd9bf789f61ca86c766a9da2e04b9504a3a908390a2610b7767776974686472617760c01b828686611acc565b600c602052600090815260409020805461129f90613b77565b80601f01602080910402602001604051908101604052809291908181526020018280546112cb90613b77565b80156113185780601f106112ed57610100808354040283529160200191611318565b820191906000526020600020905b8154815290600101906020018083116112fb57829003601f168201915b505050505081565b6000546001600160a01b0316331461134a5760405162461bcd60e51b815260040161083a906138a4565b6003805460ff19166001179055604051600090339047908381818185875af1925050503d8060008114611399576040519150601f19603f3d011682016040523d82523d6000602084013e61139e565b606091505b50509050806114245760405162461bcd60e51b815260206004820152604660248201527f5374616b696e675265776172647350726f78793a20756e61626c6520746f207360448201527f656e642076616c75652c20726563697069656e74206d617920686176652072656064820152651d995c9d195960d21b608482015260a40161083a565b50565b6000546001600160a01b031633146114515760405162461bcd60e51b815260040161083a906138a4565b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906114a59088908890889088908890600401613a97565b600060405180830381600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050505050505050565b61ffff851660009081526002602052604080822090516114ff908790613701565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806115735760405162461bcd60e51b815260206004820152601d60248201527f4c7a52656365697665723a206e6f2073746f726564206d657373616765000000604482015260640161083a565b8083836040516115849291906136f1565b6040518091039020146115d95760405162461bcd60e51b815260206004820152601b60248201527f4c7a52656365697665723a20696e76616c6964207061796c6f61640000000000604482015260640161083a565b61ffff861660009081526002602052604080822090516115fa908890613701565b9081526040805191829003602090810183206001600160401b038916600090815291522091909155633356ae4560e11b815230906366ad5c8a9061164a9089908990899089908990600401613a1a565b600060405180830381600087803b15801561166457600080fd5b505af1158015611678573d6000803e3d6000fd5b50505050505050505050565b60035460ff166001146116ed5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e675265776172647350726f78793a20636f6e747261637420697360448201526a081b9bdd081c185d5cd95960aa1b606482015260840161083a565b336000908152600d60205260409020546117195760405162461bcd60e51b815260040161083a90613847565b336000818152600d60205260408120805491905590611763907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690836125c3565b60405181815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250565b6000546001600160a01b031633146117c55760405162461bcd60e51b815260040161083a906138a4565b61ffff831660009081526001602052604090206117e3908383612e37565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161181793929190613995565b60405180910390a1505050565b6000610eba610eb5846125f3565b6000546001600160a01b0316331461185c5760405162461bcd60e51b815260040161083a906138a4565b6001600160a01b0381166118c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161083a565b6114248161232e565b6040516304b2b47b60e11b81523060048201526060907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063f5ecbdbc90829063096568f69060240160206040518083038186803b15801561193457600080fd5b505afa158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c91906132dd565b6040516001600160e01b031960e084901b16815261ffff918216600482015290871660248201523060448201526064810185905260840160006040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119f7919081019061324d565b95945050505050565b604051633356ae4560e11b815230906366ad5c8a90611a29908790879087908790600401613a59565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b5050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052610b779085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b60003411611b285760405162461bcd60e51b815260206004820152602360248201527f5374616b696e675265776172647350726f78793a206d73672e76616c7565206960448201526207320360ec1b606482015260840161083a565b647374616b6560d81b841415611b695760006040518060400160405280611b4e87610fda565b81526020018590529050611b63338285611824565b50611b90565b60006040518060200160405280611b7f87610fda565b90529050611b8e338285610ea7565b505b600033858585604051602001611ba994939291906137b8565b60405160208183030381529060405290506000611bc686846124f5565b60035460405163040a7bb160e41b81529192506000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340a7bb1092611c49927f00000000000000000000000000000000000000000000000000000000000000009261010090041690889087908990600401613941565b604080518083038186803b158015611c6057600080fd5b505afa158015611c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c98919061363f565b50905080341015611cff5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e675265776172647350726f78793a206d73672e76616c7565203c60448201526a206d65737361676546656560a81b606482015260840161083a565b610cf27f0000000000000000000000000000000000000000000000000000000000000000843360008661273b565b60035460ff1615611d505760405162461bcd60e51b815260040161083a90613802565b6001600160401b0382166000908152600a602052604090205460ff1615611db95760405162461bcd60e51b815260206004820181905260248201527f54686973206e6f6e63652077617320616c72656164792070726f636573736564604482015260640161083a565b60008060008084806020019051810190611dd39190613001565b935093509350935060006040518060200160405280611e16600b6000896001600160a01b03166001600160a01b0316815260200190815260200160002054610fda565b90529050611e25858284610ea7565b6001600160a01b0385166000908152600b6020526040902054611ec15760405162461bcd60e51b815260206004820152604860248201527f5374616b696e675265776172647350726f78793a204e6f20636c61696d206f7260448201527f207769746864726177616c20697320696e20717565756520666f722074686973606482015267206164647265737360c01b608482015260a40161083a565b8180519060200120600c6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051611efb919061371d565b604051809103902014611f5f5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e675265776172647350726f78793a20496e76616c6964207369676044820152656e617475726560d01b606482015260840161083a565b821561214f576001600160a01b0385166000908152600d6020526040902054611f9a5760405162461bcd60e51b815260040161083a90613847565b6040516370a0823160e01b815230600482015283907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203391906135e3565b101561209f5760405162461bcd60e51b815260206004820152603560248201527f5374616b696e675265776172647350726f78793a20496e73756666696369656e604482015274742070726f787920746f6b656e2062616c616e636560581b606482015260840161083a565b6120d36001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686856125c3565b6001600160a01b0385166000908152600d60205260409020546120f7908490613b34565b6001600160a01b0386166000818152600d6020526040908190209290925590517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906121469086815260200190565b60405180910390a25b83156122e257600480546040516370a0823160e01b81526001600160a01b039182169281019290925285917f0000000000000000000000000000000000000000000000000000000000000000909116906370a082319060240160206040518083038186803b1580156121c057600080fd5b505afa1580156121d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f891906135e3565b10156122635760405162461bcd60e51b815260206004820152603460248201527f5374616b696e675265776172647350726f78793a20496e73756666696369656e604482015273742066756e6420746f6b656e2062616c616e636560601b606482015260840161083a565b60045461229e906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168787611a61565b846001600160a01b03167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a856040516122d991815260200190565b60405180910390a25b6001600160401b0387166000908152600a60209081526040808320805460ff191660011790556001600160a01b0388168352600b8252808320839055600c90915281206114d391612eab565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60007fa62e0f1e03cb648dfe1f2ea051ebd4d005f071b5a0beb984e6e4d11a4f8b474d82600001516040516020016123b69190613701565b604051602081830303815290604052805190602001206040516020016123e6929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b60006124516124106128d5565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b60008061246484846129bc565b9092509050600081600481111561248b57634e487b7160e01b600052602160045260246000fd5b1480156124a95750846001600160a01b0316826001600160a01b0316145b6109655760405162461bcd60e51b815260206004820152601760248201527f5369676e3a20496e76616c6964207369676e6174757265000000000000000000604482015260640161083a565b6060647374616b6560d81b83141561255157600160006125158582612a2c565b6040516001600160f01b031960f085901b1660208201526022810182905290915060420160405160208183030381529060405292505050612451565b6002600061255f8582612a2c565b60035460405160f085901b6001600160f01b0319166020820152602281018390526042810187905261010090910460601b6bffffffffffffffffffffffff191660628201529091506076016040516020818303038152906040529250505092915050565b6040516001600160a01b038316602482015260448101829052610a3490849063a9059cbb60e01b90606401611a95565b60007f48e37fd99b6b399ac9180ab7cc01fa1aa4ffd4abb7be90f0b7f46aefd171b8bf826000015160405160200161262b9190613701565b6040516020818303038152906040528051906020012083602001516040516020016123e6939291909283526020830191909152604082015260600190565b60006126be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b1f9092919063ffffffff16565b805190915015610a3457808060200190518101906126dc91906131c0565b610a345760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161083a565b61ffff85166000908152600160205260408120805461275990613b77565b80601f016020809104026020016040519081016040528092919081815260200182805461278590613b77565b80156127d25780601f106127a7576101008083540402835291602001916127d2565b820191906000526020600020905b8154815290600101906020018083116127b557829003601f168201915b505050505090508051600014156128445760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161083a565b60405162c5803160e81b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c580310090349061289b908a9086908b908b908b908b906004016139b3565b6000604051808303818588803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b5050505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000046141561292457507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f0000000000000000000000000000000000000000000000000000000000000000606080840191909152835180840390910181526080909201909252805191012090565b6000808251604114156129f35760208301516040840151606085015160001a6129e787828585612b36565b94509450505050612a25565b825160401415612a1d5760208301516040840151612a12868383612c23565b935093505050612a25565b506000905060025b9250929050565b60008115612a6a5764636c61696d60d81b831415612a4d5750600654612ab4565b67776974686472617760c01b831415612a6557506005545b612ab4565b64636c61696d60d81b831415612a835750600954612ab4565b67776974686472617760c01b831415612a9f5750600854612ab4565b647374616b6560d81b831415612ab457506007545b600081116124515760405162461bcd60e51b815260206004820152603260248201527f5374616b696e675265776172647350726f78793a20756e61626c6520746f2072604482015271195d1c9a595d994819d85cc8185b5bdd5b9d60721b606482015260840161083a565b6060612b2e8484600085612c52565b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b6d5750600090506003612c1a565b8460ff16601b14158015612b8557508460ff16601c14155b15612b965750600090506004612c1a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c1357600060019250925050612c1a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612c4487828885612b36565b935093505050935093915050565b606082471015612cb35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161083a565b843b612d015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161083a565b600080866001600160a01b03168587604051612d1d9190613701565b60006040518083038185875af1925050503d8060008114612d5a576040519150601f19603f3d011682016040523d82523d6000602084013e612d5f565b606091505b5091509150612d6f828286612d7a565b979650505050505050565b60608315612d89575081610c43565b825115612d995782518084602001fd5b8160405162461bcd60e51b815260040161083a91906137ef565b828054612dbf90613b77565b90600052602060002090601f016020900481019282612de15760008555612e27565b82601f10612dfa57805160ff1916838001178555612e27565b82800160010185558215612e27579182015b82811115612e27578251825591602001919060010190612e0c565b50612e33929150612ee1565b5090565b828054612e4390613b77565b90600052602060002090601f016020900481019282612e655760008555612e27565b82601f10612e7e5782800160ff19823516178555612e27565b82800160010185558215612e27579182015b82811115612e27578235825591602001919060010190612e90565b508054612eb790613b77565b6000825580601f10612ec7575050565b601f01602090049060005260206000209081019061142491905b5b80821115612e335760008155600101612ee2565b60008083601f840112612f07578182fd5b5081356001600160401b03811115612f1d578182fd5b602083019150836020828501011115612a2557600080fd5b600082601f830112612f45578081fd5b8135612f58612f5382613af5565b613ac5565b818152846020838601011115612f6c578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612f96578081fd5b8151612fa4612f5382613af5565b818152846020838601011115612fb8578283fd5b612b2e826020830160208701613b4b565b80356001600160401b0381168114612fe057600080fd5b919050565b600060208284031215612ff6578081fd5b8135610c4381613bfe565b60008060008060808587031215613016578283fd5b845161302181613bfe565b80945050602085015192506040850151915060608501516001600160401b0381111561304b578182fd5b61305787828801612f86565b91505092959194509250565b600080600060608486031215613077578283fd5b833561308281613bfe565b925060208401356001600160401b038082111561309d578384fd5b90850190602082880312156130b0578384fd5b6040516020810181811083821117156130cb576130cb613be8565b6040528235828111156130dc578586fd5b6130e889828601612f35565b82525093506040860135915080821115613100578283fd5b5061310d86828701612f35565b9150509250925092565b60008060006060848603121561312b578283fd5b833561313681613bfe565b925060208401356001600160401b0380821115613151578384fd5b9085019060408288031215613164578384fd5b60405160408101818110838211171561317f5761317f613be8565b604052823582811115613190578586fd5b61319c89828601612f35565b82525060208301356020820152809450506040860135915080821115613100578283fd5b6000602082840312156131d1578081fd5b81518015158114610c43578182fd5b6000602082840312156131f1578081fd5b5035919050565b6000806000806080858703121561320d578384fd5b843593506020850135925060408501356001600160401b03811115613230578283fd5b61323c87828801612f35565b949793965093946060013593505050565b60006020828403121561325e578081fd5b81516001600160401b03811115613273578182fd5b612b2e84828501612f86565b60008060408385031215613291578182fd5b82356001600160401b038111156132a6578283fd5b6132b285828601612f35565b95602094909401359450505050565b6000602082840312156132d2578081fd5b8135610c4381613c13565b6000602082840312156132ee578081fd5b8151610c4381613c13565b60008060006040848603121561330d578081fd5b833561331881613c13565b925060208401356001600160401b03811115613332578182fd5b61333e86828701612ef6565b9497909650939450505050565b60008060008060008060808789031215613363578384fd5b863561336e81613c13565b955060208701356001600160401b0380821115613389578586fd5b6133958a838b01612ef6565b90975095508591506133a960408a01612fc9565b945060608901359150808211156133be578384fd5b506133cb89828a01612ef6565b979a9699509497509295939492505050565b6000806000606084860312156133f1578081fd5b83356133fc81613c13565b925060208401356001600160401b03811115613416578182fd5b61342286828701612f35565b925050604084013590509250925092565b60008060008060006080868803121561344a578283fd5b853561345581613c13565b945060208601356001600160401b0380821115613470578485fd5b61347c89838a01612f35565b955061348a60408901612fc9565b9450606088013591508082111561349f578283fd5b506134ac88828901612ef6565b969995985093965092949392505050565b600080600080608085870312156134d2578182fd5b84356134dd81613c13565b935060208501356001600160401b03808211156134f8578384fd5b61350488838901612f35565b945061351260408801612fc9565b93506060870135915080821115613527578283fd5b5061305787828801612f35565b60008060008060808587031215613549578182fd5b843561355481613c13565b9350602085013561356481613c13565b9250604085013561357481613bfe565b9396929550929360600135925050565b60008060008060006080868803121561359b578283fd5b85356135a681613c13565b945060208601356135b681613c13565b93506040860135925060608601356001600160401b038111156135d7578182fd5b6134ac88828901612ef6565b6000602082840312156135f4578081fd5b5051919050565b6000806040838503121561360d578182fd5b8235915060208301356001600160401b03811115613629578182fd5b61363585828601612f35565b9150509250929050565b60008060408385031215613651578182fd5b505080516020909101519092909150565b600080600080600060a08688031215613679578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526136dd816020860160208601613b4b565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251613713818460208701613b4b565b9190910192915050565b600080835482600182811c91508083168061373957607f831692505b602080841082141561375957634e487b7160e01b87526022600452602487fd5b81801561376d576001811461377e576137aa565b60ff198616895284890196506137aa565b60008a815260209020885b868110156137a25781548b820152908501908301613789565b505084890196505b509498975050505050505050565b60018060a01b03851681528360208201528260408201526080606082015260006137e560808301846136c5565b9695505050505050565b602081526000610c4360208301846136c5565b60208082526025908201527f52616461725374616b696e6750726f78793a20436f6e74726163742069732070604082015264185d5cd95960da1b606082015260800190565b60208082526039908201527f5374616b696e675265776172647350726f78793a20496e76616c69642077697460408201527f6864726177616c2c206e6f206465706f7369747320646f6e6500000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526042908201527f52616461725374616b696e6750726f78793a20496e20717565756520616c726560408201527f6164792120576169742074696c6c207468652063616c6c6261636b20636f6d65606082015261399760f11b608082015260a00190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061396f908301866136c5565b8415156060840152828103608084015261398981856136c5565b98975050505050505050565b61ffff841681526040602082015260006119f760408301848661369c565b61ffff8716815260c0602082015260006139d060c08301886136c5565b82810360408401526139e281886136c5565b6001600160a01b0387811660608601528616608085015283810360a08501529050613a0d81856136c5565b9998505050505050505050565b61ffff86168152608060208201526000613a3760808301876136c5565b6001600160401b0386166040840152828103606084015261398981858761369c565b61ffff85168152608060208201526000613a7660808301866136c5565b6001600160401b03851660408401528281036060840152612d6f81856136c5565b600061ffff808816835280871660208401525084604083015260806060830152612d6f60808301848661369c565b604051601f8201601f191681016001600160401b0381118282101715613aed57613aed613be8565b604052919050565b60006001600160401b03821115613b0e57613b0e613be8565b50601f01601f191660200190565b60008219821115613b2f57613b2f613bd2565b500190565b600082821015613b4657613b46613bd2565b500390565b60005b83811015613b66578181015183820152602001613b4e565b83811115610b775750506000910152565b600181811c90821680613b8b57607f821691505b60208210811415613bac57634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff811415613bc957613bc9613bd2565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461142457600080fd5b61ffff8116811461142457600080fdfea26469706673582212206aebc68b56fb5a1e7c6c1e6a1e3170a2db4efba8915a6671a720187bce5b02a964736f6c63430008040033000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d0000000000000000000000006b36b0c9f2ff94b379b27bc244b350ac352114d800000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe
Deployed Bytecode
0x6080604052600436106102075760003560e01c80638da5cb5b11610118578063cbed8b9c116100a0578063eb8d72b71161006f578063eb8d72b714610698578063f087a1e5146106b8578063f2fde38b146106d8578063f5ecbdbc146106f8578063f77c47911461071857600080fd5b8063cbed8b9c1461061d578063d1deba1f1461063d578063dacbcbe214610650578063db2e21bc1461068357600080fd5b8063b60d4288116100e7578063b60d42881461056e578063bb87b71b1461058e578063c7012626146105d5578063c792f36d146105e8578063caa6fea41461060857600080fd5b80638da5cb5b146104b45780638ee74912146104d25780639201de55146105215780639bdedc721461054157600080fd5b806342d65a8d1161019b5780636f62114d1161016a5780636f62114d146103f3578063715018a61461041357806372f702f31461042857806377544e841461047457806389b0c4fe1461049457600080fd5b806342d65a8d1461035a5780635c975abb1461037a57806366ad5c8a146103a657806369b41f95146103c657600080fd5b806310ddb137116101d757806310ddb137146102bc57806327e235e3146102dc5780633a33f3e0146103175780633d8b38f61461032a57600080fd5b80621d35671461021357806307e0db17146102355780630cdf16c9146102555780630e89439b146102a957600080fd5b3661020e57005b600080fd5b34801561021f57600080fd5b5061023361022e36600461334b565b61073d565b005b34801561024157600080fd5b506102336102503660046132c1565b6108c1565b34801561026157600080fd5b5060055460065460075460085460095461027c949392919085565b604080519586526020860194909452928401919091526060830152608082015260a0015b60405180910390f35b6102336102b73660046135fb565b61096c565b3480156102c857600080fd5b506102336102d73660046132c1565b610a39565b3480156102e857600080fd5b506103096102f7366004612fe5565b600d6020526000908152604090205481565b6040519081526020016102a0565b61023361032536600461327f565b610ab3565b34801561033657600080fd5b5061034a6103453660046132f9565b610b7d565b60405190151581526020016102a0565b34801561036657600080fd5b506102336103753660046132f9565b610c4a565b34801561038657600080fd5b506003546103949060ff1681565b60405160ff90911681526020016102a0565b3480156103b257600080fd5b506102336103c13660046134bd565b610cfb565b3480156103d257600080fd5b506103e66103e13660046132c1565b610d61565b6040516102a091906137ef565b3480156103ff57600080fd5b5061023361040e366004613662565b610e08565b34801561041f57600080fd5b50610233610e71565b34801561043457600080fd5b5061045c7f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe81565b6040516001600160a01b0390911681526020016102a0565b34801561048057600080fd5b5061023361048f366004613063565b610ea7565b3480156104a057600080fd5b506103096104af3660046131f8565b610ec7565b3480156104c057600080fd5b506000546001600160a01b031661045c565b3480156104de57600080fd5b506103096104ed3660046133dd565b6002602090815260009384526040808520845180860184018051928152908401958401959095209452929052825290205481565b34801561052d57600080fd5b506103e661053c3660046131e0565b610fda565b34801561054d57600080fd5b5061030961055c366004612fe5565b600b6020526000908152604090205481565b34801561057a57600080fd5b5060045461045c906001600160a01b031681565b34801561059a57600080fd5b506105c27f000000000000000000000000000000000000000000000000000000000000000c81565b60405161ffff90911681526020016102a0565b6102336105e336600461327f565b61114f565b3480156105f457600080fd5b506103e6610603366004612fe5565b611286565b34801561061457600080fd5b50610233611320565b34801561062957600080fd5b50610233610638366004613584565b611427565b61023361064b366004613433565b6114de565b34801561065c57600080fd5b507f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67561045c565b34801561068f57600080fd5b50610233611684565b3480156106a457600080fd5b506102336106b33660046132f9565b61179b565b3480156106c457600080fd5b506102336106d3366004613117565b611824565b3480156106e457600080fd5b506102336106f3366004612fe5565b611832565b34801561070457600080fd5b506103e6610713366004613534565b6118ca565b34801561072457600080fd5b5060035461045c9061010090046001600160a01b031681565b337f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03161461077257600080fd5b61ffff86166000908152600160205260409020805461079090613b77565b8514905080156107de575061ffff86166000908152600160205260409081902090516107bc919061371d565b604051809103902085856040516107d49291906136f1565b6040518091039020145b6108435760405162461bcd60e51b815260206004820152602b60248201527f4c7a52656365697665723a20696e76616c696420736f757263652073656e646960448201526a1b99c818dbdb9d1c9858dd60aa1b60648201526084015b60405180910390fd5b6108b98686868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f890181900481028201810190925287815289935091508790879081908401838280828437600092019190915250611a0092505050565b505050505050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161083a906138a4565b6040516307e0db1760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906307e0db17906024015b600060405180830381600087803b15801561095157600080fd5b505af1158015610965573d6000803e3d6000fd5b5050505050565b60035460ff161561098f5760405162461bcd60e51b815260040161083a90613802565b6109c46001600160a01b037f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe16333085611a61565b336000908152600d6020526040812080548492906109e3908490613b1c565b909155505060405182815260009033907fc60b9da75711e6d42d3406e0ff0625e12c63e7820e83ee169736c720c224dd4c9060200160405180910390a2610a34647374616b6560d81b848484611acc565b505050565b6000546001600160a01b03163314610a635760405162461bcd60e51b815260040161083a906138a4565b6040516310ddb13760e01b815261ffff821660048201527f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b0316906310ddb13790602401610937565b60035460ff1615610ad65760405162461bcd60e51b815260040161083a90613802565b336000818152600b602052604090205415610b035760405162461bcd60e51b815260040161083a906138d9565b336000908152600b6020908152604080832064636c61696d60d81b9055600c82529091208451610b3592860190612db3565b5060405160009033907f0b559f3edd2f7695377aca21bda71e88238d36f616a95615d66d79bd7c157b39908390a2610b7764636c61696d60d81b828686611acc565b50505050565b61ffff831660009081526001602052604081208054829190610b9e90613b77565b80601f0160208091040260200160405190810160405280929190818152602001828054610bca90613b77565b8015610c175780601f10610bec57610100808354040283529160200191610c17565b820191906000526020600020905b815481529060010190602001808311610bfa57829003601f168201915b505050505090508383604051610c2e9291906136f1565b60405180910390208180519060200120149150505b9392505050565b6000546001600160a01b03163314610c745760405162461bcd60e51b815260040161083a906138a4565b6040516342d65a8d60e01b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd67516906342d65a8d90610cc490869086908690600401613995565b600060405180830381600087803b158015610cde57600080fd5b505af1158015610cf2573d6000803e3d6000fd5b50505050505050565b333014610d555760405162461bcd60e51b815260206004820152602260248201527f4c7a52656365697665723a2063616c6c6572206d757374206265204272696467604482015261329760f11b606482015260840161083a565b610b7784848484611d2d565b61ffff81166000908152600160205260409020805460609190610d8390613b77565b80601f0160208091040260200160405190810160405280929190818152602001828054610daf90613b77565b8015610dfc5780601f10610dd157610100808354040283529160200191610dfc565b820191906000526020600020905b815481529060010190602001808311610ddf57829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610e325760405162461bcd60e51b815260040161083a906138a4565b8415610e3e5760058590555b8315610e4a5760068490555b8215610e565760078390555b8115610e625760088290555b80156109655760095550505050565b6000546001600160a01b03163314610e9b5760405162461bcd60e51b815260040161083a906138a4565b610ea5600061232e565b565b6000610eba610eb58461237e565b612403565b9050610b77848284612457565b600080610ed486846124f5565b9050600033878787604051602001610eef94939291906137b8565b60408051601f198184030181529082905260035463040a7bb160e41b83529092506001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6758116926340a7bb1092610f7f927f000000000000000000000000000000000000000000000000000000000000000c92610100909204169086906000908990600401613941565b604080518083038186803b158015610f9657600080fd5b505afa158015610faa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fce919061363f565b50979650505050505050565b606060005b60208160ff161080156110215750828160ff166020811061101057634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b15611038578061103081613bb2565b915050610fdf565b60008160ff166001600160401b0381111561106357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561108d576020820181803683370190505b509050600091505b60208260ff161080156110d75750838260ff16602081106110c657634e487b7160e01b600052603260045260246000fd5b1a60f81b6001600160f81b03191615155b15610c4357838260ff16602081106110ff57634e487b7160e01b600052603260045260246000fd5b1a60f81b818360ff168151811061112657634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053508161114781613bb2565b925050611095565b60035460ff16156111725760405162461bcd60e51b815260040161083a90613802565b336000818152600b60205260409020541561119f5760405162461bcd60e51b815260040161083a906138d9565b336000908152600d602052604090205461120c5760405162461bcd60e51b815260206004820152602860248201527f5374616b696e675265776172647350726f78793a204e6f7468696e6720746f20604482015267776974686472617760c01b606482015260840161083a565b336000908152600b6020908152604080832067776974686472617760c01b9055600c8252909120845161124192860190612db3565b5060405160009033907f7ffb073c78e535aa33c7eb547f62fbd9bf789f61ca86c766a9da2e04b9504a3a908390a2610b7767776974686472617760c01b828686611acc565b600c602052600090815260409020805461129f90613b77565b80601f01602080910402602001604051908101604052809291908181526020018280546112cb90613b77565b80156113185780601f106112ed57610100808354040283529160200191611318565b820191906000526020600020905b8154815290600101906020018083116112fb57829003601f168201915b505050505081565b6000546001600160a01b0316331461134a5760405162461bcd60e51b815260040161083a906138a4565b6003805460ff19166001179055604051600090339047908381818185875af1925050503d8060008114611399576040519150601f19603f3d011682016040523d82523d6000602084013e61139e565b606091505b50509050806114245760405162461bcd60e51b815260206004820152604660248201527f5374616b696e675265776172647350726f78793a20756e61626c6520746f207360448201527f656e642076616c75652c20726563697069656e74206d617920686176652072656064820152651d995c9d195960d21b608482015260a40161083a565b50565b6000546001600160a01b031633146114515760405162461bcd60e51b815260040161083a906138a4565b6040516332fb62e760e21b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063cbed8b9c906114a59088908890889088908890600401613a97565b600060405180830381600087803b1580156114bf57600080fd5b505af11580156114d3573d6000803e3d6000fd5b505050505050505050565b61ffff851660009081526002602052604080822090516114ff908790613701565b90815260408051602092819003830190206001600160401b038716600090815292529020549050806115735760405162461bcd60e51b815260206004820152601d60248201527f4c7a52656365697665723a206e6f2073746f726564206d657373616765000000604482015260640161083a565b8083836040516115849291906136f1565b6040518091039020146115d95760405162461bcd60e51b815260206004820152601b60248201527f4c7a52656365697665723a20696e76616c6964207061796c6f61640000000000604482015260640161083a565b61ffff861660009081526002602052604080822090516115fa908890613701565b9081526040805191829003602090810183206001600160401b038916600090815291522091909155633356ae4560e11b815230906366ad5c8a9061164a9089908990899089908990600401613a1a565b600060405180830381600087803b15801561166457600080fd5b505af1158015611678573d6000803e3d6000fd5b50505050505050505050565b60035460ff166001146116ed5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e675265776172647350726f78793a20636f6e747261637420697360448201526a081b9bdd081c185d5cd95960aa1b606482015260840161083a565b336000908152600d60205260409020546117195760405162461bcd60e51b815260040161083a90613847565b336000818152600d60205260408120805491905590611763907f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe6001600160a01b031690836125c3565b60405181815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a250565b6000546001600160a01b031633146117c55760405162461bcd60e51b815260040161083a906138a4565b61ffff831660009081526001602052604090206117e3908383612e37565b507ffa41487ad5d6728f0b19276fa1eddc16558578f5109fc39d2dc33c3230470dab83838360405161181793929190613995565b60405180910390a1505050565b6000610eba610eb5846125f3565b6000546001600160a01b0316331461185c5760405162461bcd60e51b815260040161083a906138a4565b6001600160a01b0381166118c15760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161083a565b6114248161232e565b6040516304b2b47b60e11b81523060048201526060907f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6756001600160a01b03169063f5ecbdbc90829063096568f69060240160206040518083038186803b15801561193457600080fd5b505afa158015611948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196c91906132dd565b6040516001600160e01b031960e084901b16815261ffff918216600482015290871660248201523060448201526064810185905260840160006040518083038186803b1580156119bb57600080fd5b505afa1580156119cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526119f7919081019061324d565b95945050505050565b604051633356ae4560e11b815230906366ad5c8a90611a29908790879087908790600401613a59565b600060405180830381600087803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b5050505050505050565b6040516001600160a01b0380851660248301528316604482015260648101829052610b779085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b60003411611b285760405162461bcd60e51b815260206004820152602360248201527f5374616b696e675265776172647350726f78793a206d73672e76616c7565206960448201526207320360ec1b606482015260840161083a565b647374616b6560d81b841415611b695760006040518060400160405280611b4e87610fda565b81526020018590529050611b63338285611824565b50611b90565b60006040518060200160405280611b7f87610fda565b90529050611b8e338285610ea7565b505b600033858585604051602001611ba994939291906137b8565b60405160208183030381529060405290506000611bc686846124f5565b60035460405163040a7bb160e41b81529192506000916001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd6758116926340a7bb1092611c49927f000000000000000000000000000000000000000000000000000000000000000c9261010090041690889087908990600401613941565b604080518083038186803b158015611c6057600080fd5b505afa158015611c74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c98919061363f565b50905080341015611cff5760405162461bcd60e51b815260206004820152602b60248201527f5374616b696e675265776172647350726f78793a206d73672e76616c7565203c60448201526a206d65737361676546656560a81b606482015260840161083a565b610cf27f000000000000000000000000000000000000000000000000000000000000000c843360008661273b565b60035460ff1615611d505760405162461bcd60e51b815260040161083a90613802565b6001600160401b0382166000908152600a602052604090205460ff1615611db95760405162461bcd60e51b815260206004820181905260248201527f54686973206e6f6e63652077617320616c72656164792070726f636573736564604482015260640161083a565b60008060008084806020019051810190611dd39190613001565b935093509350935060006040518060200160405280611e16600b6000896001600160a01b03166001600160a01b0316815260200190815260200160002054610fda565b90529050611e25858284610ea7565b6001600160a01b0385166000908152600b6020526040902054611ec15760405162461bcd60e51b815260206004820152604860248201527f5374616b696e675265776172647350726f78793a204e6f20636c61696d206f7260448201527f207769746864726177616c20697320696e20717565756520666f722074686973606482015267206164647265737360c01b608482015260a40161083a565b8180519060200120600c6000876001600160a01b03166001600160a01b03168152602001908152602001600020604051611efb919061371d565b604051809103902014611f5f5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e675265776172647350726f78793a20496e76616c6964207369676044820152656e617475726560d01b606482015260840161083a565b821561214f576001600160a01b0385166000908152600d6020526040902054611f9a5760405162461bcd60e51b815260040161083a90613847565b6040516370a0823160e01b815230600482015283907f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe6001600160a01b0316906370a082319060240160206040518083038186803b158015611ffb57600080fd5b505afa15801561200f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203391906135e3565b101561209f5760405162461bcd60e51b815260206004820152603560248201527f5374616b696e675265776172647350726f78793a20496e73756666696369656e604482015274742070726f787920746f6b656e2062616c616e636560581b606482015260840161083a565b6120d36001600160a01b037f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe1686856125c3565b6001600160a01b0385166000908152600d60205260409020546120f7908490613b34565b6001600160a01b0386166000818152600d6020526040908190209290925590517f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5906121469086815260200190565b60405180910390a25b83156122e257600480546040516370a0823160e01b81526001600160a01b039182169281019290925285917f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe909116906370a082319060240160206040518083038186803b1580156121c057600080fd5b505afa1580156121d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f891906135e3565b10156122635760405162461bcd60e51b815260206004820152603460248201527f5374616b696e675265776172647350726f78793a20496e73756666696369656e604482015273742066756e6420746f6b656e2062616c616e636560601b606482015260840161083a565b60045461229e906001600160a01b037f00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe811691168787611a61565b846001600160a01b03167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a856040516122d991815260200190565b60405180910390a25b6001600160401b0387166000908152600a60209081526040808320805460ff191660011790556001600160a01b0388168352600b8252808320839055600c90915281206114d391612eab565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60007fa62e0f1e03cb648dfe1f2ea051ebd4d005f071b5a0beb984e6e4d11a4f8b474d82600001516040516020016123b69190613701565b604051602081830303815290604052805190602001206040516020016123e6929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b60006124516124106128d5565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b92915050565b60008061246484846129bc565b9092509050600081600481111561248b57634e487b7160e01b600052602160045260246000fd5b1480156124a95750846001600160a01b0316826001600160a01b0316145b6109655760405162461bcd60e51b815260206004820152601760248201527f5369676e3a20496e76616c6964207369676e6174757265000000000000000000604482015260640161083a565b6060647374616b6560d81b83141561255157600160006125158582612a2c565b6040516001600160f01b031960f085901b1660208201526022810182905290915060420160405160208183030381529060405292505050612451565b6002600061255f8582612a2c565b60035460405160f085901b6001600160f01b0319166020820152602281018390526042810187905261010090910460601b6bffffffffffffffffffffffff191660628201529091506076016040516020818303038152906040529250505092915050565b6040516001600160a01b038316602482015260448101829052610a3490849063a9059cbb60e01b90606401611a95565b60007f48e37fd99b6b399ac9180ab7cc01fa1aa4ffd4abb7be90f0b7f46aefd171b8bf826000015160405160200161262b9190613701565b6040516020818303038152906040528051906020012083602001516040516020016123e6939291909283526020830191909152604082015260600190565b60006126be826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b1f9092919063ffffffff16565b805190915015610a3457808060200190518101906126dc91906131c0565b610a345760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b606482015260840161083a565b61ffff85166000908152600160205260408120805461275990613b77565b80601f016020809104026020016040519081016040528092919081815260200182805461278590613b77565b80156127d25780601f106127a7576101008083540402835291602001916127d2565b820191906000526020600020905b8154815290600101906020018083116127b557829003601f168201915b505050505090508051600014156128445760405162461bcd60e51b815260206004820152603060248201527f4c7a4170703a2064657374696e6174696f6e20636861696e206973206e6f742060448201526f61207472757374656420736f7572636560801b606482015260840161083a565b60405162c5803160e81b81526001600160a01b037f00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675169063c580310090349061289b908a9086908b908b908b908b906004016139b3565b6000604051808303818588803b1580156128b457600080fd5b505af11580156128c8573d6000803e3d6000fd5b5050505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000146141561292457507f287d9eb4118405e86339904661b3e72589b6266065851a471e74032806cc93e390565b50604080517fb03948446334eb9b2196d5eb166f69b9d49403eb4a12f36de8d3f9f3cb8e15c36020808301919091527fcbbde5ba68badb6f93f45fa215db333d7a50fb6f8f43d040014780090392f41e828401527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6606080840191909152835180840390910181526080909201909252805191012090565b6000808251604114156129f35760208301516040840151606085015160001a6129e787828585612b36565b94509450505050612a25565b825160401415612a1d5760208301516040840151612a12868383612c23565b935093505050612a25565b506000905060025b9250929050565b60008115612a6a5764636c61696d60d81b831415612a4d5750600654612ab4565b67776974686472617760c01b831415612a6557506005545b612ab4565b64636c61696d60d81b831415612a835750600954612ab4565b67776974686472617760c01b831415612a9f5750600854612ab4565b647374616b6560d81b831415612ab457506007545b600081116124515760405162461bcd60e51b815260206004820152603260248201527f5374616b696e675265776172647350726f78793a20756e61626c6520746f2072604482015271195d1c9a595d994819d85cc8185b5bdd5b9d60721b606482015260840161083a565b6060612b2e8484600085612c52565b949350505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115612b6d5750600090506003612c1a565b8460ff16601b14158015612b8557508460ff16601c14155b15612b965750600090506004612c1a565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612bea573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116612c1357600060019250925050612c1a565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b01612c4487828885612b36565b935093505050935093915050565b606082471015612cb35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b606482015260840161083a565b843b612d015760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161083a565b600080866001600160a01b03168587604051612d1d9190613701565b60006040518083038185875af1925050503d8060008114612d5a576040519150601f19603f3d011682016040523d82523d6000602084013e612d5f565b606091505b5091509150612d6f828286612d7a565b979650505050505050565b60608315612d89575081610c43565b825115612d995782518084602001fd5b8160405162461bcd60e51b815260040161083a91906137ef565b828054612dbf90613b77565b90600052602060002090601f016020900481019282612de15760008555612e27565b82601f10612dfa57805160ff1916838001178555612e27565b82800160010185558215612e27579182015b82811115612e27578251825591602001919060010190612e0c565b50612e33929150612ee1565b5090565b828054612e4390613b77565b90600052602060002090601f016020900481019282612e655760008555612e27565b82601f10612e7e5782800160ff19823516178555612e27565b82800160010185558215612e27579182015b82811115612e27578235825591602001919060010190612e90565b508054612eb790613b77565b6000825580601f10612ec7575050565b601f01602090049060005260206000209081019061142491905b5b80821115612e335760008155600101612ee2565b60008083601f840112612f07578182fd5b5081356001600160401b03811115612f1d578182fd5b602083019150836020828501011115612a2557600080fd5b600082601f830112612f45578081fd5b8135612f58612f5382613af5565b613ac5565b818152846020838601011115612f6c578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112612f96578081fd5b8151612fa4612f5382613af5565b818152846020838601011115612fb8578283fd5b612b2e826020830160208701613b4b565b80356001600160401b0381168114612fe057600080fd5b919050565b600060208284031215612ff6578081fd5b8135610c4381613bfe565b60008060008060808587031215613016578283fd5b845161302181613bfe565b80945050602085015192506040850151915060608501516001600160401b0381111561304b578182fd5b61305787828801612f86565b91505092959194509250565b600080600060608486031215613077578283fd5b833561308281613bfe565b925060208401356001600160401b038082111561309d578384fd5b90850190602082880312156130b0578384fd5b6040516020810181811083821117156130cb576130cb613be8565b6040528235828111156130dc578586fd5b6130e889828601612f35565b82525093506040860135915080821115613100578283fd5b5061310d86828701612f35565b9150509250925092565b60008060006060848603121561312b578283fd5b833561313681613bfe565b925060208401356001600160401b0380821115613151578384fd5b9085019060408288031215613164578384fd5b60405160408101818110838211171561317f5761317f613be8565b604052823582811115613190578586fd5b61319c89828601612f35565b82525060208301356020820152809450506040860135915080821115613100578283fd5b6000602082840312156131d1578081fd5b81518015158114610c43578182fd5b6000602082840312156131f1578081fd5b5035919050565b6000806000806080858703121561320d578384fd5b843593506020850135925060408501356001600160401b03811115613230578283fd5b61323c87828801612f35565b949793965093946060013593505050565b60006020828403121561325e578081fd5b81516001600160401b03811115613273578182fd5b612b2e84828501612f86565b60008060408385031215613291578182fd5b82356001600160401b038111156132a6578283fd5b6132b285828601612f35565b95602094909401359450505050565b6000602082840312156132d2578081fd5b8135610c4381613c13565b6000602082840312156132ee578081fd5b8151610c4381613c13565b60008060006040848603121561330d578081fd5b833561331881613c13565b925060208401356001600160401b03811115613332578182fd5b61333e86828701612ef6565b9497909650939450505050565b60008060008060008060808789031215613363578384fd5b863561336e81613c13565b955060208701356001600160401b0380821115613389578586fd5b6133958a838b01612ef6565b90975095508591506133a960408a01612fc9565b945060608901359150808211156133be578384fd5b506133cb89828a01612ef6565b979a9699509497509295939492505050565b6000806000606084860312156133f1578081fd5b83356133fc81613c13565b925060208401356001600160401b03811115613416578182fd5b61342286828701612f35565b925050604084013590509250925092565b60008060008060006080868803121561344a578283fd5b853561345581613c13565b945060208601356001600160401b0380821115613470578485fd5b61347c89838a01612f35565b955061348a60408901612fc9565b9450606088013591508082111561349f578283fd5b506134ac88828901612ef6565b969995985093965092949392505050565b600080600080608085870312156134d2578182fd5b84356134dd81613c13565b935060208501356001600160401b03808211156134f8578384fd5b61350488838901612f35565b945061351260408801612fc9565b93506060870135915080821115613527578283fd5b5061305787828801612f35565b60008060008060808587031215613549578182fd5b843561355481613c13565b9350602085013561356481613c13565b9250604085013561357481613bfe565b9396929550929360600135925050565b60008060008060006080868803121561359b578283fd5b85356135a681613c13565b945060208601356135b681613c13565b93506040860135925060608601356001600160401b038111156135d7578182fd5b6134ac88828901612ef6565b6000602082840312156135f4578081fd5b5051919050565b6000806040838503121561360d578182fd5b8235915060208301356001600160401b03811115613629578182fd5b61363585828601612f35565b9150509250929050565b60008060408385031215613651578182fd5b505080516020909101519092909150565b600080600080600060a08688031215613679578283fd5b505083359560208501359550604085013594606081013594506080013592509050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b600081518084526136dd816020860160208601613b4b565b601f01601f19169290920160200192915050565b8183823760009101908152919050565b60008251613713818460208701613b4b565b9190910192915050565b600080835482600182811c91508083168061373957607f831692505b602080841082141561375957634e487b7160e01b87526022600452602487fd5b81801561376d576001811461377e576137aa565b60ff198616895284890196506137aa565b60008a815260209020885b868110156137a25781548b820152908501908301613789565b505084890196505b509498975050505050505050565b60018060a01b03851681528360208201528260408201526080606082015260006137e560808301846136c5565b9695505050505050565b602081526000610c4360208301846136c5565b60208082526025908201527f52616461725374616b696e6750726f78793a20436f6e74726163742069732070604082015264185d5cd95960da1b606082015260800190565b60208082526039908201527f5374616b696e675265776172647350726f78793a20496e76616c69642077697460408201527f6864726177616c2c206e6f206465706f7369747320646f6e6500000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526042908201527f52616461725374616b696e6750726f78793a20496e20717565756520616c726560408201527f6164792120576169742074696c6c207468652063616c6c6261636b20636f6d65606082015261399760f11b608082015260a00190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061396f908301866136c5565b8415156060840152828103608084015261398981856136c5565b98975050505050505050565b61ffff841681526040602082015260006119f760408301848661369c565b61ffff8716815260c0602082015260006139d060c08301886136c5565b82810360408401526139e281886136c5565b6001600160a01b0387811660608601528616608085015283810360a08501529050613a0d81856136c5565b9998505050505050505050565b61ffff86168152608060208201526000613a3760808301876136c5565b6001600160401b0386166040840152828103606084015261398981858761369c565b61ffff85168152608060208201526000613a7660808301866136c5565b6001600160401b03851660408401528281036060840152612d6f81856136c5565b600061ffff808816835280871660208401525084604083015260806060830152612d6f60808301848661369c565b604051601f8201601f191681016001600160401b0381118282101715613aed57613aed613be8565b604052919050565b60006001600160401b03821115613b0e57613b0e613be8565b50601f01601f191660200190565b60008219821115613b2f57613b2f613bd2565b500190565b600082821015613b4657613b46613bd2565b500390565b60005b83811015613b66578181015183820152602001613b4e565b83811115610b775750506000910152565b600181811c90821680613b8b57607f821691505b60208210811415613bac57634e487b7160e01b600052602260045260246000fd5b50919050565b600060ff821660ff811415613bc957613bc9613bd2565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461142457600080fd5b61ffff8116811461142457600080fdfea26469706673582212206aebc68b56fb5a1e7c6c1e6a1e3170a2db4efba8915a6671a720187bce5b02a964736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d0000000000000000000000006b36b0c9f2ff94b379b27bc244b350ac352114d800000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe
-----Decoded View---------------
Arg [0] : _owner (address): 0xB78b464A624040FB515BA6cCC33afF46Fd9f059d
Arg [1] : _endpoint (address): 0x66A71Dcef29A0fFBDBE3c6a460a3B5BC225Cd675
Arg [2] : _fund (address): 0xB78b464A624040FB515BA6cCC33afF46Fd9f059d
Arg [3] : _controller (address): 0x6B36b0C9F2FF94B379B27Bc244b350AC352114D8
Arg [4] : _stakingToken (address): 0x44709a920fCcF795fbC57BAA433cc3dd53C44DbE
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d
Arg [1] : 00000000000000000000000066a71dcef29a0ffbdbe3c6a460a3b5bc225cd675
Arg [2] : 000000000000000000000000b78b464a624040fb515ba6ccc33aff46fd9f059d
Arg [3] : 0000000000000000000000006b36b0c9f2ff94b379b27bc244b350ac352114d8
Arg [4] : 00000000000000000000000044709a920fccf795fbc57baa433cc3dd53c44dbe
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.005085 | 2,424,210.177 | $12,326.02 |
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.