Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
JoinSplitVerifier
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 500 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import {Pairing} from "./libs/Pairing.sol"; import {Groth16} from "./libs/Groth16.sol"; import {IJoinSplitVerifier} from "./interfaces/IJoinSplitVerifier.sol"; contract JoinSplitVerifier is IJoinSplitVerifier { function verifyingKey() internal pure returns (Groth16.VerifyingKey memory vk) { vk.alpha1 = Pairing.G1Point( 20491192805390485299153009773594534940189261866228447918068658471970481763042, 9383485363053290200918347156157836566562967994039712273449902621266178545958 ); vk.beta2 = Pairing.G2Point( [ 4252822878758300859123897981450591353533073413197771768651442665752259397132, 6375614351688725206403948262868962793625744043794305715222011528459656738731 ], [ 21847035105528745403288232691147584728191162732299865338377159692350059136679, 10505242626370262277552901082094356697409835680220590971873171140371331206856 ] ); vk.gamma2 = Pairing.G2Point( [ 11559732032986387107991004021392285783925812861821192530917403151452391805634, 10857046999023057135944570762232829481370756359578518086990519993285655852781 ], [ 4082367875863433681332203403145435568316851327593401208105741076214120093531, 8495653923123431417604973247489272438418190587263600148770280649306958101930 ] ); vk.delta2 = Pairing.G2Point( [ 6951432554751821470666639479383739129656562698093131907479585452174608591421, 1338903763788632844290055225614662007038180770926322994380170981031330523530 ], [ 13477308226368552393616026547226275762995364857742000414576624863552234658081, 12788946999155520184501322357182900815864797397405033445077644939627141276729 ] ); vk.IC = new Pairing.G1Point[](14); vk.IC[0] = Pairing.G1Point( 9524985516120418107975902189443349338859670708689358711231918784968189969937, 20126430599005730873466796188517981279028686335762847957312250891091598557443 ); vk.IC[1] = Pairing.G1Point( 7076484465209111843099314392290347318728611219335521304546320777721633431171, 3477177891781106823283705544517850007690194911112166112930082139365335269455 ); vk.IC[2] = Pairing.G1Point( 16903069826561552461797467783499608405329126392469352955863254497424037692310, 12246400550262150248059154032032413063400605178501358821847643632100344732643 ); vk.IC[3] = Pairing.G1Point( 14886788532249239447581019631337070956826278094833948640302181658577591786658, 18890694838550696611836851221993324099785568777373674413373388591471911509816 ); vk.IC[4] = Pairing.G1Point( 3901744820901125560573571756449831714821611757303955640045430725369400734147, 2937501672321940430830690554918714297028761016391639278802768221502205063448 ); vk.IC[5] = Pairing.G1Point( 11352033973079023306212632693545810795733039101531697532740960076687876646862, 19840295880375087362536859073797660900514915911440638898368289513181295060623 ); vk.IC[6] = Pairing.G1Point( 3656682403215717280010584102825631050387380561464117450215335130297677114284, 18502070453480691357583372156048407349366744484001371788701061952122645482785 ); vk.IC[7] = Pairing.G1Point( 6754228255921444687291588687398589198620011822787398508430490485897004089334, 17158770299305770601261003892903199011470808699493330483925141919468987536374 ); vk.IC[8] = Pairing.G1Point( 7908219712746056347109091017629871181480438600545767573033601406420591564879, 11036266516723453324829043639866188012689922133398952512544792760550228974755 ); vk.IC[9] = Pairing.G1Point( 1276097426795285996094571176892764604470257606620213581226901201299043250808, 2468074186331884131605654154544448442411809993567250721909334320557835837783 ); vk.IC[10] = Pairing.G1Point( 3031491274140332569773804626661476094347840955701243555916341202192685063367, 11163865120055582121596291554167536186197708266050364165200907153426222729847 ); vk.IC[11] = Pairing.G1Point( 19502689083364820358995261968205870251381602275411023295691885030762848184014, 12352510520382165789326005220689136572925454792752290992005274966175493869626 ); vk.IC[12] = Pairing.G1Point( 11514194557156426792859022527116403913104113770126404110633942660234578280462, 19131881803394072020211640431890947338192925627218990720275998123142672930248 ); vk.IC[13] = Pairing.G1Point( 4210122220855990149596420290088849445745841945220858056349180312795557205598, 21195277088876147341647593240843289054061973080002976265125842821202426949704 ); } /// @return r bool true if proof is valid function verifyProof( uint256[8] memory proof, uint256[] memory pi ) public view override returns (bool r) { return Groth16.verifyProof(verifyingKey(), proof, pi); } /// @return r bool true if proofs are valid function batchVerifyProofs( uint256[8][] memory proofs, uint256[][] memory allPis ) public view override returns (bool) { return Groth16.batchVerifyProofs(verifyingKey(), proofs, allPis); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import {IVerifier} from "./IVerifier.sol"; /// @title Verifier interface. /// @dev Interface of Verifier contract. interface IJoinSplitVerifier is IVerifier { }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import "../libs/Types.sol"; interface ITeller { function processBundle( Bundle calldata bundle ) external returns ( uint256[] memory opDigests, OperationResult[] memory opResults ); function depositFunds( Deposit calldata deposit ) external returns (uint128 merkleIndex); function requestAsset( EncodedAsset calldata encodedAsset, uint256 value ) external; }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import {Groth16} from "../libs/Groth16.sol"; /// @title interface for verifiers that support batch verification. /// @dev Interface for verifiers that support batch verification. interface IVerifier { /// @param proof: the proof to verify /// @param pis: an array of containing the public inputs for the proof function verifyProof( uint256[8] memory proof, uint256[] memory pis ) external view returns (bool); /// @param proofs: an array containing the proofs to verify /// @param pis: an array of length `NUM_PIS * numProofs` containing the PIs for each proof concatenated together function batchVerifyProofs( uint256[8][] memory proofs, uint256[][] memory pis ) external view returns (bool); }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import {Pairing} from "./Pairing.sol"; import {Utils} from "./Utils.sol"; library Groth16 { struct VerifyingKey { Pairing.G1Point alpha1; Pairing.G2Point beta2; Pairing.G2Point gamma2; Pairing.G2Point delta2; Pairing.G1Point[] IC; } struct Proof { Pairing.G1Point A; Pairing.G2Point B; Pairing.G1Point C; } // Verifying a single Groth16 proof function verifyProof( VerifyingKey memory vk, uint256[8] memory proof8, uint256[] memory pi ) internal view returns (bool) { require(vk.IC.length == pi.length + 1, "Public input length mismatch."); Pairing.G1Point memory vk_x = vk.IC[0]; for (uint i = 0; i < pi.length; i++) { require( pi[i] < Utils.BN254_SCALAR_FIELD_MODULUS, "Malformed public input." ); vk_x = Pairing.addition( vk_x, Pairing.scalar_mul(vk.IC[i + 1], pi[i]) ); } Proof memory proof = _proof8ToStruct(proof8); return Pairing.pairingProd4( Pairing.negate(proof.A), proof.B, vk.alpha1, vk.beta2, vk_x, vk.gamma2, proof.C, vk.delta2 ); } function accumulate( Proof[] memory proofs, uint256[][] memory allPis ) internal view returns ( Pairing.G1Point[] memory proofAsandAggegateC, uint256[] memory publicInputAccumulators ) { uint256 allPisLength = allPis.length; uint256 numProofs = proofs.length; uint256 numPublicInputs = allPis[0].length; for (uint256 i = 1; i < allPisLength; i++) { require( numPublicInputs == allPis[i].length, "Public input mismatch during batch verification." ); } uint256[] memory entropy = new uint256[](numProofs); publicInputAccumulators = new uint256[](numPublicInputs + 1); // Generate entropy for each proof and accumulate each PI // seed a challenger by hashing all of the proofs and the current blockhash togethre uint256 challengerState = uint256( keccak256(abi.encode(proofs, blockhash(block.number - 1))) ); for (uint256 proofIndex = 0; proofIndex < numProofs; proofIndex++) { if (proofIndex == 0) { entropy[proofIndex] = 1; } else { challengerState = uint256( keccak256(abi.encodePacked(challengerState)) ); entropy[proofIndex] = challengerState; } require(entropy[proofIndex] != 0, "Entropy should not be zero"); // here multiplication by 1 is implied publicInputAccumulators[0] = addmod( publicInputAccumulators[0], entropy[proofIndex], Utils.BN254_SCALAR_FIELD_MODULUS ); for (uint256 i = 0; i < numPublicInputs; i++) { require( allPis[proofIndex][i] < Utils.BN254_SCALAR_FIELD_MODULUS, "Malformed public input" ); // accumulate the exponent with extra entropy mod Utils.BN254_SCALAR_FIELD_MODULUS publicInputAccumulators[i + 1] = addmod( publicInputAccumulators[i + 1], mulmod( entropy[proofIndex], allPis[proofIndex][i], Utils.BN254_SCALAR_FIELD_MODULUS ), Utils.BN254_SCALAR_FIELD_MODULUS ); } } proofAsandAggegateC = new Pairing.G1Point[](numProofs + 1); proofAsandAggegateC[0] = proofs[0].A; // raise As from each proof to entropy[i] for (uint256 proofIndex = 1; proofIndex < numProofs; proofIndex++) { uint256 s = entropy[proofIndex]; proofAsandAggegateC[proofIndex] = Pairing.scalar_mul( proofs[proofIndex].A, s ); } // MSM(proofCs, entropy) Pairing.G1Point memory msmProduct = proofs[0].C; for (uint256 proofIndex = 1; proofIndex < numProofs; proofIndex++) { uint256 s = entropy[proofIndex]; Pairing.G1Point memory term = Pairing.scalar_mul( proofs[proofIndex].C, s ); msmProduct = Pairing.addition(msmProduct, term); } proofAsandAggegateC[numProofs] = msmProduct; return (proofAsandAggegateC, publicInputAccumulators); } function batchVerifyProofs( VerifyingKey memory vk, uint256[8][] memory proof8s, uint256[][] memory allPis ) internal view returns (bool success) { uint256 proof8sLength = proof8s.length; require( allPis.length == proof8sLength, "Invalid inputs length for a batch" ); Proof[] memory proofs = new Proof[](proof8sLength); for (uint256 i = 0; i < proof8sLength; i++) { proofs[i] = _proof8ToStruct(proof8s[i]); } // strategy is to accumulate entropy separately for some proof elements // (accumulate only for G1, can't in G2) of the pairing equation, as well as input verification key, // postpone scalar multiplication as much as possible and check only one equation // by using 3 + proofs.length pairings only plus 2*proofs.length + (num_inputs+1) + 1 scalar multiplications compared to naive // 4*proofs.length pairings and proofs.length*(num_inputs+1) scalar multiplications ( Pairing.G1Point[] memory proofAsandAggegateC, uint256[] memory publicInputAccumulators ) = accumulate(proofs, allPis); Pairing.G1Point[2] memory finalVKAlphaAndX = _prepareBatch( vk, publicInputAccumulators ); Pairing.G1Point[] memory p1s = new Pairing.G1Point[](proofs.length + 3); Pairing.G2Point[] memory p2s = new Pairing.G2Point[](proofs.length + 3); // first proofs.length pairings e(ProofA, ProofB) for ( uint256 proofNumber = 0; proofNumber < proofs.length; proofNumber++ ) { p1s[proofNumber] = proofAsandAggegateC[proofNumber]; p2s[proofNumber] = proofs[proofNumber].B; } // second pairing e(-finalVKaplha, vk.beta) p1s[proofs.length] = Pairing.negate(finalVKAlphaAndX[0]); p2s[proofs.length] = vk.beta2; // third pairing e(-finalVKx, vk.gamma) p1s[proofs.length + 1] = Pairing.negate(finalVKAlphaAndX[1]); p2s[proofs.length + 1] = vk.gamma2; // fourth pairing e(-proof.C, vk.delta) p1s[proofs.length + 2] = Pairing.negate( proofAsandAggegateC[proofs.length] ); p2s[proofs.length + 2] = vk.delta2; return Pairing.pairing(p1s, p2s); } function _prepareBatch( VerifyingKey memory vk, uint256[] memory publicInputAccumulators ) internal view returns (Pairing.G1Point[2] memory finalVKAlphaAndX) { // Compute the linear combination vk_x using accumulator // Performs an MSM(vkIC, publicInputAccumulators) Pairing.G1Point memory msmProduct = Pairing.scalar_mul( vk.IC[0], publicInputAccumulators[0] ); uint256 piAccumulatorsLength = publicInputAccumulators.length; for (uint256 i = 1; i < piAccumulatorsLength; i++) { Pairing.G1Point memory product = Pairing.scalar_mul( vk.IC[i], publicInputAccumulators[i] ); msmProduct = Pairing.addition(msmProduct, product); } finalVKAlphaAndX[1] = msmProduct; // add one extra memory slot for scalar for multiplication usage Pairing.G1Point memory finalVKalpha = vk.alpha1; finalVKalpha = Pairing.scalar_mul( finalVKalpha, publicInputAccumulators[0] ); finalVKAlphaAndX[0] = finalVKalpha; return finalVKAlphaAndX; } function _proof8ToStruct( uint256[8] memory proof ) internal pure returns (Proof memory) { return Groth16.Proof( Pairing.G1Point(proof[0], proof[1]), Pairing.G2Point([proof[2], proof[3]], [proof[4], proof[5]]), Pairing.G1Point(proof[6], proof[7]) ); } }
// Copyright 2017 Christian Reitwiessner // Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: // The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // 2019 OKIMS // ported to solidity 0.6 // fixed linter warnings // added requiere error messages // // // SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.2; library Pairing { struct G1Point { uint256 X; uint256 Y; } // Encoding of field elements is: X[0] * z + X[1] struct G2Point { uint256[2] X; uint256[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) { // Original code point return G2Point( [ 11559732032986387107991004021392285783925812861821192530917403151452391805634, 10857046999023057135944570762232829481370756359578518086990519993285655852781 ], [ 4082367875863433681332203403145435568316851327593401208105741076214120093531, 8495653923123431417604973247489272438418190587263600148770280649306958101930 ] ); /* // Changed by Jordi point return G2Point( [10857046999023057135944570762232829481370756359578518086990519993285655852781, 11559732032986387107991004021392285783925812861821192530917403151452391805634], [8495653923123431417604973247489272438418190587263600148770280649306958101930, 4082367875863433681332203403145435568316851327593401208105741076214120093531] ); */ } /// @return r the negation of p, i.e. p.addition(p.negate()) should be zero. function negate(G1Point memory p) internal pure returns (G1Point memory r) { // The prime q in the base field F_q for G1 uint256 q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; if (p.X == 0 && p.Y == 0) return G1Point(0, 0); return G1Point(p.X, q - (p.Y % q)); } /// @return r the sum of two points of G1 function addition( G1Point memory p1, G1Point memory p2 ) internal view returns (G1Point memory r) { uint256[4] memory input; input[0] = p1.X; input[1] = p1.Y; input[2] = p2.X; input[3] = p2.Y; bool success; // solium-disable-next-line security/no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 6, input, 0xc0, r, 0x60) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } require(success, "pairing-add-failed"); } /// @return r the product of a point on G1 and a scalar, i.e. /// p == p.scalar_mul(1) and p.addition(p) == p.scalar_mul(2) for all points p. function scalar_mul( G1Point memory p, uint256 s ) internal view returns (G1Point memory r) { uint256[3] memory input; input[0] = p.X; input[1] = p.Y; input[2] = s; bool success; // solium-disable-next-line security/no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 7, input, 0x80, r, 0x60) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } require(success, "pairing-mul-failed"); } /// @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, "pairing-lengths-failed"); uint256 elements = p1.length; uint256 inputSize = elements * 6; uint256[] memory input = new uint256[](inputSize); for (uint256 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]; } uint256[1] memory out; bool success; // solium-disable-next-line security/no-inline-assembly assembly { success := staticcall( sub(gas(), 2000), 8, add(input, 0x20), mul(inputSize, 0x20), out, 0x20 ) // Use "invalid" to make gas estimation work switch success case 0 { invalid() } } require(success, "pairing-opcode-failed"); 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); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; uint256 constant GAS_PER_JOINSPLIT_HANDLE = 110_000; // two 20k SSTOREs from NF insertions, ~70k for merkle tree checks + NF mapping checks + processing joinsplits not including tree insertions uint256 constant GAS_PER_INSERTION_SUBTREE_UPDATE = 25_000; // Full 16 leaf non-zero subtree update = 320k / 16 = 20k per insertion (+5k buffer) uint256 constant GAS_PER_INSERTION_ENQUEUE = 25_000; // 20k for enqueueing note commitment not including subtree update cost (+5k buffer) uint256 constant GAS_PER_OPERATION_MISC = 100_000; // remaining gas cost for operation including miscellaneous costs such as sending gas tokens to bundler, requesting assets from teller, sending tokens back for refunds, calldata, event, etc. uint256 constant ERC20_ID = 0; enum AssetType { ERC20, ERC721, ERC1155 } struct EncodedAsset { uint256 encodedAssetAddr; uint256 encodedAssetId; } struct CompressedStealthAddress { uint256 h1; uint256 h2; } struct EncryptedNote { bytes ciphertextBytes; bytes encapsulatedSecretBytes; } struct PublicJoinSplit { JoinSplit joinSplit; uint8 assetIndex; // Index in op.joinSplitAssets uint256 publicSpend; } struct JoinSplit { uint256 commitmentTreeRoot; uint256 nullifierA; uint256 nullifierB; uint256 newNoteACommitment; uint256 newNoteBCommitment; uint256 senderCommitment; uint256 joinSplitInfoCommitment; uint256[8] proof; EncryptedNote newNoteAEncrypted; EncryptedNote newNoteBEncrypted; } struct JoinSplitInfo { uint256 compressedSenderCanonAddr; uint256 compressedReceiverCanonAddr; uint256 oldMerkleIndicesWithSignBits; uint256 newNoteValueA; uint256 newNoteValueB; uint256 nonce; } struct EncodedNote { uint256 ownerH1; uint256 ownerH2; uint256 nonce; uint256 encodedAssetAddr; uint256 encodedAssetId; uint256 value; } struct DepositRequest { address spender; EncodedAsset encodedAsset; uint256 value; CompressedStealthAddress depositAddr; uint256 nonce; uint256 gasCompensation; } struct Deposit { address spender; EncodedAsset encodedAsset; uint256 value; CompressedStealthAddress depositAddr; } struct Action { address contractAddress; bytes encodedFunction; } struct TrackedAsset { EncodedAsset encodedAsset; uint256 minRefundValue; } struct Operation { PublicJoinSplit[] pubJoinSplits; JoinSplit[] confJoinSplits; CompressedStealthAddress refundAddr; TrackedAsset[] trackedAssets; Action[] actions; EncodedAsset encodedGasAsset; uint256 gasAssetRefundThreshold; uint256 executionGasLimit; uint256 gasPrice; uint256 deadline; bool atomicActions; } // An operation is processed if its joinsplitTxs are processed. // If an operation is processed, the following is guaranteeed to happen: // 1. Encoded calls are attempted (not necessarily successfully) // 2. The bundler is compensated verification and execution gas // Bundlers should only be submitting operations that can be processed. struct OperationResult { bool opProcessed; bool assetsUnwrapped; string failureReason; bool[] callSuccesses; bytes[] callResults; uint256 verificationGas; uint256 executionGas; uint256 numRefunds; uint128 preOpMerkleCount; uint128 postOpMerkleCount; } struct Bundle { Operation[] operations; } struct CanonAddrRegistryEntry { address ethAddress; uint256 compressedCanonAddr; uint256 perCanonAddrNonce; } library OperationLib { function maxGasLimit( Operation calldata self, uint256 perJoinSplitVerifyGas ) internal pure returns (uint256) { uint256 numJoinSplits = totalNumJoinSplits(self); return self.executionGasLimit + ((perJoinSplitVerifyGas + GAS_PER_JOINSPLIT_HANDLE) * numJoinSplits) + ((GAS_PER_INSERTION_SUBTREE_UPDATE + GAS_PER_INSERTION_ENQUEUE) * (self.trackedAssets.length + (numJoinSplits * 2))) + // NOTE: assume refund for every asset GAS_PER_OPERATION_MISC; } function maxGasAssetCost( Operation calldata self, uint256 perJoinSplitVerifyGas ) internal pure returns (uint256) { return self.gasPrice * maxGasLimit(self, perJoinSplitVerifyGas); } function totalNumJoinSplits( Operation calldata self ) internal pure returns (uint256) { return self.pubJoinSplits.length + self.confJoinSplits.length; } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity ^0.8.17; import {ITeller} from "../interfaces/ITeller.sol"; import {Groth16} from "../libs/Groth16.sol"; import {Pairing} from "../libs/Pairing.sol"; import "../libs/Types.sol"; // helpers for converting to/from field elems, uint256s, and/or bytes, and hashing them library Utils { uint256 public constant BN254_SCALAR_FIELD_MODULUS = 21888242871839275222246405745257275088548364400416034343698204186575808495617; uint256 constant COMPRESSED_POINT_SIGN_MASK = 1 << 254; // takes a compressed point and extracts the sign bit and y coordinate // returns (sign, y) function decomposeCompressedPoint( uint256 compressedPoint ) internal pure returns (uint256 sign, uint256 y) { sign = (compressedPoint & COMPRESSED_POINT_SIGN_MASK) >> 254; y = compressedPoint & (COMPRESSED_POINT_SIGN_MASK - 1); return (sign, y); } // return the minimum of the two values function min(uint256 a, uint256 b) internal pure returns (uint256) { return (a >= b) ? b : a; } function sum(uint256[] calldata arr) internal pure returns (uint256) { uint256 total = 0; uint256 arrLength = arr.length; for (uint256 i = 0; i < arrLength; i++) { total += arr[i]; } return total; } }
{ "optimizer": { "enabled": true, "runs": 500 }, "metadata": { "bytecodeHash": "none" }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256[8][]","name":"proofs","type":"uint256[8][]"},{"internalType":"uint256[][]","name":"allPis","type":"uint256[][]"}],"name":"batchVerifyProofs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"proof","type":"uint256[8]"},{"internalType":"uint256[]","name":"pi","type":"uint256[]"}],"name":"verifyProof","outputs":[{"internalType":"bool","name":"r","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506123de806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80635067e8261461003b578063a5e432f414610062575b600080fd5b61004e6100493660046120e3565b610075565b604051901515815260200160405180910390f35b61004e6100703660046121b4565b610092565b60006100896100826100a6565b84846109d6565b90505b92915050565b600061008961009f6100a6565b8484610baa565b6100ae611e2c565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f0f5e5f13e1b9dd3ecadf667f728289229505179c6e09f3cfa7d633b8c4826a3d8185019081527f02f5caecc21b94bf05ba61d40d5abbb12357473d62990affabefedfea779298a828401528152835180850185527f1dcbe2d9adf7eacc95cf6140b18dc020db34b5b19d9318dfd4c2886e67c9192181527f1c464998b369a862c6cfe9698ef2db4a54c7ee357a7af52a471d830ddf8824398185015281840152908401528151600e8082526101e08201909352919082015b604080518082019091526000808252602082015281526020019060019003908161032a57505060808201908152604080518082019091527f150ef3649db3c96500cf0613e528eef8bcae45f5b15fb4dfc81f46a96d8a861181527f2c7f27f1b1311f4dd8b3f5fa4f09daea4013079319594357337a24db950ac1036020820152905180516000906103bd576103bd61226f565b602002602001018190525060405180604001604052807f0fa525f50935bd6426b6c7403f11bac60e2dd1e90e1ed5296dc96bd9c819de8381526020017f07b003503b773a573858ea0735213d66f3bcc029edac029c786e6e12722a804f81525081608001516001815181106104345761043461226f565b602002602001018190525060405180604001604052807f255ecc69a96c6df9c7a07710843c49d3b94a5a3ceb91f0d63dbac8d63d00c39681526020017f1b13379272b96d5ccb41352b5d7a934f9514fa4784bdf61d6d163179ac121be381525081608001516002815181106104ab576104ab61226f565b602002602001018190525060405180604001604052807f20e99fabe0c5d1dfdbd58344943b8fff3cbcd54d1584f4966b3deec62fbadca281526020017f29c3c11edbeedfe02cf51eea8b5e44a99178635d46801e5b7fd1f9f9bcdc1f3881525081608001516003815181106105225761052261226f565b602002602001018190525060405180604001604052807f08a04f2ee188b8d8b9d530f490a43587ac4d8bc9609425cd4c04f71d6e7531c381526020017f067e9128b4d0d0db5875656ce667c16523cf026f7fc14c2ae694a2de33c7f11881525081608001516004815181106105995761059961226f565b602002602001018190525060405180604001604052807f191906065b89e3de27b6e654f29c4fae03bf27ffe6d900126b2de4bd849567ce81526020017f2bdd35a31c054bf0f22131ffa7bc9e90b83b7604b24dcb9841175369a3e2a68f81525081608001516005815181106106105761061061226f565b602002602001018190525060405180604001604052807f08159be09c766c6dc0a4c85ffc79ca4eccd14fe9d0a6f9704ef9144b29bfebac81526020017f28e7ccff43d8bc77c6cf08e2e0be300d0eb9eb9548c940cd7128fa1173b18d2181525081608001516006815181106106875761068761226f565b602002602001018190525060405180604001604052807f0eeec1f9e66d585d7b972a04e5faa2dc27ed5bf2413140a47c7166c10fbc7ff681526020017f25ef851352fd3491c3d10a88e643d5b0053bdf12afafa2bccc3ea7213dead3f681525081608001516007815181106106fe576106fe61226f565b602002602001018190525060405180604001604052807f117be4cbfebbb7cf3158af59d1fa809eb61ccb3001040c55c5f5c1412803d84f81526020017f18664e3471cedd8a94b4a91cf57315a4de3157612ce600a46716042cc8d75ca381525081608001516008815181106107755761077561226f565b602002602001018190525060405180604001604052807f02d23edc3e530b7651e8b2fd8e1d597db1ec1ee1ff3055d4a2091aa0e0fff27881526020017f0574e16785e01a1dbb092aea5b5e50ad60978c0be79bf2fa47334fd95b9e615781525081608001516009815181106107ec576107ec61226f565b602002602001018190525060405180604001604052807f06b3c364cc477ad1c7ecbbd1809f7cda8e2e9f0271a142fca3fb04169543dcc781526020017f18ae8613b0033ba663fde30bd2c68db3bca38c197accb95eb92603441e08ca778152508160800151600a815181106108635761086361226f565b602002602001018190525060405180604001604052807f2b1e217f0794aa4350eeb9bc79625d26ff94364965a56f4b86091e533727e6ce81526020017f1b4f45effc7fddf54ef35991e7f672594b5f078684286091b79aebe47283503a8152508160800151600b815181106108da576108da61226f565b602002602001018190525060405180604001604052807f1974cd9cb7566cad42fa2054fa969a04606a7cd1a8262dcc2ebc45b67cf0c00e81526020017f2a4c42e897ff6032f21cefd1930af3949bf178deb11cf6f898e292e3a189d5c88152508160800151600c815181106109515761095161226f565b602002602001018190525060405180604001604052807f094ed8405e1116a7cb4395481c7429ce97037d8967d752eca01670215ff9165e81526020017f2edc1a096f92f0e059aae5a6ad53a1a6a098587a6a9f6d09692c776cdb4770488152508160800151600d815181106109c8576109c861226f565b602002602001018190525090565b6000815160016109e6919061229b565b84608001515114610a3e5760405162461bcd60e51b815260206004820152601d60248201527f5075626c696320696e707574206c656e677468206d69736d617463682e00000060448201526064015b60405180910390fd5b60008460800151600081518110610a5757610a5761226f565b6020026020010151905060005b8351811015610b5e577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848281518110610aa057610aa061226f565b602002602001015110610af55760405162461bcd60e51b815260206004820152601760248201527f4d616c666f726d6564207075626c696320696e7075742e0000000000000000006044820152606401610a35565b610b4a82610b458860800151846001610b0e919061229b565b81518110610b1e57610b1e61226f565b6020026020010151878581518110610b3857610b3861226f565b6020026020010151610f8f565b611030565b915080610b56816122ae565b915050610a64565b506000610b6a856110d4565b9050610ba0610b7c8260000151611165565b826020015188600001518960200151868b6040015187604001518d60600151611204565b9695505050505050565b81518151600091908114610c0a5760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420696e70757473206c656e67746820666f72206120626174636044820152600d60fb1b6064820152608401610a35565b60008167ffffffffffffffff811115610c2557610c25611f9f565b604051908082528060200260200182016040528015610c5e57816020015b610c4b611e7d565b815260200190600190039081610c435790505b50905060005b82811015610cbe57610c8e868281518110610c8157610c8161226f565b60200260200101516110d4565b828281518110610ca057610ca061226f565b60200260200101819052508080610cb6906122ae565b915050610c64565b50600080610ccc838761136b565b915091506000610cdc89836119f0565b9050600084516003610cee919061229b565b67ffffffffffffffff811115610d0657610d06611f9f565b604051908082528060200260200182016040528015610d4b57816020015b6040805180820190915260008082526020820152815260200190600190039081610d245790505b509050600085516003610d5e919061229b565b67ffffffffffffffff811115610d7657610d76611f9f565b604051908082528060200260200182016040528015610daf57816020015b610d9c611ece565b815260200190600190039081610d945790505b50905060005b8651811015610e4357858181518110610dd057610dd061226f565b6020026020010151838281518110610dea57610dea61226f565b6020026020010181905250868181518110610e0757610e0761226f565b602002602001015160200151828281518110610e2557610e2561226f565b60200260200101819052508080610e3b906122ae565b915050610db5565b50610e558360005b6020020151611165565b82875181518110610e6857610e6861226f565b60200260200101819052508a6020015181875181518110610e8b57610e8b61226f565b6020908102919091010152610ea1836001610e4b565b8287516001610eb0919061229b565b81518110610ec057610ec061226f565b60200260200101819052508a604001518187516001610edf919061229b565b81518110610eef57610eef61226f565b6020026020010181905250610f1d85875181518110610f1057610f1061226f565b6020026020010151611165565b8287516002610f2c919061229b565b81518110610f3c57610f3c61226f565b60200260200101819052508a606001518187516002610f5b919061229b565b81518110610f6b57610f6b61226f565b6020026020010181905250610f808282611ac5565b9b9a5050505050505050505050565b6040805180820190915260008082526020820152610fab611eee565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610fda57fe5b50806110285760405162461bcd60e51b815260206004820152601260248201527f70616972696e672d6d756c2d6661696c656400000000000000000000000000006044820152606401610a35565b505092915050565b604080518082019091526000808252602082015261104c611f0c565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061108657fe5b50806110285760405162461bcd60e51b815260206004820152601260248201527f70616972696e672d6164642d6661696c656400000000000000000000000000006044820152606401610a35565b6110dc611e7d565b506040805160a08082018352835160608084019182526020808701516080808701919091529285528551808401875287870151818801908152838901519382019390935291825285518087018752928701518352928601518284015280830191909152818301528251808401845260c0850151815260e090940151908401529081019190915290565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47901580156111ac57506020830151155b156111cc5750506040805180820190915260008082526020820152919050565b6040518060400160405280846000015181526020018285602001516111f191906122c7565b6111fb90846122e9565b90529392505050565b60408051600480825260a08201909252600091829190816020015b604080518082019091526000808252602082015281526020019060019003908161121f57505060408051600480825260a0820190925291925060009190602082015b611269611ece565b8152602001906001900390816112615790505090508a826000815181106112925761129261226f565b602002602001018190525088826001815181106112b1576112b161226f565b602002602001018190525086826002815181106112d0576112d061226f565b602002602001018190525084826003815181106112ef576112ef61226f565b6020026020010181905250898160008151811061130e5761130e61226f565b6020026020010181905250878160018151811061132d5761132d61226f565b6020026020010181905250858160028151811061134c5761134c61226f565b60200260200101819052508381600381518110610f6b57610f6b61226f565b80518251606091829160008581846113855761138561226f565b60200260200101515190506000600190505b83811015611440578681815181106113b1576113b161226f565b602002602001015151821461142e5760405162461bcd60e51b815260206004820152603060248201527f5075626c696320696e707574206d69736d6174636820647572696e672062617460448201527f636820766572696669636174696f6e2e000000000000000000000000000000006064820152608401610a35565b80611438816122ae565b915050611397565b5060008267ffffffffffffffff81111561145c5761145c611f9f565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50905061149382600161229b565b67ffffffffffffffff8111156114ab576114ab611f9f565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b5094506000886114e56001436122e9565b406040516020016114f7929190612325565b6040516020818303038152906040528051906020012060001c905060005b848110156117fd578060000361154a5760018382815181106115395761153961226f565b602002602001018181525050611591565b6040805160208101849052016040516020818303038152906040528051906020012060001c9150818382815181106115845761158461226f565b6020026020010181815250505b8281815181106115a3576115a361226f565b60200260200101516000036115fa5760405162461bcd60e51b815260206004820152601a60248201527f456e74726f70792073686f756c64206e6f74206265207a65726f0000000000006044820152606401610a35565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183828151811061162d5761162d61226f565b6020026020010151886000815181106116485761164861226f565b602002602001015108876000815181106116645761166461226f565b60200260200101818152505060005b848110156117ea577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018a83815181106116ae576116ae61226f565b602002602001015182815181106116c7576116c761226f565b60200260200101511061171c5760405162461bcd60e51b815260206004820152601660248201527f4d616c666f726d6564207075626c696320696e707574000000000000000000006044820152606401610a35565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001808b84815181106117505761175061226f565b602002602001015183815181106117695761176961226f565b60200260200101518685815181106117835761178361226f565b6020026020010151098961179884600161229b565b815181106117a8576117a861226f565b602002602001015108886117bd83600161229b565b815181106117cd576117cd61226f565b6020908102919091010152806117e2816122ae565b915050611673565b50806117f5816122ae565b915050611515565b5061180984600161229b565b67ffffffffffffffff81111561182157611821611f9f565b60405190808252806020026020018201604052801561186657816020015b604080518082019091526000808252602082015281526020019060019003908161183f5790505b5096508860008151811061187c5761187c61226f565b6020026020010151600001518760008151811061189b5761189b61226f565b602090810291909101015260015b848110156119275760008382815181106118c5576118c561226f565b602002602001015190506118f68b83815181106118e4576118e461226f565b60200260200101516000015182610f8f565b8983815181106119085761190861226f565b602002602001018190525050808061191f906122ae565b9150506118a9565b5060008960008151811061193d5761193d61226f565b60200260200101516040015190506000600190505b858110156119c457600084828151811061196e5761196e61226f565b6020026020010151905060006119a18d848151811061198f5761198f61226f565b60200260200101516040015183610f8f565b90506119ad8482611030565b9350505080806119bc906122ae565b915050611952565b50808886815181106119d8576119d861226f565b60200260200101819052505050505050509250929050565b6119f8611f2a565b6000611a2f8460800151600081518110611a1457611a1461226f565b602002602001015184600081518110610b3857610b3861226f565b835190915060015b81811015611a96576000611a7487608001518381518110611a5a57611a5a61226f565b6020026020010151878481518110610b3857610b3861226f565b9050611a808482611030565b9350508080611a8e906122ae565b915050611a37565b506020830182905284518451611ab99082908790600090610b3857610b3861226f565b84525091949350505050565b60008151835114611b185760405162461bcd60e51b815260206004820152601660248201527f70616972696e672d6c656e677468732d6661696c6564000000000000000000006044820152606401610a35565b82516000611b278260066123ba565b905060008167ffffffffffffffff811115611b4457611b44611f9f565b604051908082528060200260200182016040528015611b6d578160200160208202803683370190505b50905060005b83811015611da857868181518110611b8d57611b8d61226f565b60200260200101516000015182826006611ba791906123ba565b611bb290600061229b565b81518110611bc257611bc261226f565b602002602001018181525050868181518110611be057611be061226f565b60200260200101516020015182826006611bfa91906123ba565b611c0590600161229b565b81518110611c1557611c1561226f565b602002602001018181525050858181518110611c3357611c3361226f565b6020908102919091010151515182611c4c8360066123ba565b611c5790600261229b565b81518110611c6757611c6761226f565b602002602001018181525050858181518110611c8557611c8561226f565b60209081029190910181015151015182611ca08360066123ba565b611cab90600361229b565b81518110611cbb57611cbb61226f565b602002602001018181525050858181518110611cd957611cd961226f565b602002602001015160200151600060028110611cf757611cf761226f565b602002015182611d088360066123ba565b611d1390600461229b565b81518110611d2357611d2361226f565b602002602001018181525050858181518110611d4157611d4161226f565b602002602001015160200151600160028110611d5f57611d5f61226f565b602002015182611d708360066123ba565b611d7b90600561229b565b81518110611d8b57611d8b61226f565b602090810291909101015280611da0816122ae565b915050611b73565b50611db1611f63565b6000602082602086026020860160086107d05a03fa90508080611dd057fe5b5080611e1e5760405162461bcd60e51b815260206004820152601560248201527f70616972696e672d6f70636f64652d6661696c656400000000000000000000006044820152606401610a35565b505115159695505050505050565b6040805160e08101909152600060a0820181815260c0830191909152815260208101611e56611ece565b8152602001611e63611ece565b8152602001611e70611ece565b8152602001606081525090565b6040805160a081019091526000606082018181526080830191909152815260208101611ea7611ece565b8152602001611ec9604051806040016040528060008152602001600081525090565b905290565b6040518060400160405280611ee1611f81565b8152602001611ec9611f81565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002905b6040805180820190915260008082526020820152815260200190600190039081611f395790505090565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611fde57611fde611f9f565b604052919050565b600082601f830112611ff757600080fd5b60405161010080820182811067ffffffffffffffff8211171561201c5761201c611f9f565b6040528301818582111561202f57600080fd5b845b82811015612049578035825260209182019101612031565b509195945050505050565b600067ffffffffffffffff82111561206e5761206e611f9f565b5060051b60200190565b600082601f83011261208957600080fd5b8135602061209e61209983612054565b611fb5565b82815260059290921b840181019181810190868411156120bd57600080fd5b8286015b848110156120d857803583529183019183016120c1565b509695505050505050565b60008061012083850312156120f757600080fd5b6121018484611fe6565b915061010083013567ffffffffffffffff81111561211e57600080fd5b61212a85828601612078565b9150509250929050565b600082601f83011261214557600080fd5b8135602061215561209983612054565b82815260059290921b8401810191818101908684111561217457600080fd5b8286015b848110156120d857803567ffffffffffffffff8111156121985760008081fd5b6121a68986838b0101612078565b845250918301918301612178565b600080604083850312156121c757600080fd5b823567ffffffffffffffff808211156121df57600080fd5b818501915085601f8301126121f357600080fd5b8135602061220361209983612054565b82815260089290921b8401810191818101908984111561222257600080fd5b948201945b8386101561224c576122398a87611fe6565b8252828201915061010086019550612227565b9650508601359250508082111561226257600080fd5b5061212a85828601612134565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561008c5761008c612285565b6000600182016122c0576122c0612285565b5060010190565b6000826122e457634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561008c5761008c612285565b8060005b600281101561231f578151845260209384019390910190600101612300565b50505050565b60408082528351828201819052600091906020906060850190828801855b828110156123aa57815161236285825180518252602090810151910152565b8581015161237388870182516122fc565b86015161238360808701826122fc565b50860151805160c08601526020015160e08501526101009093019290840190600101612343565b5050509301939093525092915050565b808202811582820484141761008c5761008c61228556fea164736f6c6343000811000a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100365760003560e01c80635067e8261461003b578063a5e432f414610062575b600080fd5b61004e6100493660046120e3565b610075565b604051901515815260200160405180910390f35b61004e6100703660046121b4565b610092565b60006100896100826100a6565b84846109d6565b90505b92915050565b600061008961009f6100a6565b8484610baa565b6100ae611e2c565b6040805180820182527f2d4d9aa7e302d9df41749d5507949d05dbea33fbb16c643b22f599a2be6df2e281527f14bedd503c37ceb061d8ec60209fe345ce89830a19230301f076caff004d19266020808301919091529083528151608080820184527f0967032fcbf776d1afc985f88877f182d38480a653f2decaa9794cbc3bf3060c8285019081527f0e187847ad4c798374d0d6732bf501847dd68bc0e071241e0213bc7fc13db7ab606080850191909152908352845180860186527f304cfbd1e08a704a99f5e847d93f8c3caafddec46b7a0d379da69a4d112346a781527f1739c1b1a457a8c7313123d24d2f9192f896b7c63eea05a9d57f06547ad0cec8818601528385015285840192909252835180820185527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c28186019081527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed828501528152845180860186527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa818601528185015285850152835190810184527f0f5e5f13e1b9dd3ecadf667f728289229505179c6e09f3cfa7d633b8c4826a3d8185019081527f02f5caecc21b94bf05ba61d40d5abbb12357473d62990affabefedfea779298a828401528152835180850185527f1dcbe2d9adf7eacc95cf6140b18dc020db34b5b19d9318dfd4c2886e67c9192181527f1c464998b369a862c6cfe9698ef2db4a54c7ee357a7af52a471d830ddf8824398185015281840152908401528151600e8082526101e08201909352919082015b604080518082019091526000808252602082015281526020019060019003908161032a57505060808201908152604080518082019091527f150ef3649db3c96500cf0613e528eef8bcae45f5b15fb4dfc81f46a96d8a861181527f2c7f27f1b1311f4dd8b3f5fa4f09daea4013079319594357337a24db950ac1036020820152905180516000906103bd576103bd61226f565b602002602001018190525060405180604001604052807f0fa525f50935bd6426b6c7403f11bac60e2dd1e90e1ed5296dc96bd9c819de8381526020017f07b003503b773a573858ea0735213d66f3bcc029edac029c786e6e12722a804f81525081608001516001815181106104345761043461226f565b602002602001018190525060405180604001604052807f255ecc69a96c6df9c7a07710843c49d3b94a5a3ceb91f0d63dbac8d63d00c39681526020017f1b13379272b96d5ccb41352b5d7a934f9514fa4784bdf61d6d163179ac121be381525081608001516002815181106104ab576104ab61226f565b602002602001018190525060405180604001604052807f20e99fabe0c5d1dfdbd58344943b8fff3cbcd54d1584f4966b3deec62fbadca281526020017f29c3c11edbeedfe02cf51eea8b5e44a99178635d46801e5b7fd1f9f9bcdc1f3881525081608001516003815181106105225761052261226f565b602002602001018190525060405180604001604052807f08a04f2ee188b8d8b9d530f490a43587ac4d8bc9609425cd4c04f71d6e7531c381526020017f067e9128b4d0d0db5875656ce667c16523cf026f7fc14c2ae694a2de33c7f11881525081608001516004815181106105995761059961226f565b602002602001018190525060405180604001604052807f191906065b89e3de27b6e654f29c4fae03bf27ffe6d900126b2de4bd849567ce81526020017f2bdd35a31c054bf0f22131ffa7bc9e90b83b7604b24dcb9841175369a3e2a68f81525081608001516005815181106106105761061061226f565b602002602001018190525060405180604001604052807f08159be09c766c6dc0a4c85ffc79ca4eccd14fe9d0a6f9704ef9144b29bfebac81526020017f28e7ccff43d8bc77c6cf08e2e0be300d0eb9eb9548c940cd7128fa1173b18d2181525081608001516006815181106106875761068761226f565b602002602001018190525060405180604001604052807f0eeec1f9e66d585d7b972a04e5faa2dc27ed5bf2413140a47c7166c10fbc7ff681526020017f25ef851352fd3491c3d10a88e643d5b0053bdf12afafa2bccc3ea7213dead3f681525081608001516007815181106106fe576106fe61226f565b602002602001018190525060405180604001604052807f117be4cbfebbb7cf3158af59d1fa809eb61ccb3001040c55c5f5c1412803d84f81526020017f18664e3471cedd8a94b4a91cf57315a4de3157612ce600a46716042cc8d75ca381525081608001516008815181106107755761077561226f565b602002602001018190525060405180604001604052807f02d23edc3e530b7651e8b2fd8e1d597db1ec1ee1ff3055d4a2091aa0e0fff27881526020017f0574e16785e01a1dbb092aea5b5e50ad60978c0be79bf2fa47334fd95b9e615781525081608001516009815181106107ec576107ec61226f565b602002602001018190525060405180604001604052807f06b3c364cc477ad1c7ecbbd1809f7cda8e2e9f0271a142fca3fb04169543dcc781526020017f18ae8613b0033ba663fde30bd2c68db3bca38c197accb95eb92603441e08ca778152508160800151600a815181106108635761086361226f565b602002602001018190525060405180604001604052807f2b1e217f0794aa4350eeb9bc79625d26ff94364965a56f4b86091e533727e6ce81526020017f1b4f45effc7fddf54ef35991e7f672594b5f078684286091b79aebe47283503a8152508160800151600b815181106108da576108da61226f565b602002602001018190525060405180604001604052807f1974cd9cb7566cad42fa2054fa969a04606a7cd1a8262dcc2ebc45b67cf0c00e81526020017f2a4c42e897ff6032f21cefd1930af3949bf178deb11cf6f898e292e3a189d5c88152508160800151600c815181106109515761095161226f565b602002602001018190525060405180604001604052807f094ed8405e1116a7cb4395481c7429ce97037d8967d752eca01670215ff9165e81526020017f2edc1a096f92f0e059aae5a6ad53a1a6a098587a6a9f6d09692c776cdb4770488152508160800151600d815181106109c8576109c861226f565b602002602001018190525090565b6000815160016109e6919061229b565b84608001515114610a3e5760405162461bcd60e51b815260206004820152601d60248201527f5075626c696320696e707574206c656e677468206d69736d617463682e00000060448201526064015b60405180910390fd5b60008460800151600081518110610a5757610a5761226f565b6020026020010151905060005b8351811015610b5e577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001848281518110610aa057610aa061226f565b602002602001015110610af55760405162461bcd60e51b815260206004820152601760248201527f4d616c666f726d6564207075626c696320696e7075742e0000000000000000006044820152606401610a35565b610b4a82610b458860800151846001610b0e919061229b565b81518110610b1e57610b1e61226f565b6020026020010151878581518110610b3857610b3861226f565b6020026020010151610f8f565b611030565b915080610b56816122ae565b915050610a64565b506000610b6a856110d4565b9050610ba0610b7c8260000151611165565b826020015188600001518960200151868b6040015187604001518d60600151611204565b9695505050505050565b81518151600091908114610c0a5760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420696e70757473206c656e67746820666f72206120626174636044820152600d60fb1b6064820152608401610a35565b60008167ffffffffffffffff811115610c2557610c25611f9f565b604051908082528060200260200182016040528015610c5e57816020015b610c4b611e7d565b815260200190600190039081610c435790505b50905060005b82811015610cbe57610c8e868281518110610c8157610c8161226f565b60200260200101516110d4565b828281518110610ca057610ca061226f565b60200260200101819052508080610cb6906122ae565b915050610c64565b50600080610ccc838761136b565b915091506000610cdc89836119f0565b9050600084516003610cee919061229b565b67ffffffffffffffff811115610d0657610d06611f9f565b604051908082528060200260200182016040528015610d4b57816020015b6040805180820190915260008082526020820152815260200190600190039081610d245790505b509050600085516003610d5e919061229b565b67ffffffffffffffff811115610d7657610d76611f9f565b604051908082528060200260200182016040528015610daf57816020015b610d9c611ece565b815260200190600190039081610d945790505b50905060005b8651811015610e4357858181518110610dd057610dd061226f565b6020026020010151838281518110610dea57610dea61226f565b6020026020010181905250868181518110610e0757610e0761226f565b602002602001015160200151828281518110610e2557610e2561226f565b60200260200101819052508080610e3b906122ae565b915050610db5565b50610e558360005b6020020151611165565b82875181518110610e6857610e6861226f565b60200260200101819052508a6020015181875181518110610e8b57610e8b61226f565b6020908102919091010152610ea1836001610e4b565b8287516001610eb0919061229b565b81518110610ec057610ec061226f565b60200260200101819052508a604001518187516001610edf919061229b565b81518110610eef57610eef61226f565b6020026020010181905250610f1d85875181518110610f1057610f1061226f565b6020026020010151611165565b8287516002610f2c919061229b565b81518110610f3c57610f3c61226f565b60200260200101819052508a606001518187516002610f5b919061229b565b81518110610f6b57610f6b61226f565b6020026020010181905250610f808282611ac5565b9b9a5050505050505050505050565b6040805180820190915260008082526020820152610fab611eee565b835181526020808501519082015260408101839052600060608360808460076107d05a03fa90508080610fda57fe5b50806110285760405162461bcd60e51b815260206004820152601260248201527f70616972696e672d6d756c2d6661696c656400000000000000000000000000006044820152606401610a35565b505092915050565b604080518082019091526000808252602082015261104c611f0c565b8351815260208085015181830152835160408301528301516060808301919091526000908360c08460066107d05a03fa9050808061108657fe5b50806110285760405162461bcd60e51b815260206004820152601260248201527f70616972696e672d6164642d6661696c656400000000000000000000000000006044820152606401610a35565b6110dc611e7d565b506040805160a08082018352835160608084019182526020808701516080808701919091529285528551808401875287870151818801908152838901519382019390935291825285518087018752928701518352928601518284015280830191909152818301528251808401845260c0850151815260e090940151908401529081019190915290565b604080518082019091526000808252602082015281517f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47901580156111ac57506020830151155b156111cc5750506040805180820190915260008082526020820152919050565b6040518060400160405280846000015181526020018285602001516111f191906122c7565b6111fb90846122e9565b90529392505050565b60408051600480825260a08201909252600091829190816020015b604080518082019091526000808252602082015281526020019060019003908161121f57505060408051600480825260a0820190925291925060009190602082015b611269611ece565b8152602001906001900390816112615790505090508a826000815181106112925761129261226f565b602002602001018190525088826001815181106112b1576112b161226f565b602002602001018190525086826002815181106112d0576112d061226f565b602002602001018190525084826003815181106112ef576112ef61226f565b6020026020010181905250898160008151811061130e5761130e61226f565b6020026020010181905250878160018151811061132d5761132d61226f565b6020026020010181905250858160028151811061134c5761134c61226f565b60200260200101819052508381600381518110610f6b57610f6b61226f565b80518251606091829160008581846113855761138561226f565b60200260200101515190506000600190505b83811015611440578681815181106113b1576113b161226f565b602002602001015151821461142e5760405162461bcd60e51b815260206004820152603060248201527f5075626c696320696e707574206d69736d6174636820647572696e672062617460448201527f636820766572696669636174696f6e2e000000000000000000000000000000006064820152608401610a35565b80611438816122ae565b915050611397565b5060008267ffffffffffffffff81111561145c5761145c611f9f565b604051908082528060200260200182016040528015611485578160200160208202803683370190505b50905061149382600161229b565b67ffffffffffffffff8111156114ab576114ab611f9f565b6040519080825280602002602001820160405280156114d4578160200160208202803683370190505b5094506000886114e56001436122e9565b406040516020016114f7929190612325565b6040516020818303038152906040528051906020012060001c905060005b848110156117fd578060000361154a5760018382815181106115395761153961226f565b602002602001018181525050611591565b6040805160208101849052016040516020818303038152906040528051906020012060001c9150818382815181106115845761158461226f565b6020026020010181815250505b8281815181106115a3576115a361226f565b60200260200101516000036115fa5760405162461bcd60e51b815260206004820152601a60248201527f456e74726f70792073686f756c64206e6f74206265207a65726f0000000000006044820152606401610a35565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f000000183828151811061162d5761162d61226f565b6020026020010151886000815181106116485761164861226f565b602002602001015108876000815181106116645761166461226f565b60200260200101818152505060005b848110156117ea577f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f00000018a83815181106116ae576116ae61226f565b602002602001015182815181106116c7576116c761226f565b60200260200101511061171c5760405162461bcd60e51b815260206004820152601660248201527f4d616c666f726d6564207075626c696320696e707574000000000000000000006044820152606401610a35565b7f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001808b84815181106117505761175061226f565b602002602001015183815181106117695761176961226f565b60200260200101518685815181106117835761178361226f565b6020026020010151098961179884600161229b565b815181106117a8576117a861226f565b602002602001015108886117bd83600161229b565b815181106117cd576117cd61226f565b6020908102919091010152806117e2816122ae565b915050611673565b50806117f5816122ae565b915050611515565b5061180984600161229b565b67ffffffffffffffff81111561182157611821611f9f565b60405190808252806020026020018201604052801561186657816020015b604080518082019091526000808252602082015281526020019060019003908161183f5790505b5096508860008151811061187c5761187c61226f565b6020026020010151600001518760008151811061189b5761189b61226f565b602090810291909101015260015b848110156119275760008382815181106118c5576118c561226f565b602002602001015190506118f68b83815181106118e4576118e461226f565b60200260200101516000015182610f8f565b8983815181106119085761190861226f565b602002602001018190525050808061191f906122ae565b9150506118a9565b5060008960008151811061193d5761193d61226f565b60200260200101516040015190506000600190505b858110156119c457600084828151811061196e5761196e61226f565b6020026020010151905060006119a18d848151811061198f5761198f61226f565b60200260200101516040015183610f8f565b90506119ad8482611030565b9350505080806119bc906122ae565b915050611952565b50808886815181106119d8576119d861226f565b60200260200101819052505050505050509250929050565b6119f8611f2a565b6000611a2f8460800151600081518110611a1457611a1461226f565b602002602001015184600081518110610b3857610b3861226f565b835190915060015b81811015611a96576000611a7487608001518381518110611a5a57611a5a61226f565b6020026020010151878481518110610b3857610b3861226f565b9050611a808482611030565b9350508080611a8e906122ae565b915050611a37565b506020830182905284518451611ab99082908790600090610b3857610b3861226f565b84525091949350505050565b60008151835114611b185760405162461bcd60e51b815260206004820152601660248201527f70616972696e672d6c656e677468732d6661696c6564000000000000000000006044820152606401610a35565b82516000611b278260066123ba565b905060008167ffffffffffffffff811115611b4457611b44611f9f565b604051908082528060200260200182016040528015611b6d578160200160208202803683370190505b50905060005b83811015611da857868181518110611b8d57611b8d61226f565b60200260200101516000015182826006611ba791906123ba565b611bb290600061229b565b81518110611bc257611bc261226f565b602002602001018181525050868181518110611be057611be061226f565b60200260200101516020015182826006611bfa91906123ba565b611c0590600161229b565b81518110611c1557611c1561226f565b602002602001018181525050858181518110611c3357611c3361226f565b6020908102919091010151515182611c4c8360066123ba565b611c5790600261229b565b81518110611c6757611c6761226f565b602002602001018181525050858181518110611c8557611c8561226f565b60209081029190910181015151015182611ca08360066123ba565b611cab90600361229b565b81518110611cbb57611cbb61226f565b602002602001018181525050858181518110611cd957611cd961226f565b602002602001015160200151600060028110611cf757611cf761226f565b602002015182611d088360066123ba565b611d1390600461229b565b81518110611d2357611d2361226f565b602002602001018181525050858181518110611d4157611d4161226f565b602002602001015160200151600160028110611d5f57611d5f61226f565b602002015182611d708360066123ba565b611d7b90600561229b565b81518110611d8b57611d8b61226f565b602090810291909101015280611da0816122ae565b915050611b73565b50611db1611f63565b6000602082602086026020860160086107d05a03fa90508080611dd057fe5b5080611e1e5760405162461bcd60e51b815260206004820152601560248201527f70616972696e672d6f70636f64652d6661696c656400000000000000000000006044820152606401610a35565b505115159695505050505050565b6040805160e08101909152600060a0820181815260c0830191909152815260208101611e56611ece565b8152602001611e63611ece565b8152602001611e70611ece565b8152602001606081525090565b6040805160a081019091526000606082018181526080830191909152815260208101611ea7611ece565b8152602001611ec9604051806040016040528060008152602001600081525090565b905290565b6040518060400160405280611ee1611f81565b8152602001611ec9611f81565b60405180606001604052806003906020820280368337509192915050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002905b6040805180820190915260008082526020820152815260200190600190039081611f395790505090565b60405180602001604052806001906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611fde57611fde611f9f565b604052919050565b600082601f830112611ff757600080fd5b60405161010080820182811067ffffffffffffffff8211171561201c5761201c611f9f565b6040528301818582111561202f57600080fd5b845b82811015612049578035825260209182019101612031565b509195945050505050565b600067ffffffffffffffff82111561206e5761206e611f9f565b5060051b60200190565b600082601f83011261208957600080fd5b8135602061209e61209983612054565b611fb5565b82815260059290921b840181019181810190868411156120bd57600080fd5b8286015b848110156120d857803583529183019183016120c1565b509695505050505050565b60008061012083850312156120f757600080fd5b6121018484611fe6565b915061010083013567ffffffffffffffff81111561211e57600080fd5b61212a85828601612078565b9150509250929050565b600082601f83011261214557600080fd5b8135602061215561209983612054565b82815260059290921b8401810191818101908684111561217457600080fd5b8286015b848110156120d857803567ffffffffffffffff8111156121985760008081fd5b6121a68986838b0101612078565b845250918301918301612178565b600080604083850312156121c757600080fd5b823567ffffffffffffffff808211156121df57600080fd5b818501915085601f8301126121f357600080fd5b8135602061220361209983612054565b82815260089290921b8401810191818101908984111561222257600080fd5b948201945b8386101561224c576122398a87611fe6565b8252828201915061010086019550612227565b9650508601359250508082111561226257600080fd5b5061212a85828601612134565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561008c5761008c612285565b6000600182016122c0576122c0612285565b5060010190565b6000826122e457634e487b7160e01b600052601260045260246000fd5b500690565b8181038181111561008c5761008c612285565b8060005b600281101561231f578151845260209384019390910190600101612300565b50505050565b60408082528351828201819052600091906020906060850190828801855b828110156123aa57815161236285825180518252602090810151910152565b8581015161237388870182516122fc565b86015161238360808701826122fc565b50860151805160c08601526020015160e08501526101009093019290840190600101612343565b5050509301939093525092915050565b808202811582820484141761008c5761008c61228556fea164736f6c6343000811000a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.