Polygon Sponsored slots available. Book your slot here!
Source Code
Latest 24 from a total of 24 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create Event | 53219185 | 713 days ago | IN | 0.01 POL | 0.03798802 | ||||
| Add Member | 33009040 | 1226 days ago | IN | 0 POL | 0.04854957 | ||||
| Create Event | 33009020 | 1226 days ago | IN | 0.01 POL | 0.03672776 | ||||
| Add Member | 30883923 | 1281 days ago | IN | 0 POL | 0.05141602 | ||||
| Create Event | 30883898 | 1281 days ago | IN | 0.01 POL | 0.04828911 | ||||
| Add Member | 30786543 | 1284 days ago | IN | 0 POL | 0.05016789 | ||||
| Create Event | 30786532 | 1284 days ago | IN | 0.01 POL | 0.04313369 | ||||
| Add Member | 30680625 | 1287 days ago | IN | 0 POL | 0.44683119 | ||||
| Add Member | 30680616 | 1287 days ago | IN | 0 POL | 0.55356386 | ||||
| Add Member | 30680516 | 1287 days ago | IN | 0 POL | 0.83895768 | ||||
| Create Event | 30680499 | 1287 days ago | IN | 0.01 POL | 0.5377974 | ||||
| Create Event | 30680418 | 1287 days ago | IN | 0.01 POL | 0.66701439 | ||||
| Create Event | 30674672 | 1287 days ago | IN | 0.01 POL | 0.03826611 | ||||
| Add Member | 30669445 | 1287 days ago | IN | 0 POL | 0.02686407 | ||||
| Add Member | 30606006 | 1289 days ago | IN | 0 POL | 0.04855236 | ||||
| Create Event | 30605771 | 1289 days ago | IN | 0.01 POL | 0.04523108 | ||||
| Add Member | 30584364 | 1289 days ago | IN | 0 POL | 0.05016793 | ||||
| Create Event | 30584349 | 1289 days ago | IN | 0.01 POL | 0.05010194 | ||||
| Add Member | 30558181 | 1290 days ago | IN | 0 POL | 0.02698958 | ||||
| Add Member | 30549417 | 1290 days ago | IN | 0 POL | 0.04854957 | ||||
| Create Event | 30549374 | 1290 days ago | IN | 0.01 POL | 0.04223704 | ||||
| Add Member | 30546095 | 1290 days ago | IN | 0 POL | 0.02782932 | ||||
| Add Member | 30544827 | 1290 days ago | IN | 0 POL | 0.04854957 | ||||
| Create Event | 30543054 | 1290 days ago | IN | 0.01 POL | 0.04883792 |
Cross-Chain Transactions
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
Contract ABI
API[{"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[]):
Arg [1] : contractAddress (address): 0x37DC1CB7Ab684A2AF97862ce42244Fc9293f1a0E
Arg [2] : merkleTreeDepth (uint8): 20
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
Loading...
Loading
Net Worth in USD
$0.01
Net Worth in POL
Token Allocations
POL
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| POL | 100.00% | $0.130795 | 0.11 | $0.014387 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.