├── .gitignore ├── .vscode └── settings.json ├── MIMC-HASH ├── final.ptau ├── mimc.r1cs ├── finalZkey.zkey ├── input.json ├── mimc_js │ ├── mimc.wasm │ ├── generate_witness.js │ └── witness_calculator.js ├── public.json ├── proof.json └── mimc.circom ├── .envexample ├── foundry.toml ├── script └── verifier.s.sol ├── test └── verifier.t.sol ├── src ├── mimc.sol └── Verifier.sol ├── README.md └── out ├── Script.sol └── Script.json ├── verifier.s.sol └── verifierScript.json └── Base.sol ├── TestBase.json └── CommonBase.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib 3 | .env 4 | cache 5 | broadcast 6 | 7 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "git.ignoreLimitWarning": true 3 | } 4 | -------------------------------------------------------------------------------- /MIMC-HASH/final.ptau: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elhajin/Groth16/HEAD/MIMC-HASH/final.ptau -------------------------------------------------------------------------------- /MIMC-HASH/mimc.r1cs: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elhajin/Groth16/HEAD/MIMC-HASH/mimc.r1cs -------------------------------------------------------------------------------- /MIMC-HASH/finalZkey.zkey: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elhajin/Groth16/HEAD/MIMC-HASH/finalZkey.zkey -------------------------------------------------------------------------------- /.envexample: -------------------------------------------------------------------------------- 1 | sepolia_url="https://eth-sepolia.g.alchemy.com/v2/apikey" 2 | private_key="" -------------------------------------------------------------------------------- /MIMC-HASH/input.json: -------------------------------------------------------------------------------- 1 | { 2 | "x": 1258847665265646546465, 3 | "k": 8923410096358576854354354 4 | } 5 | -------------------------------------------------------------------------------- /MIMC-HASH/mimc_js/mimc.wasm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/elhajin/Groth16/HEAD/MIMC-HASH/mimc_js/mimc.wasm -------------------------------------------------------------------------------- /MIMC-HASH/public.json: -------------------------------------------------------------------------------- 1 | [ 2 | "3210190561997121806282107767110728530587938053913542553861993742339989878319" 3 | ] -------------------------------------------------------------------------------- /foundry.toml: -------------------------------------------------------------------------------- 1 | [profile.default] 2 | src = "src" 3 | out = "out" 4 | libs = ["lib"] 5 | 6 | # See more config options https://github.com/foundry-rs/foundry/tree/master/config -------------------------------------------------------------------------------- /script/verifier.s.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity >=0.7.0 <0.9.0; 3 | 4 | import "forge-std/Script.sol"; 5 | import "forge-std/console.sol"; 6 | import {Groth16Verifier} from "../src/Verifier.sol"; 7 | 8 | contract verifierScript is Script{ 9 | // declare the contract here : 10 | Groth16Verifier verifier; 11 | function run() public { 12 | vm.startBroadcast(); 13 | verifier = new Groth16Verifier(); 14 | console.log(address(verifier)); 15 | vm.stopBroadcast(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /MIMC-HASH/mimc_js/generate_witness.js: -------------------------------------------------------------------------------- 1 | const wc = require("./witness_calculator.js"); 2 | const { readFileSync, writeFile } = require("fs"); 3 | 4 | if (process.argv.length != 5) { 5 | console.log("Usage: node generate_witness.js "); 6 | } else { 7 | const input = JSON.parse(readFileSync(process.argv[3], "utf8")); 8 | 9 | const buffer = readFileSync(process.argv[2]); 10 | wc(buffer).then(async witnessCalculator => { 11 | // const w= await witnessCalculator.calculateWitness(input,0); 12 | // for (let i=0; i< w.length; i++){ 13 | // console.log(w[i]); 14 | // } 15 | const buff= await witnessCalculator.calculateWTNSBin(input,0); 16 | writeFile(process.argv[4], buff, function(err) { 17 | if (err) throw err; 18 | }); 19 | }); 20 | } 21 | -------------------------------------------------------------------------------- /MIMC-HASH/proof.json: -------------------------------------------------------------------------------- 1 | { 2 | "pi_a": [ 3 | "3550226744982201365136882914276135916020173797542586494956055663160026233527", 4 | "11753301049926664832264857821707835923983441698181008936351195804234926390508", 5 | "1" 6 | ], 7 | "pi_b": [ 8 | [ 9 | "8286652518229828489990623898795095628943165111242014386675083030432309184404", 10 | "20576321172310706918308352122278714153718148694824821910041785838741325949353" 11 | ], 12 | [ 13 | "13680882792973188693127833321568867091699694985763695245454340936710674711454", 14 | "9668178550255236982969054316576451435812961811965612969094344332170406923194" 15 | ], 16 | [ 17 | "1", 18 | "0" 19 | ] 20 | ], 21 | "pi_c": [ 22 | "13132959349419890528676490722129115257333374699010099614490668368099169087622", 23 | "6268296919039243517487935217553553614572353727544681505333302969896276252899", 24 | "1" 25 | ], 26 | "protocol": "groth16", 27 | "curve": "bn128" 28 | } -------------------------------------------------------------------------------- /test/verifier.t.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity >=0.7.0 <0.9.0; 3 | 4 | import "forge-std/Test.sol"; 5 | import "forge-std/console2.sol"; 6 | import {Groth16Verifier} from "../src/Verifier.sol"; 7 | 8 | contract groth16Test is Test{ 9 | Groth16Verifier verifier = Groth16Verifier(0x6C77d5Fb53212e3206691bFACBB96a0874cCa1D3); 10 | string sepolia = vm.envString("sepolia_url"); 11 | uint fork; 12 | function setUp()public { 13 | // we need to create a fork : 14 | fork = vm.createFork(sepolia); 15 | vm.selectFork(fork); 16 | 17 | } 18 | 19 | function test__verifyProof() public { 20 | // check that the fork is active : 21 | assertEq(vm.activeFork(),fork,"fork not active"); 22 | // the valid data from zksnarks: 23 | bool responseValid = verifier.verifyProof([0x07d95b6cc9c96b0d02ee0c9c40fc25b03b554054374b49e8abc0d8430ca07ab7, 24 | 0x19fc21f573e36f456a7217e1fe7295b5446777127446d15c4d2b480c1769fcec], 25 | [[0x2d7dc8fa823020b03d695adf4c7ff3ab372555f28bc89f5308d8e2a0b43d29a9, 26 | 0x12521440e46c2094217c76789aa9f68cc41c4ed6921f0ca2261f9a4ee7420794], 27 | [0x155ffec1720ce460aa7948185e52649f5acf7c4f14d0efcbc68619c62c300bba, 28 | 0x1e3f1af20679f80675959abf85961cca057cc58522061cf6f09f935e8420039e]], 29 | [0x1d08fdd7f4b9e1e35eadf5a6c8c8b6475eeda0a59f8c9f65dfc9ad8026553086, 30 | 0x0ddbbaf6dd4649a5edccea28e539f368db829ba57b5325c9bce6a5dce4e2d8e3], 31 | [0x0718e749c63e0d5c73460a7ad9e6fd8670811ef8c132c662394051320e50b62f]); 32 | 33 | assertTrue(responseValid,"response not valid but it should i don't know WTF is wrong"); 34 | if(responseValid){ 35 | console.log(unicode"\n🎉 Congratulations, Proof is Valid 🎉"); 36 | } 37 | } 38 | } -------------------------------------------------------------------------------- /src/mimc.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Idenfier: MIT 2 | pragma solidity ^0.8.18; 3 | /** 4 | @dev in implementation of the MIMC function hash, with solidity 5 | @notice we used in this funciton only 15 round , and the base 5 as the power 6 | @notice the prime using in this function is the prime that the circom language uses so we can later generate 7 | a snark proof with the circuit written in the circom language ; 8 | */ 9 | contract hash { 10 | 11 | uint constant prime = 21888242871839275222246405745257275088548364400416034343698204186575808495617; 12 | uint8 constant rounds = 15; 13 | uint[15] private c = [ 14 | 0, 15 | 21469745217645236226405533686231592324177671190346326883245530828586381403876, 16 | 50297292308054131785073003188640636012765603289604974664717077154647718767691, 17 | 106253950757591248575183329665927832654891498741470681534742234294971120334749, 18 | 16562112986402259118419179721668484133429300227020801196120440207549964854140, 19 | 57306670214488528918457646459609688072645567370160016749464560944657195907328, 20 | 108800175491146374658636808924848899594398629303837051145484851272960953126700, 21 | 52091995457855965380176529746846521763751311625573037022759665111626306997253, 22 | 4647715852037907467884498874870960430435996725635089920518875461648844420543, 23 | 19720773146379732435540009001854231484085729453524050584265326241021328895041, 24 | 2468135790246813579024681357902468135790246813579024681357902468, 25 | 1357924680135792468013579246801357924680135792468013579246801357, 26 | 8642097531864209753186420975318642097531864209753186420975318642, 27 | 3141592653589793238462643383279502884197169399375105820974944592, 28 | 2718281828459045235360287471352662497757247093699959574966967627 29 | ]; 30 | 31 | function mimc5(uint x, uint k) public view returns(uint hash){ 32 | uint lastRound = x; 33 | uint base; 34 | uint base2; 35 | uint base4; 36 | for (uint i; i the implementation of the MIMC hash function as a circuit : 3 | --> function : F(x) = (x + k + Ci)^3 4 | while : 5 | 1. (x) : the value that we gonna hash 6 | 2. (k) : a random constant for each round 7 | 3. (Ci): constant values that are diffrent in each round , and they are constant for each circuit 8 | NOTE: we choose (i)rounds , and run this function (i) times , in each round the (x) and (k) are constant and 9 | only the (Ci) get changed . 10 | NOTE: in our case we gonna use the power 5 ,for more randomness ; 11 | */ 12 | pragma circom 2.0.0; 13 | template mimc5() { 14 | 15 | // inputs and outputs : 16 | signal input x; 17 | signal input k; 18 | signal output out; 19 | var rounds = 15; 20 | var c[rounds] = [ 21 | 0, 22 | 21469745217645236226405533686231592324177671190346326883245530828586381403876, 23 | 50297292308054131785073003188640636012765603289604974664717077154647718767691, 24 | 106253950757591248575183329665927832654891498741470681534742234294971120334749, 25 | 16562112986402259118419179721668484133429300227020801196120440207549964854140, 26 | 57306670214488528918457646459609688072645567370160016749464560944657195907328, 27 | 108800175491146374658636808924848899594398629303837051145484851272960953126700, 28 | 52091995457855965380176529746846521763751311625573037022759665111626306997253, 29 | 4647715852037907467884498874870960430435996725635089920518875461648844420543, 30 | 19720773146379732435540009001854231484085729453524050584265326241021328895041, 31 | 2468135790246813579024681357902468135790246813579024681357902468, 32 | 1357924680135792468013579246801357924680135792468013579246801357, 33 | 8642097531864209753186420975318642097531864209753186420975318642, 34 | 3141592653589793238462643383279502884197169399375105820974944592, 35 | 2718281828459045235360287471352662497757247093699959574966967627 36 | ];//this is a hardcoded random numbers 37 | 38 | var base[rounds]; 39 | signal lastOutput[16]; 40 | signal base2[rounds]; 41 | signal base4[rounds]; 42 | lastOutput[0]<==x; 43 | 44 | for (var i = 0;i. 19 | */ 20 | 21 | pragma solidity >=0.7.0 <0.9.0; 22 | //contract address in the sepolia network : 0x6C77d5Fb53212e3206691bFACBB96a0874cCa1D3 23 | contract Groth16Verifier { 24 | // Scalar field size 25 | uint256 constant r = 21888242871839275222246405745257275088548364400416034343698204186575808495617; 26 | // Base field size 27 | uint256 constant q = 21888242871839275222246405745257275088696311157297823662689037894645226208583; 28 | 29 | // Verification Key data 30 | uint256 constant alphax = 12692040678664417537447172076682308302023040152551311858570243387097766727121; 31 | uint256 constant alphay = 14246199832343925783387145520098399764965127115858068029038057458400785992370; 32 | uint256 constant betax1 = 18717490211071757277111959458402096903690358568976018591480506302240046148254; 33 | uint256 constant betax2 = 10007756466068902728798037697156035472166371475895044265883674961753448127626; 34 | uint256 constant betay1 = 5045964852144872028400586908117750218743372723129905866588448974529994713972; 35 | uint256 constant betay2 = 18030965474525331528873358837479310493382697079270996129497163561107382975659; 36 | uint256 constant gammax1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; 37 | uint256 constant gammax2 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; 38 | uint256 constant gammay1 = 4082367875863433681332203403145435568316851327593401208105741076214120093531; 39 | uint256 constant gammay2 = 8495653923123431417604973247489272438418190587263600148770280649306958101930; 40 | uint256 constant deltax1 = 18290898199225670042026932480988221557269639453778782788345510042509066530429; 41 | uint256 constant deltax2 = 3338450402059112435597632215616101995670370976055575473051437368533166664303; 42 | uint256 constant deltay1 = 20179029621086257382536379734833103741876500751543110951410193823797537504146; 43 | uint256 constant deltay2 = 2403968444465252742531565683191502394113896668960145431915228747058951568355; 44 | 45 | 46 | uint256 constant IC0x = 15181120993733072216927706657955519481790082401850088358900824756480819252389; 47 | uint256 constant IC0y = 2126857075451470708411643518084482977697740514864865641742794775783902634808; 48 | 49 | uint256 constant IC1x = 14642136280076004251366363498943962836425006033760912024545875317029159312340; 50 | uint256 constant IC1y = 3045465510870196695932575243924465313656369422102936299787632436587580694567; 51 | 52 | 53 | // Memory data 54 | uint16 constant pVk = 0; 55 | uint16 constant pPairing = 128; 56 | 57 | uint16 constant pLastMem = 896; 58 | 59 | function verifyProof(uint[2] calldata _pA, uint[2][2] calldata _pB, uint[2] calldata _pC, uint[1] calldata _pubSignals) public view returns (bool) { 60 | assembly { 61 | function checkField(v) { 62 | if iszero(lt(v, q)) { 63 | mstore(0, 0) 64 | return(0, 0x20) 65 | } 66 | } 67 | 68 | // G1 function to multiply a G1 value(x,y) to value in an address 69 | function g1_mulAccC(pR, x, y, s) { 70 | let success 71 | let mIn := mload(0x40) 72 | mstore(mIn, x) 73 | mstore(add(mIn, 32), y) 74 | mstore(add(mIn, 64), s) 75 | 76 | success := staticcall(sub(gas(), 2000), 7, mIn, 96, mIn, 64) 77 | 78 | if iszero(success) { 79 | mstore(0, 0) 80 | return(0, 0x20) 81 | } 82 | 83 | mstore(add(mIn, 64), mload(pR)) 84 | mstore(add(mIn, 96), mload(add(pR, 32))) 85 | 86 | success := staticcall(sub(gas(), 2000), 6, mIn, 128, pR, 64) 87 | 88 | if iszero(success) { 89 | mstore(0, 0) 90 | return(0, 0x20) 91 | } 92 | } 93 | 94 | function checkPairing(pA, pB, pC, pubSignals, pMem) -> isOk { 95 | let _pPairing := add(pMem, pPairing) 96 | let _pVk := add(pMem, pVk) 97 | 98 | mstore(_pVk, IC0x) 99 | mstore(add(_pVk, 32), IC0y) 100 | 101 | // Compute the linear combination vk_x 102 | 103 | g1_mulAccC(_pVk, IC1x, IC1y, calldataload(add(pubSignals, 0))) 104 | 105 | 106 | // -A 107 | mstore(_pPairing, calldataload(pA)) 108 | mstore(add(_pPairing, 32), mod(sub(q, calldataload(add(pA, 32))), q)) 109 | 110 | // B 111 | mstore(add(_pPairing, 64), calldataload(pB)) 112 | mstore(add(_pPairing, 96), calldataload(add(pB, 32))) 113 | mstore(add(_pPairing, 128), calldataload(add(pB, 64))) 114 | mstore(add(_pPairing, 160), calldataload(add(pB, 96))) 115 | 116 | // alpha1 117 | mstore(add(_pPairing, 192), alphax) 118 | mstore(add(_pPairing, 224), alphay) 119 | 120 | // beta2 121 | mstore(add(_pPairing, 256), betax1) 122 | mstore(add(_pPairing, 288), betax2) 123 | mstore(add(_pPairing, 320), betay1) 124 | mstore(add(_pPairing, 352), betay2) 125 | 126 | // vk_x 127 | mstore(add(_pPairing, 384), mload(add(pMem, pVk))) 128 | mstore(add(_pPairing, 416), mload(add(pMem, add(pVk, 32)))) 129 | 130 | 131 | // gamma2 132 | mstore(add(_pPairing, 448), gammax1) 133 | mstore(add(_pPairing, 480), gammax2) 134 | mstore(add(_pPairing, 512), gammay1) 135 | mstore(add(_pPairing, 544), gammay2) 136 | 137 | // C 138 | mstore(add(_pPairing, 576), calldataload(pC)) 139 | mstore(add(_pPairing, 608), calldataload(add(pC, 32))) 140 | 141 | // delta2 142 | mstore(add(_pPairing, 640), deltax1) 143 | mstore(add(_pPairing, 672), deltax2) 144 | mstore(add(_pPairing, 704), deltay1) 145 | mstore(add(_pPairing, 736), deltay2) 146 | 147 | 148 | let success := staticcall(sub(gas(), 2000), 8, _pPairing, 768, _pPairing, 0x20) 149 | 150 | isOk := and(success, mload(_pPairing)) 151 | } 152 | 153 | let pMem := mload(0x40) 154 | mstore(0x40, add(pMem, pLastMem)) 155 | 156 | // Validate that all evaluations ∈ F 157 | 158 | checkField(calldataload(add(_pubSignals, 0))) 159 | 160 | checkField(calldataload(add(_pubSignals, 32))) 161 | 162 | 163 | // Validate all evaluations 164 | let isValid := checkPairing(_pA, _pB, _pC, _pubSignals, pMem) 165 | 166 | mstore(0, isValid) 167 | return(0, 0x20) 168 | } 169 | } 170 | } 171 | -------------------------------------------------------------------------------- /MIMC-HASH/mimc_js/witness_calculator.js: -------------------------------------------------------------------------------- 1 | module.exports = async function builder(code, options) { 2 | 3 | options = options || {}; 4 | 5 | let wasmModule; 6 | try { 7 | wasmModule = await WebAssembly.compile(code); 8 | } catch (err) { 9 | console.log(err); 10 | console.log("\nTry to run circom --c in order to generate c++ code instead\n"); 11 | throw new Error(err); 12 | } 13 | 14 | let wc; 15 | 16 | let errStr = ""; 17 | let msgStr = ""; 18 | 19 | const instance = await WebAssembly.instantiate(wasmModule, { 20 | runtime: { 21 | exceptionHandler : function(code) { 22 | let err; 23 | if (code == 1) { 24 | err = "Signal not found.\n"; 25 | } else if (code == 2) { 26 | err = "Too many signals set.\n"; 27 | } else if (code == 3) { 28 | err = "Signal already set.\n"; 29 | } else if (code == 4) { 30 | err = "Assert Failed.\n"; 31 | } else if (code == 5) { 32 | err = "Not enough memory.\n"; 33 | } else if (code == 6) { 34 | err = "Input signal array access exceeds the size.\n"; 35 | } else { 36 | err = "Unknown error.\n"; 37 | } 38 | throw new Error(err + errStr); 39 | }, 40 | printErrorMessage : function() { 41 | errStr += getMessage() + "\n"; 42 | // console.error(getMessage()); 43 | }, 44 | writeBufferMessage : function() { 45 | const msg = getMessage(); 46 | // Any calls to `log()` will always end with a `\n`, so that's when we print and reset 47 | if (msg === "\n") { 48 | console.log(msgStr); 49 | msgStr = ""; 50 | } else { 51 | // If we've buffered other content, put a space in between the items 52 | if (msgStr !== "") { 53 | msgStr += " " 54 | } 55 | // Then append the message to the message we are creating 56 | msgStr += msg; 57 | } 58 | }, 59 | showSharedRWMemory : function() { 60 | printSharedRWMemory (); 61 | } 62 | 63 | } 64 | }); 65 | 66 | const sanityCheck = 67 | options 68 | // options && 69 | // ( 70 | // options.sanityCheck || 71 | // options.logGetSignal || 72 | // options.logSetSignal || 73 | // options.logStartComponent || 74 | // options.logFinishComponent 75 | // ); 76 | 77 | 78 | wc = new WitnessCalculator(instance, sanityCheck); 79 | return wc; 80 | 81 | function getMessage() { 82 | var message = ""; 83 | var c = instance.exports.getMessageChar(); 84 | while ( c != 0 ) { 85 | message += String.fromCharCode(c); 86 | c = instance.exports.getMessageChar(); 87 | } 88 | return message; 89 | } 90 | 91 | function printSharedRWMemory () { 92 | const shared_rw_memory_size = instance.exports.getFieldNumLen32(); 93 | const arr = new Uint32Array(shared_rw_memory_size); 94 | for (let j=0; j { 137 | const h = fnvHash(k); 138 | const hMSB = parseInt(h.slice(0,8), 16); 139 | const hLSB = parseInt(h.slice(8,16), 16); 140 | const fArr = flatArray(input[k]); 141 | let signalSize = this.instance.exports.getInputSignalSize(hMSB, hLSB); 142 | if (signalSize < 0){ 143 | throw new Error(`Signal ${k} not found\n`); 144 | } 145 | if (fArr.length < signalSize) { 146 | throw new Error(`Not enough values for input signal ${k}\n`); 147 | } 148 | if (fArr.length > signalSize) { 149 | throw new Error(`Too many values for input signal ${k}\n`); 150 | } 151 | for (let i=0; i0) { 287 | res.unshift(0); 288 | i--; 289 | } 290 | } 291 | return res; 292 | } 293 | 294 | function fromArray32(arr) { //returns a BigInt 295 | var res = BigInt(0); 296 | const radix = BigInt(0x100000000); 297 | for (let i = 0; i Elhaj 💎 💎 💎 2 | 3 | # **_Groth16 snark_** : 4 | 5 | _in this section we gonna create a Minimalistic `zero knowledge proof` system using [Groth16](https://xn--2-umb.com/22/groth16) [snark](https://vitalik.ca/general/2021/01/26/snarks.html)_ 6 | 7 | ### _ Getting start: _ 8 | 9 | - to generate the system we'll use : 10 | 11 | - [_`circom`_](https://docs.circom.io/) 12 | - [_`snarkjs`_](https://consensys.net/blog/developers/introduction-to-zk-snarks/) 13 | 14 | - there are some steps that we will follow to generate this system :
15 | 1️⃣ create the [_circuit_](https://www.researchgate.net/publication/320654830_Design_of_Circuit_System-Based_Cryptography) that we gonna use to generate the `proof` and the `verification` system.
16 | 17 | - this [_circuit_](https://www.researchgate.net/publication/320654830_Design_of_Circuit_System-Based_Cryptography) is gonna implement the [**_MIMC_**](https://byt3bit.github.io/primesym/mimc/) hash funciton. the reason of using this function cause it's a lightweight function and it will not cost alot of gas like the **_sha256_** for example when we apply it on the blockchain. 18 | 19 | - we gonna implement this [_circuit_](https://www.researchgate.net/publication/320654830_Design_of_Circuit_System-Based_Cryptography) using [`circom`](https://docs.circom.io/) language. 20 | 21 | 2️⃣ after implementing the [_circuit_](https://www.researchgate.net/publication/320654830_Design_of_Circuit_System-Based_Cryptography) .we'll generate the setup for the [Groth16](https://xn--2-umb.com/22/groth16/#trusted-setup). 22 | 23 | ## _Dependency_: 24 | 25 | **_Install node_**
26 | First off, make sure you have a recent version of `Node.js` installed. While any version after `v12` should work fine, we recommend you install `v16` or later. 27 | 28 | If you’re not sure which version of Node you have installed, you can run: 29 | 30 | ```sh 31 | node -v 32 | ``` 33 | 34 | To download the latest version of Node, see [here](https://nodejs.org/en/download/). 35 | 36 | **_Install snarkjs_**
37 | 38 | To install `snarkjs` run: 39 | 40 | ```sh 41 | npm install -g snarkjs@latest 42 | ``` 43 | 44 | If you're seeing an error, try prefixing both commands with `sudo` and running them again. 45 | 46 | **_Understand the `help` command_**
47 | 48 | To see a list of all `snarkjs` commands, as well as descriptions about their inputs and outputs, run: 49 | 50 | ```sh 51 | snarkjs --help 52 | ``` 53 | 54 | ### Install circom 55 | 56 | To install `circom`, follow the instructions at [installing circom](https://docs.circom.io/getting-started/installation). 57 | 58 | **_Now let's implement the circuit_** 59 | 60 | ## 1. circuit: 61 | 62 | - this is the implementation **_`circuit`_** of the [**_MIMC_**](https://byt3bit.github.io/primesym/mimc/) function in the **_`circom`_** language : 63 | 64 | ```circom 65 | /_ 66 | --> the implementation of the MIMC hash function as a circuit : 67 | --> function : F(x) = (x + k + Ci)^3 68 | while : 1. (x) : the value that we gonna hash 2. (k) : a random constant for each round 3. (Ci): constant values that are diffrent in each round , and they are constant for each circuit 69 | NOTE: we choose (i)rounds , and run this function (i) times , in each round the (x) and (k) are constant and 70 | only the (Ci) get changed . 71 | NOTE: in our case we gonna use the power 5 ,for more randomness ; 72 | _/ 73 | pragma circom 2.0.0; 74 | template mimc5() { 75 | // inputs and outputs : 76 | signal input x; 77 | signal input k; 78 | signal output out; 79 | var rounds = 15; 80 | var c[rounds] = [ 81 | 0, 82 | 21469745217645236226405533686231592324177671190346326883245530828586381403876, 83 | 50297292308054131785073003188640636012765603289604974664717077154647718767691, 84 | 106253950757591248575183329665927832654891498741470681534742234294971120334749, 85 | 16562112986402259118419179721668484133429300227020801196120440207549964854140, 86 | 57306670214488528918457646459609688072645567370160016749464560944657195907328, 87 | 108800175491146374658636808924848899594398629303837051145484851272960953126700, 88 | 52091995457855965380176529746846521763751311625573037022759665111626306997253, 89 | 4647715852037907467884498874870960430435996725635089920518875461648844420543, 90 | 19720773146379732435540009001854231484085729453524050584265326241021328895041, 91 | 2468135790246813579024681357902468135790246813579024681357902468, 92 | 1357924680135792468013579246801357924680135792468013579246801357, 93 | 8642097531864209753186420975318642097531864209753186420975318642, 94 | 3141592653589793238462643383279502884197169399375105820974944592, 95 | 2718281828459045235360287471352662497757247093699959574966967627 96 | ];//this is a hardcoded random numbers 97 | 98 | var base[rounds]; 99 | signal lastOutput[16]; 100 | signal base2[rounds]; 101 | signal base4[rounds]; 102 | lastOutput[0]<==x; 103 | 104 | for (var i = 0;i Coding part: _ 137 | 138 | **_in our case snarkjs make it easy for us to generate random ceremony files, and contribute with randmness._** 139 | 140 | - creat a ceremony file with snark js : 141 | 142 | ```bash 143 | snarkjs powersoftau new bn128 12 ceremony_0.ptau 144 | ``` 145 | 146 | - contribute with random data by runnig : 147 | 148 | ```bash 149 | snarkjs powersoftau contribute ceremony_0.ptau random_1.ptau -v 150 | ``` 151 | 152 | by running the obove command you'll asked to put an input. put random input (numbers,characters ,symbols ..) 153 | 154 | > _`Notice`: in real world senario alot of random people are contributes in this part passing alot of random inputs. and if only one of the contributers are honest. we ensure the randomness_ 155 | 156 | _in the real cases it's always recommended to verify the ceremony file with `snarkjs` running the command:_ 157 | 158 | ```bash 159 | snarkjs powersoftau verify .ptau 160 | ``` 161 | 162 | and you should see msg like this : `"snarkJS: ZKey Ok!"` 163 | 164 | - _keep generation a new `ceremony` file from the last one you generated and delete the last one , as many as you want, then keep the last file.ptau ._ 165 | 166 | - now we need to prepare the phase2 by running : 167 | 168 | ```bash 169 | snarkjs powersoftau prepare phase2 lastrandom.ptau final.ptau 170 | ``` 171 | 172 | - now compile the `circuit` to an `r1cs` format so we can feed it to the final ceremony file that we generated randomlly (🙈 🙉 🙊 *I hope so*🙈 🙉 🙊) : 173 | 174 | ```bash 175 | circom mimc.circom --r1cs 176 | ``` 177 | 178 | - Finally let's set up the [Groth16](https://xn--2-umb.com/22/groth16/#trusted-setup) : 179 | 180 | ```bash 181 | snarkjs groth16 setup mimc.r1cs final.ptau outputZkey.zkey 182 | ``` 183 | 184 | - _`Additional step`_ : to make sure all this is random. we could add more randomness to the `zkey` file that we computed. by running : (_this is optional_) 185 | 186 | ```bash 187 | snarkjs zkey contribute outputZkey.zkey finalZkey.zkey 188 | ``` 189 | 190 | - to make sure that the `zkey` file is generated Correctly run:
191 | 192 | > `snarkjs zkey verify r1cs [circuit.r1cs] [powersoftau.ptau] [circuit_final.zkey]` 193 | 194 | ```bash 195 | snarkjs zkey verify mimc.r1cs final.ptau finalZkey.zkey 196 | ``` 197 | 198 | and you should see in the last line the msg : `"snarkJS: ZKey Ok!"` 199 | 200 | --- 201 | 202 | - **_ But how to generate a proof ❓😕 _** 203 | 204 | _To generate the proof from this setup we need :_ 205 | 206 | 1. **input.json** : we need to provide the inputs that we wanna proof knowledge of to the verifier as a json format . 207 | - _`example :`_ 208 | ```.json 209 | { 210 | "x": 73249023423490833, 211 | "y": 324235235342342423423 212 | } 213 | ``` 214 | 2. **circuit.wasm** : the `wasm` format of the circuit . 215 | 3. **final.zkey** : the `zkey` file that we generated in the setup. 216 | 217 | ## let's continue with code : 218 | 219 | - first let's generate the input that we wanna proof the knowledge of as a json file: 220 | 221 | ```.json 222 | { 223 | "x":1258847665265646546465, 224 | "k":8923410096358576854354354 225 | } 226 | ``` 227 | 228 | - second lets get the web assembly format (`wasm`) of the circuit by running :
229 | 230 | ```bash 231 | circom mimc.circom --wasm 232 | ``` 233 | 234 | - this will create for you a new directory named : mimc_js, and in this directory you will find the `.wasm` file that we need. 235 | 236 | - finally run the command that generate the proof :
237 | 238 | > `snarkjs groth16 fullprove [input.json] [circuit_final.wasm] [circuit_final.zkey] [proof.json] [public.json]` 239 | 240 | ```bash 241 | snarkjs groth16 fullprove input.json mimc_js/mimc.wasm finalZkey.zkey proof.json public.json 242 | ``` 243 | 244 | - this cammand will generate two `.json` files . 245 | 246 | - _`public.json`_ : this contains the circuit output,in our case this will be the hash that we generated. 247 | - _`proof.json`_ : this is the proof that you will submit to the verifier.\_ 248 | 249 | *** 250 | 251 | - **_ Now how the Verification ability will be implemented in the blockchain ❓😕 _** 252 | 253 | _Well `snarkjs` have this very cool method that will generate the smart contract for you from the `zkey` file._
254 | _you just need to run the command :_ 255 | 256 | ```bash 257 | snarkjs zkey export solidityverifier finalZkey.zkey Verifier.sol 258 | ``` 259 | 260 |
261 | 262 | - this will create a solidity file named `verifier.sol`. 263 | 264 | --- 265 | 266 | ## **Deploy the contract**: 267 | 268 | now we have our verification contract let's deploy it in the sepolia network using [foundry](https://book.getfoundry.sh/). 269 | 270 | 1. copy the file to the `src` directory in the repo. 271 | 2. deploy the contract by running the command :
272 | ```bash 273 | $ export pk= 274 | $ export url=https://eth-sepolia.g.alchemy.com/v2/ 275 | $ export etherscan= 276 | $ forge create --rpc-url $url --private-key $pk --etherscan-api-key $etherscan --verify src/Verifier.sol:Groth16Verifier 277 | ``` 278 | 279 | --- 280 | 281 | ### Alright now we've : 282 | 283 | - created a circuit . 284 | - create a setup. 285 | - generate proof. 286 | - deployed the verfier contract on blockchain.
287 | 288 | ### 🧪🧪🧪 it's time to test it 🧪🧪🧪🧪 289 | 290 | ➡️ you may already notice that our [contract](https://sepolia.etherscan.io/address/0x6C77d5Fb53212e3206691bFACBB96a0874cCa1D3#code) have only one _view_ funciton (`verifyProof()`).
291 | ➡️this function takes a proof, and if the proof is **valid** it returns **`true`**, and if not it reutrns **`false`**
292 | ➡️ now let's test it with a valid and non valid proof:
293 | 294 | - _in directory `test` create anew file `verifier.t.sol`_ and write this part of code : 295 | 296 | ```solidity 297 | //SPDX-License-Identifier: MIT 298 | pragma solidity >=0.7.0 <0.9.0; 299 | 300 | import "forge-std/Test.sol"; 301 | import "forge-std/console.sol"; 302 | import {Groth16Verifier} from "../src/Verifier.sol"; 303 | 304 | contract groth16Test is Test{ 305 | Groth16Verifier verifier = Groth16Verifier(0x6C77d5Fb53212e3206691bFACBB96a0874cCa1D3); 306 | string sepolia = vm.envString("sepolia_url"); 307 | uint fork; 308 | function setUp()public { 309 | // we need to create a fork : 310 | fork = vm.creatFork(sepolia); 311 | vm.selectFork(fork); 312 | 313 | }} 314 | ``` 315 | 316 | - so the function `verifyProof()` in our deployed contract takes the `proof` which is the `proof.json` that we get earlier.
317 | but we need a proof that is accepted by solidity 😕
318 | to get the `proof` That is compatible with our solidity function run the command: 319 | 320 | ```bash 321 | snarkjs zkey export soliditycalldata public.json proof.json 322 | ``` 323 | 324 | - copy the out put and pass it in to the test function like (see ⤵️) 325 | 326 | > _`notice`_ : make sure to remove the quotation. 327 | 328 | - now add the test funciton with your output calldata : 329 | 330 | ```solidity 331 | function test__verifyProof() public { 332 | // check that the fork is active : 333 | assertEq(vm.activeFork(),fork,"fork not active"); 334 | // the valid data from zksnarks: 335 | bool responseValid = verifier.verifyProof(["0x07d95b6cc9c96b0d02ee0c9c40fc25b03b554054374b49e8abc0d8430ca07ab7", 336 | 0x19fc21f573e36f456a7217e1fe7295b5446777127446d15c4d2b480c1769fcec], 337 | [[0x2d7dc8fa823020b03d695adf4c7ff3ab372555f28bc89f5308d8e2a0b43d29a9, 338 | 0x12521440e46c2094217c76789aa9f68cc41c4ed6921f0ca2261f9a4ee7420794], 339 | [0x155ffec1720ce460aa7948185e52649f5acf7c4f14d0efcbc68619c62c300bba, 340 | "0x1e3f1af20679f80675959abf85961cca057cc58522061cf6f09f935e8420039e]], 341 | [0x1d08fdd7f4b9e1e35eadf5a6c8c8b6475eeda0a59f8c9f65dfc9ad8026553086, 342 | 0x0ddbbaf6dd4649a5edccea28e539f368db829ba57b5325c9bce6a5dce4e2d8e3], 343 | [0x0718e749c63e0d5c73460a7ad9e6fd8670811ef8c132c662394051320e50b62f]); 344 | 345 | assertTrue(responseValid,response not valid but it should. i don't know WTF is wrong); 346 | } 347 | ``` 348 | 349 | - then run the command :
350 | ```bash 351 | forge test -vvv 352 | ``` 353 | -------------------------------------------------------------------------------- /out/Script.sol/Script.json: -------------------------------------------------------------------------------- 1 | { 2 | "abi": [ 3 | { 4 | "inputs": [], 5 | "name": "IS_SCRIPT", 6 | "outputs": [ 7 | { 8 | "internalType": "bool", 9 | "name": "", 10 | "type": "bool" 11 | } 12 | ], 13 | "stateMutability": "view", 14 | "type": "function" 15 | } 16 | ], 17 | "bytecode": { 18 | "object": "0x", 19 | "sourceMap": "", 20 | "linkReferences": {} 21 | }, 22 | "deployedBytecode": { 23 | "object": "0x", 24 | "sourceMap": "", 25 | "linkReferences": {} 26 | }, 27 | "methodIdentifiers": { 28 | "IS_SCRIPT()": "f8ccbf47" 29 | }, 30 | "rawMetadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IS_SCRIPT\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/Script.sol\":\"Script\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"lib/forge-std/src/Base.sol\":{\"keccak256\":\"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224\",\"dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK\"]},\"lib/forge-std/src/Script.sol\":{\"keccak256\":\"0x0bded803c7e28336785fa600f03035e61d0b689bba2f014b1720e576c5ee3307\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://407f3979f460cc60bc7e4ce6fd7da4facac9f52623b4d6805052538d897eab9b\",\"dweb:/ipfs/QmSRhYNywsJhtYEYyPM1izGNsP1SBzxsXwLfcQnFF5NA9p\"]},\"lib/forge-std/src/StdChains.sol\":{\"keccak256\":\"0x51e6eb138fc953fac1ac78012a39b3f16d9289ce06a222ba93bb0621768f96e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://653c577e054cf578594148a07b286571d494f401b6d4a940d3ccabd47b29233d\",\"dweb:/ipfs/QmTWDVvR4m82MGXWYY8BCaVN89TguQJSLqRgzHzrMkFHtx\"]},\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x2e1b4b99283c16efaf155f7e55ea357943cf6e61fc02aad060534349f63b6cd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d471a35903e8a367a145ca5b5955caf691c723fe1117c6dcffd928d9f8d7c95a\",\"dweb:/ipfs/QmXGnFUGiX9APL8xit7NZQEYBoEL3wWyW1YyFoJQd2pGPe\"]},\"lib/forge-std/src/StdJson.sol\":{\"keccak256\":\"0x9e2a7521190c462a0667706385f1c52a816220a9813ca8ac520fba7ba45d660b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d23017fe6570b28130a731b86179352b93a5fb5af32f11559837afc1186293c\",\"dweb:/ipfs/QmR3p6zG5Kmcr8gKocFCSopLHfXv1AziPJbH17nKyMxwxV\"]},\"lib/forge-std/src/StdMath.sol\":{\"keccak256\":\"0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92\",\"dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26\",\"dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9\"]},\"lib/forge-std/src/StdStyle.sol\":{\"keccak256\":\"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8\",\"dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK\"]},\"lib/forge-std/src/StdUtils.sol\":{\"keccak256\":\"0x8758c42ba9d9e46868b796e2330ac239006ede07bd438a4b36dd6f2c47d27dc1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11f5752e0187b1e3631b875efdbe05d45929d05f1c1717105a9115d0a6628140\",\"dweb:/ipfs/QmUKkx9jfsUvjyYBw45RvrW1hTFXDXi2Jv5tbHP86mnzpi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c\",\"dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70\",\"dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973\",\"dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF\"]},\"lib/forge-std/src/interfaces/IMulticall3.sol\":{\"keccak256\":\"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0\",\"dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2\"]},\"lib/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae\",\"dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq\"]}},\"version\":1}", 31 | "metadata": { 32 | "compiler": { 33 | "version": "0.8.19+commit.7dd6d404" 34 | }, 35 | "language": "Solidity", 36 | "output": { 37 | "abi": [ 38 | { 39 | "inputs": [], 40 | "stateMutability": "view", 41 | "type": "function", 42 | "name": "IS_SCRIPT", 43 | "outputs": [ 44 | { 45 | "internalType": "bool", 46 | "name": "", 47 | "type": "bool" 48 | } 49 | ] 50 | } 51 | ], 52 | "devdoc": { 53 | "kind": "dev", 54 | "methods": {}, 55 | "version": 1 56 | }, 57 | "userdoc": { 58 | "kind": "user", 59 | "methods": {}, 60 | "version": 1 61 | } 62 | }, 63 | "settings": { 64 | "remappings": [ 65 | ":ds-test/=lib/forge-std/lib/ds-test/src/", 66 | ":forge-std/=lib/forge-std/src/" 67 | ], 68 | "optimizer": { 69 | "enabled": true, 70 | "runs": 200 71 | }, 72 | "metadata": { 73 | "bytecodeHash": "ipfs" 74 | }, 75 | "compilationTarget": { 76 | "lib/forge-std/src/Script.sol": "Script" 77 | }, 78 | "libraries": {} 79 | }, 80 | "sources": { 81 | "lib/forge-std/src/Base.sol": { 82 | "keccak256": "0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c", 83 | "urls": [ 84 | "bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224", 85 | "dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK" 86 | ], 87 | "license": "MIT" 88 | }, 89 | "lib/forge-std/src/Script.sol": { 90 | "keccak256": "0x0bded803c7e28336785fa600f03035e61d0b689bba2f014b1720e576c5ee3307", 91 | "urls": [ 92 | "bzz-raw://407f3979f460cc60bc7e4ce6fd7da4facac9f52623b4d6805052538d897eab9b", 93 | "dweb:/ipfs/QmSRhYNywsJhtYEYyPM1izGNsP1SBzxsXwLfcQnFF5NA9p" 94 | ], 95 | "license": "MIT" 96 | }, 97 | "lib/forge-std/src/StdChains.sol": { 98 | "keccak256": "0x51e6eb138fc953fac1ac78012a39b3f16d9289ce06a222ba93bb0621768f96e6", 99 | "urls": [ 100 | "bzz-raw://653c577e054cf578594148a07b286571d494f401b6d4a940d3ccabd47b29233d", 101 | "dweb:/ipfs/QmTWDVvR4m82MGXWYY8BCaVN89TguQJSLqRgzHzrMkFHtx" 102 | ], 103 | "license": "MIT" 104 | }, 105 | "lib/forge-std/src/StdCheats.sol": { 106 | "keccak256": "0x2e1b4b99283c16efaf155f7e55ea357943cf6e61fc02aad060534349f63b6cd5", 107 | "urls": [ 108 | "bzz-raw://d471a35903e8a367a145ca5b5955caf691c723fe1117c6dcffd928d9f8d7c95a", 109 | "dweb:/ipfs/QmXGnFUGiX9APL8xit7NZQEYBoEL3wWyW1YyFoJQd2pGPe" 110 | ], 111 | "license": "MIT" 112 | }, 113 | "lib/forge-std/src/StdJson.sol": { 114 | "keccak256": "0x9e2a7521190c462a0667706385f1c52a816220a9813ca8ac520fba7ba45d660b", 115 | "urls": [ 116 | "bzz-raw://7d23017fe6570b28130a731b86179352b93a5fb5af32f11559837afc1186293c", 117 | "dweb:/ipfs/QmR3p6zG5Kmcr8gKocFCSopLHfXv1AziPJbH17nKyMxwxV" 118 | ], 119 | "license": "MIT" 120 | }, 121 | "lib/forge-std/src/StdMath.sol": { 122 | "keccak256": "0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2", 123 | "urls": [ 124 | "bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92", 125 | "dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC" 126 | ], 127 | "license": "MIT" 128 | }, 129 | "lib/forge-std/src/StdStorage.sol": { 130 | "keccak256": "0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d", 131 | "urls": [ 132 | "bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26", 133 | "dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9" 134 | ], 135 | "license": "MIT" 136 | }, 137 | "lib/forge-std/src/StdStyle.sol": { 138 | "keccak256": "0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d", 139 | "urls": [ 140 | "bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8", 141 | "dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK" 142 | ], 143 | "license": "MIT" 144 | }, 145 | "lib/forge-std/src/StdUtils.sol": { 146 | "keccak256": "0x8758c42ba9d9e46868b796e2330ac239006ede07bd438a4b36dd6f2c47d27dc1", 147 | "urls": [ 148 | "bzz-raw://11f5752e0187b1e3631b875efdbe05d45929d05f1c1717105a9115d0a6628140", 149 | "dweb:/ipfs/QmUKkx9jfsUvjyYBw45RvrW1hTFXDXi2Jv5tbHP86mnzpi" 150 | ], 151 | "license": "MIT" 152 | }, 153 | "lib/forge-std/src/Vm.sol": { 154 | "keccak256": "0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5", 155 | "urls": [ 156 | "bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c", 157 | "dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw" 158 | ], 159 | "license": "MIT" 160 | }, 161 | "lib/forge-std/src/console.sol": { 162 | "keccak256": "0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba", 163 | "urls": [ 164 | "bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70", 165 | "dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec" 166 | ], 167 | "license": "MIT" 168 | }, 169 | "lib/forge-std/src/console2.sol": { 170 | "keccak256": "0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea", 171 | "urls": [ 172 | "bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973", 173 | "dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF" 174 | ], 175 | "license": "MIT" 176 | }, 177 | "lib/forge-std/src/interfaces/IMulticall3.sol": { 178 | "keccak256": "0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a", 179 | "urls": [ 180 | "bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0", 181 | "dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2" 182 | ], 183 | "license": "MIT" 184 | }, 185 | "lib/forge-std/src/safeconsole.sol": { 186 | "keccak256": "0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381", 187 | "urls": [ 188 | "bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae", 189 | "dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq" 190 | ], 191 | "license": "MIT" 192 | } 193 | }, 194 | "version": 1 195 | }, 196 | "ast": { 197 | "absolutePath": "lib/forge-std/src/Script.sol", 198 | "id": 2406, 199 | "exportedSymbols": { 200 | "Script": [ 201 | 2405 202 | ], 203 | "ScriptBase": [ 204 | 2366 205 | ], 206 | "StdChains": [ 207 | 4516 208 | ], 209 | "StdCheatsSafe": [ 210 | 6570 211 | ], 212 | "StdStorage": [ 213 | 8374 214 | ], 215 | "StdStyle": [ 216 | 11038 217 | ], 218 | "StdUtils": [ 219 | 11886 220 | ], 221 | "VmSafe": [ 222 | 12992 223 | ], 224 | "console": [ 225 | 21528 226 | ], 227 | "console2": [ 228 | 29653 229 | ], 230 | "safeconsole": [ 231 | 42891 232 | ], 233 | "stdJson": [ 234 | 8200 235 | ], 236 | "stdMath": [ 237 | 8342 238 | ], 239 | "stdStorageSafe": [ 240 | 9266 241 | ] 242 | }, 243 | "nodeType": "SourceUnit", 244 | "src": "32:800:2", 245 | "nodes": [ 246 | { 247 | "id": 2368, 248 | "nodeType": "PragmaDirective", 249 | "src": "32:31:2", 250 | "nodes": [], 251 | "literals": [ 252 | "solidity", 253 | ">=", 254 | "0.6", 255 | ".2", 256 | "<", 257 | "0.9", 258 | ".0" 259 | ] 260 | }, 261 | { 262 | "id": 2370, 263 | "nodeType": "ImportDirective", 264 | "src": "127:38:2", 265 | "nodes": [], 266 | "absolutePath": "lib/forge-std/src/console.sol", 267 | "file": "./console.sol", 268 | "nameLocation": "-1:-1:-1", 269 | "scope": 2406, 270 | "sourceUnit": 21529, 271 | "symbolAliases": [ 272 | { 273 | "foreign": { 274 | "id": 2369, 275 | "name": "console", 276 | "nodeType": "Identifier", 277 | "overloadedDeclarations": [], 278 | "referencedDeclaration": 21528, 279 | "src": "135:7:2", 280 | "typeDescriptions": {} 281 | }, 282 | "nameLocation": "-1:-1:-1" 283 | } 284 | ], 285 | "unitAlias": "" 286 | }, 287 | { 288 | "id": 2372, 289 | "nodeType": "ImportDirective", 290 | "src": "166:40:2", 291 | "nodes": [], 292 | "absolutePath": "lib/forge-std/src/console2.sol", 293 | "file": "./console2.sol", 294 | "nameLocation": "-1:-1:-1", 295 | "scope": 2406, 296 | "sourceUnit": 29654, 297 | "symbolAliases": [ 298 | { 299 | "foreign": { 300 | "id": 2371, 301 | "name": "console2", 302 | "nodeType": "Identifier", 303 | "overloadedDeclarations": [], 304 | "referencedDeclaration": 29653, 305 | "src": "174:8:2", 306 | "typeDescriptions": {} 307 | }, 308 | "nameLocation": "-1:-1:-1" 309 | } 310 | ], 311 | "unitAlias": "" 312 | }, 313 | { 314 | "id": 2374, 315 | "nodeType": "ImportDirective", 316 | "src": "207:46:2", 317 | "nodes": [], 318 | "absolutePath": "lib/forge-std/src/safeconsole.sol", 319 | "file": "./safeconsole.sol", 320 | "nameLocation": "-1:-1:-1", 321 | "scope": 2406, 322 | "sourceUnit": 42892, 323 | "symbolAliases": [ 324 | { 325 | "foreign": { 326 | "id": 2373, 327 | "name": "safeconsole", 328 | "nodeType": "Identifier", 329 | "overloadedDeclarations": [], 330 | "referencedDeclaration": 42891, 331 | "src": "215:11:2", 332 | "typeDescriptions": {} 333 | }, 334 | "nameLocation": "-1:-1:-1" 335 | } 336 | ], 337 | "unitAlias": "" 338 | }, 339 | { 340 | "id": 2376, 341 | "nodeType": "ImportDirective", 342 | "src": "254:42:2", 343 | "nodes": [], 344 | "absolutePath": "lib/forge-std/src/StdChains.sol", 345 | "file": "./StdChains.sol", 346 | "nameLocation": "-1:-1:-1", 347 | "scope": 2406, 348 | "sourceUnit": 4517, 349 | "symbolAliases": [ 350 | { 351 | "foreign": { 352 | "id": 2375, 353 | "name": "StdChains", 354 | "nodeType": "Identifier", 355 | "overloadedDeclarations": [], 356 | "referencedDeclaration": 4516, 357 | "src": "262:9:2", 358 | "typeDescriptions": {} 359 | }, 360 | "nameLocation": "-1:-1:-1" 361 | } 362 | ], 363 | "unitAlias": "" 364 | }, 365 | { 366 | "id": 2378, 367 | "nodeType": "ImportDirective", 368 | "src": "297:46:2", 369 | "nodes": [], 370 | "absolutePath": "lib/forge-std/src/StdCheats.sol", 371 | "file": "./StdCheats.sol", 372 | "nameLocation": "-1:-1:-1", 373 | "scope": 2406, 374 | "sourceUnit": 7335, 375 | "symbolAliases": [ 376 | { 377 | "foreign": { 378 | "id": 2377, 379 | "name": "StdCheatsSafe", 380 | "nodeType": "Identifier", 381 | "overloadedDeclarations": [], 382 | "referencedDeclaration": 6570, 383 | "src": "305:13:2", 384 | "typeDescriptions": {} 385 | }, 386 | "nameLocation": "-1:-1:-1" 387 | } 388 | ], 389 | "unitAlias": "" 390 | }, 391 | { 392 | "id": 2380, 393 | "nodeType": "ImportDirective", 394 | "src": "344:38:2", 395 | "nodes": [], 396 | "absolutePath": "lib/forge-std/src/StdJson.sol", 397 | "file": "./StdJson.sol", 398 | "nameLocation": "-1:-1:-1", 399 | "scope": 2406, 400 | "sourceUnit": 8201, 401 | "symbolAliases": [ 402 | { 403 | "foreign": { 404 | "id": 2379, 405 | "name": "stdJson", 406 | "nodeType": "Identifier", 407 | "overloadedDeclarations": [], 408 | "referencedDeclaration": 8200, 409 | "src": "352:7:2", 410 | "typeDescriptions": {} 411 | }, 412 | "nameLocation": "-1:-1:-1" 413 | } 414 | ], 415 | "unitAlias": "" 416 | }, 417 | { 418 | "id": 2382, 419 | "nodeType": "ImportDirective", 420 | "src": "383:38:2", 421 | "nodes": [], 422 | "absolutePath": "lib/forge-std/src/StdMath.sol", 423 | "file": "./StdMath.sol", 424 | "nameLocation": "-1:-1:-1", 425 | "scope": 2406, 426 | "sourceUnit": 8343, 427 | "symbolAliases": [ 428 | { 429 | "foreign": { 430 | "id": 2381, 431 | "name": "stdMath", 432 | "nodeType": "Identifier", 433 | "overloadedDeclarations": [], 434 | "referencedDeclaration": 8342, 435 | "src": "391:7:2", 436 | "typeDescriptions": {} 437 | }, 438 | "nameLocation": "-1:-1:-1" 439 | } 440 | ], 441 | "unitAlias": "" 442 | }, 443 | { 444 | "id": 2385, 445 | "nodeType": "ImportDirective", 446 | "src": "422:60:2", 447 | "nodes": [], 448 | "absolutePath": "lib/forge-std/src/StdStorage.sol", 449 | "file": "./StdStorage.sol", 450 | "nameLocation": "-1:-1:-1", 451 | "scope": 2406, 452 | "sourceUnit": 9828, 453 | "symbolAliases": [ 454 | { 455 | "foreign": { 456 | "id": 2383, 457 | "name": "StdStorage", 458 | "nodeType": "Identifier", 459 | "overloadedDeclarations": [], 460 | "referencedDeclaration": 8374, 461 | "src": "430:10:2", 462 | "typeDescriptions": {} 463 | }, 464 | "nameLocation": "-1:-1:-1" 465 | }, 466 | { 467 | "foreign": { 468 | "id": 2384, 469 | "name": "stdStorageSafe", 470 | "nodeType": "Identifier", 471 | "overloadedDeclarations": [], 472 | "referencedDeclaration": 9266, 473 | "src": "442:14:2", 474 | "typeDescriptions": {} 475 | }, 476 | "nameLocation": "-1:-1:-1" 477 | } 478 | ], 479 | "unitAlias": "" 480 | }, 481 | { 482 | "id": 2387, 483 | "nodeType": "ImportDirective", 484 | "src": "483:40:2", 485 | "nodes": [], 486 | "absolutePath": "lib/forge-std/src/StdStyle.sol", 487 | "file": "./StdStyle.sol", 488 | "nameLocation": "-1:-1:-1", 489 | "scope": 2406, 490 | "sourceUnit": 11039, 491 | "symbolAliases": [ 492 | { 493 | "foreign": { 494 | "id": 2386, 495 | "name": "StdStyle", 496 | "nodeType": "Identifier", 497 | "overloadedDeclarations": [], 498 | "referencedDeclaration": 11038, 499 | "src": "491:8:2", 500 | "typeDescriptions": {} 501 | }, 502 | "nameLocation": "-1:-1:-1" 503 | } 504 | ], 505 | "unitAlias": "" 506 | }, 507 | { 508 | "id": 2389, 509 | "nodeType": "ImportDirective", 510 | "src": "524:40:2", 511 | "nodes": [], 512 | "absolutePath": "lib/forge-std/src/StdUtils.sol", 513 | "file": "./StdUtils.sol", 514 | "nameLocation": "-1:-1:-1", 515 | "scope": 2406, 516 | "sourceUnit": 11887, 517 | "symbolAliases": [ 518 | { 519 | "foreign": { 520 | "id": 2388, 521 | "name": "StdUtils", 522 | "nodeType": "Identifier", 523 | "overloadedDeclarations": [], 524 | "referencedDeclaration": 11886, 525 | "src": "532:8:2", 526 | "typeDescriptions": {} 527 | }, 528 | "nameLocation": "-1:-1:-1" 529 | } 530 | ], 531 | "unitAlias": "" 532 | }, 533 | { 534 | "id": 2391, 535 | "nodeType": "ImportDirective", 536 | "src": "565:32:2", 537 | "nodes": [], 538 | "absolutePath": "lib/forge-std/src/Vm.sol", 539 | "file": "./Vm.sol", 540 | "nameLocation": "-1:-1:-1", 541 | "scope": 2406, 542 | "sourceUnit": 13465, 543 | "symbolAliases": [ 544 | { 545 | "foreign": { 546 | "id": 2390, 547 | "name": "VmSafe", 548 | "nodeType": "Identifier", 549 | "overloadedDeclarations": [], 550 | "referencedDeclaration": 12992, 551 | "src": "573:6:2", 552 | "typeDescriptions": {} 553 | }, 554 | "nameLocation": "-1:-1:-1" 555 | } 556 | ], 557 | "unitAlias": "" 558 | }, 559 | { 560 | "id": 2393, 561 | "nodeType": "ImportDirective", 562 | "src": "619:38:2", 563 | "nodes": [], 564 | "absolutePath": "lib/forge-std/src/Base.sol", 565 | "file": "./Base.sol", 566 | "nameLocation": "-1:-1:-1", 567 | "scope": 2406, 568 | "sourceUnit": 2367, 569 | "symbolAliases": [ 570 | { 571 | "foreign": { 572 | "id": 2392, 573 | "name": "ScriptBase", 574 | "nodeType": "Identifier", 575 | "overloadedDeclarations": [], 576 | "referencedDeclaration": 2366, 577 | "src": "627:10:2", 578 | "typeDescriptions": {} 579 | }, 580 | "nameLocation": "-1:-1:-1" 581 | } 582 | ], 583 | "unitAlias": "" 584 | }, 585 | { 586 | "id": 2405, 587 | "nodeType": "ContractDefinition", 588 | "src": "676:155:2", 589 | "nodes": [ 590 | { 591 | "id": 2404, 592 | "nodeType": "VariableDeclaration", 593 | "src": "800:28:2", 594 | "nodes": [], 595 | "constant": false, 596 | "functionSelector": "f8ccbf47", 597 | "mutability": "mutable", 598 | "name": "IS_SCRIPT", 599 | "nameLocation": "812:9:2", 600 | "scope": 2405, 601 | "stateVariable": true, 602 | "storageLocation": "default", 603 | "typeDescriptions": { 604 | "typeIdentifier": "t_bool", 605 | "typeString": "bool" 606 | }, 607 | "typeName": { 608 | "id": 2402, 609 | "name": "bool", 610 | "nodeType": "ElementaryTypeName", 611 | "src": "800:4:2", 612 | "typeDescriptions": { 613 | "typeIdentifier": "t_bool", 614 | "typeString": "bool" 615 | } 616 | }, 617 | "value": { 618 | "hexValue": "74727565", 619 | "id": 2403, 620 | "isConstant": false, 621 | "isLValue": false, 622 | "isPure": true, 623 | "kind": "bool", 624 | "lValueRequested": false, 625 | "nodeType": "Literal", 626 | "src": "824:4:2", 627 | "typeDescriptions": { 628 | "typeIdentifier": "t_bool", 629 | "typeString": "bool" 630 | }, 631 | "value": "true" 632 | }, 633 | "visibility": "public" 634 | } 635 | ], 636 | "abstract": true, 637 | "baseContracts": [ 638 | { 639 | "baseName": { 640 | "id": 2394, 641 | "name": "StdChains", 642 | "nameLocations": [ 643 | "704:9:2" 644 | ], 645 | "nodeType": "IdentifierPath", 646 | "referencedDeclaration": 4516, 647 | "src": "704:9:2" 648 | }, 649 | "id": 2395, 650 | "nodeType": "InheritanceSpecifier", 651 | "src": "704:9:2" 652 | }, 653 | { 654 | "baseName": { 655 | "id": 2396, 656 | "name": "StdCheatsSafe", 657 | "nameLocations": [ 658 | "715:13:2" 659 | ], 660 | "nodeType": "IdentifierPath", 661 | "referencedDeclaration": 6570, 662 | "src": "715:13:2" 663 | }, 664 | "id": 2397, 665 | "nodeType": "InheritanceSpecifier", 666 | "src": "715:13:2" 667 | }, 668 | { 669 | "baseName": { 670 | "id": 2398, 671 | "name": "StdUtils", 672 | "nameLocations": [ 673 | "730:8:2" 674 | ], 675 | "nodeType": "IdentifierPath", 676 | "referencedDeclaration": 11886, 677 | "src": "730:8:2" 678 | }, 679 | "id": 2399, 680 | "nodeType": "InheritanceSpecifier", 681 | "src": "730:8:2" 682 | }, 683 | { 684 | "baseName": { 685 | "id": 2400, 686 | "name": "ScriptBase", 687 | "nameLocations": [ 688 | "740:10:2" 689 | ], 690 | "nodeType": "IdentifierPath", 691 | "referencedDeclaration": 2366, 692 | "src": "740:10:2" 693 | }, 694 | "id": 2401, 695 | "nodeType": "InheritanceSpecifier", 696 | "src": "740:10:2" 697 | } 698 | ], 699 | "canonicalName": "Script", 700 | "contractDependencies": [], 701 | "contractKind": "contract", 702 | "fullyImplemented": true, 703 | "linearizedBaseContracts": [ 704 | 2405, 705 | 2366, 706 | 2354, 707 | 11886, 708 | 6570, 709 | 4516 710 | ], 711 | "name": "Script", 712 | "nameLocation": "694:6:2", 713 | "scope": 2406, 714 | "usedErrors": [] 715 | } 716 | ], 717 | "license": "MIT" 718 | }, 719 | "id": 2 720 | } -------------------------------------------------------------------------------- /out/verifier.s.sol/verifierScript.json: -------------------------------------------------------------------------------- 1 | { 2 | "abi": [ 3 | { 4 | "inputs": [], 5 | "name": "IS_SCRIPT", 6 | "outputs": [ 7 | { 8 | "internalType": "bool", 9 | "name": "", 10 | "type": "bool" 11 | } 12 | ], 13 | "stateMutability": "view", 14 | "type": "function" 15 | }, 16 | { 17 | "inputs": [], 18 | "name": "run", 19 | "outputs": [], 20 | "stateMutability": "nonpayable", 21 | "type": "function" 22 | } 23 | ], 24 | "bytecode": { 25 | "object": "0x608060405260048054600160ff199182168117909255600c8054909116909117905534801561002d57600080fd5b506107ea8061003d6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c04062261461003b578063f8ccbf4714610045575b600080fd5b610043610066565b005b600c546100529060ff1681565b604051901515815260200160405180910390f35b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b0316637fb5297f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156100c457600080fd5b505af11580156100d8573d6000803e3d6000fd5b505050506040516100e89061021c565b604051809103906000f080158015610104573d6000803e3d6000fd5b50600c8054610100600160a81b0319166101006001600160a01b0393841681029190911791829055610138929104166101b0565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561019657600080fd5b505af11580156101aa573d6000803e3d6000fd5b50505050565b6040516001600160a01b03821660248201526101f89060440160408051601f198184030181529190526020810180516001600160e01b031663161765e160e11b1790526101fb565b50565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b61058b8061022a8339019056fe608060405234801561001057600080fd5b5061056b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806343753b4d14610030575b600080fd5b61004361003e3660046104cf565b610057565b604051901515815260200160405180910390f35b600061047a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061008f576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100c5576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100f6576000805260206000f35b5050505050565b7f219035c1a491969c8b3192a2116b4d50a2467aae95ae9213110300e000becca585527f04b3c229757f7cec1e460902e90dde29fc2f31348913d3ae07b6544f6f11633860208601526000608086018661019a87357f06bbac220bd7ca18e132a86bf086f10b227cac5da3e8e2834c054448f70120277f205f27cb7e1bebf0e443e7e2ec1f3feaefcd72490b100cf5fe7e439417c81bd484610092565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f1c0f70c1803278630bed5ff7424529518123020de5a929083df23e5169348dd160c08201527f1f7f10386ba754923ae691571df2092d78c0e327b491540ecdb78ef2952e0ab260e08201527f2961b95a29d3e727be9576ec0e46d6a2d510029180e4b32fdebb931f0fcf6a9e6101008201527f1620307e629f7907c70c422dfdda5f145f49a020f7350c5cbda63cead4cc1c8a6101208201527f0b27ea36a843b3904e10b3779d296725ee2a042bcf7f0ff47d83423e31786b746101408201527f27dd2a3068cfaee1bcb5533b13bfec754ea586d2e928947cd0029619e465bcab610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f28704811058b12f44a370b9167ef30b1f6396d737fd5f7cb604ac6e7a5866e7d6102808201527f07617ef7a69c80c83fc3c0c59be872f319bb65739c706b8e54ab3c7a3ce12a6f6102a08201527f2c9ced0fdab7de8117c73e4d0f926105872158175a21416551d497c4a9c57b926102c08201527f055099116716af23e84233270e3da40c6363aa94954945713c6978cb43053be36102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610492600084013561005e565b61049f602084013561005e565b6104ac818486888a6100fd565b90508060005260206000f35b80604081018310156104c957600080fd5b92915050565b6000806000806101208086880312156104e757600080fd5b6104f187876104b8565b945060c086018781111561050457600080fd5b60408701945061051488826104b8565b93505086818701111561052657600080fd5b5092959194509261010001915056fea26469706673582212200b3d314507e410894c2fb2b1a454ec62e51fe994bd99e3d944a2d2f39b925fad64736f6c63430008130033a264697066735822122018080125867213e9f1a10a33e7c489b257e5bb9f560354073ca55788d0d0af8d64736f6c63430008130033", 26 | "sourceMap": "181:275:19:-:0;;;3126:44:4;;;3166:4;-1:-1:-1;;3126:44:4;;;;;;;;800:28:2;;;;;;;;;;;181:275:19;;;;;;;;;;;;;;;;", 27 | "linkReferences": {} 28 | }, 29 | "deployedBytecode": { 30 | "object": "0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063c04062261461003b578063f8ccbf4714610045575b600080fd5b610043610066565b005b600c546100529060ff1681565b604051901515815260200160405180910390f35b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b0316637fb5297f6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156100c457600080fd5b505af11580156100d8573d6000803e3d6000fd5b505050506040516100e89061021c565b604051809103906000f080158015610104573d6000803e3d6000fd5b50600c8054610100600160a81b0319166101006001600160a01b0393841681029190911791829055610138929104166101b0565b7f885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d60001c6001600160a01b03166376eadd366040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561019657600080fd5b505af11580156101aa573d6000803e3d6000fd5b50505050565b6040516001600160a01b03821660248201526101f89060440160408051601f198184030181529190526020810180516001600160e01b031663161765e160e11b1790526101fb565b50565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b61058b8061022a8339019056fe608060405234801561001057600080fd5b5061056b806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806343753b4d14610030575b600080fd5b61004361003e3660046104cf565b610057565b604051901515815260200160405180910390f35b600061047a565b7f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47811061008f576000805260206000f35b50565b600060405183815284602082015285604082015260408160608360076107d05a03fa9150816100c5576000805260206000f35b825160408201526020830151606082015260408360808360066107d05a03fa915050806100f6576000805260206000f35b5050505050565b7f219035c1a491969c8b3192a2116b4d50a2467aae95ae9213110300e000becca585527f04b3c229757f7cec1e460902e90dde29fc2f31348913d3ae07b6544f6f11633860208601526000608086018661019a87357f06bbac220bd7ca18e132a86bf086f10b227cac5da3e8e2834c054448f70120277f205f27cb7e1bebf0e443e7e2ec1f3feaefcd72490b100cf5fe7e439417c81bd484610092565b50823581527f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4760208401357f30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd4703066020820152833560408201526020840135606082015260408401356080820152606084013560a08201527f1c0f70c1803278630bed5ff7424529518123020de5a929083df23e5169348dd160c08201527f1f7f10386ba754923ae691571df2092d78c0e327b491540ecdb78ef2952e0ab260e08201527f2961b95a29d3e727be9576ec0e46d6a2d510029180e4b32fdebb931f0fcf6a9e6101008201527f1620307e629f7907c70c422dfdda5f145f49a020f7350c5cbda63cead4cc1c8a6101208201527f0b27ea36a843b3904e10b3779d296725ee2a042bcf7f0ff47d83423e31786b746101408201527f27dd2a3068cfaee1bcb5533b13bfec754ea586d2e928947cd0029619e465bcab610160820152600087015161018082015260206000018701516101a08201527f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c26101c08201527f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed6101e08201527f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b6102008201527f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa610220820152843561024082015260208501356102608201527f28704811058b12f44a370b9167ef30b1f6396d737fd5f7cb604ac6e7a5866e7d6102808201527f07617ef7a69c80c83fc3c0c59be872f319bb65739c706b8e54ab3c7a3ce12a6f6102a08201527f2c9ced0fdab7de8117c73e4d0f926105872158175a21416551d497c4a9c57b926102c08201527f055099116716af23e84233270e3da40c6363aa94954945713c6978cb43053be36102e08201526020816103008360086107d05a03fa9051169695505050505050565b6040516103808101604052610492600084013561005e565b61049f602084013561005e565b6104ac818486888a6100fd565b90508060005260206000f35b80604081018310156104c957600080fd5b92915050565b6000806000806101208086880312156104e757600080fd5b6104f187876104b8565b945060c086018781111561050457600080fd5b60408701945061051488826104b8565b93505086818701111561052657600080fd5b5092959194509261010001915056fea26469706673582212200b3d314507e410894c2fb2b1a454ec62e51fe994bd99e3d944a2d2f39b925fad64736f6c63430008130033a264697066735822122018080125867213e9f1a10a33e7c489b257e5bb9f560354073ca55788d0d0af8d64736f6c63430008130033", 31 | "sourceMap": "181:275:19:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;286:168;;;:::i;:::-;;800:28:2;;;;;;;;;;;;179:14:23;;172:22;154:41;;142:2;127:18;800:28:2;;;;;;;286:168:19;317:28:1;309:37;;-1:-1:-1;;;;;318:17:19;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;358:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;347:8:19;:32;;-1:-1:-1;;;;;;347:32:19;;-1:-1:-1;;;;;347:32:19;;;;;;;;;;;;;389:30;;409:8;;;389:11;:30::i;:::-;317:28:1;309:37;;-1:-1:-1;;;;;429:16:19;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;286:168::o;5873:116:15:-;5938:43;;-1:-1:-1;;;;;370:32:23;;5938:43:15;;;352:51:23;5922:60:15;;325:18:23;;5938:43:15;;;-1:-1:-1;;5938:43:15;;;;;;;;;;;;;;-1:-1:-1;;;;;5938:43:15;-1:-1:-1;;;5938:43:15;;;5922:15;:60::i;:::-;5873:116;:::o;181:376::-;275:14;;131:42;448:2;435:16;;251:21;;275:14;435:16;131:42;484:5;473:68;464:77;;401:150;;181:376;:::o;-1:-1:-1:-;;;;;;;;:::o", 32 | "linkReferences": {} 33 | }, 34 | "methodIdentifiers": { 35 | "IS_SCRIPT()": "f8ccbf47", 36 | "run()": "c0406226" 37 | }, 38 | "rawMetadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"IS_SCRIPT\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"run\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"script/verifier.s.sol\":\"verifierScript\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"lib/forge-std/src/Base.sol\":{\"keccak256\":\"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224\",\"dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK\"]},\"lib/forge-std/src/Script.sol\":{\"keccak256\":\"0x0bded803c7e28336785fa600f03035e61d0b689bba2f014b1720e576c5ee3307\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://407f3979f460cc60bc7e4ce6fd7da4facac9f52623b4d6805052538d897eab9b\",\"dweb:/ipfs/QmSRhYNywsJhtYEYyPM1izGNsP1SBzxsXwLfcQnFF5NA9p\"]},\"lib/forge-std/src/StdChains.sol\":{\"keccak256\":\"0x51e6eb138fc953fac1ac78012a39b3f16d9289ce06a222ba93bb0621768f96e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://653c577e054cf578594148a07b286571d494f401b6d4a940d3ccabd47b29233d\",\"dweb:/ipfs/QmTWDVvR4m82MGXWYY8BCaVN89TguQJSLqRgzHzrMkFHtx\"]},\"lib/forge-std/src/StdCheats.sol\":{\"keccak256\":\"0x2e1b4b99283c16efaf155f7e55ea357943cf6e61fc02aad060534349f63b6cd5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d471a35903e8a367a145ca5b5955caf691c723fe1117c6dcffd928d9f8d7c95a\",\"dweb:/ipfs/QmXGnFUGiX9APL8xit7NZQEYBoEL3wWyW1YyFoJQd2pGPe\"]},\"lib/forge-std/src/StdJson.sol\":{\"keccak256\":\"0x9e2a7521190c462a0667706385f1c52a816220a9813ca8ac520fba7ba45d660b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7d23017fe6570b28130a731b86179352b93a5fb5af32f11559837afc1186293c\",\"dweb:/ipfs/QmR3p6zG5Kmcr8gKocFCSopLHfXv1AziPJbH17nKyMxwxV\"]},\"lib/forge-std/src/StdMath.sol\":{\"keccak256\":\"0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92\",\"dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26\",\"dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9\"]},\"lib/forge-std/src/StdStyle.sol\":{\"keccak256\":\"0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8\",\"dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK\"]},\"lib/forge-std/src/StdUtils.sol\":{\"keccak256\":\"0x8758c42ba9d9e46868b796e2330ac239006ede07bd438a4b36dd6f2c47d27dc1\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://11f5752e0187b1e3631b875efdbe05d45929d05f1c1717105a9115d0a6628140\",\"dweb:/ipfs/QmUKkx9jfsUvjyYBw45RvrW1hTFXDXi2Jv5tbHP86mnzpi\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c\",\"dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw\"]},\"lib/forge-std/src/console.sol\":{\"keccak256\":\"0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70\",\"dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec\"]},\"lib/forge-std/src/console2.sol\":{\"keccak256\":\"0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973\",\"dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF\"]},\"lib/forge-std/src/interfaces/IMulticall3.sol\":{\"keccak256\":\"0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0\",\"dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2\"]},\"lib/forge-std/src/safeconsole.sol\":{\"keccak256\":\"0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae\",\"dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq\"]},\"script/verifier.s.sol\":{\"keccak256\":\"0x784d73869a2fcf025b7ec1edbbdd8eb076b6311034720edc96b22967f6f445ef\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://91f98ab7ff4110d38a8388c795c65c7b575e10679a1f7eab09e6cf1ec578f62e\",\"dweb:/ipfs/QmNR36BQ8E8T7RsdbwjfsvcYJe9iF5MWML8WLsqX54BG34\"]},\"src/Verifier.sol\":{\"keccak256\":\"0x9a73cae057a8c3402ecd4bc2e48006aa8e90ac77f048c022c65cd5049b08cf98\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://581177b51aab59b684491ae6ce3582300710bb9020e3936c01c9fd5e62eabab6\",\"dweb:/ipfs/QmbJWD7gRFLqGbBZv36JQJtJm1wwvVoGsmCdiVvAnAmtk2\"]}},\"version\":1}", 39 | "metadata": { 40 | "compiler": { 41 | "version": "0.8.19+commit.7dd6d404" 42 | }, 43 | "language": "Solidity", 44 | "output": { 45 | "abi": [ 46 | { 47 | "inputs": [], 48 | "stateMutability": "view", 49 | "type": "function", 50 | "name": "IS_SCRIPT", 51 | "outputs": [ 52 | { 53 | "internalType": "bool", 54 | "name": "", 55 | "type": "bool" 56 | } 57 | ] 58 | }, 59 | { 60 | "inputs": [], 61 | "stateMutability": "nonpayable", 62 | "type": "function", 63 | "name": "run" 64 | } 65 | ], 66 | "devdoc": { 67 | "kind": "dev", 68 | "methods": {}, 69 | "version": 1 70 | }, 71 | "userdoc": { 72 | "kind": "user", 73 | "methods": {}, 74 | "version": 1 75 | } 76 | }, 77 | "settings": { 78 | "remappings": [ 79 | ":ds-test/=lib/forge-std/lib/ds-test/src/", 80 | ":forge-std/=lib/forge-std/src/" 81 | ], 82 | "optimizer": { 83 | "enabled": true, 84 | "runs": 200 85 | }, 86 | "metadata": { 87 | "bytecodeHash": "ipfs" 88 | }, 89 | "compilationTarget": { 90 | "script/verifier.s.sol": "verifierScript" 91 | }, 92 | "libraries": {} 93 | }, 94 | "sources": { 95 | "lib/forge-std/src/Base.sol": { 96 | "keccak256": "0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c", 97 | "urls": [ 98 | "bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224", 99 | "dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK" 100 | ], 101 | "license": "MIT" 102 | }, 103 | "lib/forge-std/src/Script.sol": { 104 | "keccak256": "0x0bded803c7e28336785fa600f03035e61d0b689bba2f014b1720e576c5ee3307", 105 | "urls": [ 106 | "bzz-raw://407f3979f460cc60bc7e4ce6fd7da4facac9f52623b4d6805052538d897eab9b", 107 | "dweb:/ipfs/QmSRhYNywsJhtYEYyPM1izGNsP1SBzxsXwLfcQnFF5NA9p" 108 | ], 109 | "license": "MIT" 110 | }, 111 | "lib/forge-std/src/StdChains.sol": { 112 | "keccak256": "0x51e6eb138fc953fac1ac78012a39b3f16d9289ce06a222ba93bb0621768f96e6", 113 | "urls": [ 114 | "bzz-raw://653c577e054cf578594148a07b286571d494f401b6d4a940d3ccabd47b29233d", 115 | "dweb:/ipfs/QmTWDVvR4m82MGXWYY8BCaVN89TguQJSLqRgzHzrMkFHtx" 116 | ], 117 | "license": "MIT" 118 | }, 119 | "lib/forge-std/src/StdCheats.sol": { 120 | "keccak256": "0x2e1b4b99283c16efaf155f7e55ea357943cf6e61fc02aad060534349f63b6cd5", 121 | "urls": [ 122 | "bzz-raw://d471a35903e8a367a145ca5b5955caf691c723fe1117c6dcffd928d9f8d7c95a", 123 | "dweb:/ipfs/QmXGnFUGiX9APL8xit7NZQEYBoEL3wWyW1YyFoJQd2pGPe" 124 | ], 125 | "license": "MIT" 126 | }, 127 | "lib/forge-std/src/StdJson.sol": { 128 | "keccak256": "0x9e2a7521190c462a0667706385f1c52a816220a9813ca8ac520fba7ba45d660b", 129 | "urls": [ 130 | "bzz-raw://7d23017fe6570b28130a731b86179352b93a5fb5af32f11559837afc1186293c", 131 | "dweb:/ipfs/QmR3p6zG5Kmcr8gKocFCSopLHfXv1AziPJbH17nKyMxwxV" 132 | ], 133 | "license": "MIT" 134 | }, 135 | "lib/forge-std/src/StdMath.sol": { 136 | "keccak256": "0xd90ad4fd8aeaeb8929964e686e769fdedd5eded3fc3815df194a0ab9f91a3fb2", 137 | "urls": [ 138 | "bzz-raw://7919b70f636c7b805223992f28ad1ad0145d6c1385b5931a3589aface5fe6c92", 139 | "dweb:/ipfs/QmY7FRaULwoGgFteF8GawjQJRfasNgpWnU2aiMsFrYpuTC" 140 | ], 141 | "license": "MIT" 142 | }, 143 | "lib/forge-std/src/StdStorage.sol": { 144 | "keccak256": "0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d", 145 | "urls": [ 146 | "bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26", 147 | "dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9" 148 | ], 149 | "license": "MIT" 150 | }, 151 | "lib/forge-std/src/StdStyle.sol": { 152 | "keccak256": "0x43e2a8a9b9c2574dabe74f11adf6f782df218f463540e3b5b563609fe108597d", 153 | "urls": [ 154 | "bzz-raw://51363ca97404cf4128e1141428949768c31929e75e014b02c85e887fbbb4f1b8", 155 | "dweb:/ipfs/QmVhtbQc2fU4rRmbcfBtz34mAgG4BAZBsbna1Ca4SkoPsK" 156 | ], 157 | "license": "MIT" 158 | }, 159 | "lib/forge-std/src/StdUtils.sol": { 160 | "keccak256": "0x8758c42ba9d9e46868b796e2330ac239006ede07bd438a4b36dd6f2c47d27dc1", 161 | "urls": [ 162 | "bzz-raw://11f5752e0187b1e3631b875efdbe05d45929d05f1c1717105a9115d0a6628140", 163 | "dweb:/ipfs/QmUKkx9jfsUvjyYBw45RvrW1hTFXDXi2Jv5tbHP86mnzpi" 164 | ], 165 | "license": "MIT" 166 | }, 167 | "lib/forge-std/src/Vm.sol": { 168 | "keccak256": "0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5", 169 | "urls": [ 170 | "bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c", 171 | "dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw" 172 | ], 173 | "license": "MIT" 174 | }, 175 | "lib/forge-std/src/console.sol": { 176 | "keccak256": "0x91d5413c2434ca58fd278b6e1e79fd98d10c83931cc2596a6038eee4daeb34ba", 177 | "urls": [ 178 | "bzz-raw://91ccea707361e48b9b7a161fe81f496b9932bc471e9c4e4e1e9c283f2453cc70", 179 | "dweb:/ipfs/QmcB66sZhQ6Kz7MUHcLE78YXRUZxoZnnxZjN6yATsbB2ec" 180 | ], 181 | "license": "MIT" 182 | }, 183 | "lib/forge-std/src/console2.sol": { 184 | "keccak256": "0x954646445d1014c3cd85c7918f5e7adeeca5ee44b68c00bafa237e597a4e35ea", 185 | "urls": [ 186 | "bzz-raw://516fa3be52da4763147175bfba4be0aa011fadbb0c1afb01f97265bd4cee7973", 187 | "dweb:/ipfs/QmdixAyMJefx7qePChgdxcBH5MxhmN7vsqPuPLx3CgrVmF" 188 | ], 189 | "license": "MIT" 190 | }, 191 | "lib/forge-std/src/interfaces/IMulticall3.sol": { 192 | "keccak256": "0x7aac1389150499a922d1f9ef5749c908cef127cb2075b92fa17e9cb611263d0a", 193 | "urls": [ 194 | "bzz-raw://d95ebb7c7c463e08ebc12dab639945752fb2480acfc6e86da32f72732a7fd0c0", 195 | "dweb:/ipfs/QmNXK8P8oPWwajsQHvAHw3JPyQidPLCGQN3hWu1Lk6PBL2" 196 | ], 197 | "license": "MIT" 198 | }, 199 | "lib/forge-std/src/safeconsole.sol": { 200 | "keccak256": "0xbaf41fdc6c54297e7cd8250e48b0f20eaac918e342a1028cef3f9a52ac086381", 201 | "urls": [ 202 | "bzz-raw://a500ad81dea226f9910e6b50f99a9ff930105e393a692cbfb2185e4cdb4424ae", 203 | "dweb:/ipfs/QmVbUQpXNMmMWRiy4FvBNczzq46BMGfUoBikvSHNiCxVTq" 204 | ], 205 | "license": "MIT" 206 | }, 207 | "script/verifier.s.sol": { 208 | "keccak256": "0x784d73869a2fcf025b7ec1edbbdd8eb076b6311034720edc96b22967f6f445ef", 209 | "urls": [ 210 | "bzz-raw://91f98ab7ff4110d38a8388c795c65c7b575e10679a1f7eab09e6cf1ec578f62e", 211 | "dweb:/ipfs/QmNR36BQ8E8T7RsdbwjfsvcYJe9iF5MWML8WLsqX54BG34" 212 | ], 213 | "license": "MIT" 214 | }, 215 | "src/Verifier.sol": { 216 | "keccak256": "0x9a73cae057a8c3402ecd4bc2e48006aa8e90ac77f048c022c65cd5049b08cf98", 217 | "urls": [ 218 | "bzz-raw://581177b51aab59b684491ae6ce3582300710bb9020e3936c01c9fd5e62eabab6", 219 | "dweb:/ipfs/QmbJWD7gRFLqGbBZv36JQJtJm1wwvVoGsmCdiVvAnAmtk2" 220 | ], 221 | "license": "GPL-3.0" 222 | } 223 | }, 224 | "version": 1 225 | }, 226 | "ast": { 227 | "absolutePath": "script/verifier.s.sol", 228 | "id": 42934, 229 | "exportedSymbols": { 230 | "Groth16Verifier": [ 231 | 43030 232 | ], 233 | "Script": [ 234 | 2405 235 | ], 236 | "ScriptBase": [ 237 | 2366 238 | ], 239 | "StdChains": [ 240 | 4516 241 | ], 242 | "StdCheatsSafe": [ 243 | 6570 244 | ], 245 | "StdStorage": [ 246 | 8374 247 | ], 248 | "StdStyle": [ 249 | 11038 250 | ], 251 | "StdUtils": [ 252 | 11886 253 | ], 254 | "VmSafe": [ 255 | 12992 256 | ], 257 | "console": [ 258 | 21528 259 | ], 260 | "console2": [ 261 | 29653 262 | ], 263 | "safeconsole": [ 264 | 42891 265 | ], 266 | "stdJson": [ 267 | 8200 268 | ], 269 | "stdMath": [ 270 | 8342 271 | ], 272 | "stdStorageSafe": [ 273 | 9266 274 | ], 275 | "verifierScript": [ 276 | 42933 277 | ] 278 | }, 279 | "nodeType": "SourceUnit", 280 | "src": "31:426:19", 281 | "nodes": [ 282 | { 283 | "id": 42893, 284 | "nodeType": "PragmaDirective", 285 | "src": "31:31:19", 286 | "nodes": [], 287 | "literals": [ 288 | "solidity", 289 | ">=", 290 | "0.7", 291 | ".0", 292 | "<", 293 | "0.9", 294 | ".0" 295 | ] 296 | }, 297 | { 298 | "id": 42894, 299 | "nodeType": "ImportDirective", 300 | "src": "64:30:19", 301 | "nodes": [], 302 | "absolutePath": "lib/forge-std/src/Script.sol", 303 | "file": "forge-std/Script.sol", 304 | "nameLocation": "-1:-1:-1", 305 | "scope": 42934, 306 | "sourceUnit": 2406, 307 | "symbolAliases": [], 308 | "unitAlias": "" 309 | }, 310 | { 311 | "id": 42895, 312 | "nodeType": "ImportDirective", 313 | "src": "95:31:19", 314 | "nodes": [], 315 | "absolutePath": "lib/forge-std/src/console.sol", 316 | "file": "forge-std/console.sol", 317 | "nameLocation": "-1:-1:-1", 318 | "scope": 42934, 319 | "sourceUnit": 21529, 320 | "symbolAliases": [], 321 | "unitAlias": "" 322 | }, 323 | { 324 | "id": 42897, 325 | "nodeType": "ImportDirective", 326 | "src": "127:52:19", 327 | "nodes": [], 328 | "absolutePath": "src/Verifier.sol", 329 | "file": "../src/Verifier.sol", 330 | "nameLocation": "-1:-1:-1", 331 | "scope": 42934, 332 | "sourceUnit": 43031, 333 | "symbolAliases": [ 334 | { 335 | "foreign": { 336 | "id": 42896, 337 | "name": "Groth16Verifier", 338 | "nodeType": "Identifier", 339 | "overloadedDeclarations": [], 340 | "referencedDeclaration": 43030, 341 | "src": "135:15:19", 342 | "typeDescriptions": {} 343 | }, 344 | "nameLocation": "-1:-1:-1" 345 | } 346 | ], 347 | "unitAlias": "" 348 | }, 349 | { 350 | "id": 42933, 351 | "nodeType": "ContractDefinition", 352 | "src": "181:275:19", 353 | "nodes": [ 354 | { 355 | "id": 42902, 356 | "nodeType": "VariableDeclaration", 357 | "src": "256:24:19", 358 | "nodes": [], 359 | "constant": false, 360 | "mutability": "mutable", 361 | "name": "verifier", 362 | "nameLocation": "272:8:19", 363 | "scope": 42933, 364 | "stateVariable": true, 365 | "storageLocation": "default", 366 | "typeDescriptions": { 367 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 368 | "typeString": "contract Groth16Verifier" 369 | }, 370 | "typeName": { 371 | "id": 42901, 372 | "nodeType": "UserDefinedTypeName", 373 | "pathNode": { 374 | "id": 42900, 375 | "name": "Groth16Verifier", 376 | "nameLocations": [ 377 | "256:15:19" 378 | ], 379 | "nodeType": "IdentifierPath", 380 | "referencedDeclaration": 43030, 381 | "src": "256:15:19" 382 | }, 383 | "referencedDeclaration": 43030, 384 | "src": "256:15:19", 385 | "typeDescriptions": { 386 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 387 | "typeString": "contract Groth16Verifier" 388 | } 389 | }, 390 | "visibility": "internal" 391 | }, 392 | { 393 | "id": 42932, 394 | "nodeType": "FunctionDefinition", 395 | "src": "286:168:19", 396 | "nodes": [], 397 | "body": { 398 | "id": 42931, 399 | "nodeType": "Block", 400 | "src": "308:146:19", 401 | "nodes": [], 402 | "statements": [ 403 | { 404 | "expression": { 405 | "arguments": [], 406 | "expression": { 407 | "argumentTypes": [], 408 | "expression": { 409 | "id": 42905, 410 | "name": "vm", 411 | "nodeType": "Identifier", 412 | "overloadedDeclarations": [], 413 | "referencedDeclaration": 2350, 414 | "src": "318:2:19", 415 | "typeDescriptions": { 416 | "typeIdentifier": "t_contract$_Vm_$13464", 417 | "typeString": "contract Vm" 418 | } 419 | }, 420 | "id": 42907, 421 | "isConstant": false, 422 | "isLValue": false, 423 | "isPure": false, 424 | "lValueRequested": false, 425 | "memberLocation": "321:14:19", 426 | "memberName": "startBroadcast", 427 | "nodeType": "MemberAccess", 428 | "referencedDeclaration": 12367, 429 | "src": "318:17:19", 430 | "typeDescriptions": { 431 | "typeIdentifier": "t_function_external_nonpayable$__$returns$__$", 432 | "typeString": "function () external" 433 | } 434 | }, 435 | "id": 42908, 436 | "isConstant": false, 437 | "isLValue": false, 438 | "isPure": false, 439 | "kind": "functionCall", 440 | "lValueRequested": false, 441 | "nameLocations": [], 442 | "names": [], 443 | "nodeType": "FunctionCall", 444 | "src": "318:19:19", 445 | "tryCall": false, 446 | "typeDescriptions": { 447 | "typeIdentifier": "t_tuple$__$", 448 | "typeString": "tuple()" 449 | } 450 | }, 451 | "id": 42909, 452 | "nodeType": "ExpressionStatement", 453 | "src": "318:19:19" 454 | }, 455 | { 456 | "expression": { 457 | "id": 42915, 458 | "isConstant": false, 459 | "isLValue": false, 460 | "isPure": false, 461 | "lValueRequested": false, 462 | "leftHandSide": { 463 | "id": 42910, 464 | "name": "verifier", 465 | "nodeType": "Identifier", 466 | "overloadedDeclarations": [], 467 | "referencedDeclaration": 42902, 468 | "src": "347:8:19", 469 | "typeDescriptions": { 470 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 471 | "typeString": "contract Groth16Verifier" 472 | } 473 | }, 474 | "nodeType": "Assignment", 475 | "operator": "=", 476 | "rightHandSide": { 477 | "arguments": [], 478 | "expression": { 479 | "argumentTypes": [], 480 | "id": 42913, 481 | "isConstant": false, 482 | "isLValue": false, 483 | "isPure": false, 484 | "lValueRequested": false, 485 | "nodeType": "NewExpression", 486 | "src": "358:19:19", 487 | "typeDescriptions": { 488 | "typeIdentifier": "t_function_creation_nonpayable$__$returns$_t_contract$_Groth16Verifier_$43030_$", 489 | "typeString": "function () returns (contract Groth16Verifier)" 490 | }, 491 | "typeName": { 492 | "id": 42912, 493 | "nodeType": "UserDefinedTypeName", 494 | "pathNode": { 495 | "id": 42911, 496 | "name": "Groth16Verifier", 497 | "nameLocations": [ 498 | "362:15:19" 499 | ], 500 | "nodeType": "IdentifierPath", 501 | "referencedDeclaration": 43030, 502 | "src": "362:15:19" 503 | }, 504 | "referencedDeclaration": 43030, 505 | "src": "362:15:19", 506 | "typeDescriptions": { 507 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 508 | "typeString": "contract Groth16Verifier" 509 | } 510 | } 511 | }, 512 | "id": 42914, 513 | "isConstant": false, 514 | "isLValue": false, 515 | "isPure": false, 516 | "kind": "functionCall", 517 | "lValueRequested": false, 518 | "nameLocations": [], 519 | "names": [], 520 | "nodeType": "FunctionCall", 521 | "src": "358:21:19", 522 | "tryCall": false, 523 | "typeDescriptions": { 524 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 525 | "typeString": "contract Groth16Verifier" 526 | } 527 | }, 528 | "src": "347:32:19", 529 | "typeDescriptions": { 530 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 531 | "typeString": "contract Groth16Verifier" 532 | } 533 | }, 534 | "id": 42916, 535 | "nodeType": "ExpressionStatement", 536 | "src": "347:32:19" 537 | }, 538 | { 539 | "expression": { 540 | "arguments": [ 541 | { 542 | "arguments": [ 543 | { 544 | "id": 42922, 545 | "name": "verifier", 546 | "nodeType": "Identifier", 547 | "overloadedDeclarations": [], 548 | "referencedDeclaration": 42902, 549 | "src": "409:8:19", 550 | "typeDescriptions": { 551 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 552 | "typeString": "contract Groth16Verifier" 553 | } 554 | } 555 | ], 556 | "expression": { 557 | "argumentTypes": [ 558 | { 559 | "typeIdentifier": "t_contract$_Groth16Verifier_$43030", 560 | "typeString": "contract Groth16Verifier" 561 | } 562 | ], 563 | "id": 42921, 564 | "isConstant": false, 565 | "isLValue": false, 566 | "isPure": true, 567 | "lValueRequested": false, 568 | "nodeType": "ElementaryTypeNameExpression", 569 | "src": "401:7:19", 570 | "typeDescriptions": { 571 | "typeIdentifier": "t_type$_t_address_$", 572 | "typeString": "type(address)" 573 | }, 574 | "typeName": { 575 | "id": 42920, 576 | "name": "address", 577 | "nodeType": "ElementaryTypeName", 578 | "src": "401:7:19", 579 | "typeDescriptions": {} 580 | } 581 | }, 582 | "id": 42923, 583 | "isConstant": false, 584 | "isLValue": false, 585 | "isPure": false, 586 | "kind": "typeConversion", 587 | "lValueRequested": false, 588 | "nameLocations": [], 589 | "names": [], 590 | "nodeType": "FunctionCall", 591 | "src": "401:17:19", 592 | "tryCall": false, 593 | "typeDescriptions": { 594 | "typeIdentifier": "t_address", 595 | "typeString": "address" 596 | } 597 | } 598 | ], 599 | "expression": { 600 | "argumentTypes": [ 601 | { 602 | "typeIdentifier": "t_address", 603 | "typeString": "address" 604 | } 605 | ], 606 | "expression": { 607 | "id": 42917, 608 | "name": "console", 609 | "nodeType": "Identifier", 610 | "overloadedDeclarations": [], 611 | "referencedDeclaration": 21528, 612 | "src": "389:7:19", 613 | "typeDescriptions": { 614 | "typeIdentifier": "t_type$_t_contract$_console_$21528_$", 615 | "typeString": "type(library console)" 616 | } 617 | }, 618 | "id": 42919, 619 | "isConstant": false, 620 | "isLValue": false, 621 | "isPure": false, 622 | "lValueRequested": false, 623 | "memberLocation": "397:3:19", 624 | "memberName": "log", 625 | "nodeType": "MemberAccess", 626 | "referencedDeclaration": 14087, 627 | "src": "389:11:19", 628 | "typeDescriptions": { 629 | "typeIdentifier": "t_function_internal_view$_t_address_$returns$__$", 630 | "typeString": "function (address) view" 631 | } 632 | }, 633 | "id": 42924, 634 | "isConstant": false, 635 | "isLValue": false, 636 | "isPure": false, 637 | "kind": "functionCall", 638 | "lValueRequested": false, 639 | "nameLocations": [], 640 | "names": [], 641 | "nodeType": "FunctionCall", 642 | "src": "389:30:19", 643 | "tryCall": false, 644 | "typeDescriptions": { 645 | "typeIdentifier": "t_tuple$__$", 646 | "typeString": "tuple()" 647 | } 648 | }, 649 | "id": 42925, 650 | "nodeType": "ExpressionStatement", 651 | "src": "389:30:19" 652 | }, 653 | { 654 | "expression": { 655 | "arguments": [], 656 | "expression": { 657 | "argumentTypes": [], 658 | "expression": { 659 | "id": 42926, 660 | "name": "vm", 661 | "nodeType": "Identifier", 662 | "overloadedDeclarations": [], 663 | "referencedDeclaration": 2350, 664 | "src": "429:2:19", 665 | "typeDescriptions": { 666 | "typeIdentifier": "t_contract$_Vm_$13464", 667 | "typeString": "contract Vm" 668 | } 669 | }, 670 | "id": 42928, 671 | "isConstant": false, 672 | "isLValue": false, 673 | "isPure": false, 674 | "lValueRequested": false, 675 | "memberLocation": "432:13:19", 676 | "memberName": "stopBroadcast", 677 | "nodeType": "MemberAccess", 678 | "referencedDeclaration": 12380, 679 | "src": "429:16:19", 680 | "typeDescriptions": { 681 | "typeIdentifier": "t_function_external_nonpayable$__$returns$__$", 682 | "typeString": "function () external" 683 | } 684 | }, 685 | "id": 42929, 686 | "isConstant": false, 687 | "isLValue": false, 688 | "isPure": false, 689 | "kind": "functionCall", 690 | "lValueRequested": false, 691 | "nameLocations": [], 692 | "names": [], 693 | "nodeType": "FunctionCall", 694 | "src": "429:18:19", 695 | "tryCall": false, 696 | "typeDescriptions": { 697 | "typeIdentifier": "t_tuple$__$", 698 | "typeString": "tuple()" 699 | } 700 | }, 701 | "id": 42930, 702 | "nodeType": "ExpressionStatement", 703 | "src": "429:18:19" 704 | } 705 | ] 706 | }, 707 | "functionSelector": "c0406226", 708 | "implemented": true, 709 | "kind": "function", 710 | "modifiers": [], 711 | "name": "run", 712 | "nameLocation": "295:3:19", 713 | "parameters": { 714 | "id": 42903, 715 | "nodeType": "ParameterList", 716 | "parameters": [], 717 | "src": "298:2:19" 718 | }, 719 | "returnParameters": { 720 | "id": 42904, 721 | "nodeType": "ParameterList", 722 | "parameters": [], 723 | "src": "308:0:19" 724 | }, 725 | "scope": 42933, 726 | "stateMutability": "nonpayable", 727 | "virtual": false, 728 | "visibility": "public" 729 | } 730 | ], 731 | "abstract": false, 732 | "baseContracts": [ 733 | { 734 | "baseName": { 735 | "id": 42898, 736 | "name": "Script", 737 | "nameLocations": [ 738 | "208:6:19" 739 | ], 740 | "nodeType": "IdentifierPath", 741 | "referencedDeclaration": 2405, 742 | "src": "208:6:19" 743 | }, 744 | "id": 42899, 745 | "nodeType": "InheritanceSpecifier", 746 | "src": "208:6:19" 747 | } 748 | ], 749 | "canonicalName": "verifierScript", 750 | "contractDependencies": [ 751 | 43030 752 | ], 753 | "contractKind": "contract", 754 | "fullyImplemented": true, 755 | "linearizedBaseContracts": [ 756 | 42933, 757 | 2405, 758 | 2366, 759 | 2354, 760 | 11886, 761 | 6570, 762 | 4516 763 | ], 764 | "name": "verifierScript", 765 | "nameLocation": "190:14:19", 766 | "scope": 42934, 767 | "usedErrors": [] 768 | } 769 | ], 770 | "license": "MIT" 771 | }, 772 | "id": 19 773 | } -------------------------------------------------------------------------------- /out/Base.sol/TestBase.json: -------------------------------------------------------------------------------- 1 | { 2 | "abi": [], 3 | "bytecode": { 4 | "object": "0x", 5 | "sourceMap": "", 6 | "linkReferences": {} 7 | }, 8 | "deployedBytecode": { 9 | "object": "0x", 10 | "sourceMap": "", 11 | "linkReferences": {} 12 | }, 13 | "methodIdentifiers": {}, 14 | "rawMetadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/Base.sol\":\"TestBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"lib/forge-std/src/Base.sol\":{\"keccak256\":\"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224\",\"dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26\",\"dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c\",\"dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw\"]}},\"version\":1}", 15 | "metadata": { 16 | "compiler": { 17 | "version": "0.8.19+commit.7dd6d404" 18 | }, 19 | "language": "Solidity", 20 | "output": { 21 | "abi": [], 22 | "devdoc": { 23 | "kind": "dev", 24 | "methods": {}, 25 | "version": 1 26 | }, 27 | "userdoc": { 28 | "kind": "user", 29 | "methods": {}, 30 | "version": 1 31 | } 32 | }, 33 | "settings": { 34 | "remappings": [ 35 | ":ds-test/=lib/forge-std/lib/ds-test/src/", 36 | ":forge-std/=lib/forge-std/src/" 37 | ], 38 | "optimizer": { 39 | "enabled": true, 40 | "runs": 200 41 | }, 42 | "metadata": { 43 | "bytecodeHash": "ipfs" 44 | }, 45 | "compilationTarget": { 46 | "lib/forge-std/src/Base.sol": "TestBase" 47 | }, 48 | "libraries": {} 49 | }, 50 | "sources": { 51 | "lib/forge-std/src/Base.sol": { 52 | "keccak256": "0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c", 53 | "urls": [ 54 | "bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224", 55 | "dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK" 56 | ], 57 | "license": "MIT" 58 | }, 59 | "lib/forge-std/src/StdStorage.sol": { 60 | "keccak256": "0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d", 61 | "urls": [ 62 | "bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26", 63 | "dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9" 64 | ], 65 | "license": "MIT" 66 | }, 67 | "lib/forge-std/src/Vm.sol": { 68 | "keccak256": "0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5", 69 | "urls": [ 70 | "bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c", 71 | "dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw" 72 | ], 73 | "license": "MIT" 74 | } 75 | }, 76 | "version": 1 77 | }, 78 | "ast": { 79 | "absolutePath": "lib/forge-std/src/Base.sol", 80 | "id": 2367, 81 | "exportedSymbols": { 82 | "CommonBase": [ 83 | 2354 84 | ], 85 | "ScriptBase": [ 86 | 2366 87 | ], 88 | "StdStorage": [ 89 | 8374 90 | ], 91 | "TestBase": [ 92 | 2357 93 | ], 94 | "Vm": [ 95 | 13464 96 | ], 97 | "VmSafe": [ 98 | 12992 99 | ] 100 | }, 101 | "nodeType": "SourceUnit", 102 | "src": "32:1761:1", 103 | "nodes": [ 104 | { 105 | "id": 2293, 106 | "nodeType": "PragmaDirective", 107 | "src": "32:31:1", 108 | "nodes": [], 109 | "literals": [ 110 | "solidity", 111 | ">=", 112 | "0.6", 113 | ".2", 114 | "<", 115 | "0.9", 116 | ".0" 117 | ] 118 | }, 119 | { 120 | "id": 2295, 121 | "nodeType": "ImportDirective", 122 | "src": "65:44:1", 123 | "nodes": [], 124 | "absolutePath": "lib/forge-std/src/StdStorage.sol", 125 | "file": "./StdStorage.sol", 126 | "nameLocation": "-1:-1:-1", 127 | "scope": 2367, 128 | "sourceUnit": 9828, 129 | "symbolAliases": [ 130 | { 131 | "foreign": { 132 | "id": 2294, 133 | "name": "StdStorage", 134 | "nodeType": "Identifier", 135 | "overloadedDeclarations": [], 136 | "referencedDeclaration": 8374, 137 | "src": "73:10:1", 138 | "typeDescriptions": {} 139 | }, 140 | "nameLocation": "-1:-1:-1" 141 | } 142 | ], 143 | "unitAlias": "" 144 | }, 145 | { 146 | "id": 2298, 147 | "nodeType": "ImportDirective", 148 | "src": "110:36:1", 149 | "nodes": [], 150 | "absolutePath": "lib/forge-std/src/Vm.sol", 151 | "file": "./Vm.sol", 152 | "nameLocation": "-1:-1:-1", 153 | "scope": 2367, 154 | "sourceUnit": 13465, 155 | "symbolAliases": [ 156 | { 157 | "foreign": { 158 | "id": 2296, 159 | "name": "Vm", 160 | "nodeType": "Identifier", 161 | "overloadedDeclarations": [], 162 | "referencedDeclaration": 13464, 163 | "src": "118:2:1", 164 | "typeDescriptions": {} 165 | }, 166 | "nameLocation": "-1:-1:-1" 167 | }, 168 | { 169 | "foreign": { 170 | "id": 2297, 171 | "name": "VmSafe", 172 | "nodeType": "Identifier", 173 | "overloadedDeclarations": [], 174 | "referencedDeclaration": 12992, 175 | "src": "122:6:1", 176 | "typeDescriptions": {} 177 | }, 178 | "nameLocation": "-1:-1:-1" 179 | } 180 | ], 181 | "unitAlias": "" 182 | }, 183 | { 184 | "id": 2354, 185 | "nodeType": "ContractDefinition", 186 | "src": "148:1493:1", 187 | "nodes": [ 188 | { 189 | "id": 2312, 190 | "nodeType": "VariableDeclaration", 191 | "src": "254:94:1", 192 | "nodes": [], 193 | "constant": true, 194 | "mutability": "constant", 195 | "name": "VM_ADDRESS", 196 | "nameLocation": "280:10:1", 197 | "scope": 2354, 198 | "stateVariable": true, 199 | "storageLocation": "default", 200 | "typeDescriptions": { 201 | "typeIdentifier": "t_address", 202 | "typeString": "address" 203 | }, 204 | "typeName": { 205 | "id": 2299, 206 | "name": "address", 207 | "nodeType": "ElementaryTypeName", 208 | "src": "254:7:1", 209 | "stateMutability": "nonpayable", 210 | "typeDescriptions": { 211 | "typeIdentifier": "t_address", 212 | "typeString": "address" 213 | } 214 | }, 215 | "value": { 216 | "arguments": [ 217 | { 218 | "arguments": [ 219 | { 220 | "arguments": [ 221 | { 222 | "arguments": [ 223 | { 224 | "hexValue": "6865766d20636865617420636f6465", 225 | "id": 2307, 226 | "isConstant": false, 227 | "isLValue": false, 228 | "isPure": true, 229 | "kind": "string", 230 | "lValueRequested": false, 231 | "nodeType": "Literal", 232 | "src": "327:17:1", 233 | "typeDescriptions": { 234 | "typeIdentifier": "t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d", 235 | "typeString": "literal_string \"hevm cheat code\"" 236 | }, 237 | "value": "hevm cheat code" 238 | } 239 | ], 240 | "expression": { 241 | "argumentTypes": [ 242 | { 243 | "typeIdentifier": "t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d", 244 | "typeString": "literal_string \"hevm cheat code\"" 245 | } 246 | ], 247 | "id": 2306, 248 | "name": "keccak256", 249 | "nodeType": "Identifier", 250 | "overloadedDeclarations": [], 251 | "referencedDeclaration": -8, 252 | "src": "317:9:1", 253 | "typeDescriptions": { 254 | "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", 255 | "typeString": "function (bytes memory) pure returns (bytes32)" 256 | } 257 | }, 258 | "id": 2308, 259 | "isConstant": false, 260 | "isLValue": false, 261 | "isPure": true, 262 | "kind": "functionCall", 263 | "lValueRequested": false, 264 | "nameLocations": [], 265 | "names": [], 266 | "nodeType": "FunctionCall", 267 | "src": "317:28:1", 268 | "tryCall": false, 269 | "typeDescriptions": { 270 | "typeIdentifier": "t_bytes32", 271 | "typeString": "bytes32" 272 | } 273 | } 274 | ], 275 | "expression": { 276 | "argumentTypes": [ 277 | { 278 | "typeIdentifier": "t_bytes32", 279 | "typeString": "bytes32" 280 | } 281 | ], 282 | "id": 2305, 283 | "isConstant": false, 284 | "isLValue": false, 285 | "isPure": true, 286 | "lValueRequested": false, 287 | "nodeType": "ElementaryTypeNameExpression", 288 | "src": "309:7:1", 289 | "typeDescriptions": { 290 | "typeIdentifier": "t_type$_t_uint256_$", 291 | "typeString": "type(uint256)" 292 | }, 293 | "typeName": { 294 | "id": 2304, 295 | "name": "uint256", 296 | "nodeType": "ElementaryTypeName", 297 | "src": "309:7:1", 298 | "typeDescriptions": {} 299 | } 300 | }, 301 | "id": 2309, 302 | "isConstant": false, 303 | "isLValue": false, 304 | "isPure": true, 305 | "kind": "typeConversion", 306 | "lValueRequested": false, 307 | "nameLocations": [], 308 | "names": [], 309 | "nodeType": "FunctionCall", 310 | "src": "309:37:1", 311 | "tryCall": false, 312 | "typeDescriptions": { 313 | "typeIdentifier": "t_uint256", 314 | "typeString": "uint256" 315 | } 316 | } 317 | ], 318 | "expression": { 319 | "argumentTypes": [ 320 | { 321 | "typeIdentifier": "t_uint256", 322 | "typeString": "uint256" 323 | } 324 | ], 325 | "id": 2303, 326 | "isConstant": false, 327 | "isLValue": false, 328 | "isPure": true, 329 | "lValueRequested": false, 330 | "nodeType": "ElementaryTypeNameExpression", 331 | "src": "301:7:1", 332 | "typeDescriptions": { 333 | "typeIdentifier": "t_type$_t_uint160_$", 334 | "typeString": "type(uint160)" 335 | }, 336 | "typeName": { 337 | "id": 2302, 338 | "name": "uint160", 339 | "nodeType": "ElementaryTypeName", 340 | "src": "301:7:1", 341 | "typeDescriptions": {} 342 | } 343 | }, 344 | "id": 2310, 345 | "isConstant": false, 346 | "isLValue": false, 347 | "isPure": true, 348 | "kind": "typeConversion", 349 | "lValueRequested": false, 350 | "nameLocations": [], 351 | "names": [], 352 | "nodeType": "FunctionCall", 353 | "src": "301:46:1", 354 | "tryCall": false, 355 | "typeDescriptions": { 356 | "typeIdentifier": "t_uint160", 357 | "typeString": "uint160" 358 | } 359 | } 360 | ], 361 | "expression": { 362 | "argumentTypes": [ 363 | { 364 | "typeIdentifier": "t_uint160", 365 | "typeString": "uint160" 366 | } 367 | ], 368 | "id": 2301, 369 | "isConstant": false, 370 | "isLValue": false, 371 | "isPure": true, 372 | "lValueRequested": false, 373 | "nodeType": "ElementaryTypeNameExpression", 374 | "src": "293:7:1", 375 | "typeDescriptions": { 376 | "typeIdentifier": "t_type$_t_address_$", 377 | "typeString": "type(address)" 378 | }, 379 | "typeName": { 380 | "id": 2300, 381 | "name": "address", 382 | "nodeType": "ElementaryTypeName", 383 | "src": "293:7:1", 384 | "typeDescriptions": {} 385 | } 386 | }, 387 | "id": 2311, 388 | "isConstant": false, 389 | "isLValue": false, 390 | "isPure": true, 391 | "kind": "typeConversion", 392 | "lValueRequested": false, 393 | "nameLocations": [], 394 | "names": [], 395 | "nodeType": "FunctionCall", 396 | "src": "293:55:1", 397 | "tryCall": false, 398 | "typeDescriptions": { 399 | "typeIdentifier": "t_address", 400 | "typeString": "address" 401 | } 402 | }, 403 | "visibility": "internal" 404 | }, 405 | { 406 | "id": 2315, 407 | "nodeType": "VariableDeclaration", 408 | "src": "438:78:1", 409 | "nodes": [], 410 | "constant": true, 411 | "mutability": "constant", 412 | "name": "CONSOLE", 413 | "nameLocation": "464:7:1", 414 | "scope": 2354, 415 | "stateVariable": true, 416 | "storageLocation": "default", 417 | "typeDescriptions": { 418 | "typeIdentifier": "t_address", 419 | "typeString": "address" 420 | }, 421 | "typeName": { 422 | "id": 2313, 423 | "name": "address", 424 | "nodeType": "ElementaryTypeName", 425 | "src": "438:7:1", 426 | "stateMutability": "nonpayable", 427 | "typeDescriptions": { 428 | "typeIdentifier": "t_address", 429 | "typeString": "address" 430 | } 431 | }, 432 | "value": { 433 | "hexValue": "307830303030303030303030303030303030303036333646366537333646366336353265366336663637", 434 | "id": 2314, 435 | "isConstant": false, 436 | "isLValue": false, 437 | "isPure": true, 438 | "kind": "number", 439 | "lValueRequested": false, 440 | "nodeType": "Literal", 441 | "src": "474:42:1", 442 | "typeDescriptions": { 443 | "typeIdentifier": "t_address", 444 | "typeString": "address" 445 | }, 446 | "value": "0x000000000000000000636F6e736F6c652e6c6f67" 447 | }, 448 | "visibility": "internal" 449 | }, 450 | { 451 | "id": 2318, 452 | "nodeType": "VariableDeclaration", 453 | "src": "623:86:1", 454 | "nodes": [], 455 | "constant": true, 456 | "mutability": "constant", 457 | "name": "CREATE2_FACTORY", 458 | "nameLocation": "649:15:1", 459 | "scope": 2354, 460 | "stateVariable": true, 461 | "storageLocation": "default", 462 | "typeDescriptions": { 463 | "typeIdentifier": "t_address", 464 | "typeString": "address" 465 | }, 466 | "typeName": { 467 | "id": 2316, 468 | "name": "address", 469 | "nodeType": "ElementaryTypeName", 470 | "src": "623:7:1", 471 | "stateMutability": "nonpayable", 472 | "typeDescriptions": { 473 | "typeIdentifier": "t_address", 474 | "typeString": "address" 475 | } 476 | }, 477 | "value": { 478 | "hexValue": "307834653539623434383437623337393537383538383932306341373846624632366330423439353643", 479 | "id": 2317, 480 | "isConstant": false, 481 | "isLValue": false, 482 | "isPure": true, 483 | "kind": "number", 484 | "lValueRequested": false, 485 | "nodeType": "Literal", 486 | "src": "667:42:1", 487 | "typeDescriptions": { 488 | "typeIdentifier": "t_address", 489 | "typeString": "address" 490 | }, 491 | "value": "0x4e59b44847b379578588920cA78FbF26c0B4956C" 492 | }, 493 | "visibility": "internal" 494 | }, 495 | { 496 | "id": 2332, 497 | "nodeType": "VariableDeclaration", 498 | "src": "812:105:1", 499 | "nodes": [], 500 | "constant": true, 501 | "mutability": "constant", 502 | "name": "DEFAULT_SENDER", 503 | "nameLocation": "838:14:1", 504 | "scope": 2354, 505 | "stateVariable": true, 506 | "storageLocation": "default", 507 | "typeDescriptions": { 508 | "typeIdentifier": "t_address", 509 | "typeString": "address" 510 | }, 511 | "typeName": { 512 | "id": 2319, 513 | "name": "address", 514 | "nodeType": "ElementaryTypeName", 515 | "src": "812:7:1", 516 | "stateMutability": "nonpayable", 517 | "typeDescriptions": { 518 | "typeIdentifier": "t_address", 519 | "typeString": "address" 520 | } 521 | }, 522 | "value": { 523 | "arguments": [ 524 | { 525 | "arguments": [ 526 | { 527 | "arguments": [ 528 | { 529 | "arguments": [ 530 | { 531 | "hexValue": "666f756e6472792064656661756c742063616c6c6572", 532 | "id": 2327, 533 | "isConstant": false, 534 | "isLValue": false, 535 | "isPure": true, 536 | "kind": "string", 537 | "lValueRequested": false, 538 | "nodeType": "Literal", 539 | "src": "889:24:1", 540 | "typeDescriptions": { 541 | "typeIdentifier": "t_stringliteral_ee6e12ba256a78bc5d3ab9651804c8ab1f12e6bbf3894d4083f33e07309d1f38", 542 | "typeString": "literal_string \"foundry default caller\"" 543 | }, 544 | "value": "foundry default caller" 545 | } 546 | ], 547 | "expression": { 548 | "argumentTypes": [ 549 | { 550 | "typeIdentifier": "t_stringliteral_ee6e12ba256a78bc5d3ab9651804c8ab1f12e6bbf3894d4083f33e07309d1f38", 551 | "typeString": "literal_string \"foundry default caller\"" 552 | } 553 | ], 554 | "id": 2326, 555 | "name": "keccak256", 556 | "nodeType": "Identifier", 557 | "overloadedDeclarations": [], 558 | "referencedDeclaration": -8, 559 | "src": "879:9:1", 560 | "typeDescriptions": { 561 | "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", 562 | "typeString": "function (bytes memory) pure returns (bytes32)" 563 | } 564 | }, 565 | "id": 2328, 566 | "isConstant": false, 567 | "isLValue": false, 568 | "isPure": true, 569 | "kind": "functionCall", 570 | "lValueRequested": false, 571 | "nameLocations": [], 572 | "names": [], 573 | "nodeType": "FunctionCall", 574 | "src": "879:35:1", 575 | "tryCall": false, 576 | "typeDescriptions": { 577 | "typeIdentifier": "t_bytes32", 578 | "typeString": "bytes32" 579 | } 580 | } 581 | ], 582 | "expression": { 583 | "argumentTypes": [ 584 | { 585 | "typeIdentifier": "t_bytes32", 586 | "typeString": "bytes32" 587 | } 588 | ], 589 | "id": 2325, 590 | "isConstant": false, 591 | "isLValue": false, 592 | "isPure": true, 593 | "lValueRequested": false, 594 | "nodeType": "ElementaryTypeNameExpression", 595 | "src": "871:7:1", 596 | "typeDescriptions": { 597 | "typeIdentifier": "t_type$_t_uint256_$", 598 | "typeString": "type(uint256)" 599 | }, 600 | "typeName": { 601 | "id": 2324, 602 | "name": "uint256", 603 | "nodeType": "ElementaryTypeName", 604 | "src": "871:7:1", 605 | "typeDescriptions": {} 606 | } 607 | }, 608 | "id": 2329, 609 | "isConstant": false, 610 | "isLValue": false, 611 | "isPure": true, 612 | "kind": "typeConversion", 613 | "lValueRequested": false, 614 | "nameLocations": [], 615 | "names": [], 616 | "nodeType": "FunctionCall", 617 | "src": "871:44:1", 618 | "tryCall": false, 619 | "typeDescriptions": { 620 | "typeIdentifier": "t_uint256", 621 | "typeString": "uint256" 622 | } 623 | } 624 | ], 625 | "expression": { 626 | "argumentTypes": [ 627 | { 628 | "typeIdentifier": "t_uint256", 629 | "typeString": "uint256" 630 | } 631 | ], 632 | "id": 2323, 633 | "isConstant": false, 634 | "isLValue": false, 635 | "isPure": true, 636 | "lValueRequested": false, 637 | "nodeType": "ElementaryTypeNameExpression", 638 | "src": "863:7:1", 639 | "typeDescriptions": { 640 | "typeIdentifier": "t_type$_t_uint160_$", 641 | "typeString": "type(uint160)" 642 | }, 643 | "typeName": { 644 | "id": 2322, 645 | "name": "uint160", 646 | "nodeType": "ElementaryTypeName", 647 | "src": "863:7:1", 648 | "typeDescriptions": {} 649 | } 650 | }, 651 | "id": 2330, 652 | "isConstant": false, 653 | "isLValue": false, 654 | "isPure": true, 655 | "kind": "typeConversion", 656 | "lValueRequested": false, 657 | "nameLocations": [], 658 | "names": [], 659 | "nodeType": "FunctionCall", 660 | "src": "863:53:1", 661 | "tryCall": false, 662 | "typeDescriptions": { 663 | "typeIdentifier": "t_uint160", 664 | "typeString": "uint160" 665 | } 666 | } 667 | ], 668 | "expression": { 669 | "argumentTypes": [ 670 | { 671 | "typeIdentifier": "t_uint160", 672 | "typeString": "uint160" 673 | } 674 | ], 675 | "id": 2321, 676 | "isConstant": false, 677 | "isLValue": false, 678 | "isPure": true, 679 | "lValueRequested": false, 680 | "nodeType": "ElementaryTypeNameExpression", 681 | "src": "855:7:1", 682 | "typeDescriptions": { 683 | "typeIdentifier": "t_type$_t_address_$", 684 | "typeString": "type(address)" 685 | }, 686 | "typeName": { 687 | "id": 2320, 688 | "name": "address", 689 | "nodeType": "ElementaryTypeName", 690 | "src": "855:7:1", 691 | "typeDescriptions": {} 692 | } 693 | }, 694 | "id": 2331, 695 | "isConstant": false, 696 | "isLValue": false, 697 | "isPure": true, 698 | "kind": "typeConversion", 699 | "lValueRequested": false, 700 | "nameLocations": [], 701 | "names": [], 702 | "nodeType": "FunctionCall", 703 | "src": "855:62:1", 704 | "tryCall": false, 705 | "typeDescriptions": { 706 | "typeIdentifier": "t_address", 707 | "typeString": "address" 708 | } 709 | }, 710 | "visibility": "internal" 711 | }, 712 | { 713 | "id": 2335, 714 | "nodeType": "VariableDeclaration", 715 | "src": "992:92:1", 716 | "nodes": [], 717 | "constant": true, 718 | "mutability": "constant", 719 | "name": "DEFAULT_TEST_CONTRACT", 720 | "nameLocation": "1018:21:1", 721 | "scope": 2354, 722 | "stateVariable": true, 723 | "storageLocation": "default", 724 | "typeDescriptions": { 725 | "typeIdentifier": "t_address", 726 | "typeString": "address" 727 | }, 728 | "typeName": { 729 | "id": 2333, 730 | "name": "address", 731 | "nodeType": "ElementaryTypeName", 732 | "src": "992:7:1", 733 | "stateMutability": "nonpayable", 734 | "typeDescriptions": { 735 | "typeIdentifier": "t_address", 736 | "typeString": "address" 737 | } 738 | }, 739 | "value": { 740 | "hexValue": "307835363135644542373938424233453464466130313339644661316233443433334363323362373266", 741 | "id": 2334, 742 | "isConstant": false, 743 | "isLValue": false, 744 | "isPure": true, 745 | "kind": "number", 746 | "lValueRequested": false, 747 | "nodeType": "Literal", 748 | "src": "1042:42:1", 749 | "typeDescriptions": { 750 | "typeIdentifier": "t_address", 751 | "typeString": "address" 752 | }, 753 | "value": "0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f" 754 | }, 755 | "visibility": "internal" 756 | }, 757 | { 758 | "id": 2338, 759 | "nodeType": "VariableDeclaration", 760 | "src": "1158:89:1", 761 | "nodes": [], 762 | "constant": true, 763 | "mutability": "constant", 764 | "name": "MULTICALL3_ADDRESS", 765 | "nameLocation": "1184:18:1", 766 | "scope": 2354, 767 | "stateVariable": true, 768 | "storageLocation": "default", 769 | "typeDescriptions": { 770 | "typeIdentifier": "t_address", 771 | "typeString": "address" 772 | }, 773 | "typeName": { 774 | "id": 2336, 775 | "name": "address", 776 | "nodeType": "ElementaryTypeName", 777 | "src": "1158:7:1", 778 | "stateMutability": "nonpayable", 779 | "typeDescriptions": { 780 | "typeIdentifier": "t_address", 781 | "typeString": "address" 782 | } 783 | }, 784 | "value": { 785 | "hexValue": "307863413131626465303539373762333633313136373032383836326245326131373339373643413131", 786 | "id": 2337, 787 | "isConstant": false, 788 | "isLValue": false, 789 | "isPure": true, 790 | "kind": "number", 791 | "lValueRequested": false, 792 | "nodeType": "Literal", 793 | "src": "1205:42:1", 794 | "typeDescriptions": { 795 | "typeIdentifier": "t_address", 796 | "typeString": "address" 797 | }, 798 | "value": "0xcA11bde05977b3631167028862bE2a173976CA11" 799 | }, 800 | "visibility": "internal" 801 | }, 802 | { 803 | "id": 2341, 804 | "nodeType": "VariableDeclaration", 805 | "src": "1294:130:1", 806 | "nodes": [], 807 | "constant": true, 808 | "mutability": "constant", 809 | "name": "SECP256K1_ORDER", 810 | "nameLocation": "1320:15:1", 811 | "scope": 2354, 812 | "stateVariable": true, 813 | "storageLocation": "default", 814 | "typeDescriptions": { 815 | "typeIdentifier": "t_uint256", 816 | "typeString": "uint256" 817 | }, 818 | "typeName": { 819 | "id": 2339, 820 | "name": "uint256", 821 | "nodeType": "ElementaryTypeName", 822 | "src": "1294:7:1", 823 | "typeDescriptions": { 824 | "typeIdentifier": "t_uint256", 825 | "typeString": "uint256" 826 | } 827 | }, 828 | "value": { 829 | "hexValue": "313135373932303839323337333136313935343233353730393835303038363837393037383532383337353634323739303734393034333832363035313633313431353138313631343934333337", 830 | "id": 2340, 831 | "isConstant": false, 832 | "isLValue": false, 833 | "isPure": true, 834 | "kind": "number", 835 | "lValueRequested": false, 836 | "nodeType": "Literal", 837 | "src": "1346:78:1", 838 | "typeDescriptions": { 839 | "typeIdentifier": "t_rational_115792089237316195423570985008687907852837564279074904382605163141518161494337_by_1", 840 | "typeString": "int_const 1157...(70 digits omitted)...4337" 841 | }, 842 | "value": "115792089237316195423570985008687907852837564279074904382605163141518161494337" 843 | }, 844 | "visibility": "internal" 845 | }, 846 | { 847 | "id": 2344, 848 | "nodeType": "VariableDeclaration", 849 | "src": "1431:126:1", 850 | "nodes": [], 851 | "constant": true, 852 | "mutability": "constant", 853 | "name": "UINT256_MAX", 854 | "nameLocation": "1457:11:1", 855 | "scope": 2354, 856 | "stateVariable": true, 857 | "storageLocation": "default", 858 | "typeDescriptions": { 859 | "typeIdentifier": "t_uint256", 860 | "typeString": "uint256" 861 | }, 862 | "typeName": { 863 | "id": 2342, 864 | "name": "uint256", 865 | "nodeType": "ElementaryTypeName", 866 | "src": "1431:7:1", 867 | "typeDescriptions": { 868 | "typeIdentifier": "t_uint256", 869 | "typeString": "uint256" 870 | } 871 | }, 872 | "value": { 873 | "hexValue": "313135373932303839323337333136313935343233353730393835303038363837393037383533323639393834363635363430353634303339343537353834303037393133313239363339393335", 874 | "id": 2343, 875 | "isConstant": false, 876 | "isLValue": false, 877 | "isPure": true, 878 | "kind": "number", 879 | "lValueRequested": false, 880 | "nodeType": "Literal", 881 | "src": "1479:78:1", 882 | "typeDescriptions": { 883 | "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1", 884 | "typeString": "int_const 1157...(70 digits omitted)...9935" 885 | }, 886 | "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935" 887 | }, 888 | "visibility": "internal" 889 | }, 890 | { 891 | "id": 2350, 892 | "nodeType": "VariableDeclaration", 893 | "src": "1564:40:1", 894 | "nodes": [], 895 | "constant": true, 896 | "mutability": "constant", 897 | "name": "vm", 898 | "nameLocation": "1585:2:1", 899 | "scope": 2354, 900 | "stateVariable": true, 901 | "storageLocation": "default", 902 | "typeDescriptions": { 903 | "typeIdentifier": "t_contract$_Vm_$13464", 904 | "typeString": "contract Vm" 905 | }, 906 | "typeName": { 907 | "id": 2346, 908 | "nodeType": "UserDefinedTypeName", 909 | "pathNode": { 910 | "id": 2345, 911 | "name": "Vm", 912 | "nameLocations": [ 913 | "1564:2:1" 914 | ], 915 | "nodeType": "IdentifierPath", 916 | "referencedDeclaration": 13464, 917 | "src": "1564:2:1" 918 | }, 919 | "referencedDeclaration": 13464, 920 | "src": "1564:2:1", 921 | "typeDescriptions": { 922 | "typeIdentifier": "t_contract$_Vm_$13464", 923 | "typeString": "contract Vm" 924 | } 925 | }, 926 | "value": { 927 | "arguments": [ 928 | { 929 | "id": 2348, 930 | "name": "VM_ADDRESS", 931 | "nodeType": "Identifier", 932 | "overloadedDeclarations": [], 933 | "referencedDeclaration": 2312, 934 | "src": "1593:10:1", 935 | "typeDescriptions": { 936 | "typeIdentifier": "t_address", 937 | "typeString": "address" 938 | } 939 | } 940 | ], 941 | "expression": { 942 | "argumentTypes": [ 943 | { 944 | "typeIdentifier": "t_address", 945 | "typeString": "address" 946 | } 947 | ], 948 | "id": 2347, 949 | "name": "Vm", 950 | "nodeType": "Identifier", 951 | "overloadedDeclarations": [], 952 | "referencedDeclaration": 13464, 953 | "src": "1590:2:1", 954 | "typeDescriptions": { 955 | "typeIdentifier": "t_type$_t_contract$_Vm_$13464_$", 956 | "typeString": "type(contract Vm)" 957 | } 958 | }, 959 | "id": 2349, 960 | "isConstant": false, 961 | "isLValue": false, 962 | "isPure": true, 963 | "kind": "typeConversion", 964 | "lValueRequested": false, 965 | "nameLocations": [], 966 | "names": [], 967 | "nodeType": "FunctionCall", 968 | "src": "1590:14:1", 969 | "tryCall": false, 970 | "typeDescriptions": { 971 | "typeIdentifier": "t_contract$_Vm_$13464", 972 | "typeString": "contract Vm" 973 | } 974 | }, 975 | "visibility": "internal" 976 | }, 977 | { 978 | "id": 2353, 979 | "nodeType": "VariableDeclaration", 980 | "src": "1610:28:1", 981 | "nodes": [], 982 | "constant": false, 983 | "mutability": "mutable", 984 | "name": "stdstore", 985 | "nameLocation": "1630:8:1", 986 | "scope": 2354, 987 | "stateVariable": true, 988 | "storageLocation": "default", 989 | "typeDescriptions": { 990 | "typeIdentifier": "t_struct$_StdStorage_$8374_storage", 991 | "typeString": "struct StdStorage" 992 | }, 993 | "typeName": { 994 | "id": 2352, 995 | "nodeType": "UserDefinedTypeName", 996 | "pathNode": { 997 | "id": 2351, 998 | "name": "StdStorage", 999 | "nameLocations": [ 1000 | "1610:10:1" 1001 | ], 1002 | "nodeType": "IdentifierPath", 1003 | "referencedDeclaration": 8374, 1004 | "src": "1610:10:1" 1005 | }, 1006 | "referencedDeclaration": 8374, 1007 | "src": "1610:10:1", 1008 | "typeDescriptions": { 1009 | "typeIdentifier": "t_struct$_StdStorage_$8374_storage_ptr", 1010 | "typeString": "struct StdStorage" 1011 | } 1012 | }, 1013 | "visibility": "internal" 1014 | } 1015 | ], 1016 | "abstract": true, 1017 | "baseContracts": [], 1018 | "canonicalName": "CommonBase", 1019 | "contractDependencies": [], 1020 | "contractKind": "contract", 1021 | "fullyImplemented": true, 1022 | "linearizedBaseContracts": [ 1023 | 2354 1024 | ], 1025 | "name": "CommonBase", 1026 | "nameLocation": "166:10:1", 1027 | "scope": 2367, 1028 | "usedErrors": [] 1029 | }, 1030 | { 1031 | "id": 2357, 1032 | "nodeType": "ContractDefinition", 1033 | "src": "1643:43:1", 1034 | "nodes": [], 1035 | "abstract": true, 1036 | "baseContracts": [ 1037 | { 1038 | "baseName": { 1039 | "id": 2355, 1040 | "name": "CommonBase", 1041 | "nameLocations": [ 1042 | "1673:10:1" 1043 | ], 1044 | "nodeType": "IdentifierPath", 1045 | "referencedDeclaration": 2354, 1046 | "src": "1673:10:1" 1047 | }, 1048 | "id": 2356, 1049 | "nodeType": "InheritanceSpecifier", 1050 | "src": "1673:10:1" 1051 | } 1052 | ], 1053 | "canonicalName": "TestBase", 1054 | "contractDependencies": [], 1055 | "contractKind": "contract", 1056 | "fullyImplemented": true, 1057 | "linearizedBaseContracts": [ 1058 | 2357, 1059 | 2354 1060 | ], 1061 | "name": "TestBase", 1062 | "nameLocation": "1661:8:1", 1063 | "scope": 2367, 1064 | "usedErrors": [] 1065 | }, 1066 | { 1067 | "id": 2366, 1068 | "nodeType": "ContractDefinition", 1069 | "src": "1688:104:1", 1070 | "nodes": [ 1071 | { 1072 | "id": 2365, 1073 | "nodeType": "VariableDeclaration", 1074 | "src": "1737:52:1", 1075 | "nodes": [], 1076 | "constant": true, 1077 | "mutability": "constant", 1078 | "name": "vmSafe", 1079 | "nameLocation": "1762:6:1", 1080 | "scope": 2366, 1081 | "stateVariable": true, 1082 | "storageLocation": "default", 1083 | "typeDescriptions": { 1084 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1085 | "typeString": "contract VmSafe" 1086 | }, 1087 | "typeName": { 1088 | "id": 2361, 1089 | "nodeType": "UserDefinedTypeName", 1090 | "pathNode": { 1091 | "id": 2360, 1092 | "name": "VmSafe", 1093 | "nameLocations": [ 1094 | "1737:6:1" 1095 | ], 1096 | "nodeType": "IdentifierPath", 1097 | "referencedDeclaration": 12992, 1098 | "src": "1737:6:1" 1099 | }, 1100 | "referencedDeclaration": 12992, 1101 | "src": "1737:6:1", 1102 | "typeDescriptions": { 1103 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1104 | "typeString": "contract VmSafe" 1105 | } 1106 | }, 1107 | "value": { 1108 | "arguments": [ 1109 | { 1110 | "id": 2363, 1111 | "name": "VM_ADDRESS", 1112 | "nodeType": "Identifier", 1113 | "overloadedDeclarations": [], 1114 | "referencedDeclaration": 2312, 1115 | "src": "1778:10:1", 1116 | "typeDescriptions": { 1117 | "typeIdentifier": "t_address", 1118 | "typeString": "address" 1119 | } 1120 | } 1121 | ], 1122 | "expression": { 1123 | "argumentTypes": [ 1124 | { 1125 | "typeIdentifier": "t_address", 1126 | "typeString": "address" 1127 | } 1128 | ], 1129 | "id": 2362, 1130 | "name": "VmSafe", 1131 | "nodeType": "Identifier", 1132 | "overloadedDeclarations": [], 1133 | "referencedDeclaration": 12992, 1134 | "src": "1771:6:1", 1135 | "typeDescriptions": { 1136 | "typeIdentifier": "t_type$_t_contract$_VmSafe_$12992_$", 1137 | "typeString": "type(contract VmSafe)" 1138 | } 1139 | }, 1140 | "id": 2364, 1141 | "isConstant": false, 1142 | "isLValue": false, 1143 | "isPure": true, 1144 | "kind": "typeConversion", 1145 | "lValueRequested": false, 1146 | "nameLocations": [], 1147 | "names": [], 1148 | "nodeType": "FunctionCall", 1149 | "src": "1771:18:1", 1150 | "tryCall": false, 1151 | "typeDescriptions": { 1152 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1153 | "typeString": "contract VmSafe" 1154 | } 1155 | }, 1156 | "visibility": "internal" 1157 | } 1158 | ], 1159 | "abstract": true, 1160 | "baseContracts": [ 1161 | { 1162 | "baseName": { 1163 | "id": 2358, 1164 | "name": "CommonBase", 1165 | "nameLocations": [ 1166 | "1720:10:1" 1167 | ], 1168 | "nodeType": "IdentifierPath", 1169 | "referencedDeclaration": 2354, 1170 | "src": "1720:10:1" 1171 | }, 1172 | "id": 2359, 1173 | "nodeType": "InheritanceSpecifier", 1174 | "src": "1720:10:1" 1175 | } 1176 | ], 1177 | "canonicalName": "ScriptBase", 1178 | "contractDependencies": [], 1179 | "contractKind": "contract", 1180 | "fullyImplemented": true, 1181 | "linearizedBaseContracts": [ 1182 | 2366, 1183 | 2354 1184 | ], 1185 | "name": "ScriptBase", 1186 | "nameLocation": "1706:10:1", 1187 | "scope": 2367, 1188 | "usedErrors": [] 1189 | } 1190 | ], 1191 | "license": "MIT" 1192 | }, 1193 | "id": 1 1194 | } -------------------------------------------------------------------------------- /out/Base.sol/CommonBase.json: -------------------------------------------------------------------------------- 1 | { 2 | "abi": [], 3 | "bytecode": { 4 | "object": "0x", 5 | "sourceMap": "", 6 | "linkReferences": {} 7 | }, 8 | "deployedBytecode": { 9 | "object": "0x", 10 | "sourceMap": "", 11 | "linkReferences": {} 12 | }, 13 | "methodIdentifiers": {}, 14 | "rawMetadata": "{\"compiler\":{\"version\":\"0.8.19+commit.7dd6d404\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"lib/forge-std/src/Base.sol\":\"CommonBase\"},\"evmVersion\":\"paris\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"lib/forge-std/src/Base.sol\":{\"keccak256\":\"0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224\",\"dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK\"]},\"lib/forge-std/src/StdStorage.sol\":{\"keccak256\":\"0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26\",\"dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9\"]},\"lib/forge-std/src/Vm.sol\":{\"keccak256\":\"0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c\",\"dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw\"]}},\"version\":1}", 15 | "metadata": { 16 | "compiler": { 17 | "version": "0.8.19+commit.7dd6d404" 18 | }, 19 | "language": "Solidity", 20 | "output": { 21 | "abi": [], 22 | "devdoc": { 23 | "kind": "dev", 24 | "methods": {}, 25 | "version": 1 26 | }, 27 | "userdoc": { 28 | "kind": "user", 29 | "methods": {}, 30 | "version": 1 31 | } 32 | }, 33 | "settings": { 34 | "remappings": [ 35 | ":ds-test/=lib/forge-std/lib/ds-test/src/", 36 | ":forge-std/=lib/forge-std/src/" 37 | ], 38 | "optimizer": { 39 | "enabled": true, 40 | "runs": 200 41 | }, 42 | "metadata": { 43 | "bytecodeHash": "ipfs" 44 | }, 45 | "compilationTarget": { 46 | "lib/forge-std/src/Base.sol": "CommonBase" 47 | }, 48 | "libraries": {} 49 | }, 50 | "sources": { 51 | "lib/forge-std/src/Base.sol": { 52 | "keccak256": "0x4ff1a785311017d1eedb1b4737956fa383067ad34eb439abfec1d989754dde1c", 53 | "urls": [ 54 | "bzz-raw://f553622969b9fdb930246704a4c10dfaee6b1a4468c142fa7eb9dc292a438224", 55 | "dweb:/ipfs/QmcxqHnqdQsMVtgsfH9VNLmZ3g7GhgNagfq7yvNCDcCHFK" 56 | ], 57 | "license": "MIT" 58 | }, 59 | "lib/forge-std/src/StdStorage.sol": { 60 | "keccak256": "0x391a28a2e54aea51a6fb03a3a48035304ca4d24bc669ddf3d4c152c7162e514d", 61 | "urls": [ 62 | "bzz-raw://475fd0d87ccb0fdc4418dea2babffb4adb4aafb817e61f7ef31c2303f10c6c26", 63 | "dweb:/ipfs/QmQgcgtZxpkW6DRmbJszN1F8mU6zhaTZGdWWsj77yCuWN9" 64 | ], 65 | "license": "MIT" 66 | }, 67 | "lib/forge-std/src/Vm.sol": { 68 | "keccak256": "0xb569d0b4398fad95f508fb854e832143edf69a897af4250f5f60fe195a2066c5", 69 | "urls": [ 70 | "bzz-raw://84b722ada97ea7bb841cdc0fa556aa36a02ff2d380fa24f6dc0717a71c6d9c7c", 71 | "dweb:/ipfs/QmfCH9Q4tvJhPM286GFsE4UCP4YncLpRu4Nwa2ZkHdRfbw" 72 | ], 73 | "license": "MIT" 74 | } 75 | }, 76 | "version": 1 77 | }, 78 | "ast": { 79 | "absolutePath": "lib/forge-std/src/Base.sol", 80 | "id": 2367, 81 | "exportedSymbols": { 82 | "CommonBase": [ 83 | 2354 84 | ], 85 | "ScriptBase": [ 86 | 2366 87 | ], 88 | "StdStorage": [ 89 | 8374 90 | ], 91 | "TestBase": [ 92 | 2357 93 | ], 94 | "Vm": [ 95 | 13464 96 | ], 97 | "VmSafe": [ 98 | 12992 99 | ] 100 | }, 101 | "nodeType": "SourceUnit", 102 | "src": "32:1761:1", 103 | "nodes": [ 104 | { 105 | "id": 2293, 106 | "nodeType": "PragmaDirective", 107 | "src": "32:31:1", 108 | "nodes": [], 109 | "literals": [ 110 | "solidity", 111 | ">=", 112 | "0.6", 113 | ".2", 114 | "<", 115 | "0.9", 116 | ".0" 117 | ] 118 | }, 119 | { 120 | "id": 2295, 121 | "nodeType": "ImportDirective", 122 | "src": "65:44:1", 123 | "nodes": [], 124 | "absolutePath": "lib/forge-std/src/StdStorage.sol", 125 | "file": "./StdStorage.sol", 126 | "nameLocation": "-1:-1:-1", 127 | "scope": 2367, 128 | "sourceUnit": 9828, 129 | "symbolAliases": [ 130 | { 131 | "foreign": { 132 | "id": 2294, 133 | "name": "StdStorage", 134 | "nodeType": "Identifier", 135 | "overloadedDeclarations": [], 136 | "referencedDeclaration": 8374, 137 | "src": "73:10:1", 138 | "typeDescriptions": {} 139 | }, 140 | "nameLocation": "-1:-1:-1" 141 | } 142 | ], 143 | "unitAlias": "" 144 | }, 145 | { 146 | "id": 2298, 147 | "nodeType": "ImportDirective", 148 | "src": "110:36:1", 149 | "nodes": [], 150 | "absolutePath": "lib/forge-std/src/Vm.sol", 151 | "file": "./Vm.sol", 152 | "nameLocation": "-1:-1:-1", 153 | "scope": 2367, 154 | "sourceUnit": 13465, 155 | "symbolAliases": [ 156 | { 157 | "foreign": { 158 | "id": 2296, 159 | "name": "Vm", 160 | "nodeType": "Identifier", 161 | "overloadedDeclarations": [], 162 | "referencedDeclaration": 13464, 163 | "src": "118:2:1", 164 | "typeDescriptions": {} 165 | }, 166 | "nameLocation": "-1:-1:-1" 167 | }, 168 | { 169 | "foreign": { 170 | "id": 2297, 171 | "name": "VmSafe", 172 | "nodeType": "Identifier", 173 | "overloadedDeclarations": [], 174 | "referencedDeclaration": 12992, 175 | "src": "122:6:1", 176 | "typeDescriptions": {} 177 | }, 178 | "nameLocation": "-1:-1:-1" 179 | } 180 | ], 181 | "unitAlias": "" 182 | }, 183 | { 184 | "id": 2354, 185 | "nodeType": "ContractDefinition", 186 | "src": "148:1493:1", 187 | "nodes": [ 188 | { 189 | "id": 2312, 190 | "nodeType": "VariableDeclaration", 191 | "src": "254:94:1", 192 | "nodes": [], 193 | "constant": true, 194 | "mutability": "constant", 195 | "name": "VM_ADDRESS", 196 | "nameLocation": "280:10:1", 197 | "scope": 2354, 198 | "stateVariable": true, 199 | "storageLocation": "default", 200 | "typeDescriptions": { 201 | "typeIdentifier": "t_address", 202 | "typeString": "address" 203 | }, 204 | "typeName": { 205 | "id": 2299, 206 | "name": "address", 207 | "nodeType": "ElementaryTypeName", 208 | "src": "254:7:1", 209 | "stateMutability": "nonpayable", 210 | "typeDescriptions": { 211 | "typeIdentifier": "t_address", 212 | "typeString": "address" 213 | } 214 | }, 215 | "value": { 216 | "arguments": [ 217 | { 218 | "arguments": [ 219 | { 220 | "arguments": [ 221 | { 222 | "arguments": [ 223 | { 224 | "hexValue": "6865766d20636865617420636f6465", 225 | "id": 2307, 226 | "isConstant": false, 227 | "isLValue": false, 228 | "isPure": true, 229 | "kind": "string", 230 | "lValueRequested": false, 231 | "nodeType": "Literal", 232 | "src": "327:17:1", 233 | "typeDescriptions": { 234 | "typeIdentifier": "t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d", 235 | "typeString": "literal_string \"hevm cheat code\"" 236 | }, 237 | "value": "hevm cheat code" 238 | } 239 | ], 240 | "expression": { 241 | "argumentTypes": [ 242 | { 243 | "typeIdentifier": "t_stringliteral_885cb69240a935d632d79c317109709ecfa91a80626ff3989d68f67f5b1dd12d", 244 | "typeString": "literal_string \"hevm cheat code\"" 245 | } 246 | ], 247 | "id": 2306, 248 | "name": "keccak256", 249 | "nodeType": "Identifier", 250 | "overloadedDeclarations": [], 251 | "referencedDeclaration": -8, 252 | "src": "317:9:1", 253 | "typeDescriptions": { 254 | "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", 255 | "typeString": "function (bytes memory) pure returns (bytes32)" 256 | } 257 | }, 258 | "id": 2308, 259 | "isConstant": false, 260 | "isLValue": false, 261 | "isPure": true, 262 | "kind": "functionCall", 263 | "lValueRequested": false, 264 | "nameLocations": [], 265 | "names": [], 266 | "nodeType": "FunctionCall", 267 | "src": "317:28:1", 268 | "tryCall": false, 269 | "typeDescriptions": { 270 | "typeIdentifier": "t_bytes32", 271 | "typeString": "bytes32" 272 | } 273 | } 274 | ], 275 | "expression": { 276 | "argumentTypes": [ 277 | { 278 | "typeIdentifier": "t_bytes32", 279 | "typeString": "bytes32" 280 | } 281 | ], 282 | "id": 2305, 283 | "isConstant": false, 284 | "isLValue": false, 285 | "isPure": true, 286 | "lValueRequested": false, 287 | "nodeType": "ElementaryTypeNameExpression", 288 | "src": "309:7:1", 289 | "typeDescriptions": { 290 | "typeIdentifier": "t_type$_t_uint256_$", 291 | "typeString": "type(uint256)" 292 | }, 293 | "typeName": { 294 | "id": 2304, 295 | "name": "uint256", 296 | "nodeType": "ElementaryTypeName", 297 | "src": "309:7:1", 298 | "typeDescriptions": {} 299 | } 300 | }, 301 | "id": 2309, 302 | "isConstant": false, 303 | "isLValue": false, 304 | "isPure": true, 305 | "kind": "typeConversion", 306 | "lValueRequested": false, 307 | "nameLocations": [], 308 | "names": [], 309 | "nodeType": "FunctionCall", 310 | "src": "309:37:1", 311 | "tryCall": false, 312 | "typeDescriptions": { 313 | "typeIdentifier": "t_uint256", 314 | "typeString": "uint256" 315 | } 316 | } 317 | ], 318 | "expression": { 319 | "argumentTypes": [ 320 | { 321 | "typeIdentifier": "t_uint256", 322 | "typeString": "uint256" 323 | } 324 | ], 325 | "id": 2303, 326 | "isConstant": false, 327 | "isLValue": false, 328 | "isPure": true, 329 | "lValueRequested": false, 330 | "nodeType": "ElementaryTypeNameExpression", 331 | "src": "301:7:1", 332 | "typeDescriptions": { 333 | "typeIdentifier": "t_type$_t_uint160_$", 334 | "typeString": "type(uint160)" 335 | }, 336 | "typeName": { 337 | "id": 2302, 338 | "name": "uint160", 339 | "nodeType": "ElementaryTypeName", 340 | "src": "301:7:1", 341 | "typeDescriptions": {} 342 | } 343 | }, 344 | "id": 2310, 345 | "isConstant": false, 346 | "isLValue": false, 347 | "isPure": true, 348 | "kind": "typeConversion", 349 | "lValueRequested": false, 350 | "nameLocations": [], 351 | "names": [], 352 | "nodeType": "FunctionCall", 353 | "src": "301:46:1", 354 | "tryCall": false, 355 | "typeDescriptions": { 356 | "typeIdentifier": "t_uint160", 357 | "typeString": "uint160" 358 | } 359 | } 360 | ], 361 | "expression": { 362 | "argumentTypes": [ 363 | { 364 | "typeIdentifier": "t_uint160", 365 | "typeString": "uint160" 366 | } 367 | ], 368 | "id": 2301, 369 | "isConstant": false, 370 | "isLValue": false, 371 | "isPure": true, 372 | "lValueRequested": false, 373 | "nodeType": "ElementaryTypeNameExpression", 374 | "src": "293:7:1", 375 | "typeDescriptions": { 376 | "typeIdentifier": "t_type$_t_address_$", 377 | "typeString": "type(address)" 378 | }, 379 | "typeName": { 380 | "id": 2300, 381 | "name": "address", 382 | "nodeType": "ElementaryTypeName", 383 | "src": "293:7:1", 384 | "typeDescriptions": {} 385 | } 386 | }, 387 | "id": 2311, 388 | "isConstant": false, 389 | "isLValue": false, 390 | "isPure": true, 391 | "kind": "typeConversion", 392 | "lValueRequested": false, 393 | "nameLocations": [], 394 | "names": [], 395 | "nodeType": "FunctionCall", 396 | "src": "293:55:1", 397 | "tryCall": false, 398 | "typeDescriptions": { 399 | "typeIdentifier": "t_address", 400 | "typeString": "address" 401 | } 402 | }, 403 | "visibility": "internal" 404 | }, 405 | { 406 | "id": 2315, 407 | "nodeType": "VariableDeclaration", 408 | "src": "438:78:1", 409 | "nodes": [], 410 | "constant": true, 411 | "mutability": "constant", 412 | "name": "CONSOLE", 413 | "nameLocation": "464:7:1", 414 | "scope": 2354, 415 | "stateVariable": true, 416 | "storageLocation": "default", 417 | "typeDescriptions": { 418 | "typeIdentifier": "t_address", 419 | "typeString": "address" 420 | }, 421 | "typeName": { 422 | "id": 2313, 423 | "name": "address", 424 | "nodeType": "ElementaryTypeName", 425 | "src": "438:7:1", 426 | "stateMutability": "nonpayable", 427 | "typeDescriptions": { 428 | "typeIdentifier": "t_address", 429 | "typeString": "address" 430 | } 431 | }, 432 | "value": { 433 | "hexValue": "307830303030303030303030303030303030303036333646366537333646366336353265366336663637", 434 | "id": 2314, 435 | "isConstant": false, 436 | "isLValue": false, 437 | "isPure": true, 438 | "kind": "number", 439 | "lValueRequested": false, 440 | "nodeType": "Literal", 441 | "src": "474:42:1", 442 | "typeDescriptions": { 443 | "typeIdentifier": "t_address", 444 | "typeString": "address" 445 | }, 446 | "value": "0x000000000000000000636F6e736F6c652e6c6f67" 447 | }, 448 | "visibility": "internal" 449 | }, 450 | { 451 | "id": 2318, 452 | "nodeType": "VariableDeclaration", 453 | "src": "623:86:1", 454 | "nodes": [], 455 | "constant": true, 456 | "mutability": "constant", 457 | "name": "CREATE2_FACTORY", 458 | "nameLocation": "649:15:1", 459 | "scope": 2354, 460 | "stateVariable": true, 461 | "storageLocation": "default", 462 | "typeDescriptions": { 463 | "typeIdentifier": "t_address", 464 | "typeString": "address" 465 | }, 466 | "typeName": { 467 | "id": 2316, 468 | "name": "address", 469 | "nodeType": "ElementaryTypeName", 470 | "src": "623:7:1", 471 | "stateMutability": "nonpayable", 472 | "typeDescriptions": { 473 | "typeIdentifier": "t_address", 474 | "typeString": "address" 475 | } 476 | }, 477 | "value": { 478 | "hexValue": "307834653539623434383437623337393537383538383932306341373846624632366330423439353643", 479 | "id": 2317, 480 | "isConstant": false, 481 | "isLValue": false, 482 | "isPure": true, 483 | "kind": "number", 484 | "lValueRequested": false, 485 | "nodeType": "Literal", 486 | "src": "667:42:1", 487 | "typeDescriptions": { 488 | "typeIdentifier": "t_address", 489 | "typeString": "address" 490 | }, 491 | "value": "0x4e59b44847b379578588920cA78FbF26c0B4956C" 492 | }, 493 | "visibility": "internal" 494 | }, 495 | { 496 | "id": 2332, 497 | "nodeType": "VariableDeclaration", 498 | "src": "812:105:1", 499 | "nodes": [], 500 | "constant": true, 501 | "mutability": "constant", 502 | "name": "DEFAULT_SENDER", 503 | "nameLocation": "838:14:1", 504 | "scope": 2354, 505 | "stateVariable": true, 506 | "storageLocation": "default", 507 | "typeDescriptions": { 508 | "typeIdentifier": "t_address", 509 | "typeString": "address" 510 | }, 511 | "typeName": { 512 | "id": 2319, 513 | "name": "address", 514 | "nodeType": "ElementaryTypeName", 515 | "src": "812:7:1", 516 | "stateMutability": "nonpayable", 517 | "typeDescriptions": { 518 | "typeIdentifier": "t_address", 519 | "typeString": "address" 520 | } 521 | }, 522 | "value": { 523 | "arguments": [ 524 | { 525 | "arguments": [ 526 | { 527 | "arguments": [ 528 | { 529 | "arguments": [ 530 | { 531 | "hexValue": "666f756e6472792064656661756c742063616c6c6572", 532 | "id": 2327, 533 | "isConstant": false, 534 | "isLValue": false, 535 | "isPure": true, 536 | "kind": "string", 537 | "lValueRequested": false, 538 | "nodeType": "Literal", 539 | "src": "889:24:1", 540 | "typeDescriptions": { 541 | "typeIdentifier": "t_stringliteral_ee6e12ba256a78bc5d3ab9651804c8ab1f12e6bbf3894d4083f33e07309d1f38", 542 | "typeString": "literal_string \"foundry default caller\"" 543 | }, 544 | "value": "foundry default caller" 545 | } 546 | ], 547 | "expression": { 548 | "argumentTypes": [ 549 | { 550 | "typeIdentifier": "t_stringliteral_ee6e12ba256a78bc5d3ab9651804c8ab1f12e6bbf3894d4083f33e07309d1f38", 551 | "typeString": "literal_string \"foundry default caller\"" 552 | } 553 | ], 554 | "id": 2326, 555 | "name": "keccak256", 556 | "nodeType": "Identifier", 557 | "overloadedDeclarations": [], 558 | "referencedDeclaration": -8, 559 | "src": "879:9:1", 560 | "typeDescriptions": { 561 | "typeIdentifier": "t_function_keccak256_pure$_t_bytes_memory_ptr_$returns$_t_bytes32_$", 562 | "typeString": "function (bytes memory) pure returns (bytes32)" 563 | } 564 | }, 565 | "id": 2328, 566 | "isConstant": false, 567 | "isLValue": false, 568 | "isPure": true, 569 | "kind": "functionCall", 570 | "lValueRequested": false, 571 | "nameLocations": [], 572 | "names": [], 573 | "nodeType": "FunctionCall", 574 | "src": "879:35:1", 575 | "tryCall": false, 576 | "typeDescriptions": { 577 | "typeIdentifier": "t_bytes32", 578 | "typeString": "bytes32" 579 | } 580 | } 581 | ], 582 | "expression": { 583 | "argumentTypes": [ 584 | { 585 | "typeIdentifier": "t_bytes32", 586 | "typeString": "bytes32" 587 | } 588 | ], 589 | "id": 2325, 590 | "isConstant": false, 591 | "isLValue": false, 592 | "isPure": true, 593 | "lValueRequested": false, 594 | "nodeType": "ElementaryTypeNameExpression", 595 | "src": "871:7:1", 596 | "typeDescriptions": { 597 | "typeIdentifier": "t_type$_t_uint256_$", 598 | "typeString": "type(uint256)" 599 | }, 600 | "typeName": { 601 | "id": 2324, 602 | "name": "uint256", 603 | "nodeType": "ElementaryTypeName", 604 | "src": "871:7:1", 605 | "typeDescriptions": {} 606 | } 607 | }, 608 | "id": 2329, 609 | "isConstant": false, 610 | "isLValue": false, 611 | "isPure": true, 612 | "kind": "typeConversion", 613 | "lValueRequested": false, 614 | "nameLocations": [], 615 | "names": [], 616 | "nodeType": "FunctionCall", 617 | "src": "871:44:1", 618 | "tryCall": false, 619 | "typeDescriptions": { 620 | "typeIdentifier": "t_uint256", 621 | "typeString": "uint256" 622 | } 623 | } 624 | ], 625 | "expression": { 626 | "argumentTypes": [ 627 | { 628 | "typeIdentifier": "t_uint256", 629 | "typeString": "uint256" 630 | } 631 | ], 632 | "id": 2323, 633 | "isConstant": false, 634 | "isLValue": false, 635 | "isPure": true, 636 | "lValueRequested": false, 637 | "nodeType": "ElementaryTypeNameExpression", 638 | "src": "863:7:1", 639 | "typeDescriptions": { 640 | "typeIdentifier": "t_type$_t_uint160_$", 641 | "typeString": "type(uint160)" 642 | }, 643 | "typeName": { 644 | "id": 2322, 645 | "name": "uint160", 646 | "nodeType": "ElementaryTypeName", 647 | "src": "863:7:1", 648 | "typeDescriptions": {} 649 | } 650 | }, 651 | "id": 2330, 652 | "isConstant": false, 653 | "isLValue": false, 654 | "isPure": true, 655 | "kind": "typeConversion", 656 | "lValueRequested": false, 657 | "nameLocations": [], 658 | "names": [], 659 | "nodeType": "FunctionCall", 660 | "src": "863:53:1", 661 | "tryCall": false, 662 | "typeDescriptions": { 663 | "typeIdentifier": "t_uint160", 664 | "typeString": "uint160" 665 | } 666 | } 667 | ], 668 | "expression": { 669 | "argumentTypes": [ 670 | { 671 | "typeIdentifier": "t_uint160", 672 | "typeString": "uint160" 673 | } 674 | ], 675 | "id": 2321, 676 | "isConstant": false, 677 | "isLValue": false, 678 | "isPure": true, 679 | "lValueRequested": false, 680 | "nodeType": "ElementaryTypeNameExpression", 681 | "src": "855:7:1", 682 | "typeDescriptions": { 683 | "typeIdentifier": "t_type$_t_address_$", 684 | "typeString": "type(address)" 685 | }, 686 | "typeName": { 687 | "id": 2320, 688 | "name": "address", 689 | "nodeType": "ElementaryTypeName", 690 | "src": "855:7:1", 691 | "typeDescriptions": {} 692 | } 693 | }, 694 | "id": 2331, 695 | "isConstant": false, 696 | "isLValue": false, 697 | "isPure": true, 698 | "kind": "typeConversion", 699 | "lValueRequested": false, 700 | "nameLocations": [], 701 | "names": [], 702 | "nodeType": "FunctionCall", 703 | "src": "855:62:1", 704 | "tryCall": false, 705 | "typeDescriptions": { 706 | "typeIdentifier": "t_address", 707 | "typeString": "address" 708 | } 709 | }, 710 | "visibility": "internal" 711 | }, 712 | { 713 | "id": 2335, 714 | "nodeType": "VariableDeclaration", 715 | "src": "992:92:1", 716 | "nodes": [], 717 | "constant": true, 718 | "mutability": "constant", 719 | "name": "DEFAULT_TEST_CONTRACT", 720 | "nameLocation": "1018:21:1", 721 | "scope": 2354, 722 | "stateVariable": true, 723 | "storageLocation": "default", 724 | "typeDescriptions": { 725 | "typeIdentifier": "t_address", 726 | "typeString": "address" 727 | }, 728 | "typeName": { 729 | "id": 2333, 730 | "name": "address", 731 | "nodeType": "ElementaryTypeName", 732 | "src": "992:7:1", 733 | "stateMutability": "nonpayable", 734 | "typeDescriptions": { 735 | "typeIdentifier": "t_address", 736 | "typeString": "address" 737 | } 738 | }, 739 | "value": { 740 | "hexValue": "307835363135644542373938424233453464466130313339644661316233443433334363323362373266", 741 | "id": 2334, 742 | "isConstant": false, 743 | "isLValue": false, 744 | "isPure": true, 745 | "kind": "number", 746 | "lValueRequested": false, 747 | "nodeType": "Literal", 748 | "src": "1042:42:1", 749 | "typeDescriptions": { 750 | "typeIdentifier": "t_address", 751 | "typeString": "address" 752 | }, 753 | "value": "0x5615dEB798BB3E4dFa0139dFa1b3D433Cc23b72f" 754 | }, 755 | "visibility": "internal" 756 | }, 757 | { 758 | "id": 2338, 759 | "nodeType": "VariableDeclaration", 760 | "src": "1158:89:1", 761 | "nodes": [], 762 | "constant": true, 763 | "mutability": "constant", 764 | "name": "MULTICALL3_ADDRESS", 765 | "nameLocation": "1184:18:1", 766 | "scope": 2354, 767 | "stateVariable": true, 768 | "storageLocation": "default", 769 | "typeDescriptions": { 770 | "typeIdentifier": "t_address", 771 | "typeString": "address" 772 | }, 773 | "typeName": { 774 | "id": 2336, 775 | "name": "address", 776 | "nodeType": "ElementaryTypeName", 777 | "src": "1158:7:1", 778 | "stateMutability": "nonpayable", 779 | "typeDescriptions": { 780 | "typeIdentifier": "t_address", 781 | "typeString": "address" 782 | } 783 | }, 784 | "value": { 785 | "hexValue": "307863413131626465303539373762333633313136373032383836326245326131373339373643413131", 786 | "id": 2337, 787 | "isConstant": false, 788 | "isLValue": false, 789 | "isPure": true, 790 | "kind": "number", 791 | "lValueRequested": false, 792 | "nodeType": "Literal", 793 | "src": "1205:42:1", 794 | "typeDescriptions": { 795 | "typeIdentifier": "t_address", 796 | "typeString": "address" 797 | }, 798 | "value": "0xcA11bde05977b3631167028862bE2a173976CA11" 799 | }, 800 | "visibility": "internal" 801 | }, 802 | { 803 | "id": 2341, 804 | "nodeType": "VariableDeclaration", 805 | "src": "1294:130:1", 806 | "nodes": [], 807 | "constant": true, 808 | "mutability": "constant", 809 | "name": "SECP256K1_ORDER", 810 | "nameLocation": "1320:15:1", 811 | "scope": 2354, 812 | "stateVariable": true, 813 | "storageLocation": "default", 814 | "typeDescriptions": { 815 | "typeIdentifier": "t_uint256", 816 | "typeString": "uint256" 817 | }, 818 | "typeName": { 819 | "id": 2339, 820 | "name": "uint256", 821 | "nodeType": "ElementaryTypeName", 822 | "src": "1294:7:1", 823 | "typeDescriptions": { 824 | "typeIdentifier": "t_uint256", 825 | "typeString": "uint256" 826 | } 827 | }, 828 | "value": { 829 | "hexValue": "313135373932303839323337333136313935343233353730393835303038363837393037383532383337353634323739303734393034333832363035313633313431353138313631343934333337", 830 | "id": 2340, 831 | "isConstant": false, 832 | "isLValue": false, 833 | "isPure": true, 834 | "kind": "number", 835 | "lValueRequested": false, 836 | "nodeType": "Literal", 837 | "src": "1346:78:1", 838 | "typeDescriptions": { 839 | "typeIdentifier": "t_rational_115792089237316195423570985008687907852837564279074904382605163141518161494337_by_1", 840 | "typeString": "int_const 1157...(70 digits omitted)...4337" 841 | }, 842 | "value": "115792089237316195423570985008687907852837564279074904382605163141518161494337" 843 | }, 844 | "visibility": "internal" 845 | }, 846 | { 847 | "id": 2344, 848 | "nodeType": "VariableDeclaration", 849 | "src": "1431:126:1", 850 | "nodes": [], 851 | "constant": true, 852 | "mutability": "constant", 853 | "name": "UINT256_MAX", 854 | "nameLocation": "1457:11:1", 855 | "scope": 2354, 856 | "stateVariable": true, 857 | "storageLocation": "default", 858 | "typeDescriptions": { 859 | "typeIdentifier": "t_uint256", 860 | "typeString": "uint256" 861 | }, 862 | "typeName": { 863 | "id": 2342, 864 | "name": "uint256", 865 | "nodeType": "ElementaryTypeName", 866 | "src": "1431:7:1", 867 | "typeDescriptions": { 868 | "typeIdentifier": "t_uint256", 869 | "typeString": "uint256" 870 | } 871 | }, 872 | "value": { 873 | "hexValue": "313135373932303839323337333136313935343233353730393835303038363837393037383533323639393834363635363430353634303339343537353834303037393133313239363339393335", 874 | "id": 2343, 875 | "isConstant": false, 876 | "isLValue": false, 877 | "isPure": true, 878 | "kind": "number", 879 | "lValueRequested": false, 880 | "nodeType": "Literal", 881 | "src": "1479:78:1", 882 | "typeDescriptions": { 883 | "typeIdentifier": "t_rational_115792089237316195423570985008687907853269984665640564039457584007913129639935_by_1", 884 | "typeString": "int_const 1157...(70 digits omitted)...9935" 885 | }, 886 | "value": "115792089237316195423570985008687907853269984665640564039457584007913129639935" 887 | }, 888 | "visibility": "internal" 889 | }, 890 | { 891 | "id": 2350, 892 | "nodeType": "VariableDeclaration", 893 | "src": "1564:40:1", 894 | "nodes": [], 895 | "constant": true, 896 | "mutability": "constant", 897 | "name": "vm", 898 | "nameLocation": "1585:2:1", 899 | "scope": 2354, 900 | "stateVariable": true, 901 | "storageLocation": "default", 902 | "typeDescriptions": { 903 | "typeIdentifier": "t_contract$_Vm_$13464", 904 | "typeString": "contract Vm" 905 | }, 906 | "typeName": { 907 | "id": 2346, 908 | "nodeType": "UserDefinedTypeName", 909 | "pathNode": { 910 | "id": 2345, 911 | "name": "Vm", 912 | "nameLocations": [ 913 | "1564:2:1" 914 | ], 915 | "nodeType": "IdentifierPath", 916 | "referencedDeclaration": 13464, 917 | "src": "1564:2:1" 918 | }, 919 | "referencedDeclaration": 13464, 920 | "src": "1564:2:1", 921 | "typeDescriptions": { 922 | "typeIdentifier": "t_contract$_Vm_$13464", 923 | "typeString": "contract Vm" 924 | } 925 | }, 926 | "value": { 927 | "arguments": [ 928 | { 929 | "id": 2348, 930 | "name": "VM_ADDRESS", 931 | "nodeType": "Identifier", 932 | "overloadedDeclarations": [], 933 | "referencedDeclaration": 2312, 934 | "src": "1593:10:1", 935 | "typeDescriptions": { 936 | "typeIdentifier": "t_address", 937 | "typeString": "address" 938 | } 939 | } 940 | ], 941 | "expression": { 942 | "argumentTypes": [ 943 | { 944 | "typeIdentifier": "t_address", 945 | "typeString": "address" 946 | } 947 | ], 948 | "id": 2347, 949 | "name": "Vm", 950 | "nodeType": "Identifier", 951 | "overloadedDeclarations": [], 952 | "referencedDeclaration": 13464, 953 | "src": "1590:2:1", 954 | "typeDescriptions": { 955 | "typeIdentifier": "t_type$_t_contract$_Vm_$13464_$", 956 | "typeString": "type(contract Vm)" 957 | } 958 | }, 959 | "id": 2349, 960 | "isConstant": false, 961 | "isLValue": false, 962 | "isPure": true, 963 | "kind": "typeConversion", 964 | "lValueRequested": false, 965 | "nameLocations": [], 966 | "names": [], 967 | "nodeType": "FunctionCall", 968 | "src": "1590:14:1", 969 | "tryCall": false, 970 | "typeDescriptions": { 971 | "typeIdentifier": "t_contract$_Vm_$13464", 972 | "typeString": "contract Vm" 973 | } 974 | }, 975 | "visibility": "internal" 976 | }, 977 | { 978 | "id": 2353, 979 | "nodeType": "VariableDeclaration", 980 | "src": "1610:28:1", 981 | "nodes": [], 982 | "constant": false, 983 | "mutability": "mutable", 984 | "name": "stdstore", 985 | "nameLocation": "1630:8:1", 986 | "scope": 2354, 987 | "stateVariable": true, 988 | "storageLocation": "default", 989 | "typeDescriptions": { 990 | "typeIdentifier": "t_struct$_StdStorage_$8374_storage", 991 | "typeString": "struct StdStorage" 992 | }, 993 | "typeName": { 994 | "id": 2352, 995 | "nodeType": "UserDefinedTypeName", 996 | "pathNode": { 997 | "id": 2351, 998 | "name": "StdStorage", 999 | "nameLocations": [ 1000 | "1610:10:1" 1001 | ], 1002 | "nodeType": "IdentifierPath", 1003 | "referencedDeclaration": 8374, 1004 | "src": "1610:10:1" 1005 | }, 1006 | "referencedDeclaration": 8374, 1007 | "src": "1610:10:1", 1008 | "typeDescriptions": { 1009 | "typeIdentifier": "t_struct$_StdStorage_$8374_storage_ptr", 1010 | "typeString": "struct StdStorage" 1011 | } 1012 | }, 1013 | "visibility": "internal" 1014 | } 1015 | ], 1016 | "abstract": true, 1017 | "baseContracts": [], 1018 | "canonicalName": "CommonBase", 1019 | "contractDependencies": [], 1020 | "contractKind": "contract", 1021 | "fullyImplemented": true, 1022 | "linearizedBaseContracts": [ 1023 | 2354 1024 | ], 1025 | "name": "CommonBase", 1026 | "nameLocation": "166:10:1", 1027 | "scope": 2367, 1028 | "usedErrors": [] 1029 | }, 1030 | { 1031 | "id": 2357, 1032 | "nodeType": "ContractDefinition", 1033 | "src": "1643:43:1", 1034 | "nodes": [], 1035 | "abstract": true, 1036 | "baseContracts": [ 1037 | { 1038 | "baseName": { 1039 | "id": 2355, 1040 | "name": "CommonBase", 1041 | "nameLocations": [ 1042 | "1673:10:1" 1043 | ], 1044 | "nodeType": "IdentifierPath", 1045 | "referencedDeclaration": 2354, 1046 | "src": "1673:10:1" 1047 | }, 1048 | "id": 2356, 1049 | "nodeType": "InheritanceSpecifier", 1050 | "src": "1673:10:1" 1051 | } 1052 | ], 1053 | "canonicalName": "TestBase", 1054 | "contractDependencies": [], 1055 | "contractKind": "contract", 1056 | "fullyImplemented": true, 1057 | "linearizedBaseContracts": [ 1058 | 2357, 1059 | 2354 1060 | ], 1061 | "name": "TestBase", 1062 | "nameLocation": "1661:8:1", 1063 | "scope": 2367, 1064 | "usedErrors": [] 1065 | }, 1066 | { 1067 | "id": 2366, 1068 | "nodeType": "ContractDefinition", 1069 | "src": "1688:104:1", 1070 | "nodes": [ 1071 | { 1072 | "id": 2365, 1073 | "nodeType": "VariableDeclaration", 1074 | "src": "1737:52:1", 1075 | "nodes": [], 1076 | "constant": true, 1077 | "mutability": "constant", 1078 | "name": "vmSafe", 1079 | "nameLocation": "1762:6:1", 1080 | "scope": 2366, 1081 | "stateVariable": true, 1082 | "storageLocation": "default", 1083 | "typeDescriptions": { 1084 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1085 | "typeString": "contract VmSafe" 1086 | }, 1087 | "typeName": { 1088 | "id": 2361, 1089 | "nodeType": "UserDefinedTypeName", 1090 | "pathNode": { 1091 | "id": 2360, 1092 | "name": "VmSafe", 1093 | "nameLocations": [ 1094 | "1737:6:1" 1095 | ], 1096 | "nodeType": "IdentifierPath", 1097 | "referencedDeclaration": 12992, 1098 | "src": "1737:6:1" 1099 | }, 1100 | "referencedDeclaration": 12992, 1101 | "src": "1737:6:1", 1102 | "typeDescriptions": { 1103 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1104 | "typeString": "contract VmSafe" 1105 | } 1106 | }, 1107 | "value": { 1108 | "arguments": [ 1109 | { 1110 | "id": 2363, 1111 | "name": "VM_ADDRESS", 1112 | "nodeType": "Identifier", 1113 | "overloadedDeclarations": [], 1114 | "referencedDeclaration": 2312, 1115 | "src": "1778:10:1", 1116 | "typeDescriptions": { 1117 | "typeIdentifier": "t_address", 1118 | "typeString": "address" 1119 | } 1120 | } 1121 | ], 1122 | "expression": { 1123 | "argumentTypes": [ 1124 | { 1125 | "typeIdentifier": "t_address", 1126 | "typeString": "address" 1127 | } 1128 | ], 1129 | "id": 2362, 1130 | "name": "VmSafe", 1131 | "nodeType": "Identifier", 1132 | "overloadedDeclarations": [], 1133 | "referencedDeclaration": 12992, 1134 | "src": "1771:6:1", 1135 | "typeDescriptions": { 1136 | "typeIdentifier": "t_type$_t_contract$_VmSafe_$12992_$", 1137 | "typeString": "type(contract VmSafe)" 1138 | } 1139 | }, 1140 | "id": 2364, 1141 | "isConstant": false, 1142 | "isLValue": false, 1143 | "isPure": true, 1144 | "kind": "typeConversion", 1145 | "lValueRequested": false, 1146 | "nameLocations": [], 1147 | "names": [], 1148 | "nodeType": "FunctionCall", 1149 | "src": "1771:18:1", 1150 | "tryCall": false, 1151 | "typeDescriptions": { 1152 | "typeIdentifier": "t_contract$_VmSafe_$12992", 1153 | "typeString": "contract VmSafe" 1154 | } 1155 | }, 1156 | "visibility": "internal" 1157 | } 1158 | ], 1159 | "abstract": true, 1160 | "baseContracts": [ 1161 | { 1162 | "baseName": { 1163 | "id": 2358, 1164 | "name": "CommonBase", 1165 | "nameLocations": [ 1166 | "1720:10:1" 1167 | ], 1168 | "nodeType": "IdentifierPath", 1169 | "referencedDeclaration": 2354, 1170 | "src": "1720:10:1" 1171 | }, 1172 | "id": 2359, 1173 | "nodeType": "InheritanceSpecifier", 1174 | "src": "1720:10:1" 1175 | } 1176 | ], 1177 | "canonicalName": "ScriptBase", 1178 | "contractDependencies": [], 1179 | "contractKind": "contract", 1180 | "fullyImplemented": true, 1181 | "linearizedBaseContracts": [ 1182 | 2366, 1183 | 2354 1184 | ], 1185 | "name": "ScriptBase", 1186 | "nameLocation": "1706:10:1", 1187 | "scope": 2367, 1188 | "usedErrors": [] 1189 | } 1190 | ], 1191 | "license": "MIT" 1192 | }, 1193 | "id": 1 1194 | } --------------------------------------------------------------------------------