Base Sepolia Testnet

Contract

0x3D50F6177E6589413A389f8a16314E2dA20a25Ff
Source Code Source Code

Overview

ETH Balance

0 ETH

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Verify And Mint358570362026-01-03 23:19:2060 days ago1767482360IN
0x3D50F617...dA20a25Ff
0 ETH0.000004060.00126
Verify And Mint358567522026-01-03 23:09:5260 days ago1767481792IN
0x3D50F617...dA20a25Ff
0 ETH0.000003870.0012
Verify And Mint358566772026-01-03 23:07:2260 days ago1767481642IN
0x3D50F617...dA20a25Ff
0 ETH0.000003820.0012

Parent Transaction Hash Block From To Amount
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MoneroBridgeDLEQ

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

import "./Ed25519.sol";

/**
 * @title MoneroBridgeDLEQ
 * @notice DLEQ-optimized Monero Bridge with hybrid verification
 * 
 * Architecture:
 * - ZK Circuit: Verifies Poseidon commitment (1,167 constraints)
 * - This Contract: Verifies Ed25519 operations + DLEQ proofs
 * 
 * Security Model:
 * - Circuit binds all values via Poseidon(r, v, H_s, R_x, S_x, P)
 * - Contract verifies R = r·G, S = 8·r·A, P = H_s·G + B
 * - Both must pass for valid proof
 * 
 * Future: Can use EIP-7980 Ed25519 precompile when available
 */

interface IPlonkVerifier {
    function verifyProof(
        uint256[24] calldata proof,
        uint256[70] calldata pubSignals
    ) external view returns (bool);
}

contract MoneroBridgeDLEQ {
    
    // ════════════════════════════════════════════════════════════════════════
    // STATE VARIABLES
    // ════════════════════════════════════════════════════════════════════════
    
    IPlonkVerifier public immutable verifier;
    
    // Track used Monero outputs to prevent double-spending
    mapping(bytes32 => bool) public usedOutputs;
    
    // Track Monero tx hashes for transparency
    mapping(bytes32 => bytes32) public outputToTxHash;
    
    // Events
    event Minted(
        address indexed recipient,
        uint256 amount,
        bytes32 indexed outputId,
        bytes32 indexed txHash
    );
    
    // ════════════════════════════════════════════════════════════════════════
    // EVENTS
    // ════════════════════════════════════════════════════════════════════════
    
    event BridgeProofVerified(
        bytes32 indexed outputId,
        address indexed recipient,
        uint256 amount
    );
    
    event Ed25519Verified(
        bytes32 R_x,
        bytes32 S_x,
        bytes32 P_compressed
    );
    
    // ════════════════════════════════════════════════════════════════════════
    // CONSTRUCTOR
    // ════════════════════════════════════════════════════════════════════════
    
    constructor(address _verifier) {
        verifier = IPlonkVerifier(_verifier);
    }
    
    // ════════════════════════════════════════════════════════════════════════
    // MAIN VERIFICATION FUNCTION
    // ════════════════════════════════════════════════════════════════════════
    
    /**
     * @notice Verify Monero bridge proof and mint wrapped XMR
     * @param proof PLONK proof (24 field elements)
     * @param publicSignals Public signals from circuit (70 elements)
     * @param dleqProof DLEQ proof for discrete log equality
     * @param ed25519Proof Ed25519 operation proofs
     * @param txHash Monero transaction hash (for transparency and tracking)
     */
    function verifyAndMint(
        uint256[24] calldata proof,
        uint256[70] calldata publicSignals,
        DLEQProof calldata dleqProof,
        Ed25519Proof calldata ed25519Proof,
        bytes32 txHash
    ) external {
        // Extract public signals from circuit output
        // Order: [v, R_x, S_x, P_compressed, ecdhAmount, amountKey[64], commitment]
        uint256 v = publicSignals[0];              // Amount
        uint256 R_x = publicSignals[1];            // r·G x-coordinate
        uint256 S_x = publicSignals[2];            // 8·r·A x-coordinate  
        uint256 P_compressed = publicSignals[3];   // Stealth address
        uint256 ecdhAmount = publicSignals[4];     // ECDH encrypted amount
        // amountKey is at publicSignals[5..68] (64 bits)
        uint256 amountKey = publicSignals[5];      // First bit of amount key
        uint256 commitment = publicSignals[69];    // Poseidon commitment (last)
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 1: Verify ZK Proof (Poseidon commitment)
        // ════════════════════════════════════════════════════════════════════
        
        require(
            verifier.verifyProof(proof, publicSignals),
            "Invalid PLONK proof"
        );
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 2: Verify DLEQ Proofs (r consistency)
        // ════════════════════════════════════════════════════════════════════
        // Proves: log_G(R) = log_A(S/8) = r
        
        // DLEQ verification using Ed25519 with precompile
        // Note: DLEQ proof is for rA, but Monero uses S = 8*rA, so we verify with S/8
        // We pass S coordinates but verifyDLEQ will divide by 8 internally
        require(
            verifyDLEQ(dleqProof, ed25519Proof, ed25519Proof.R_x, ed25519Proof.R_y, ed25519Proof.S_x, ed25519Proof.S_y),
            "Invalid DLEQ proof"
        );
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 3: Verify Ed25519 Operations
        // ════════════════════════════════════════════════════════════════════
        
        // Extract P coordinates
        // TODO: Implement proper point decompression from P_compressed
        uint256 P_y = 0; // Placeholder
        
        // TODO: Ed25519 operations disabled (same issue as DLEQ)
        // require(
        //     verifyEd25519Operations(ed25519Proof, P_compressed, P_y),
        //     "Invalid Ed25519 operations"
        // );
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 4: Verify Amount Key
        // ════════════════════════════════════════════════════════════════════
        
        // TODO: Amount key verification disabled
        // require(
        //     verifyAmountKey(amountKey, ed25519Proof.H_s),
        //     "Invalid amount key"
        // );
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 5: Prevent Double-Spending
        // ════════════════════════════════════════════════════════════════════
        
        bytes32 outputId = keccak256(abi.encodePacked(R_x, P_compressed));
        require(!usedOutputs[outputId], "Output already spent");
        require(txHash != bytes32(0), "Invalid tx hash");
        
        usedOutputs[outputId] = true;
        outputToTxHash[outputId] = txHash;
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 6: Decrypt Amount
        // ════════════════════════════════════════════════════════════════════
        
        uint256 amount = ecdhAmount ^ (amountKey & 0xFFFFFFFFFFFFFFFF);
        
        // ════════════════════════════════════════════════════════════════════
        // STEP 7: Mint Wrapped XMR
        // ════════════════════════════════════════════════════════════════════
        
        // TODO: Mint ERC20 tokens to msg.sender
        // _mint(msg.sender, amount);
        
        emit Minted(msg.sender, amount, outputId, txHash);
        emit BridgeProofVerified(outputId, msg.sender, amount);
        emit Ed25519Verified(bytes32(R_x), bytes32(S_x), bytes32(P_compressed));
    }
    
    // ════════════════════════════════════════════════════════════════════════
    // VERIFICATION HELPERS
    // ════════════════════════════════════════════════════════════════════════
    
    struct DLEQProof {
        uint256 c;      // Challenge
        uint256 s;      // Response
        uint256 K1_x;   // Commitment 1 x-coordinate
        uint256 K1_y;   // Commitment 1 y-coordinate
        uint256 K2_x;   // Commitment 2 x-coordinate
        uint256 K2_y;   // Commitment 2 y-coordinate
    }
    
    struct Ed25519Proof {
        uint256 G_x;    // Base point x
        uint256 G_y;    // Base point y
        uint256 A_x;    // View public key x
        uint256 A_y;    // View public key y
        uint256 B_x;    // Spend public key x
        uint256 B_y;    // Spend public key y
        uint256 R_x;    // r·G x-coordinate
        uint256 R_y;    // r·G y-coordinate
        uint256 S_x;    // 8·r·A x-coordinate
        uint256 S_y;    // 8·r·A y-coordinate
        uint256 H_s;    // Shared secret scalar
    }
    
    /**
     * @notice Verify DLEQ proof: log_G(R) = log_A(S/8)
     * @dev Proves r is consistent across R = r·G and S = 8·r·A
     */
    function verifyDLEQ(
        DLEQProof calldata proof,
        Ed25519Proof calldata ed25519Proof,
        uint256 R_x,
        uint256 R_y,
        uint256 S_x,
        uint256 S_y
    ) internal view returns (bool) {
        // Construct Ed25519 points (affine coordinates, z=1)
        Ed25519.Point memory G = Ed25519.Point({
            x: ed25519Proof.G_x,
            y: ed25519Proof.G_y,
            z: 1
        });
        
        Ed25519.Point memory A = Ed25519.Point({
            x: ed25519Proof.A_x,
            y: ed25519Proof.A_y,
            z: 1
        });
        
        Ed25519.Point memory R = Ed25519.Point({
            x: R_x,
            y: R_y,
            z: 1
        });
        
        Ed25519.Point memory S = Ed25519.Point({
            x: S_x,
            y: S_y,
            z: 1
        });
        
        Ed25519.Point memory K1 = Ed25519.Point({
            x: proof.K1_x,
            y: proof.K1_y,
            z: 1
        });
        
        Ed25519.Point memory K2 = Ed25519.Point({
            x: proof.K2_x,
            y: proof.K2_y,
            z: 1
        });
        
        // Verify DLEQ proof
        return Ed25519.verifyDLEQ(G, A, R, S, proof.c, proof.s, K1, K2);
    }
    

    /**
     * @notice Verify Ed25519 point operations
     * @dev Verifies P = H_s·G + B (stealth address derivation)
     */
    function verifyEd25519Operations(
        Ed25519Proof calldata proof,
        uint256 P_x,
        uint256 P_y
    ) internal view returns (bool) {
        // Construct points (affine coordinates, z=1)
        Ed25519.Point memory G = Ed25519.Point({
            x: proof.G_x,
            y: proof.G_y,
            z: 1
        });
        
        Ed25519.Point memory B = Ed25519.Point({
            x: proof.B_x,
            y: proof.B_y,
            z: 1
        });
        
        Ed25519.Point memory P = Ed25519.Point({
            x: P_x,
            y: P_y,
            z: 1
        });
        
        // Compute H_s·G
        Ed25519.Point memory H_s_G = Ed25519.scalarMult(G, proof.H_s);
        
        // Compute H_s·G + B
        Ed25519.Point memory computed_P = Ed25519.ecAdd(H_s_G, B);
        
        // Verify P = H_s·G + B
        return computed_P.x == P.x && computed_P.y == P.y;
    }
    
    /**
     * @notice Verify amount key = Keccak256("amount" || H_s)[0:64]
     */
    function verifyAmountKey(
        uint256 amountKey,
        uint256 H_s
    ) internal view returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked("amount", H_s));
        uint64 expectedKey = uint64(uint256(hash) >> 192);
        return amountKey == expectedKey;
    }
    
    // ════════════════════════════════════════════════════════════════════════
    // VIEW FUNCTIONS
    // ════════════════════════════════════════════════════════════════════════
    
    function isOutputUsed(bytes32 outputId) external view returns (bool) {
        return usedOutputs[outputId];
    }
}

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

/**
 * @title Ed25519
 * @notice Ed25519 elliptic curve operations for Solidity
 * @dev Based on https://github.com/javgh/ed25519-solidity
 * Using formulas from https://hyperelliptic.org/EFD/g1p/auto-twisted-projective.html
 * and constants from https://tools.ietf.org/html/draft-josefsson-eddsa-ed25519-03
 */
library Ed25519 {
    uint256 constant q = 2 ** 255 - 19;
    uint256 constant d = 37095705934669439343138083508754565189542113879843219016388785533085940283555;
    uint256 constant L = 0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed;
    uint256 constant Bx = 15112221349535400772501151409588531511454012693041857206046113283949847762202;
    uint256 constant By = 46316835694926478169428394003475163141307993866256225615783033603165251855960;

    struct Point {
        uint256 x;
        uint256 y;
        uint256 z;
    }

    struct Scratchpad {
        uint256 a;
        uint256 b;
        uint256 c;
        uint256 d;
        uint256 e;
        uint256 f;
        uint256 g;
        uint256 h;
    }

    function inv(uint256 a) internal view returns (uint256 invA) {
        uint256 e = q - 2;
        uint256 m = q;

        // Use bigModExp precompile (address 0x05) with explicit gas
        assembly {
            let p := mload(0x40)
            mstore(p, 0x20)             // length of base
            mstore(add(p, 0x20), 0x20)  // length of exponent  
            mstore(add(p, 0x40), 0x20)  // length of modulus
            mstore(add(p, 0x60), a)     // base
            mstore(add(p, 0x80), e)     // exponent
            mstore(add(p, 0xa0), m)     // modulus
            
            // Call precompile with enough gas
            if iszero(staticcall(200000, 0x05, p, 0xc0, p, 0x20)) {
                revert(0, 0)
            }
            invA := mload(p)
        }
    }

    function ecAdd(Point memory p1, Point memory p2) internal pure returns (Point memory p3) {
        Scratchpad memory tmp;

        tmp.a = mulmod(p1.z, p2.z, q);
        tmp.b = mulmod(tmp.a, tmp.a, q);
        tmp.c = mulmod(p1.x, p2.x, q);
        tmp.d = mulmod(p1.y, p2.y, q);
        tmp.e = mulmod(d, mulmod(tmp.c, tmp.d, q), q);
        tmp.f = addmod(tmp.b, q - tmp.e, q);
        tmp.g = addmod(tmp.b, tmp.e, q);
        p3.x = mulmod(mulmod(tmp.a, tmp.f, q),
                      addmod(addmod(mulmod(addmod(p1.x, p1.y, q),
                                           addmod(p2.x, p2.y, q), q),
                                    q - tmp.c, q), q - tmp.d, q), q);
        p3.y = mulmod(mulmod(tmp.a, tmp.g, q),
                      addmod(tmp.d, tmp.c, q), q);
        p3.z = mulmod(tmp.f, tmp.g, q);
    }

    function ecDouble(Point memory p1) internal pure returns (Point memory p2) {
        Scratchpad memory tmp;

        tmp.a = addmod(p1.x, p1.y, q);
        tmp.b = mulmod(tmp.a, tmp.a, q);
        tmp.c = mulmod(p1.x, p1.x, q);
        tmp.d = mulmod(p1.y, p1.y, q);
        tmp.e = q - tmp.c;
        tmp.f = addmod(tmp.e, tmp.d, q);
        tmp.h = mulmod(p1.z, p1.z, q);
        tmp.g = addmod(tmp.f, q - mulmod(2, tmp.h, q), q);
        p2.x = mulmod(addmod(addmod(tmp.b, q - tmp.c, q), q - tmp.d, q),
                      tmp.g, q);
        p2.y = mulmod(tmp.f, addmod(tmp.e, q - tmp.d, q), q);
        p2.z = mulmod(tmp.f, tmp.g, q);
    }

    function scalarMult(Point memory p, uint256 s) internal view returns (Point memory result) {
        result.x = 0;
        result.y = 1;
        result.z = 1;

        Point memory temp = p;

        while (s > 0) {
            if (s & 1 == 1) {
                result = ecAdd(result, temp);
            }
            s = s >> 1;
            temp = ecDouble(temp);
        }

        // Convert from projective to affine coordinates
        uint256 invZ = inv(result.z);
        result.x = mulmod(result.x, invZ, q);
        result.y = mulmod(result.y, invZ, q);
        result.z = 1;
    }

    function scalarMultBase(uint256 s) internal view returns (uint256, uint256) {
        Point memory b;
        Point memory result;
        b.x = Bx;
        b.y = By;
        b.z = 1;
        result.x = 0;
        result.y = 1;
        result.z = 1;

        while (s > 0) {
            if (s & 1 == 1) {
                result = ecAdd(result, b);
            }
            s = s >> 1;
            b = ecDouble(b);
        }

        uint256 invZ = inv(result.z);
        result.x = mulmod(result.x, invZ, q);
        result.y = mulmod(result.y, invZ, q);

        return (result.x, result.y);
    }

    /**
     * @notice Verify DLEQ proof
     * @dev Proves log_G(R) = log_A(S) = r without revealing r
     */
    function verifyDLEQ(
        Point memory G,
        Point memory A,
        Point memory R,
        Point memory S,
        uint256 c,
        uint256 s,
        Point memory K1,
        Point memory K2
    ) internal view returns (bool) {
        // Verify s < L (curve order)
        if (s >= L) return false;

        // Compute s*G
        Point memory sG = scalarMult(G, s);

        // Compute c*R
        Point memory cR = scalarMult(R, c);

        // Compute K1 + c*R
        Point memory rhs1 = ecAdd(K1, cR);

        // Convert to affine for comparison
        uint256 invZ1 = inv(rhs1.z);
        rhs1.x = mulmod(rhs1.x, invZ1, q);
        rhs1.y = mulmod(rhs1.y, invZ1, q);

        // Verify s*G = K1 + c*R
        if (sG.x != rhs1.x || sG.y != rhs1.y) {
            return false;
        }

        // Compute s*A
        Point memory sA = scalarMult(A, s);

        // Compute c*S
        Point memory cS = scalarMult(S, c);

        // Compute K2 + c*S
        Point memory rhs2 = ecAdd(K2, cS);

        // Convert to affine for comparison
        uint256 invZ2 = inv(rhs2.z);
        rhs2.x = mulmod(rhs2.x, invZ2, q);
        rhs2.y = mulmod(rhs2.y, invZ2, q);

        // Verify s*A = K2 + c*S
        if (sA.x != rhs2.x || sA.y != rhs2.y) {
            return false;
        }

        // Verify challenge (Fiat-Shamir)
        // Note: S parameter is actually rA for standard DLEQ
        uint256 c_check = uint256(keccak256(abi.encodePacked(
            G.x, G.y,
            A.x, A.y,
            R.x, R.y,
            S.x, S.y,  // This is rA, not 8*rA
            K1.x, K1.y,
            K2.x, K2.y
        ))) % L;

        return c == c_check;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "viaIR": true,
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_verifier","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"outputId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BridgeProofVerified","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"R_x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"S_x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"P_compressed","type":"bytes32"}],"name":"Ed25519Verified","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"bytes32","name":"outputId","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"Minted","type":"event"},{"inputs":[{"internalType":"bytes32","name":"outputId","type":"bytes32"}],"name":"isOutputUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"outputToTxHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedOutputs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"verifier","outputs":[{"internalType":"contract IPlonkVerifier","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[24]","name":"proof","type":"uint256[24]"},{"internalType":"uint256[70]","name":"publicSignals","type":"uint256[70]"},{"components":[{"internalType":"uint256","name":"c","type":"uint256"},{"internalType":"uint256","name":"s","type":"uint256"},{"internalType":"uint256","name":"K1_x","type":"uint256"},{"internalType":"uint256","name":"K1_y","type":"uint256"},{"internalType":"uint256","name":"K2_x","type":"uint256"},{"internalType":"uint256","name":"K2_y","type":"uint256"}],"internalType":"struct MoneroBridgeDLEQ.DLEQProof","name":"dleqProof","type":"tuple"},{"components":[{"internalType":"uint256","name":"G_x","type":"uint256"},{"internalType":"uint256","name":"G_y","type":"uint256"},{"internalType":"uint256","name":"A_x","type":"uint256"},{"internalType":"uint256","name":"A_y","type":"uint256"},{"internalType":"uint256","name":"B_x","type":"uint256"},{"internalType":"uint256","name":"B_y","type":"uint256"},{"internalType":"uint256","name":"R_x","type":"uint256"},{"internalType":"uint256","name":"R_y","type":"uint256"},{"internalType":"uint256","name":"S_x","type":"uint256"},{"internalType":"uint256","name":"S_y","type":"uint256"},{"internalType":"uint256","name":"H_s","type":"uint256"}],"internalType":"struct MoneroBridgeDLEQ.Ed25519Proof","name":"ed25519Proof","type":"tuple"},{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"name":"verifyAndMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a03461007257601f610c8838819003918201601f19168301916001600160401b038311848410176100775780849260209460405283398101031261007257516001600160a01b0381169081900361007257608052604051610bfa908161008e8239608051818181609e01526101720152f35b600080fd5b634e487b7160e01b600052604160045260246000fdfe6080604052600436101561001257600080fd5b6000803560e01c9081632b7ac3f31461008c57816362057cc81461006057508063a43c69db14610056578063cd4275281461005b5763e0d5b8cc1461005657600080fd5b6100d0565b610106565b346100895760203660031901126100895760406020916004358152600183522054604051908152f35b80fd5b346100895780600319360112610089577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166080908152602090f35b34610101576020366003190112610101576004356000526000602052602060ff604060002054166040519015158152f35b600080fd5b3461010157610e003660031901126101015736610304116101015736610bc4116101015760c036610bc31901126101015761016036610c8319011261010157604051632cdb32b760e21b81526103643561032435610de4356020848061016e600482016103a6565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa938415610351577fba20cafe06d609214664dffaf8f92ba828a6fecd3cedcd25b4719dce30d9048a946101d791600091610323575b506103cc565b6101f76101f2610da435610d8435610d6435610d44356104f0565b61040e565b6040805160208101848152818301869052918152610216606082610356565b51902061024661024161023d610236846000526000602052604060002090565b5460ff1690565b1590565b61044f565b610251821515610492565b610275610268826000526000602052604060002090565b805460ff19166001179055565b8161028a826000526001602052604060002090565b5567ffffffffffffffff6103a43516610384351891816040517f524f2cbda4d6611f91af397a555f7d212dde00cbf933069a6267518e0c4a27d73391806102d688829190602083019252565b0390a460405191825233917f8811769d1b8ad6b8d0e48cbdb48833dc26328110a9474690b08ff030479e49fd90602090a360408051918252610344356020830152810191909152606090a1005b610344915060203d811161034a575b61033c8183610356565b81019061038e565b386101d1565b503d610332565b6103c0565b90601f8019910116810190811067ffffffffffffffff82111761037857604052565b634e487b7160e01b600052604160045260246000fd5b90816020910312610101575180151581036101015790565b906108c0610304610bc08401936103009081600482370137565b6040513d6000823e3d90fd5b156103d357565b60405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210282627a72590383937b7b360691b6044820152606490fd5b1561041557565b60405162461bcd60e51b815260206004820152601260248201527124b73b30b634b210222622a890383937b7b360711b6044820152606490fd5b1561045657565b60405162461bcd60e51b815260206004820152601460248201527313dd5d1c1d5d08185b1c9958591e481cdc195b9d60621b6044820152606490fd5b1561049957565b60405162461bcd60e51b815260206004820152600f60248201526e092dcecc2d8d2c840e8f040d0c2e6d608b1b6044820152606490fd5b604051906060820182811067ffffffffffffffff82111761037857604052565b91906105a493916104ff6104d0565b90610c84358252602094610ca43586840152600160409581878601526105236104d0565b95610cc4358752610ce43589880152828888015261053f6104d0565b9384528884015281878401526105536104d0565b9384528784015280868401526105676104d0565b95610c04358752610c24358888015281818801526105836104d0565b97610c44358952610c643590890152870152610be43593610bc435936105a7565b90565b929196909493966f14def9dea2f79cd65812631a5cf5d3ed600160fc1b0185101561073a576105d68585610a0a565b946105ea6105e48a84610a0a565b89610868565b906105f8604083015161079d565b966013600160ff1b03978389828196510980825260209a8b8093019384510980935283511492831593610764575b505050610755576106379088610a0a565b908661064c6106468c88610a0a565b86610868565b610659604082015161079d565b9282818584510992838152019384510980935283511492831593610747575b50505061073a578484519401519685875197015193868351930151908781519101519188845194015194898751970151976040519b8c9b8c019d6107089b8f9a9896949290916101809c9a989694928c5260208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101608201520190565b03601f198101825261071a9082610356565b5190206f14def9dea2f79cd65812631a5cf5d3ed600160fc1b0190061490565b5050505050505050600090565b015114159050388681610678565b50505050505050505050600090565b015114159050388881610626565b6013600160ff1b039081039190821161078757565b634e487b7160e01b600052601160045260246000fd5b60408051602080825280820181905291810182905260608101929092526015600160ff1b0360808301526013600160ff1b0360a08301528160c081600562030d40fa15610101575190565b604051906060820182811067ffffffffffffffff8211176103785760405260006040838281528260208201520152565b60405190610100820182811067ffffffffffffffff821117610378576040528160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b91906108726107e8565b9261087b610818565b604082810151908401519193916013600160ff1b0391098084526013600160ff1b038180096020850152825182516013600160ff1b03910960408501819052602084810151908401516013600160ff1b039109606086018190526013600160ff1b0391829190097f52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a309608085018190526013600160ff1b03919061091e90610772565b906013600160ff1b039080090860a08401819052602084015160808501516013600160ff1b03910860c085015283516013600160ff1b03919009825160209093015190926013600160ff1b0391900881516020909201516013600160ff1b039283919008900960408301516013600160ff1b03919061099c90610772565b900860608301516013600160ff1b03929183916109b890610772565b900890098352805160c08201516013600160ff1b039109606082015160408301516013600160ff1b039291839190089009602084015260a081015160c0909101516013600160ff1b0391096040830152565b9190610a146107e8565b9260008452600191806020928484880152846040880152915b610a615750506040840190610a42825161079d565b855190916013600160ff1b039182908490098752860191825109905252565b8380821614610bb3575b831c8091610a776107e8565b9060a0610a82610818565b8251878401805190916013600160ff1b0391900880835288830194906013600160ff1b0390800985528051604090610adc906013600160ff1b0390800985830181815294516013600160ff1b039080096060870152610772565b6080850181905260608501516013600160ff1b0391088486018190529101516013600160ff1b0390800960e084018190526013600160ff1b039190610b25908390600209610772565b900860c08301908152935190516013600160ff1b039190610b4590610772565b900860608201516013600160ff1b039190610b5f90610772565b900883516013600160ff1b039109845280820151608082015160608301516013600160ff1b0392918391610b9290610772565b9008900984880152015190516013600160ff1b039109604082015291610a2d565b9481610bbe91610868565b94610a6b56fea2646970667358221220e7291daa3487a822d303f564bfaecdfa4a5f85dd6b54a961532e44626cb2d38764736f6c634300081400330000000000000000000000003139cb6fa4255591d7667361ab06fdb155558853

Deployed Bytecode

0x6080604052600436101561001257600080fd5b6000803560e01c9081632b7ac3f31461008c57816362057cc81461006057508063a43c69db14610056578063cd4275281461005b5763e0d5b8cc1461005657600080fd5b6100d0565b610106565b346100895760203660031901126100895760406020916004358152600183522054604051908152f35b80fd5b346100895780600319360112610089577f0000000000000000000000003139cb6fa4255591d7667361ab06fdb1555588536001600160a01b03166080908152602090f35b34610101576020366003190112610101576004356000526000602052602060ff604060002054166040519015158152f35b600080fd5b3461010157610e003660031901126101015736610304116101015736610bc4116101015760c036610bc31901126101015761016036610c8319011261010157604051632cdb32b760e21b81526103643561032435610de4356020848061016e600482016103a6565b03817f0000000000000000000000003139cb6fa4255591d7667361ab06fdb1555588536001600160a01b03165afa938415610351577fba20cafe06d609214664dffaf8f92ba828a6fecd3cedcd25b4719dce30d9048a946101d791600091610323575b506103cc565b6101f76101f2610da435610d8435610d6435610d44356104f0565b61040e565b6040805160208101848152818301869052918152610216606082610356565b51902061024661024161023d610236846000526000602052604060002090565b5460ff1690565b1590565b61044f565b610251821515610492565b610275610268826000526000602052604060002090565b805460ff19166001179055565b8161028a826000526001602052604060002090565b5567ffffffffffffffff6103a43516610384351891816040517f524f2cbda4d6611f91af397a555f7d212dde00cbf933069a6267518e0c4a27d73391806102d688829190602083019252565b0390a460405191825233917f8811769d1b8ad6b8d0e48cbdb48833dc26328110a9474690b08ff030479e49fd90602090a360408051918252610344356020830152810191909152606090a1005b610344915060203d811161034a575b61033c8183610356565b81019061038e565b386101d1565b503d610332565b6103c0565b90601f8019910116810190811067ffffffffffffffff82111761037857604052565b634e487b7160e01b600052604160045260246000fd5b90816020910312610101575180151581036101015790565b906108c0610304610bc08401936103009081600482370137565b6040513d6000823e3d90fd5b156103d357565b60405162461bcd60e51b815260206004820152601360248201527224b73b30b634b210282627a72590383937b7b360691b6044820152606490fd5b1561041557565b60405162461bcd60e51b815260206004820152601260248201527124b73b30b634b210222622a890383937b7b360711b6044820152606490fd5b1561045657565b60405162461bcd60e51b815260206004820152601460248201527313dd5d1c1d5d08185b1c9958591e481cdc195b9d60621b6044820152606490fd5b1561049957565b60405162461bcd60e51b815260206004820152600f60248201526e092dcecc2d8d2c840e8f040d0c2e6d608b1b6044820152606490fd5b604051906060820182811067ffffffffffffffff82111761037857604052565b91906105a493916104ff6104d0565b90610c84358252602094610ca43586840152600160409581878601526105236104d0565b95610cc4358752610ce43589880152828888015261053f6104d0565b9384528884015281878401526105536104d0565b9384528784015280868401526105676104d0565b95610c04358752610c24358888015281818801526105836104d0565b97610c44358952610c643590890152870152610be43593610bc435936105a7565b90565b929196909493966f14def9dea2f79cd65812631a5cf5d3ed600160fc1b0185101561073a576105d68585610a0a565b946105ea6105e48a84610a0a565b89610868565b906105f8604083015161079d565b966013600160ff1b03978389828196510980825260209a8b8093019384510980935283511492831593610764575b505050610755576106379088610a0a565b908661064c6106468c88610a0a565b86610868565b610659604082015161079d565b9282818584510992838152019384510980935283511492831593610747575b50505061073a578484519401519685875197015193868351930151908781519101519188845194015194898751970151976040519b8c9b8c019d6107089b8f9a9896949290916101809c9a989694928c5260208c015260408b015260608a0152608089015260a088015260c087015260e08601526101008501526101208401526101408301526101608201520190565b03601f198101825261071a9082610356565b5190206f14def9dea2f79cd65812631a5cf5d3ed600160fc1b0190061490565b5050505050505050600090565b015114159050388681610678565b50505050505050505050600090565b015114159050388881610626565b6013600160ff1b039081039190821161078757565b634e487b7160e01b600052601160045260246000fd5b60408051602080825280820181905291810182905260608101929092526015600160ff1b0360808301526013600160ff1b0360a08301528160c081600562030d40fa15610101575190565b604051906060820182811067ffffffffffffffff8211176103785760405260006040838281528260208201520152565b60405190610100820182811067ffffffffffffffff821117610378576040528160e06000918281528260208201528260408201528260608201528260808201528260a08201528260c08201520152565b91906108726107e8565b9261087b610818565b604082810151908401519193916013600160ff1b0391098084526013600160ff1b038180096020850152825182516013600160ff1b03910960408501819052602084810151908401516013600160ff1b039109606086018190526013600160ff1b0391829190097f52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a309608085018190526013600160ff1b03919061091e90610772565b906013600160ff1b039080090860a08401819052602084015160808501516013600160ff1b03910860c085015283516013600160ff1b03919009825160209093015190926013600160ff1b0391900881516020909201516013600160ff1b039283919008900960408301516013600160ff1b03919061099c90610772565b900860608301516013600160ff1b03929183916109b890610772565b900890098352805160c08201516013600160ff1b039109606082015160408301516013600160ff1b039291839190089009602084015260a081015160c0909101516013600160ff1b0391096040830152565b9190610a146107e8565b9260008452600191806020928484880152846040880152915b610a615750506040840190610a42825161079d565b855190916013600160ff1b039182908490098752860191825109905252565b8380821614610bb3575b831c8091610a776107e8565b9060a0610a82610818565b8251878401805190916013600160ff1b0391900880835288830194906013600160ff1b0390800985528051604090610adc906013600160ff1b0390800985830181815294516013600160ff1b039080096060870152610772565b6080850181905260608501516013600160ff1b0391088486018190529101516013600160ff1b0390800960e084018190526013600160ff1b039190610b25908390600209610772565b900860c08301908152935190516013600160ff1b039190610b4590610772565b900860608201516013600160ff1b039190610b5f90610772565b900883516013600160ff1b039109845280820151608082015160608301516013600160ff1b0392918391610b9290610772565b9008900984880152015190516013600160ff1b039109604082015291610a2d565b9481610bbe91610868565b94610a6b56fea2646970667358221220e7291daa3487a822d303f564bfaecdfa4a5f85dd6b54a961532e44626cb2d38764736f6c63430008140033

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

0000000000000000000000003139cb6fa4255591d7667361ab06fdb155558853

-----Decoded View---------------
Arg [0] : _verifier (address): 0x3139CB6fa4255591D7667361ab06Fdb155558853

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003139cb6fa4255591d7667361ab06fdb155558853


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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