Polygon Sponsored slots available. Book your slot here!
More Info
Private Name Tags
ContractCreator
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Event | 53219185 | 344 days ago | IN | 0.01 POL | 0.03798802 | ||||
Add Member | 33009040 | 857 days ago | IN | 0 POL | 0.04854957 | ||||
Create Event | 33009020 | 857 days ago | IN | 0.01 POL | 0.03672776 | ||||
Add Member | 30883923 | 912 days ago | IN | 0 POL | 0.05141602 | ||||
Create Event | 30883898 | 912 days ago | IN | 0.01 POL | 0.04828911 | ||||
Add Member | 30786543 | 915 days ago | IN | 0 POL | 0.05016789 | ||||
Create Event | 30786532 | 915 days ago | IN | 0.01 POL | 0.04313369 | ||||
Add Member | 30680625 | 918 days ago | IN | 0 POL | 0.44683119 | ||||
Add Member | 30680616 | 918 days ago | IN | 0 POL | 0.55356386 | ||||
Add Member | 30680516 | 918 days ago | IN | 0 POL | 0.83895768 | ||||
Create Event | 30680499 | 918 days ago | IN | 0.01 POL | 0.5377974 | ||||
Create Event | 30680418 | 918 days ago | IN | 0.01 POL | 0.66701439 | ||||
Create Event | 30674672 | 918 days ago | IN | 0.01 POL | 0.03826611 | ||||
Add Member | 30669445 | 918 days ago | IN | 0 POL | 0.02686407 | ||||
Add Member | 30606006 | 920 days ago | IN | 0 POL | 0.04855236 | ||||
Create Event | 30605771 | 920 days ago | IN | 0.01 POL | 0.04523108 | ||||
Add Member | 30584364 | 920 days ago | IN | 0 POL | 0.05016793 | ||||
Create Event | 30584349 | 920 days ago | IN | 0.01 POL | 0.05010194 | ||||
Add Member | 30558181 | 921 days ago | IN | 0 POL | 0.02698958 | ||||
Add Member | 30549417 | 921 days ago | IN | 0 POL | 0.04854957 | ||||
Create Event | 30549374 | 921 days ago | IN | 0.01 POL | 0.04223704 | ||||
Add Member | 30546095 | 921 days ago | IN | 0 POL | 0.02782932 | ||||
Add Member | 30544827 | 921 days ago | IN | 0 POL | 0.04854957 | ||||
Create Event | 30543054 | 921 days ago | IN | 0.01 POL | 0.04883792 |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ZKTokenProof
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicense pragma solidity ^0.8.9; import "hardhat/console.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@semaphore-protocol/contracts/base/SemaphoreCore.sol"; import "@semaphore-protocol/contracts/base/SemaphoreGroups.sol"; import "@semaphore-protocol/contracts/interfaces/IVerifier.sol"; import "./interfaces/IZKTokenProof.sol"; error NotRelayer(address relayerAddress); error InvalidTreeDepth(uint8 depth); error EventNotFound(uint256 eventId); error InsufficientFee(uint256 requiredFee, uint256 actual); error InsufficientEventFee(uint256 requiredFee, uint256 actual); error InvalidContractAddress(address contractAddress); error AlreadyRelayer(address relayerAddress); contract ZKTokenProof is IZKTokenProof, SemaphoreCore, SemaphoreGroups, Ownable { /// @dev fee for each event creation uint256 public fee; /// @dev Gets a tree depth and returns its verifier address. mapping(uint8 => IVerifier) public verifiers; /// @dev Mapping of relayers. mapping(address => bool) public relayers; /// @dev Mappng of events. mapping(uint256 => Event) public events; /// @dev Checks if there is a verifier for the given tree depth. /// @param depth: Depth of the tree. modifier onlySupportedDepth(uint8 depth) { if (address(verifiers[depth]) == address(0)) { revert InvalidTreeDepth(depth); } _; } /// @dev Checks if the msg.sender is one of the relayers. modifier onlyRelayer() { if (!relayers[_msgSender()]) { revert NotRelayer(_msgSender()); } _; } /// @dev Initializes the Semaphore verifiers, relayers used to verify the user's ZK proofs, to add members to group. /// @param _verifiers: List of Semaphore verifiers (address and related Merkle tree depth). /// @param _relayers: List of relayers' addresses. /// @param _fee: fee of each event creation. constructor( Verifier[] memory _verifiers, address[] memory _relayers, uint256 _fee ) { uint8 i = 0; for (; i < _verifiers.length; i++) { verifiers[_verifiers[i].merkleTreeDepth] = IVerifier( _verifiers[i].contractAddress ); } for (i = 0; i < _relayers.length; i++) { relayers[_relayers[i]] = true; } fee = _fee; } /** * Receive function */ receive() external payable {} /** * Fallback function */ fallback() external payable {} ///@dev see {IZKTokenProof-isEligible} function isEligible(uint256 _eventId, address _target) public view returns (bool) { return events[_eventId].contractAddress != address(0) && IERC721(events[_eventId].contractAddress).balanceOf(_target) != 0; } ///@dev see {IZKTokenProof-verifyMembership} function verifyMembership( uint256 _eventId, bytes32 _signal, uint256 _nullifierHash, uint256 _externalNullifier, uint256[8] calldata _proof ) public view returns (bool) { uint256 root = getRoot(_eventId); uint8 depth = getDepth(_eventId); if (depth == 0) { revert EventNotFound(_eventId); } // we do not need to save nullfierHash because // we only need to make sure the merkle tree inclusion proof. // _saveNullifierHash IVerifier verifier = verifiers[depth]; _verifyProof( _signal, root, _nullifierHash, _externalNullifier, _proof, verifier ); return true; } function verifyMembershipWithFee( uint256 _eventId, bytes32 _signal, uint256 _nullifierHash, uint256 _externalNullifier, uint256[8] calldata _proof ) public payable { verifyMembership( _eventId, _signal, _nullifierHash, _externalNullifier, _proof ); Event memory targetEvent = events[_eventId]; if (msg.value < targetEvent.fee) { revert InsufficientEventFee(targetEvent.fee, msg.value); } // verifyMembership with payment can be called only once. _saveNullifierHash(_nullifierHash); (bool success, ) = events[_eventId].adminAddress.call{value: msg.value}( "" ); require(success, "Transfer Failed"); } ///@dev see {IZKTokenProof-createEvent}. function createEvent( uint256 _eventId, uint8 _depth, uint256 _zeroValue, address _contractAddress, string calldata _title, uint256 _fee ) external payable onlySupportedDepth(_depth) { // check event creation fee if (msg.value < fee) { revert InsufficientFee(fee, msg.value); } // check if the contract address has the ERC721 interface bytes4 ERC721InterfaceId = type(IERC721).interfaceId; if (!IERC721(_contractAddress).supportsInterface(ERC721InterfaceId)) { revert InvalidContractAddress(_contractAddress); } // create group _createGroup(_eventId, _depth, _zeroValue); // create event events[_eventId] = Event({ adminAddress: msg.sender, contractAddress: _contractAddress, title: _title, fee: _fee, createdAt: block.timestamp }); // emit event emit EventCreated( _eventId, _depth, _zeroValue, _contractAddress, msg.sender, _title, _fee ); } ///@dev see {IZKTokenProof-addVerifier} function addVerifier(Verifier memory _verifier) public onlyOwner { verifiers[_verifier.merkleTreeDepth] = IVerifier( _verifier.contractAddress ); emit VerifierAdded(_verifier); } ///@dev see {IZKTokenProof-removeVerifier} function removeVerifier(Verifier memory _verifier) public onlyOwner { delete verifiers[_verifier.merkleTreeDepth]; emit VerifierRemoved(_verifier); } ///@dev see {IZKTokenProof-addRelayer} function addRelayer(address _relayer) public onlyOwner { if (relayers[_relayer]) { revert AlreadyRelayer(_relayer); } relayers[_relayer] = true; emit RelayerAdded(_relayer); } ///@dev see {IZKTokenProof-removeRelayer} function removeRelayer(address _relayer) public onlyOwner { if (!relayers[_relayer]) { revert NotRelayer(_relayer); } relayers[_relayer] = false; emit RelayerRemoved(_relayer); } ///@dev see {IZKTokenProof-addMember} function addMember(uint256 _eventId, uint256 _identityCommitment) public onlyRelayer { _addMember(_eventId, _identityCommitment); } ///@dev see {IZKTokenProof-removeMember} function removeMember( uint256 _eventId, uint256 _identityCommitment, uint256[] calldata _proofSiblings, uint8[] calldata _proofPathIndices ) public onlyRelayer { _removeMember( _eventId, _identityCommitment, _proofSiblings, _proofPathIndices ); } ///@dev see {IZKTokenProof-withdraw} function withdraw() external onlyOwner { require(address(this).balance > 0, "Not Enough Balance Of Contract"); (bool success, ) = owner().call{value: address(this).balance}(""); require(success, "Transfer Failed"); emit Withdraw(msg.sender); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int)", p0)); } function logUint(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1)); } function log(uint p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1)); } function log(uint p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1)); } function log(uint p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1)); } function log(string memory p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2)); } function log(uint p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2)); } function log(uint p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2)); } function log(uint p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2)); } function log(uint p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2)); } function log(uint p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2)); } function log(uint p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2)); } function log(uint p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2)); } function log(uint p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2)); } function log(uint p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2)); } function log(uint p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2)); } function log(uint p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2)); } function log(uint p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2)); } function log(uint p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2)); } function log(uint p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2)); } function log(uint p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2)); } function log(string memory p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2)); } function log(string memory p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2)); } function log(string memory p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2)); } function log(string memory p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2)); } function log(bool p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2)); } function log(bool p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2)); } function log(bool p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2)); } function log(address p0, uint p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2)); } function log(address p0, uint p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2)); } function log(address p0, uint p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3)); } function log(uint p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3)); } function log(uint p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3)); } function log(uint p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3)); } function log(uint p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.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 be 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: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import "../interfaces/ISemaphoreCore.sol"; import "../interfaces/IVerifier.sol"; /// @title Semaphore core contract. /// @notice Minimal code to allow users to signal their endorsement of an arbitrary string. /// @dev The following code verifies that the proof is correct and saves the hash of the /// nullifier to prevent double-signaling. External nullifier and Merkle trees (i.e. groups) must be /// managed externally. contract SemaphoreCore is ISemaphoreCore { /// @dev Gets a nullifier hash and returns true or false. /// It is used to prevent double-signaling. mapping(uint256 => bool) internal nullifierHashes; /// @dev Asserts that no nullifier already exists and if the zero-knowledge proof is valid. /// Otherwise it reverts. /// @param signal: Semaphore signal. /// @param root: Root of the Merkle tree. /// @param nullifierHash: Nullifier hash. /// @param externalNullifier: External nullifier. /// @param proof: Zero-knowledge proof. /// @param verifier: Verifier address. function _verifyProof( bytes32 signal, uint256 root, uint256 nullifierHash, uint256 externalNullifier, uint256[8] calldata proof, IVerifier verifier ) internal view { require(!nullifierHashes[nullifierHash], "SemaphoreCore: you cannot use the same nullifier twice"); uint256 signalHash = _hashSignal(signal); verifier.verifyProof( [proof[0], proof[1]], [[proof[2], proof[3]], [proof[4], proof[5]]], [proof[6], proof[7]], [root, nullifierHash, signalHash, externalNullifier] ); } /// @dev Stores the nullifier hash to prevent double-signaling. /// Attention! Remember to call it when you verify a proof if you /// need to prevent double-signaling. /// @param nullifierHash: Semaphore nullifier hash. function _saveNullifierHash(uint256 nullifierHash) internal { nullifierHashes[nullifierHash] = true; } /// @dev Creates a keccak256 hash of the signal. /// @param signal: Semaphore signal. /// @return Hash of the signal. function _hashSignal(bytes32 signal) private pure returns (uint256) { return uint256(keccak256(abi.encodePacked(signal))) >> 8; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {SNARK_SCALAR_FIELD} from "./SemaphoreConstants.sol"; import "../interfaces/ISemaphoreGroups.sol"; import "@zk-kit/incremental-merkle-tree.sol/contracts/IncrementalBinaryTree.sol"; import "@openzeppelin/contracts/utils/Context.sol"; /// @title Semaphore groups contract. /// @dev The following code allows you to create groups, add and remove members. /// You can use getters to obtain informations about groups (root, depth, number of leaves). abstract contract SemaphoreGroups is Context, ISemaphoreGroups { using IncrementalBinaryTree for IncrementalTreeData; /// @dev Gets a group id and returns the group/tree data. mapping(uint256 => IncrementalTreeData) internal groups; /// @dev Creates a new group by initializing the associated tree. /// @param groupId: Id of the group. /// @param depth: Depth of the tree. /// @param zeroValue: Zero value of the tree. function _createGroup( uint256 groupId, uint8 depth, uint256 zeroValue ) internal virtual { require(groupId < SNARK_SCALAR_FIELD, "SemaphoreGroups: group id must be < SNARK_SCALAR_FIELD"); require(getDepth(groupId) == 0, "SemaphoreGroups: group already exists"); groups[groupId].init(depth, zeroValue); emit GroupCreated(groupId, depth, zeroValue); } /// @dev Adds an identity commitment to an existing group. /// @param groupId: Id of the group. /// @param identityCommitment: New identity commitment. function _addMember(uint256 groupId, uint256 identityCommitment) internal virtual { require(getDepth(groupId) != 0, "SemaphoreGroups: group does not exist"); groups[groupId].insert(identityCommitment); uint256 root = getRoot(groupId); emit MemberAdded(groupId, identityCommitment, root); } /// @dev Removes an identity commitment from an existing group. A proof of membership is /// needed to check if the node to be deleted is part of the tree. /// @param groupId: Id of the group. /// @param identityCommitment: Existing identity commitment to be deleted. /// @param proofSiblings: Array of the sibling nodes of the proof of membership. /// @param proofPathIndices: Path of the proof of membership. function _removeMember( uint256 groupId, uint256 identityCommitment, uint256[] calldata proofSiblings, uint8[] calldata proofPathIndices ) internal virtual { require(getDepth(groupId) != 0, "SemaphoreGroups: group does not exist"); groups[groupId].remove(identityCommitment, proofSiblings, proofPathIndices); uint256 root = getRoot(groupId); emit MemberRemoved(groupId, identityCommitment, root); } /// @dev See {ISemaphoreGroups-getRoot}. function getRoot(uint256 groupId) public view virtual override returns (uint256) { return groups[groupId].root; } /// @dev See {ISemaphoreGroups-getDepth}. function getDepth(uint256 groupId) public view virtual override returns (uint8) { return groups[groupId].depth; } /// @dev See {ISemaphoreGroups-getNumberOfLeaves}. function getNumberOfLeaves(uint256 groupId) public view virtual override returns (uint256) { return groups[groupId].numberOfLeaves; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title Verifier interface. /// @dev Interface of Verifier contract. interface IVerifier { function verifyProof( uint256[2] memory a, uint256[2][2] memory b, uint256[2] memory c, uint256[4] memory input ) external view; }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.9; /// @title ZKTokenProof interface. /// @dev Interface of a ZKTokenProof contract. interface IZKTokenProof { struct Verifier { address contractAddress; uint8 merkleTreeDepth; } struct Event { address adminAddress; address contractAddress; string title; uint256 fee; uint256 createdAt; } /// @dev Emitted when a new event is created. /// @param eventId: Id of the group. /// @param depth: Depth of the tree. /// @param zeroValue: Zero value of the tree. /// @param contractAddress: Target NFT contract address. /// @param adminAddress: Admin of the group. /// @param title: Event title for the event. /// @param fee: Event fee that admin can earn for the event. event EventCreated( uint256 indexed eventId, uint8 depth, uint256 zeroValue, address indexed contractAddress, address indexed adminAddress, string title, uint256 fee ); /// @dev Emmited when verifier added /// @param verifier: Added verifier. event VerifierAdded(Verifier verifier); /// @dev Emmited when verifier removed /// @param verifier: Removed verifier. event VerifierRemoved(Verifier verifier); /// @dev Emmited when relayer added /// @param relayerAddress: Added relayer address. event RelayerAdded(address indexed relayerAddress); /// @dev Emmited when relayer removed /// @param relayerAddress: Removed relayer address. event RelayerRemoved(address indexed relayerAddress); /// @dev Emitted when withdrawn event Withdraw(address indexed operator); /// @dev Check if the target address is eligible to join the event /// @param _eventId: Id of the event. /// @param _target: Address to check the eligibility. /// @return bool function isEligible(uint256 _eventId, address _target) external view returns (bool); /// @dev Prove membership /// @param _eventId: Id of the event. /// @param _signal: Signal. /// @param _nullifierHash: NullifierHash. /// @param _externalNullifier: ExternalNullifier. /// @param _proof: Proof. /// @return bool function verifyMembership( uint256 _eventId, bytes32 _signal, uint256 _nullifierHash, uint256 _externalNullifier, uint256[8] calldata _proof ) external view returns (bool); /// @dev Prove membership, pay fee and save nullifierHash. /// @param _eventId: Id of the event. /// @param _signal: Signal. /// @param _nullifierHash: NullifierHash. /// @param _externalNullifier: ExternalNullifier. /// @param _proof: Proof. function verifyMembershipWithFee( uint256 _eventId, bytes32 _signal, uint256 _nullifierHash, uint256 _externalNullifier, uint256[8] calldata _proof ) external payable; /// @dev Create an event. /// @param _eventId: Id of the group. /// @param _depth: Depth of the tree. /// @param _zeroValue: Zero value of the tree. /// @param _contractAddress: Target NFT contract address. /// @param _title: Event title. /// @param _fee: Fee for event participation. function createEvent( uint256 _eventId, uint8 _depth, uint256 _zeroValue, address _contractAddress, string calldata _title, uint256 _fee ) external payable; /// @dev Add member to the event by relayers. /// @param _eventId: Id of the event. /// @param _identityCommitment: Identity Commitment of participant. function addMember(uint256 _eventId, uint256 _identityCommitment) external; /// @dev Remove member to the event by relayers. /// @param _eventId: Id of the event. /// @param _identityCommitment: Identity Commitment of participant. /// @param _proofSiblings: Array of the sibling nodes of the proof of membership. /// @param _proofPathIndices: Path of the proof of membership. function removeMember( uint256 _eventId, uint256 _identityCommitment, uint256[] calldata _proofSiblings, uint8[] calldata _proofPathIndices ) external; /// @dev Add a relayer /// @param _relayer: Relayer address to be added. function addRelayer(address _relayer) external; /// @dev Remove a relayer /// @param _relayer: Relayer address to be removed. function removeRelayer(address _relayer) external; /// @dev Withdraw values in this contract. function withdraw() external; }
// 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title SemaphoreCore interface. /// @dev Interface of SemaphoreCore contract. interface ISemaphoreCore { /// @notice Emitted when a proof is verified correctly and a new nullifier hash is added. /// @param nullifierHash: Hash of external and identity nullifiers. event NullifierHashAdded(uint256 nullifierHash); }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; uint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @title SemaphoreGroups interface. /// @dev Interface of a SemaphoreGroups contract. interface ISemaphoreGroups { /// @dev Emitted when a new group is created. /// @param groupId: Id of the group. /// @param depth: Depth of the tree. /// @param zeroValue: Zero value of the tree. event GroupCreated(uint256 indexed groupId, uint8 depth, uint256 zeroValue); /// @dev Emitted when a new identity commitment is added. /// @param groupId: Group id of the group. /// @param identityCommitment: New identity commitment. /// @param root: New root hash of the tree. event MemberAdded(uint256 indexed groupId, uint256 identityCommitment, uint256 root); /// @dev Emitted when a new identity commitment is removed. /// @param groupId: Group id of the group. /// @param identityCommitment: New identity commitment. /// @param root: New root hash of the tree. event MemberRemoved(uint256 indexed groupId, uint256 identityCommitment, uint256 root); /// @dev Returns the last root hash of a group. /// @param groupId: Id of the group. /// @return Root hash of the group. function getRoot(uint256 groupId) external view returns (uint256); /// @dev Returns the depth of the tree of a group. /// @param groupId: Id of the group. /// @return Depth of the group tree. function getDepth(uint256 groupId) external view returns (uint8); /// @dev Returns the number of tree leaves of a group. /// @param groupId: Id of the group. /// @return Number of tree leaves. function getNumberOfLeaves(uint256 groupId) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; import {PoseidonT3} from "./Hashes.sol"; // Each incremental tree has certain properties and data that will // be used to add new leaves. struct IncrementalTreeData { uint8 depth; // Depth of the tree (levels - 1). uint256 root; // Root hash of the tree. uint256 numberOfLeaves; // Number of leaves of the tree. mapping(uint256 => uint256) zeroes; // Zero hashes used for empty nodes (level -> zero hash). // The nodes of the subtrees used in the last addition of a leaf (level -> [left node, right node]). mapping(uint256 => uint256[2]) lastSubtrees; // Caching these values is essential to efficient appends. } /// @title Incremental binary Merkle tree. /// @dev The incremental tree allows to calculate the root hash each time a leaf is added, ensuring /// the integrity of the tree. library IncrementalBinaryTree { uint8 internal constant MAX_DEPTH = 32; uint256 internal constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617; /// @dev Initializes a tree. /// @param self: Tree data. /// @param depth: Depth of the tree. /// @param zero: Zero value to be used. function init( IncrementalTreeData storage self, uint8 depth, uint256 zero ) public { require(zero < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD"); require(depth > 0 && depth <= MAX_DEPTH, "IncrementalBinaryTree: tree depth must be between 1 and 32"); self.depth = depth; for (uint8 i = 0; i < depth; i++) { self.zeroes[i] = zero; zero = PoseidonT3.poseidon([zero, zero]); } self.root = zero; } /// @dev Inserts a leaf in the tree. /// @param self: Tree data. /// @param leaf: Leaf to be inserted. function insert(IncrementalTreeData storage self, uint256 leaf) public { require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD"); require(self.numberOfLeaves < 2**self.depth, "IncrementalBinaryTree: tree is full"); uint256 index = self.numberOfLeaves; uint256 hash = leaf; for (uint8 i = 0; i < self.depth; i++) { if (index % 2 == 0) { self.lastSubtrees[i] = [hash, self.zeroes[i]]; } else { self.lastSubtrees[i][1] = hash; } hash = PoseidonT3.poseidon(self.lastSubtrees[i]); index /= 2; } self.root = hash; self.numberOfLeaves += 1; } /// @dev Removes a leaf from the tree. /// @param self: Tree data. /// @param leaf: Leaf to be removed. /// @param proofSiblings: Array of the sibling nodes of the proof of membership. /// @param proofPathIndices: Path of the proof of membership. function remove( IncrementalTreeData storage self, uint256 leaf, uint256[] calldata proofSiblings, uint8[] calldata proofPathIndices ) public { require(verify(self, leaf, proofSiblings, proofPathIndices), "IncrementalBinaryTree: leaf is not part of the tree"); uint256 hash = self.zeroes[0]; for (uint8 i = 0; i < self.depth; i++) { if (proofPathIndices[i] == 0) { if (proofSiblings[i] == self.lastSubtrees[i][1]) { self.lastSubtrees[i][0] = hash; } hash = PoseidonT3.poseidon([hash, proofSiblings[i]]); } else { if (proofSiblings[i] == self.lastSubtrees[i][0]) { self.lastSubtrees[i][1] = hash; } hash = PoseidonT3.poseidon([proofSiblings[i], hash]); } } self.root = hash; } /// @dev Verify if the path is correct and the leaf is part of the tree. /// @param self: Tree data. /// @param leaf: Leaf to be removed. /// @param proofSiblings: Array of the sibling nodes of the proof of membership. /// @param proofPathIndices: Path of the proof of membership. /// @return True or false. function verify( IncrementalTreeData storage self, uint256 leaf, uint256[] calldata proofSiblings, uint8[] calldata proofPathIndices ) private view returns (bool) { require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD"); require( proofPathIndices.length == self.depth && proofSiblings.length == self.depth, "IncrementalBinaryTree: length of path is not correct" ); uint256 hash = leaf; for (uint8 i = 0; i < self.depth; i++) { require( proofSiblings[i] < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: sibling node must be < SNARK_SCALAR_FIELD" ); if (proofPathIndices[i] == 0) { hash = PoseidonT3.poseidon([hash, proofSiblings[i]]); } else { hash = PoseidonT3.poseidon([proofSiblings[i], hash]); } } return hash == self.root; } }
//SPDX-License-Identifier: MIT pragma solidity ^0.8.4; library PoseidonT3 { function poseidon(uint256[2] memory) public pure returns (uint256) {} } library PoseidonT6 { function poseidon(uint256[5] memory) public pure returns (uint256) {} }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": { "@zk-kit/incremental-merkle-tree.sol/contracts/IncrementalBinaryTree.sol": { "IncrementalBinaryTree": "0x325cc80c4b5fffd1be186adbd2ba43ab2cfab460" } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier[]","name":"_verifiers","type":"tuple[]"},{"internalType":"address[]","name":"_relayers","type":"address[]"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"AlreadyRelayer","type":"error"},{"inputs":[{"internalType":"uint256","name":"eventId","type":"uint256"}],"name":"EventNotFound","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientEventFee","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"},{"internalType":"uint256","name":"actual","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"InvalidContractAddress","type":"error"},{"inputs":[{"internalType":"uint8","name":"depth","type":"uint8"}],"name":"InvalidTreeDepth","type":"error"},{"inputs":[{"internalType":"address","name":"relayerAddress","type":"address"}],"name":"NotRelayer","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"eventId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"depth","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"zeroValue","type":"uint256"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"adminAddress","type":"address"},{"indexed":false,"internalType":"string","name":"title","type":"string"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"EventCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"depth","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"zeroValue","type":"uint256"}],"name":"GroupCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"identityCommitment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"root","type":"uint256"}],"name":"MemberAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"identityCommitment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"root","type":"uint256"}],"name":"MemberRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nullifierHash","type":"uint256"}],"name":"NullifierHashAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayerAddress","type":"address"}],"name":"RelayerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"relayerAddress","type":"address"}],"name":"RelayerRemoved","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"indexed":false,"internalType":"struct IZKTokenProof.Verifier","name":"verifier","type":"tuple"}],"name":"VerifierAdded","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"indexed":false,"internalType":"struct IZKTokenProof.Verifier","name":"verifier","type":"tuple"}],"name":"VerifierRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"}],"name":"Withdraw","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint256","name":"_identityCommitment","type":"uint256"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"addRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier","name":"_verifier","type":"tuple"}],"name":"addVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint8","name":"_depth","type":"uint8"},{"internalType":"uint256","name":"_zeroValue","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_title","type":"string"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"createEvent","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"events","outputs":[{"internalType":"address","name":"adminAddress","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getDepth","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getNumberOfLeaves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"getRoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"address","name":"_target","type":"address"}],"name":"isEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"relayers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"uint256","name":"_identityCommitment","type":"uint256"},{"internalType":"uint256[]","name":"_proofSiblings","type":"uint256[]"},{"internalType":"uint8[]","name":"_proofPathIndices","type":"uint8[]"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_relayer","type":"address"}],"name":"removeRelayer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint8","name":"merkleTreeDepth","type":"uint8"}],"internalType":"struct IZKTokenProof.Verifier","name":"_verifier","type":"tuple"}],"name":"removeVerifier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"verifiers","outputs":[{"internalType":"contract IVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"bytes32","name":"_signal","type":"bytes32"},{"internalType":"uint256","name":"_nullifierHash","type":"uint256"},{"internalType":"uint256","name":"_externalNullifier","type":"uint256"},{"internalType":"uint256[8]","name":"_proof","type":"uint256[8]"}],"name":"verifyMembership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eventId","type":"uint256"},{"internalType":"bytes32","name":"_signal","type":"bytes32"},{"internalType":"uint256","name":"_nullifierHash","type":"uint256"},{"internalType":"uint256","name":"_externalNullifier","type":"uint256"},{"internalType":"uint256[8]","name":"_proof","type":"uint256[8]"}],"name":"verifyMembershipWithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003ceb38038062003ceb833981810160405281019062000037919062000637565b620000576200004b620001ce60201b60201c565b620001d660201b60201c565b60005b83518160ff1610156200011d57838160ff168151811062000080576200007f620006d1565b5b60200260200101516000015160046000868460ff1681518110620000a957620000a8620006d1565b5b60200260200101516020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808062000114906200072f565b9150506200005a565b600090505b82518160ff161015620001bd57600160056000858460ff16815181106200014e576200014d620006d1565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620001b4906200072f565b91505062000122565b81600381905550505050506200075e565b600033905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200030082620002b5565b810181811067ffffffffffffffff82111715620003225762000321620002c6565b5b80604052505050565b6000620003376200029c565b9050620003458282620002f5565b919050565b600067ffffffffffffffff821115620003685762000367620002c6565b5b602082029050602081019050919050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003b08262000383565b9050919050565b620003c281620003a3565b8114620003ce57600080fd5b50565b600081519050620003e281620003b7565b92915050565b600060ff82169050919050565b6200040081620003e8565b81146200040c57600080fd5b50565b6000815190506200042081620003f5565b92915050565b6000604082840312156200043f576200043e6200037e565b5b6200044b60406200032b565b905060006200045d84828501620003d1565b600083015250602062000473848285016200040f565b60208301525092915050565b60006200049662000490846200034a565b6200032b565b90508083825260208201905060408402830185811115620004bc57620004bb62000379565b5b835b81811015620004e95780620004d4888262000426565b845260208401935050604081019050620004be565b5050509392505050565b600082601f8301126200050b576200050a620002b0565b5b81516200051d8482602086016200047f565b91505092915050565b600067ffffffffffffffff821115620005445762000543620002c6565b5b602082029050602081019050919050565b60006200056c620005668462000526565b6200032b565b9050808382526020820190506020840283018581111562000592576200059162000379565b5b835b81811015620005bf5780620005aa8882620003d1565b84526020840193505060208101905062000594565b5050509392505050565b600082601f830112620005e157620005e0620002b0565b5b8151620005f384826020860162000555565b91505092915050565b6000819050919050565b6200061181620005fc565b81146200061d57600080fd5b50565b600081519050620006318162000606565b92915050565b600080600060608486031215620006535762000652620002a6565b5b600084015167ffffffffffffffff811115620006745762000673620002ab565b5b6200068286828701620004f3565b935050602084015167ffffffffffffffff811115620006a657620006a5620002ab565b5b620006b486828701620005c9565b9250506040620006c78682870162000620565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200073c82620003e8565b915060ff82141562000753576200075262000700565b5b600182019050919050565b61357d806200076e6000396000f3fe60806040526004361061012e5760003560e01c806360f0a5ac116100ab578063b9c78c2b1161006f578063b9c78c2b146103de578063ba0422161461041b578063d1b2dd2814610458578063dd39f00d14610481578063ddca3f43146104aa578063f2fde38b146104d557610135565b806360f0a5ac146102f9578063715018a61461032257806375e618c9146103395780638da5cb5b146103765780639b24b3b0146103a157610135565b80633ccfd60b116100f25780633ccfd60b1461022357806343989f851461023a5780634b426eae146102635780635300f8411461027f578063592e0e00146102bc57610135565b8063057241b8146101375780630b791430146101535780631783efc3146101945780631c1370b2146101bd5780632d69be98146101e657610135565b3661013557005b005b610151600480360381019061014c91906121c3565b6104fe565b005b34801561015f57600080fd5b5061017a6004803603810190610175919061223f565b6107c3565b60405161018b959493929190612355565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b691906123af565b6108c1565b005b3480156101c957600080fd5b506101e460048036038101906101df9190612524565b61096b565b005b3480156101f257600080fd5b5061020d60048036038101906102089190612551565b610a81565b60405161021a91906125dd565b60405180910390f35b34801561022f57600080fd5b50610238610ab4565b005b34801561024657600080fd5b50610261600480360381019061025c91906126ae565b610c6c565b005b61027d600480360381019061027891906127ab565b610d1e565b005b34801561028b57600080fd5b506102a660048036038101906102a1919061285a565b6110f4565b6040516102b391906128a2565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906128bd565b611114565b6040516102f091906128a2565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061285a565b61124f565b005b34801561032e57600080fd5b506103376113f7565b005b34801561034557600080fd5b50610360600480360381019061035b919061223f565b61147f565b60405161036d919061290c565b60405180910390f35b34801561038257600080fd5b5061038b6114ac565b6040516103989190612927565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c3919061223f565b6114d6565b6040516103d59190612942565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061223f565b6114f6565b6040516104129190612942565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906121c3565b611516565b60405161044f91906128a2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612524565b6115d6565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061285a565b6116cc565b005b3480156104b657600080fd5b506104bf611875565b6040516104cc9190612942565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061285a565b61187b565b005b61050b8585858585611516565b506000600660008781526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105e89061298c565b80601f01602080910402602001604051908101604052809291908181526020018280546106149061298c565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b5050505050815260200160038201548152602001600482015481525050905080606001513410156106cf578060600151346040517f127ce50b0000000000000000000000000000000000000000000000000000000081526004016106c69291906129be565b60405180910390fd5b6106d884611973565b60006006600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161073490612a18565b60006040518083038185875af1925050503d8060008114610771576040519150601f19603f3d011682016040523d82523d6000602084013e610776565b606091505b50509050806107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190612a79565b60405180910390fd5b50505050505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020180546108329061298c565b80601f016020809104026020016040519081016040528092919081815260200182805461085e9061298c565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b5050505050908060030154908060040154905085565b600560006108cd6119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661095d576109216119a1565b6040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016109549190612927565b60405180910390fd5b61096782826119a9565b5050565b6109736119a1565b73ffffffffffffffffffffffffffffffffffffffff166109916114ac565b73ffffffffffffffffffffffffffffffffffffffff16146109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90612ae5565b60405180910390fd5b806000015160046000836020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f564645df973dfb1e7efcea0a3fd8b1a17885b551004060cebd294079a39f12fd81604051610a769190612b52565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610abc6119a1565b73ffffffffffffffffffffffffffffffffffffffff16610ada6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790612ae5565b60405180910390fd5b60004711610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90612bb9565b60405180910390fd5b6000610b7d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ba090612a18565b60006040518083038185875af1925050503d8060008114610bdd576040519150601f19603f3d011682016040523d82523d6000602084013e610be2565b606091505b5050905080610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90612a79565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167ff67611512e0a2d90c96fd3f08dca4971bc45fba9dc679eabe839a32abbe58a8e60405160405180910390a250565b60056000610c786119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d0857610ccc6119a1565b6040517f366b2e5a000000000000000000000000000000000000000000000000000000008152600401610cff9190612927565b60405180910390fd5b610d16868686868686611ac1565b505050505050565b85600073ffffffffffffffffffffffffffffffffffffffff16600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dca57806040517f2ad8ef12000000000000000000000000000000000000000000000000000000008152600401610dc1919061290c565b60405180910390fd5b600354341015610e1557600354346040517fa458261b000000000000000000000000000000000000000000000000000000008152600401610e0c9291906129be565b60405180910390fd5b60007f80ac58cd0000000000000000000000000000000000000000000000000000000090508573ffffffffffffffffffffffffffffffffffffffff166301ffc9a7826040518263ffffffff1660e01b8152600401610e739190612c14565b60206040518083038186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190612c5b565b610f0457856040517f19bb4029000000000000000000000000000000000000000000000000000000008152600401610efb9190612927565b60405180910390fd5b610f0f898989611be5565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200184815260200142815250600660008b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019080519060200190611063929190612079565b5060608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168a7f06b6f3cfea971e7089a9c4ba417844e2d06a78289f15569a834703424c52c7858b8b8a8a8a6040516110e1959493929190612cc4565b60405180910390a4505050505050505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611247575060006006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111f49190612927565b60206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112449190612d27565b14155b905092915050565b6112576119a1565b73ffffffffffffffffffffffffffffffffffffffff166112756114ac565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135957806040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016113509190612927565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a250565b6113ff6119a1565b73ffffffffffffffffffffffffffffffffffffffff1661141d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612ae5565b60405180910390fd5b61147d6000611d53565b565b60006001600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060016000838152602001908152602001600020600101549050919050565b600060016000838152602001908152602001600020600201549050919050565b600080611522876114d6565b9050600061152f8861147f565b905060008160ff16141561157a57876040517f90e0fe530000000000000000000000000000000000000000000000000000000081526004016115719190612942565b60405180910390fd5b6000600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115c6888489898986611e19565b6001935050505095945050505050565b6115de6119a1565b73ffffffffffffffffffffffffffffffffffffffff166115fc6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612ae5565b60405180910390fd5b60046000826020015160ff1660ff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557f351f5582b9b7e9da0e37173efe18b53007e0eeb1af62fdefc3dcc57f4ccb9b2d816040516116c19190612b52565b60405180910390a150565b6116d46119a1565b73ffffffffffffffffffffffffffffffffffffffff166116f26114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117d757806040517f8e0a7e7c0000000000000000000000000000000000000000000000000000000081526004016117ce9190612927565b60405180910390fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a250565b60035481565b6118836119a1565b73ffffffffffffffffffffffffffffffffffffffff166118a16114ac565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90612ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612dc6565b60405180910390fd5b61197081611d53565b50565b600160008083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006119b48361147f565b60ff1614156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90612e58565b60405180910390fd5b6001600083815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063168703fa9091836040518363ffffffff1660e01b8152600401611a45929190612e8e565b60006040518083038186803b158015611a5d57600080fd5b505af4158015611a71573d6000803e3d6000fd5b505050506000611a80836114d6565b9050827f03fd27265b7dd1f55558bedc22a58fa3b10afb1be776e614bd5a7ba7b94994068383604051611ab49291906129be565b60405180910390a2505050565b6000611acc8761147f565b60ff161415611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612e58565b60405180910390fd5b6001600087815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab460630629596f909187878787876040518763ffffffff1660e01b8152600401611b6596959493929190612fec565b60006040518083038186803b158015611b7d57600080fd5b505af4158015611b91573d6000803e3d6000fd5b505050506000611ba0876114d6565b9050867fe270325ded177064d7bda473e6519ef40a291058c41286f71a6e4872f1e9ab5c8783604051611bd49291906129be565b60405180910390a250505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018310611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e906130b5565b60405180910390fd5b6000611c528461147f565b60ff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613147565b60405180910390fd5b6001600084815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063b4bdd117909184846040518463ffffffff1660e01b8152600401611ce493929190613176565b60006040518083038186803b158015611cfc57600080fd5b505af4158015611d10573d6000803e3d6000fd5b50505050827fc3082aa494e9088c2c9f0fb62a0b6bd46e6699acb94cfba35be29b95a93f68c88383604051611d469291906131ad565b60405180910390a2505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008085815260200190815260200160002060009054906101000a900460ff1615611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613248565b60405180910390fd5b6000611e8487612042565b90508173ffffffffffffffffffffffffffffffffffffffff16635fe8c13b604051806040016040528086600060088110611ec157611ec0613268565b5b6020020135815260200186600160088110611edf57611ede613268565b5b60200201358152506040518060400160405280604051806040016040528089600260088110611f1157611f10613268565b5b6020020135815260200189600360088110611f2f57611f2e613268565b5b60200201358152508152602001604051806040016040528089600460088110611f5b57611f5a613268565b5b6020020135815260200189600560088110611f7957611f78613268565b5b6020020135815250815250604051806040016040528088600660088110611fa357611fa2613268565b5b6020020135815260200188600760088110611fc157611fc0613268565b5b602002013581525060405180608001604052808c81526020018b81526020018781526020018a8152506040518563ffffffff1660e01b815260040161200994939291906134c4565b60006040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b5050505050505050505050565b6000600882604051602001612057919061352c565b6040516020818303038152906040528051906020012060001c901c9050919050565b8280546120859061298c565b90600052602060002090601f0160209004810192826120a757600085556120ee565b82601f106120c057805160ff19168380011785556120ee565b828001600101855582156120ee579182015b828111156120ed5782518255916020019190600101906120d2565b5b5090506120fb91906120ff565b5090565b5b80821115612118576000816000905550600101612100565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61214381612130565b811461214e57600080fd5b50565b6000813590506121608161213a565b92915050565b6000819050919050565b61217981612166565b811461218457600080fd5b50565b60008135905061219681612170565b92915050565b600080fd5b6000819050826020600802820111156121bd576121bc61219c565b5b92915050565b600080600080600061018086880312156121e0576121df612126565b5b60006121ee88828901612151565b95505060206121ff88828901612187565b945050604061221088828901612151565b935050606061222188828901612151565b9250506080612232888289016121a1565b9150509295509295909350565b60006020828403121561225557612254612126565b5b600061226384828501612151565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122978261226c565b9050919050565b6122a78161228c565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b838111156122f6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612318826122ad565b61232281856122b8565b93506123328185602086016122c9565b61233b816122fc565b840191505092915050565b61234f81612130565b82525050565b600060a08201905061236a600083018861229e565b612377602083018761229e565b8181036040830152612389818661230d565b90506123986060830185612346565b6123a56080830184612346565b9695505050505050565b600080604083850312156123c6576123c5612126565b5b60006123d485828601612151565b92505060206123e585828601612151565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61242c826122fc565b810181811067ffffffffffffffff8211171561244b5761244a6123f4565b5b80604052505050565b600061245e61211c565b905061246a8282612423565b919050565b6124788161228c565b811461248357600080fd5b50565b6000813590506124958161246f565b92915050565b600060ff82169050919050565b6124b18161249b565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000604082840312156124ea576124e96123ef565b5b6124f46040612454565b9050600061250484828501612486565b6000830152506020612518848285016124bf565b60208301525092915050565b60006040828403121561253a57612539612126565b5b6000612548848285016124d4565b91505092915050565b60006020828403121561256757612566612126565b5b6000612575848285016124bf565b91505092915050565b6000819050919050565b60006125a361259e6125998461226c565b61257e565b61226c565b9050919050565b60006125b582612588565b9050919050565b60006125c7826125aa565b9050919050565b6125d7816125bc565b82525050565b60006020820190506125f260008301846125ce565b92915050565b600080fd5b600080fd5b60008083601f840112612618576126176125f8565b5b8235905067ffffffffffffffff811115612635576126346125fd565b5b6020830191508360208202830111156126515761265061219c565b5b9250929050565b60008083601f84011261266e5761266d6125f8565b5b8235905067ffffffffffffffff81111561268b5761268a6125fd565b5b6020830191508360208202830111156126a7576126a661219c565b5b9250929050565b600080600080600080608087890312156126cb576126ca612126565b5b60006126d989828a01612151565b96505060206126ea89828a01612151565b955050604087013567ffffffffffffffff81111561270b5761270a61212b565b5b61271789828a01612602565b9450945050606087013567ffffffffffffffff81111561273a5761273961212b565b5b61274689828a01612658565b92509250509295509295509295565b60008083601f84011261276b5761276a6125f8565b5b8235905067ffffffffffffffff811115612788576127876125fd565b5b6020830191508360018202830111156127a4576127a361219c565b5b9250929050565b600080600080600080600060c0888a0312156127ca576127c9612126565b5b60006127d88a828b01612151565b97505060206127e98a828b016124bf565b96505060406127fa8a828b01612151565b955050606061280b8a828b01612486565b945050608088013567ffffffffffffffff81111561282c5761282b61212b565b5b6128388a828b01612755565b935093505060a061284b8a828b01612151565b91505092959891949750929550565b6000602082840312156128705761286f612126565b5b600061287e84828501612486565b91505092915050565b60008115159050919050565b61289c81612887565b82525050565b60006020820190506128b76000830184612893565b92915050565b600080604083850312156128d4576128d3612126565b5b60006128e285828601612151565b92505060206128f385828601612486565b9150509250929050565b6129068161249b565b82525050565b600060208201905061292160008301846128fd565b92915050565b600060208201905061293c600083018461229e565b92915050565b60006020820190506129576000830184612346565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a457607f821691505b602082108114156129b8576129b761295d565b5b50919050565b60006040820190506129d36000830185612346565b6129e06020830184612346565b9392505050565b600081905092915050565b50565b6000612a026000836129e7565b9150612a0d826129f2565b600082019050919050565b6000612a23826129f5565b9150819050919050565b7f5472616e73666572204661696c65640000000000000000000000000000000000600082015250565b6000612a63600f836122b8565b9150612a6e82612a2d565b602082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612acf6020836122b8565b9150612ada82612a99565b602082019050919050565b60006020820190508181036000830152612afe81612ac2565b9050919050565b612b0e8161228c565b82525050565b612b1d8161249b565b82525050565b604082016000820151612b396000850182612b05565b506020820151612b4c6020850182612b14565b50505050565b6000604082019050612b676000830184612b23565b92915050565b7f4e6f7420456e6f7567682042616c616e6365204f6620436f6e74726163740000600082015250565b6000612ba3601e836122b8565b9150612bae82612b6d565b602082019050919050565b60006020820190508181036000830152612bd281612b96565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0e81612bd9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612887565b8114612c4357600080fd5b50565b600081519050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612126565b5b6000612c7f84828501612c46565b91505092915050565b82818337600083830152505050565b6000612ca383856122b8565b9350612cb0838584612c88565b612cb9836122fc565b840190509392505050565b6000608082019050612cd960008301886128fd565b612ce66020830187612346565b8181036040830152612cf9818587612c97565b9050612d086060830184612346565b9695505050505050565b600081519050612d218161213a565b92915050565b600060208284031215612d3d57612d3c612126565b5b6000612d4b84828501612d12565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612db06026836122b8565b9150612dbb82612d54565b604082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020646f6573206e6f742060008201527f6578697374000000000000000000000000000000000000000000000000000000602082015250565b6000612e426025836122b8565b9150612e4d82612de6565b604082019050919050565b60006020820190508181036000830152612e7181612e35565b9050919050565b8082525050565b612e8881612130565b82525050565b6000604082019050612ea36000830185612e78565b612eb06020830184612e7f565b9392505050565b600082825260208201905092915050565b600080fd5b6000612ed98385612eb7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f0c57612f0b612ec8565b5b602083029250612f1d838584612c88565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b612f4d8161249b565b82525050565b6000612f5f8383612f44565b60208301905092915050565b6000612f7a60208401846124bf565b905092915050565b6000602082019050919050565b6000612f9b8385612f29565b9350612fa682612f3a565b8060005b85811015612fdf57612fbc8284612f6b565b612fc68882612f53565b9750612fd183612f82565b925050600181019050612faa565b5085925050509392505050565b60006080820190506130016000830189612e78565b61300e6020830188612e7f565b8181036040830152613021818688612ecd565b90508181036060830152613036818486612f8f565b9050979650505050505050565b7f53656d6170686f726547726f7570733a2067726f7570206964206d757374206260008201527f65203c20534e41524b5f5343414c41525f4649454c4400000000000000000000602082015250565b600061309f6036836122b8565b91506130aa82613043565b604082019050919050565b600060208201905081810360008301526130ce81613092565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006131316025836122b8565b915061313c826130d5565b604082019050919050565b6000602082019050818103600083015261316081613124565b9050919050565b6131708161249b565b82525050565b600060608201905061318b6000830186612e78565b6131986020830185613167565b6131a56040830184612e7f565b949350505050565b60006040820190506131c260008301856128fd565b6131cf6020830184612346565b9392505050565b7f53656d6170686f7265436f72653a20796f752063616e6e6f742075736520746860008201527f652073616d65206e756c6c696669657220747769636500000000000000000000602082015250565b60006132326036836122b8565b915061323d826131d6565b604082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b6132c081612130565b82525050565b60006132d283836132b7565b60208301905092915050565b6000602082019050919050565b6132f481613297565b6132fe81846132a2565b9250613309826132ad565b8060005b8381101561333a57815161332187826132c6565b965061332c836132de565b92505060018101905061330d565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61337681613297565b6133808184613362565b925061338b826132ad565b8060005b838110156133bc5781516133a387826132c6565b96506133ae836132de565b92505060018101905061338f565b505050505050565b60006133d0838361336d565b60408301905092915050565b6000602082019050919050565b6133f281613342565b6133fc818461334d565b925061340782613358565b8060005b8381101561343857815161341f87826133c4565b965061342a836133dc565b92505060018101905061340b565b505050505050565b600060049050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61347681613440565b613480818461344b565b925061348b82613456565b8060005b838110156134bc5781516134a387826132c6565b96506134ae83613460565b92505060018101905061348f565b505050505050565b6000610180820190506134da60008301876132eb565b6134e760408301866133e9565b6134f460c08301856132eb565b61350261010083018461346d565b95945050505050565b6000819050919050565b61352661352182612166565b61350b565b82525050565b60006135388284613515565b6020820191508190509291505056fea264697066735822122062ff13459aec14b4b46ecb125dbbb78f3e7145e1856f1e600fdd3845cd4cfb2964736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57
Deployed Bytecode
0x60806040526004361061012e5760003560e01c806360f0a5ac116100ab578063b9c78c2b1161006f578063b9c78c2b146103de578063ba0422161461041b578063d1b2dd2814610458578063dd39f00d14610481578063ddca3f43146104aa578063f2fde38b146104d557610135565b806360f0a5ac146102f9578063715018a61461032257806375e618c9146103395780638da5cb5b146103765780639b24b3b0146103a157610135565b80633ccfd60b116100f25780633ccfd60b1461022357806343989f851461023a5780634b426eae146102635780635300f8411461027f578063592e0e00146102bc57610135565b8063057241b8146101375780630b791430146101535780631783efc3146101945780631c1370b2146101bd5780632d69be98146101e657610135565b3661013557005b005b610151600480360381019061014c91906121c3565b6104fe565b005b34801561015f57600080fd5b5061017a6004803603810190610175919061223f565b6107c3565b60405161018b959493929190612355565b60405180910390f35b3480156101a057600080fd5b506101bb60048036038101906101b691906123af565b6108c1565b005b3480156101c957600080fd5b506101e460048036038101906101df9190612524565b61096b565b005b3480156101f257600080fd5b5061020d60048036038101906102089190612551565b610a81565b60405161021a91906125dd565b60405180910390f35b34801561022f57600080fd5b50610238610ab4565b005b34801561024657600080fd5b50610261600480360381019061025c91906126ae565b610c6c565b005b61027d600480360381019061027891906127ab565b610d1e565b005b34801561028b57600080fd5b506102a660048036038101906102a1919061285a565b6110f4565b6040516102b391906128a2565b60405180910390f35b3480156102c857600080fd5b506102e360048036038101906102de91906128bd565b611114565b6040516102f091906128a2565b60405180910390f35b34801561030557600080fd5b50610320600480360381019061031b919061285a565b61124f565b005b34801561032e57600080fd5b506103376113f7565b005b34801561034557600080fd5b50610360600480360381019061035b919061223f565b61147f565b60405161036d919061290c565b60405180910390f35b34801561038257600080fd5b5061038b6114ac565b6040516103989190612927565b60405180910390f35b3480156103ad57600080fd5b506103c860048036038101906103c3919061223f565b6114d6565b6040516103d59190612942565b60405180910390f35b3480156103ea57600080fd5b506104056004803603810190610400919061223f565b6114f6565b6040516104129190612942565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d91906121c3565b611516565b60405161044f91906128a2565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612524565b6115d6565b005b34801561048d57600080fd5b506104a860048036038101906104a3919061285a565b6116cc565b005b3480156104b657600080fd5b506104bf611875565b6040516104cc9190612942565b60405180910390f35b3480156104e157600080fd5b506104fc60048036038101906104f7919061285a565b61187b565b005b61050b8585858585611516565b506000600660008781526020019081526020016000206040518060a00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820180546105e89061298c565b80601f01602080910402602001604051908101604052809291908181526020018280546106149061298c565b80156106615780601f1061063657610100808354040283529160200191610661565b820191906000526020600020905b81548152906001019060200180831161064457829003601f168201915b5050505050815260200160038201548152602001600482015481525050905080606001513410156106cf578060600151346040517f127ce50b0000000000000000000000000000000000000000000000000000000081526004016106c69291906129be565b60405180910390fd5b6106d884611973565b60006006600088815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163460405161073490612a18565b60006040518083038185875af1925050503d8060008114610771576040519150601f19603f3d011682016040523d82523d6000602084013e610776565b606091505b50509050806107ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b190612a79565b60405180910390fd5b50505050505050565b60066020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060020180546108329061298c565b80601f016020809104026020016040519081016040528092919081815260200182805461085e9061298c565b80156108ab5780601f10610880576101008083540402835291602001916108ab565b820191906000526020600020905b81548152906001019060200180831161088e57829003601f168201915b5050505050908060030154908060040154905085565b600560006108cd6119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661095d576109216119a1565b6040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016109549190612927565b60405180910390fd5b61096782826119a9565b5050565b6109736119a1565b73ffffffffffffffffffffffffffffffffffffffff166109916114ac565b73ffffffffffffffffffffffffffffffffffffffff16146109e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109de90612ae5565b60405180910390fd5b806000015160046000836020015160ff1660ff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f564645df973dfb1e7efcea0a3fd8b1a17885b551004060cebd294079a39f12fd81604051610a769190612b52565b60405180910390a150565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610abc6119a1565b73ffffffffffffffffffffffffffffffffffffffff16610ada6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614610b30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2790612ae5565b60405180910390fd5b60004711610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a90612bb9565b60405180910390fd5b6000610b7d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ba090612a18565b60006040518083038185875af1925050503d8060008114610bdd576040519150601f19603f3d011682016040523d82523d6000602084013e610be2565b606091505b5050905080610c26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1d90612a79565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167ff67611512e0a2d90c96fd3f08dca4971bc45fba9dc679eabe839a32abbe58a8e60405160405180910390a250565b60056000610c786119a1565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16610d0857610ccc6119a1565b6040517f366b2e5a000000000000000000000000000000000000000000000000000000008152600401610cff9190612927565b60405180910390fd5b610d16868686868686611ac1565b505050505050565b85600073ffffffffffffffffffffffffffffffffffffffff16600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610dca57806040517f2ad8ef12000000000000000000000000000000000000000000000000000000008152600401610dc1919061290c565b60405180910390fd5b600354341015610e1557600354346040517fa458261b000000000000000000000000000000000000000000000000000000008152600401610e0c9291906129be565b60405180910390fd5b60007f80ac58cd0000000000000000000000000000000000000000000000000000000090508573ffffffffffffffffffffffffffffffffffffffff166301ffc9a7826040518263ffffffff1660e01b8152600401610e739190612c14565b60206040518083038186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec39190612c5b565b610f0457856040517f19bb4029000000000000000000000000000000000000000000000000000000008152600401610efb9190612927565b60405180910390fd5b610f0f898989611be5565b6040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200184815260200142815250600660008b815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002019080519060200190611063929190612079565b5060608201518160030155608082015181600401559050503373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168a7f06b6f3cfea971e7089a9c4ba417844e2d06a78289f15569a834703424c52c7858b8b8a8a8a6040516110e1959493929190612cc4565b60405180910390a4505050505050505050565b60056020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff166006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015611247575060006006600085815260200190815260200160002060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111f49190612927565b60206040518083038186803b15801561120c57600080fd5b505afa158015611220573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112449190612d27565b14155b905092915050565b6112576119a1565b73ffffffffffffffffffffffffffffffffffffffff166112756114ac565b73ffffffffffffffffffffffffffffffffffffffff16146112cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c290612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661135957806040517f366b2e5a0000000000000000000000000000000000000000000000000000000081526004016113509190612927565b60405180910390fd5b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f10e1f7ce9fd7d1b90a66d13a2ab3cb8dd7f29f3f8d520b143b063ccfbab6906b60405160405180910390a250565b6113ff6119a1565b73ffffffffffffffffffffffffffffffffffffffff1661141d6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611473576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146a90612ae5565b60405180910390fd5b61147d6000611d53565b565b60006001600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600060016000838152602001908152602001600020600101549050919050565b600060016000838152602001908152602001600020600201549050919050565b600080611522876114d6565b9050600061152f8861147f565b905060008160ff16141561157a57876040517f90e0fe530000000000000000000000000000000000000000000000000000000081526004016115719190612942565b60405180910390fd5b6000600460008360ff1660ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506115c6888489898986611e19565b6001935050505095945050505050565b6115de6119a1565b73ffffffffffffffffffffffffffffffffffffffff166115fc6114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612ae5565b60405180910390fd5b60046000826020015160ff1660ff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690557f351f5582b9b7e9da0e37173efe18b53007e0eeb1af62fdefc3dcc57f4ccb9b2d816040516116c19190612b52565b60405180910390a150565b6116d46119a1565b73ffffffffffffffffffffffffffffffffffffffff166116f26114ac565b73ffffffffffffffffffffffffffffffffffffffff1614611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90612ae5565b60405180910390fd5b600560008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156117d757806040517f8e0a7e7c0000000000000000000000000000000000000000000000000000000081526004016117ce9190612927565b60405180910390fd5b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f03580ee9f53a62b7cb409a2cb56f9be87747dd15017afc5cef6eef321e4fb2c560405160405180910390a250565b60035481565b6118836119a1565b73ffffffffffffffffffffffffffffffffffffffff166118a16114ac565b73ffffffffffffffffffffffffffffffffffffffff16146118f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ee90612ae5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611967576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195e90612dc6565b60405180910390fd5b61197081611d53565b50565b600160008083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b60006119b48361147f565b60ff1614156119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef90612e58565b60405180910390fd5b6001600083815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063168703fa9091836040518363ffffffff1660e01b8152600401611a45929190612e8e565b60006040518083038186803b158015611a5d57600080fd5b505af4158015611a71573d6000803e3d6000fd5b505050506000611a80836114d6565b9050827f03fd27265b7dd1f55558bedc22a58fa3b10afb1be776e614bd5a7ba7b94994068383604051611ab49291906129be565b60405180910390a2505050565b6000611acc8761147f565b60ff161415611b10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0790612e58565b60405180910390fd5b6001600087815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab460630629596f909187878787876040518763ffffffff1660e01b8152600401611b6596959493929190612fec565b60006040518083038186803b158015611b7d57600080fd5b505af4158015611b91573d6000803e3d6000fd5b505050506000611ba0876114d6565b9050867fe270325ded177064d7bda473e6519ef40a291058c41286f71a6e4872f1e9ab5c8783604051611bd49291906129be565b60405180910390a250505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018310611c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3e906130b5565b60405180910390fd5b6000611c528461147f565b60ff1614611c95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8c90613147565b60405180910390fd5b6001600084815260200190815260200160002073325cc80c4b5fffd1be186adbd2ba43ab2cfab46063b4bdd117909184846040518463ffffffff1660e01b8152600401611ce493929190613176565b60006040518083038186803b158015611cfc57600080fd5b505af4158015611d10573d6000803e3d6000fd5b50505050827fc3082aa494e9088c2c9f0fb62a0b6bd46e6699acb94cfba35be29b95a93f68c88383604051611d469291906131ad565b60405180910390a2505050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008085815260200190815260200160002060009054906101000a900460ff1615611e79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7090613248565b60405180910390fd5b6000611e8487612042565b90508173ffffffffffffffffffffffffffffffffffffffff16635fe8c13b604051806040016040528086600060088110611ec157611ec0613268565b5b6020020135815260200186600160088110611edf57611ede613268565b5b60200201358152506040518060400160405280604051806040016040528089600260088110611f1157611f10613268565b5b6020020135815260200189600360088110611f2f57611f2e613268565b5b60200201358152508152602001604051806040016040528089600460088110611f5b57611f5a613268565b5b6020020135815260200189600560088110611f7957611f78613268565b5b6020020135815250815250604051806040016040528088600660088110611fa357611fa2613268565b5b6020020135815260200188600760088110611fc157611fc0613268565b5b602002013581525060405180608001604052808c81526020018b81526020018781526020018a8152506040518563ffffffff1660e01b815260040161200994939291906134c4565b60006040518083038186803b15801561202157600080fd5b505afa158015612035573d6000803e3d6000fd5b5050505050505050505050565b6000600882604051602001612057919061352c565b6040516020818303038152906040528051906020012060001c901c9050919050565b8280546120859061298c565b90600052602060002090601f0160209004810192826120a757600085556120ee565b82601f106120c057805160ff19168380011785556120ee565b828001600101855582156120ee579182015b828111156120ed5782518255916020019190600101906120d2565b5b5090506120fb91906120ff565b5090565b5b80821115612118576000816000905550600101612100565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61214381612130565b811461214e57600080fd5b50565b6000813590506121608161213a565b92915050565b6000819050919050565b61217981612166565b811461218457600080fd5b50565b60008135905061219681612170565b92915050565b600080fd5b6000819050826020600802820111156121bd576121bc61219c565b5b92915050565b600080600080600061018086880312156121e0576121df612126565b5b60006121ee88828901612151565b95505060206121ff88828901612187565b945050604061221088828901612151565b935050606061222188828901612151565b9250506080612232888289016121a1565b9150509295509295909350565b60006020828403121561225557612254612126565b5b600061226384828501612151565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006122978261226c565b9050919050565b6122a78161228c565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b838110156122e75780820151818401526020810190506122cc565b838111156122f6576000848401525b50505050565b6000601f19601f8301169050919050565b6000612318826122ad565b61232281856122b8565b93506123328185602086016122c9565b61233b816122fc565b840191505092915050565b61234f81612130565b82525050565b600060a08201905061236a600083018861229e565b612377602083018761229e565b8181036040830152612389818661230d565b90506123986060830185612346565b6123a56080830184612346565b9695505050505050565b600080604083850312156123c6576123c5612126565b5b60006123d485828601612151565b92505060206123e585828601612151565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61242c826122fc565b810181811067ffffffffffffffff8211171561244b5761244a6123f4565b5b80604052505050565b600061245e61211c565b905061246a8282612423565b919050565b6124788161228c565b811461248357600080fd5b50565b6000813590506124958161246f565b92915050565b600060ff82169050919050565b6124b18161249b565b81146124bc57600080fd5b50565b6000813590506124ce816124a8565b92915050565b6000604082840312156124ea576124e96123ef565b5b6124f46040612454565b9050600061250484828501612486565b6000830152506020612518848285016124bf565b60208301525092915050565b60006040828403121561253a57612539612126565b5b6000612548848285016124d4565b91505092915050565b60006020828403121561256757612566612126565b5b6000612575848285016124bf565b91505092915050565b6000819050919050565b60006125a361259e6125998461226c565b61257e565b61226c565b9050919050565b60006125b582612588565b9050919050565b60006125c7826125aa565b9050919050565b6125d7816125bc565b82525050565b60006020820190506125f260008301846125ce565b92915050565b600080fd5b600080fd5b60008083601f840112612618576126176125f8565b5b8235905067ffffffffffffffff811115612635576126346125fd565b5b6020830191508360208202830111156126515761265061219c565b5b9250929050565b60008083601f84011261266e5761266d6125f8565b5b8235905067ffffffffffffffff81111561268b5761268a6125fd565b5b6020830191508360208202830111156126a7576126a661219c565b5b9250929050565b600080600080600080608087890312156126cb576126ca612126565b5b60006126d989828a01612151565b96505060206126ea89828a01612151565b955050604087013567ffffffffffffffff81111561270b5761270a61212b565b5b61271789828a01612602565b9450945050606087013567ffffffffffffffff81111561273a5761273961212b565b5b61274689828a01612658565b92509250509295509295509295565b60008083601f84011261276b5761276a6125f8565b5b8235905067ffffffffffffffff811115612788576127876125fd565b5b6020830191508360018202830111156127a4576127a361219c565b5b9250929050565b600080600080600080600060c0888a0312156127ca576127c9612126565b5b60006127d88a828b01612151565b97505060206127e98a828b016124bf565b96505060406127fa8a828b01612151565b955050606061280b8a828b01612486565b945050608088013567ffffffffffffffff81111561282c5761282b61212b565b5b6128388a828b01612755565b935093505060a061284b8a828b01612151565b91505092959891949750929550565b6000602082840312156128705761286f612126565b5b600061287e84828501612486565b91505092915050565b60008115159050919050565b61289c81612887565b82525050565b60006020820190506128b76000830184612893565b92915050565b600080604083850312156128d4576128d3612126565b5b60006128e285828601612151565b92505060206128f385828601612486565b9150509250929050565b6129068161249b565b82525050565b600060208201905061292160008301846128fd565b92915050565b600060208201905061293c600083018461229e565b92915050565b60006020820190506129576000830184612346565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a457607f821691505b602082108114156129b8576129b761295d565b5b50919050565b60006040820190506129d36000830185612346565b6129e06020830184612346565b9392505050565b600081905092915050565b50565b6000612a026000836129e7565b9150612a0d826129f2565b600082019050919050565b6000612a23826129f5565b9150819050919050565b7f5472616e73666572204661696c65640000000000000000000000000000000000600082015250565b6000612a63600f836122b8565b9150612a6e82612a2d565b602082019050919050565b60006020820190508181036000830152612a9281612a56565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612acf6020836122b8565b9150612ada82612a99565b602082019050919050565b60006020820190508181036000830152612afe81612ac2565b9050919050565b612b0e8161228c565b82525050565b612b1d8161249b565b82525050565b604082016000820151612b396000850182612b05565b506020820151612b4c6020850182612b14565b50505050565b6000604082019050612b676000830184612b23565b92915050565b7f4e6f7420456e6f7567682042616c616e6365204f6620436f6e74726163740000600082015250565b6000612ba3601e836122b8565b9150612bae82612b6d565b602082019050919050565b60006020820190508181036000830152612bd281612b96565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c0e81612bd9565b82525050565b6000602082019050612c296000830184612c05565b92915050565b612c3881612887565b8114612c4357600080fd5b50565b600081519050612c5581612c2f565b92915050565b600060208284031215612c7157612c70612126565b5b6000612c7f84828501612c46565b91505092915050565b82818337600083830152505050565b6000612ca383856122b8565b9350612cb0838584612c88565b612cb9836122fc565b840190509392505050565b6000608082019050612cd960008301886128fd565b612ce66020830187612346565b8181036040830152612cf9818587612c97565b9050612d086060830184612346565b9695505050505050565b600081519050612d218161213a565b92915050565b600060208284031215612d3d57612d3c612126565b5b6000612d4b84828501612d12565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612db06026836122b8565b9150612dbb82612d54565b604082019050919050565b60006020820190508181036000830152612ddf81612da3565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020646f6573206e6f742060008201527f6578697374000000000000000000000000000000000000000000000000000000602082015250565b6000612e426025836122b8565b9150612e4d82612de6565b604082019050919050565b60006020820190508181036000830152612e7181612e35565b9050919050565b8082525050565b612e8881612130565b82525050565b6000604082019050612ea36000830185612e78565b612eb06020830184612e7f565b9392505050565b600082825260208201905092915050565b600080fd5b6000612ed98385612eb7565b93507f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115612f0c57612f0b612ec8565b5b602083029250612f1d838584612c88565b82840190509392505050565b600082825260208201905092915050565b6000819050919050565b612f4d8161249b565b82525050565b6000612f5f8383612f44565b60208301905092915050565b6000612f7a60208401846124bf565b905092915050565b6000602082019050919050565b6000612f9b8385612f29565b9350612fa682612f3a565b8060005b85811015612fdf57612fbc8284612f6b565b612fc68882612f53565b9750612fd183612f82565b925050600181019050612faa565b5085925050509392505050565b60006080820190506130016000830189612e78565b61300e6020830188612e7f565b8181036040830152613021818688612ecd565b90508181036060830152613036818486612f8f565b9050979650505050505050565b7f53656d6170686f726547726f7570733a2067726f7570206964206d757374206260008201527f65203c20534e41524b5f5343414c41525f4649454c4400000000000000000000602082015250565b600061309f6036836122b8565b91506130aa82613043565b604082019050919050565b600060208201905081810360008301526130ce81613092565b9050919050565b7f53656d6170686f726547726f7570733a2067726f757020616c7265616479206560008201527f7869737473000000000000000000000000000000000000000000000000000000602082015250565b60006131316025836122b8565b915061313c826130d5565b604082019050919050565b6000602082019050818103600083015261316081613124565b9050919050565b6131708161249b565b82525050565b600060608201905061318b6000830186612e78565b6131986020830185613167565b6131a56040830184612e7f565b949350505050565b60006040820190506131c260008301856128fd565b6131cf6020830184612346565b9392505050565b7f53656d6170686f7265436f72653a20796f752063616e6e6f742075736520746860008201527f652073616d65206e756c6c696669657220747769636500000000000000000000602082015250565b60006132326036836122b8565b915061323d826131d6565b604082019050919050565b6000602082019050818103600083015261326181613225565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b6132c081612130565b82525050565b60006132d283836132b7565b60208301905092915050565b6000602082019050919050565b6132f481613297565b6132fe81846132a2565b9250613309826132ad565b8060005b8381101561333a57815161332187826132c6565b965061332c836132de565b92505060018101905061330d565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61337681613297565b6133808184613362565b925061338b826132ad565b8060005b838110156133bc5781516133a387826132c6565b96506133ae836132de565b92505060018101905061338f565b505050505050565b60006133d0838361336d565b60408301905092915050565b6000602082019050919050565b6133f281613342565b6133fc818461334d565b925061340782613358565b8060005b8381101561343857815161341f87826133c4565b965061342a836133dc565b92505060018101905061340b565b505050505050565b600060049050919050565b600081905092915050565b6000819050919050565b6000602082019050919050565b61347681613440565b613480818461344b565b925061348b82613456565b8060005b838110156134bc5781516134a387826132c6565b96506134ae83613460565b92505060018101905061348f565b505050505050565b6000610180820190506134da60008301876132eb565b6134e760408301866133e9565b6134f460c08301856132eb565b61350261010083018461346d565b95945050505050565b6000819050919050565b61352661352182612166565b61350b565b82525050565b60006135388284613515565b6020820191508190509291505056fea264697066735822122062ff13459aec14b4b46ecb125dbbb78f3e7145e1856f1e600fdd3845cd4cfb2964736f6c63430008090033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000020000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57
-----Decoded View---------------
Arg [0] : _verifiers (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
Arg [1] : _relayers (address[]): 0x0C7f08080d325dae4072B45CdE3a73717E3a7223,0x199012076Ea09f92D8C30C494E94738CFF449f57
Arg [2] : _fee (uint256): 10000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [4] : 00000000000000000000000037dc1cb7ab684a2af97862ce42244fc9293f1a0e
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [7] : 0000000000000000000000000c7f08080d325dae4072b45cde3a73717e3a7223
Arg [8] : 000000000000000000000000199012076ea09f92d8c30c494e94738cff449f57
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | Polygon (POL) | 100.00% | $0.475395 | 0.11 | $0.052293 |
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.