More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Verify | 2713024 | 204 days ago | IN | 0 ETH | 0.00000032 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
WorldIDAddressBook
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19 ^0.8.20 ^0.8.21; // dependencies/@openzeppelin-contracts-5.0.2/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // lib/world-id-contracts/src/interfaces/IBaseWorldID.sol /// @title Base WorldID interface /// @author Worldcoin /// @notice The interface providing basic types across various WorldID contracts. interface IBaseWorldID { /////////////////////////////////////////////////////////////////////////////// /// ERRORS /// /////////////////////////////////////////////////////////////////////////////// /// @notice Thrown when attempting to validate a root that has expired. error ExpiredRoot(); /// @notice Thrown when attempting to validate a root that has yet to be added to the root /// history. error NonExistentRoot(); } // src/interfaces/IAddressBook.sol abstract contract IAddressBook { /// @notice Emitted when an account is verified event AccountVerified(address indexed account, uint256 verifiedUntil); /// @notice Returns a timestamp representing when the address' verification will expire /// @param account The address to check /// @return timestamp The timestamp when the address' verification will expire function addressVerifiedUntil( address account ) external view virtual returns (uint256 timestamp); /// @notice Registers a wallet to receive grants /// @param account The address that will be registered /// @param root The root of the Merkle tree (signup-sequencer or world-id-contracts provides this) /// @param nullifierHash The nullifier for this proof, preventing double signaling /// @param proof The zero knowledge proof that demonstrates the claimer has a verified World ID /// @param proofTime A timestamp representing when the proof was created /// @custom:throws Will revert if the proof is invalid or expired function verify( address account, uint256 root, uint256 nullifierHash, uint256[8] calldata proof, uint256 proofTime ) external payable virtual; } // src/utils/ByteHasher.sol library ByteHasher { /// @dev Creates a keccak256 hash of a bytestring. /// @param value The bytestring to hash /// @return The hash of the specified value /// @dev `>> 8` makes sure that the result is included in our field function hashToField(bytes memory value) internal pure returns (uint256) { return uint256(keccak256(abi.encodePacked(value))) >> 8; } } // dependencies/@openzeppelin-contracts-5.0.2/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } // lib/world-id-contracts/src/interfaces/IWorldIDGroups.sol /// @title WorldID Interface with Groups /// @author Worldcoin /// @notice The interface to the proof verification for WorldID. interface IWorldIDGroups is IBaseWorldID { /// @notice Verifies a WorldID zero knowledge proof. /// @dev Note that a double-signaling check is not included here, and should be carried by the /// caller. /// @dev It is highly recommended that the implementation is restricted to `view` if possible. /// /// @param groupId The group identifier for the group to verify a proof for. /// @param root The of the Merkle tree /// @param signalHash A keccak256 hash of the Semaphore signal /// @param nullifierHash The nullifier hash /// @param externalNullifierHash A keccak256 hash of the external nullifier /// @param proof The zero-knowledge proof /// /// @custom:reverts string If the `proof` is invalid. /// @custom:reverts NoSuchGroup If the provided `groupId` references a group that does not exist. function verifyProof( uint256 root, uint256 groupId, uint256 signalHash, uint256 nullifierHash, uint256 externalNullifierHash, uint256[8] calldata proof ) external; } // dependencies/@openzeppelin-contracts-5.0.2/access/Ownable2Step.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable2Step.sol) /** * @dev Contract module which provides access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is specified at deployment time in the constructor for `Ownable`. This * can later be changed with {transferOwnership} and {acceptOwnership}. * * This module is used through inheritance. It will make available all functions * from parent (Ownable). */ abstract contract Ownable2Step is Ownable { address private _pendingOwner; event OwnershipTransferStarted( address indexed previousOwner, address indexed newOwner ); /** * @dev Returns the address of the pending owner. */ function pendingOwner() public view virtual returns (address) { return _pendingOwner; } /** * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one. * Can only be called by the current owner. */ function transferOwnership( address newOwner ) public virtual override onlyOwner { _pendingOwner = newOwner; emit OwnershipTransferStarted(owner(), newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner. * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual override { delete _pendingOwner; super._transferOwnership(newOwner); } /** * @dev The new owner accepts the ownership transfer. */ function acceptOwnership() public virtual { address sender = _msgSender(); if (pendingOwner() != sender) { revert OwnableUnauthorizedAccount(sender); } _transferOwnership(sender); } } // src/WorldIDAddressBook.sol /// @title World ID Address Book /// @author Miguel Piedrafita /// @notice A registry of verified addresses powered by World ID. contract WorldIDAddressBook is IAddressBook, Ownable2Step { using ByteHasher for bytes; /////////////////////////////////////////////////////////////////////////////// /// ERRORS /// ////////////////////////////////////////////////////////////////////////////// /// @notice Thrown when the contract's configuration is invalid. error InvalidConfiguration(); /// @notice Thrown when attempting to reuse a nullifier error InvalidNullifier(); /// @notice Thrown when the owner attempts to resign ownership. error CannotRenounceOwnership(); /// @notice Thrown when attempting to verify an address while a verification is already active error VerificationAlreadyActive(); /////////////////////////////////////////////////////////////////////////////// /// EVENTS /// ////////////////////////////////////////////////////////////////////////////// /// @notice Emitted when the contract is initialized /// @param worldIdRouter The WorldID router that will manage groups and verify proofs /// @param groupId The group ID of the World ID /// @param externalNullifierHash The nullifier hash that will be used to verify proofs /// @param verificationLength The amount of seconds that a verification is valid for /// @param maxProofTime The maximum amount of time that a verification request can be pending for event WorldIDAddressBookInitialized( IWorldIDGroups worldIdRouter, uint256 groupId, uint256 externalNullifierHash, uint256 verificationLength, uint256 maxProofTime ); /// @notice Emitted when the `worldIdRouter` is changed /// @param worldIdRouter The new `worldIdRouter` instance event WorldIdRouterUpdated(IWorldIDGroups worldIdRouter); /// @notice Emitted when the `groupId` is changed /// @param groupId The new `groupId` event GroupIdUpdated(uint256 groupId); /// @notice Emitted when the amout of time that a verification is valid for is changed /// @param verificationLength The new `verificationLength` event VerificationLengthUpdated(uint256 verificationLength); /// @notice Emitted when the amount of time that a verification request can be pending for is changed /// @param maxProofTime The new `maxProofTime` event MaxProofTimeUpdated(uint256 maxProofTime); /////////////////////////////////////////////////////////////////////////////// /// CONFIG STORAGE /// ////////////////////////////////////////////////////////////////////////////// /// @dev The WorldID router instance that will be used for managing groups and verifying proofs IWorldIDGroups public worldIdRouter; /// @dev The World ID group whose participants can verify with this contract. uint256 public groupId; /// @dev The World ID nullifier hash that will be used to verify proofs. uint256 immutable externalNullifierHash; /// @dev The amount of time that verification is valid for, in seconds. uint256 public verificationLength; /// @dev The maximum amount of time that a verification request can be pending for, in seconds. uint256 public maxProofTime; /// @notice Whether a nullifier hash has been used already, and if so, the address it was used to verify. Used to prevent double-signaling. mapping(uint256 => address) public nullifierHashes; /// @notice The time until which an address is verified, in seconds since the Unix epoch. Will be zero if the address is not verified. mapping(address => uint256) public override addressVerifiedUntil; /////////////////////////////////////////////////////////////////////////////// /// CONSTRUCTOR /// ////////////////////////////////////////////////////////////////////////////// /// @notice Deploys a WorldIDAddressBook instance /// @param _worldIdRouter The WorldID router that will manage groups and verify proofs /// @param _groupId The group ID of the World ID /// @param _externalNullifierHash The nullifier hash that will be used to verify proofs /// @param _verificationLength The amount of seconds that a verification is valid for /// @param _maxProofTime The maximum amount of time that a verification request can be pending for constructor( IWorldIDGroups _worldIdRouter, uint256 _groupId, uint256 _externalNullifierHash, uint256 _verificationLength, uint256 _maxProofTime ) Ownable(msg.sender) { if (_verificationLength == 0) revert InvalidConfiguration(); if (address(_worldIdRouter) == address(0)) revert InvalidConfiguration(); groupId = _groupId; maxProofTime = _maxProofTime; worldIdRouter = _worldIdRouter; verificationLength = _verificationLength; externalNullifierHash = _externalNullifierHash; emit WorldIDAddressBookInitialized( worldIdRouter, groupId, externalNullifierHash, verificationLength, maxProofTime ); } /////////////////////////////////////////////////////////////////////////////// /// MAIN LOGIC /// ////////////////////////////////////////////////////////////////////////////// /// @notice Verifies an address. /// @param account The address that will be verified /// @param root The root of the World ID Merkle tree /// @param nullifierHash The World ID nullifier for this proof /// @param proof The World ID proof /// @param proofTime The time at which the proof was generated, in seconds since the Unix epoch function verify( address account, uint256 root, uint256 nullifierHash, uint256[8] calldata proof, uint256 proofTime ) external payable override { if (proofTime > block.timestamp) revert InvalidConfiguration(); if (block.timestamp - proofTime > maxProofTime) { revert InvalidConfiguration(); } address previousAddress = nullifierHashes[nullifierHash]; if ( previousAddress != account && addressVerifiedUntil[previousAddress] > block.timestamp ) revert VerificationAlreadyActive(); nullifierHashes[nullifierHash] = account; addressVerifiedUntil[account] = block.timestamp + verificationLength; worldIdRouter.verifyProof( root, groupId, abi.encodePacked(account, proofTime).hashToField(), nullifierHash, externalNullifierHash, proof ); emit AccountVerified(account, addressVerifiedUntil[account]); } /////////////////////////////////////////////////////////////////////////////// /// CONFIG LOGIC /// ////////////////////////////////////////////////////////////////////////////// // @notice Update the worldIdRouter /// @param _worldIdRouter The new worldIdRouter /// @dev Can only be called by the owner function setWorldIdRouter( IWorldIDGroups _worldIdRouter ) external onlyOwner { if (address(_worldIdRouter) == address(0)) revert InvalidConfiguration(); worldIdRouter = _worldIdRouter; emit WorldIdRouterUpdated(_worldIdRouter); } /// @notice Update the groupId /// @param _groupId The new groupId /// @dev Can only be called by the owner function setGroupId(uint256 _groupId) external onlyOwner { groupId = _groupId; emit GroupIdUpdated(_groupId); } /// @notice Update the amount of time that a verification is valid for, in seconds /// @param _verificationLength The new verificationLength /// @dev Can only be called by the owner. function setVerificationLength( uint256 _verificationLength ) external onlyOwner { if (_verificationLength == 0) revert InvalidConfiguration(); verificationLength = _verificationLength; emit VerificationLengthUpdated(verificationLength); } /// @notice Update the amount of time that a verification request can be pending for, in seconds /// @param _maxProofTime The new maxProofTime /// @dev Can only be called by the owner function setMaxProofTime(uint256 _maxProofTime) external onlyOwner { if (_maxProofTime == 0) revert InvalidConfiguration(); maxProofTime = _maxProofTime; emit MaxProofTimeUpdated(maxProofTime); } /// @notice Prevents the owner from renouncing ownership function renounceOwnership() public view override onlyOwner { revert CannotRenounceOwnership(); } }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none" }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IWorldIDGroups","name":"_worldIdRouter","type":"address"},{"internalType":"uint256","name":"_groupId","type":"uint256"},{"internalType":"uint256","name":"_externalNullifierHash","type":"uint256"},{"internalType":"uint256","name":"_verificationLength","type":"uint256"},{"internalType":"uint256","name":"_maxProofTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CannotRenounceOwnership","type":"error"},{"inputs":[],"name":"InvalidConfiguration","type":"error"},{"inputs":[],"name":"InvalidNullifier","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"VerificationAlreadyActive","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"verifiedUntil","type":"uint256"}],"name":"AccountVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"groupId","type":"uint256"}],"name":"GroupIdUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxProofTime","type":"uint256"}],"name":"MaxProofTimeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"verificationLength","type":"uint256"}],"name":"VerificationLengthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IWorldIDGroups","name":"worldIdRouter","type":"address"},{"indexed":false,"internalType":"uint256","name":"groupId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"externalNullifierHash","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"verificationLength","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxProofTime","type":"uint256"}],"name":"WorldIDAddressBookInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IWorldIDGroups","name":"worldIdRouter","type":"address"}],"name":"WorldIdRouterUpdated","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressVerifiedUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"groupId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxProofTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nullifierHashes","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_groupId","type":"uint256"}],"name":"setGroupId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxProofTime","type":"uint256"}],"name":"setMaxProofTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_verificationLength","type":"uint256"}],"name":"setVerificationLength","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IWorldIDGroups","name":"_worldIdRouter","type":"address"}],"name":"setWorldIdRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"verificationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"root","type":"uint256"},{"internalType":"uint256","name":"nullifierHash","type":"uint256"},{"internalType":"uint256[8]","name":"proof","type":"uint256[8]"},{"internalType":"uint256","name":"proofTime","type":"uint256"}],"name":"verify","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"worldIdRouter","outputs":[{"internalType":"contract IWorldIDGroups","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561000f575f80fd5b50604051610e16380380610e1683398101604081905261002e91610197565b338061005357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61005c8161012c565b50815f0361007d5760405163c52a9bd360e01b815260040160405180910390fd5b6001600160a01b0385166100a45760405163c52a9bd360e01b815260040160405180910390fd5b60038490556005819055600280546001600160a01b0319166001600160a01b03871690811790915560048390556080848152604080519283526020830187905282018590526060820184905281018290527fd3305ade78eae487b27cd60d48bc3932e1f0a4b5fb91905ffba139377cbf13859060a00160405180910390a150505050506101e7565b600180546001600160a01b031916905561014581610148565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f805f60a086880312156101ab575f80fd5b85516001600160a01b03811681146101c1575f80fd5b602087015160408801516060890151608090990151929a91995097965090945092505050565b608051610c176101ff5f395f6107d80152610c175ff3fe6080604052600436106100ef575f3560e01c80639c66018611610087578063a321010f11610057578063a321010f146102bc578063ddce10f2146102cf578063e30c3978146102e4578063f2fde38b1461030e575f80fd5b80639c660186146102475780639f50b66d1461025c578063a0191fd214610288578063a0f44c92146102a7575f80fd5b806379ba5097116100c257806379ba5097146101cc5780638da5cb5b146101e05780638e9311fb146102095780639352643214610228575f80fd5b80631f79a1e9146100f35780632bc91fed1461015e5780634c684c9f14610197578063715018a6146101b8575b5f80fd5b3480156100fe575f80fd5b5061013461010d366004610aa1565b60066020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610169575f80fd5b50610189610178366004610ad9565b60076020525f908152604090205481565b604051908152602001610155565b3480156101a2575f80fd5b506101b66101b1366004610aa1565b61032d565b005b3480156101c3575f80fd5b506101b66103aa565b3480156101d7575f80fd5b506101b66103e4565b3480156101eb575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610134565b348015610214575f80fd5b506101b6610223366004610aa1565b610460565b348015610233575f80fd5b506101b6610242366004610ad9565b6104d6565b348015610252575f80fd5b5061018960055481565b348015610267575f80fd5b506002546101349073ffffffffffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506101b66102a2366004610aa1565b61059e565b3480156102b2575f80fd5b5061018960035481565b6101b66102ca366004610afb565b6105db565b3480156102da575f80fd5b5061018960045481565b3480156102ef575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610134565b348015610319575f80fd5b506101b6610328366004610ad9565b6108a7565b610335610956565b805f0361036e576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048190556040518181527f64123bf7c7035196f2d7ebd814dd38723a50985772a9708ab0ec4c287c05ddf1906020015b60405180910390a150565b6103b2610956565b6040517f77aeb0ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154339073ffffffffffffffffffffffffffffffffffffffff168114610454576040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b61045d816109aa565b50565b610468610956565b805f036104a1576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058190556040518181527f8bf322bdef1451038a05b5ad7400dfd04e786ce4fc2db3c39383639b2bf0810c9060200161039f565b6104de610956565b73ffffffffffffffffffffffffffffffffffffffff811661052b576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f60bbbc32b9b44d1717dc955064d834932a23eaf22b37e12a265bd6ea8f28339d9060200161039f565b6105a6610956565b60038190556040518181527f9c38cfa39c08c0d55650101f668d291bfd2be949224f75cbe2e2279e63f207da9060200161039f565b42811115610615576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546106228242610b7b565b111561065a576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526006602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690861681148015906106b5575073ffffffffffffffffffffffffffffffffffffffff81165f9081526007602052604090205442105b156106ec576040517f7f35c3de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556004546107449042610b94565b73ffffffffffffffffffffffffffffffffffffffff8781165f908152600760209081526040918290209390935560025460035491517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b16948101949094526034840186905290911691633bc778e39188916107d5906054016040516020818303038152906040526109db565b887f0000000000000000000000000000000000000000000000000000000000000000896040518763ffffffff1660e01b815260040161081996959493929190610ba7565b5f604051808303815f87803b158015610830575f80fd5b505af1158015610842573d5f803e3d5ffd5b5050505073ffffffffffffffffffffffffffffffffffffffff86165f818152600760209081526040918290205491519182527fff3030c6130ceef62c6e2035eff94706ab44e8d46a7acc3135c720ee3fac964e910160405180910390a2505050505050565b6108af610956565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556109115f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146109a8576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161044b565b565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561045d81610a2d565b5f6008826040516020016109ef9190610bde565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120901c92915050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610ab1575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461045d575f80fd5b5f60208284031215610ae9575f80fd5b8135610af481610ab8565b9392505050565b5f805f805f6101808688031215610b10575f80fd5b8535610b1b81610ab8565b94506020860135935060408601359250610160860187811115610b3c575f80fd5b94979396509194606001933592915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610b8e57610b8e610b4e565b92915050565b80820180821115610b8e57610b8e610b4e565b5f6101a0820190508782528660208301528560408301528460608301528360808301526101008360a0840137979650505050505050565b5f82515f5b81811015610bfd5760208186018101518583015201610be3565b505f92019182525091905056fea164736f6c6343000817000a00000000000000000000000017b354dd2595411ff79041f930e491a4df39a278000000000000000000000000000000000000000000000000000000000000000100d5b5db70bda32ef7812459f5edecda296cffb3529141e15fae18751275864d0000000000000000000000000000000000000000000000000000000000dd7c000000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x6080604052600436106100ef575f3560e01c80639c66018611610087578063a321010f11610057578063a321010f146102bc578063ddce10f2146102cf578063e30c3978146102e4578063f2fde38b1461030e575f80fd5b80639c660186146102475780639f50b66d1461025c578063a0191fd214610288578063a0f44c92146102a7575f80fd5b806379ba5097116100c257806379ba5097146101cc5780638da5cb5b146101e05780638e9311fb146102095780639352643214610228575f80fd5b80631f79a1e9146100f35780632bc91fed1461015e5780634c684c9f14610197578063715018a6146101b8575b5f80fd5b3480156100fe575f80fd5b5061013461010d366004610aa1565b60066020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610169575f80fd5b50610189610178366004610ad9565b60076020525f908152604090205481565b604051908152602001610155565b3480156101a2575f80fd5b506101b66101b1366004610aa1565b61032d565b005b3480156101c3575f80fd5b506101b66103aa565b3480156101d7575f80fd5b506101b66103e4565b3480156101eb575f80fd5b505f5473ffffffffffffffffffffffffffffffffffffffff16610134565b348015610214575f80fd5b506101b6610223366004610aa1565b610460565b348015610233575f80fd5b506101b6610242366004610ad9565b6104d6565b348015610252575f80fd5b5061018960055481565b348015610267575f80fd5b506002546101349073ffffffffffffffffffffffffffffffffffffffff1681565b348015610293575f80fd5b506101b66102a2366004610aa1565b61059e565b3480156102b2575f80fd5b5061018960035481565b6101b66102ca366004610afb565b6105db565b3480156102da575f80fd5b5061018960045481565b3480156102ef575f80fd5b5060015473ffffffffffffffffffffffffffffffffffffffff16610134565b348015610319575f80fd5b506101b6610328366004610ad9565b6108a7565b610335610956565b805f0361036e576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60048190556040518181527f64123bf7c7035196f2d7ebd814dd38723a50985772a9708ab0ec4c287c05ddf1906020015b60405180910390a150565b6103b2610956565b6040517f77aeb0ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600154339073ffffffffffffffffffffffffffffffffffffffff168114610454576040517f118cdaa700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff821660048201526024015b60405180910390fd5b61045d816109aa565b50565b610468610956565b805f036104a1576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60058190556040518181527f8bf322bdef1451038a05b5ad7400dfd04e786ce4fc2db3c39383639b2bf0810c9060200161039f565b6104de610956565b73ffffffffffffffffffffffffffffffffffffffff811661052b576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f60bbbc32b9b44d1717dc955064d834932a23eaf22b37e12a265bd6ea8f28339d9060200161039f565b6105a6610956565b60038190556040518181527f9c38cfa39c08c0d55650101f668d291bfd2be949224f75cbe2e2279e63f207da9060200161039f565b42811115610615576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005546106228242610b7b565b111561065a576040517fc52a9bd300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526006602052604090205473ffffffffffffffffffffffffffffffffffffffff90811690861681148015906106b5575073ffffffffffffffffffffffffffffffffffffffff81165f9081526007602052604090205442105b156106ec576040517f7f35c3de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f84815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff88161790556004546107449042610b94565b73ffffffffffffffffffffffffffffffffffffffff8781165f908152600760209081526040918290209390935560025460035491517fffffffffffffffffffffffffffffffffffffffff00000000000000000000000060608c901b16948101949094526034840186905290911691633bc778e39188916107d5906054016040516020818303038152906040526109db565b887f00d5b5db70bda32ef7812459f5edecda296cffb3529141e15fae18751275864d896040518763ffffffff1660e01b815260040161081996959493929190610ba7565b5f604051808303815f87803b158015610830575f80fd5b505af1158015610842573d5f803e3d5ffd5b5050505073ffffffffffffffffffffffffffffffffffffffff86165f818152600760209081526040918290205491519182527fff3030c6130ceef62c6e2035eff94706ab44e8d46a7acc3135c720ee3fac964e910160405180910390a2505050505050565b6108af610956565b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff000000000000000000000000000000000000000090911681179091556109115f5473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146109a8576040517f118cdaa700000000000000000000000000000000000000000000000000000000815233600482015260240161044b565b565b600180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905561045d81610a2d565b5f6008826040516020016109ef9190610bde565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120901c92915050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610ab1575f80fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461045d575f80fd5b5f60208284031215610ae9575f80fd5b8135610af481610ab8565b9392505050565b5f805f805f6101808688031215610b10575f80fd5b8535610b1b81610ab8565b94506020860135935060408601359250610160860187811115610b3c575f80fd5b94979396509194606001933592915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610b8e57610b8e610b4e565b92915050565b80820180821115610b8e57610b8e610b4e565b5f6101a0820190508782528660208301528560408301528460608301528360808301526101008360a0840137979650505050505050565b5f82515f5b81811015610bfd5760208186018101518583015201610be3565b505f92019182525091905056fea164736f6c6343000817000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000017b354dd2595411ff79041f930e491a4df39a278000000000000000000000000000000000000000000000000000000000000000100d5b5db70bda32ef7812459f5edecda296cffb3529141e15fae18751275864d0000000000000000000000000000000000000000000000000000000000dd7c000000000000000000000000000000000000000000000000000000000000093a80
-----Decoded View---------------
Arg [0] : _worldIdRouter (address): 0x17B354dD2595411ff79041f930e491A4Df39A278
Arg [1] : _groupId (uint256): 1
Arg [2] : _externalNullifierHash (uint256): 377593556987874043165400752883455722895901692332643678318174569531027326541
Arg [3] : _verificationLength (uint256): 14515200
Arg [4] : _maxProofTime (uint256): 604800
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000017b354dd2595411ff79041f930e491a4df39a278
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [2] : 00d5b5db70bda32ef7812459f5edecda296cffb3529141e15fae18751275864d
Arg [3] : 0000000000000000000000000000000000000000000000000000000000dd7c00
Arg [4] : 0000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode Sourcemap
10283:9192:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13868:50;;;;;;;;;;-1:-1:-1;13868:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;375:42:1;363:55;;;345:74;;333:2;318:18;13868:50:0;;;;;;;;14067:64;;;;;;;;;;-1:-1:-1;14067:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;987:25:1;;;975:2;960:18;14067:64:0;841:177:1;18568:287:0;;;;;;;;;;-1:-1:-1;18568:287:0;;;;;:::i;:::-;;:::i;:::-;;19361:111;;;;;;;;;;;;;:::i;9876:235::-;;;;;;;;;;;;;:::i;5239:87::-;;;;;;;;;;-1:-1:-1;5285:7:0;5312:6;;;5239:87;;19062:229;;;;;;;;;;-1:-1:-1;19062:229:0;;;;;:::i;:::-;;:::i;17804:291::-;;;;;;;;;;-1:-1:-1;17804:291:0;;;;;:::i;:::-;;:::i;13687:27::-;;;;;;;;;;;;;;;;13183:35;;;;;;;;;;-1:-1:-1;13183:35:0;;;;;;;;18226:136;;;;;;;;;;-1:-1:-1;18226:136:0;;;;;:::i;:::-;;:::i;13310:22::-;;;;;;;;;;;;;;;;16326:1075;;;;;;:::i;:::-;;:::i;13544:33::-;;;;;;;;;;;;;;;;8948:101;;;;;;;;;;-1:-1:-1;9028:13:0;;;;8948:101;;9248:197;;;;;;;;;;-1:-1:-1;9248:197:0;;;;;:::i;:::-;;:::i;18568:287::-;5125:13;:11;:13::i;:::-;18678:19:::1;18701:1;18678:24:::0;18674:59:::1;;18711:22;;;;;;;;;;;;;;18674:59;18746:18;:40:::0;;;18802:45:::1;::::0;987:25:1;;;18802:45:0::1;::::0;975:2:1;960:18;18802:45:0::1;;;;;;;;18568:287:::0;:::o;19361:111::-;5125:13;:11;:13::i;:::-;19439:25:::1;;;;;;;;;;;;;;9876:235:::0;9028:13;;835:10;;9973:24;9028:13;9973:24;;9969:98;;10021:34;;;;;375:42:1;363:55;;10021:34:0;;;345:74:1;318:18;;10021:34:0;;;;;;;;9969:98;10077:26;10096:6;10077:18;:26::i;:::-;9918:193;9876:235::o;19062:229::-;5125:13;:11;:13::i;:::-;19144::::1;19161:1;19144:18:::0;19140:53:::1;;19171:22;;;;;;;;;;;;;;19140:53;19206:12;:28:::0;;;19250:33:::1;::::0;987:25:1;;;19250:33:0::1;::::0;975:2:1;960:18;19250:33:0::1;841:177:1::0;17804:291:0;5125:13;:11;:13::i;:::-;17911:37:::1;::::0;::::1;17907:85;;17970:22;;;;;;;;;;;;;;17907:85;18005:13;:30:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;18051:36:::1;::::0;345:74:1;;;18051:36:0::1;::::0;333:2:1;318:18;18051:36:0::1;199:226:1::0;18226:136:0;5125:13;:11;:13::i;:::-;18294:7:::1;:18:::0;;;18330:24:::1;::::0;987:25:1;;;18330:24:0::1;::::0;975:2:1;960:18;18330:24:0::1;841:177:1::0;16326:1075:0;16547:15;16535:9;:27;16531:62;;;16571:22;;;;;;;;;;;;;;16531:62;16638:12;;16608:27;16626:9;16608:15;:27;:::i;:::-;:42;16604:104;;;16674:22;;;;;;;;;;;;;;16604:104;16720:23;16746:30;;;:15;:30;;;;;;;;;;;16805:26;;;;;;;:98;;-1:-1:-1;16848:37:0;;;;;;;:20;:37;;;;;;16888:15;-1:-1:-1;16805:98:0;16787:162;;;16922:27;;;;;;;;;;;;;;16787:162;16962:30;;;;:15;:30;;;;;:40;;;;;;;;;;17063:18;;17045:36;;:15;:36;:::i;:::-;17013:29;;;;;;;;:20;:29;;;;;;;;;:68;;;;17094:13;;17153:7;;17175:36;;2794:66:1;2781:2;2777:15;;;2773:88;17175:36:0;;;2761:101:1;;;;2878:12;;;2871:28;;;17094:13:0;;;;:25;;17134:4;;17175:50;;2915:12:1;;17175:36:0;;;;;;;;;;;;:48;:50::i;:::-;17240:13;17268:21;17304:5;17094:226;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;17338:55:0;;;17363:29;;;;:20;:29;;;;;;;;;;17338:55;;987:25:1;;;17338:55:0;;960:18:1;17338:55:0;;;;;;;16520:881;16326:1075;;;;;:::o;9248:197::-;5125:13;:11;:13::i;:::-;9354::::1;:24:::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;9419:7:::1;5285::::0;5312:6;;;;5239:87;9419:7:::1;9394:43;;;;;;;;;;;;9248:197:::0;:::o;5404:166::-;5285:7;5312:6;5464:23;5312:6;835:10;5464:23;5460:103;;5511:40;;;;;835:10;5511:40;;;345:74:1;318:18;;5511:40:0;199:226:1;5460:103:0;5404:166::o;9635:156::-;9725:13;9718:20;;;;;;9749:34;9774:8;9749:24;:34::i;3409:147::-;3473:7;3547:1;3535:5;3518:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;3508:34;;3518:23;3508:34;;;;3500:48;;;3409:147;-1:-1:-1;;3409:147:0:o;6552:191::-;6626:16;6645:6;;;6662:17;;;;;;;;;;6695:40;;6645:6;;;;;;;6695:40;;6626:16;6695:40;6615:128;6552:191;:::o;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;430:154::-;516:42;509:5;505:54;498:5;495:65;485:93;;574:1;571;564:12;589:247;648:6;701:2;689:9;680:7;676:23;672:32;669:52;;;717:1;714;707:12;669:52;756:9;743:23;775:31;800:5;775:31;:::i;:::-;825:5;589:247;-1:-1:-1;;;589:247:1:o;1550:597::-;1670:6;1678;1686;1694;1702;1755:3;1743:9;1734:7;1730:23;1726:33;1723:53;;;1772:1;1769;1762:12;1723:53;1811:9;1798:23;1830:31;1855:5;1830:31;:::i;:::-;1880:5;-1:-1:-1;1932:2:1;1917:18;;1904:32;;-1:-1:-1;1983:2:1;1968:18;;1955:32;;-1:-1:-1;2021:3:1;2006:19;;2037:15;;;2034:35;;;2065:1;2062;2055:12;2034:35;1550:597;;;;-1:-1:-1;1550:597:1;;2103:2;2088:18;;2125:16;;1550:597;-1:-1:-1;;1550:597:1:o;2152:184::-;2204:77;2201:1;2194:88;2301:4;2298:1;2291:15;2325:4;2322:1;2315:15;2341:128;2408:9;;;2429:11;;;2426:37;;;2443:18;;:::i;:::-;2341:128;;;;:::o;2474:125::-;2539:9;;;2560:10;;;2557:36;;;2573:18;;:::i;2938:597::-;3218:4;3260:3;3249:9;3245:19;3237:27;;3291:6;3280:9;3273:25;3334:6;3329:2;3318:9;3314:18;3307:34;3377:6;3372:2;3361:9;3357:18;3350:34;3420:6;3415:2;3404:9;3400:18;3393:34;3464:6;3458:3;3447:9;3443:19;3436:35;3522:6;3514;3508:3;3497:9;3493:19;3480:49;2938:597;;;;;;;;;:::o;3540:412::-;3669:3;3707:6;3701:13;3732:1;3742:129;3756:6;3753:1;3750:13;3742:129;;;3854:4;3838:14;;;3834:25;;3828:32;3815:11;;;3808:53;3771:12;3742:129;;;-1:-1:-1;3926:1:1;3890:16;;3915:13;;;-1:-1:-1;3890:16:1;3540:412;-1:-1:-1;3540:412:1:o
Swarm Source
none
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
WORLD | 100.00% | $0.87355 | 0.5 | $0.4367 |
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.