APE Price: $0.56 (+1.07%)

Contract

0x00000000d7b37203F54e165Fb204B57c30d15835

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Parent Transaction Hash Block From To
76584042025-01-06 19:53:1078 days ago1736193190  Contract Creation0 APE

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RoleSetServer

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
cancun EvmVersion, None license
File 1 of 2 : RoleSetServer.sol
pragma solidity 0.8.24;

import "@limitbreak/tm-core-lib/src/utils/security/IRoleClient.sol";

/**
 * @title  RoleSetServer
 * @author Limit Break, Inc.
 * @notice RoleSetServer stores holders of roles as defined by the role set admin.
 *         Contracts using the RoleClient implementation may receive pushed updates
 *         from the RoleSetServer or may call the RoleSetServer to receive updated role
 *         holder data.
 */
contract RoleSetServer {
    /// @dev Struct that defines the pending admin and allowed transfer timestamp.
    struct PendingAdminTransfer {
        address pendingAdmin;
        uint96 allowedTransferTimestamp;
    }

    struct RoleHolder {
        address roleHolder;
        bool initialized;
        bool unclearable;
    }

    /// @dev Emitted when the holder of a role is updated.
    event RoleUpdated(bytes32 indexed role, address indexed newRoleHolder, bool clearable);
    /// @dev Emitted when a role set admin is updated.
    event RoleSetAdminUpdated(bytes32 indexed roleSet, address indexed prevAdmin, address indexed newAdmin);
    /// @dev Emitted when a role set admin is proposed to transfer to a new address.
    event RoleSetAdminPendingTransfer(bytes32 indexed roleSet, address indexed pendingAdmin, uint96 allowedTransferTimestamp);

    /// @dev Thrown when batch updating role holders and the array lengths are not equal.
    error RoleSetServer__ArrayLengthMismatch();
    /// @dev Thrown when a call is made to set a role and the caller is not the role server admin.
    error RoleSetServer__CallerMustBeAdmin();
    /// @dev Thrown when accepting an admin transfer when the caller is not the pending admin or it is before the allowed transfer time.
    error RoleSetServer__InvalidAdminTransfer();
    /// @dev Thrown when a call is made to create a role set and it already exists.
    error RoleSetServer__RoleSetAlreadyCreated();
    /// @dev Thrown when setting a role holder to the zero address when it is defined as unclearable.
    error RoleSetServer__RoleUnclearable();
    /// @dev Thrown when setting a role and clearable does not match its initial value.
    error RoleSetServer__ClearableMismatch();

    /// @dev Mapping of role sets to admins.
    mapping (bytes32 roleSet => address roleSetAdmin) public roleSetAdmin;
    /// @dev Mapping of role set to pending admin awaiting acceptance of admin transfer.
    mapping (bytes32 roleSet => PendingAdminTransfer pendingAdminTransfer) public roleSetPendingAdmin;

    /// @dev Mapping of roles to the role holders.
    mapping (bytes32 role => RoleHolder roleHolder) private _roleHolders;

    uint48 public constant ADMIN_TRANSFER_DELAY = 1 hours;

    modifier onlyRoleSetAdmin(bytes32 roleSet) {
        if (roleSetAdmin[roleSet] != msg.sender) {
            revert RoleSetServer__CallerMustBeAdmin();
        }
        _;
    }

    modifier onlyRoleSetPendingAdmin(bytes32 roleSet) {
        PendingAdminTransfer memory pendingAdminTransfer = roleSetPendingAdmin[roleSet];
        if (
            pendingAdminTransfer.pendingAdmin != msg.sender 
            || block.timestamp < pendingAdminTransfer.allowedTransferTimestamp
        ) {
            revert RoleSetServer__InvalidAdminTransfer();
        }
        _;
    }

    /**
     * @notice Creates a new role set on the role server that is initially owned by the caller.
     * 
     * @dev    Throws when the role set already exists.
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. The caller is set as the role admin.
     * @dev    2. A `RoleSetAdminUpdated` event is emitted.
     * 
     * @param salt  A salt value for creating a unique role set for the admin.
     * 
     * @return roleSet  The role set that has been created.
     */
    function createRoleSet(bytes32 salt) external returns (bytes32 roleSet) {
        roleSet = keccak256(abi.encode(msg.sender, salt));
        if (roleSetAdmin[roleSet] != address(0)) {
            revert RoleSetServer__RoleSetAlreadyCreated();
        }
        roleSetAdmin[roleSet] = msg.sender;
        emit RoleSetAdminUpdated(roleSet, address(0), msg.sender);
    }

    /**
     * @notice Transfers ownership of a role set to a new admin. Utilizes a two-step transfer process that
     * @notice requires the new admin to accept the admin transfer.
     * 
     * @dev    Throws when the caller is not the current role set admin. 
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. The new admin is stored as the pending admin.
     * @dev    2. A `RoleSetAdminPendingTransfer` event is emitted.
     * 
     * @param roleSet   The role set to update the admin of.
     * @param newAdmin  Address of the new role set admin.
     */
    function transferRoleSetAdmin(bytes32 roleSet, address newAdmin) external onlyRoleSetAdmin(roleSet) {
        roleSetPendingAdmin[roleSet].pendingAdmin = newAdmin;
        uint96 allowedTransferTimestamp = uint96(block.timestamp + ADMIN_TRANSFER_DELAY);
        roleSetPendingAdmin[roleSet].allowedTransferTimestamp = allowedTransferTimestamp;

        emit RoleSetAdminPendingTransfer(roleSet, newAdmin, allowedTransferTimestamp);
    }

    /**
     * @notice Revokes an admin transfer for a role set prior to the new admin accepting.
     * 
     * @dev    Throws when the caller is not the current role set admin.
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. The pending admin address is set to the zero address.
     * @dev    2. A `RoleSetAdminPendingTransfer` event is emitted.
     * 
     * @param roleSet   The role set to revoke the pending admin transfer of.
     */
    function revokeRoleSetAdminTransfer(bytes32 roleSet) external onlyRoleSetAdmin(roleSet) {
        delete roleSetPendingAdmin[roleSet];

        emit RoleSetAdminPendingTransfer(roleSet, address(0), 0);
    }

    /**
     * @notice Accepts the transfer of a role set admin by the pending admin.
     * 
     * @dev    Throws when the caller is not the pending role set admin.
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. The new admin is stored as the role set admin.
     * @dev    2. The pending admin is cleared from the role set pending admin mapping.
     * @dev    2. A `RoleSetAdminUpdated` event is emitted.
     * 
     * @param roleSet   The role set to update the admin of.
     */
    function acceptRoleSetAdmin(bytes32 roleSet) external onlyRoleSetPendingAdmin(roleSet) {
        address prevAdmin = roleSetAdmin[roleSet];
        roleSetAdmin[roleSet] = msg.sender;
        delete roleSetPendingAdmin[roleSet];

        emit RoleSetAdminUpdated(roleSet, prevAdmin, msg.sender);
    }

    /**
     * @notice Returns the holder of a role.
     * 
     * @param role  The role to return role holder for.
     * 
     * @return roleHolder  The holder of the role.
     */
    function getRoleHolder(bytes32 role) external view returns (address roleHolder) {
        roleHolder = _roleHolders[role].roleHolder;
    }

    /**
     * @notice Updates the role holder for a role.
     * 
     * @dev    Throws when called by an address that is not the admin.
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. Role holder is updated in the storage mapping.
     * @dev    2. A `RoleUpdated` event is emitted.
     * @dev    3. `onRoleHolderChanged` is called on each client supplied in `clients`.
     * 
     * @param roleSet     The role set the role belongs to.
     * @param baseRole    The role to set the holder of prior to hashing with the role set.
     * @param newRoleHolder  The address to set as the holder of the role.
     * @param clients     Array of client addresses to call `onRoleHolderChanged` on.
     */
    function setRoleHolder(bytes32 roleSet, bytes32 baseRole, address newRoleHolder, bool clearable, IRoleClient[] calldata clients) external onlyRoleSetAdmin(roleSet) {
        _setRoleHolder(roleSet, baseRole, newRoleHolder, clearable, clients);
    }

    /**
     * @notice Updates the role holder for multiple roles.
     * 
     * @dev    Throws when called by an address that is not the admin of the role set.
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. Role holder is updated in the storage mapping for each role/holder supplied.
     * @dev    2. A `RoleUpdated` event is emitted for each role/holder supplied.
     * @dev    3. `onRoleHolderChanged` is called on each client supplied in `clients`.
     * 
     * @param roleSet         The role set the roles belong to.
     * @param baseRoles       Array of roles to set the holder of.
     * @param newRoleHolders  Array of addresses to set as the holders of roles.
     * @param clients         Array of client addresses to call `onRoleHolderChanged` on.
     */
    function setRoleHolders(
        bytes32 roleSet,
        bytes32[] calldata baseRoles,
        address[] calldata newRoleHolders,
        bool[] calldata clearable,
        IRoleClient[][] calldata clients
    ) external onlyRoleSetAdmin(roleSet) {
        if (baseRoles.length != newRoleHolders.length 
            || baseRoles.length != clients.length 
            || baseRoles.length != clearable.length
        ) {
            revert RoleSetServer__ArrayLengthMismatch();
        }

        for (uint256 i = 0; i < baseRoles.length; i++) {
            _setRoleHolder(roleSet, baseRoles[i], newRoleHolders[i], clearable[i], clients[i]);
        }
    }

    /**
     * @notice Pushes the latest role holder for an array of `roles` to `client`.
     * 
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. `onRoleHolderChanged` is called on `client` for each role in `roles`.
     * 
     * @param roles   Array of roles to update the `client` with.
     * @param client  Address of the client to call `onRoleHolderChanged` on.
     */
    function syncClient(bytes32[] calldata roles, IRoleClient client) external {
        bytes32 role;
        for (uint256 i = 0; i < roles.length; ++i) {
            role = roles[i];
            client.onRoleHolderChanged(role, _roleHolders[role].roleHolder);
        }
    }

    /**
     * @notice Pushes the latest role holder for an array of `roles` to an array of `clients`.
     * 
     * @dev    
     * @dev    <h4>Postconditions:</h4>
     * @dev    1. `onRoleHolderChanged` is called on each client in `clients` for each role in `roles`.
     * 
     * @param roles    Array of roles to update the `client` with.
     * @param clients  Array of client addresses to call `onRoleHolderChanged` on.
     */
    function syncClients(bytes32[] calldata roles, IRoleClient[][] calldata clients) external {
        if (roles.length != clients.length) {
            revert RoleSetServer__ArrayLengthMismatch();
        }

        bytes32 role;
        address roleHolder;
        for (uint256 i = 0; i < roles.length; ++i) {
            role = roles[i];
            roleHolder = _roleHolders[role].roleHolder;

            IRoleClient[] calldata roleClients = clients[i];
            for (uint256 j = 0; j < roleClients.length; ++j) {
                roleClients[j].onRoleHolderChanged(role, roleHolder);
            }
        }
    }



    /**
     * @dev  Internal function to set a role holder.
     * 
     * @param roleSet        The role set the role belongs to.
     * @param baseRole       The role to set the holder of prior to hashing with the role set.
     * @param newRoleHolder  The address to set as the holder of the role.
     * @param clearable      True if the role is clearable in the future.
     * @param clients        Array of client addresses to call `onRoleHolderChanged` on.
     */
    function _setRoleHolder(bytes32 roleSet, bytes32 baseRole, address newRoleHolder, bool clearable, IRoleClient[] calldata clients) internal {
        bytes32 role = keccak256(abi.encode(roleSet, baseRole));

        RoleHolder storage _roleHolder = _roleHolders[role];
        if (_roleHolder.unclearable && newRoleHolder == address(0)) {
            revert RoleSetServer__RoleUnclearable();
        }
        if (_roleHolder.initialized) {
            if (_roleHolder.unclearable == clearable) {
                revert RoleSetServer__ClearableMismatch();
            }
        } else {
            _roleHolder.initialized = true;
            _roleHolder.unclearable = !clearable;
        }

        _roleHolder.roleHolder = newRoleHolder;
        emit RoleUpdated(role, newRoleHolder, clearable);

        for (uint256 i = 0; i < clients.length; ++i) {
            clients[i].onRoleHolderChanged(role, newRoleHolder);
        }
    }
}

File 2 of 2 : IRoleClient.sol
pragma solidity ^0.8.4;

interface IRoleClient {
    function onRoleHolderChanged(bytes32 /*role*/, address /*roleHolder*/) external;
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "@limitbreak/tm-core-lib/=lib/tm-core-lib/",
    "tm-core-lib/=lib/tm-core-lib/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"RoleSetServer__ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"RoleSetServer__CallerMustBeAdmin","type":"error"},{"inputs":[],"name":"RoleSetServer__ClearableMismatch","type":"error"},{"inputs":[],"name":"RoleSetServer__InvalidAdminTransfer","type":"error"},{"inputs":[],"name":"RoleSetServer__RoleSetAlreadyCreated","type":"error"},{"inputs":[],"name":"RoleSetServer__RoleUnclearable","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"indexed":true,"internalType":"address","name":"pendingAdmin","type":"address"},{"indexed":false,"internalType":"uint96","name":"allowedTransferTimestamp","type":"uint96"}],"name":"RoleSetAdminPendingTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"indexed":true,"internalType":"address","name":"prevAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"RoleSetAdminUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"newRoleHolder","type":"address"},{"indexed":false,"internalType":"bool","name":"clearable","type":"bool"}],"name":"RoleUpdated","type":"event"},{"inputs":[],"name":"ADMIN_TRANSFER_DELAY","outputs":[{"internalType":"uint48","name":"","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"acceptRoleSetAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"createRoleSet","outputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleHolder","outputs":[{"internalType":"address","name":"roleHolder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"revokeRoleSetAdminTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"roleSetAdmin","outputs":[{"internalType":"address","name":"roleSetAdmin","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"}],"name":"roleSetPendingAdmin","outputs":[{"internalType":"address","name":"pendingAdmin","type":"address"},{"internalType":"uint96","name":"allowedTransferTimestamp","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"bytes32","name":"baseRole","type":"bytes32"},{"internalType":"address","name":"newRoleHolder","type":"address"},{"internalType":"bool","name":"clearable","type":"bool"},{"internalType":"contract IRoleClient[]","name":"clients","type":"address[]"}],"name":"setRoleHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"bytes32[]","name":"baseRoles","type":"bytes32[]"},{"internalType":"address[]","name":"newRoleHolders","type":"address[]"},{"internalType":"bool[]","name":"clearable","type":"bool[]"},{"internalType":"contract IRoleClient[][]","name":"clients","type":"address[][]"}],"name":"setRoleHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"},{"internalType":"contract IRoleClient","name":"client","type":"address"}],"name":"syncClient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"roles","type":"bytes32[]"},{"internalType":"contract IRoleClient[][]","name":"clients","type":"address[][]"}],"name":"syncClients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"roleSet","type":"bytes32"},{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferRoleSetAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561000f575f80fd5b506112018061001d5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806367a0b3461161007d57806379a05a311161005857806379a05a311461027f578063b7039e5b1461029f578063f6e5d9a1146102b2575f80fd5b806367a0b346146102245780636a7926661461023757806375d86e041461024a575f80fd5b8063466e7b64116100ad578063466e7b64146101a45780634f4270e4146101b7578063663e4335146101ca575f80fd5b80630e3f59ab146100d357806319c0f64a146100f95780633bb6a80d1461018f575b5f80fd5b6100e66100e1366004610e07565b6102c5565b6040519081526020015b60405180910390f35b610156610107366004610e07565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100f0565b6101a261019d366004610e66565b6103d5565b005b6101a26101b2366004610e07565b610537565b6101a26101c5366004610f2c565b610681565b6101ff6101d8366004610e07565b5f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f0565b6101a2610232366004610fb7565b61080f565b6101a261024536600461101e565b6108df565b6101ff610258366004610e07565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610288610e1081565b60405165ffffffffffff90911681526020016100f0565b6101a26102ad366004611093565b61094b565b6101a26102c0366004610e07565b610a95565b604080513360208201529081018290525f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181529283905291205490915073ffffffffffffffffffffffffffffffffffffffff161561036b576040517fbbc10a2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155905190919083907f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf908390a4919050565b5f89815260208190526040902054899073ffffffffffffffffffffffffffffffffffffffff163314610433576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87861415806104425750878214155b8061044d5750878414155b15610484576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8881101561052a576105228b8b8b848181106104a4576104a46110c1565b905060200201358a8a858181106104bd576104bd6110c1565b90506020020160208101906104d291906110ee565b8989868181106104e4576104e46110c1565b90506020020160208101906104f99190611110565b88888781811061050b5761050b6110c1565b905060200281019061051d9190611129565b610b3b565b600101610486565b5050505050505050505050565b5f8181526001602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152829190331415806105bb575080602001516bffffffffffffffffffffffff1642105b156105f2576040517faaa0122e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152602081815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092556001909352818420849055905173ffffffffffffffffffffffffffffffffffffffff909216929091839187917f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf9190a450505050565b8281146106ba576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b85811015610806578686828181106106d8576106d86110c1565b602090810292909201355f8181526002909352604083205490955073ffffffffffffffffffffffffffffffffffffffff16935036919050868684818110610721576107216110c1565b90506020028101906107339190611129565b915091505f5b818110156107f857828282818110610753576107536110c1565b905060200201602081019061076891906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8781166024830152919091169063fa5375fd906044015f604051808303815f87803b1580156107d7575f80fd5b505af11580156107e9573d5f803e3d5ffd5b50505050806001019050610739565b5050508060010190506106be565b50505050505050565b5f805b838110156108d85784848281811061082c5761082c6110c1565b602090810292909201355f81815260029093526040928390205492517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff93841660248201529094509185169163fa5375fd91506044015f604051808303815f87803b1580156108b7575f80fd5b505af11580156108c9573d5f803e3d5ffd5b50505050806001019050610812565b5050505050565b5f86815260208190526040902054869073ffffffffffffffffffffffffffffffffffffffff16331461093d576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806878787878787610b3b565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146109a9576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055610a00610e104261118d565b5f8581526001602090815260409182902080546bffffffffffffffffffffffff851674010000000000000000000000000000000000000000810273ffffffffffffffffffffffffffffffffffffffff9283161790925592519081529293509085169186917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a350505050565b5f81815260208190526040902054819073ffffffffffffffffffffffffffffffffffffffff163314610af3576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526001602090815260408083208390555182815284917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a35050565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091205f818152600290925291902080547501000000000000000000000000000000000000000000900460ff168015610bb0575073ffffffffffffffffffffffffffffffffffffffff8616155b15610be7576040517f07adbf5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805474010000000000000000000000000000000000000000900460ff1615610c69578054851515750100000000000000000000000000000000000000000090910460ff16151503610c64576040517f656ab3ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc4565b805475010000000000000000000000000000000000000000008615027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617740100000000000000000000000000000000000000001781555b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081178255604051861515815283907f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d49060200160405180910390a35f5b83811015610dfc57848482818110610d5757610d576110c1565b9050602002016020810190610d6c91906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152919091169063fa5375fd906044015f604051808303815f87803b158015610ddb575f80fd5b505af1158015610ded573d5f803e3d5ffd5b50505050806001019050610d3d565b505050505050505050565b5f60208284031215610e17575f80fd5b5035919050565b5f8083601f840112610e2e575f80fd5b50813567ffffffffffffffff811115610e45575f80fd5b6020830191508360208260051b8501011115610e5f575f80fd5b9250929050565b5f805f805f805f805f60a08a8c031215610e7e575f80fd5b8935985060208a013567ffffffffffffffff80821115610e9c575f80fd5b610ea88d838e01610e1e565b909a50985060408c0135915080821115610ec0575f80fd5b610ecc8d838e01610e1e565b909850965060608c0135915080821115610ee4575f80fd5b610ef08d838e01610e1e565b909650945060808c0135915080821115610f08575f80fd5b50610f158c828d01610e1e565b915080935050809150509295985092959850929598565b5f805f8060408587031215610f3f575f80fd5b843567ffffffffffffffff80821115610f56575f80fd5b610f6288838901610e1e565b90965094506020870135915080821115610f7a575f80fd5b50610f8787828801610e1e565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610fb4575f80fd5b50565b5f805f60408486031215610fc9575f80fd5b833567ffffffffffffffff811115610fdf575f80fd5b610feb86828701610e1e565b9094509250506020840135610fff81610f93565b809150509250925092565b80358015158114611019575f80fd5b919050565b5f805f805f8060a08789031215611033575f80fd5b8635955060208701359450604087013561104c81610f93565b935061105a6060880161100a565b9250608087013567ffffffffffffffff811115611075575f80fd5b61108189828a01610e1e565b979a9699509497509295939492505050565b5f80604083850312156110a4575f80fd5b8235915060208301356110b681610f93565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156110fe575f80fd5b813561110981610f93565b9392505050565b5f60208284031215611120575f80fd5b6111098261100a565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261115c575f80fd5b83018035915067ffffffffffffffff821115611176575f80fd5b6020019150600581901b3603821315610e5f575f80fd5b808201808211156111c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea2646970667358221220864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d064736f6c63430008180033

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c806367a0b3461161007d57806379a05a311161005857806379a05a311461027f578063b7039e5b1461029f578063f6e5d9a1146102b2575f80fd5b806367a0b346146102245780636a7926661461023757806375d86e041461024a575f80fd5b8063466e7b64116100ad578063466e7b64146101a45780634f4270e4146101b7578063663e4335146101ca575f80fd5b80630e3f59ab146100d357806319c0f64a146100f95780633bb6a80d1461018f575b5f80fd5b6100e66100e1366004610e07565b6102c5565b6040519081526020015b60405180910390f35b610156610107366004610e07565b60016020525f908152604090205473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1682565b6040805173ffffffffffffffffffffffffffffffffffffffff90931683526bffffffffffffffffffffffff9091166020830152016100f0565b6101a261019d366004610e66565b6103d5565b005b6101a26101b2366004610e07565b610537565b6101a26101c5366004610f2c565b610681565b6101ff6101d8366004610e07565b5f9081526002602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f0565b6101a2610232366004610fb7565b61080f565b6101a261024536600461101e565b6108df565b6101ff610258366004610e07565b5f6020819052908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b610288610e1081565b60405165ffffffffffff90911681526020016100f0565b6101a26102ad366004611093565b61094b565b6101a26102c0366004610e07565b610a95565b604080513360208201529081018290525f90606001604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301205f8181529283905291205490915073ffffffffffffffffffffffffffffffffffffffff161561036b576040517fbbc10a2800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8181526020819052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001633908117909155905190919083907f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf908390a4919050565b5f89815260208190526040902054899073ffffffffffffffffffffffffffffffffffffffff163314610433576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b87861415806104425750878214155b8061044d5750878414155b15610484576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8881101561052a576105228b8b8b848181106104a4576104a46110c1565b905060200201358a8a858181106104bd576104bd6110c1565b90506020020160208101906104d291906110ee565b8989868181106104e4576104e46110c1565b90506020020160208101906104f99190611110565b88888781811061050b5761050b6110c1565b905060200281019061051d9190611129565b610b3b565b600101610486565b5050505050505050505050565b5f8181526001602090815260409182902082518084019093525473ffffffffffffffffffffffffffffffffffffffff8116808452740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff1691830191909152829190331415806105bb575080602001516bffffffffffffffffffffffff1642105b156105f2576040517faaa0122e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f838152602081815260408083208054337fffffffffffffffffffffffff0000000000000000000000000000000000000000821681179092556001909352818420849055905173ffffffffffffffffffffffffffffffffffffffff909216929091839187917f034e23cd96df19e9244fa54cb2fe1a24a1f650c9943ef2f52c295f009483d4cf9190a450505050565b8281146106ba576040517f974beaf800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f5b85811015610806578686828181106106d8576106d86110c1565b602090810292909201355f8181526002909352604083205490955073ffffffffffffffffffffffffffffffffffffffff16935036919050868684818110610721576107216110c1565b90506020028101906107339190611129565b915091505f5b818110156107f857828282818110610753576107536110c1565b905060200201602081019061076891906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810188905273ffffffffffffffffffffffffffffffffffffffff8781166024830152919091169063fa5375fd906044015f604051808303815f87803b1580156107d7575f80fd5b505af11580156107e9573d5f803e3d5ffd5b50505050806001019050610739565b5050508060010190506106be565b50505050505050565b5f805b838110156108d85784848281811061082c5761082c6110c1565b602090810292909201355f81815260029093526040928390205492517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff93841660248201529094509185169163fa5375fd91506044015f604051808303815f87803b1580156108b7575f80fd5b505af11580156108c9573d5f803e3d5ffd5b50505050806001019050610812565b5050505050565b5f86815260208190526040902054869073ffffffffffffffffffffffffffffffffffffffff16331461093d576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610806878787878787610b3b565b5f82815260208190526040902054829073ffffffffffffffffffffffffffffffffffffffff1633146109a9576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f83815260016020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8516179055610a00610e104261118d565b5f8581526001602090815260409182902080546bffffffffffffffffffffffff851674010000000000000000000000000000000000000000810273ffffffffffffffffffffffffffffffffffffffff9283161790925592519081529293509085169186917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a350505050565b5f81815260208190526040902054819073ffffffffffffffffffffffffffffffffffffffff163314610af3576040517fa0fac51c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8281526001602090815260408083208390555182815284917f54cf4bcf0b72e90c2ae64dcaec8e29da8d56b5e07ffbc6f33c5f1ffd7205995e910160405180910390a35050565b604080516020808201899052818301889052825180830384018152606090920183528151918101919091205f818152600290925291902080547501000000000000000000000000000000000000000000900460ff168015610bb0575073ffffffffffffffffffffffffffffffffffffffff8616155b15610be7576040517f07adbf5800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805474010000000000000000000000000000000000000000900460ff1615610c69578054851515750100000000000000000000000000000000000000000090910460ff16151503610c64576040517f656ab3ec00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cc4565b805475010000000000000000000000000000000000000000008615027fffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffff90911617740100000000000000000000000000000000000000001781555b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff87169081178255604051861515815283907f5f0ecfd1ea5555d5b4b6140b49c92365beaf40d0a057dc34a9746990cd4ce8d49060200160405180910390a35f5b83811015610dfc57848482818110610d5757610d576110c1565b9050602002016020810190610d6c91906110ee565b6040517ffa5375fd0000000000000000000000000000000000000000000000000000000081526004810185905273ffffffffffffffffffffffffffffffffffffffff8981166024830152919091169063fa5375fd906044015f604051808303815f87803b158015610ddb575f80fd5b505af1158015610ded573d5f803e3d5ffd5b50505050806001019050610d3d565b505050505050505050565b5f60208284031215610e17575f80fd5b5035919050565b5f8083601f840112610e2e575f80fd5b50813567ffffffffffffffff811115610e45575f80fd5b6020830191508360208260051b8501011115610e5f575f80fd5b9250929050565b5f805f805f805f805f60a08a8c031215610e7e575f80fd5b8935985060208a013567ffffffffffffffff80821115610e9c575f80fd5b610ea88d838e01610e1e565b909a50985060408c0135915080821115610ec0575f80fd5b610ecc8d838e01610e1e565b909850965060608c0135915080821115610ee4575f80fd5b610ef08d838e01610e1e565b909650945060808c0135915080821115610f08575f80fd5b50610f158c828d01610e1e565b915080935050809150509295985092959850929598565b5f805f8060408587031215610f3f575f80fd5b843567ffffffffffffffff80821115610f56575f80fd5b610f6288838901610e1e565b90965094506020870135915080821115610f7a575f80fd5b50610f8787828801610e1e565b95989497509550505050565b73ffffffffffffffffffffffffffffffffffffffff81168114610fb4575f80fd5b50565b5f805f60408486031215610fc9575f80fd5b833567ffffffffffffffff811115610fdf575f80fd5b610feb86828701610e1e565b9094509250506020840135610fff81610f93565b809150509250925092565b80358015158114611019575f80fd5b919050565b5f805f805f8060a08789031215611033575f80fd5b8635955060208701359450604087013561104c81610f93565b935061105a6060880161100a565b9250608087013567ffffffffffffffff811115611075575f80fd5b61108189828a01610e1e565b979a9699509497509295939492505050565b5f80604083850312156110a4575f80fd5b8235915060208301356110b681610f93565b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f602082840312156110fe575f80fd5b813561110981610f93565b9392505050565b5f60208284031215611120575f80fd5b6111098261100a565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261115c575f80fd5b83018035915067ffffffffffffffff821115611176575f80fd5b6020019150600581901b3603821315610e5f575f80fd5b808201808211156111c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b9291505056fea2646970667358221220864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d064736f6c63430008180033

Deployed Bytecode Sourcemap

436:12051:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3747:369;;;;;;:::i;:::-;;:::i;:::-;;;345:25:2;;;333:2;318:18;3747:369:1;;;;;;;;2392:97;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;583:42:2;571:55;;;553:74;;675:26;663:39;;;658:2;643:18;;636:67;526:18;2392:97:1;381:328:2;8689:656:1;;;;;;:::i;:::-;;:::i;:::-;;6301:301;;;;;;:::i;:::-;;:::i;10453:618::-;;;;;;:::i;:::-;;:::i;6792:139::-;;;;;;:::i;:::-;6852:18;6895;;;:12;:18;;;;;:29;;;;6792:139;;;;3603:42:2;3591:55;;;3573:74;;3561:2;3546:18;6792:139:1;3427:226:2;9737:273:1;;;;;;:::i;:::-;;:::i;7649:249::-;;;;;;:::i;:::-;;:::i;2228:69::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2622:53;;2668:7;2622:53;;;;;5589:14:2;5577:27;;;5559:46;;5547:2;5532:18;2622:53:1;5415:196:2;4695:437:1;;;;;;:::i;:::-;;:::i;5591:207::-;;;;;;:::i;:::-;;:::i;3747:369::-;3849:28;;;3860:10;3849:28;;;6123:74:2;6213:18;;;6206:34;;;3802:15:1;;6096:18:2;;3849:28:1;;;;;;;;;;;;;3839:39;;3849:28;3839:39;;;;3925:1;3892:21;;;;;;;;;;3839:39;;-1:-1:-1;3892:35:1;:21;:35;3888:111;;3950:38;;;;;;;;;;;;;;3888:111;4008:12;:21;;;;;;;;;;;:34;;;;4032:10;4008:34;;;;;;4057:52;;4032:10;;4008:12;4021:7;;4057:52;;4008:12;;4057:52;3747:369;;;:::o;8689:656::-;2739:12;:21;;;;;;;;;;;8928:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;8951:41;;::::1;;::::0;:92:::1;;-1:-1:-1::0;9009:34:1;;::::1;;8951:92;:145;;;-1:-1:-1::0;9060:36:1;;::::1;;8951:145;8947:228;;;9128:36;;;;;;;;;;;;;;8947:228;9190:9;9185:154;9205:20:::0;;::::1;9185:154;;;9246:82;9261:7;9270:9;;9280:1;9270:12;;;;;;;:::i;:::-;;;;;;;9284:14;;9299:1;9284:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9303:9;;9313:1;9303:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;9317:7;;9325:1;9317:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;9246:14;:82::i;:::-;9227:3;;9185:154;;;;8689:656:::0;;;;;;;;;;:::o;6301:301::-;2925:48;2976:28;;;:19;:28;;;;;;;;;2925:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;2976:28;;2925:79;3068:10;3031:47;;;:127;;;3113:20;:45;;;3095:63;;:15;:63;3031:127;3014:224;;;3190:37;;;;;;;;;;;;;;3014:224;6398:17:::1;6418:21:::0;;;::::1;::::0;;;;;;;;;6473:10:::1;6449:34:::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;6500:28:1;;;;;;6493:35;;;6544:51;;6418:21:::1;::::0;;::::1;::::0;6473:10;;6418:21;;;;6544:51:::1;::::0;6398:17;6544:51:::1;6388:214;2915:340:::0;6301:301;;:::o;10453:618::-;10557:30;;;10553:104;;10610:36;;;;;;;;;;;;;;10553:104;10667:12;10689:18;10722:9;10717:348;10737:16;;;10717:348;;;10781:5;;10787:1;10781:8;;;;;;;:::i;:::-;;;;;;;;;;10816:18;;;;:12;:18;;;;;;:29;10781:8;;-1:-1:-1;10816:29:1;;;-1:-1:-1;10860:34:1;;10816:18;-1:-1:-1;10897:7:1;;10905:1;10897:10;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;10860:47;;;;10926:9;10921:134;10941:22;;;10921:134;;;10988:11;;11000:1;10988:14;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:52;;;;;;;;7972:25:2;;;10988:34:1;8033:55:2;;;8013:18;;;8006:83;10988:34:1;;;;;;;7945:18:2;;10988:52:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10965:3;;;;;10921:134;;;;10760:305;;10755:3;;;;;10717:348;;;;10543:528;;10453:618;;;;:::o;9737:273::-;9822:12;;9844:160;9864:16;;;9844:160;;;9908:5;;9914:1;9908:8;;;;;;;:::i;:::-;;;;;;;;;;9963:18;;;;:12;:18;;;;;;;;:29;9930:63;;;;;;;;7972:25:2;;;9930:26:1;9963:29;;;8013:18:2;;;8006:83;9908:8:1;;-1:-1:-1;9930:26:1;;;;;;-1:-1:-1;7945:18:2;;9930:63:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9882:3;;;;;9844:160;;;;9812:198;9737:273;;;:::o;7649:249::-;2739:12;:21;;;;;;;;;;;7804:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;7823:68:::1;7838:7;7847:8;7857:13;7872:9;7883:7;;7823:14;:68::i;4695:437::-:0;2739:12;:21;;;;;;;;;;;4786:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;4805:28:::1;::::0;;;:19:::1;:28;::::0;;;;:52;;;::::1;;::::0;::::1;;::::0;;4908:38:::1;2668:7;4908:15;:38;:::i;:::-;4957:28;::::0;;;:19:::1;:28;::::0;;;;;;;;:80;;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;5053:72;;8528:58:2;;;4957:80:1;;-1:-1:-1;5053:72:1;;::::1;::::0;4957:28;;5053:72:::1;::::0;8501:18:2;5053:72:1::1;;;;;;;4795:337;4695:437:::0;;;:::o;5591:207::-;2739:12;:21;;;;;;;;;;;5670:7;;2739:35;:21;2764:10;2739:35;2735:107;;2797:34;;;;;;;;;;;;;;2735:107;5696:28:::1;::::0;;;:19:::1;:28;::::0;;;;;;;5689:35;;;5740:51;8528:58:2;;;5696:28:1;;5740:51:::1;::::0;8501:18:2;5740:51:1::1;;;;;;;5591:207:::0;;:::o;11552:933::-;11726:29;;;;;;;8993:25:2;;;9034:18;;;9027:34;;;11726:29:1;;;;;;;;;8966:18:2;;;;11726:29:1;;11716:40;;;;;;;;;-1:-1:-1;11800:18:1;;;:12;:18;;;;;;11832:23;;;;;;;:54;;;;-1:-1:-1;11859:27:1;;;;11832:54;11828:124;;;11909:32;;;;;;;;;;;;;;11828:124;11965:23;;;;;;;11961:280;;;12008:23;;:36;;;:23;;;;;;:36;;;12004:116;;12071:34;;;;;;;;;;;;;;12004:116;11961:280;;;12150:30;;12194:36;12220:10;;12194:36;;;;;;12150:30;12194:36;;;11961:280;12251:38;;;;;;;;;;;;12304:43;;9237:14:2;;9230:22;9212:41;;12316:4:1;;12304:43;;9200:2:2;9185:18;12304:43:1;;;;;;;12363:9;12358:121;12378:18;;;12358:121;;;12417:7;;12425:1;12417:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:51;;;;;;;;7972:25:2;;;12417:30:1;8033:55:2;;;8013:18;;;8006:83;12417:30:1;;;;;;;7945:18:2;;12417:51:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12398:3;;;;;12358:121;;;;11691:794;;11552:933;;;;;;:::o;14:180:2:-;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:2;;14:180;-1:-1:-1;14:180:2:o;714:367::-;777:8;787:6;841:3;834:4;826:6;822:17;818:27;808:55;;859:1;856;849:12;808:55;-1:-1:-1;882:20:2;;925:18;914:30;;911:50;;;957:1;954;947:12;911:50;994:4;986:6;982:17;970:29;;1054:3;1047:4;1037:6;1034:1;1030:14;1022:6;1018:27;1014:38;1011:47;1008:67;;;1071:1;1068;1061:12;1008:67;714:367;;;;;:::o;1086:1514::-;1330:6;1338;1346;1354;1362;1370;1378;1386;1394;1447:3;1435:9;1426:7;1422:23;1418:33;1415:53;;;1464:1;1461;1454:12;1415:53;1500:9;1487:23;1477:33;;1561:2;1550:9;1546:18;1533:32;1584:18;1625:2;1617:6;1614:14;1611:34;;;1641:1;1638;1631:12;1611:34;1680:70;1742:7;1733:6;1722:9;1718:22;1680:70;:::i;:::-;1769:8;;-1:-1:-1;1654:96:2;-1:-1:-1;1857:2:2;1842:18;;1829:32;;-1:-1:-1;1873:16:2;;;1870:36;;;1902:1;1899;1892:12;1870:36;1941:72;2005:7;1994:8;1983:9;1979:24;1941:72;:::i;:::-;2032:8;;-1:-1:-1;1915:98:2;-1:-1:-1;2120:2:2;2105:18;;2092:32;;-1:-1:-1;2136:16:2;;;2133:36;;;2165:1;2162;2155:12;2133:36;2204:72;2268:7;2257:8;2246:9;2242:24;2204:72;:::i;:::-;2295:8;;-1:-1:-1;2178:98:2;-1:-1:-1;2383:3:2;2368:19;;2355:33;;-1:-1:-1;2400:16:2;;;2397:36;;;2429:1;2426;2419:12;2397:36;;2468:72;2532:7;2521:8;2510:9;2506:24;2468:72;:::i;:::-;2442:98;;2559:8;2549:18;;;2586:8;2576:18;;;1086:1514;;;;;;;;;;;:::o;2605:817::-;2771:6;2779;2787;2795;2848:2;2836:9;2827:7;2823:23;2819:32;2816:52;;;2864:1;2861;2854:12;2816:52;2904:9;2891:23;2933:18;2974:2;2966:6;2963:14;2960:34;;;2990:1;2987;2980:12;2960:34;3029:70;3091:7;3082:6;3071:9;3067:22;3029:70;:::i;:::-;3118:8;;-1:-1:-1;3003:96:2;-1:-1:-1;3206:2:2;3191:18;;3178:32;;-1:-1:-1;3222:16:2;;;3219:36;;;3251:1;3248;3241:12;3219:36;;3290:72;3354:7;3343:8;3332:9;3328:24;3290:72;:::i;:::-;2605:817;;;;-1:-1:-1;3381:8:2;-1:-1:-1;;;;2605:817:2:o;3658:167::-;3757:42;3750:5;3746:54;3739:5;3736:65;3726:93;;3815:1;3812;3805:12;3726:93;3658:167;:::o;3830:602::-;3942:6;3950;3958;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;4067:9;4054:23;4100:18;4092:6;4089:30;4086:50;;;4132:1;4129;4122:12;4086:50;4171:70;4233:7;4224:6;4213:9;4209:22;4171:70;:::i;:::-;4260:8;;-1:-1:-1;4145:96:2;-1:-1:-1;;4345:2:2;4330:18;;4317:32;4358:44;4317:32;4358:44;:::i;:::-;4421:5;4411:15;;;3830:602;;;;;:::o;4437:160::-;4502:20;;4558:13;;4551:21;4541:32;;4531:60;;4587:1;4584;4577:12;4531:60;4437:160;;;:::o;4602:808::-;4738:6;4746;4754;4762;4770;4778;4831:3;4819:9;4810:7;4806:23;4802:33;4799:53;;;4848:1;4845;4838:12;4799:53;4884:9;4871:23;4861:33;;4941:2;4930:9;4926:18;4913:32;4903:42;;4995:2;4984:9;4980:18;4967:32;5008:44;5046:5;5008:44;:::i;:::-;5071:5;-1:-1:-1;5095:35:2;5126:2;5111:18;;5095:35;:::i;:::-;5085:45;;5181:3;5170:9;5166:19;5153:33;5209:18;5201:6;5198:30;5195:50;;;5241:1;5238;5231:12;5195:50;5280:70;5342:7;5333:6;5322:9;5318:22;5280:70;:::i;:::-;4602:808;;;;-1:-1:-1;4602:808:2;;-1:-1:-1;4602:808:2;;5369:8;;4602:808;-1:-1:-1;;;4602:808:2:o;5616:328::-;5684:6;5692;5745:2;5733:9;5724:7;5720:23;5716:32;5713:52;;;5761:1;5758;5751:12;5713:52;5797:9;5784:23;5774:33;;5857:2;5846:9;5842:18;5829:32;5870:44;5908:5;5870:44;:::i;:::-;5933:5;5923:15;;;5616:328;;;;;:::o;6251:184::-;6303:77;6300:1;6293:88;6400:4;6397:1;6390:15;6424:4;6421:1;6414:15;6440:260;6499:6;6552:2;6540:9;6531:7;6527:23;6523:32;6520:52;;;6568:1;6565;6558:12;6520:52;6607:9;6594:23;6626:44;6664:5;6626:44;:::i;:::-;6689:5;6440:260;-1:-1:-1;;;6440:260:2:o;6705:180::-;6761:6;6814:2;6802:9;6793:7;6789:23;6785:32;6782:52;;;6830:1;6827;6820:12;6782:52;6853:26;6869:9;6853:26;:::i;6890:621::-;7000:4;7006:6;7066:11;7053:25;7156:66;7145:8;7129:14;7125:29;7121:102;7101:18;7097:127;7087:155;;7238:1;7235;7228:12;7087:155;7265:33;;7317:20;;;-1:-1:-1;7360:18:2;7349:30;;7346:50;;;7392:1;7389;7382:12;7346:50;7425:4;7413:17;;-1:-1:-1;7476:1:2;7472:14;;;7456;7452:35;7442:46;;7439:66;;;7501:1;7498;7491:12;8100:279;8165:9;;;8186:10;;;8183:190;;;8229:77;8226:1;8219:88;8330:4;8327:1;8320:15;8358:4;8355:1;8348:15;8183:190;8100:279;;;;:::o

Swarm Source

ipfs://864c8a864c282642d346eda8815588193ae6f984c6e7dda2305b0e4f6ec481d0

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
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.