Goerli Testnet

Contract

0x91F4f39120bAccC6ceC7d9f5C8bcF3fAb0fBb623
Source Code

Overview

ETH Balance

0 ETH

Multi Chain

Multichain Addresses

N/A
Transaction Hash
Method
Block
From
To
Value
0x6080604086956922023-03-21 23:18:48187 days 20 hrs ago1679440728IN
 Create: SealHub
0 ETH0.008704173.82046326

Latest 25 internal transactions (View All)

Advanced mode:
Parent Txn Hash Block From To Value
96605922023-09-08 20:58:2416 days 23 hrs ago1694206704
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
96604842023-09-08 20:31:1216 days 23 hrs ago1694205072
0x91F4f3...b0fBb623
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SealHub

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 10 : SealHub.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "@openzeppelin/contracts/utils/Counters.sol";
import "@opengsn/contracts/src/ERC2771Recipient.sol";
import "@big-whale-labs/versioned-contract/contracts/Versioned.sol";
import "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol";
import "./interfaces/ICompleteECDSACheckerVerifier.sol";

contract SealHub is ERC2771Recipient, Versioned {
  using Counters for Counters.Counter;
  using IncrementalBinaryTree for IncrementalTreeData;

  // State
  address public verifierContract;
  Counters.Counter public numberOfCommitments;
  mapping(uint256 => bool) public commitmentMap;
  uint256[] public commitments;
  bytes32[] public merkleRoots;
  mapping(bytes32 => bool) public merkleRootMap;
  IncrementalTreeData public tree;

  // Events
  event CommitmentCreated(uint256 commitmentId, bytes32 merkleRoot);

  // Functions
  constructor(
    string memory _version,
    address _verifierContract,
    address _trustedForwarder,
    uint8 _depth
  ) Versioned(_version) {
    verifierContract = _verifierContract;
    _setTrustedForwarder(_trustedForwarder);
    tree.init(_depth, 0);
  }

  function createCommitment(
    ECDSAProof memory _ecdsaProof,
    UPrecomputesProof memory _uPrecomputesProof
  ) public {
    // Check the proof
    require(
      ICompleteECDSACheckerVerifier(verifierContract).verifyProofs(
        _ecdsaProof,
        _uPrecomputesProof
      ),
      "Invalid ZK proof"
    );
    // Add the commitment
    uint256 commitment = _ecdsaProof.input[0];
    commitmentMap[commitment] = true;
    commitments.push(commitment);
    numberOfCommitments.increment();
    // Add to Merkle Tree
    tree.insert(commitment);
    bytes32 merkleRoot = bytes32(tree.root);
    merkleRoots.push(merkleRoot);
    merkleRootMap[merkleRoot] = true;
    emit CommitmentCreated(commitment, merkleRoot);
  }

  function isCommitmentMerkleRootValid(
    bytes32 merkleRoot
  ) external view returns (bool) {
    return merkleRootMap[merkleRoot];
  }

  function _msgSender()
    internal
    view
    override(ERC2771Recipient)
    returns (address sender)
  {
    sender = ERC2771Recipient._msgSender();
  }

  function _msgData()
    internal
    view
    override(ERC2771Recipient)
    returns (bytes calldata ret)
  {
    return ERC2771Recipient._msgData();
  }
}

File 2 of 10 : Versioned.sol
//                                                                        ,-,
//                            *                      .                   /.(              .
//                                       \|/                             \ {
//    .                 _    .  ,   .    -*-       .                      `-`
//     ,'-.         *  / \_ *  / \_      /|\         *   /\'__        *.                 *
//    (____".         /    \  /    \,     __      .    _/  /  \  * .               .
//               .   /\/\  /\/ :' __ \_  /  \       _^/  ^/    `—./\    /\   .
//   *       _      /    \/  \  _/  \-‘\/  ` \ /\  /.' ^_   \_   .’\\  /_/\           ,'-.
//          /_\   /\  .-   `. \/     \ /.     /  \ ;.  _/ \ -. `_/   \/.   \   _     (____".    *
//     .   /   \ /  `-.__ ^   / .-'.--\      -    \/  _ `--./ .-'  `-/.     \ / \             .
//        /     /.       `.  / /       `.   /   `  .-'      '-._ `._         /.  \
// ~._,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'
// ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~
// ~~    ~~~~    ~~~~     ~~~~   ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~
//     ~~     ~~      ~~      ~~      ~~      ~~      ~~      ~~       ~~     ~~      ~~      ~~
//                          ๐
//                                                                              _
//                                                  ₒ                         ><_>
//                                  _______     __      _______
//          .-'                    |   _  "\   |" \    /" _   "|                               ๐
//     '--./ /     _.---.          (. |_)  :)  ||  |  (: ( \___)
//     '-,  (__..-`       \        |:     \/   |:  |   \/ \
//        \          .     |       (|  _  \\   |.  |   //  \ ___
//         `,.__.   ,__.--/        |: |_)  :)  |\  |   (:   _(  _|
//           '._/_.'___.-`         (_______/   |__\|    \_______)                 ๐
//
//                  __   __  ___   __    __         __       ___         _______
//                 |"  |/  \|  "| /" |  | "\       /""\     |"  |       /"     "|
//      ๐          |'  /    \:  |(:  (__)  :)     /    \    ||  |      (: ______)
//                 |: /'        | \/      \/     /' /\  \   |:  |   ₒ   \/    |
//                  \//  /\'    | //  __  \\    //  __'  \   \  |___    // ___)_
//                  /   /  \\   |(:  (  )  :)  /   /  \\  \ ( \_|:  \  (:      "|
//                 |___/    \___| \__|  |__/  (___/    \___) \_______)  \_______)
//                                                                                     ₒ৹
//                          ___             __       _______     ________
//         _               |"  |     ₒ     /""\     |   _  "\   /"       )
//       ><_>              ||  |          /    \    (. |_)  :) (:   \___/
//                         |:  |         /' /\  \   |:     \/   \___  \
//                          \  |___     //  __'  \  (|  _  \\    __/  \\          \_____)\_____
//                         ( \_|:  \   /   /  \\  \ |: |_)  :)  /" \   :)         /--v____ __`<
//                          \_______) (___/    \___)(_______/  (_______/                  )/
//                                                                                        '
//
//            ๐                          .    '    ,                                           ₒ
//                         ₒ               _______
//                                 ____  .`_|___|_`.  ____
//                                        \ \   / /                        ₒ৹
//                                          \ ' /                         ๐
//   ₒ                                        \/
//                                   ₒ     /      \       )                                 (
//           (   ₒ৹               (                      (                                  )
//            )                   )               _      )                )                (
//           (        )          (       (      ><_>    (       (        (                  )
//     )      )      (     (      )       )              )       )        )         )      (
//    (      (        )     )    (       (              (       (        (         (        )
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

contract Versioned {
  string public version;

  constructor(string memory _version) {
    version = _version;
  }
}

File 3 of 10 : ERC2771Recipient.sol
// SPDX-License-Identifier: MIT
// solhint-disable no-inline-assembly
pragma solidity >=0.6.9;

import "./interfaces/IERC2771Recipient.sol";

/**
 * @title The ERC-2771 Recipient Base Abstract Class - Implementation
 *
 * @notice Note that this contract was called `BaseRelayRecipient` in the previous revision of the GSN.
 *
 * @notice A base contract to be inherited by any contract that want to receive relayed transactions.
 *
 * @notice A subclass must use `_msgSender()` instead of `msg.sender`.
 */
abstract contract ERC2771Recipient is IERC2771Recipient {

    /*
     * Forwarder singleton we accept calls from
     */
    address private _trustedForwarder;

    /**
     * :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.
     * @notice Method is not a required method to allow Recipients to trust multiple Forwarders. Not recommended yet.
     * @return forwarder The address of the Forwarder contract that is being used.
     */
    function getTrustedForwarder() public virtual view returns (address forwarder){
        return _trustedForwarder;
    }

    function _setTrustedForwarder(address _forwarder) internal {
        _trustedForwarder = _forwarder;
    }

    /// @inheritdoc IERC2771Recipient
    function isTrustedForwarder(address forwarder) public virtual override view returns(bool) {
        return forwarder == _trustedForwarder;
    }

    /// @inheritdoc IERC2771Recipient
    function _msgSender() internal override virtual view returns (address ret) {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            // At this point we know that the sender is a trusted forwarder,
            // so we trust that the last bytes of msg.data are the verified sender address.
            // extract sender address from the end of msg.data
            assembly {
                ret := shr(96,calldataload(sub(calldatasize(),20)))
            }
        } else {
            ret = msg.sender;
        }
    }

    /// @inheritdoc IERC2771Recipient
    function _msgData() internal override virtual view returns (bytes calldata ret) {
        if (msg.data.length >= 20 && isTrustedForwarder(msg.sender)) {
            return msg.data[0:msg.data.length-20];
        } else {
            return msg.data;
        }
    }
}

File 4 of 10 : IERC2771Recipient.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0;

/**
 * @title The ERC-2771 Recipient Base Abstract Class - Declarations
 *
 * @notice A contract must implement this interface in order to support relayed transaction.
 *
 * @notice It is recommended that your contract inherits from the ERC2771Recipient contract.
 */
abstract contract IERC2771Recipient {

    /**
     * :warning: **Warning** :warning: The Forwarder can have a full control over your Recipient. Only trust verified Forwarder.
     * @param forwarder The address of the Forwarder contract that is being used.
     * @return isTrustedForwarder `true` if the Forwarder is trusted to forward relayed transactions by this Recipient.
     */
    function isTrustedForwarder(address forwarder) public virtual view returns(bool);

    /**
     * @notice Use this method the contract anywhere instead of msg.sender to support relayed transactions.
     * @return sender The real sender of this call.
     * For a call that came through the Forwarder the real sender is extracted from the last 20 bytes of the `msg.data`.
     * Otherwise simply returns `msg.sender`.
     */
    function _msgSender() internal virtual view returns (address);

    /**
     * @notice Use this method in the contract instead of `msg.data` when difference matters (hashing, signature, etc.)
     * @return data The real `msg.data` of this call.
     * For a call that came through the Forwarder, the real sender address was appended as the last 20 bytes
     * of the `msg.data` - so this method will strip those 20 bytes off.
     * Otherwise (if the call was made directly and not through the forwarder) simply returns `msg.data`.
     */
    function _msgData() internal virtual view returns (bytes calldata);
}

File 5 of 10 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 6 of 10 : Hashes.sol
//SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

library PoseidonT3 {
    function poseidon(uint256[2] memory) public pure returns (uint256) {}
}

library PoseidonT6 {
    function poseidon(uint256[5] memory) public pure returns (uint256) {}
}

File 7 of 10 : IncrementalBinaryTree.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import {PoseidonT3} from "./Hashes.sol";

// Each incremental tree has certain properties and data that will
// be used to add new leaves.
struct IncrementalTreeData {
    uint256 depth; // Depth of the tree (levels - 1).
    uint256 root; // Root hash of the tree.
    uint256 numberOfLeaves; // Number of leaves of the tree.
    mapping(uint256 => uint256) zeroes; // Zero hashes used for empty nodes (level -> zero hash).
    // The nodes of the subtrees used in the last addition of a leaf (level -> [left node, right node]).
    mapping(uint256 => uint256[2]) lastSubtrees; // Caching these values is essential to efficient appends.
}

/// @title Incremental binary Merkle tree.
/// @dev The incremental tree allows to calculate the root hash each time a leaf is added, ensuring
/// the integrity of the tree.
library IncrementalBinaryTree {
    uint8 internal constant MAX_DEPTH = 32;
    uint256 internal constant SNARK_SCALAR_FIELD =
        21888242871839275222246405745257275088548364400416034343698204186575808495617;

    /// @dev Initializes a tree.
    /// @param self: Tree data.
    /// @param depth: Depth of the tree.
    /// @param zero: Zero value to be used.
    function init(
        IncrementalTreeData storage self,
        uint256 depth,
        uint256 zero
    ) public {
        require(zero < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
        require(depth > 0 && depth <= MAX_DEPTH, "IncrementalBinaryTree: tree depth must be between 1 and 32");

        self.depth = depth;

        for (uint8 i = 0; i < depth; ) {
            self.zeroes[i] = zero;
            zero = PoseidonT3.poseidon([zero, zero]);

            unchecked {
                ++i;
            }
        }

        self.root = zero;
    }

    /// @dev Inserts a leaf in the tree.
    /// @param self: Tree data.
    /// @param leaf: Leaf to be inserted.
    function insert(IncrementalTreeData storage self, uint256 leaf) public {
        uint256 depth = self.depth;

        require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
        require(self.numberOfLeaves < 2**depth, "IncrementalBinaryTree: tree is full");

        uint256 index = self.numberOfLeaves;
        uint256 hash = leaf;

        for (uint8 i = 0; i < depth; ) {
            if (index & 1 == 0) {
                self.lastSubtrees[i] = [hash, self.zeroes[i]];
            } else {
                self.lastSubtrees[i][1] = hash;
            }

            hash = PoseidonT3.poseidon(self.lastSubtrees[i]);
            index >>= 1;

            unchecked {
                ++i;
            }
        }

        self.root = hash;
        self.numberOfLeaves += 1;
    }

    /// @dev Updates a leaf in the tree.
    /// @param self: Tree data.
    /// @param leaf: Leaf to be updated.
    /// @param newLeaf: New leaf.
    /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
    /// @param proofPathIndices: Path of the proof of membership.
    function update(
        IncrementalTreeData storage self,
        uint256 leaf,
        uint256 newLeaf,
        uint256[] calldata proofSiblings,
        uint8[] calldata proofPathIndices
    ) public {
        require(newLeaf != leaf, "IncrementalBinaryTree: new leaf cannot be the same as the old one");
        require(newLeaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: new leaf must be < SNARK_SCALAR_FIELD");
        require(
            verify(self, leaf, proofSiblings, proofPathIndices),
            "IncrementalBinaryTree: leaf is not part of the tree"
        );

        uint256 depth = self.depth;
        uint256 hash = newLeaf;
        uint256 updateIndex;

        for (uint8 i = 0; i < depth; ) {
            updateIndex |= uint256(proofPathIndices[i]) << uint256(i);

            if (proofPathIndices[i] == 0) {
                if (proofSiblings[i] == self.lastSubtrees[i][1]) {
                    self.lastSubtrees[i][0] = hash;
                }

                hash = PoseidonT3.poseidon([hash, proofSiblings[i]]);
            } else {
                if (proofSiblings[i] == self.lastSubtrees[i][0]) {
                    self.lastSubtrees[i][1] = hash;
                }

                hash = PoseidonT3.poseidon([proofSiblings[i], hash]);
            }

            unchecked {
                ++i;
            }
        }
        require(updateIndex < self.numberOfLeaves, "IncrementalBinaryTree: leaf index out of range");

        self.root = hash;
    }

    /// @dev Removes a leaf from the tree.
    /// @param self: Tree data.
    /// @param leaf: Leaf to be removed.
    /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
    /// @param proofPathIndices: Path of the proof of membership.
    function remove(
        IncrementalTreeData storage self,
        uint256 leaf,
        uint256[] calldata proofSiblings,
        uint8[] calldata proofPathIndices
    ) public {
        update(self, leaf, self.zeroes[0], proofSiblings, proofPathIndices);
    }

    /// @dev Verify if the path is correct and the leaf is part of the tree.
    /// @param self: Tree data.
    /// @param leaf: Leaf to be removed.
    /// @param proofSiblings: Array of the sibling nodes of the proof of membership.
    /// @param proofPathIndices: Path of the proof of membership.
    /// @return True or false.
    function verify(
        IncrementalTreeData storage self,
        uint256 leaf,
        uint256[] calldata proofSiblings,
        uint8[] calldata proofPathIndices
    ) private view returns (bool) {
        require(leaf < SNARK_SCALAR_FIELD, "IncrementalBinaryTree: leaf must be < SNARK_SCALAR_FIELD");
        uint256 depth = self.depth;
        require(
            proofPathIndices.length == depth && proofSiblings.length == depth,
            "IncrementalBinaryTree: length of path is not correct"
        );

        uint256 hash = leaf;

        for (uint8 i = 0; i < depth; ) {
            require(
                proofSiblings[i] < SNARK_SCALAR_FIELD,
                "IncrementalBinaryTree: sibling node must be < SNARK_SCALAR_FIELD"
            );

            require(
                proofPathIndices[i] == 1 || proofPathIndices[i] == 0,
                "IncrementalBinaryTree: path index is neither 0 nor 1"
            );

            if (proofPathIndices[i] == 0) {
                hash = PoseidonT3.poseidon([hash, proofSiblings[i]]);
            } else {
                hash = PoseidonT3.poseidon([proofSiblings[i], hash]);
            }

            unchecked {
                ++i;
            }
        }

        return hash == self.root;
    }
}

File 8 of 10 : ICompleteECDSACheckerVerifier.sol
//                                                                        ,-,
//                            *                      .                   /.(              .
//                                       \|/                             \ {
//    .                 _    .  ,   .    -*-       .                      `-`
//     ,'-.         *  / \_ *  / \_      /|\         *   /\'__        *.                 *
//    (____".         /    \  /    \,     __      .    _/  /  \  * .               .
//               .   /\/\  /\/ :' __ \_  /  \       _^/  ^/    `—./\    /\   .
//   *       _      /    \/  \  _/  \-‘\/  ` \ /\  /.' ^_   \_   .’\\  /_/\           ,'-.
//          /_\   /\  .-   `. \/     \ /.     /  \ ;.  _/ \ -. `_/   \/.   \   _     (____".    *
//     .   /   \ /  `-.__ ^   / .-'.--\      -    \/  _ `--./ .-'  `-/.     \ / \             .
//        /     /.       `.  / /       `.   /   `  .-'      '-._ `._         /.  \
// ~._,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'
// ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~
// ~~    ~~~~    ~~~~     ~~~~   ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~
//     ~~     ~~      ~~      ~~      ~~      ~~      ~~      ~~       ~~     ~~      ~~      ~~
//                          ๐
//                                                                              _
//                                                  ₒ                         ><_>
//                                  _______     __      _______
//          .-'                    |   _  "\   |" \    /" _   "|                               ๐
//     '--./ /     _.---.          (. |_)  :)  ||  |  (: ( \___)
//     '-,  (__..-`       \        |:     \/   |:  |   \/ \
//        \          .     |       (|  _  \\   |.  |   //  \ ___
//         `,.__.   ,__.--/        |: |_)  :)  |\  |   (:   _(  _|
//           '._/_.'___.-`         (_______/   |__\|    \_______)                 ๐
//
//                  __   __  ___   __    __         __       ___         _______
//                 |"  |/  \|  "| /" |  | "\       /""\     |"  |       /"     "|
//      ๐          |'  /    \:  |(:  (__)  :)     /    \    ||  |      (: ______)
//                 |: /'        | \/      \/     /' /\  \   |:  |   ₒ   \/    |
//                  \//  /\'    | //  __  \\    //  __'  \   \  |___    // ___)_
//                  /   /  \\   |(:  (  )  :)  /   /  \\  \ ( \_|:  \  (:      "|
//                 |___/    \___| \__|  |__/  (___/    \___) \_______)  \_______)
//                                                                                     ₒ৹
//                          ___             __       _______     ________
//         _               |"  |     ₒ     /""\     |   _  "\   /"       )
//       ><_>              ||  |          /    \    (. |_)  :) (:   \___/
//                         |:  |         /' /\  \   |:     \/   \___  \
//                          \  |___     //  __'  \  (|  _  \\    __/  \\          \_____)\_____
//                         ( \_|:  \   /   /  \\  \ |: |_)  :)  /" \   :)         /--v____ __`<
//                          \_______) (___/    \___)(_______/  (_______/                  )/
//                                                                                        '
//
//            ๐                          .    '    ,                                           ₒ
//                         ₒ               _______
//                                 ____  .`_|___|_`.  ____
//                                        \ \   / /                        ₒ৹
//                                          \ ' /                         ๐
//   ₒ                                        \/
//                                   ₒ     /      \       )                                 (
//           (   ₒ৹               (                      (                                  )
//            )                   )               _      )                )                (
//           (        )          (       (      ><_>    (       (        (                  )
//     )      )      (     (      )       )              )       )        )         )      (
//    (      (        )     )    (       (              (       (        (         (        )
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import "../models/ECDSAProof.sol";
import "../models/UPrecomputesProof.sol";

interface ICompleteECDSACheckerVerifier {
  function verifyProofs(
    ECDSAProof memory _ecdsaProof,
    UPrecomputesProof memory _uPrecomputesProof
  ) external view returns (bool r);
}

File 9 of 10 : ECDSAProof.sol
//                                                                        ,-,
//                            *                      .                   /.(              .
//                                       \|/                             \ {
//    .                 _    .  ,   .    -*-       .                      `-`
//     ,'-.         *  / \_ *  / \_      /|\         *   /\'__        *.                 *
//    (____".         /    \  /    \,     __      .    _/  /  \  * .               .
//               .   /\/\  /\/ :' __ \_  /  \       _^/  ^/    `—./\    /\   .
//   *       _      /    \/  \  _/  \-‘\/  ` \ /\  /.' ^_   \_   .’\\  /_/\           ,'-.
//          /_\   /\  .-   `. \/     \ /.     /  \ ;.  _/ \ -. `_/   \/.   \   _     (____".    *
//     .   /   \ /  `-.__ ^   / .-'.--\      -    \/  _ `--./ .-'  `-/.     \ / \             .
//        /     /.       `.  / /       `.   /   `  .-'      '-._ `._         /.  \
// ~._,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'
// ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~
// ~~    ~~~~    ~~~~     ~~~~   ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~
//     ~~     ~~      ~~      ~~      ~~      ~~      ~~      ~~       ~~     ~~      ~~      ~~
//                          ๐
//                                                                              _
//                                                  ₒ                         ><_>
//                                  _______     __      _______
//          .-'                    |   _  "\   |" \    /" _   "|                               ๐
//     '--./ /     _.---.          (. |_)  :)  ||  |  (: ( \___)
//     '-,  (__..-`       \        |:     \/   |:  |   \/ \
//        \          .     |       (|  _  \\   |.  |   //  \ ___
//         `,.__.   ,__.--/        |: |_)  :)  |\  |   (:   _(  _|
//           '._/_.'___.-`         (_______/   |__\|    \_______)                 ๐
//
//                  __   __  ___   __    __         __       ___         _______
//                 |"  |/  \|  "| /" |  | "\       /""\     |"  |       /"     "|
//      ๐          |'  /    \:  |(:  (__)  :)     /    \    ||  |      (: ______)
//                 |: /'        | \/      \/     /' /\  \   |:  |   ₒ   \/    |
//                  \//  /\'    | //  __  \\    //  __'  \   \  |___    // ___)_
//                  /   /  \\   |(:  (  )  :)  /   /  \\  \ ( \_|:  \  (:      "|
//                 |___/    \___| \__|  |__/  (___/    \___) \_______)  \_______)
//                                                                                     ₒ৹
//                          ___             __       _______     ________
//         _               |"  |     ₒ     /""\     |   _  "\   /"       )
//       ><_>              ||  |          /    \    (. |_)  :) (:   \___/
//                         |:  |         /' /\  \   |:     \/   \___  \
//                          \  |___     //  __'  \  (|  _  \\    __/  \\          \_____)\_____
//                         ( \_|:  \   /   /  \\  \ |: |_)  :)  /" \   :)         /--v____ __`<
//                          \_______) (___/    \___)(_______/  (_______/                  )/
//                                                                                        '
//
//            ๐                          .    '    ,                                           ₒ
//                         ₒ               _______
//                                 ____  .`_|___|_`.  ____
//                                        \ \   / /                        ₒ৹
//                                          \ ' /                         ๐
//   ₒ                                        \/
//                                   ₒ     /      \       )                                 (
//           (   ₒ৹               (                      (                                  )
//            )                   )               _      )                )                (
//           (        )          (       (      ><_>    (       (        (                  )
//     )      )      (     (      )       )              )       )        )         )      (
//    (      (        )     )    (       (              (       (        (         (        )
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

struct ECDSAProof {
  uint[2] a;
  uint[2][2] b;
  uint[2] c;
  uint[6] input;
}

File 10 of 10 : UPrecomputesProof.sol
//                                                                        ,-,
//                            *                      .                   /.(              .
//                                       \|/                             \ {
//    .                 _    .  ,   .    -*-       .                      `-`
//     ,'-.         *  / \_ *  / \_      /|\         *   /\'__        *.                 *
//    (____".         /    \  /    \,     __      .    _/  /  \  * .               .
//               .   /\/\  /\/ :' __ \_  /  \       _^/  ^/    `—./\    /\   .
//   *       _      /    \/  \  _/  \-‘\/  ` \ /\  /.' ^_   \_   .’\\  /_/\           ,'-.
//          /_\   /\  .-   `. \/     \ /.     /  \ ;.  _/ \ -. `_/   \/.   \   _     (____".    *
//     .   /   \ /  `-.__ ^   / .-'.--\      -    \/  _ `--./ .-'  `-/.     \ / \             .
//        /     /.       `.  / /       `.   /   `  .-'      '-._ `._         /.  \
// ~._,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'2_,-'
// ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~ ~~~~~~~~
// ~~    ~~~~    ~~~~     ~~~~   ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~~~    ~~
//     ~~     ~~      ~~      ~~      ~~      ~~      ~~      ~~       ~~     ~~      ~~      ~~
//                          ๐
//                                                                              _
//                                                  ₒ                         ><_>
//                                  _______     __      _______
//          .-'                    |   _  "\   |" \    /" _   "|                               ๐
//     '--./ /     _.---.          (. |_)  :)  ||  |  (: ( \___)
//     '-,  (__..-`       \        |:     \/   |:  |   \/ \
//        \          .     |       (|  _  \\   |.  |   //  \ ___
//         `,.__.   ,__.--/        |: |_)  :)  |\  |   (:   _(  _|
//           '._/_.'___.-`         (_______/   |__\|    \_______)                 ๐
//
//                  __   __  ___   __    __         __       ___         _______
//                 |"  |/  \|  "| /" |  | "\       /""\     |"  |       /"     "|
//      ๐          |'  /    \:  |(:  (__)  :)     /    \    ||  |      (: ______)
//                 |: /'        | \/      \/     /' /\  \   |:  |   ₒ   \/    |
//                  \//  /\'    | //  __  \\    //  __'  \   \  |___    // ___)_
//                  /   /  \\   |(:  (  )  :)  /   /  \\  \ ( \_|:  \  (:      "|
//                 |___/    \___| \__|  |__/  (___/    \___) \_______)  \_______)
//                                                                                     ₒ৹
//                          ___             __       _______     ________
//         _               |"  |     ₒ     /""\     |   _  "\   /"       )
//       ><_>              ||  |          /    \    (. |_)  :) (:   \___/
//                         |:  |         /' /\  \   |:     \/   \___  \
//                          \  |___     //  __'  \  (|  _  \\    __/  \\          \_____)\_____
//                         ( \_|:  \   /   /  \\  \ |: |_)  :)  /" \   :)         /--v____ __`<
//                          \_______) (___/    \___)(_______/  (_______/                  )/
//                                                                                        '
//
//            ๐                          .    '    ,                                           ₒ
//                         ₒ               _______
//                                 ____  .`_|___|_`.  ____
//                                        \ \   / /                        ₒ৹
//                                          \ ' /                         ๐
//   ₒ                                        \/
//                                   ₒ     /      \       )                                 (
//           (   ₒ৹               (                      (                                  )
//            )                   )               _      )                )                (
//           (        )          (       (      ><_>    (       (        (                  )
//     )      )      (     (      )       )              )       )        )         )      (
//    (      (        )     )    (       (              (       (        (         (        )
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

struct UPrecomputesProof {
  uint[2] a;
  uint[2][2] b;
  uint[2] c;
  uint[1] input;
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "@zk-kit/incremental-merkle-tree.sol/IncrementalBinaryTree.sol": {
      "IncrementalBinaryTree": "0xab367606fdbe6ce8a692f3b02e302b7a4de2294c"
    }
  }
}

Contract ABI

[{"inputs":[{"internalType":"string","name":"_version","type":"string"},{"internalType":"address","name":"_verifierContract","type":"address"},{"internalType":"address","name":"_trustedForwarder","type":"address"},{"internalType":"uint8","name":"_depth","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"commitmentId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"CommitmentCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitmentMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"},{"internalType":"uint256[6]","name":"input","type":"uint256[6]"}],"internalType":"struct ECDSAProof","name":"_ecdsaProof","type":"tuple"},{"components":[{"internalType":"uint256[2]","name":"a","type":"uint256[2]"},{"internalType":"uint256[2][2]","name":"b","type":"uint256[2][2]"},{"internalType":"uint256[2]","name":"c","type":"uint256[2]"},{"internalType":"uint256[1]","name":"input","type":"uint256[1]"}],"internalType":"struct UPrecomputesProof","name":"_uPrecomputesProof","type":"tuple"}],"name":"createCommitment","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTrustedForwarder","outputs":[{"internalType":"address","name":"forwarder","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"isCommitmentMerkleRootValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"merkleRootMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoots","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberOfCommitments","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tree","outputs":[{"internalType":"uint256","name":"depth","type":"uint256"},{"internalType":"uint256","name":"root","type":"uint256"},{"internalType":"uint256","name":"numberOfLeaves","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifierContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162000dcc38038062000dcc83398101604081905262000034916200014b565b836001620000438282620002e7565b5050600280546001600160a01b0319166001600160a01b0385161790556200008782600080546001600160a01b0319166001600160a01b0392909216919091179055565b6040516304257eed60e21b81526008600482015260ff821660248201526000604482015273ab367606fdbe6ce8a692f3b02e302b7a4de2294c90631095fbb49060640160006040518083038186803b158015620000e357600080fd5b505af4158015620000f8573d6000803e3d6000fd5b5050505050505050620003b3565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200013457600080fd5b919050565b805160ff811681146200013457600080fd5b600080600080608085870312156200016257600080fd5b84516001600160401b03808211156200017a57600080fd5b818701915087601f8301126200018f57600080fd5b815181811115620001a457620001a462000106565b604051601f8201601f19908116603f01168101908382118183101715620001cf57620001cf62000106565b81604052828152602093508a84848701011115620001ec57600080fd5b600091505b82821015620002105784820184015181830185015290830190620001f1565b60008484830101528098505050506200022b8188016200011c565b945050506200023d604086016200011c565b91506200024d6060860162000139565b905092959194509250565b600181811c908216806200026d57607f821691505b6020821081036200028e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002e257600081815260208120601f850160051c81016020861015620002bd5750805b601f850160051c820191505b81811015620002de57828155600101620002c9565b5050505b505050565b81516001600160401b0381111562000303576200030362000106565b6200031b8162000314845462000258565b8462000294565b602080601f8311600181146200035357600084156200033a5750858301515b600019600386901b1c1916600185901b178555620002de565b600085815260208120601f198616915b82811015620003845788860151825594840194600190910190840162000363565b5085821015620003a35787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b610a0980620003c36000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b1e7ffad11610071578063b1e7ffad14610171578063ce1b815f14610194578063cf695688146101b9578063e3179f0c146101cc578063e9fe0532146101d6578063fd54b228146101f957600080fd5b8063231eaf4f146100b9578063450832dd146100f157806349ce89971461010657806354fd4d5014610127578063572b6c051461013c57806371c5ecb11461015e575b600080fd5b6100dc6100c73660046104f2565b60046020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101046100ff3660046106cc565b610226565b005b6101196101143660046104f2565b610433565b6040519081526020016100e8565b61012f610454565b6040516100e891906107cf565b6100dc61014a36600461081d565b6000546001600160a01b0391821691161490565b61011961016c3660046104f2565b6104e2565b6100dc61017f3660046104f2565b60076020526000908152604090205460ff1681565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016100e8565b6002546101a1906001600160a01b031681565b6003546101199081565b6100dc6101e43660046104f2565b60009081526007602052604090205460ff1690565b600854600954600a5461020b92919083565b604080519384526020840192909252908201526060016100e8565b600254604051635d4220ad60e01b81526001600160a01b0390911690635d4220ad9061025890859085906004016108a4565b602060405180830381865afa158015610275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102999190610977565b6102dc5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b604482015260640160405180910390fd5b6060820151516000818152600460205260408120805460ff1916600190811790915560058054808301825592527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909101829055600380549091019055604051630b4381fd60e11b8152600860048201526024810182905273ab367606fdbe6ce8a692f3b02e302b7a4de2294c9063168703fa9060440160006040518083038186803b15801561038b57600080fd5b505af415801561039f573d6000803e3d6000fd5b50506009546006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01829055600082815260076020908152604091829020805460ff191690931790925580518681529182018390529193507f5bec38d019c4cec2bfa098d7563f25f754a2a054a92516db7f56e8656c2adef692500160405180910390a150505050565b6005818154811061044357600080fd5b600091825260209091200154905081565b6001805461046190610999565b80601f016020809104026020016040519081016040528092919081815260200182805461048d90610999565b80156104da5780601f106104af576101008083540402835291602001916104da565b820191906000526020600020905b8154815290600101906020018083116104bd57829003601f168201915b505050505081565b6006818154811061044357600080fd5b60006020828403121561050457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156105445761054461050b565b60405290565b6040805190810167ffffffffffffffff811182821017156105445761054461050b565b600060405160c0810181811067ffffffffffffffff821117156105925761059261050b565b60405290508060c08301848111156105a957600080fd5b835b818110156105c35780358352602092830192016105ab565b50505092915050565b6000604051602080820182811067ffffffffffffffff821117156105f2576105f261050b565b80604052508192508084018581111561060a57600080fd5b845b81811015610623578035845292820192820161060c565b5050505092915050565b600082601f83011261063e57600080fd5b61064661054a565b80604084018581111561065857600080fd5b845b8181101561067257803584526020938401930161065a565b509095945050505050565b600082601f83011261068e57600080fd5b61069661054a565b8060808401858111156106a857600080fd5b845b81811015610672576106bc878261062d565b84526020909301926040016106aa565b6000808284036102e08112156106e157600080fd5b6101c0808212156106f157600080fd5b6106f9610521565b610703878761062d565b8152610712876040880161067d565b60208201526107248760c0880161062d565b60408201528661011f87011261073957600080fd5b61074787610100880161056d565b606082015293506101206101bf198301121561076257600080fd5b61076a610521565b91506107788682870161062d565b82525061078985610200860161067d565b602082015261079c85610280860161062d565b6040820152846102df8501126107b157600080fd5b6107bf856102c086016105cc565b6060820152809150509250929050565b600060208083528351808285015260005b818110156107fc578581018301518582016040015282016107e0565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561082f57600080fd5b81356001600160a01b038116811461084657600080fd5b9392505050565b8060005b6002811015610870578151845260209384019390910190600101610851565b50505050565b8060005b60028110156108705761088e84835161084d565b604093909301926020919091019060010161087a565b60006102e0820190506108b882855161084d565b6020808501516108cb6040850182610876565b5060408501516108de60c085018261084d565b506060850151610100840160005b6006811015610909578251825291830191908301906001016108ec565b50505061091b6101c08401855161084d565b8084015161092d610200850182610876565b50604084015161094161028085018261084d565b5060608401516102c0840160005b600181101561096c5782518252918301919083019060010161094f565b505050509392505050565b60006020828403121561098957600080fd5b8151801515811461084657600080fd5b600181811c908216806109ad57607f821691505b6020821081036109cd57634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220e95e7ec2e030747cc08f5671cd61b5986c87c9d2e885bb84fa67e721d8ae478c64736f6c634300081300330000000000000000000000000000000000000000000000000000000000000080000000000000000000000000aa55a7bc08913d4a05990bc6eff5ac8478a8b307000000000000000000000000b2b5841dbef766d4b521221732f9b618fcf34a87000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000006302e302e31320000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063b1e7ffad11610071578063b1e7ffad14610171578063ce1b815f14610194578063cf695688146101b9578063e3179f0c146101cc578063e9fe0532146101d6578063fd54b228146101f957600080fd5b8063231eaf4f146100b9578063450832dd146100f157806349ce89971461010657806354fd4d5014610127578063572b6c051461013c57806371c5ecb11461015e575b600080fd5b6100dc6100c73660046104f2565b60046020526000908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6101046100ff3660046106cc565b610226565b005b6101196101143660046104f2565b610433565b6040519081526020016100e8565b61012f610454565b6040516100e891906107cf565b6100dc61014a36600461081d565b6000546001600160a01b0391821691161490565b61011961016c3660046104f2565b6104e2565b6100dc61017f3660046104f2565b60076020526000908152604090205460ff1681565b6000546001600160a01b03165b6040516001600160a01b0390911681526020016100e8565b6002546101a1906001600160a01b031681565b6003546101199081565b6100dc6101e43660046104f2565b60009081526007602052604090205460ff1690565b600854600954600a5461020b92919083565b604080519384526020840192909252908201526060016100e8565b600254604051635d4220ad60e01b81526001600160a01b0390911690635d4220ad9061025890859085906004016108a4565b602060405180830381865afa158015610275573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102999190610977565b6102dc5760405162461bcd60e51b815260206004820152601060248201526f24b73b30b634b2102d2590383937b7b360811b604482015260640160405180910390fd5b6060820151516000818152600460205260408120805460ff1916600190811790915560058054808301825592527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0909101829055600380549091019055604051630b4381fd60e11b8152600860048201526024810182905273ab367606fdbe6ce8a692f3b02e302b7a4de2294c9063168703fa9060440160006040518083038186803b15801561038b57600080fd5b505af415801561039f573d6000803e3d6000fd5b50506009546006805460018082019092557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01829055600082815260076020908152604091829020805460ff191690931790925580518681529182018390529193507f5bec38d019c4cec2bfa098d7563f25f754a2a054a92516db7f56e8656c2adef692500160405180910390a150505050565b6005818154811061044357600080fd5b600091825260209091200154905081565b6001805461046190610999565b80601f016020809104026020016040519081016040528092919081815260200182805461048d90610999565b80156104da5780601f106104af576101008083540402835291602001916104da565b820191906000526020600020905b8154815290600101906020018083116104bd57829003601f168201915b505050505081565b6006818154811061044357600080fd5b60006020828403121561050457600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6040516080810167ffffffffffffffff811182821017156105445761054461050b565b60405290565b6040805190810167ffffffffffffffff811182821017156105445761054461050b565b600060405160c0810181811067ffffffffffffffff821117156105925761059261050b565b60405290508060c08301848111156105a957600080fd5b835b818110156105c35780358352602092830192016105ab565b50505092915050565b6000604051602080820182811067ffffffffffffffff821117156105f2576105f261050b565b80604052508192508084018581111561060a57600080fd5b845b81811015610623578035845292820192820161060c565b5050505092915050565b600082601f83011261063e57600080fd5b61064661054a565b80604084018581111561065857600080fd5b845b8181101561067257803584526020938401930161065a565b509095945050505050565b600082601f83011261068e57600080fd5b61069661054a565b8060808401858111156106a857600080fd5b845b81811015610672576106bc878261062d565b84526020909301926040016106aa565b6000808284036102e08112156106e157600080fd5b6101c0808212156106f157600080fd5b6106f9610521565b610703878761062d565b8152610712876040880161067d565b60208201526107248760c0880161062d565b60408201528661011f87011261073957600080fd5b61074787610100880161056d565b606082015293506101206101bf198301121561076257600080fd5b61076a610521565b91506107788682870161062d565b82525061078985610200860161067d565b602082015261079c85610280860161062d565b6040820152846102df8501126107b157600080fd5b6107bf856102c086016105cc565b6060820152809150509250929050565b600060208083528351808285015260005b818110156107fc578581018301518582016040015282016107e0565b506000604082860101526040601f19601f8301168501019250505092915050565b60006020828403121561082f57600080fd5b81356001600160a01b038116811461084657600080fd5b9392505050565b8060005b6002811015610870578151845260209384019390910190600101610851565b50505050565b8060005b60028110156108705761088e84835161084d565b604093909301926020919091019060010161087a565b60006102e0820190506108b882855161084d565b6020808501516108cb6040850182610876565b5060408501516108de60c085018261084d565b506060850151610100840160005b6006811015610909578251825291830191908301906001016108ec565b50505061091b6101c08401855161084d565b8084015161092d610200850182610876565b50604084015161094161028085018261084d565b5060608401516102c0840160005b600181101561096c5782518252918301919083019060010161094f565b505050509392505050565b60006020828403121561098957600080fd5b8151801515811461084657600080fd5b600181811c908216806109ad57607f821691505b6020821081036109cd57634e487b7160e01b600052602260045260246000fd5b5091905056fea2646970667358221220e95e7ec2e030747cc08f5671cd61b5986c87c9d2e885bb84fa67e721d8ae478c64736f6c63430008130033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000aa55a7bc08913d4a05990bc6eff5ac8478a8b307000000000000000000000000b2b5841dbef766d4b521221732f9b618fcf34a87000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000006302e302e31320000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _version (string): 0.0.12
Arg [1] : _verifierContract (address): 0xAa55A7bc08913d4A05990Bc6eFf5ac8478A8b307
Arg [2] : _trustedForwarder (address): 0xB2b5841DBeF766d4b521221732F9B618fCf34A87
Arg [3] : _depth (uint8): 30

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 000000000000000000000000aa55a7bc08913d4a05990bc6eff5ac8478a8b307
Arg [2] : 000000000000000000000000b2b5841dbef766d4b521221732f9b618fcf34a87
Arg [3] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 302e302e31320000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.