Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Loading...
Loading
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;
}
}{
"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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.