ETH Price: $2,069.06 (+3.24%)

Contract

0xb9CcEe4d9CeFD1C10D4086E29a7889BBe05c2692
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
0x60806040201505102024-06-22 23:26:35625 days ago1719098795  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SAGVerifier

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion, MIT license
/**
 *Submitted for verification at Etherscan.io on 2024-06-22
*/

// SPDX-License-Identifier: MIT
// Developed by Cypher Lab (https://www.cypherlab.org/)

// see https://github.com/Cypher-Laboratory/evm-verifier

pragma solidity ^0.8.20;


contract SAGVerifier {
    // Field size
    uint256 constant pp =
        0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F;

    // Base point (generator) G
    uint256 constant Gx =
        0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798;
    uint256 constant Gy =
        0x483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8;

    // Order of G
    uint256 constant nn =
        0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141;

    constructor() {}

    /**
     * @dev Verifies a non-linkable ring signature generated with the evmCompatibilty parameters
     *
     * @param message - keccack256 message hash
     * @param ring - ring of public keys [pkX0, pkY0, pkX1, pkY1, ..., pkXn, pkYn]
     * @param responses - ring of responses [r0, r1, ..., rn]
     * @param c - signature seed
     *
     * @return true if the signature is valid, false otherwise
     */
    function verifyRingSignature(
        uint256 message,
        uint256[] memory ring,
        uint256[] memory responses,
        uint256 c // signature seed
    ) public pure returns (bool) {

        // check if ring.length is even
        require(
            ring.length > 0 && ring.length % 2 == 0,
            "Ring length must be even and greater than 1"
        );

        // check if responses.length = ring.length / 2
        require(
            responses.length == ring.length / 2,
            "Responses length must be equal to ring length / 2"
        );

        // compute c1' (message is added to the hash)
        uint256 cp = computeC1(message, responses[0], c, ring[0], ring[1]);

        uint256 j = 2;

        // compute c2', c3', ..., cn', c0'
        for (uint256 i = 1; i < responses.length; i++) {
            cp = computeC(responses[i], cp, ring[j], ring[j + 1]);
            j += 2;
        }

        // check if c0' == c0
        return (c == cp);
    }

    /**
     * @dev Computes a ci value (i != 1)
     *
     * @param response - previous response
     * @param previousC - previous c value
     * @param xPreviousPubKey - previous public key x coordinate
     * @param yPreviousPubKey - previous public key y coordinate
     *
     * @return ci value
     */
    function computeC(
        uint256 response,
        uint256 previousC,
        uint256 xPreviousPubKey,
        uint256 yPreviousPubKey
    ) internal pure returns (uint256) {
        // check if [ring[0], ring[1]] is on the curve
        isOnSECP25K1(xPreviousPubKey, yPreviousPubKey);

        // compute [rG + previousPubKey * c] by tweaking ecRecover
        address computedPubKey = sbmul_add_smul(
            response,
            xPreviousPubKey,
            yPreviousPubKey,
            previousC
        );

        // keccack256(message, [rG + previousPubKey * c])
        bytes memory data = abi.encode(uint256(uint160(computedPubKey)));

        return uint256(keccak256(data));
    }

    /**
     * @dev Computes the c1 value
     *
     * @param message - keccack256 message hash
     * @param response - response[0]
     * @param previousC - previous c value
     * @param xPreviousPubKey - previous public key x coordinate
     * @param yPreviousPubKey - previous public key y coordinate
     *
     * @return c1 value
     */
    function computeC1(
        uint256 message,
        uint256 response,
        uint256 previousC,
        uint256 xPreviousPubKey,
        uint256 yPreviousPubKey
    ) internal pure returns (uint256) {
        // check if [ring[0], ring[1]] is on the curve
        isOnSECP25K1(xPreviousPubKey, yPreviousPubKey);
        // compute [rG + previousPubKey * c] by tweaking ecRecover
        address computedPubKey = sbmul_add_smul(
            response,
            xPreviousPubKey,
            yPreviousPubKey,
            previousC
        );

        // keccack256(message, [rG + previousPubKey * c])
        bytes memory data = abi.encode(
            message,
            uint256(uint160(computedPubKey))
        );

        return uint256(keccak256(data));
    }

    /**
     * @dev Computs response * G + challenge * (x, y) by tweaking ecRecover (response and challenge are scalars)
     *
     * @param response - response value
     * @param x - previousPubKey.x
     * @param y - previousPubKey.y
     * @param challenge - previousC value
     *
     * @return computedPubKey - the ethereum address derived from the point [response * G + challenge * (x, y)]
     */
    function sbmul_add_smul(
        uint256 response,
        uint256 x,
        uint256 y,
        uint256 challenge
    ) internal pure returns (address) {
        
        response = mulmod((nn - response) % nn, x, nn);

        return
            ecrecover(
                bytes32(response), // 'msghash'
                y % 2 != 0 ? 28 : 27, // v
                bytes32(x), // r
                bytes32(mulmod(challenge, x, nn)) // s
            );
    }

    /**
     * @dev Computes (value * mod) % mod
     *
     * @param value - value to be modulated
     * @param mod - mod value
     *
     * @return result - the result of the modular operation
     */
    function modulo(
        uint256 value,
        uint256 mod
    ) internal pure returns (uint256) {
        uint256 result = value % mod;
        if (result < 0) {
            result += mod;
        }
        return result;
    }

    /**
     * @dev Checks if a point is on the secp256k1 curve
     *
     * Revert if the point is not on the curve
     *
     * @param x - point x coordinate
     * @param y - point y coordinate
     */
    function isOnSECP25K1(uint256 x, uint256 y) internal pure {
        if (
            mulmod(y, y, pp) != addmod(mulmod(x, mulmod(x, x, pp), pp), 7, pp)
        ) {
            revert("Point is not on curve");
        }
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"message","type":"uint256"},{"internalType":"uint256[]","name":"ring","type":"uint256[]"},{"internalType":"uint256[]","name":"responses","type":"uint256[]"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"verifyRingSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

608060405234801561001057600080fd5b50610bff806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806332503eb114610030575b600080fd5b61004a600480360381019061004591906106e7565b610060565b60405161005791906107a1565b60405180910390f35b600080845111801561007f575060006002855161007d91906107eb565b145b6100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061089f565b60405180910390fd5b600284516100cc91906108ee565b83511461010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010590610991565b60405180910390fd5b600061016e8685600081518110610128576101276109b1565b5b60200260200101518588600081518110610145576101446109b1565b5b602002602001015189600181518110610161576101606109b1565b5b6020026020010151610220565b90506000600290506000600190505b8551811015610210576101ec86828151811061019c5761019b6109b1565b5b6020026020010151848985815181106101b8576101b76109b1565b5b60200260200101518a6001876101ce91906109e0565b815181106101df576101de6109b1565b5b6020026020010151610290565b92506002826101fb91906109e0565b9150808061020890610a14565b91505061017d565b5081841492505050949350505050565b600061022c83836102fd565b600061023a86858588610408565b90506000878273ffffffffffffffffffffffffffffffffffffffff16604051602001610267929190610a6b565b6040516020818303038152906040529050808051906020012060001c9250505095945050505050565b600061029c83836102fd565b60006102aa86858588610408565b905060008173ffffffffffffffffffffffffffffffffffffffff166040516020016102d59190610a94565b6040516020818303038152906040529050808051906020012060001c92505050949350505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061032c5761032b6107bc565b5b60077ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061035d5761035c6107bc565b5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061038c5761038b6107bc565b5b8586098509087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f806103c1576103c06107bc565b5b82830914610404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fb90610afb565b60405180910390fd5b5050565b60007ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414180610439576104386107bc565b5b847ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141877ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641416104879190610b1b565b61049191906107eb565b09945060018560001b60006002866104a991906107eb565b036104b557601b6104b8565b601c5b8660001b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141806104eb576104ea6107bc565b5b88870960001b6040516000815260200160405260405161050e9493929190610b84565b6020604051602081039080840390855afa158015610530573d6000803e3d6000fd5b505050602060405103519050949350505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61056b81610558565b811461057657600080fd5b50565b60008135905061058881610562565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105dc82610593565b810181811067ffffffffffffffff821117156105fb576105fa6105a4565b5b80604052505050565b600061060e610544565b905061061a82826105d3565b919050565b600067ffffffffffffffff82111561063a576106396105a4565b5b602082029050602081019050919050565b600080fd5b600061066361065e8461061f565b610604565b905080838252602082019050602084028301858111156106865761068561064b565b5b835b818110156106af578061069b8882610579565b845260208401935050602081019050610688565b5050509392505050565b600082601f8301126106ce576106cd61058e565b5b81356106de848260208601610650565b91505092915050565b600080600080608085870312156107015761070061054e565b5b600061070f87828801610579565b945050602085013567ffffffffffffffff8111156107305761072f610553565b5b61073c878288016106b9565b935050604085013567ffffffffffffffff81111561075d5761075c610553565b5b610769878288016106b9565b925050606061077a87828801610579565b91505092959194509250565b60008115159050919050565b61079b81610786565b82525050565b60006020820190506107b66000830184610792565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006107f682610558565b915061080183610558565b925082610811576108106107bc565b5b828206905092915050565b600082825260208201905092915050565b7f52696e67206c656e677468206d757374206265206576656e20616e642067726560008201527f61746572207468616e2031000000000000000000000000000000000000000000602082015250565b6000610889602b8361081c565b91506108948261082d565b604082019050919050565b600060208201905081810360008301526108b88161087c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f982610558565b915061090483610558565b925082610914576109136107bc565b5b828204905092915050565b7f526573706f6e736573206c656e677468206d75737420626520657175616c207460008201527f6f2072696e67206c656e677468202f2032000000000000000000000000000000602082015250565b600061097b60318361081c565b91506109868261091f565b604082019050919050565b600060208201905081810360008301526109aa8161096e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006109eb82610558565b91506109f683610558565b9250828201905080821115610a0e57610a0d6108bf565b5b92915050565b6000610a1f82610558565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a5157610a506108bf565b5b600182019050919050565b610a6581610558565b82525050565b6000604082019050610a806000830185610a5c565b610a8d6020830184610a5c565b9392505050565b6000602082019050610aa96000830184610a5c565b92915050565b7f506f696e74206973206e6f74206f6e2063757276650000000000000000000000600082015250565b6000610ae560158361081c565b9150610af082610aaf565b602082019050919050565b60006020820190508181036000830152610b1481610ad8565b9050919050565b6000610b2682610558565b9150610b3183610558565b9250828203905081811115610b4957610b486108bf565b5b92915050565b6000819050919050565b610b6281610b4f565b82525050565b600060ff82169050919050565b610b7e81610b68565b82525050565b6000608082019050610b996000830187610b59565b610ba66020830186610b75565b610bb36040830185610b59565b610bc06060830184610b59565b9594505050505056fea264697066735822122094446db24d3289e2083dc50fd7b3a28a991c3dc1ed4882663ab6c1ed68f3993364736f6c63430008140033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806332503eb114610030575b600080fd5b61004a600480360381019061004591906106e7565b610060565b60405161005791906107a1565b60405180910390f35b600080845111801561007f575060006002855161007d91906107eb565b145b6100be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016100b59061089f565b60405180910390fd5b600284516100cc91906108ee565b83511461010e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010590610991565b60405180910390fd5b600061016e8685600081518110610128576101276109b1565b5b60200260200101518588600081518110610145576101446109b1565b5b602002602001015189600181518110610161576101606109b1565b5b6020026020010151610220565b90506000600290506000600190505b8551811015610210576101ec86828151811061019c5761019b6109b1565b5b6020026020010151848985815181106101b8576101b76109b1565b5b60200260200101518a6001876101ce91906109e0565b815181106101df576101de6109b1565b5b6020026020010151610290565b92506002826101fb91906109e0565b9150808061020890610a14565b91505061017d565b5081841492505050949350505050565b600061022c83836102fd565b600061023a86858588610408565b90506000878273ffffffffffffffffffffffffffffffffffffffff16604051602001610267929190610a6b565b6040516020818303038152906040529050808051906020012060001c9250505095945050505050565b600061029c83836102fd565b60006102aa86858588610408565b905060008173ffffffffffffffffffffffffffffffffffffffff166040516020016102d59190610a94565b6040516020818303038152906040529050808051906020012060001c92505050949350505050565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061032c5761032b6107bc565b5b60077ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061035d5761035c6107bc565b5b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f8061038c5761038b6107bc565b5b8586098509087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f806103c1576103c06107bc565b5b82830914610404576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103fb90610afb565b60405180910390fd5b5050565b60007ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036414180610439576104386107bc565b5b847ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141877ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd03641416104879190610b1b565b61049191906107eb565b09945060018560001b60006002866104a991906107eb565b036104b557601b6104b8565b601c5b8660001b7ffffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141806104eb576104ea6107bc565b5b88870960001b6040516000815260200160405260405161050e9493929190610b84565b6020604051602081039080840390855afa158015610530573d6000803e3d6000fd5b505050602060405103519050949350505050565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61056b81610558565b811461057657600080fd5b50565b60008135905061058881610562565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6105dc82610593565b810181811067ffffffffffffffff821117156105fb576105fa6105a4565b5b80604052505050565b600061060e610544565b905061061a82826105d3565b919050565b600067ffffffffffffffff82111561063a576106396105a4565b5b602082029050602081019050919050565b600080fd5b600061066361065e8461061f565b610604565b905080838252602082019050602084028301858111156106865761068561064b565b5b835b818110156106af578061069b8882610579565b845260208401935050602081019050610688565b5050509392505050565b600082601f8301126106ce576106cd61058e565b5b81356106de848260208601610650565b91505092915050565b600080600080608085870312156107015761070061054e565b5b600061070f87828801610579565b945050602085013567ffffffffffffffff8111156107305761072f610553565b5b61073c878288016106b9565b935050604085013567ffffffffffffffff81111561075d5761075c610553565b5b610769878288016106b9565b925050606061077a87828801610579565b91505092959194509250565b60008115159050919050565b61079b81610786565b82525050565b60006020820190506107b66000830184610792565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006107f682610558565b915061080183610558565b925082610811576108106107bc565b5b828206905092915050565b600082825260208201905092915050565b7f52696e67206c656e677468206d757374206265206576656e20616e642067726560008201527f61746572207468616e2031000000000000000000000000000000000000000000602082015250565b6000610889602b8361081c565b91506108948261082d565b604082019050919050565b600060208201905081810360008301526108b88161087c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108f982610558565b915061090483610558565b925082610914576109136107bc565b5b828204905092915050565b7f526573706f6e736573206c656e677468206d75737420626520657175616c207460008201527f6f2072696e67206c656e677468202f2032000000000000000000000000000000602082015250565b600061097b60318361081c565b91506109868261091f565b604082019050919050565b600060208201905081810360008301526109aa8161096e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006109eb82610558565b91506109f683610558565b9250828201905080821115610a0e57610a0d6108bf565b5b92915050565b6000610a1f82610558565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610a5157610a506108bf565b5b600182019050919050565b610a6581610558565b82525050565b6000604082019050610a806000830185610a5c565b610a8d6020830184610a5c565b9392505050565b6000602082019050610aa96000830184610a5c565b92915050565b7f506f696e74206973206e6f74206f6e2063757276650000000000000000000000600082015250565b6000610ae560158361081c565b9150610af082610aaf565b602082019050919050565b60006020820190508181036000830152610b1481610ad8565b9050919050565b6000610b2682610558565b9150610b3183610558565b9250828203905081811115610b4957610b486108bf565b5b92915050565b6000819050919050565b610b6281610b4f565b82525050565b600060ff82169050919050565b610b7e81610b68565b82525050565b6000608082019050610b996000830187610b59565b610ba66020830186610b75565b610bb36040830185610b59565b610bc06060830184610b59565b9594505050505056fea264697066735822122094446db24d3289e2083dc50fd7b3a28a991c3dc1ed4882663ab6c1ed68f3993364736f6c63430008140033

Deployed Bytecode Sourcemap

182:6005:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1153:1017;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;1343:4;1439:1;1425:4;:11;:15;:39;;;;;1463:1;1458;1444:4;:11;:15;;;;:::i;:::-;:20;1425:39;1403:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:1;1646:4;:11;:15;;;;:::i;:::-;1626:9;:16;:35;1604:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;1806:10;1819:53;1829:7;1838:9;1848:1;1838:12;;;;;;;;:::i;:::-;;;;;;;;1852:1;1855:4;1860:1;1855:7;;;;;;;;:::i;:::-;;;;;;;;1864:4;1869:1;1864:7;;;;;;;;:::i;:::-;;;;;;;;1819:9;:53::i;:::-;1806:66;;1885:9;1897:1;1885:13;;1960:9;1972:1;1960:13;;1955:148;1979:9;:16;1975:1;:20;1955:148;;;2022:48;2031:9;2041:1;2031:12;;;;;;;;:::i;:::-;;;;;;;;2045:2;2049:4;2054:1;2049:7;;;;;;;;:::i;:::-;;;;;;;;2058:4;2067:1;2063;:5;;;;:::i;:::-;2058:11;;;;;;;;:::i;:::-;;;;;;;;2022:8;:48::i;:::-;2017:53;;2090:1;2085:6;;;;;:::i;:::-;;;1997:3;;;;;:::i;:::-;;;;1955:148;;;;2159:2;2154:1;:7;2146:16;;;;1153:1017;;;;;;:::o;3583:790::-;3781:7;3857:46;3870:15;3887;3857:12;:46::i;:::-;3982:22;4007:132;4036:8;4059:15;4089;4119:9;4007:14;:132::i;:::-;3982:157;;4211:17;4256:7;4294:14;4278:32;;4231:90;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4211:110;;4359:4;4349:15;;;;;;4341:24;;4334:31;;;;3583:790;;;;;;;:::o;2499:719::-;2670:7;2746:46;2759:15;2776;2746:12;:46::i;:::-;2873:22;2898:132;2927:8;2950:15;2980;3010:9;2898:14;:132::i;:::-;2873:157;;3102:17;3149:14;3133:32;;3122:44;;;;;;;;:::i;:::-;;;;;;;;;;;;;3102:64;;3204:4;3194:15;;;;;;3186:24;;3179:31;;;;2499:719;;;;;;:::o;5954:230::-;260:66;6061:46;;;;;:::i;:::-;;6101:1;260:66;6068:31;;;;;:::i;:::-;;260:66;6078:16;;;;;:::i;:::-;;6088:1;6085;6078:16;6075:1;6068:31;6061:46;260:66;6041:16;;;;;:::i;:::-;;6051:1;6048;6041:16;:66;6023:154;;6134:31;;;;;;;;;;:::i;:::-;;;;;;;;6023:154;5954:230;;:::o;4798:474::-;4947:7;628:66;4988:35;;;;;:::i;:::-;;5017:1;628:66;5001:8;628:66;4996:13;;;;:::i;:::-;4995:20;;;;:::i;:::-;4988:35;4977:46;;5056:208;5092:8;5084:17;;5142:1;5137;5133;:5;;;;:::i;:::-;:10;:20;;5151:2;5133:20;;;5146:2;5133:20;5185:1;5177:10;;628:66;5219:24;;;;;:::i;:::-;;5237:1;5226:9;5219:24;5211:33;;5056:208;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5036:228;;4798:474;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:117::-;799:1;796;789:12;813:102;854:6;905:2;901:7;896:2;889:5;885:14;881:28;871:38;;813:102;;;:::o;921:180::-;969:77;966:1;959:88;1066:4;1063:1;1056:15;1090:4;1087:1;1080:15;1107:281;1190:27;1212:4;1190:27;:::i;:::-;1182:6;1178:40;1320:6;1308:10;1305:22;1284:18;1272:10;1269:34;1266:62;1263:88;;;1331:18;;:::i;:::-;1263:88;1371:10;1367:2;1360:22;1150:238;1107:281;;:::o;1394:129::-;1428:6;1455:20;;:::i;:::-;1445:30;;1484:33;1512:4;1504:6;1484:33;:::i;:::-;1394:129;;;:::o;1529:311::-;1606:4;1696:18;1688:6;1685:30;1682:56;;;1718:18;;:::i;:::-;1682:56;1768:4;1760:6;1756:17;1748:25;;1828:4;1822;1818:15;1810:23;;1529:311;;;:::o;1846:117::-;1955:1;1952;1945:12;1986:710;2082:5;2107:81;2123:64;2180:6;2123:64;:::i;:::-;2107:81;:::i;:::-;2098:90;;2208:5;2237:6;2230:5;2223:21;2271:4;2264:5;2260:16;2253:23;;2324:4;2316:6;2312:17;2304:6;2300:30;2353:3;2345:6;2342:15;2339:122;;;2372:79;;:::i;:::-;2339:122;2487:6;2470:220;2504:6;2499:3;2496:15;2470:220;;;2579:3;2608:37;2641:3;2629:10;2608:37;:::i;:::-;2603:3;2596:50;2675:4;2670:3;2666:14;2659:21;;2546:144;2530:4;2525:3;2521:14;2514:21;;2470:220;;;2474:21;2088:608;;1986:710;;;;;:::o;2719:370::-;2790:5;2839:3;2832:4;2824:6;2820:17;2816:27;2806:122;;2847:79;;:::i;:::-;2806:122;2964:6;2951:20;2989:94;3079:3;3071:6;3064:4;3056:6;3052:17;2989:94;:::i;:::-;2980:103;;2796:293;2719:370;;;;:::o;3095:1185::-;3231:6;3239;3247;3255;3304:3;3292:9;3283:7;3279:23;3275:33;3272:120;;;3311:79;;:::i;:::-;3272:120;3431:1;3456:53;3501:7;3492:6;3481:9;3477:22;3456:53;:::i;:::-;3446:63;;3402:117;3586:2;3575:9;3571:18;3558:32;3617:18;3609:6;3606:30;3603:117;;;3639:79;;:::i;:::-;3603:117;3744:78;3814:7;3805:6;3794:9;3790:22;3744:78;:::i;:::-;3734:88;;3529:303;3899:2;3888:9;3884:18;3871:32;3930:18;3922:6;3919:30;3916:117;;;3952:79;;:::i;:::-;3916:117;4057:78;4127:7;4118:6;4107:9;4103:22;4057:78;:::i;:::-;4047:88;;3842:303;4184:2;4210:53;4255:7;4246:6;4235:9;4231:22;4210:53;:::i;:::-;4200:63;;4155:118;3095:1185;;;;;;;:::o;4286:90::-;4320:7;4363:5;4356:13;4349:21;4338:32;;4286:90;;;:::o;4382:109::-;4463:21;4478:5;4463:21;:::i;:::-;4458:3;4451:34;4382:109;;:::o;4497:210::-;4584:4;4622:2;4611:9;4607:18;4599:26;;4635:65;4697:1;4686:9;4682:17;4673:6;4635:65;:::i;:::-;4497:210;;;;:::o;4713:180::-;4761:77;4758:1;4751:88;4858:4;4855:1;4848:15;4882:4;4879:1;4872:15;4899:176;4931:1;4948:20;4966:1;4948:20;:::i;:::-;4943:25;;4982:20;5000:1;4982:20;:::i;:::-;4977:25;;5021:1;5011:35;;5026:18;;:::i;:::-;5011:35;5067:1;5064;5060:9;5055:14;;4899:176;;;;:::o;5081:169::-;5165:11;5199:6;5194:3;5187:19;5239:4;5234:3;5230:14;5215:29;;5081:169;;;;:::o;5256:230::-;5396:34;5392:1;5384:6;5380:14;5373:58;5465:13;5460:2;5452:6;5448:15;5441:38;5256:230;:::o;5492:366::-;5634:3;5655:67;5719:2;5714:3;5655:67;:::i;:::-;5648:74;;5731:93;5820:3;5731:93;:::i;:::-;5849:2;5844:3;5840:12;5833:19;;5492:366;;;:::o;5864:419::-;6030:4;6068:2;6057:9;6053:18;6045:26;;6117:9;6111:4;6107:20;6103:1;6092:9;6088:17;6081:47;6145:131;6271:4;6145:131;:::i;:::-;6137:139;;5864:419;;;:::o;6289:180::-;6337:77;6334:1;6327:88;6434:4;6431:1;6424:15;6458:4;6455:1;6448:15;6475:185;6515:1;6532:20;6550:1;6532:20;:::i;:::-;6527:25;;6566:20;6584:1;6566:20;:::i;:::-;6561:25;;6605:1;6595:35;;6610:18;;:::i;:::-;6595:35;6652:1;6649;6645:9;6640:14;;6475:185;;;;:::o;6666:236::-;6806:34;6802:1;6794:6;6790:14;6783:58;6875:19;6870:2;6862:6;6858:15;6851:44;6666:236;:::o;6908:366::-;7050:3;7071:67;7135:2;7130:3;7071:67;:::i;:::-;7064:74;;7147:93;7236:3;7147:93;:::i;:::-;7265:2;7260:3;7256:12;7249:19;;6908:366;;;:::o;7280:419::-;7446:4;7484:2;7473:9;7469:18;7461:26;;7533:9;7527:4;7523:20;7519:1;7508:9;7504:17;7497:47;7561:131;7687:4;7561:131;:::i;:::-;7553:139;;7280:419;;;:::o;7705:180::-;7753:77;7750:1;7743:88;7850:4;7847:1;7840:15;7874:4;7871:1;7864:15;7891:191;7931:3;7950:20;7968:1;7950:20;:::i;:::-;7945:25;;7984:20;8002:1;7984:20;:::i;:::-;7979:25;;8027:1;8024;8020:9;8013:16;;8048:3;8045:1;8042:10;8039:36;;;8055:18;;:::i;:::-;8039:36;7891:191;;;;:::o;8088:233::-;8127:3;8150:24;8168:5;8150:24;:::i;:::-;8141:33;;8196:66;8189:5;8186:77;8183:103;;8266:18;;:::i;:::-;8183:103;8313:1;8306:5;8302:13;8295:20;;8088:233;;;:::o;8327:118::-;8414:24;8432:5;8414:24;:::i;:::-;8409:3;8402:37;8327:118;;:::o;8451:332::-;8572:4;8610:2;8599:9;8595:18;8587:26;;8623:71;8691:1;8680:9;8676:17;8667:6;8623:71;:::i;:::-;8704:72;8772:2;8761:9;8757:18;8748:6;8704:72;:::i;:::-;8451:332;;;;;:::o;8789:222::-;8882:4;8920:2;8909:9;8905:18;8897:26;;8933:71;9001:1;8990:9;8986:17;8977:6;8933:71;:::i;:::-;8789:222;;;;:::o;9017:171::-;9157:23;9153:1;9145:6;9141:14;9134:47;9017:171;:::o;9194:366::-;9336:3;9357:67;9421:2;9416:3;9357:67;:::i;:::-;9350:74;;9433:93;9522:3;9433:93;:::i;:::-;9551:2;9546:3;9542:12;9535:19;;9194:366;;;:::o;9566:419::-;9732:4;9770:2;9759:9;9755:18;9747:26;;9819:9;9813:4;9809:20;9805:1;9794:9;9790:17;9783:47;9847:131;9973:4;9847:131;:::i;:::-;9839:139;;9566:419;;;:::o;9991:194::-;10031:4;10051:20;10069:1;10051:20;:::i;:::-;10046:25;;10085:20;10103:1;10085:20;:::i;:::-;10080:25;;10129:1;10126;10122:9;10114:17;;10153:1;10147:4;10144:11;10141:37;;;10158:18;;:::i;:::-;10141:37;9991:194;;;;:::o;10191:77::-;10228:7;10257:5;10246:16;;10191:77;;;:::o;10274:118::-;10361:24;10379:5;10361:24;:::i;:::-;10356:3;10349:37;10274:118;;:::o;10398:86::-;10433:7;10473:4;10466:5;10462:16;10451:27;;10398:86;;;:::o;10490:112::-;10573:22;10589:5;10573:22;:::i;:::-;10568:3;10561:35;10490:112;;:::o;10608:545::-;10781:4;10819:3;10808:9;10804:19;10796:27;;10833:71;10901:1;10890:9;10886:17;10877:6;10833:71;:::i;:::-;10914:68;10978:2;10967:9;10963:18;10954:6;10914:68;:::i;:::-;10992:72;11060:2;11049:9;11045:18;11036:6;10992:72;:::i;:::-;11074;11142:2;11131:9;11127:18;11118:6;11074:72;:::i;:::-;10608:545;;;;;;;:::o

Swarm Source

ipfs://94446db24d3289e2083dc50fd7b3a28a991c3dc1ed4882663ab6c1ed68f39933

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.