ETH Price: $2,012.87 (+7.08%)

Contract

0x57b930D551e677CC36e2fA036Ae2fe8FdaE0330D

Overview

ETH Balance

0 ETH

ETH Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Verify27130242024-08-27 12:28:07204 days ago1724761687IN
World Chain: World ID Address Book
0 ETH0.000000320.00100025

Parent Transaction Hash Block From To
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WorldIDAddressBook

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 1 : WorldIDAddressBook.sol
// 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();
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none"
  },
  "libraries": {}
}

Contract Security Audit

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"}]

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.