Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Lottery
- Optimization enabled
- false
- Compiler version
- v0.8.20+commit.a1b79de6
- EVM Version
- paris
- Verified at
- 2024-05-23T08:13:24.536240Z
Constructor Arguments
000000000000000000000000d09a6ccc86dbcaffadd830472f0c2de7bcfc7e91
Arg [0] (address) : 0xd09a6ccc86dbcaffadd830472f0c2de7bcfc7e91
contracts/Lottery.sol
// SPDX-License-Identifier: Unlicensed pragma solidity 0.8.20; import {IERC721Metadata} from "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import {ReentrancyGuard} from "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IERC721} from "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {Strings} from "@openzeppelin/contracts/utils/Strings.sol"; import "./utils/VRFConsumerBaseV2.sol"; import "./interfaces/IErinaceusVRF.sol"; // import {IAuction} from "./interfaces/IAuction.sol"; // import {IVeXNF} from "./interfaces/IVeXNF.sol"; import "hardhat/console.sol"; // is // IVeXNF, // IERC721, // IERC721Metadata, // ReentrancyGuard contract Lottery is VRFConsumerBaseV2 { uint256 public currentPoolID; uint256 public day; // test // uint256 public poolDuration; IErinaceusVRF public erinaceusVRF; uint64 public subID; uint16 public requestConfirmations; uint32 public gasLimit; bytes32 public keyHash; uint256 public amount; struct Pool { uint256 poolStart; uint32 countOfWinners; uint256 totalDeposit; uint256 totalTickets; uint256 duration; uint256 lastUpdateTime; uint256[] winnersInPool; PoolStatus poolStatus; } struct PoolFlag { uint256 totalDeposit; uint256 totalTickets; uint256 lastUpdateTime; } struct User { // uint256 userID; uint256 deposit; uint256 tickets; uint256 lastUpdatedTime; } // poolId => current user ID mapping(uint256 => uint256) public currentUserIDInPool; // poolId => Pool struct mapping(uint256 => Pool) public poolInfo; // poolId => flagId => poolFlag struct mapping(uint256 => mapping(uint256 => PoolFlag)) public poolFlag; // poolId => poolFlags length => poolFlags struct mapping(uint256 => uint256) public poolFlagsLength; // User address => poolID => UserID mapping(address => mapping(uint256 => uint256)) public userID; // PoolID => UserID => UserInfo mapping(uint256 => mapping(uint256 => User)) public userInfo; enum PoolStatus { notStarted, started, finished } constructor(address _erinaceusVRF) VRFConsumerBaseV2(_erinaceusVRF) { erinaceusVRF = IErinaceusVRF(_erinaceusVRF); day = 28000; } function vrfSetup( uint64 _subID, bytes32 _keyHash, uint32 _gasLimit, uint16 _requestConfirmations ) external { subID = _subID; keyHash = _keyHash; gasLimit = _gasLimit; requestConfirmations = _requestConfirmations; } function newRound(uint256 duration, uint32 countOfWinners) external { require( poolInfo[currentPoolID].poolStatus == PoolStatus.notStarted, "Pool already started" ); poolInfo[currentPoolID].duration = duration; poolInfo[currentPoolID].poolStart = block.timestamp; poolInfo[currentPoolID].poolStatus = PoolStatus.started; poolInfo[currentPoolID].countOfWinners = countOfWinners; poolInfo[currentPoolID].winnersInPool = new uint256[](countOfWinners); } function finalizeRound() external { Pool storage pool = poolInfo[currentPoolID]; uint256 length = currentUserIDInPool[currentPoolID] / 100; console.log(" ~ finalizeRound ~ length:", length); for (uint256 i; i < length; i++) { poolFlag[currentPoolID][i].totalTickets += poolFlag[currentPoolID][i].totalDeposit * ((block.timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day); poolFlag[currentPoolID][i].lastUpdateTime = block.timestamp; } pool.totalTickets += pool.totalDeposit * ((block.timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = block.timestamp; erinaceusVRF.requestRandomWords( keyHash, subID, requestConfirmations, gasLimit, pool.countOfWinners ); pool.poolStatus = PoolStatus.finished; amount = address(this).balance/ 10; console.log(" ~ finalizeRound ~ amount:", amount); } function stake() external payable { Pool storage pool = poolInfo[currentPoolID]; uint256 userId = userID[msg.sender][currentPoolID]; require( pool.poolStatus == PoolStatus.started, "Pool is not started yet" ); require(msg.value > 0, "Nothing to stake"); if (userId == 0) { userId = currentUserIDInPool[currentPoolID]; } User storage user = userInfo[currentPoolID][userId]; userID[msg.sender][currentPoolID] = userId; _updatePool(msg.sender, msg.value, true); userInfo[currentPoolID][userId] = User({ deposit: user.deposit + msg.value, tickets: user.tickets, lastUpdatedTime: block.timestamp }); if (userId == currentUserIDInPool[currentPoolID]) { currentUserIDInPool[currentPoolID]++; } } function unstake(uint256 amount) external { uint256 userId = userID[msg.sender][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; require(user.deposit >= amount, "Insufficient deposit"); _updatePool(msg.sender, amount, false); } function fulfillRandomWords( uint256 requestId, uint256[] memory randomWords ) internal virtual override { Pool storage pool = poolInfo[currentPoolID]; for (uint256 i; i < randomWords.length; i++) { poolInfo[currentPoolID].winnersInPool[i] = randomWords[i]; } } function claimReward(uint256 poolID) external { // require(userInfo[msg.sender][poolID].deposit > 0); } function check() public view returns (uint256[] memory winingNumbers) { // uint256 length = currentUserIDInPool[currentPoolID] / 100; uint256 userId = userID[msg.sender][currentPoolID]; console.log(" ~ check ~ userId:", userId); Pool memory pool = poolInfo[currentPoolID]; User memory user = userInfo[currentPoolID][userId]; uint256 userIsInFlag = userId / 100; uint256[] memory flagRange = new uint256[](2); if(userIsInFlag > 0){ for (uint256 i; i < userIsInFlag; i++) { flagRange[0] += poolFlag[currentPoolID][i].totalTickets; } } // console.log("~ check ~ flagRange[0]:", flagRange[0]); flagRange[1] = flagRange[0] + poolFlag[currentPoolID][userIsInFlag].totalTickets - 1; // console.log(" ~ check ~ flagRange[1]:", flagRange[1]); uint256[] memory usersTicketsRange = new uint256[](2); uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + 100000) { timestamp = pool.poolStart + 100000; } if(userId > 0){ for (uint256 j = userIsInFlag * 100; j < userId; j++) { usersTicketsRange[0] += userInfo[currentPoolID][j].tickets + userInfo[currentPoolID][j].deposit * ((block.timestamp - userInfo[currentPoolID][j].lastUpdatedTime) / day); } usersTicketsRange[0] += flagRange[0]; }else{ usersTicketsRange[0] = flagRange[0]; } usersTicketsRange[1] = usersTicketsRange[0] + user.tickets + user.deposit * ((block.timestamp - user.lastUpdatedTime) / day) - 1; // console.log(" ~ check ~ usersTicketsRange[0]:", usersTicketsRange[0]); // console.log(" ~ check ~ usersTicketsRange[1]:", usersTicketsRange[1]); uint256[] memory tempWiningNumbers = new uint256[](poolInfo[currentPoolID].countOfWinners); uint256 index; for (uint32 k; k < pool.countOfWinners; k++) { if ( usersTicketsRange[0] <= pool.winnersInPool[k] && pool.winnersInPool[k] <= usersTicketsRange[1] ) { tempWiningNumbers[index] = pool.winnersInPool[k]; index++; } } if(index > 0){ winingNumbers = new uint256[](index); for(uint256 i; i < index; i++){ winingNumbers[i] = tempWiningNumbers[i]; } } } function claim() external { uint256[] memory winningNumbers = check(); if(winningNumbers.length > 0){ for(uint256 i; i < winningNumbers.length; i++){ console.log("11111111111111111111111111111111111111111"); _sendViaCall(payable(msg.sender), amount); } } } function _updatePool( address userAddress, uint256 amount, bool isStake ) internal { Pool storage pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + 100000) { timestamp = pool.poolStart + 100000; } pool.totalTickets += pool.totalDeposit * ((block.timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = block.timestamp; if (amount > 0) { if (isStake) { pool.totalDeposit += amount; if (userAddress != address(0)) { uint256 userId = userID[msg.sender][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((block.timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit += amount; poolFlag[currentPoolID][id].lastUpdateTime = block .timestamp; } if (user.deposit > 0) { user.tickets += user.deposit * ((block.timestamp - user.lastUpdatedTime) / day); } } } else { pool.totalDeposit -= amount; if (userAddress != address(0)) { uint256 userId = userID[msg.sender][currentPoolID]; User storage user = userInfo[currentPoolID][userId]; { uint256 id = userId / 100; poolFlag[currentPoolID][id].totalTickets += poolFlag[currentPoolID][id].totalDeposit * ((block.timestamp - poolFlag[currentPoolID][id].lastUpdateTime) / day); poolFlag[currentPoolID][id].totalDeposit -= amount; poolFlag[currentPoolID][id].lastUpdateTime = block .timestamp; } user.tickets += user.deposit * ((block.timestamp - user.lastUpdatedTime) / day); user.deposit -= amount; user.lastUpdatedTime = block.timestamp; } } } } function _updateAll() public { Pool storage pool = poolInfo[currentPoolID]; uint256 timestamp = block.timestamp; if (block.timestamp > pool.poolStart + 100000) { timestamp = pool.poolStart + 100000; } pool.totalTickets += pool.totalDeposit * ((block.timestamp - pool.lastUpdateTime) / day); pool.lastUpdateTime = block.timestamp; { uint256 length = currentUserIDInPool[currentPoolID] / 100; for (uint256 i = 0; i <= length; i++) { poolFlag[currentPoolID][i].totalTickets += poolFlag[currentPoolID][i].totalDeposit * ((block.timestamp - poolFlag[currentPoolID][i].lastUpdateTime) / day); poolFlag[currentPoolID][i].lastUpdateTime = block.timestamp; } } } function _sendViaCall( address payable to, uint256 amount ) internal { (bool sent, ) = to.call{value: amount} (""); if (!sent) { revert(); } } }
@openzeppelin/contracts/security/ReentrancyGuard.sol
// 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; } }
@openzeppelin/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); }
@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
@openzeppelin/contracts/token/ERC721/IERC721.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol
// 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); }
@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
@openzeppelin/contracts/utils/Address.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
@openzeppelin/contracts/utils/Strings.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
@openzeppelin/contracts/utils/introspection/IERC165.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
@openzeppelin/contracts/utils/math/Math.sol
// 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); } } }
@openzeppelin/contracts/utils/math/SignedMath.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
contracts/interfaces/IErinaceusVRF.sol
// SPDX-License-Identifier: MIT pragma solidity 0.8.20; interface IErinaceusVRF { function requestRandomWords( bytes32 keyHash, uint64 subId, uint16 requestConfirmations, uint32 callbackGasLimit, uint32 numWords ) external; }
contracts/utils/VRFConsumerBaseV2.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. It ensures 2 things: * @dev 1. The fulfillment came from the ErinaceusVRF * @dev 2. The consumer contract implements fulfillRandomWords. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constructor(<other arguments>, address _erinaceusVRF, address _link) * @dev VRFConsumerBase(_erinaceusVRF) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash). Create subscription, fund it * @dev and your consumer contract as a consumer of it (see ErinaceusVRFInterface * @dev subscription management functions). * @dev Call requestRandomWords(keyHash, subId, minimumRequestConfirmations, * @dev callbackGasLimit, numWords), * @dev see (ErinaceusVRFInterface for a description of the arguments). * * @dev Once the ErinaceusVRF has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomWords method. * * @dev The randomness argument to fulfillRandomWords is a set of random words * @dev generated from your requestId and the blockHash of the request. * * @dev If your contract could have concurrent requests open, you can use the * @dev requestId returned from requestRandomWords to track which response is associated * @dev with which randomness request. * @dev See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously. * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. It is for this reason that * @dev that you can signal to an oracle you'd like them to wait longer before * @dev responding to the request (however this is not enforced in the contract * @dev and so remains effective only in the case of unmodified oracle software). */ abstract contract VRFConsumerBaseV2 { error OnlyErinaceusCanFulfill(address have, address want); // solhint-disable-next-line chainlink-solidity/prefix-immutable-variables-with-i address private immutable erinaceusVRF; /** * @param _erinaceusVRF address of ErinaceusVRF contract */ constructor(address _erinaceusVRF) { erinaceusVRF = _erinaceusVRF; } /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBaseV2 expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomWords the VRF output expanded to the requested number of words */ // solhint-disable-next-line chainlink-solidity/prefix-internal-functions-with-underscore function fulfillRandomWords(uint256 requestId, uint256[] memory randomWords) internal virtual; // rawFulfillRandomness is called by ErinaceusVRF when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomWords(uint256 requestId, uint256[] memory randomWords) external { if (msg.sender != erinaceusVRF) { revert OnlyErinaceusCanFulfill(msg.sender, erinaceusVRF); } fulfillRandomWords(requestId, randomWords); } }
hardhat/console.sol
// 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)); } }
Compiler Settings
{"outputSelection":{"*":{"*":["*"],"":["*"]}},"optimizer":{"runs":200,"enabled":false},"metadata":{"useLiteralContent":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_erinaceusVRF","internalType":"address"}]},{"type":"error","name":"OnlyErinaceusCanFulfill","inputs":[{"type":"address","name":"have","internalType":"address"},{"type":"address","name":"want","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"_updateAll","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"amount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"winingNumbers","internalType":"uint256[]"}],"name":"check","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimReward","inputs":[{"type":"uint256","name":"poolID","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentPoolID","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"currentUserIDInPool","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"day","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IErinaceusVRF"}],"name":"erinaceusVRF","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"finalizeRound","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint32","name":"","internalType":"uint32"}],"name":"gasLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"keyHash","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"newRound","inputs":[{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"}],"name":"poolFlag","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolFlagsLength","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"poolStart","internalType":"uint256"},{"type":"uint32","name":"countOfWinners","internalType":"uint32"},{"type":"uint256","name":"totalDeposit","internalType":"uint256"},{"type":"uint256","name":"totalTickets","internalType":"uint256"},{"type":"uint256","name":"duration","internalType":"uint256"},{"type":"uint256","name":"lastUpdateTime","internalType":"uint256"},{"type":"uint8","name":"poolStatus","internalType":"enum Lottery.PoolStatus"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rawFulfillRandomWords","inputs":[{"type":"uint256","name":"requestId","internalType":"uint256"},{"type":"uint256[]","name":"randomWords","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16","name":"","internalType":"uint16"}],"name":"requestConfirmations","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint64","name":"","internalType":"uint64"}],"name":"subID","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unstake","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"userID","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"deposit","internalType":"uint256"},{"type":"uint256","name":"tickets","internalType":"uint256"},{"type":"uint256","name":"lastUpdatedTime","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"vrfSetup","inputs":[{"type":"uint64","name":"_subID","internalType":"uint64"},{"type":"bytes32","name":"_keyHash","internalType":"bytes32"},{"type":"uint32","name":"_gasLimit","internalType":"uint32"},{"type":"uint16","name":"_requestConfirmations","internalType":"uint16"}]}]
Contract Creation Code
0x60a06040523480156200001157600080fd5b506040516200329538038062003295833981810160405281019062000037919062000128565b808073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250505080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550616d60600181905550506200015a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000f082620000c3565b9050919050565b6200010281620000e3565b81146200010e57600080fd5b50565b6000815190506200012281620000f7565b92915050565b600060208284031215620001415762000140620000be565b5b6000620001518482850162000111565b91505092915050565b6080516131186200017d6000396000818161096d01526109c101526131186000f3fe60806040526004361061014b5760003560e01c806376ce2981116100b6578063ae169a501161006f578063ae169a5014610455578063aec477591461047e578063b0fb162f146104a9578063b345dc8c146104d4578063cc4b97e114610513578063f68016b71461053c5761014b565b806376ce29811461034157806379d452fb1461037e5780637b76ac91146103955780638921b0ca146103c0578063919840ad146103ff578063aa8c217c1461042a5761014b565b80633a4b66f1116101085780633a4b66f11461025057806347b1c8f11461025a5780634e71d92d1461029757806361728f39146102ae57806362a58fb8146102d9578063669f0e82146103045761014b565b80631526fe2714610150578063195a7940146101935780631e820325146101bc5780631fe543e3146101d35780632add13c7146101fc5780632e17de7814610227575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123c0565b610567565b60405161018a9796959493929190612492565b60405180910390f35b34801561019f57600080fd5b506101ba60048036038101906101b591906125dd565b6105c6565b005b3480156101c857600080fd5b506101d161063a565b005b3480156101df57600080fd5b506101fa60048036038101906101f5919061279d565b61096b565b005b34801561020857600080fd5b50610211610a2b565b60405161021e91906127f9565b60405180910390f35b34801561023357600080fd5b5061024e600480360381019061024991906123c0565b610a31565b005b610258610b08565b005b34801561026657600080fd5b50610281600480360381019061027c91906123c0565b610d9b565b60405161028e91906127f9565b60405180910390f35b3480156102a357600080fd5b506102ac610db3565b005b3480156102ba57600080fd5b506102c3610e1a565b6040516102d09190612823565b60405180910390f35b3480156102e557600080fd5b506102ee610e20565b6040516102fb919061284d565b60405180910390f35b34801561031057600080fd5b5061032b600480360381019061032691906123c0565b610e3a565b60405161033891906127f9565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906128c6565b610e52565b60405161037591906127f9565b60405180910390f35b34801561038a57600080fd5b50610393610e77565b005b3480156103a157600080fd5b506103aa61103a565b6040516103b791906127f9565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190612906565b611040565b6040516103f693929190612946565b60405180910390f35b34801561040b57600080fd5b50610414611077565b6040516104219190612a3b565b60405180910390f35b34801561043657600080fd5b5061043f6118bd565b60405161044c91906127f9565b60405180910390f35b34801561046157600080fd5b5061047c600480360381019061047791906123c0565b6118c3565b005b34801561048a57600080fd5b506104936118c6565b6040516104a09190612abc565b60405180910390f35b3480156104b557600080fd5b506104be6118ec565b6040516104cb9190612ae6565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612906565b611900565b60405161050a93929190612946565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612b01565b611937565b005b34801561054857600080fd5b50610551611aee565b60405161055e9190612b41565b60405180910390f35b60076020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070160009054906101000a900460ff16905087565b83600260146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260048190555081600360006101000a81548163ffffffff021916908363ffffffff160217905550806002601c6101000a81548161ffff021916908361ffff16021790555050505050565b600060076000805481526020019081526020016000209050600060646006600080548152602001908152602001600020546106759190612bba565b90506106b66040518060400160405280601a81526020017f207e2066696e616c697a65526f756e64207e206c656e6774683a00000000000081525082611b04565b60005b818110156107b3576001546008600080548152602001908152602001600020600083815260200190815260200160002060020154426106f89190612beb565b6107029190612bba565b60086000805481526020019081526020016000206000838152602001908152602001600020600001546107359190612c1f565b60086000805481526020019081526020016000206000838152602001908152602001600020600101600082825461076c9190612c61565b9250508190555042600860008054815260200190815260200160002060008381526020019081526020016000206002018190555080806107ab90612c95565b9150506106b9565b506001548260050154426107c79190612beb565b6107d19190612bba565b82600201546107e09190612c1f565b8260030160008282546107f39190612c61565b92505081905550428260050181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600454600260149054906101000a900467ffffffffffffffff166002601c9054906101000a900461ffff16600360009054906101000a900463ffffffff168760010160009054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016108b4959493929190612cdd565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050505060028260070160006101000a81548160ff0219169083600281111561090e5761090d61241b565b5b0217905550600a476109209190612bba565b6005819055506109676040518060400160405280601a81526020017f207e2066696e616c697a65526f756e64207e20616d6f756e743a000000000000815250600554611b04565b5050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a1d57337f00000000000000000000000000000000000000000000000000000000000000006040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610a14929190612d3f565b60405180910390fd5b610a278282611ba0565b5050565b60005481565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b600080548152602001908152602001600020600083815260200190815260200160002090508281600001541015610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90612dc5565b60405180910390fd5b610b0333846000611c2f565b505050565b6000600760008054815260200190815260200160002090506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002054905060016002811115610b8a57610b8961241b565b5b8260070160009054906101000a900460ff166002811115610bae57610bad61241b565b5b14610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590612e31565b60405180910390fd5b60003411610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890612e9d565b60405180910390fd5b60008103610c515760066000805481526020019081526020016000205490505b6000600b6000805481526020019081526020016000206000838152602001908152602001600020905081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002081905550610cdc33346001611c2f565b6040518060600160405280348360000154610cf79190612c61565b81526020018260010154815260200142815250600b60008054815260200190815260200160002060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506006600080548152602001908152602001600020548203610d965760066000805481526020019081526020016000206000815480929190610d9090612c95565b91905055505b505050565b60096020528060005260406000206000915090505481565b6000610dbd611077565b9050600081511115610e175760005b8151811015610e1557610df66040518060600160405280602981526020016130ba602991396121a8565b610e0233600554612241565b8080610e0d90612c95565b915050610dcc565b505b50565b60045481565b600260149054906101000a900467ffffffffffffffff1681565b60066020528060005260406000206000915090505481565b600a602052816000526040600020602052806000526040600020600091509150505481565b6000600760008054815260200190815260200160002090506000429050620186a08260000154610ea79190612c61565b421115610ec457620186a08260000154610ec19190612c61565b90505b600154826005015442610ed79190612beb565b610ee19190612bba565b8260020154610ef09190612c1f565b826003016000828254610f039190612c61565b9250508190555042826005018190555060006064600660008054815260200190815260200160002054610f369190612bba565b905060005b81811161103457600154600860008054815260200190815260200160002060008381526020019081526020016000206002015442610f799190612beb565b610f839190612bba565b6008600080548152602001908152602001600020600083815260200190815260200160002060000154610fb69190612c1f565b600860008054815260200190815260200160002060008381526020019081526020016000206001016000828254610fed9190612c61565b92505081905550426008600080548152602001908152602001600020600083815260200190815260200160002060020181905550808061102c90612c95565b915050610f3b565b50505050565b60015481565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60606000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002054905061110e6040518060400160405280601281526020017f207e20636865636b207e207573657249643a000000000000000000000000000081525082611b04565b6000600760008054815260200190815260200160002060405180610100016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111d757602002820191906000526020600020905b8154815260200190600101908083116111c3575b505050505081526020016007820160009054906101000a900460ff1660028111156112055761120461241b565b5b60028111156112175761121661241b565b5b8152505090506000600b600080548152602001908152602001600020600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050600060648461127e9190612bba565b90506000600267ffffffffffffffff81111561129d5761129c61265a565b5b6040519080825280602002602001820160405280156112cb5781602001602082028036833780820191505090505b509050600082111561134f5760005b8281101561134d5760086000805481526020019081526020016000206000828152602001908152602001600020600101548260008151811061131f5761131e612ebd565b5b602002602001018181516113339190612c61565b91508181525050808061134590612c95565b9150506112da565b505b600160086000805481526020019081526020016000206000848152602001908152602001600020600101548260008151811061138e5761138d612ebd565b5b60200260200101516113a09190612c61565b6113aa9190612beb565b816001815181106113be576113bd612ebd565b5b6020026020010181815250506000600267ffffffffffffffff8111156113e7576113e661265a565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b5090506000429050620186a086600001516114309190612c61565b42111561144d57620186a0866000015161144a9190612c61565b90505b60008711156115aa5760006064856114659190612c1f565b90505b8781101561155957600154600b600080548152602001908152602001600020600083815260200190815260200160002060020154426114a79190612beb565b6114b19190612bba565b600b6000805481526020019081526020016000206000838152602001908152602001600020600001546114e49190612c1f565b600b6000805481526020019081526020016000206000838152602001908152602001600020600101546115179190612c61565b8360008151811061152b5761152a612ebd565b5b6020026020010181815161153f9190612c61565b91508181525050808061155190612c95565b915050611468565b508260008151811061156e5761156d612ebd565b5b60200260200101518260008151811061158a57611589612ebd565b5b6020026020010181815161159e9190612c61565b915081815250506115e7565b826000815181106115be576115bd612ebd565b5b6020026020010151826000815181106115da576115d9612ebd565b5b6020026020010181815250505b600180548660400151426115fb9190612beb565b6116059190612bba565b86600001516116149190612c1f565b86602001518460008151811061162d5761162c612ebd565b5b602002602001015161163f9190612c61565b6116499190612c61565b6116539190612beb565b8260018151811061166757611666612ebd565b5b6020026020010181815250506000600760008054815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff8111156116bc576116bb61265a565b5b6040519080825280602002602001820160405280156116ea5781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015611802578860c001518163ffffffff168151811061172657611725612ebd565b5b60200260200101518560008151811061174257611741612ebd565b5b60200260200101511115801561179757508460018151811061176757611766612ebd565b5b60200260200101518960c001518263ffffffff168151811061178c5761178b612ebd565b5b602002602001015111155b156117ef578860c001518163ffffffff16815181106117b9576117b8612ebd565b5b60200260200101518383815181106117d4576117d3612ebd565b5b60200260200101818152505081806117eb90612c95565b9250505b80806117fa90612eec565b9150506116f1565b5060008111156118b1578067ffffffffffffffff8111156118265761182561265a565b5b6040519080825280602002602001820160405280156118545781602001602082028036833780820191505090505b50995060005b818110156118af5782818151811061187557611874612ebd565b5b60200260200101518b82815181106118905761188f612ebd565b5b60200260200101818152505080806118a790612c95565b91505061185a565b505b50505050505050505090565b60055481565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002601c9054906101000a900461ffff1681565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b6000600281111561194b5761194a61241b565b5b600760008054815260200190815260200160002060070160009054906101000a900460ff1660028111156119825761198161241b565b5b146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990612f64565b60405180910390fd5b81600760008054815260200190815260200160002060040181905550426007600080548152602001908152602001600020600001819055506001600760008054815260200190815260200160002060070160006101000a81548160ff02191690836002811115611a3557611a3461241b565b5b021790555080600760008054815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff811115611a9057611a8f61265a565b5b604051908082528060200260200182016040528015611abe5781602001602082028036833780820191505090505b5060076000805481526020019081526020016000206006019080519060200190611ae9929190612302565b505050565b600360009054906101000a900463ffffffff1681565b611b9c8282604051602401611b1a929190612ff2565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122bc565b5050565b60006007600080548152602001908152602001600020905060005b8251811015611c2957828181518110611bd757611bd6612ebd565b5b602002602001015160076000805481526020019081526020016000206006018281548110611c0857611c07612ebd565b5b90600052602060002001819055508080611c2190612c95565b915050611bbb565b50505050565b6000600760008054815260200190815260200160002090506000429050620186a08260000154611c5f9190612c61565b421115611c7c57620186a08260000154611c799190612c61565b90505b600154826005015442611c8f9190612beb565b611c999190612bba565b8260020154611ca89190612c1f565b826003016000828254611cbb9190612c61565b9250508190555042826005018190555060008411156121a1578215611f345783826002016000828254611cee9190612c61565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611f2f576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b600080548152602001908152602001600020600083815260200190815260200160002090506000606483611db79190612bba565b9050600154600860008054815260200190815260200160002060008381526020019081526020016000206002015442611df09190612beb565b611dfa9190612bba565b6008600080548152602001908152602001600020600083815260200190815260200160002060000154611e2d9190612c1f565b600860008054815260200190815260200160002060008381526020019081526020016000206001016000828254611e649190612c61565b9250508190555086600860008054815260200190815260200160002060008381526020019081526020016000206000016000828254611ea39190612c61565b9250508190555042600860008054815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115611f2c57600154816002015442611ef89190612beb565b611f029190612bba565b8160000154611f119190612c1f565b816001016000828254611f249190612c61565b925050819055505b50505b6121a0565b83826002016000828254611f489190612beb565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461219f576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b6000805481526020019081526020016000206000838152602001908152602001600020905060006064836120119190612bba565b905060015460086000805481526020019081526020016000206000838152602001908152602001600020600201544261204a9190612beb565b6120549190612bba565b60086000805481526020019081526020016000206000838152602001908152602001600020600001546120879190612c1f565b6008600080548152602001908152602001600020600083815260200190815260200160002060010160008282546120be9190612c61565b92505081905550866008600080548152602001908152602001600020600083815260200190815260200160002060000160008282546120fd9190612beb565b92505081905550426008600080548152602001908152602001600020600083815260200190815260200160002060020181905550506001548160020154426121459190612beb565b61214f9190612bba565b816000015461215e9190612c1f565b8160010160008282546121719190612c61565b925050819055508581600001600082825461218c9190612beb565b9250508190555042816002018190555050505b5b5b5050505050565b61223e816040516024016121bc9190613022565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122bc565b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161226790613075565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122b757600080fd5b505050565b6122d3816122cb6122d66122f7565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61234f819050919050565b82805482825590600052602060002090810192821561233e579160200282015b8281111561233d578251825591602001919060010190612322565b5b50905061234b9190612359565b5090565b61235761308a565b565b5b8082111561237257600081600090555060010161235a565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61239d8161238a565b81146123a857600080fd5b50565b6000813590506123ba81612394565b92915050565b6000602082840312156123d6576123d5612380565b5b60006123e4848285016123ab565b91505092915050565b6123f68161238a565b82525050565b600063ffffffff82169050919050565b612415816123fc565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061245b5761245a61241b565b5b50565b600081905061246c8261244a565b919050565b600061247c8261245e565b9050919050565b61248c81612471565b82525050565b600060e0820190506124a7600083018a6123ed565b6124b4602083018961240c565b6124c160408301886123ed565b6124ce60608301876123ed565b6124db60808301866123ed565b6124e860a08301856123ed565b6124f560c0830184612483565b98975050505050505050565b600067ffffffffffffffff82169050919050565b61251e81612501565b811461252957600080fd5b50565b60008135905061253b81612515565b92915050565b6000819050919050565b61255481612541565b811461255f57600080fd5b50565b6000813590506125718161254b565b92915050565b612580816123fc565b811461258b57600080fd5b50565b60008135905061259d81612577565b92915050565b600061ffff82169050919050565b6125ba816125a3565b81146125c557600080fd5b50565b6000813590506125d7816125b1565b92915050565b600080600080608085870312156125f7576125f6612380565b5b60006126058782880161252c565b945050602061261687828801612562565b93505060406126278782880161258e565b9250506060612638878288016125c8565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269282612649565b810181811067ffffffffffffffff821117156126b1576126b061265a565b5b80604052505050565b60006126c4612376565b90506126d08282612689565b919050565b600067ffffffffffffffff8211156126f0576126ef61265a565b5b602082029050602081019050919050565b600080fd5b6000612719612714846126d5565b6126ba565b9050808382526020820190506020840283018581111561273c5761273b612701565b5b835b81811015612765578061275188826123ab565b84526020840193505060208101905061273e565b5050509392505050565b600082601f83011261278457612783612644565b5b8135612794848260208601612706565b91505092915050565b600080604083850312156127b4576127b3612380565b5b60006127c2858286016123ab565b925050602083013567ffffffffffffffff8111156127e3576127e2612385565b5b6127ef8582860161276f565b9150509250929050565b600060208201905061280e60008301846123ed565b92915050565b61281d81612541565b82525050565b60006020820190506128386000830184612814565b92915050565b61284781612501565b82525050565b6000602082019050612862600083018461283e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061289382612868565b9050919050565b6128a381612888565b81146128ae57600080fd5b50565b6000813590506128c08161289a565b92915050565b600080604083850312156128dd576128dc612380565b5b60006128eb858286016128b1565b92505060206128fc858286016123ab565b9150509250929050565b6000806040838503121561291d5761291c612380565b5b600061292b858286016123ab565b925050602061293c858286016123ab565b9150509250929050565b600060608201905061295b60008301866123ed565b61296860208301856123ed565b61297560408301846123ed565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6129b28161238a565b82525050565b60006129c483836129a9565b60208301905092915050565b6000602082019050919050565b60006129e88261297d565b6129f28185612988565b93506129fd83612999565b8060005b83811015612a2e578151612a1588826129b8565b9750612a20836129d0565b925050600181019050612a01565b5085935050505092915050565b60006020820190508181036000830152612a5581846129dd565b905092915050565b6000819050919050565b6000612a82612a7d612a7884612868565b612a5d565b612868565b9050919050565b6000612a9482612a67565b9050919050565b6000612aa682612a89565b9050919050565b612ab681612a9b565b82525050565b6000602082019050612ad16000830184612aad565b92915050565b612ae0816125a3565b82525050565b6000602082019050612afb6000830184612ad7565b92915050565b60008060408385031215612b1857612b17612380565b5b6000612b26858286016123ab565b9250506020612b378582860161258e565b9150509250929050565b6000602082019050612b56600083018461240c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bc58261238a565b9150612bd08361238a565b925082612be057612bdf612b5c565b5b828204905092915050565b6000612bf68261238a565b9150612c018361238a565b9250828203905081811115612c1957612c18612b8b565b5b92915050565b6000612c2a8261238a565b9150612c358361238a565b9250828202612c438161238a565b91508282048414831517612c5a57612c59612b8b565b5b5092915050565b6000612c6c8261238a565b9150612c778361238a565b9250828201905080821115612c8f57612c8e612b8b565b5b92915050565b6000612ca08261238a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cd257612cd1612b8b565b5b600182019050919050565b600060a082019050612cf26000830188612814565b612cff602083018761283e565b612d0c6040830186612ad7565b612d19606083018561240c565b612d26608083018461240c565b9695505050505050565b612d3981612888565b82525050565b6000604082019050612d546000830185612d30565b612d616020830184612d30565b9392505050565b600082825260208201905092915050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b6000612daf601483612d68565b9150612dba82612d79565b602082019050919050565b60006020820190508181036000830152612dde81612da2565b9050919050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000612e1b601783612d68565b9150612e2682612de5565b602082019050919050565b60006020820190508181036000830152612e4a81612e0e565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000612e87601083612d68565b9150612e9282612e51565b602082019050919050565b60006020820190508181036000830152612eb681612e7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ef7826123fc565b915063ffffffff8203612f0d57612f0c612b8b565b5b600182019050919050565b7f506f6f6c20616c72656164792073746172746564000000000000000000000000600082015250565b6000612f4e601483612d68565b9150612f5982612f18565b602082019050919050565b60006020820190508181036000830152612f7d81612f41565b9050919050565b600081519050919050565b60005b83811015612fad578082015181840152602081019050612f92565b60008484015250505050565b6000612fc482612f84565b612fce8185612d68565b9350612fde818560208601612f8f565b612fe781612649565b840191505092915050565b6000604082019050818103600083015261300c8185612fb9565b905061301b60208301846123ed565b9392505050565b6000602082019050818103600083015261303c8184612fb9565b905092915050565b600081905092915050565b50565b600061305f600083613044565b915061306a8261304f565b600082019050919050565b600061308082613052565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe3131313131313131313131313131313131313131313131313131313131313131313131313131313131a26469706673582212206e488a4d16db05eeff069d33135c828edc9b00168103a627c9ef8d61744ddcf664736f6c63430008140033000000000000000000000000d09a6ccc86dbcaffadd830472f0c2de7bcfc7e91
Deployed ByteCode
0x60806040526004361061014b5760003560e01c806376ce2981116100b6578063ae169a501161006f578063ae169a5014610455578063aec477591461047e578063b0fb162f146104a9578063b345dc8c146104d4578063cc4b97e114610513578063f68016b71461053c5761014b565b806376ce29811461034157806379d452fb1461037e5780637b76ac91146103955780638921b0ca146103c0578063919840ad146103ff578063aa8c217c1461042a5761014b565b80633a4b66f1116101085780633a4b66f11461025057806347b1c8f11461025a5780634e71d92d1461029757806361728f39146102ae57806362a58fb8146102d9578063669f0e82146103045761014b565b80631526fe2714610150578063195a7940146101935780631e820325146101bc5780631fe543e3146101d35780632add13c7146101fc5780632e17de7814610227575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906123c0565b610567565b60405161018a9796959493929190612492565b60405180910390f35b34801561019f57600080fd5b506101ba60048036038101906101b591906125dd565b6105c6565b005b3480156101c857600080fd5b506101d161063a565b005b3480156101df57600080fd5b506101fa60048036038101906101f5919061279d565b61096b565b005b34801561020857600080fd5b50610211610a2b565b60405161021e91906127f9565b60405180910390f35b34801561023357600080fd5b5061024e600480360381019061024991906123c0565b610a31565b005b610258610b08565b005b34801561026657600080fd5b50610281600480360381019061027c91906123c0565b610d9b565b60405161028e91906127f9565b60405180910390f35b3480156102a357600080fd5b506102ac610db3565b005b3480156102ba57600080fd5b506102c3610e1a565b6040516102d09190612823565b60405180910390f35b3480156102e557600080fd5b506102ee610e20565b6040516102fb919061284d565b60405180910390f35b34801561031057600080fd5b5061032b600480360381019061032691906123c0565b610e3a565b60405161033891906127f9565b60405180910390f35b34801561034d57600080fd5b50610368600480360381019061036391906128c6565b610e52565b60405161037591906127f9565b60405180910390f35b34801561038a57600080fd5b50610393610e77565b005b3480156103a157600080fd5b506103aa61103a565b6040516103b791906127f9565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190612906565b611040565b6040516103f693929190612946565b60405180910390f35b34801561040b57600080fd5b50610414611077565b6040516104219190612a3b565b60405180910390f35b34801561043657600080fd5b5061043f6118bd565b60405161044c91906127f9565b60405180910390f35b34801561046157600080fd5b5061047c600480360381019061047791906123c0565b6118c3565b005b34801561048a57600080fd5b506104936118c6565b6040516104a09190612abc565b60405180910390f35b3480156104b557600080fd5b506104be6118ec565b6040516104cb9190612ae6565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612906565b611900565b60405161050a93929190612946565b60405180910390f35b34801561051f57600080fd5b5061053a60048036038101906105359190612b01565b611937565b005b34801561054857600080fd5b50610551611aee565b60405161055e9190612b41565b60405180910390f35b60076020528060005260406000206000915090508060000154908060010160009054906101000a900463ffffffff16908060020154908060030154908060040154908060050154908060070160009054906101000a900460ff16905087565b83600260146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508260048190555081600360006101000a81548163ffffffff021916908363ffffffff160217905550806002601c6101000a81548161ffff021916908361ffff16021790555050505050565b600060076000805481526020019081526020016000209050600060646006600080548152602001908152602001600020546106759190612bba565b90506106b66040518060400160405280601a81526020017f207e2066696e616c697a65526f756e64207e206c656e6774683a00000000000081525082611b04565b60005b818110156107b3576001546008600080548152602001908152602001600020600083815260200190815260200160002060020154426106f89190612beb565b6107029190612bba565b60086000805481526020019081526020016000206000838152602001908152602001600020600001546107359190612c1f565b60086000805481526020019081526020016000206000838152602001908152602001600020600101600082825461076c9190612c61565b9250508190555042600860008054815260200190815260200160002060008381526020019081526020016000206002018190555080806107ab90612c95565b9150506106b9565b506001548260050154426107c79190612beb565b6107d19190612bba565b82600201546107e09190612c1f565b8260030160008282546107f39190612c61565b92505081905550428260050181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d3b1d30600454600260149054906101000a900467ffffffffffffffff166002601c9054906101000a900461ffff16600360009054906101000a900463ffffffff168760010160009054906101000a900463ffffffff166040518663ffffffff1660e01b81526004016108b4959493929190612cdd565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050505060028260070160006101000a81548160ff0219169083600281111561090e5761090d61241b565b5b0217905550600a476109209190612bba565b6005819055506109676040518060400160405280601a81526020017f207e2066696e616c697a65526f756e64207e20616d6f756e743a000000000000815250600554611b04565b5050565b7f000000000000000000000000d09a6ccc86dbcaffadd830472f0c2de7bcfc7e9173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a1d57337f000000000000000000000000d09a6ccc86dbcaffadd830472f0c2de7bcfc7e916040517f1cdc5ebb000000000000000000000000000000000000000000000000000000008152600401610a14929190612d3f565b60405180910390fd5b610a278282611ba0565b5050565b60005481565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b600080548152602001908152602001600020600083815260200190815260200160002090508281600001541015610af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aee90612dc5565b60405180910390fd5b610b0333846000611c2f565b505050565b6000600760008054815260200190815260200160002090506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002054905060016002811115610b8a57610b8961241b565b5b8260070160009054906101000a900460ff166002811115610bae57610bad61241b565b5b14610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590612e31565b60405180910390fd5b60003411610c31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2890612e9d565b60405180910390fd5b60008103610c515760066000805481526020019081526020016000205490505b6000600b6000805481526020019081526020016000206000838152602001908152602001600020905081600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002081905550610cdc33346001611c2f565b6040518060600160405280348360000154610cf79190612c61565b81526020018260010154815260200142815250600b60008054815260200190815260200160002060008481526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050506006600080548152602001908152602001600020548203610d965760066000805481526020019081526020016000206000815480929190610d9090612c95565b91905055505b505050565b60096020528060005260406000206000915090505481565b6000610dbd611077565b9050600081511115610e175760005b8151811015610e1557610df66040518060600160405280602981526020016130ba602991396121a8565b610e0233600554612241565b8080610e0d90612c95565b915050610dcc565b505b50565b60045481565b600260149054906101000a900467ffffffffffffffff1681565b60066020528060005260406000206000915090505481565b600a602052816000526040600020602052806000526040600020600091509150505481565b6000600760008054815260200190815260200160002090506000429050620186a08260000154610ea79190612c61565b421115610ec457620186a08260000154610ec19190612c61565b90505b600154826005015442610ed79190612beb565b610ee19190612bba565b8260020154610ef09190612c1f565b826003016000828254610f039190612c61565b9250508190555042826005018190555060006064600660008054815260200190815260200160002054610f369190612bba565b905060005b81811161103457600154600860008054815260200190815260200160002060008381526020019081526020016000206002015442610f799190612beb565b610f839190612bba565b6008600080548152602001908152602001600020600083815260200190815260200160002060000154610fb69190612c1f565b600860008054815260200190815260200160002060008381526020019081526020016000206001016000828254610fed9190612c61565b92505081905550426008600080548152602001908152602001600020600083815260200190815260200160002060020181905550808061102c90612c95565b915050610f3b565b50505050565b60015481565b6008602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60606000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008054815260200190815260200160002054905061110e6040518060400160405280601281526020017f207e20636865636b207e207573657249643a000000000000000000000000000081525082611b04565b6000600760008054815260200190815260200160002060405180610100016040529081600082015481526020016001820160009054906101000a900463ffffffff1663ffffffff1663ffffffff16815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682018054806020026020016040519081016040528092919081815260200182805480156111d757602002820191906000526020600020905b8154815260200190600101908083116111c3575b505050505081526020016007820160009054906101000a900460ff1660028111156112055761120461241b565b5b60028111156112175761121661241b565b5b8152505090506000600b600080548152602001908152602001600020600084815260200190815260200160002060405180606001604052908160008201548152602001600182015481526020016002820154815250509050600060648461127e9190612bba565b90506000600267ffffffffffffffff81111561129d5761129c61265a565b5b6040519080825280602002602001820160405280156112cb5781602001602082028036833780820191505090505b509050600082111561134f5760005b8281101561134d5760086000805481526020019081526020016000206000828152602001908152602001600020600101548260008151811061131f5761131e612ebd565b5b602002602001018181516113339190612c61565b91508181525050808061134590612c95565b9150506112da565b505b600160086000805481526020019081526020016000206000848152602001908152602001600020600101548260008151811061138e5761138d612ebd565b5b60200260200101516113a09190612c61565b6113aa9190612beb565b816001815181106113be576113bd612ebd565b5b6020026020010181815250506000600267ffffffffffffffff8111156113e7576113e661265a565b5b6040519080825280602002602001820160405280156114155781602001602082028036833780820191505090505b5090506000429050620186a086600001516114309190612c61565b42111561144d57620186a0866000015161144a9190612c61565b90505b60008711156115aa5760006064856114659190612c1f565b90505b8781101561155957600154600b600080548152602001908152602001600020600083815260200190815260200160002060020154426114a79190612beb565b6114b19190612bba565b600b6000805481526020019081526020016000206000838152602001908152602001600020600001546114e49190612c1f565b600b6000805481526020019081526020016000206000838152602001908152602001600020600101546115179190612c61565b8360008151811061152b5761152a612ebd565b5b6020026020010181815161153f9190612c61565b91508181525050808061155190612c95565b915050611468565b508260008151811061156e5761156d612ebd565b5b60200260200101518260008151811061158a57611589612ebd565b5b6020026020010181815161159e9190612c61565b915081815250506115e7565b826000815181106115be576115bd612ebd565b5b6020026020010151826000815181106115da576115d9612ebd565b5b6020026020010181815250505b600180548660400151426115fb9190612beb565b6116059190612bba565b86600001516116149190612c1f565b86602001518460008151811061162d5761162c612ebd565b5b602002602001015161163f9190612c61565b6116499190612c61565b6116539190612beb565b8260018151811061166757611666612ebd565b5b6020026020010181815250506000600760008054815260200190815260200160002060010160009054906101000a900463ffffffff1663ffffffff1667ffffffffffffffff8111156116bc576116bb61265a565b5b6040519080825280602002602001820160405280156116ea5781602001602082028036833780820191505090505b5090506000805b886020015163ffffffff168163ffffffff161015611802578860c001518163ffffffff168151811061172657611725612ebd565b5b60200260200101518560008151811061174257611741612ebd565b5b60200260200101511115801561179757508460018151811061176757611766612ebd565b5b60200260200101518960c001518263ffffffff168151811061178c5761178b612ebd565b5b602002602001015111155b156117ef578860c001518163ffffffff16815181106117b9576117b8612ebd565b5b60200260200101518383815181106117d4576117d3612ebd565b5b60200260200101818152505081806117eb90612c95565b9250505b80806117fa90612eec565b9150506116f1565b5060008111156118b1578067ffffffffffffffff8111156118265761182561265a565b5b6040519080825280602002602001820160405280156118545781602001602082028036833780820191505090505b50995060005b818110156118af5782818151811061187557611874612ebd565b5b60200260200101518b82815181106118905761188f612ebd565b5b60200260200101818152505080806118a790612c95565b91505061185a565b505b50505050505050505090565b60055481565b50565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6002601c9054906101000a900461ffff1681565b600b602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b6000600281111561194b5761194a61241b565b5b600760008054815260200190815260200160002060070160009054906101000a900460ff1660028111156119825761198161241b565b5b146119c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b990612f64565b60405180910390fd5b81600760008054815260200190815260200160002060040181905550426007600080548152602001908152602001600020600001819055506001600760008054815260200190815260200160002060070160006101000a81548160ff02191690836002811115611a3557611a3461241b565b5b021790555080600760008054815260200190815260200160002060010160006101000a81548163ffffffff021916908363ffffffff1602179055508063ffffffff1667ffffffffffffffff811115611a9057611a8f61265a565b5b604051908082528060200260200182016040528015611abe5781602001602082028036833780820191505090505b5060076000805481526020019081526020016000206006019080519060200190611ae9929190612302565b505050565b600360009054906101000a900463ffffffff1681565b611b9c8282604051602401611b1a929190612ff2565b6040516020818303038152906040527fb60e72cc000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122bc565b5050565b60006007600080548152602001908152602001600020905060005b8251811015611c2957828181518110611bd757611bd6612ebd565b5b602002602001015160076000805481526020019081526020016000206006018281548110611c0857611c07612ebd565b5b90600052602060002001819055508080611c2190612c95565b915050611bbb565b50505050565b6000600760008054815260200190815260200160002090506000429050620186a08260000154611c5f9190612c61565b421115611c7c57620186a08260000154611c799190612c61565b90505b600154826005015442611c8f9190612beb565b611c999190612bba565b8260020154611ca89190612c1f565b826003016000828254611cbb9190612c61565b9250508190555042826005018190555060008411156121a1578215611f345783826002016000828254611cee9190612c61565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614611f2f576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b600080548152602001908152602001600020600083815260200190815260200160002090506000606483611db79190612bba565b9050600154600860008054815260200190815260200160002060008381526020019081526020016000206002015442611df09190612beb565b611dfa9190612bba565b6008600080548152602001908152602001600020600083815260200190815260200160002060000154611e2d9190612c1f565b600860008054815260200190815260200160002060008381526020019081526020016000206001016000828254611e649190612c61565b9250508190555086600860008054815260200190815260200160002060008381526020019081526020016000206000016000828254611ea39190612c61565b9250508190555042600860008054815260200190815260200160002060008381526020019081526020016000206002018190555050600081600001541115611f2c57600154816002015442611ef89190612beb565b611f029190612bba565b8160000154611f119190612c1f565b816001016000828254611f249190612c61565b925050819055505b50505b6121a0565b83826002016000828254611f489190612beb565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461219f576000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000805481526020019081526020016000205490506000600b6000805481526020019081526020016000206000838152602001908152602001600020905060006064836120119190612bba565b905060015460086000805481526020019081526020016000206000838152602001908152602001600020600201544261204a9190612beb565b6120549190612bba565b60086000805481526020019081526020016000206000838152602001908152602001600020600001546120879190612c1f565b6008600080548152602001908152602001600020600083815260200190815260200160002060010160008282546120be9190612c61565b92505081905550866008600080548152602001908152602001600020600083815260200190815260200160002060000160008282546120fd9190612beb565b92505081905550426008600080548152602001908152602001600020600083815260200190815260200160002060020181905550506001548160020154426121459190612beb565b61214f9190612bba565b816000015461215e9190612c1f565b8160010160008282546121719190612c61565b925050819055508581600001600082825461218c9190612beb565b9250508190555042816002018190555050505b5b5b5050505050565b61223e816040516024016121bc9190613022565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506122bc565b50565b60008273ffffffffffffffffffffffffffffffffffffffff168260405161226790613075565b60006040518083038185875af1925050503d80600081146122a4576040519150601f19603f3d011682016040523d82523d6000602084013e6122a9565b606091505b50509050806122b757600080fd5b505050565b6122d3816122cb6122d66122f7565b63ffffffff16565b50565b60006a636f6e736f6c652e6c6f679050600080835160208501845afa505050565b61234f819050919050565b82805482825590600052602060002090810192821561233e579160200282015b8281111561233d578251825591602001919060010190612322565b5b50905061234b9190612359565b5090565b61235761308a565b565b5b8082111561237257600081600090555060010161235a565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61239d8161238a565b81146123a857600080fd5b50565b6000813590506123ba81612394565b92915050565b6000602082840312156123d6576123d5612380565b5b60006123e4848285016123ab565b91505092915050565b6123f68161238a565b82525050565b600063ffffffff82169050919050565b612415816123fc565b82525050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6003811061245b5761245a61241b565b5b50565b600081905061246c8261244a565b919050565b600061247c8261245e565b9050919050565b61248c81612471565b82525050565b600060e0820190506124a7600083018a6123ed565b6124b4602083018961240c565b6124c160408301886123ed565b6124ce60608301876123ed565b6124db60808301866123ed565b6124e860a08301856123ed565b6124f560c0830184612483565b98975050505050505050565b600067ffffffffffffffff82169050919050565b61251e81612501565b811461252957600080fd5b50565b60008135905061253b81612515565b92915050565b6000819050919050565b61255481612541565b811461255f57600080fd5b50565b6000813590506125718161254b565b92915050565b612580816123fc565b811461258b57600080fd5b50565b60008135905061259d81612577565b92915050565b600061ffff82169050919050565b6125ba816125a3565b81146125c557600080fd5b50565b6000813590506125d7816125b1565b92915050565b600080600080608085870312156125f7576125f6612380565b5b60006126058782880161252c565b945050602061261687828801612562565b93505060406126278782880161258e565b9250506060612638878288016125c8565b91505092959194509250565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269282612649565b810181811067ffffffffffffffff821117156126b1576126b061265a565b5b80604052505050565b60006126c4612376565b90506126d08282612689565b919050565b600067ffffffffffffffff8211156126f0576126ef61265a565b5b602082029050602081019050919050565b600080fd5b6000612719612714846126d5565b6126ba565b9050808382526020820190506020840283018581111561273c5761273b612701565b5b835b81811015612765578061275188826123ab565b84526020840193505060208101905061273e565b5050509392505050565b600082601f83011261278457612783612644565b5b8135612794848260208601612706565b91505092915050565b600080604083850312156127b4576127b3612380565b5b60006127c2858286016123ab565b925050602083013567ffffffffffffffff8111156127e3576127e2612385565b5b6127ef8582860161276f565b9150509250929050565b600060208201905061280e60008301846123ed565b92915050565b61281d81612541565b82525050565b60006020820190506128386000830184612814565b92915050565b61284781612501565b82525050565b6000602082019050612862600083018461283e565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061289382612868565b9050919050565b6128a381612888565b81146128ae57600080fd5b50565b6000813590506128c08161289a565b92915050565b600080604083850312156128dd576128dc612380565b5b60006128eb858286016128b1565b92505060206128fc858286016123ab565b9150509250929050565b6000806040838503121561291d5761291c612380565b5b600061292b858286016123ab565b925050602061293c858286016123ab565b9150509250929050565b600060608201905061295b60008301866123ed565b61296860208301856123ed565b61297560408301846123ed565b949350505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6129b28161238a565b82525050565b60006129c483836129a9565b60208301905092915050565b6000602082019050919050565b60006129e88261297d565b6129f28185612988565b93506129fd83612999565b8060005b83811015612a2e578151612a1588826129b8565b9750612a20836129d0565b925050600181019050612a01565b5085935050505092915050565b60006020820190508181036000830152612a5581846129dd565b905092915050565b6000819050919050565b6000612a82612a7d612a7884612868565b612a5d565b612868565b9050919050565b6000612a9482612a67565b9050919050565b6000612aa682612a89565b9050919050565b612ab681612a9b565b82525050565b6000602082019050612ad16000830184612aad565b92915050565b612ae0816125a3565b82525050565b6000602082019050612afb6000830184612ad7565b92915050565b60008060408385031215612b1857612b17612380565b5b6000612b26858286016123ab565b9250506020612b378582860161258e565b9150509250929050565b6000602082019050612b56600083018461240c565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612bc58261238a565b9150612bd08361238a565b925082612be057612bdf612b5c565b5b828204905092915050565b6000612bf68261238a565b9150612c018361238a565b9250828203905081811115612c1957612c18612b8b565b5b92915050565b6000612c2a8261238a565b9150612c358361238a565b9250828202612c438161238a565b91508282048414831517612c5a57612c59612b8b565b5b5092915050565b6000612c6c8261238a565b9150612c778361238a565b9250828201905080821115612c8f57612c8e612b8b565b5b92915050565b6000612ca08261238a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612cd257612cd1612b8b565b5b600182019050919050565b600060a082019050612cf26000830188612814565b612cff602083018761283e565b612d0c6040830186612ad7565b612d19606083018561240c565b612d26608083018461240c565b9695505050505050565b612d3981612888565b82525050565b6000604082019050612d546000830185612d30565b612d616020830184612d30565b9392505050565b600082825260208201905092915050565b7f496e73756666696369656e74206465706f736974000000000000000000000000600082015250565b6000612daf601483612d68565b9150612dba82612d79565b602082019050919050565b60006020820190508181036000830152612dde81612da2565b9050919050565b7f506f6f6c206973206e6f74207374617274656420796574000000000000000000600082015250565b6000612e1b601783612d68565b9150612e2682612de5565b602082019050919050565b60006020820190508181036000830152612e4a81612e0e565b9050919050565b7f4e6f7468696e6720746f207374616b6500000000000000000000000000000000600082015250565b6000612e87601083612d68565b9150612e9282612e51565b602082019050919050565b60006020820190508181036000830152612eb681612e7a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612ef7826123fc565b915063ffffffff8203612f0d57612f0c612b8b565b5b600182019050919050565b7f506f6f6c20616c72656164792073746172746564000000000000000000000000600082015250565b6000612f4e601483612d68565b9150612f5982612f18565b602082019050919050565b60006020820190508181036000830152612f7d81612f41565b9050919050565b600081519050919050565b60005b83811015612fad578082015181840152602081019050612f92565b60008484015250505050565b6000612fc482612f84565b612fce8185612d68565b9350612fde818560208601612f8f565b612fe781612649565b840191505092915050565b6000604082019050818103600083015261300c8185612fb9565b905061301b60208301846123ed565b9392505050565b6000602082019050818103600083015261303c8184612fb9565b905092915050565b600081905092915050565b50565b600061305f600083613044565b915061306a8261304f565b600082019050919050565b600061308082613052565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fdfe3131313131313131313131313131313131313131313131313131313131313131313131313131313131a26469706673582212206e488a4d16db05eeff069d33135c828edc9b00168103a627c9ef8d61744ddcf664736f6c63430008140033