Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NGOLis
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.9; import "./interfaces/ILido.sol"; import "./interfaces/IWithdrawalQueue.sol"; import "@openzeppelin/contracts/token/ERC721/utils/ERC721Holder.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/math/Math.sol"; import "hardhat/console.sol"; /** * @title NGOLis * @dev The NGOLis contract manages staking and withdrawal functionalities for a Non-Governmental Organization (NGO). It interacts with the Lido Finance protocol for staking and withdrawal queue for managing withdrawals. */ contract NGOLis is ERC721Holder, ReentrancyGuard { using Math for uint256; /** * @dev Struct representing stake information for a user. */ struct StakeInfo { uint16 percent; uint duration; uint amount; uint startDate; } /** * @dev Emitted when a user stakes funds in the NGO. * @param _staker The address of the user staking funds. * @param _amountStaked The amount of funds staked. * @param _percentShare The percentage share of the NGO. * @param _duration The staking duration in timestamp. * @param _ngo The address of the NGO contract. * @param _startDate The timestamp when the staking started. * @param _timestamp The block timestamp of the staking started. * @param _blockNumber The block number of the staking started. */ event Staked( address _staker, uint256 _amountStaked, uint16 _percentShare, uint256 _duration, address _ngo, uint _startDate, uint _timestamp, uint _blockNumber ); /** * @dev Emitted when the rewards for the NGO are updated. * @param _rewardsPool The total rewards in the pool. * @param stakedBalance The total staked balance in the NGO. * @param totalShare The total share of the NGO. * @param _dateRecountRewards The timestamp when the rewards were last updated. * @param _timestamp The block timestamp when rewards was updated. * @param _blockNumber The block number when rewards was updated. */ event RewardsUpdated( uint _rewardsPool, uint stakedBalance, uint totalShare, uint _dateRecountRewards, uint _timestamp, uint _blockNumber ); /** * @dev Emitted when a user requests a withdrawal. * @param _staker The address of the user requesting withdrawal. * @param _ngo The address of the NGO contract. * @param _requestId The ID of the withdrawal request. * @param _timestamp The block timestamp when withdraw was requested. * @param _blockNumber The block number when withdraw was requested. */ event WithdrawRequested( address _staker, address _ngo, uint _requestId, uint _timestamp, uint _blockNumber ); /** * @dev Emitted when a user claims a withdrawal. * @param _claimer The address of the user claiming withdrawal. * @param _ngo The address of the NGO contract. * @param _amount The amount of ETH claimed. * @param _requestId The ID of the withdrawal request. * @param _timestamp The block timestamp when withdraw was claimed. * @param _blockNumber The block number when withdraw was claimed. */ event WithdrawClaimed( address _claimer, address _ngo, uint _amount, uint _requestId, uint _timestamp, uint _blockNumber ); /** * @dev Emitted when the NGO is finished. * @param _ngo The address of the NGO contract. * @param _timestamp The timestamp when the NGO was finished. * @param _blockNumber The block number when the NGO was finished. */ event NGOFinished(address _ngo, uint256 _timestamp, uint _blockNumber); /** * @dev Error indicating an invalid percentage value. */ error InvalidPercent(); /** * @dev Error indicating that the sender is not the owner of the NGO. */ error NotNgoOwner(); /** * @dev Error indicating that the required time has not passed. * @param _currentTime The current block timestamp. * @param _needTime The staking duration. * @param _startDate The start staking date. */ error TimeNotPassed(uint _currentTime, uint _needTime, uint _startDate); /** * @dev Error indicating that the user has not staked funds. */ error NotStaked(); /** * @dev Error indicating that the user has not owned this request. */ error InvalidRequestIdForUser(address _claimer, uint256 _requestId); /** * @dev Error indicating insufficient staked funds for a withdrawal. */ error InsufficientStakedFunds(); /** * @dev Error indicating that only the owner or oracle can perform the operation. */ error OnlyOwnerOrOracle(address _sender, address _owner); /** * @dev Error indicating that the NGO has already finished. */ error NgoFinished(); /** * @dev Error indicating a short staking duration. */ error ShortStakingDuration(uint _minStakingDuration); /** * @dev Error indicating an issue with the withdrawal process. */ error WithdrawError(); /** * @dev Modifier to restrict access to only the owner or oracle. */ modifier onlyOwnerOrOracle() { if (msg.sender != rewardsOwner && !_oracles[msg.sender]) { revert OnlyOwnerOrOracle(msg.sender, rewardsOwner); } _; } /** * @dev Modifier to check if the NGO has finished. */ modifier notFinished() { if (isFinish) { revert NgoFinished(); } _; } /** * @dev Constant representing the minimum share percentage. */ uint16 constant MIN_SHARE_PERCENT = 100; /** * @dev Constant representing the maximum share percentage. */ uint16 constant MAX_SHARE_PERCENT = 10000; /** * @dev Constant representing the percentage divider. */ uint constant PERCENT_DIVIDER = 10000; /** * @dev Constant representing the minimum staking duration. */ uint public minStakingDuration; /** * @dev Constant representing the LIS fee percentage. */ uint constant LIS_FEE = 500; /** * @dev Storage variable for the total staked balance. */ uint public stakedBalance; /** * @dev Storage variable for the total share of funds today. */ uint public totalShareToday; /** * @dev Storage variable for the timestamp when rewards were last counted. */ uint public lastCountRewardsTimestamp; /** * @dev Total shares for all staked users. */ uint public totalShares; /** * @dev Storage variable for rewards to be distributed to the NGO. */ uint public _rewardsToNgo; /** * @dev Storage variable for the address of the LIS token contract. */ address private _lis; /** * @dev Storage variable for the Lido Smart Contract interface. */ ILido public lidoSC; /** * @dev Storage variable for the Withdrawal Queue Smart Contract interface. */ IWithdrawalQueue public withdrawalSC; /** * @dev Storage variable for the address of the rewards owner. */ address public rewardsOwner; /** * @dev Storage variable indicating whether the NGO has finished. */ bool public isFinish; /** * @dev Storage variable indicating whether the contract has been initialized. */ bool public isInitialized; /** * @dev Mapping to store stake information for each user. */ mapping(address => StakeInfo) private _userToStakeInfo; /** * @dev Mapping to store stake information for each user. */ mapping(address => bool) public _oracles; /** * @dev Mapping to store historical rewards data. */ mapping(uint => uint) private _historyRewards; /** * @dev Mapping to store historical total share data. */ mapping(uint => uint) private _historyStakedBalance; /** * @dev Mapping to store historical balance data. */ mapping(uint => uint) private _historyBalance; /** * @dev Mapping to store lido request id for users. */ mapping(uint => address) private _requestIdToUser; /** * @dev Mapping to shares for specific user. */ mapping(address => uint) shares; constructor() ERC721Holder() {} /** * @dev Initializes the NGO contract with required parameters. * @param lidoSCAddress The address of the Lido Smart Contract. * @param _rewardOwnerAddress The address of the rewards owner. * @param withdrawalSCAddress The address of the Withdrawal Queue Smart Contract. */ function initialize( address lidoSCAddress, address _rewardOwnerAddress, address withdrawalSCAddress ) public { require(!isInitialized); isInitialized = true; _lis = msg.sender; lidoSC = ILido(lidoSCAddress); withdrawalSC = IWithdrawalQueue(withdrawalSCAddress); rewardsOwner = _rewardOwnerAddress; lastCountRewardsTimestamp = getRoundDate(block.timestamp); } uint256 totalAssets; function convertAssetsToShares( uint256 assets ) public view returns (uint256) { if (totalShares == 0) { return assets; } return (assets * totalShares) / totalAssets; } /** * @dev Stakes funds in the NGO. * @notice Emit [Staked()](#staked) event * @param _ngoPercent The percentage share of the NGO. * @param _duration The duraation when the staking expires. */ function stake( uint16 _ngoPercent, uint256 _duration ) public payable notFinished { require( _userToStakeInfo[msg.sender].amount == 0, "you cant stake one more time" ); if ( _ngoPercent < MIN_SHARE_PERCENT || _ngoPercent > MAX_SHARE_PERCENT ) { revert InvalidPercent(); } if (_duration < minStakingDuration) { revert ShortStakingDuration(minStakingDuration); } totalAssets = getCurrentBalanceFromLido(); lidoSC.submit{value: msg.value}(address(this)); uint256 balanceAfterStaked = getCurrentBalanceFromLido(); uint256 assets = balanceAfterStaked - totalAssets; _userToStakeInfo[msg.sender] = StakeInfo({ percent: _ngoPercent, duration: _duration, amount: _userToStakeInfo[msg.sender].amount + assets, startDate: lastCountRewardsTimestamp }); uint256 share = convertAssetsToShares(assets); if (totalShares == 0) { totalShares += 1000; shares[address(0)] += 1000; share -= 1000; } shares[msg.sender] = share; totalShares += share; stakedBalance += assets; totalShareToday += (assets * (_ngoPercent)) / PERCENT_DIVIDER; emit Staked( msg.sender, assets, _ngoPercent, _duration, address(this), lastCountRewardsTimestamp, block.timestamp, block.number ); } /** * @dev Stakes stETH in the NGO. * @notice Emit [Staked()](#staked) event * @param amount The amount of stETH to transfer * @param _ngoPercent The percentage share of the NGO. * @param _duration The duraation when the staking expires. */ function stakeStEth( uint256 amount, uint16 _ngoPercent, uint _duration ) public notFinished { if ( _ngoPercent < MIN_SHARE_PERCENT || _ngoPercent > MAX_SHARE_PERCENT ) { revert InvalidPercent(); } if (_duration < minStakingDuration) { revert ShortStakingDuration(minStakingDuration); } totalAssets = getCurrentBalanceFromLido(); lidoSC.transferFrom(msg.sender, address(this), amount); uint256 balanceAfterStaked = getCurrentBalanceFromLido(); uint256 assets = balanceAfterStaked - totalAssets; _userToStakeInfo[msg.sender] = StakeInfo({ percent: _ngoPercent, duration: _duration, amount: _userToStakeInfo[msg.sender].amount + amount, startDate: lastCountRewardsTimestamp }); uint256 share = convertAssetsToShares(assets); if (totalShares == 0) { totalShares += 1000; shares[address(0)] += 1000; share -= 1000; } shares[msg.sender] = share; totalShares += share; stakedBalance += assets; totalShareToday += (amount * (_ngoPercent)) / PERCENT_DIVIDER; emit Staked( msg.sender, amount, _ngoPercent, _duration, address(this), lastCountRewardsTimestamp, block.timestamp, block.number ); } /** * @dev Handles the distribution of NGO share based on staking. * @notice Emit [RewardsUpdated()](#rewardsupdated) event */ function handleNGOShareDistribution() public onlyOwnerOrOracle { if (block.timestamp <= lastCountRewardsTimestamp) revert TimeNotPassed(block.timestamp, lastCountRewardsTimestamp, 0); uint currentBalance = getCurrentBalanceFromLido(); uint256 _rewards = currentBalance - stakedBalance; uint256 ngoShareForToday = (totalShareToday * PERCENT_DIVIDER) / stakedBalance; uint256 ngoRewardsForToday = (_rewards * ngoShareForToday) / PERCENT_DIVIDER; uint256 _lisFee = (ngoRewardsForToday * LIS_FEE) / PERCENT_DIVIDER; lidoSC.transfer(_lis, _lisFee); lidoSC.transfer(rewardsOwner, ngoRewardsForToday - _lisFee); _historyRewards[lastCountRewardsTimestamp] = _rewards; _historyStakedBalance[lastCountRewardsTimestamp] = stakedBalance; _historyBalance[lastCountRewardsTimestamp] = currentBalance; emit RewardsUpdated( _rewards, stakedBalance, totalShareToday, lastCountRewardsTimestamp, block.timestamp, block.number ); lastCountRewardsTimestamp += 1 days; totalShareToday = 0; } /** * @dev Requests withdrawal of funds from the NGO. * @param _amount The amount of funds to be withdrawn. * @notice Emit [WithdrawRequested()](#withdrawrequested) event */ function requestWithdrawals(uint256 _amount) public { StakeInfo storage stakeInfo = _userToStakeInfo[msg.sender]; uint currentBalance = getCurrentBalanceFromLido(); uint256 userBalance = getUserBalance(msg.sender); if (stakeInfo.amount == 0) { revert NotStaked(); } if (userBalance < _amount) { revert InsufficientStakedFunds(); } uint rewards = userBalance - stakeInfo.amount; uint256 amountInShares = _amount.mulDiv( totalShares + 1, currentBalance ); if (_amount == userBalance) { shares[msg.sender] = 0; } else { shares[msg.sender] -= amountInShares; } if (_amount > rewards) { stakeInfo.amount -= (_amount - rewards); stakedBalance -= (_amount - rewards); } uint256[] memory _amounts = new uint256[](1); _amounts[0] = _amount; lidoSC.approve(address(withdrawalSC), _amount); uint256[] memory _requestsIds = withdrawalSC.requestWithdrawals( _amounts, address(this) ); totalShares -= amountInShares; _requestIdToUser[_requestsIds[0]] = msg.sender; emit WithdrawRequested( msg.sender, address(this), _requestsIds[0], block.timestamp, block.number ); } /** * @dev Claims the withdrawal of funds from the NGO. * @param _requestId The ID of the withdrawal request. * @notice Emit [WithdrawClaimed()](#withdrawclaimed) event */ function claimWithdrawal(uint256 _requestId) public nonReentrant { if (_requestIdToUser[_requestId] != msg.sender) { revert InvalidRequestIdForUser(msg.sender, _requestId); } uint256[] memory _requestsIds = new uint256[](1); _requestsIds[0] = _requestId; IWithdrawalQueue.WithdrawalRequestStatus memory status = withdrawalSC .getWithdrawalStatus(_requestsIds)[0]; require(status.isFinalized, "The request is not available for claim"); withdrawalSC.claimWithdrawal(_requestId); payable(msg.sender).transfer(status.amountOfStETH); emit WithdrawClaimed( msg.sender, address(this), status.amountOfStETH, _requestId, block.timestamp, block.number ); } /** * @dev Ends the NGO and marks it as finished. * @notice Emit [NGOFinished()](#ngofinished) event */ function endNGO() public notFinished onlyOwnerOrOracle { isFinish = true; emit NGOFinished(address(this), block.timestamp, block.number); } /** * @dev Gets the user's share of funds in the NGO. * @param _user The address of the user. * @return userTotal The user's share rewards. */ function getUserBalance( address _user ) public view returns (uint256 userTotal) { StakeInfo memory stakedInfo = _userToStakeInfo[_user]; uint currentBalance = getCurrentBalanceFromLido(); if (shares[_user] == 0) { return stakedInfo.amount; } if (currentBalance == 0) { return 0; } uint256 userTotalShareWithNgoReward = shares[_user].mulDiv( currentBalance, totalShares ); if (userTotalShareWithNgoReward < stakedInfo.amount) { return stakedInfo.amount; } uint rewardToNgo = ((((shares[_user] * currentBalance) / totalShares) - stakedInfo.amount) * stakedInfo.percent) / 100000; userTotal = userTotalShareWithNgoReward - rewardToNgo; return (userTotal); } /** * @dev Retrieves the rounded date for a given timestamp. * @param _timestamp The timestamp for which the rounded date is needed. * @return Rounded timestamp representing the start of the day. */ function getRoundDate(uint _timestamp) public pure returns (uint) { return (_timestamp / 1 days) * 1 days; } /** * @dev Retrieves stake information for a specific user. * @param _user The address of the user for whom stake information is requested. * @return _userStakeInfo The stake information for the specified user. * @notice This function allows querying stake information for a specific user. */ function getUserStakeInfo( address _user ) public view returns (StakeInfo memory _userStakeInfo) { return _userToStakeInfo[_user]; } /** * @dev Retrieves historical data for a specific timestamp. * @param _timestamp The timestamp for which historical data is requested. * @return _reward The historical rewards at the specified timestamp. * @return _totalShares The historical total shares at the specified timestamp. * @return _balance The historical balance at the specified timestamp. * @notice This function allows querying historical data, including rewards, total shares, and balance, * for a specific timestamp. The timestamp is rounded to the start of the day for accurate retrieval. */ function getHistoryData( uint256 _timestamp ) public view returns (uint _reward, uint _totalShares, uint _balance) { uint _roundedTimestamp = getRoundDate(_timestamp); return ( _historyRewards[_roundedTimestamp], _historyStakedBalance[_roundedTimestamp], _historyBalance[_roundedTimestamp] ); } function setMinStakingDuration( uint _newStakingDuration ) public onlyOwnerOrOracle { minStakingDuration = _newStakingDuration; } function setOracle(address _newOracle, bool _state) public { require(msg.sender == rewardsOwner, "Not owner"); _oracles[_newOracle] = _state; } /** * @dev Retrieves the current balance of the contract from the Lido contract. * @return Current balance of the contract in stETH. */ function getCurrentBalanceFromLido() public view returns (uint256) { return lidoSC.balanceOf(address(this)); } receive() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/utils/ERC721Holder.sol) pragma solidity ^0.8.0; import "../IERC721Receiver.sol"; /** * @dev Implementation of the {IERC721Receiver} interface. * * Accepts all token transfers. * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}. */ contract ERC721Holder is IERC721Receiver { /** * @dev See {IERC721Receiver-onERC721Received}. * * Always returns `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received(address, address, uint256, bytes memory) public virtual override returns (bytes4) { return this.onERC721Received.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; interface ILido { function submit(address _referral) external payable returns (uint256); function balanceOf(address _tokenHolder) external view returns (uint256); function transfer( address _recipient, uint256 _amount ) external returns (bool); function approve(address _spender, uint256 _amount) external returns (bool); function transferFrom( address _sender, address _recipient, uint256 _amount ) external returns (bool); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; import "@openzeppelin/contracts/access/IAccessControl.sol"; interface IWithdrawalQueue is IAccessControl { struct WithdrawalRequestStatus { uint256 amountOfStETH; uint256 amountOfShares; address owner; uint256 timestamp; bool isFinalized; bool isClaimed; } function requestWithdrawals( uint256[] calldata _amounts, address _owner ) external returns (uint256[] calldata requestIds); function getWithdrawalStatus( uint256[] memory _requestIds ) external view returns (WithdrawalRequestStatus[] calldata statuses); function claimWithdrawal(uint256 _requestId) external; function balanceOf(address _owner) external view returns (uint256 balance); function getLastRequestId() external view returns (uint256); function onOracleReport( bool _isBunkerModeNow, uint256 _bunkerStartTimestamp, uint256 _currentReportTimestamp ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _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 pure { _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 pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InsufficientStakedFunds","type":"error"},{"inputs":[],"name":"InvalidPercent","type":"error"},{"inputs":[{"internalType":"address","name":"_claimer","type":"address"},{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"InvalidRequestIdForUser","type":"error"},{"inputs":[],"name":"NgoFinished","type":"error"},{"inputs":[],"name":"NotNgoOwner","type":"error"},{"inputs":[],"name":"NotStaked","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_owner","type":"address"}],"name":"OnlyOwnerOrOracle","type":"error"},{"inputs":[{"internalType":"uint256","name":"_minStakingDuration","type":"uint256"}],"name":"ShortStakingDuration","type":"error"},{"inputs":[{"internalType":"uint256","name":"_currentTime","type":"uint256"},{"internalType":"uint256","name":"_needTime","type":"uint256"},{"internalType":"uint256","name":"_startDate","type":"uint256"}],"name":"TimeNotPassed","type":"error"},{"inputs":[],"name":"WithdrawError","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_ngo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"NGOFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_rewardsPool","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakedBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_dateRecountRewards","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"RewardsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amountStaked","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"_percentShare","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"address","name":"_ngo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_startDate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_claimer","type":"address"},{"indexed":false,"internalType":"address","name":"_ngo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"WithdrawClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_staker","type":"address"},{"indexed":false,"internalType":"address","name":"_ngo","type":"address"},{"indexed":false,"internalType":"uint256","name":"_requestId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"WithdrawRequested","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_oracles","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_rewardsToNgo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_requestId","type":"uint256"}],"name":"claimWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"convertAssetsToShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endNGO","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentBalanceFromLido","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getHistoryData","outputs":[{"internalType":"uint256","name":"_reward","type":"uint256"},{"internalType":"uint256","name":"_totalShares","type":"uint256"},{"internalType":"uint256","name":"_balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getRoundDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserBalance","outputs":[{"internalType":"uint256","name":"userTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserStakeInfo","outputs":[{"components":[{"internalType":"uint16","name":"percent","type":"uint16"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"startDate","type":"uint256"}],"internalType":"struct NGOLis.StakeInfo","name":"_userStakeInfo","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"handleNGOShareDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lidoSCAddress","type":"address"},{"internalType":"address","name":"_rewardOwnerAddress","type":"address"},{"internalType":"address","name":"withdrawalSCAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isFinish","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastCountRewardsTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lidoSC","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minStakingDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"requestWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStakingDuration","type":"uint256"}],"name":"setMinStakingDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOracle","type":"address"},{"internalType":"bool","name":"_state","type":"bool"}],"name":"setOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_ngoPercent","type":"uint16"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint16","name":"_ngoPercent","type":"uint16"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"stakeStEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShareToday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalSC","outputs":[{"internalType":"contract IWithdrawalQueue","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b5060016000556128f3806100256000396000f3fe6080604052600436106101bb5760003560e01c8063863ed73d116100ec578063c32d3ae21161008a578063d89f20d311610064578063d89f20d314610599578063ee5a3263146105af578063f6182607146105cf578063f84444361461060a57600080fd5b8063c32d3ae2146104ff578063d21294cc14610556578063d6ae3cfa1461058357600080fd5b806397a32a3c116100c657806397a32a3c14610462578063be41a01b14610482578063beef80a6146104b2578063c0c53b8b146104df57600080fd5b8063863ed73d1461040f5780638a2ff9a2146104225780638acf03431461044257600080fd5b80632c8ca0ea11610159578063477348921161013357806347734892146103a3578063548adead146103c35780635b9f0016146103d957806365360843146103ef57600080fd5b80632c8ca0ea14610318578063392e53cd1461035a5780633a98ef391461038d57600080fd5b8063150b7a0211610195578063150b7a021461021c5780631fa568571461029157806320b3b117146102a65780632963a287146102f857600080fd5b806308514ac9146101c757806308ae7e54146101ef5780630ef43a581461020557600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101dc61062a565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b506101dc60015481565b34801561021157600080fd5b5061021a6106d1565b005b34801561022857600080fd5b506102606102373660046122fc565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101e6565b34801561029d57600080fd5b5061021a610a65565b3480156102b257600080fd5b506009546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e6565b34801561030457600080fd5b5061021a6103133660046123de565b610bcb565b34801561032457600080fd5b50600a5461034a9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101e6565b34801561036657600080fd5b50600a5461034a907501000000000000000000000000000000000000000000900460ff1681565b34801561039957600080fd5b506101dc60055481565b3480156103af57600080fd5b506101dc6103be3660046123f7565b610fff565b3480156103cf57600080fd5b506101dc60065481565b3480156103e557600080fd5b506101dc60025481565b3480156103fb57600080fd5b5061021a61040a366004612422565b611199565b61021a61041d366004612472565b611270565b34801561042e57600080fd5b5061021a61043d3660046123de565b6116d1565b34801561044e57600080fd5b506101dc61045d3660046123de565b611767565b34801561046e57600080fd5b506101dc61047d3660046123de565b611798565b34801561048e57600080fd5b5061034a61049d3660046123f7565b600c6020526000908152604090205460ff1681565b3480156104be57600080fd5b50600a546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104eb57600080fd5b5061021a6104fa36600461249c565b6117b4565b34801561050b57600080fd5b5061051f61051a3660046123f7565b611894565b6040516101e69190815161ffff16815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561056257600080fd5b506008546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561058f57600080fd5b506101dc60045481565b3480156105a557600080fd5b506101dc60035481565b3480156105bb57600080fd5b5061021a6105ca3660046124e7565b611922565b3480156105db57600080fd5b506105ef6105ea3660046123de565b611d15565b604080519384526020840192909252908201526060016101e6565b34801561061657600080fd5b5061021a6106253660046123de565b611d54565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561069457600080fd5b505afa1580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc919061251c565b905090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633148015906107095750336000908152600c602052604090205460ff16155b1561076757600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b60045442116107b657600480546040517fba6f21b2000000000000000000000000000000000000000000000000000000008152429281019290925260248201526000604482015260640161075e565b60006107c061062a565b90506000600254826107d29190612564565b905060006002546127106003546107e9919061257b565b6107f391906125e7565b90506000612710610804838561257b565b61080e91906125e7565b905060006127106108216101f48461257b565b61082b91906125e7565b6008546007546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b1580156108a357600080fd5b505af11580156108b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108db9190612622565b50600854600a5473ffffffffffffffffffffffffffffffffffffffff9182169163a9059cbb911661090c8486612564565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190612622565b50600480546000908152600d602090815260408083208890556002805485548552600e84528285205584548452600f835292819020899055915460035493548351898152928301919091529181019290925260608201524260808201524360a08201527f8baf509f1122a0f4a996885e2e55905a590bf1c210ed4a5c6d60f7b936cbdc899060c00160405180910390a16201518060046000828254610a54919061263f565b909155505060006003555050505050565b600a5474010000000000000000000000000000000000000000900460ff1615610aba576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff163314801590610af25750336000908152600c602052604090205460ff16155b15610b4b57600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161075e565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560408051308152426020820152438183015290517fa67f03226c045d22d8a1c52cf1185252d7021a8ac9a117cba40a9f131ed99b94916060908290030190a1565b336000908152600b6020526040812090610be361062a565b90506000610bf033610fff565b9050826002015460001415610c31576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83811015610c6b576040517f188ded2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836002015482610c7d9190612564565b90506000610c9b6005546001610c93919061263f565b87908661208e565b905082861415610cba5733600090815260116020526040812055610cdf565b3360009081526011602052604081208054839290610cd9908490612564565b90915550505b81861115610d2b57610cf18287612564565b856002016000828254610d049190612564565b90915550610d1490508287612564565b60026000828254610d259190612564565b90915550505b604080516001808252818301909252600091602080830190803683370190505090508681600081518110610d6157610d61612657565b60209081029190910101526008546009546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018a905291169063095ea7b390604401602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612622565b506009546040517fd668104200000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063d668104290610e7490859030906004016126c1565b600060405180830381600087803b158015610e8e57600080fd5b505af1158015610ea2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610ee8919081019061271d565b90508260056000828254610efc9190612564565b92505081905550336010600083600081518110610f1b57610f1b612657565b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f21b8e5e36008677ea26efbbc967e568e01b127f731ed0fda0a8685fda37d0d5f333083600081518110610fa557610fa5612657565b6020908102919091018101516040805173ffffffffffffffffffffffffffffffffffffffff958616815294909316918401919091529082015242606082015243608082015260a00160405180910390a15050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260408083208151608081018352815461ffff1681526001820154938101939093526002810154918301919091526003015460608201528161106161062a565b73ffffffffffffffffffffffffffffffffffffffff851660009081526011602052604090205490915061109957506040015192915050565b806110a8575060009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff851660009081526011602052604081205490916110df9190849061208e565b905082604001518110156110f95750506040015192915050565b6000620186a0846000015161ffff16856040015160055486601160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461115b919061257b565b61116591906125e7565b61116f9190612564565b611179919061257b565b61118391906125e7565b905061118f8183612564565b9695505050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015260640161075e565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a5474010000000000000000000000000000000000000000900460ff16156112c5576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b60205260409020600201541561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f796f752063616e74207374616b65206f6e65206d6f72652074696d6500000000604482015260640161075e565b606461ffff83161080611357575061271061ffff8316115b1561138e576040517fb92e9c7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001548110156113d0576001546040517f1956f3b800000000000000000000000000000000000000000000000000000000815260040161075e91815260200190565b6113d861062a565b6012556008546040517fa1903eab00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a1903eab9034906024016020604051808303818588803b15801561144757600080fd5b505af115801561145b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611480919061251c565b50600061148b61062a565b905060006012548261149d9190612564565b905060405180608001604052808561ffff16815260200184815260200182600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611508919061263f565b8152600454602091820152336000908152600b82526040808220845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff909116178155928401516001840155830151600283015560609092015160039091015561157782611767565b9050600554600014156115ef576103e860056000828254611598919061263f565b9091555050600080805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546103e892906115da90849061263f565b909155506115ec90506103e882612564565b90505b3360009081526011602052604081208290556005805483929061161390849061263f565b92505081905550816002600082825461162c919061263f565b90915550612710905061164361ffff87168461257b565b61164d91906125e7565b6003600082825461165e919061263f565b9091555050600454604080513381526020810185905261ffff8816818301526060810187905230608082015260a08101929092524260c08301524360e0830152517f310c0e2e14c892bf31fbfd326b4d59b0c5cee292548727532b66fa2fa0c646a4918190036101000190a15050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633148015906117095750336000908152600c602052604090205460ff16155b1561176257600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161075e565b600155565b600060055460001415611778575090565b601254600554611788908461257b565b61179291906125e7565b92915050565b60006117a762015180836125e7565b611792906201518061257b565b600a547501000000000000000000000000000000000000000000900460ff16156117dd57600080fd5b600a805460078054337fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560088054821673ffffffffffffffffffffffffffffffffffffffff88811691909117909155600980549092168582161790915575010000000000000000000000000000000000000000007fffffffffffffffffffff00ff00000000000000000000000000000000000000009092169085161717905561188c42611798565b600455505050565b6118c36040518060800160405280600061ffff1681526020016000815260200160008152602001600081525090565b5073ffffffffffffffffffffffffffffffffffffffff166000908152600b60209081526040918290208251608081018452815461ffff168152600182015492810192909252600281015492820192909252600390910154606082015290565b600a5474010000000000000000000000000000000000000000900460ff1615611977576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606461ffff8316108061198f575061271061ffff8316115b156119c6576040517fb92e9c7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154811015611a08576001546040517f1956f3b800000000000000000000000000000000000000000000000000000000815260040161075e91815260200190565b611a1061062a565b6012556008546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90606401602060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190612622565b506000611ace61062a565b9050600060125482611ae09190612564565b905060405180608001604052808561ffff16815260200184815260200186600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611b4b919061263f565b8152600454602091820152336000908152600b82526040808220845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9091161781559284015160018401558301516002830155606090920151600390910155611bba82611767565b905060055460001415611c32576103e860056000828254611bdb919061263f565b9091555050600080805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546103e89290611c1d90849061263f565b90915550611c2f90506103e882612564565b90505b33600090815260116020526040812082905560058054839290611c5690849061263f565b925050819055508160026000828254611c6f919061263f565b909155506127109050611c8661ffff87168861257b565b611c9091906125e7565b60036000828254611ca1919061263f565b9091555050600454604080513381526020810189905261ffff8816818301526060810187905230608082015260a08101929092524260c08301524360e0830152517f310c0e2e14c892bf31fbfd326b4d59b0c5cee292548727532b66fa2fa0c646a4918190036101000190a1505050505050565b600080600080611d2485611798565b6000908152600d6020908152604080832054600e835281842054600f909352922054919790965090945092505050565b611d5c6121bf565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff163314611dc2576040517fe4bd890e0000000000000000000000000000000000000000000000000000000081523360048201526024810182905260440161075e565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110611df857611df8612657565b60209081029190910101526009546040517fb8c4b85a00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063b8c4b85a90611e5a9085906004016127b3565b60006040518083038186803b158015611e7257600080fd5b505afa158015611e86573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ecc91908101906127c6565b600081518110611ede57611ede612657565b602002602001015190508060800151611f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f5468652072657175657374206973206e6f7420617661696c61626c6520666f7260448201527f20636c61696d0000000000000000000000000000000000000000000000000000606482015260840161075e565b6009546040517ff84444360000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9091169063f844443690602401600060405180830381600087803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b5050825160405133935081156108fc0292506000818181858888f1935050505015801561202a573d6000803e3d6000fd5b5080516040805133815230602082015280820192909252606082018590524260808301524360a0830152517f6fd22a558b3de572be6a8072ed873e4f31ed45c5ca309fb6f36decf58720c3e99181900360c00190a1505061208b6001600055565b50565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600014156120e7578382816120dd576120dd6125b8565b04925050506121b8565b808411612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161075e565b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6002600054141561222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161075e565b6002600055565b73ffffffffffffffffffffffffffffffffffffffff8116811461208b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156122a7576122a7612255565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122f4576122f4612255565b604052919050565b6000806000806080858703121561231257600080fd5b843561231d81612233565b935060208581013561232e81612233565b935060408601359250606086013567ffffffffffffffff8082111561235257600080fd5b818801915088601f83011261236657600080fd5b81358181111561237857612378612255565b6123a8847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016122ad565b915080825289848285010111156123be57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000602082840312156123f057600080fd5b5035919050565b60006020828403121561240957600080fd5b81356121b881612233565b801515811461208b57600080fd5b6000806040838503121561243557600080fd5b823561244081612233565b9150602083013561245081612414565b809150509250929050565b803561ffff8116811461246d57600080fd5b919050565b6000806040838503121561248557600080fd5b61248e8361245b565b946020939093013593505050565b6000806000606084860312156124b157600080fd5b83356124bc81612233565b925060208401356124cc81612233565b915060408401356124dc81612233565b809150509250925092565b6000806000606084860312156124fc57600080fd5b8335925061250c6020850161245b565b9150604084013590509250925092565b60006020828403121561252e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561257657612576612535565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125b3576125b3612535565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561263457600080fd5b81516121b881612414565b6000821982111561265257612652612535565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020808501945080840160005b838110156126b65781518752958201959082019060010161269a565b509495945050505050565b6040815260006126d46040830185612686565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b600067ffffffffffffffff82111561271357612713612255565b5060051b60200190565b6000602080838503121561273057600080fd5b825167ffffffffffffffff81111561274757600080fd5b8301601f8101851361275857600080fd5b805161276b612766826126f9565b6122ad565b81815260059190911b8201830190838101908783111561278a57600080fd5b928401925b828410156127a85783518252928401929084019061278f565b979650505050505050565b6020815260006121b86020830184612686565b600060208083850312156127d957600080fd5b825167ffffffffffffffff8111156127f057600080fd5b8301601f8101851361280157600080fd5b805161280f612766826126f9565b81815260c0918202830184019184820191908884111561282e57600080fd5b938501935b838510156128b15780858a03121561284b5760008081fd5b612853612284565b85518152868601518782015260408087015161286e81612233565b908201526060868101519082015260808087015161288b81612414565b9082015260a08681015161289e81612414565b9082015283529384019391850191612833565b5097965050505050505056fea2646970667358221220302a298742b02f1780808accc02ab5570e91ce2cd9b8b3ae2f0f8d58ca6fdd0564736f6c63430008090033
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c8063863ed73d116100ec578063c32d3ae21161008a578063d89f20d311610064578063d89f20d314610599578063ee5a3263146105af578063f6182607146105cf578063f84444361461060a57600080fd5b8063c32d3ae2146104ff578063d21294cc14610556578063d6ae3cfa1461058357600080fd5b806397a32a3c116100c657806397a32a3c14610462578063be41a01b14610482578063beef80a6146104b2578063c0c53b8b146104df57600080fd5b8063863ed73d1461040f5780638a2ff9a2146104225780638acf03431461044257600080fd5b80632c8ca0ea11610159578063477348921161013357806347734892146103a3578063548adead146103c35780635b9f0016146103d957806365360843146103ef57600080fd5b80632c8ca0ea14610318578063392e53cd1461035a5780633a98ef391461038d57600080fd5b8063150b7a0211610195578063150b7a021461021c5780631fa568571461029157806320b3b117146102a65780632963a287146102f857600080fd5b806308514ac9146101c757806308ae7e54146101ef5780630ef43a581461020557600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506101dc61062a565b6040519081526020015b60405180910390f35b3480156101fb57600080fd5b506101dc60015481565b34801561021157600080fd5b5061021a6106d1565b005b34801561022857600080fd5b506102606102373660046122fc565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b6040517fffffffff0000000000000000000000000000000000000000000000000000000090911681526020016101e6565b34801561029d57600080fd5b5061021a610a65565b3480156102b257600080fd5b506009546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e6565b34801561030457600080fd5b5061021a6103133660046123de565b610bcb565b34801561032457600080fd5b50600a5461034a9074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101e6565b34801561036657600080fd5b50600a5461034a907501000000000000000000000000000000000000000000900460ff1681565b34801561039957600080fd5b506101dc60055481565b3480156103af57600080fd5b506101dc6103be3660046123f7565b610fff565b3480156103cf57600080fd5b506101dc60065481565b3480156103e557600080fd5b506101dc60025481565b3480156103fb57600080fd5b5061021a61040a366004612422565b611199565b61021a61041d366004612472565b611270565b34801561042e57600080fd5b5061021a61043d3660046123de565b6116d1565b34801561044e57600080fd5b506101dc61045d3660046123de565b611767565b34801561046e57600080fd5b506101dc61047d3660046123de565b611798565b34801561048e57600080fd5b5061034a61049d3660046123f7565b600c6020526000908152604090205460ff1681565b3480156104be57600080fd5b50600a546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156104eb57600080fd5b5061021a6104fa36600461249c565b6117b4565b34801561050b57600080fd5b5061051f61051a3660046123f7565b611894565b6040516101e69190815161ffff16815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561056257600080fd5b506008546102d39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561058f57600080fd5b506101dc60045481565b3480156105a557600080fd5b506101dc60035481565b3480156105bb57600080fd5b5061021a6105ca3660046124e7565b611922565b3480156105db57600080fd5b506105ef6105ea3660046123de565b611d15565b604080519384526020840192909252908201526060016101e6565b34801561061657600080fd5b5061021a6106253660046123de565b611d54565b6008546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561069457600080fd5b505afa1580156106a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cc919061251c565b905090565b600a5473ffffffffffffffffffffffffffffffffffffffff1633148015906107095750336000908152600c602052604090205460ff16155b1561076757600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff90911660248201526044015b60405180910390fd5b60045442116107b657600480546040517fba6f21b2000000000000000000000000000000000000000000000000000000008152429281019290925260248201526000604482015260640161075e565b60006107c061062a565b90506000600254826107d29190612564565b905060006002546127106003546107e9919061257b565b6107f391906125e7565b90506000612710610804838561257b565b61080e91906125e7565b905060006127106108216101f48461257b565b61082b91906125e7565b6008546007546040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff918216600482015260248101849052929350169063a9059cbb90604401602060405180830381600087803b1580156108a357600080fd5b505af11580156108b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108db9190612622565b50600854600a5473ffffffffffffffffffffffffffffffffffffffff9182169163a9059cbb911661090c8486612564565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401602060405180830381600087803b15801561097757600080fd5b505af115801561098b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109af9190612622565b50600480546000908152600d602090815260408083208890556002805485548552600e84528285205584548452600f835292819020899055915460035493548351898152928301919091529181019290925260608201524260808201524360a08201527f8baf509f1122a0f4a996885e2e55905a590bf1c210ed4a5c6d60f7b936cbdc899060c00160405180910390a16201518060046000828254610a54919061263f565b909155505060006003555050505050565b600a5474010000000000000000000000000000000000000000900460ff1615610aba576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600a5473ffffffffffffffffffffffffffffffffffffffff163314801590610af25750336000908152600c602052604090205460ff16155b15610b4b57600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161075e565b600a80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000017905560408051308152426020820152438183015290517fa67f03226c045d22d8a1c52cf1185252d7021a8ac9a117cba40a9f131ed99b94916060908290030190a1565b336000908152600b6020526040812090610be361062a565b90506000610bf033610fff565b9050826002015460001415610c31576040517f039f2e1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83811015610c6b576040517f188ded2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000836002015482610c7d9190612564565b90506000610c9b6005546001610c93919061263f565b87908661208e565b905082861415610cba5733600090815260116020526040812055610cdf565b3360009081526011602052604081208054839290610cd9908490612564565b90915550505b81861115610d2b57610cf18287612564565b856002016000828254610d049190612564565b90915550610d1490508287612564565b60026000828254610d259190612564565b90915550505b604080516001808252818301909252600091602080830190803683370190505090508681600081518110610d6157610d61612657565b60209081029190910101526008546009546040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9182166004820152602481018a905291169063095ea7b390604401602060405180830381600087803b158015610de257600080fd5b505af1158015610df6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1a9190612622565b506009546040517fd668104200000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063d668104290610e7490859030906004016126c1565b600060405180830381600087803b158015610e8e57600080fd5b505af1158015610ea2573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610ee8919081019061271d565b90508260056000828254610efc9190612564565b92505081905550336010600083600081518110610f1b57610f1b612657565b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f21b8e5e36008677ea26efbbc967e568e01b127f731ed0fda0a8685fda37d0d5f333083600081518110610fa557610fa5612657565b6020908102919091018101516040805173ffffffffffffffffffffffffffffffffffffffff958616815294909316918401919091529082015242606082015243608082015260a00160405180910390a15050505050505050565b73ffffffffffffffffffffffffffffffffffffffff81166000908152600b602090815260408083208151608081018352815461ffff1681526001820154938101939093526002810154918301919091526003015460608201528161106161062a565b73ffffffffffffffffffffffffffffffffffffffff851660009081526011602052604090205490915061109957506040015192915050565b806110a8575060009392505050565b60055473ffffffffffffffffffffffffffffffffffffffff851660009081526011602052604081205490916110df9190849061208e565b905082604001518110156110f95750506040015192915050565b6000620186a0846000015161ffff16856040015160055486601160008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461115b919061257b565b61116591906125e7565b61116f9190612564565b611179919061257b565b61118391906125e7565b905061118f8183612564565b9695505050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff16331461121a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015260640161075e565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600c6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b600a5474010000000000000000000000000000000000000000900460ff16156112c5576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600b60205260409020600201541561133f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f796f752063616e74207374616b65206f6e65206d6f72652074696d6500000000604482015260640161075e565b606461ffff83161080611357575061271061ffff8316115b1561138e576040517fb92e9c7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001548110156113d0576001546040517f1956f3b800000000000000000000000000000000000000000000000000000000815260040161075e91815260200190565b6113d861062a565b6012556008546040517fa1903eab00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff9091169063a1903eab9034906024016020604051808303818588803b15801561144757600080fd5b505af115801561145b573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611480919061251c565b50600061148b61062a565b905060006012548261149d9190612564565b905060405180608001604052808561ffff16815260200184815260200182600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611508919061263f565b8152600454602091820152336000908152600b82526040808220845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff909116178155928401516001840155830151600283015560609092015160039091015561157782611767565b9050600554600014156115ef576103e860056000828254611598919061263f565b9091555050600080805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546103e892906115da90849061263f565b909155506115ec90506103e882612564565b90505b3360009081526011602052604081208290556005805483929061161390849061263f565b92505081905550816002600082825461162c919061263f565b90915550612710905061164361ffff87168461257b565b61164d91906125e7565b6003600082825461165e919061263f565b9091555050600454604080513381526020810185905261ffff8816818301526060810187905230608082015260a08101929092524260c08301524360e0830152517f310c0e2e14c892bf31fbfd326b4d59b0c5cee292548727532b66fa2fa0c646a4918190036101000190a15050505050565b600a5473ffffffffffffffffffffffffffffffffffffffff1633148015906117095750336000908152600c602052604090205460ff16155b1561176257600a546040517f86ac6cc500000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff909116602482015260440161075e565b600155565b600060055460001415611778575090565b601254600554611788908461257b565b61179291906125e7565b92915050565b60006117a762015180836125e7565b611792906201518061257b565b600a547501000000000000000000000000000000000000000000900460ff16156117dd57600080fd5b600a805460078054337fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560088054821673ffffffffffffffffffffffffffffffffffffffff88811691909117909155600980549092168582161790915575010000000000000000000000000000000000000000007fffffffffffffffffffff00ff00000000000000000000000000000000000000009092169085161717905561188c42611798565b600455505050565b6118c36040518060800160405280600061ffff1681526020016000815260200160008152602001600081525090565b5073ffffffffffffffffffffffffffffffffffffffff166000908152600b60209081526040918290208251608081018452815461ffff168152600182015492810192909252600281015492820192909252600390910154606082015290565b600a5474010000000000000000000000000000000000000000900460ff1615611977576040517f1b001d1000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b606461ffff8316108061198f575061271061ffff8316115b156119c6576040517fb92e9c7a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154811015611a08576001546040517f1956f3b800000000000000000000000000000000000000000000000000000000815260040161075e91815260200190565b611a1061062a565b6012556008546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526044810185905273ffffffffffffffffffffffffffffffffffffffff909116906323b872dd90606401602060405180830381600087803b158015611a8b57600080fd5b505af1158015611a9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ac39190612622565b506000611ace61062a565b9050600060125482611ae09190612564565b905060405180608001604052808561ffff16815260200184815260200186600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611b4b919061263f565b8152600454602091820152336000908152600b82526040808220845181547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff9091161781559284015160018401558301516002830155606090920151600390910155611bba82611767565b905060055460001415611c32576103e860056000828254611bdb919061263f565b9091555050600080805260116020527f4ad3b33220dddc71b994a52d72c06b10862965f7d926534c05c00fb7e819e7b780546103e89290611c1d90849061263f565b90915550611c2f90506103e882612564565b90505b33600090815260116020526040812082905560058054839290611c5690849061263f565b925050819055508160026000828254611c6f919061263f565b909155506127109050611c8661ffff87168861257b565b611c9091906125e7565b60036000828254611ca1919061263f565b9091555050600454604080513381526020810189905261ffff8816818301526060810187905230608082015260a08101929092524260c08301524360e0830152517f310c0e2e14c892bf31fbfd326b4d59b0c5cee292548727532b66fa2fa0c646a4918190036101000190a1505050505050565b600080600080611d2485611798565b6000908152600d6020908152604080832054600e835281842054600f909352922054919790965090945092505050565b611d5c6121bf565b60008181526010602052604090205473ffffffffffffffffffffffffffffffffffffffff163314611dc2576040517fe4bd890e0000000000000000000000000000000000000000000000000000000081523360048201526024810182905260440161075e565b604080516001808252818301909252600091602080830190803683370190505090508181600081518110611df857611df8612657565b60209081029190910101526009546040517fb8c4b85a00000000000000000000000000000000000000000000000000000000815260009173ffffffffffffffffffffffffffffffffffffffff169063b8c4b85a90611e5a9085906004016127b3565b60006040518083038186803b158015611e7257600080fd5b505afa158015611e86573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052611ecc91908101906127c6565b600081518110611ede57611ede612657565b602002602001015190508060800151611f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f5468652072657175657374206973206e6f7420617661696c61626c6520666f7260448201527f20636c61696d0000000000000000000000000000000000000000000000000000606482015260840161075e565b6009546040517ff84444360000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff9091169063f844443690602401600060405180830381600087803b158015611fe557600080fd5b505af1158015611ff9573d6000803e3d6000fd5b5050825160405133935081156108fc0292506000818181858888f1935050505015801561202a573d6000803e3d6000fd5b5080516040805133815230602082015280820192909252606082018590524260808301524360a0830152517f6fd22a558b3de572be6a8072ed873e4f31ed45c5ca309fb6f36decf58720c3e99181900360c00190a1505061208b6001600055565b50565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85870985870292508281108382030391505080600014156120e7578382816120dd576120dd6125b8565b04925050506121b8565b808411612150576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4d6174683a206d756c446976206f766572666c6f770000000000000000000000604482015260640161075e565b600084868809851960019081018716968790049682860381900495909211909303600082900391909104909201919091029190911760038402600290811880860282030280860282030280860282030280860282030280860282030280860290910302029150505b9392505050565b6002600054141561222c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161075e565b6002600055565b73ffffffffffffffffffffffffffffffffffffffff8116811461208b57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405160c0810167ffffffffffffffff811182821017156122a7576122a7612255565b60405290565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156122f4576122f4612255565b604052919050565b6000806000806080858703121561231257600080fd5b843561231d81612233565b935060208581013561232e81612233565b935060408601359250606086013567ffffffffffffffff8082111561235257600080fd5b818801915088601f83011261236657600080fd5b81358181111561237857612378612255565b6123a8847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016122ad565b915080825289848285010111156123be57600080fd5b808484018584013760008482840101525080935050505092959194509250565b6000602082840312156123f057600080fd5b5035919050565b60006020828403121561240957600080fd5b81356121b881612233565b801515811461208b57600080fd5b6000806040838503121561243557600080fd5b823561244081612233565b9150602083013561245081612414565b809150509250929050565b803561ffff8116811461246d57600080fd5b919050565b6000806040838503121561248557600080fd5b61248e8361245b565b946020939093013593505050565b6000806000606084860312156124b157600080fd5b83356124bc81612233565b925060208401356124cc81612233565b915060408401356124dc81612233565b809150509250925092565b6000806000606084860312156124fc57600080fd5b8335925061250c6020850161245b565b9150604084013590509250925092565b60006020828403121561252e57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008282101561257657612576612535565b500390565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125b3576125b3612535565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261261d577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b60006020828403121561263457600080fd5b81516121b881612414565b6000821982111561265257612652612535565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081518084526020808501945080840160005b838110156126b65781518752958201959082019060010161269a565b509495945050505050565b6040815260006126d46040830185612686565b905073ffffffffffffffffffffffffffffffffffffffff831660208301529392505050565b600067ffffffffffffffff82111561271357612713612255565b5060051b60200190565b6000602080838503121561273057600080fd5b825167ffffffffffffffff81111561274757600080fd5b8301601f8101851361275857600080fd5b805161276b612766826126f9565b6122ad565b81815260059190911b8201830190838101908783111561278a57600080fd5b928401925b828410156127a85783518252928401929084019061278f565b979650505050505050565b6020815260006121b86020830184612686565b600060208083850312156127d957600080fd5b825167ffffffffffffffff8111156127f057600080fd5b8301601f8101851361280157600080fd5b805161280f612766826126f9565b81815260c0918202830184019184820191908884111561282e57600080fd5b938501935b838510156128b15780858a03121561284b5760008081fd5b612853612284565b85518152868601518782015260408087015161286e81612233565b908201526060868101519082015260808087015161288b81612414565b9082015260a08681015161289e81612414565b9082015283529384019391850191612833565b5097965050505050505056fea2646970667358221220302a298742b02f1780808accc02ab5570e91ce2cd9b8b3ae2f0f8d58ca6fdd0564736f6c63430008090033
Loading...
Loading
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.