ETH Price: $2,112.26 (+1.81%)

Contract

0xfdc0Eb098a6D27cA62BB67e0804D461cB698f9fA
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw84002562019-08-22 12:59:082396 days ago1566478748IN
0xfdc0Eb09...cB698f9fA
0 ETH0.0005598313
Withdraw83013102019-08-07 4:17:092412 days ago1565151429IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000302797
Withdraw83013102019-08-07 4:17:092412 days ago1565151429IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000301447
Withdraw83013102019-08-07 4:17:092412 days ago1565151429IN
0xfdc0Eb09...cB698f9fA
0 ETH0.004627637
Withdraw82861182019-08-04 19:41:382414 days ago1564947698IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000129383
Withdraw82861182019-08-04 19:41:382414 days ago1564947698IN
0xfdc0Eb09...cB698f9fA
0 ETH0.001914593
Transfer82688922019-08-02 3:46:162417 days ago1564717576IN
0xfdc0Eb09...cB698f9fA
1 ETH0.0071573210
Commit82688622019-08-02 3:40:402417 days ago1564717240IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000402256
Transfer82687572019-08-02 3:15:202417 days ago1564715720IN
0xfdc0Eb09...cB698f9fA
1 ETH0.0077709610
Commit82687182019-08-02 3:07:172417 days ago1564715237IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000335215
Withdraw82234402019-07-26 2:13:572424 days ago1564107237IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000216285
Withdraw82234402019-07-26 2:13:572424 days ago1564107237IN
0xfdc0Eb09...cB698f9fA
0 ETH0.003180455
Withdraw82234392019-07-26 2:13:502424 days ago1564107230IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000215645
Withdraw82234392019-07-26 2:13:502424 days ago1564107230IN
0xfdc0Eb09...cB698f9fA
0 ETH0.003179815
Withdraw82234372019-07-26 2:13:302424 days ago1564107210IN
0xfdc0Eb09...cB698f9fA
0 ETH0.003305135
Withdraw82234362019-07-26 2:13:122424 days ago1564107192IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000216285
Withdraw82234362019-07-26 2:13:122424 days ago1564107192IN
0xfdc0Eb09...cB698f9fA
0 ETH0.003305455
Transfer82075072019-07-23 14:38:582426 days ago1563892738IN
0xfdc0Eb09...cB698f9fA
1 ETH0.0014262
Commit82074972019-07-23 14:37:242426 days ago1563892644IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000200933
Transfer82074622019-07-23 14:27:492426 days ago1563892069IN
0xfdc0Eb09...cB698f9fA
1 ETH0.00218813
Commit82074512019-07-23 14:25:382426 days ago1563891938IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000201123
Transfer82073492019-07-23 14:00:492426 days ago1563890449IN
0xfdc0Eb09...cB698f9fA
1 ETH0.00214313
Commit82073412019-07-23 13:58:572426 days ago1563890337IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000201123
Transfer82073232019-07-23 13:54:432426 days ago1563890083IN
0xfdc0Eb09...cB698f9fA
1 ETH0.002237193
Transfer82073052019-07-23 13:50:472426 days ago1563889847IN
0xfdc0Eb09...cB698f9fA
0 ETH0.000063753
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
-83013102019-08-07 4:17:092412 days ago1565151429
0xfdc0Eb09...cB698f9fA
0.00445106 ETH
-83013102019-08-07 4:17:092412 days ago1565151429
0xfdc0Eb09...cB698f9fA
0.99554893 ETH
-82861182019-08-04 19:41:382414 days ago1564947698
0xfdc0Eb09...cB698f9fA
0.00190759 ETH
-82861182019-08-04 19:41:382414 days ago1564947698
0xfdc0Eb09...cB698f9fA
0.9980924 ETH
-82234402019-07-26 2:13:572424 days ago1564107237
0xfdc0Eb09...cB698f9fA
0.00317933 ETH
-82234402019-07-26 2:13:572424 days ago1564107237
0xfdc0Eb09...cB698f9fA
0.99682066 ETH
-82234392019-07-26 2:13:502424 days ago1564107230
0xfdc0Eb09...cB698f9fA
0.00317933 ETH
-82234392019-07-26 2:13:502424 days ago1564107230
0xfdc0Eb09...cB698f9fA
0.99682066 ETH
-82234372019-07-26 2:13:302424 days ago1564107210
0xfdc0Eb09...cB698f9fA
0.00317933 ETH
-82234372019-07-26 2:13:302424 days ago1564107210
0xfdc0Eb09...cB698f9fA
0.99682067 ETH
-82234362019-07-26 2:13:122424 days ago1564107192
0xfdc0Eb09...cB698f9fA
0.00317933 ETH
-82234362019-07-26 2:13:122424 days ago1564107192
0xfdc0Eb09...cB698f9fA
0.99682066 ETH
-81304342019-07-11 14:22:022438 days ago1562854922
0xfdc0Eb09...cB698f9fA
0.01271732 ETH
-81304342019-07-11 14:22:022438 days ago1562854922
0xfdc0Eb09...cB698f9fA
0.98728267 ETH
-81209262019-07-10 2:57:052440 days ago1562727425
0xfdc0Eb09...cB698f9fA
0.00317933 ETH
-81209262019-07-10 2:57:052440 days ago1562727425
0xfdc0Eb09...cB698f9fA
0.99682066 ETH
-80508302019-06-29 5:11:422451 days ago1561785102
0xfdc0Eb09...cB698f9fA
0.00254346 ETH
-80508302019-06-29 5:11:422451 days ago1561785102
0xfdc0Eb09...cB698f9fA
0.99745653 ETH
-80465892019-06-28 13:29:462451 days ago1561728586
0xfdc0Eb09...cB698f9fA
0.01271732 ETH
-80465892019-06-28 13:29:462451 days ago1561728586
0xfdc0Eb09...cB698f9fA
0.98728267 ETH
-79975892019-06-20 21:56:202459 days ago1561067780
0xfdc0Eb09...cB698f9fA
0.00254346 ETH
-79975892019-06-20 21:56:202459 days ago1561067780
0xfdc0Eb09...cB698f9fA
0.99745653 ETH
-79975852019-06-20 21:54:312459 days ago1561067671
0xfdc0Eb09...cB698f9fA
0.00254346 ETH
-79975852019-06-20 21:54:312459 days ago1561067671
0xfdc0Eb09...cB698f9fA
0.99745653 ETH
-79947272019-06-20 11:10:552459 days ago1561029055
0xfdc0Eb09...cB698f9fA
0.01271732 ETH
View All Internal Transactions
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:
Mixer

Compiler Version
v0.5.0+commit.1d4f565a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-06-17
*/

pragma solidity ^0.5.0;


library Pairing {
    struct G1Point {
        uint X;
        uint Y;
    }

    // Encoding of field elements is: X[0] * z + X[1]
    struct G2Point {
        uint[2] X;
        uint[2] Y;
    }

    /// @return the generator of G1
    function P1()
        internal pure returns (G1Point memory)
    {
        return G1Point(1, 2);
    }

    /// @return the generator of G2
    function P2() internal pure returns (G2Point memory) {
        return G2Point(
            [11559732032986387107991004021392285783925812861821192530917403151452391805634,
             10857046999023057135944570762232829481370756359578518086990519993285655852781],
            [4082367875863433681332203403145435568316851327593401208105741076214120093531,
             8495653923123431417604973247489272438418190587263600148770280649306958101930]
        );
    }

    /// @return the negation of p, i.e. p.add(p.negate()) should be zero.
    function negate(G1Point memory p) internal pure returns (G1Point memory) {
        // The prime q in the base field F_q for G1
        uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
        if (p.X == 0 && p.Y == 0)
            return G1Point(0, 0);
        return G1Point(p.X, q - (p.Y % q));
    }

    /// @return the sum of two points of G1
    function pointAdd(G1Point memory p1, G1Point memory p2)
        internal view returns (G1Point memory r)
    {
        uint[4] memory input;
        input[0] = p1.X;
        input[1] = p1.Y;
        input[2] = p2.X;
        input[3] = p2.Y;
        bool success;
        assembly {
            success := staticcall(sub(gas, 2000), 6, input, 0xc0, r, 0x60)
        }
        require(success);
    }

    /// @return the product of a point on G1 and a scalar, i.e.
    /// p == p.mul(1) and p.add(p) == p.mul(2) for all points p.
    function pointMul(G1Point memory p, uint s)
        internal view returns (G1Point memory r)
    {
        uint[3] memory input;
        input[0] = p.X;
        input[1] = p.Y;
        input[2] = s;
        bool success;
        assembly {
            success := staticcall(sub(gas, 2000), 7, input, 0x80, r, 0x60)
        }
        require (success);
    }

    /// @return the result of computing the pairing check
    /// e(p1[0], p2[0]) *  .... * e(p1[n], p2[n]) == 1
    /// For example pairing([P1(), P1().negate()], [P2(), P2()]) should
    /// return true.
    function pairing(G1Point[] memory p1, G2Point[] memory p2)
        internal view returns (bool)
    {
        require(p1.length == p2.length);
        uint elements = p1.length;
        uint inputSize = elements * 6;
        uint[] memory input = new uint[](inputSize);
        for (uint i = 0; i < elements; i++)
        {
            input[i * 6 + 0] = p1[i].X;
            input[i * 6 + 1] = p1[i].Y;
            input[i * 6 + 2] = p2[i].X[0];
            input[i * 6 + 3] = p2[i].X[1];
            input[i * 6 + 4] = p2[i].Y[0];
            input[i * 6 + 5] = p2[i].Y[1];
        }
        uint[1] memory out;
        bool success;
        assembly {
            success := staticcall(sub(gas, 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20)
        }
        require(success);
        return out[0] != 0;
    }

    /// Convenience method for a pairing check for two pairs.
    function pairingProd2(G1Point memory a1, G2Point memory a2, G1Point memory b1, G2Point memory b2)
        internal view returns (bool)
    {
        G1Point[] memory p1 = new G1Point[](2);
        G2Point[] memory p2 = new G2Point[](2);
        p1[0] = a1;
        p1[1] = b1;
        p2[0] = a2;
        p2[1] = b2;
        return pairing(p1, p2);
    }
    /// Convenience method for a pairing check for three pairs.
    function pairingProd3(
            G1Point memory a1, G2Point memory a2,
            G1Point memory b1, G2Point memory b2,
            G1Point memory c1, G2Point memory c2
    )
        internal view returns (bool)
    {
        G1Point[] memory p1 = new G1Point[](3);
        G2Point[] memory p2 = new G2Point[](3);
        p1[0] = a1;
        p1[1] = b1;
        p1[2] = c1;
        p2[0] = a2;
        p2[1] = b2;
        p2[2] = c2;
        return pairing(p1, p2);
    }

    /// Convenience method for a pairing check for four pairs.
    function pairingProd4(
            G1Point memory a1, G2Point memory a2,
            G1Point memory b1, G2Point memory b2,
            G1Point memory c1, G2Point memory c2,
            G1Point memory d1, G2Point memory d2
    )
        internal view returns (bool)
    {
        G1Point[] memory p1 = new G1Point[](4);
        G2Point[] memory p2 = new G2Point[](4);
        p1[0] = a1;
        p1[1] = b1;
        p1[2] = c1;
        p1[3] = d1;
        p2[0] = a2;
        p2[1] = b2;
        p2[2] = c2;
        p2[3] = d2;
        return pairing(p1, p2);
    }
}


library Verifier
{
    using Pairing for Pairing.G1Point;
    using Pairing for Pairing.G2Point;

    function scalarField ()
        internal pure returns (uint256)
    {
        return 21888242871839275222246405745257275088548364400416034343698204186575808495617;
    }

    struct VerifyingKey
    {
        Pairing.G1Point alpha;
        Pairing.G2Point beta;
        Pairing.G2Point gamma;
        Pairing.G2Point delta;
        Pairing.G1Point[] gammaABC;
    }

    struct Proof
    {
        Pairing.G1Point A;
        Pairing.G2Point B;
        Pairing.G1Point C;
    }

    struct ProofWithInput
    {
        Proof proof;
        uint256[] input;
    }


    function negateY( uint256 Y )
        internal 
        pure 
        returns (uint256)
    {
        uint q = 21888242871839275222246405745257275088696311157297823662689037894645226208583;
        return q - (Y % q);
    }


    /*
    * This implements the Solidity equivalent of the following Python code:

        from py_ecc.bn128 import *

        data = # ... arguments to function [in_vk, vk_gammaABC, in_proof, proof_inputs]

        vk = [int(_, 16) for _ in data[0]]
        ic = [FQ(int(_, 16)) for _ in data[1]]
        proof = [int(_, 16) for _ in data[2]]
        inputs = [int(_, 16) for _ in data[3]]

        it = iter(ic)
        ic = [(_, next(it)) for _ in it]
        vk_alpha = [FQ(_) for _ in vk[:2]]
        vk_beta = (FQ2(vk[2:4][::-1]), FQ2(vk[4:6][::-1]))
        vk_gamma = (FQ2(vk[6:8][::-1]), FQ2(vk[8:10][::-1]))
        vk_delta = (FQ2(vk[10:12][::-1]), FQ2(vk[12:14][::-1]))

        assert is_on_curve(vk_alpha, b)
        assert is_on_curve(vk_beta, b2)
        assert is_on_curve(vk_gamma, b2)
        assert is_on_curve(vk_delta, b2)

        proof_A = [FQ(_) for _ in proof[:2]]
        proof_B = (FQ2(proof[2:4][::-1]), FQ2(proof[4:-2][::-1]))
        proof_C = [FQ(_) for _ in proof[-2:]]

        assert is_on_curve(proof_A, b)
        assert is_on_curve(proof_B, b2)
        assert is_on_curve(proof_C, b)

        vk_x = ic[0]
        for i, s in enumerate(inputs):
            vk_x = add(vk_x, multiply(ic[i + 1], s))

        check_1 = pairing(proof_B, proof_A)
        check_2 = pairing(vk_beta, neg(vk_alpha))
        check_3 = pairing(vk_gamma, neg(vk_x))
        check_4 = pairing(vk_delta, neg(proof_C))

        ok = check_1 * check_2 * check_3 * check_4
        assert ok == FQ12.one()
    */
    function verify (uint256[14] memory in_vk, uint256[] memory vk_gammaABC, uint256[8] memory in_proof, uint256[] memory proof_inputs)
        internal 
        view 
        returns (bool)
    {
        require( ((vk_gammaABC.length / 2) - 1) == proof_inputs.length );
        
        // Compute the linear combination vk_x
        uint256[3] memory mul_input;
        uint256[4] memory add_input;
        bool success;
        uint m = 2;

        // First two fields are used as the sum
        add_input[0] = vk_gammaABC[0];
        add_input[1] = vk_gammaABC[1];

        // Performs a sum of gammaABC[0] + sum[ gammaABC[i+1]^proof_inputs[i] ]
        for (uint i = 0; i < proof_inputs.length; i++) {
            mul_input[0] = vk_gammaABC[m++];
            mul_input[1] = vk_gammaABC[m++];
            mul_input[2] = proof_inputs[i];

            assembly {
                // ECMUL, output to last 2 elements of `add_input`
                success := staticcall(sub(gas, 2000), 7, mul_input, 0x80, add(add_input, 0x40), 0x60)
            }
            require(success);
            
            assembly {
                // ECADD
                success := staticcall(sub(gas, 2000), 6, add_input, 0xc0, add_input, 0x60)
            }
            require(success);
        }
        
        uint[24] memory input = [
            // (proof.A, proof.B)
            in_proof[0], in_proof[1],                           // proof.A   (G1)
            in_proof[2], in_proof[3], in_proof[4], in_proof[5], // proof.B   (G2)

            // (-vk.alpha, vk.beta)
            in_vk[0], negateY(in_vk[1]),                        // -vk.alpha (G1)
            in_vk[2], in_vk[3], in_vk[4], in_vk[5],             // vk.beta   (G2)

            // (-vk_x, vk.gamma)
            add_input[0], negateY(add_input[1]),                // -vk_x     (G1)
            in_vk[6], in_vk[7], in_vk[8], in_vk[9],             // vk.gamma  (G2)

            // (-proof.C, vk.delta)
            in_proof[6], negateY(in_proof[7]),                  // -proof.C  (G1)
            in_vk[10], in_vk[11], in_vk[12], in_vk[13]          // vk.delta  (G2)
        ];

        uint[1] memory out;
        assembly {
            success := staticcall(sub(gas, 2000), 8, input, 768, out, 0x20)
        }
        require(success);
        return out[0] != 0;
    }


    function verify(VerifyingKey memory vk, ProofWithInput memory pwi)
        internal 
        view 
        returns (bool)
    {
        return verify(vk, pwi.proof, pwi.input);
    }


    function verify(VerifyingKey memory vk, Proof memory proof, uint256[] memory input)
        internal 
        view 
        returns (bool)
    {
        require(input.length + 1 == vk.gammaABC.length);

        // Compute the linear combination vk_x
        Pairing.G1Point memory vk_x = vk.gammaABC[0];
        for (uint i = 0; i < input.length; i++)
            vk_x = Pairing.pointAdd(vk_x, Pairing.pointMul(vk.gammaABC[i + 1], input[i]));

        // Verify proof
        return Pairing.pairingProd4(
            proof.A, proof.B,
            vk_x.negate(), vk.gamma,
            proof.C.negate(), vk.delta,
            vk.alpha.negate(), vk.beta);
    }
}

library MiMC
{
    function getScalarField ()
        internal pure returns (uint256)
    {
        return 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;
    }

    /**
    * MiMC-p/p with exponent of 7
    * 
    * Recommended at least 46 rounds, for a polynomial degree of 2^126
    */
    function MiMCpe7( uint256 in_x, uint256 in_k, uint256 in_seed, uint256 round_count )
        internal pure returns(uint256 out_x)
    {
        assembly {
            if lt(round_count, 1) { revert(0, 0) }

            // Initialise round constants, k will be hashed
            let c := mload(0x40)
            mstore(0x40, add(c, 32))
            mstore(c, in_seed)

            let localQ := 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001
            let t
            let a

            // Further n-2 subsequent rounds include a round constant
            for { let i := round_count } gt(i, 0) { i := sub(i, 1) } {
                // c = H(c)
                mstore(c, keccak256(c, 32))

                // x = pow(x + c_i, 7, p) + k
                t := addmod(addmod(in_x, mload(c), localQ), in_k, localQ)              // t = x + c_i + k
                a := mulmod(t, t, localQ)                                              // t^2
                in_x := mulmod(mulmod(a, mulmod(a, a, localQ), localQ), t, localQ)     // t^7
            }

            // Result adds key again as blinding factor
            out_x := addmod(in_x, in_k, localQ)
        }
    }
       
    function MiMCpe7_mp( uint256[] memory in_x, uint256 in_k, uint256 in_seed, uint256 round_count )
        internal pure returns (uint256)
    {
        uint256 r = in_k;
        uint256 localQ = 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001;

        for( uint256 i = 0; i < in_x.length; i++ )
        {
            r = (r + in_x[i] + MiMCpe7(in_x[i], r, in_seed, round_count)) % localQ;
        }

        // uint256 x0 = in_x[0];
        // uint256 x1 = in_x[1];
        // uint256 m0 = MiMCpe7(x0, r, in_seed, round_count);
        // assembly {
        //     r := addmod(addmod(r, x0, localQ), m0, localQ)
        // }
        // uint256 m1 = MiMCpe7(x1, r, in_seed, round_count);
        // assembly {
        //     r := addmod(addmod(r, x1, localQ), m1, localQ)
        // }
        
        return r;
    }

    function Hash( uint256[] memory in_msgs, uint256 in_key )
        internal pure returns (uint256)
    {
        return MiMCpe7_mp(in_msgs, in_key, uint256(keccak256("mimc")), 91);
    }

    function Hash( uint256[] memory in_msgs )
        internal pure returns (uint256)
    {
        return Hash(in_msgs, 0);
    }
}

library MerkleTree
{
    // ceil(log2(1<<15))
    uint constant internal TREE_DEPTH = 15;


    // 1<<15 leaves
    uint constant internal MAX_LEAF_COUNT = 32768;


    struct Data
    {
        uint cur;
        uint256[32768][16] nodes; // first column = leaves, second column = leaves' parents, etc
    }

    function treeDepth() internal pure returns (uint256) {
        return TREE_DEPTH;
    }


    function fillLevelIVs (uint256[15] memory IVs)
        internal
        pure
    {
        IVs[0] = 149674538925118052205057075966660054952481571156186698930522557832224430770;
        IVs[1] = 9670701465464311903249220692483401938888498641874948577387207195814981706974;
        IVs[2] = 18318710344500308168304415114839554107298291987930233567781901093928276468271;
        IVs[3] = 6597209388525824933845812104623007130464197923269180086306970975123437805179;
        IVs[4] = 21720956803147356712695575768577036859892220417043839172295094119877855004262;
        IVs[5] = 10330261616520855230513677034606076056972336573153777401182178891807369896722;
        IVs[6] = 17466547730316258748333298168566143799241073466140136663575045164199607937939;
        IVs[7] = 18881017304615283094648494495339883533502299318365959655029893746755475886610;
        IVs[8] = 21580915712563378725413940003372103925756594604076607277692074507345076595494;
        IVs[9] = 12316305934357579015754723412431647910012873427291630993042374701002287130550;
        IVs[10] = 18905410889238873726515380969411495891004493295170115920825550288019118582494;
        IVs[11] = 12819107342879320352602391015489840916114959026915005817918724958237245903353;
        IVs[12] = 8245796392944118634696709403074300923517437202166861682117022548371601758802;
        IVs[13] = 16953062784314687781686527153155644849196472783922227794465158787843281909585;
        IVs[14] = 19346880451250915556764413197424554385509847473349107460608536657852472800734;
    }


    function hashImpl (uint256 left, uint256 right, uint256 IV)
        internal
        pure
        returns (uint256)
    {
        uint256[] memory x = new uint256[](2);
        x[0] = left;
        x[1] = right;

        return MiMC.Hash(x, IV);
    }


    function insert(Data storage self, uint256 leaf)
        internal
        returns (uint256 new_root, uint256 offset)
    {
        require(leaf != 0);


        uint256[15] memory IVs;
        fillLevelIVs(IVs);

        offset = self.cur;

        require(offset != MAX_LEAF_COUNT - 1);

        self.nodes[0][offset] = leaf;

        new_root = updateTree(self, IVs);

        self.cur = offset + 1;
    }


    /**
    * Returns calculated merkle root
    */
    function verifyPath(uint256 leaf, uint256[15] memory in_path, bool[15] memory address_bits)
        internal 
        pure 
        returns (uint256 merkleRoot)
    {
        uint256[15] memory IVs;
        fillLevelIVs(IVs);

        merkleRoot = leaf;

        for (uint depth = 0; depth < TREE_DEPTH; depth++) {
            if (address_bits[depth]) {
                merkleRoot = hashImpl(in_path[depth], merkleRoot, IVs[depth]);
            } else {
                merkleRoot = hashImpl(merkleRoot, in_path[depth], IVs[depth]);
            }
        }
    }


    function verifyPath(Data storage self, uint256 leaf, uint256[15] memory in_path, bool[15] memory address_bits)
        internal 
        view 
        returns (bool)
    {
        return verifyPath(leaf, in_path, address_bits) == getRoot(self);
    }


    function getLeaf(Data storage self, uint depth, uint offset)
        internal
        view
        returns (uint256)
    {
        return getUniqueLeaf(depth, offset, self.nodes[depth][offset]);
    }


    function getMerkleProof(Data storage self, uint index)
        internal
        view
        returns (uint256[15] memory proof_path)
    {
        for (uint depth = 0; depth < TREE_DEPTH; depth++)
        {
            if (index % 2 == 0) {
                proof_path[depth] = getLeaf(self, depth, index + 1);
            } else {
                proof_path[depth] = getLeaf(self, depth, index - 1);
            }
            index = uint(index / 2);
        }
    }


    function getUniqueLeaf(uint256 depth, uint256 offset, uint256 leaf)
        internal pure returns (uint256)
    {
        if (leaf == 0x0)
        {
            leaf = uint256(
                sha256(
                    abi.encodePacked(
                        uint16(depth),
                        uint240(offset)))) % MiMC.getScalarField();
        }

        return leaf;
    }


    function updateTree(Data storage self, uint256[15] memory IVs)
        internal returns(uint256 root)
    {
        uint currentIndex = self.cur;
        uint256 leaf1;
        uint256 leaf2;

        for (uint depth = 0; depth < TREE_DEPTH; depth++)
        {

            if (currentIndex%2 == 0)
            {
                leaf1 = self.nodes[depth][currentIndex];

                leaf2 = getUniqueLeaf(depth, currentIndex + 1, self.nodes[depth][currentIndex + 1]);
            } else
            {
                leaf1 = getUniqueLeaf(depth, currentIndex - 1, self.nodes[depth][currentIndex - 1]);

                leaf2 = self.nodes[depth][currentIndex];
            }

            uint nextIndex = uint(currentIndex/2);

            self.nodes[depth+1][nextIndex] = hashImpl(leaf1, leaf2, IVs[depth]);

            currentIndex = nextIndex;
        }

        return self.nodes[TREE_DEPTH][0];
    }


    function getRoot (Data storage self)
        internal
        view
        returns (uint256)
    {
        return self.nodes[TREE_DEPTH][0];
    }

    function getNextLeafIndex (Data storage self)
        internal
        view
        returns (uint256)
    {
        return self.cur;
    }
}


contract Mixer
{
    using MerkleTree for MerkleTree.Data;

    uint constant public AMOUNT = 1 ether;

    uint256[14] vk;
    uint256[] gammaABC;

    mapping (uint256 => bool) public nullifiers;
    mapping (address => uint256[]) public pendingDeposits;

    MerkleTree.Data internal tree;

    event CommitmentAdded(address indexed _fundingWallet, uint256 _leaf);
    event LeafAdded(uint256 _leaf, uint256 _leafIndex);
    event DepositWithdrawn(uint256 _nullifier);

    constructor(uint256[14] memory in_vk, uint256[] memory in_gammaABC)
        public
    {
        vk = in_vk;
        gammaABC = in_gammaABC;
    }

    function getRoot()
        public
        view
        returns (uint256)
    {
        return tree.getRoot();
    }

    /**
    * Save a commitment (leaf) that needs to be funded later on
    */
    function commit(uint256 leaf, address fundingWallet)
        public
        payable
    {
        require(leaf > 0, "null leaf");
        pendingDeposits[fundingWallet].push(leaf);
        emit CommitmentAdded(fundingWallet, leaf);
        if (msg.value > 0) fundCommitment();
    }

    function fundCommitment() private {
        require(msg.value == AMOUNT, "wrong value");
        uint256[] storage leaves = pendingDeposits[msg.sender];
        require(leaves.length > 0, "commitment must be sent first");
        uint256 leaf = leaves[leaves.length - 1];
        leaves.length--;
        (, uint256 leafIndex) = tree.insert(leaf);
        emit LeafAdded(leaf, leafIndex);
    }

    /*
    * Used by the funding wallet to fund a previously saved commitment
    */
    function () external payable {
        fundCommitment();
    }

    // should not be used in production otherwise nullifier_secret would be shared with node!
    function makeLeafHash(uint256 nullifier_secret, address wallet_address)
        external
        pure
        returns (uint256)
    {
        // return MiMC.Hash([nullifier_secret, uint256(wallet_address)], 0);
        bytes32 digest = sha256(abi.encodePacked(nullifier_secret, uint256(wallet_address)));
        uint256 mask = uint256(-1) >> 4; // clear the first 4 bits to make sure we stay within the prime field
        return uint256(digest) & mask;
    }

    // should not be used in production otherwise nullifier_secret would be shared with node!
    function makeNullifierHash(uint256 nullifier_secret)
        external
        pure
        returns (uint256)
    {
        uint256[] memory vals = new uint256[](2);
        vals[0] = nullifier_secret;
        vals[1] = nullifier_secret;
        return MiMC.Hash(vals, 0);
    }

    function getMerklePath(uint256 leafIndex)
        external
        view
        returns (uint256[15] memory out_path)
    {
        out_path = tree.getMerkleProof(leafIndex);
    }

    function isSpent(uint256 nullifier)
        public
        view
        returns (bool)
    {
        return nullifiers[nullifier];
    }

    function verifyProof(uint256 in_root, address in_wallet_address, uint256 in_nullifier, uint256[8] memory proof)
        public
        view
        returns (bool)
    {
        uint256[] memory snark_input = new uint256[](3);
        snark_input[0] = in_root;
        snark_input[1] = uint256(in_wallet_address);
        snark_input[2] = in_nullifier;

        return Verifier.verify(vk, gammaABC, proof, snark_input);
    }

    function withdraw(
        address payable in_withdraw_address,
        uint256 in_nullifier,
        uint256[8] memory proof
    )
        public
    {
        uint startGas = gasleft();
        require(!nullifiers[in_nullifier], "Nullifier used");
        require(verifyProof(getRoot(), in_withdraw_address, in_nullifier, proof), "Proof verification failed");

        nullifiers[in_nullifier] = true;
        emit DepositWithdrawn(in_nullifier);

        uint gasUsed = startGas - gasleft() + 57700;
        uint relayerRefund = gasUsed * tx.gasprice;
        if(relayerRefund > AMOUNT/20) relayerRefund = AMOUNT/20;
        in_withdraw_address.transfer(AMOUNT - relayerRefund); // leaf withdrawal
        msg.sender.transfer(relayerRefund); // relayer refund
    }

    function treeDepth() external pure returns (uint256) {
        return MerkleTree.treeDepth();
    }

    function getNextLeafIndex() external view returns (uint256) {
        return tree.getNextLeafIndex();
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"nullifier_secret","type":"uint256"},{"name":"wallet_address","type":"address"}],"name":"makeLeafHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"leaf","type":"uint256"},{"name":"fundingWallet","type":"address"}],"name":"commit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"treeDepth","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"in_withdraw_address","type":"address"},{"name":"in_nullifier","type":"uint256"},{"name":"proof","type":"uint256[8]"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getNextLeafIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"nullifier","type":"uint256"}],"name":"isSpent","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getRoot","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"leafIndex","type":"uint256"}],"name":"getMerklePath","outputs":[{"name":"out_path","type":"uint256[15]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"in_root","type":"uint256"},{"name":"in_wallet_address","type":"address"},{"name":"in_nullifier","type":"uint256"},{"name":"proof","type":"uint256[8]"}],"name":"verifyProof","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"pendingDeposits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"nullifier_secret","type":"uint256"}],"name":"makeNullifierHash","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"AMOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"nullifiers","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"in_vk","type":"uint256[14]"},{"name":"in_gammaABC","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_fundingWallet","type":"address"},{"indexed":false,"name":"_leaf","type":"uint256"}],"name":"CommitmentAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_leaf","type":"uint256"},{"indexed":false,"name":"_leafIndex","type":"uint256"}],"name":"LeafAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_nullifier","type":"uint256"}],"name":"DepositWithdrawn","type":"event"}]

60806040523480156200001157600080fd5b506040516200175d3803806200175d83398101806040526101e08110156200003857600080fd5b810190809190826101c00180516401000000008111156200005857600080fd5b820160208101848111156200006c57600080fd5b81518560208202830111640100000000821117156200008a57600080fd5b50909350620000a3925060009150849050600e620000c2565b508051620000b990600e90602084019062000105565b50505062000162565b82600e8101928215620000f3579160200282015b82811115620000f3578251825591602001919060010190620000d6565b506200010192915062000142565b5090565b828054828255906000526020600020908101928215620000f35791602002820182811115620000f3578251825591602001919060010190620000d6565b6200015f91905b8082111562000101576000815560010162000149565b90565b6115eb80620001726000396000f3fe6080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303c5c65e81146100ce5780630d64b0711461011957806316a56c411461014557806322a6fef11461015a57806350e9b925146101cd5780635a129efe146101e25780635ca1e165146102205780636e4d65171461023557806374b9886e146102985780638f9ae0b914610311578063c938f0181461034a578063d178917614610374578063d21e82ab14610389575b6100cc6103b3565b005b3480156100da57600080fd5b50610107600480360360408110156100f157600080fd5b5080359060200135600160a060020a0316610503565b60408051918252519081900360200190f35b6100cc6004803603604081101561012f57600080fd5b5080359060200135600160a060020a03166105e8565b34801561015157600080fd5b506101076106b6565b34801561016657600080fd5b506100cc600480360361014081101561017e57600080fd5b604080516101008181018352600160a060020a03853516946020810135948101939092610140840192909184019060089083908390808284376000920191909152509194506106c69350505050565b3480156101d957600080fd5b50610107610888565b3480156101ee57600080fd5b5061020c6004803603602081101561020557600080fd5b5035610894565b604080519115158252519081900360200190f35b34801561022c57600080fd5b506101076108a9565b34801561024157600080fd5b5061025f6004803603602081101561025857600080fd5b50356108b5565b60405180826101e080838360005b8381101561028557818101518382015260200161026d565b5050505090500191505060405180910390f35b3480156102a457600080fd5b5061020c60048036036101608110156102bc57600080fd5b604080516101008181018352843594600160a060020a03602082013516949381013593810192909161016083019190606084019060089083908390808284376000920191909152509194506108d49350505050565b34801561031d57600080fd5b506101076004803603604081101561033457600080fd5b50600160a060020a0381351690602001356109e8565b34801561035657600080fd5b506101076004803603602081101561036d57600080fd5b5035610a18565b34801561038057600080fd5b50610107610a85565b34801561039557600080fd5b5061020c600480360360208110156103ac57600080fd5b5035610a91565b34670de0b6b3a764000014610412576040805160e560020a62461bcd02815260206004820152600b60248201527f77726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000908152601060205260408120805490911061047a576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6d6d69746d656e74206d7573742062652073656e74206669727374000000604482015290519081900360640190fd5b80546000908290600019810190811061048f57fe5b60009182526020909120015482549091506104ae8360001983016114db565b5060006104c260118363ffffffff610aa616565b604080518581526020810183905281519294507f039fe56c88c7423b368b110113d8483a6b9ee8fc3d8155d1ea6266f8ed3ef19593508290030190a1505050565b60008060028484600160a060020a031660405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106105685780518252601f199092019160209182019101610549565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156105a7573d6000803e3d6000fd5b5050506040513d60208110156105bc57600080fd5b50517f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16949350505050565b60008211610640576040805160e560020a62461bcd02815260206004820152600960248201527f6e756c6c206c6561660000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152601060209081526040808320805460018101825590845292829020909201859055815185815291517f765b674bff93b21bfb5ffcffac5d739861ed3aea348696049536c96d10e7b37e9281900390910190a260003411156106b2576106b26103b3565b5050565b60006106c0610b05565b90505b90565b60005a6000848152600f602052604090205490915060ff1615610733576040805160e560020a62461bcd02815260206004820152600e60248201527f4e756c6c69666965722075736564000000000000000000000000000000000000604482015290519081900360640190fd5b61074661073e6108a9565b8585856108d4565b151561079c576040805160e560020a62461bcd02815260206004820152601960248201527f50726f6f6620766572696669636174696f6e206661696c656400000000000000604482015290519081900360640190fd5b6000838152600f6020908152604091829020805460ff19166001179055815185815291517f0788d719d36264cd922e6e2bb8f52f65b13571d1ea3ddaf8d27b1acfdd18c3d09281900390910190a160005a820361e1640190503a810266b1a2bc2ec50000811115610811575066b1a2bc2ec500005b604051600160a060020a03871690670de0b6b3a764000083900380156108fc02916000818181858888f19350505050158015610851573d6000803e3d6000fd5b50604051339082156108fc029083906000818181858888f1935050505015801561087f573d6000803e3d6000fd5b50505050505050565b60006106c06011610b0a565b6000908152600f602052604090205460ff1690565b60006106c06011610b0e565b6108bd611504565b6108ce60118363ffffffff610b1716565b92915050565b60408051600380825260808201909252600091606091906020820183803883390190505090508581600081518110151561090a57fe5b602090810290910101528051600160a060020a038616908290600190811061092e57fe5b60209081029091010152805184908290600290811061094957fe5b6020908102919091010152604080516101c08101918290526109de91600090600e9082845b81548152602001906001019080831161096e575050505050600e8054806020026020016040519081016040528092919081815260200182805480156109d257602002820191906000526020600020905b8154815260200190600101908083116109be575b50505050508584610b8e565b9695505050505050565b601060205281600052604060002081815481101515610a0357fe5b90600052602060002001600091509150505481565b604080516002808252606080830184526000939092919060208301908038833901905050905082816000815181101515610a4e57fe5b602090810290910101528051839082906001908110610a6957fe5b60209081029091010152610a7e816000610e07565b9392505050565b670de0b6b3a764000081565b600f6020526000908152604090205460ff1681565b600080821515610ab557600080fd5b610abd611504565b610ac681610e4b565b84549150617fff821415610ad957600080fd5b8360018601836180008110610aea57fe5b0155610af6858261108b565b60018301909555509293915050565b600f90565b5490565b62078001015490565b610b1f611504565b60005b600f811015610b8757600283061515610b5957610b438482856001016111c1565b8282600f8110610b4f57fe5b6020020152610b79565b610b678482600186036111c1565b8282600f8110610b7357fe5b60200201525b600283049250600101610b22565b5092915050565b60008151600160028651811515610ba157fe5b040314610bad57600080fd5b610bb5611524565b610bbd611543565b8551600090600290889083908110610bd157fe5b60209081029190910101518352875188906001908110610bed57fe5b60209081029091010151836001602002015260005b8651811015610caf57885160018301928a918110610c1c57fe5b60209081029190910101518552885160018301928a918110610c3a57fe5b6020908102909101015185600160200201528651879082908110610c5a57fe5b60209081029091010151856002602002015260606040850160808760076107d05a03fa9250821515610c8b57600080fd5b60608460c08660066107d05a03fa9250821515610ca757600080fd5b600101610c02565b50610cb8611562565b6040805161030081018252895181526020808b01519082015289820151918101919091526060808a0151908201526080808a01519082015260a0808a0151908201528a5160c082015260e08101610d168c60015b60200201516111f2565b81526040808d015160208301526060808e0151918301919091526080808e01519183019190915260a0808e01519183019190915286519082015260c001610d5e866001610d0c565b815260c0808d0151602083015260e08d015160408301526101008d015160608301526101208d015160808301528a81015160a083015201610da08a6007610d0c565b81526101408c015160208201526101608c015160408201526101808c015160608201526101a08c01516080909101529050610dd9611582565b6020816103008460086107d05a03fa9350831515610df657600080fd5b5115159a9950505050505050505050565b604080517f6d696d630000000000000000000000000000000000000000000000000000000081529051908190036004019020600090610a7e9084908490605b61121c565b7e54b679342dc72db7dada5f1e059c89cdd0e248dfd48b93fbd819469fdddab281527f15616c4d9255be862e74568bec02555a2ec44aca0c35b6654b492d764dbaa4de60208201527f288005cad3274b9dbabda48cabd68247fd9dbfeaaf44befae372d3aa29a2222f60408201527f0e95e36069b5a4ec39d0d317ae9b3659cb7259fa6977fd4d81fae34d91885e7b60608201527f3005a039bb02066ec8f3bbce1259cfbc68c84bc5adbf353a3338c6ef1495c66660808201527f16d6b88b43188dae6501f224a9fa48d14fc1c67ce846dabfb24a94a6f23aa31260a08201527f269db736b9c3dcb23f263ed57476a620dd607eb4f08c82bc5a40baf11c2e2b9360c08201527f29be46ef2cd66613f7bece37644ec4e5cd57ae30c3c1028312fa3a1d5000521260e08201527f2fb65d8cfc2d7b52e0dd83a719f7ee81cedd92f748bdfebeddcda7ec18e2ab266101008201527f1b3ac839413221cfb6955b7822ef98fa4dfb42b0221044ace6c6272a3956a7b66101208201527f29cc155784315664174105985ee453015a0a8c5d2dd4593a8300463b52fb6ade6101408201527f1c575b8e067a3b91febbe1dda3737835804245e9858c47ae26fff4189a4111f96101608201527f123af492faf15272031d5e6625172effdfdcf365098567bdcba69d4be38a1a526101808201527f257b17ef869450bf306b6cea7449d42b6838fea192f60eefbf5927765d5bf7516101a08201527f2ac5f23fa9f80eb16660ed46597a663beae42cb4e0fe52f1b6eec9439e90b5de6101c090910152565b81546000908180805b600f8110156111af57600284061515611108576001870181601081106110b657fe5b618000020184618000811015156110c957fe5b01549250611101816001808701908a0182601081106110e457fe5b618000020187600101618000811015156110fa57fe5b01546112aa565b915061115f565b61113681600019860160018a01826010811061112057fe5b618000020160018803618000811015156110fa57fe5b925060018701816010811061114757fe5b6180000201846180008110151561115a57fe5b015491505b6002840461117e84848985600f811061117457fe5b60200201516113c0565b6001808a019084016010811061119057fe5b618000020182618000811015156111a357fe5b01559350600101611094565b50505062078001909301549392505050565b60006111ea83836001870182601081106111d757fe5b618000020185618000811015156110fa57fe5b949350505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790819006900390565b6000837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001825b875181101561129e578161126f898381518110151561125d57fe5b9060200190602002015185898961142e565b898381518110151561127d57fe5b9060200190602002015185010181151561129357fe5b069250600101611242565b50909695505050505050565b6000811515610b87576112bb6114b7565b604080517e0100000000000000000000000000000000000000000000000000000000000061ffff881602602080830191909152620100007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8816026022830152825180830382018152918301928390528151600293918291908401908083835b602083106113585780518252601f199092019160209182019101611339565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611397573d6000803e3d6000fd5b5050506040513d60208110156113ac57600080fd5b50518115156113b757fe5b06949350505050565b6040805160028082526060808301845260009390929190602083019080388339019050509050848160008151811015156113f657fe5b60209081029091010152805184908290600190811061141157fe5b602090810290910101526114258184610e07565b95945050505050565b6000600182101561143e57600080fd5b604051602081016040528381527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600080855b60008111156114a55760208520855283898587518d0808925083838409915083838586858609850909995060001901611471565b5082888a089998505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190565b8154818355818111156114ff576000838152602090206114ff9181019083016115a1565b505050565b6101e060405190810160405280600f906020820280388339509192915050565b6060604051908101604052806003906020820280388339509192915050565b6080604051908101604052806004906020820280388339509192915050565b610300604051908101604052806018906020820280388339509192915050565b6020604051908101604052806001906020820280388339509192915050565b6106c391905b808211156115bb57600081556001016115a7565b509056fea165627a7a723058204f2a38374263fce14b7ad46814cad390067baeff247c4532a66f2d95b0f5c9f10029159f09e91e1ef10716da832c2d1244a6472e5da5a16ad386894dbe2bf5e66fec24fe496b77d02691c6e9592295c8aca481ba65b4f3061e767c254fe48e0951f82927d9177c5f20b43a72cf824b712bb3ee9f43c1f9815d31ec280e6cc95b3bca1dab0af360ff7414d757502c970fb70953057101d88828dc64e98b0998dcc660259411351840195377656f5392809d61b2e5318c636009ea530a2598bab898880b20a00eadfd12032c1af8ea43ea6593f2dfd2a509fdd3bc8a983eda2fec83022aa8e49aa482324da11609f2fa212d616a80ce2c8af22e87cb4fb9b0d331a7e004e3850e0ecaeec849ebc3f5499d6cd171299699df65b8bbc4bdd2045186d150239dfeed57a34365a80027c6ba1eb42743e450da6b4bc31d7e879beed4c949ed0f00ea653b521ae74f70d846040edb377d291685031fa205c51aedc8e193f3501924cd68d520558ba67cf9b86b2d4a5b21e6c892eaa59998a15d00b52c78984f02db76679bb73ed126873b7a7e739cd73aeb8970748d78f26a5b516c23e5b75121ab18375d80412a2ff151c8be043b3af5f4fd159fae0d23bf0c07ed3e0e9abf2793ccd39e182a4ceee75740532176ccd7c364325d53f3c14122da61f8aabb8300000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000082c749d9058c25a81e28ce047d579fc9e004d6415e40c0f5207fcb9de38f95caa2b62e5faefb05eb9564cd1c2ddf7306941ba819b5716fc5d05665797d45b5ad4023631e41379aaf53c3df142b6630c2f9fdc01dc9bd8546bc887f3bc20cbc57f112bbdb56a948879015e519acc228435bf1bbc4da3c0ac7510daa75ea0ee402d1f62aa8d372dfd8e9e885c4cea65b01a5ca32c64c8ae4f4494c75dc35dc3780d0415d651a0b5ed8d1ed04e98c4c79635ed9ea843ce9e125a48ddb52542bb51281a022ccc8171193602067a83d0724e6a155a75a7767be2015199894c3fa4a62c0f76799f652b8c82725f6cb989d6e04eb01b2ca175770fbaa233744e7c8e8e66

Deployed Bytecode

0x6080604052600436106100c45763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166303c5c65e81146100ce5780630d64b0711461011957806316a56c411461014557806322a6fef11461015a57806350e9b925146101cd5780635a129efe146101e25780635ca1e165146102205780636e4d65171461023557806374b9886e146102985780638f9ae0b914610311578063c938f0181461034a578063d178917614610374578063d21e82ab14610389575b6100cc6103b3565b005b3480156100da57600080fd5b50610107600480360360408110156100f157600080fd5b5080359060200135600160a060020a0316610503565b60408051918252519081900360200190f35b6100cc6004803603604081101561012f57600080fd5b5080359060200135600160a060020a03166105e8565b34801561015157600080fd5b506101076106b6565b34801561016657600080fd5b506100cc600480360361014081101561017e57600080fd5b604080516101008181018352600160a060020a03853516946020810135948101939092610140840192909184019060089083908390808284376000920191909152509194506106c69350505050565b3480156101d957600080fd5b50610107610888565b3480156101ee57600080fd5b5061020c6004803603602081101561020557600080fd5b5035610894565b604080519115158252519081900360200190f35b34801561022c57600080fd5b506101076108a9565b34801561024157600080fd5b5061025f6004803603602081101561025857600080fd5b50356108b5565b60405180826101e080838360005b8381101561028557818101518382015260200161026d565b5050505090500191505060405180910390f35b3480156102a457600080fd5b5061020c60048036036101608110156102bc57600080fd5b604080516101008181018352843594600160a060020a03602082013516949381013593810192909161016083019190606084019060089083908390808284376000920191909152509194506108d49350505050565b34801561031d57600080fd5b506101076004803603604081101561033457600080fd5b50600160a060020a0381351690602001356109e8565b34801561035657600080fd5b506101076004803603602081101561036d57600080fd5b5035610a18565b34801561038057600080fd5b50610107610a85565b34801561039557600080fd5b5061020c600480360360208110156103ac57600080fd5b5035610a91565b34670de0b6b3a764000014610412576040805160e560020a62461bcd02815260206004820152600b60248201527f77726f6e672076616c7565000000000000000000000000000000000000000000604482015290519081900360640190fd5b336000908152601060205260408120805490911061047a576040805160e560020a62461bcd02815260206004820152601d60248201527f636f6d6d69746d656e74206d7573742062652073656e74206669727374000000604482015290519081900360640190fd5b80546000908290600019810190811061048f57fe5b60009182526020909120015482549091506104ae8360001983016114db565b5060006104c260118363ffffffff610aa616565b604080518581526020810183905281519294507f039fe56c88c7423b368b110113d8483a6b9ee8fc3d8155d1ea6266f8ed3ef19593508290030190a1505050565b60008060028484600160a060020a031660405160200180838152602001828152602001925050506040516020818303038152906040526040518082805190602001908083835b602083106105685780518252601f199092019160209182019101610549565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa1580156105a7573d6000803e3d6000fd5b5050506040513d60208110156105bc57600080fd5b50517f0fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff16949350505050565b60008211610640576040805160e560020a62461bcd02815260206004820152600960248201527f6e756c6c206c6561660000000000000000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a0381166000818152601060209081526040808320805460018101825590845292829020909201859055815185815291517f765b674bff93b21bfb5ffcffac5d739861ed3aea348696049536c96d10e7b37e9281900390910190a260003411156106b2576106b26103b3565b5050565b60006106c0610b05565b90505b90565b60005a6000848152600f602052604090205490915060ff1615610733576040805160e560020a62461bcd02815260206004820152600e60248201527f4e756c6c69666965722075736564000000000000000000000000000000000000604482015290519081900360640190fd5b61074661073e6108a9565b8585856108d4565b151561079c576040805160e560020a62461bcd02815260206004820152601960248201527f50726f6f6620766572696669636174696f6e206661696c656400000000000000604482015290519081900360640190fd5b6000838152600f6020908152604091829020805460ff19166001179055815185815291517f0788d719d36264cd922e6e2bb8f52f65b13571d1ea3ddaf8d27b1acfdd18c3d09281900390910190a160005a820361e1640190503a810266b1a2bc2ec50000811115610811575066b1a2bc2ec500005b604051600160a060020a03871690670de0b6b3a764000083900380156108fc02916000818181858888f19350505050158015610851573d6000803e3d6000fd5b50604051339082156108fc029083906000818181858888f1935050505015801561087f573d6000803e3d6000fd5b50505050505050565b60006106c06011610b0a565b6000908152600f602052604090205460ff1690565b60006106c06011610b0e565b6108bd611504565b6108ce60118363ffffffff610b1716565b92915050565b60408051600380825260808201909252600091606091906020820183803883390190505090508581600081518110151561090a57fe5b602090810290910101528051600160a060020a038616908290600190811061092e57fe5b60209081029091010152805184908290600290811061094957fe5b6020908102919091010152604080516101c08101918290526109de91600090600e9082845b81548152602001906001019080831161096e575050505050600e8054806020026020016040519081016040528092919081815260200182805480156109d257602002820191906000526020600020905b8154815260200190600101908083116109be575b50505050508584610b8e565b9695505050505050565b601060205281600052604060002081815481101515610a0357fe5b90600052602060002001600091509150505481565b604080516002808252606080830184526000939092919060208301908038833901905050905082816000815181101515610a4e57fe5b602090810290910101528051839082906001908110610a6957fe5b60209081029091010152610a7e816000610e07565b9392505050565b670de0b6b3a764000081565b600f6020526000908152604090205460ff1681565b600080821515610ab557600080fd5b610abd611504565b610ac681610e4b565b84549150617fff821415610ad957600080fd5b8360018601836180008110610aea57fe5b0155610af6858261108b565b60018301909555509293915050565b600f90565b5490565b62078001015490565b610b1f611504565b60005b600f811015610b8757600283061515610b5957610b438482856001016111c1565b8282600f8110610b4f57fe5b6020020152610b79565b610b678482600186036111c1565b8282600f8110610b7357fe5b60200201525b600283049250600101610b22565b5092915050565b60008151600160028651811515610ba157fe5b040314610bad57600080fd5b610bb5611524565b610bbd611543565b8551600090600290889083908110610bd157fe5b60209081029190910101518352875188906001908110610bed57fe5b60209081029091010151836001602002015260005b8651811015610caf57885160018301928a918110610c1c57fe5b60209081029190910101518552885160018301928a918110610c3a57fe5b6020908102909101015185600160200201528651879082908110610c5a57fe5b60209081029091010151856002602002015260606040850160808760076107d05a03fa9250821515610c8b57600080fd5b60608460c08660066107d05a03fa9250821515610ca757600080fd5b600101610c02565b50610cb8611562565b6040805161030081018252895181526020808b01519082015289820151918101919091526060808a0151908201526080808a01519082015260a0808a0151908201528a5160c082015260e08101610d168c60015b60200201516111f2565b81526040808d015160208301526060808e0151918301919091526080808e01519183019190915260a0808e01519183019190915286519082015260c001610d5e866001610d0c565b815260c0808d0151602083015260e08d015160408301526101008d015160608301526101208d015160808301528a81015160a083015201610da08a6007610d0c565b81526101408c015160208201526101608c015160408201526101808c015160608201526101a08c01516080909101529050610dd9611582565b6020816103008460086107d05a03fa9350831515610df657600080fd5b5115159a9950505050505050505050565b604080517f6d696d630000000000000000000000000000000000000000000000000000000081529051908190036004019020600090610a7e9084908490605b61121c565b7e54b679342dc72db7dada5f1e059c89cdd0e248dfd48b93fbd819469fdddab281527f15616c4d9255be862e74568bec02555a2ec44aca0c35b6654b492d764dbaa4de60208201527f288005cad3274b9dbabda48cabd68247fd9dbfeaaf44befae372d3aa29a2222f60408201527f0e95e36069b5a4ec39d0d317ae9b3659cb7259fa6977fd4d81fae34d91885e7b60608201527f3005a039bb02066ec8f3bbce1259cfbc68c84bc5adbf353a3338c6ef1495c66660808201527f16d6b88b43188dae6501f224a9fa48d14fc1c67ce846dabfb24a94a6f23aa31260a08201527f269db736b9c3dcb23f263ed57476a620dd607eb4f08c82bc5a40baf11c2e2b9360c08201527f29be46ef2cd66613f7bece37644ec4e5cd57ae30c3c1028312fa3a1d5000521260e08201527f2fb65d8cfc2d7b52e0dd83a719f7ee81cedd92f748bdfebeddcda7ec18e2ab266101008201527f1b3ac839413221cfb6955b7822ef98fa4dfb42b0221044ace6c6272a3956a7b66101208201527f29cc155784315664174105985ee453015a0a8c5d2dd4593a8300463b52fb6ade6101408201527f1c575b8e067a3b91febbe1dda3737835804245e9858c47ae26fff4189a4111f96101608201527f123af492faf15272031d5e6625172effdfdcf365098567bdcba69d4be38a1a526101808201527f257b17ef869450bf306b6cea7449d42b6838fea192f60eefbf5927765d5bf7516101a08201527f2ac5f23fa9f80eb16660ed46597a663beae42cb4e0fe52f1b6eec9439e90b5de6101c090910152565b81546000908180805b600f8110156111af57600284061515611108576001870181601081106110b657fe5b618000020184618000811015156110c957fe5b01549250611101816001808701908a0182601081106110e457fe5b618000020187600101618000811015156110fa57fe5b01546112aa565b915061115f565b61113681600019860160018a01826010811061112057fe5b618000020160018803618000811015156110fa57fe5b925060018701816010811061114757fe5b6180000201846180008110151561115a57fe5b015491505b6002840461117e84848985600f811061117457fe5b60200201516113c0565b6001808a019084016010811061119057fe5b618000020182618000811015156111a357fe5b01559350600101611094565b50505062078001909301549392505050565b60006111ea83836001870182601081106111d757fe5b618000020185618000811015156110fa57fe5b949350505050565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4790819006900390565b6000837f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001825b875181101561129e578161126f898381518110151561125d57fe5b9060200190602002015185898961142e565b898381518110151561127d57fe5b9060200190602002015185010181151561129357fe5b069250600101611242565b50909695505050505050565b6000811515610b87576112bb6114b7565b604080517e0100000000000000000000000000000000000000000000000000000000000061ffff881602602080830191909152620100007dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8816026022830152825180830382018152918301928390528151600293918291908401908083835b602083106113585780518252601f199092019160209182019101611339565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015611397573d6000803e3d6000fd5b5050506040513d60208110156113ac57600080fd5b50518115156113b757fe5b06949350505050565b6040805160028082526060808301845260009390929190602083019080388339019050509050848160008151811015156113f657fe5b60209081029091010152805184908290600190811061141157fe5b602090810290910101526114258184610e07565b95945050505050565b6000600182101561143e57600080fd5b604051602081016040528381527f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001600080855b60008111156114a55760208520855283898587518d0808925083838409915083838586858609850909995060001901611471565b5082888a089998505050505050505050565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000190565b8154818355818111156114ff576000838152602090206114ff9181019083016115a1565b505050565b6101e060405190810160405280600f906020820280388339509192915050565b6060604051908101604052806003906020820280388339509192915050565b6080604051908101604052806004906020820280388339509192915050565b610300604051908101604052806018906020820280388339509192915050565b6020604051908101604052806001906020820280388339509192915050565b6106c391905b808211156115bb57600081556001016115a7565b509056fea165627a7a723058204f2a38374263fce14b7ad46814cad390067baeff247c4532a66f2d95b0f5c9f10029

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

159f09e91e1ef10716da832c2d1244a6472e5da5a16ad386894dbe2bf5e66fec24fe496b77d02691c6e9592295c8aca481ba65b4f3061e767c254fe48e0951f82927d9177c5f20b43a72cf824b712bb3ee9f43c1f9815d31ec280e6cc95b3bca1dab0af360ff7414d757502c970fb70953057101d88828dc64e98b0998dcc660259411351840195377656f5392809d61b2e5318c636009ea530a2598bab898880b20a00eadfd12032c1af8ea43ea6593f2dfd2a509fdd3bc8a983eda2fec83022aa8e49aa482324da11609f2fa212d616a80ce2c8af22e87cb4fb9b0d331a7e004e3850e0ecaeec849ebc3f5499d6cd171299699df65b8bbc4bdd2045186d150239dfeed57a34365a80027c6ba1eb42743e450da6b4bc31d7e879beed4c949ed0f00ea653b521ae74f70d846040edb377d291685031fa205c51aedc8e193f3501924cd68d520558ba67cf9b86b2d4a5b21e6c892eaa59998a15d00b52c78984f02db76679bb73ed126873b7a7e739cd73aeb8970748d78f26a5b516c23e5b75121ab18375d80412a2ff151c8be043b3af5f4fd159fae0d23bf0c07ed3e0e9abf2793ccd39e182a4ceee75740532176ccd7c364325d53f3c14122da61f8aabb8300000000000000000000000000000000000000000000000000000000000001e000000000000000000000000000000000000000000000000000000000000000082c749d9058c25a81e28ce047d579fc9e004d6415e40c0f5207fcb9de38f95caa2b62e5faefb05eb9564cd1c2ddf7306941ba819b5716fc5d05665797d45b5ad4023631e41379aaf53c3df142b6630c2f9fdc01dc9bd8546bc887f3bc20cbc57f112bbdb56a948879015e519acc228435bf1bbc4da3c0ac7510daa75ea0ee402d1f62aa8d372dfd8e9e885c4cea65b01a5ca32c64c8ae4f4494c75dc35dc3780d0415d651a0b5ed8d1ed04e98c4c79635ed9ea843ce9e125a48ddb52542bb51281a022ccc8171193602067a83d0724e6a155a75a7767be2015199894c3fa4a62c0f76799f652b8c82725f6cb989d6e04eb01b2ca175770fbaa233744e7c8e8e66

-----Decoded View---------------
Arg [0] : in_vk (uint256[14]): 9779566904105149176222081707057587976877058110298075309227008078975588528108,16732548428266699621670505691703954760949781790382216681520073257735865061880,18615232139574163262432978771997369174279565976173196337249075195079936392138,13419279035937404457774522130382971716238540254905519602867430346476496930400,16997187524286989819500266794706150023420062782897337922571191486861542987912,5033085115666711967676699713501686542502401552716797579326528088019118621442,19295547714703587434736856017336758218967383474782541337859610467588929333216,2211243989298989053393329993856424867963784724058427675290038339771136659792,16110104131893306839545480989604421512282684983348428876079210033659299580397,6786310466595959483958234494168229224109867784303690079469546386854325252944,11372845393194046622635497561488641057905672294738968804618615291245854496847,1292382403695214933109732466274980910525243101902159288088291573056697382737,15228621985881088190291325436492099660993471834725694821284490070760425953983,17901341274722586772097474915029604334818545076907245896896849803615884983171
Arg [1] : in_gammaABC (uint256[]): 20107807062934213936452898468731755910402832105493004484581538845724549668010,19624190766571010315982727046408852642629832405927111527083359819608780135124,1000379773154383151911734725442617403907848115591574013688642789790364452223,7766602170735095187965050009248767931658321733358137008223157674872323063853,14196026422472069586557649336427622727420682022007457756982464600723836598285,1847834357092112322598198517534026541343878108202463914113112699389026717992,11763976947594673391355221723036726623327804630459579272045838283069689472556,6994020090986783334330010883380435688721523071171184179621863974480229863014

-----Encoded View---------------
24 Constructor Arguments found :
Arg [0] : 159f09e91e1ef10716da832c2d1244a6472e5da5a16ad386894dbe2bf5e66fec
Arg [1] : 24fe496b77d02691c6e9592295c8aca481ba65b4f3061e767c254fe48e0951f8
Arg [2] : 2927d9177c5f20b43a72cf824b712bb3ee9f43c1f9815d31ec280e6cc95b3bca
Arg [3] : 1dab0af360ff7414d757502c970fb70953057101d88828dc64e98b0998dcc660
Arg [4] : 259411351840195377656f5392809d61b2e5318c636009ea530a2598bab89888
Arg [5] : 0b20a00eadfd12032c1af8ea43ea6593f2dfd2a509fdd3bc8a983eda2fec8302
Arg [6] : 2aa8e49aa482324da11609f2fa212d616a80ce2c8af22e87cb4fb9b0d331a7e0
Arg [7] : 04e3850e0ecaeec849ebc3f5499d6cd171299699df65b8bbc4bdd2045186d150
Arg [8] : 239dfeed57a34365a80027c6ba1eb42743e450da6b4bc31d7e879beed4c949ed
Arg [9] : 0f00ea653b521ae74f70d846040edb377d291685031fa205c51aedc8e193f350
Arg [10] : 1924cd68d520558ba67cf9b86b2d4a5b21e6c892eaa59998a15d00b52c78984f
Arg [11] : 02db76679bb73ed126873b7a7e739cd73aeb8970748d78f26a5b516c23e5b751
Arg [12] : 21ab18375d80412a2ff151c8be043b3af5f4fd159fae0d23bf0c07ed3e0e9abf
Arg [13] : 2793ccd39e182a4ceee75740532176ccd7c364325d53f3c14122da61f8aabb83
Arg [14] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [16] : 2c749d9058c25a81e28ce047d579fc9e004d6415e40c0f5207fcb9de38f95caa
Arg [17] : 2b62e5faefb05eb9564cd1c2ddf7306941ba819b5716fc5d05665797d45b5ad4
Arg [18] : 023631e41379aaf53c3df142b6630c2f9fdc01dc9bd8546bc887f3bc20cbc57f
Arg [19] : 112bbdb56a948879015e519acc228435bf1bbc4da3c0ac7510daa75ea0ee402d
Arg [20] : 1f62aa8d372dfd8e9e885c4cea65b01a5ca32c64c8ae4f4494c75dc35dc3780d
Arg [21] : 0415d651a0b5ed8d1ed04e98c4c79635ed9ea843ce9e125a48ddb52542bb5128
Arg [22] : 1a022ccc8171193602067a83d0724e6a155a75a7767be2015199894c3fa4a62c
Arg [23] : 0f76799f652b8c82725f6cb989d6e04eb01b2ca175770fbaa233744e7c8e8e66


Deployed Bytecode Sourcemap

19548:4497:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21249:16;:14;:16::i;:::-;19548:4497;21376:469;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21376:469:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21376:469:0;;;;;;-1:-1:-1;;;;;21376:469:0;;;;;;;;;;;;;;;;;;;20413:290;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20413:290:0;;;;;;-1:-1:-1;;;;;20413:290:0;;;23824:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23824:101:0;;;;23029:787;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23029:787:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;23029:787:0;;;;;;;;;-1:-1:-1;;;;;23029:787:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;23029:787:0;;-1:-1:-1;23029:787:0;;-1:-1:-1;;;;23029:787:0;23933:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23933:109:0;;;;22436:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22436:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22436:142:0;;;;;;;;;;;;;;;;;;;;;20202:121;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20202:121:0;;;;22242:186;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22242:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22242:186:0;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;22242:186:0;;;;;;;;;;;;;;;;22586:435;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22586:435:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;22586:435:0;;;;;;;;;;;;-1:-1:-1;;;;;22586:435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;22586:435:0;;-1:-1:-1;22586:435:0;;-1:-1:-1;;;;22586:435:0;19760:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19760:53:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19760:53:0;;;;;;;;;21948:286;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21948:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21948:286:0;;;19616:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19616:37:0;;;;19710:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19710:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19710:43:0;;;20711:402;20764:9;19646:7;20764:19;20756:43;;;;;-1:-1:-1;;;;;20756:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20853:10;20810:24;20837:27;;;:15;:27;;;;;20883:13;;20837:27;;-1:-1:-1;20875:59:0;;;;;-1:-1:-1;;;;;20875:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20967:13;;20945:12;;20960:6;;-1:-1:-1;;20967:17:0;;;20960:25;;;;;;;;;;;;;;;;20996:15;;20960:25;;-1:-1:-1;20996:15:0;:6;-1:-1:-1;;20996:15:0;;;:::i;:::-;-1:-1:-1;21025:17:0;21046;:4;21058;21046:17;:11;:17;:::i;:::-;21079:26;;;;;;;;;;;;;;21022:41;;-1:-1:-1;21079:26:0;;-1:-1:-1;21079:26:0;;;;;;20711:402;;;:::o;21376:469::-;21498:7;21601:14;21618:67;21642:16;21668:14;-1:-1:-1;;;;;21660:23:0;21625:59;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;21625:59:0;;;21618:67;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;21618:67:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;21618:67:0;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21618:67:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21618:67:0;25:41:-1;21815:22:0;;21376:469;-1:-1:-1;;;;21376:469:0:o;20413:290::-;20530:1;20523:8;;20515:30;;;;;-1:-1:-1;;;;;20515:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20556:30:0;;;;;;:15;:30;;;;;;;;27:10:-1;;39:1;23:18;;45:23;;20556:41:0;;;;;;;;;;;;;20613:36;;;;;;;;;;;;;;;;;20676:1;20664:9;:13;20660:35;;;20679:16;:14;:16::i;:::-;20413:290;;:::o;23824:101::-;23868:7;23895:22;:20;:22::i;:::-;23888:29;;23824:101;;:::o;23029:787::-;23197:13;23213:9;23242:24;;;;:10;:24;;;;;;23197:25;;-1:-1:-1;23242:24:0;;23241:25;23233:52;;;;;-1:-1:-1;;;;;23233:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23304:64;23316:9;:7;:9::i;:::-;23327:19;23348:12;23362:5;23304:11;:64::i;:::-;23296:102;;;;;;;-1:-1:-1;;;;;23296:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23411:24;;;;:10;:24;;;;;;;;;:31;;-1:-1:-1;;23411:31:0;23438:4;23411:31;;;23458:30;;;;;;;;;;;;;;;;;23501:12;23527:9;23516:20;;23539:5;23516:28;;-1:-1:-1;23586:11:0;23576:21;;23627:9;23611:25;;23608:55;;;-1:-1:-1;23654:9:0;23608:55;23674:52;;-1:-1:-1;;;;;23674:28:0;;;19646:7;23703:22;;;23674:52;;;;;;;;;23703:22;23674:28;:52;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;23756:34:0;;:10;;:34;;;;;23776:13;;23756:34;;;;23776:13;23756:10;:34;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23756:34:0;23029:787;;;;;;:::o;23933:109::-;23984:7;24011:23;:4;:21;:23::i;22436:142::-;22520:4;22549:21;;;:10;:21;;;;;;;;;22436:142::o;20202:121::-;20269:7;20301:14;:4;:12;:14::i;22242:186::-;22334:27;;:::i;:::-;22390:30;:4;22410:9;22390:30;:19;:30;:::i;:::-;22379:41;22242:186;-1:-1:-1;;22242:186:0:o;22586:435::-;22799:16;;;22813:1;22799:16;;;;;;;;;22746:4;;22768:28;;22799:16;;;;22768:28;;105:10:-1;22799:16:0;88:34:-1;136:17;;-1:-1;22799:16:0;22768:47;;22843:7;22826:11;22838:1;22826:14;;;;;;;;;;;;;;;;;;:24;22861:14;;-1:-1:-1;;;;;22878:26:0;;;22861:11;;22873:1;;22861:14;;;;;;;;;;;;;;:43;22915:14;;22932:12;;22915:11;;22927:1;;22915:14;;;;;;;;;;;;;;;:29;22964:49;;;;;;;;;;;;-1:-1:-1;;22964:49:0;;-1:-1:-1;22964:49:0;;;;;;;;;;;;;;;;;;;;;;22984:8;22964:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22994:5;23001:11;22964:15;:49::i;:::-;22957:56;22586:435;-1:-1:-1;;;;;;22586:435:0:o;19760:53::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21948:286::-;22100:16;;;22114:1;22100:16;;;22076:21;22100:16;;;;;22051:7;;22076:21;;22100:16;22114:1;22100:16;;;;;105:10:-1;22100:16:0;88:34:-1;136:17;;-1:-1;22100:16:0;22076:40;;22137:16;22127:4;22132:1;22127:7;;;;;;;;;;;;;;;;;;:26;22164:7;;22174:16;;22164:4;;22169:1;;22164:7;;;;;;;;;;;;;;:26;22208:18;22218:4;22224:1;22208:9;:18::i;:::-;22201:25;21948:286;-1:-1:-1;;;21948:286:0:o;19616:37::-;19646:7;19616:37;:::o;19710:43::-;;;;;;;;;;;;;;;:::o;15828:426::-;15913:16;;15971:9;;;15963:18;;;;;;15996:22;;:::i;:::-;16029:17;16042:3;16029:12;:17::i;:::-;16068:8;;;-1:-1:-1;16107:18:0;16097:28;;;16089:37;;;;;;16163:4;16139:10;;;16153:6;16139:13;:21;;;;;;;:28;16191:21;16202:4;16208:3;16191:10;:21::i;:::-;16245:1;16236:10;;16225:21;;;-1:-1:-1;16180:32:0;;15828:426;-1:-1:-1;;15828:426:0:o;13901:89::-;13661:2;13901:89;:::o;19395:144::-;19523:8;;19395:144::o;19235:152::-;19354:22;;:25;;19235:152::o;17390:480::-;17495:29;;:::i;:::-;17547:10;17542:321;13661:2;17563:5;:18;17542:321;;;17628:1;17620:5;:9;:14;17616:198;;;17675:31;17683:4;17689:5;17696;17704:1;17696:9;17675:7;:31::i;:::-;17655:10;17666:5;17655:17;;;;;;;;;;:51;17616:198;;;17767:31;17775:4;17781:5;17796:1;17788:5;:9;17767:7;:31::i;:::-;17747:10;17758:5;17747:17;;;;;;;;;;:51;17616:198;17849:1;17841:5;:9;;-1:-1:-1;17583:7:0;;17542:321;;;;17390:480;;;;:::o;7538:2386::-;7722:4;7787:12;:19;7781:1;7776;7755:11;:18;:22;;;;;;;;7754:28;7753:53;7744:64;;;;;;7877:27;;:::i;:::-;7915;;:::i;:::-;8063:14;;7953:12;;7985:1;;8063:11;;7953:12;;8063:14;;;;;;;;;;;;;;;;8048:29;;8103:14;;;;8115:1;;8103:14;;;;;;;;;;;;;;;8088:9;8098:1;8088:12;;;:29;8216:6;8211:641;8232:12;:19;8228:1;:23;8211:641;;;8288:16;;8300:3;;;;8288:11;;:16;;;;;;;;;;;;;;;;8273:31;;8334:16;;8346:3;;;;8334:16;;;;;;;;;;;;;;;;;8319:9;8329:1;8319:12;;;:31;8380:15;;:12;;8393:1;;8380:15;;;;;;;;;;;;;;;8365:9;8375:1;8365:12;;;:30;8588:4;8581;8566:20;;8560:4;8549:9;8546:1;8539:4;8534:3;8530:14;8519:74;8508:85;;8630:7;8622:16;;;;;;;;8790:4;8779:9;8773:4;8762:9;8759:1;8752:4;8747:3;8743:14;8732:63;8721:74;;8832:7;8824:16;;;;;;;;8253:3;;8211:641;;;;8872:21;;:::i;:::-;:849;;;;;;;;8946:11;;8872:849;;8946:11;8959;;;;8872:849;;;;9029:11;;;;8872:849;;;;;;;;9042:11;;;;8872:849;;;;;9055:11;;;;8872:849;;;;;9068:11;;;;8872:849;;;;9151:8;;8872:849;;;;;;;9161:17;9151:5;8968:1;9169:8;;;;;9161:7;:17::i;:::-;8872:849;;9234:8;;;;;8872:849;;;;9244:8;;;;;8872:849;;;;;;;9254:8;;;;;8872:849;;;;;;;9264:8;;;;;8872:849;;;;;;;9353:12;;8872:849;;;;;;9367:21;9353:9;9385:1;9375:12;;9367:21;8872:849;;9436:8;;;;;8872:849;;;;9446:8;;;;8872:849;;;;9456:8;;;;8872:849;;;;9466:8;;;;8872:849;;;;9558:11;;;;-1:-1:-1;8872:849:0;;;;9571:20;9558:8;9452:1;9579:11;;9571:20;8872:849;;9641:9;;;;8872:849;;;;9652:9;;;;8872:849;;;;9663:9;;;;8872:849;;;;9674:9;;;;8872:849;;;;;;-1:-1:-1;9734:18:0;;:::i;:::-;9845:4;9840:3;9835;9828:5;9825:1;9818:4;9813:3;9809:14;9798:52;9787:63;;9879:7;9871:16;;;;;;;;9905:6;:11;;;;-1:-1:-1;;;;;;;;;;7538:2386:0:o;13238:189::-;13396:17;;;;;;;;;;;;;;;;13328:7;;13360:59;;13371:7;;13380:6;;13416:2;13360:10;:59::i;14000:1547::-;14104:75;14095:84;;14199:76;14095:6;14190;;:85;14295:77;14286:6;;;:86;14392:76;14383:6;;;:85;14488:77;14479:6;;;:86;14585:77;14576:6;;;:86;14682:77;14673:6;;;:86;14779:77;14770:6;;;:86;14876:77;14867:6;;;:86;14973:77;14964:6;;;:86;15071:77;15061:7;;;:87;15169:77;15159:7;;;:87;15267:76;15257:7;;;:86;15364:77;15354:7;;;:87;15462:77;15452:7;;;;:87;14000:1547::o;18286:939::-;18425:8;;18375:12;;;;;18494:679;13661:2;18515:5;:18;18494:679;;;18587:1;18574:12;:14;:19;18570:413;;;18635:10;;;18646:5;18635:17;;;;;;;;;;18653:12;18635:31;;;;;;;;;;;;-1:-1:-1;18695:75:0;18709:5;18731:1;18716:16;;;;18734:10;;18709:5;18734:17;;;;;;;;;;18752:12;18767:1;18752:16;18734:35;;;;;;;;;;;18695:13;:75::i;:::-;18687:83;;18570:413;;;18832:75;18846:5;-1:-1:-1;;18853:16:0;;18868:1;18871:10;;18846:5;18871:17;;;;;;;;;;18904:1;18889:12;:16;18871:35;;;;;;;;18832:75;18824:83;-1:-1:-1;18936:10:0;;;18947:5;18936:17;;;;;;;;;;18954:12;18936:31;;;;;;;;;;;18928:39;;18570:413;19034:1;19021:14;;19086:34;19095:5;19102;19109:3;19113:5;19109:10;;;;;;;;;;;19086:8;:34::i;:::-;19053:10;;;;;19064:7;;19053:19;;;;;;;;;;19073:9;19053:30;;;;;;;;;;:67;19152:9;-1:-1:-1;18535:7:0;;18494:679;;;-1:-1:-1;;;19192:22:0;;;;:25;;;-1:-1:-1;;;18286:939:0:o;17174:206::-;17285:7;17317:55;17331:5;17338:6;17346:10;;;17331:5;17346:17;;;;;;;;;;17364:6;17346:25;;;;;;;;17317:55;17310:62;17174:206;-1:-1:-1;;;;17174:206:0:o;5734:230::-;5850:77;5950:5;;;;5945:11;;;5734:230::o;12372:858::-;12501:7;12538:4;12570:66;12501:7;12649:149;12673:4;:11;12669:1;:15;12649:149;;;12780:6;12735:41;12743:4;12748:1;12743:7;;;;;;;;;;;;;;;;;;12752:1;12755:7;12764:11;12735:7;:41::i;:::-;12725:4;12730:1;12725:7;;;;;;;;;;;;;;;;;;12721:1;:11;:55;12720:66;;;;;;;;;-1:-1:-1;12686:3:0;;12649:149;;;-1:-1:-1;13221:1:0;;12372:858;-1:-1:-1;;;;;;12372:858:0:o;17880:396::-;17980:7;18009:11;;18005:240;;;18212:21;:19;:21::i;:::-;18108:99;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;18108:99:0;;;;;;;18079:129;;;;18108:99;;;18079:129;;;;;18108:99;18079:129;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;18079:129:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;18079:129:0;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18079:129:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18079:129:0;18053:180;;;;;;;;;18264:4;-1:-1:-1;;;;17880:396:0:o;15557:261::-;15713:16;;;15727:1;15713:16;;;15692:18;15713:16;;;;;15667:7;;15692:18;;15713:16;15727:1;15713:16;;;;;105:10:-1;15713:16:0;88:34:-1;136:17;;-1:-1;15713:16:0;15692:37;;15747:4;15740:1;15742;15740:4;;;;;;;;;;;;;;;;;;:11;15762:4;;15769:5;;15762:1;;15764;;15762:4;;;;;;;;;;;;;;:12;15794:16;15804:1;15807:2;15794:9;:16::i;:::-;15787:23;15557:261;-1:-1:-1;;;;;15557:261:0:o;11141:1216::-;11257:13;11331:1;11318:11;11315:18;11312:2;;;11346:1;11343;11336:12;11312:2;11442:4;11436:11;11481:2;11478:1;11474:10;11468:4;11461:24;11509:7;11506:1;11499:18;11547:66;;;11753:11;11738:493;11773:1;11770;11767:8;11738:493;;;11866:2;11863:1;11853:16;11850:1;11843:27;11987:6;11981:4;11972:6;11968:1;11962:8;11956:4;11949:30;11942:52;11937:57;;12062:6;12059:1;12056;12049:20;12044:25;;12198:6;12195:1;12186:6;12177;12174:1;12171;12164:20;12161:1;12154:39;12147:58;12139:66;-1:-1:-1;;;11783:9:0;11738:493;;;11742:24;12332:6;12326:4;12320;12313:26;12304:35;11297:1053;-1:-1:-1;;;;;;;;;11297:1053:0:o;10836:165::-;10927:66;10836:165;:::o;19548:4497::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;19548:4497:0;;;-1:-1:-1;;19548:4497:0:o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;19548:4497:0;;;-1:-1:-1;;19548:4497:0:o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;19548:4497:0;;;-1:-1:-1;;19548:4497:0:o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;19548:4497:0;;;-1:-1:-1;;19548:4497:0:o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;19548:4497:0;;;-1:-1:-1;;19548:4497:0:o;:::-;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://4f2a38374263fce14b7ad46814cad390067baeff247c4532a66f2d95b0f5c9f1

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.