748 lines
118 KiB
JSON
748 lines
118 KiB
JSON
{
|
|
"address": "0x5536F82a106D8C1f5F61D111DF57cae6218F6b54",
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "membershipDeposit",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "depth",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "_poseidonHasher",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "_verifier",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "constructor"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "DuplicateIdCommitment",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "FullTree",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "InsufficientContractBalance",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "required",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "provided",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "InsufficientDeposit",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "InsufficientWithdrawalBalance",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "InvalidIdCommitment",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "InvalidProof",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "to",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "InvalidReceiverAddress",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "MemberHasNoStake",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "MemberNotRegistered",
|
|
"type": "error"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "index",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "MemberRegistered",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "index",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "MemberWithdrawn",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "DEPTH",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "MEMBERSHIP_DEPOSIT",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "SET_SIZE",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "computeRoot",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "deployedBlockNumber",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint32",
|
|
"name": "",
|
|
"type": "uint32"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "idCommitmentIndex",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "imtData",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "depth",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "root",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "numberOfLeaves",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bool",
|
|
"name": "useDefaultZeroes",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "isValidCommitment",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bool",
|
|
"name": "",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "memberExists",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bool",
|
|
"name": "",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "members",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "poseidonHasher",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract PoseidonHasher",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "idCommitment",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address payable",
|
|
"name": "receiver",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "uint256[8]",
|
|
"name": "proof",
|
|
"type": "uint256[8]"
|
|
}
|
|
],
|
|
"name": "slash",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "stakedAmounts",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "verifier",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract IVerifier",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "withdraw",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "withdrawalBalance",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"transactionHash": "0x9f57d8acb10fe22ada61aa61acec1db3e5ee73f9319f8211dcf3e70e36409914",
|
|
"receipt": {
|
|
"to": null,
|
|
"from": "0x3F47b2a1dF96DE2e198d646b598C37251CCC3b98",
|
|
"contractAddress": "0x5536F82a106D8C1f5F61D111DF57cae6218F6b54",
|
|
"transactionIndex": 0,
|
|
"gasUsed": "1395916",
|
|
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
"blockHash": "0xa6335ff162878f9dcc7235783ed18b261e9ac415240f57e49f323658f5481d36",
|
|
"transactionHash": "0x9f57d8acb10fe22ada61aa61acec1db3e5ee73f9319f8211dcf3e70e36409914",
|
|
"logs": [],
|
|
"blockNumber": 3324844,
|
|
"cumulativeGasUsed": "1395916",
|
|
"status": 1,
|
|
"byzantium": true
|
|
},
|
|
"args": [
|
|
1000000000000000,
|
|
20,
|
|
"0xe893c04DfB939CFC2FBC024Dae1B17623a487e0A",
|
|
"0xDFD4FC1c81Bd499d814fF876e34637bE58F85b90"
|
|
],
|
|
"numDeployments": 1,
|
|
"solcInputHash": "3f87313134e2217cb187bd594084789f",
|
|
"metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"membershipDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_poseidonHasher\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DuplicateIdCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FullTree\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientContractBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"required\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"provided\",\"type\":\"uint256\"}],\"name\":\"InsufficientDeposit\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InsufficientWithdrawalBalance\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"}],\"name\":\"InvalidIdCommitment\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProof\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"InvalidReceiverAddress\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"}],\"name\":\"MemberHasNoStake\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"}],\"name\":\"MemberNotRegistered\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"MemberRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"MemberWithdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPTH\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MEMBERSHIP_DEPOSIT\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SET_SIZE\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"computeRoot\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"deployedBlockNumber\",\"outputs\":[{\"internalType\":\"uint32\",\"name\":\"\",\"type\":\"uint32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"idCommitmentIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"imtData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"depth\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"root\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"numberOfLeaves\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"useDefaultZeroes\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"}],\"name\":\"isValidCommitment\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"memberExists\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"members\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"poseidonHasher\",\"outputs\":[{\"internalType\":\"contract PoseidonHasher\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"idCommitment\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256[8]\",\"name\":\"proof\",\"type\":\"uint256[8]\"}],\"name\":\"slash\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakedAmounts\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"contract IVerifier\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"withdrawalBalance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"InsufficientDeposit(uint256,uint256)\":[{\"params\":{\"provided\":\"The provided deposit amount\",\"required\":\"The required deposit amount\"}}]},\"kind\":\"dev\",\"methods\":{\"register(uint256)\":{\"params\":{\"idCommitment\":\"The idCommitment of the member\"}},\"slash(uint256,address,uint256[8])\":{\"details\":\"Allows a user to slash a member\",\"params\":{\"idCommitment\":\"The idCommitment of the member\"}}},\"version\":1},\"userdoc\":{\"errors\":{\"DuplicateIdCommitment()\":[{\"notice\":\"Member is already registered\"}],\"FullTree()\":[{\"notice\":\"The tree is full\"}],\"InsufficientContractBalance()\":[{\"notice\":\"Contract has insufficient balance to return\"}],\"InsufficientDeposit(uint256,uint256)\":[{\"notice\":\"Invalid deposit amount\"}],\"InsufficientWithdrawalBalance()\":[{\"notice\":\"User has insufficient balance to withdraw\"}],\"InvalidIdCommitment(uint256)\":[{\"notice\":\"Invalid idCommitment\"}],\"InvalidProof()\":[{\"notice\":\"Invalid proof\"}],\"InvalidReceiverAddress(address)\":[{\"notice\":\"Invalid receiver address, when the receiver is the contract itself or 0x0\"}],\"MemberHasNoStake(uint256)\":[{\"notice\":\"Member has no stake\"}],\"MemberNotRegistered(uint256)\":[{\"notice\":\"Member is not registered\"}]},\"events\":{\"MemberRegistered(uint256,uint256)\":{\"notice\":\"Emitted when a new member is added to the set\"},\"MemberWithdrawn(uint256,uint256)\":{\"notice\":\"Emitted when a member is removed from the set\"}},\"kind\":\"user\",\"methods\":{\"DEPTH()\":{\"notice\":\"The depth of the merkle tree\"},\"MEMBERSHIP_DEPOSIT()\":{\"notice\":\"The deposit amount required to register as a member\"},\"SET_SIZE()\":{\"notice\":\"The size of the merkle tree, i.e 2^depth\"},\"deployedBlockNumber()\":{\"notice\":\"the deployed block number\"},\"idCommitmentIndex()\":{\"notice\":\"The index of the next member to be registered\"},\"imtData()\":{\"notice\":\"the Incremental Merkle Tree\"},\"memberExists(uint256)\":{\"notice\":\"The membership status of each member\"},\"members(uint256)\":{\"notice\":\"The membership status of each member maps from idCommitment to their index in the set\"},\"poseidonHasher()\":{\"notice\":\"The Poseidon hasher contract\"},\"register(uint256)\":{\"notice\":\"Allows a user to register as a member\"},\"stakedAmounts(uint256)\":{\"notice\":\"The amount of eth staked by each member maps from idCommitment to the amount staked\"},\"verifier()\":{\"notice\":\"The groth16 verifier contract\"},\"withdraw()\":{\"notice\":\"Allows a user to withdraw funds allocated to them upon slashing a member\"},\"withdrawalBalance(address)\":{\"notice\":\"The balance of each user that can be withdrawn\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Rln.sol\":\"RLN\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\"]},\"sources\":{\"@zk-kit/imt.sol/BinaryIMT.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\n\\n// Each incremental tree has certain properties and data that will\\n// be used to add new leaves.\\nstruct BinaryIMTData {\\n uint256 depth; // Depth of the tree (levels - 1).\\n uint256 root; // Root hash of the tree.\\n uint256 numberOfLeaves; // Number of leaves of the tree.\\n mapping(uint256 => uint256) zeroes; // Zero hashes used for empty nodes (level -> zero hash).\\n // The nodes of the subtrees used in the last addition of a leaf (level -> [left node, right node]).\\n mapping(uint256 => uint256[2]) lastSubtrees; // Caching these values is essential to efficient appends.\\n bool useDefaultZeroes;\\n}\\n\\n/// @title Incremental binary Merkle tree.\\n/// @dev The incremental tree allows to calculate the root hash each time a leaf is added, ensuring\\n/// the integrity of the tree.\\nlibrary BinaryIMT {\\n uint8 public constant MAX_DEPTH = 32;\\n uint256 public constant SNARK_SCALAR_FIELD =\\n 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n uint256 public constant Z_0 = 0;\\n uint256 public constant Z_1 = 14744269619966411208579211824598458697587494354926760081771325075741142829156;\\n uint256 public constant Z_2 = 7423237065226347324353380772367382631490014989348495481811164164159255474657;\\n uint256 public constant Z_3 = 11286972368698509976183087595462810875513684078608517520839298933882497716792;\\n uint256 public constant Z_4 = 3607627140608796879659380071776844901612302623152076817094415224584923813162;\\n uint256 public constant Z_5 = 19712377064642672829441595136074946683621277828620209496774504837737984048981;\\n uint256 public constant Z_6 = 20775607673010627194014556968476266066927294572720319469184847051418138353016;\\n uint256 public constant Z_7 = 3396914609616007258851405644437304192397291162432396347162513310381425243293;\\n uint256 public constant Z_8 = 21551820661461729022865262380882070649935529853313286572328683688269863701601;\\n uint256 public constant Z_9 = 6573136701248752079028194407151022595060682063033565181951145966236778420039;\\n uint256 public constant Z_10 = 12413880268183407374852357075976609371175688755676981206018884971008854919922;\\n uint256 public constant Z_11 = 14271763308400718165336499097156975241954733520325982997864342600795471836726;\\n uint256 public constant Z_12 = 20066985985293572387227381049700832219069292839614107140851619262827735677018;\\n uint256 public constant Z_13 = 9394776414966240069580838672673694685292165040808226440647796406499139370960;\\n uint256 public constant Z_14 = 11331146992410411304059858900317123658895005918277453009197229807340014528524;\\n uint256 public constant Z_15 = 15819538789928229930262697811477882737253464456578333862691129291651619515538;\\n uint256 public constant Z_16 = 19217088683336594659449020493828377907203207941212636669271704950158751593251;\\n uint256 public constant Z_17 = 21035245323335827719745544373081896983162834604456827698288649288827293579666;\\n uint256 public constant Z_18 = 6939770416153240137322503476966641397417391950902474480970945462551409848591;\\n uint256 public constant Z_19 = 10941962436777715901943463195175331263348098796018438960955633645115732864202;\\n uint256 public constant Z_20 = 15019797232609675441998260052101280400536945603062888308240081994073687793470;\\n uint256 public constant Z_21 = 11702828337982203149177882813338547876343922920234831094975924378932809409969;\\n uint256 public constant Z_22 = 11217067736778784455593535811108456786943573747466706329920902520905755780395;\\n uint256 public constant Z_23 = 16072238744996205792852194127671441602062027943016727953216607508365787157389;\\n uint256 public constant Z_24 = 17681057402012993898104192736393849603097507831571622013521167331642182653248;\\n uint256 public constant Z_25 = 21694045479371014653083846597424257852691458318143380497809004364947786214945;\\n uint256 public constant Z_26 = 8163447297445169709687354538480474434591144168767135863541048304198280615192;\\n uint256 public constant Z_27 = 14081762237856300239452543304351251708585712948734528663957353575674639038357;\\n uint256 public constant Z_28 = 16619959921569409661790279042024627172199214148318086837362003702249041851090;\\n uint256 public constant Z_29 = 7022159125197495734384997711896547675021391130223237843255817587255104160365;\\n uint256 public constant Z_30 = 4114686047564160449611603615418567457008101555090703535405891656262658644463;\\n uint256 public constant Z_31 = 12549363297364877722388257367377629555213421373705596078299904496781819142130;\\n uint256 public constant Z_32 = 21443572485391568159800782191812935835534334817699172242223315142338162256601;\\n\\n function defaultZero(uint256 index) public pure returns (uint256) {\\n if (index == 0) return Z_0;\\n if (index == 1) return Z_1;\\n if (index == 2) return Z_2;\\n if (index == 3) return Z_3;\\n if (index == 4) return Z_4;\\n if (index == 5) return Z_5;\\n if (index == 6) return Z_6;\\n if (index == 7) return Z_7;\\n if (index == 8) return Z_8;\\n if (index == 9) return Z_9;\\n if (index == 10) return Z_10;\\n if (index == 11) return Z_11;\\n if (index == 12) return Z_12;\\n if (index == 13) return Z_13;\\n if (index == 14) return Z_14;\\n if (index == 15) return Z_15;\\n if (index == 16) return Z_16;\\n if (index == 17) return Z_17;\\n if (index == 18) return Z_18;\\n if (index == 19) return Z_19;\\n if (index == 20) return Z_20;\\n if (index == 21) return Z_21;\\n if (index == 22) return Z_22;\\n if (index == 23) return Z_23;\\n if (index == 24) return Z_24;\\n if (index == 25) return Z_25;\\n if (index == 26) return Z_26;\\n if (index == 27) return Z_27;\\n if (index == 28) return Z_28;\\n if (index == 29) return Z_29;\\n if (index == 30) return Z_30;\\n if (index == 31) return Z_31;\\n if (index == 32) return Z_32;\\n revert(\\\"IncrementalBinaryTree: defaultZero bad index\\\");\\n }\\n\\n /// @dev Initializes a tree.\\n /// @param self: Tree data.\\n /// @param depth: Depth of the tree.\\n /// @param zero: Zero value to be used.\\n function init(BinaryIMTData storage self, uint256 depth, uint256 zero) public {\\n require(zero < SNARK_SCALAR_FIELD, \\\"BinaryIMT: leaf must be < SNARK_SCALAR_FIELD\\\");\\n require(depth > 0 && depth <= MAX_DEPTH, \\\"BinaryIMT: tree depth must be between 1 and 32\\\");\\n\\n self.depth = depth;\\n\\n for (uint8 i = 0; i < depth; ) {\\n self.zeroes[i] = zero;\\n zero = PoseidonT3.hash([zero, zero]);\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n self.root = zero;\\n }\\n\\n function initWithDefaultZeroes(BinaryIMTData storage self, uint256 depth) public {\\n require(depth > 0 && depth <= MAX_DEPTH, \\\"BinaryIMT: tree depth must be between 1 and 32\\\");\\n\\n self.depth = depth;\\n self.useDefaultZeroes = true;\\n\\n self.root = defaultZero(depth);\\n }\\n\\n /// @dev Inserts a leaf in the tree.\\n /// @param self: Tree data.\\n /// @param leaf: Leaf to be inserted.\\n function insert(BinaryIMTData storage self, uint256 leaf) public returns (uint256) {\\n uint256 depth = self.depth;\\n\\n require(leaf < SNARK_SCALAR_FIELD, \\\"BinaryIMT: leaf must be < SNARK_SCALAR_FIELD\\\");\\n require(self.numberOfLeaves < 2 ** depth, \\\"BinaryIMT: tree is full\\\");\\n\\n uint256 index = self.numberOfLeaves;\\n uint256 hash = leaf;\\n bool useDefaultZeroes = self.useDefaultZeroes;\\n\\n for (uint8 i = 0; i < depth; ) {\\n if (index & 1 == 0) {\\n self.lastSubtrees[i] = [hash, useDefaultZeroes ? defaultZero(i) : self.zeroes[i]];\\n } else {\\n self.lastSubtrees[i][1] = hash;\\n }\\n\\n hash = PoseidonT3.hash(self.lastSubtrees[i]);\\n index >>= 1;\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n self.root = hash;\\n self.numberOfLeaves += 1;\\n return hash;\\n }\\n\\n /// @dev Updates a leaf in the tree.\\n /// @param self: Tree data.\\n /// @param leaf: Leaf to be updated.\\n /// @param newLeaf: New leaf.\\n /// @param proofSiblings: Array of the sibling nodes of the proof of membership.\\n /// @param proofPathIndices: Path of the proof of membership.\\n function update(\\n BinaryIMTData storage self,\\n uint256 leaf,\\n uint256 newLeaf,\\n uint256[] calldata proofSiblings,\\n uint8[] calldata proofPathIndices\\n ) public {\\n require(newLeaf != leaf, \\\"BinaryIMT: new leaf cannot be the same as the old one\\\");\\n require(newLeaf < SNARK_SCALAR_FIELD, \\\"BinaryIMT: new leaf must be < SNARK_SCALAR_FIELD\\\");\\n require(verify(self, leaf, proofSiblings, proofPathIndices), \\\"BinaryIMT: leaf is not part of the tree\\\");\\n\\n uint256 depth = self.depth;\\n uint256 hash = newLeaf;\\n uint256 updateIndex;\\n\\n for (uint8 i = 0; i < depth; ) {\\n updateIndex |= uint256(proofPathIndices[i]) << uint256(i);\\n\\n if (proofPathIndices[i] == 0) {\\n if (proofSiblings[i] == self.lastSubtrees[i][1]) {\\n self.lastSubtrees[i][0] = hash;\\n }\\n\\n hash = PoseidonT3.hash([hash, proofSiblings[i]]);\\n } else {\\n if (proofSiblings[i] == self.lastSubtrees[i][0]) {\\n self.lastSubtrees[i][1] = hash;\\n }\\n\\n hash = PoseidonT3.hash([proofSiblings[i], hash]);\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n require(updateIndex < self.numberOfLeaves, \\\"BinaryIMT: leaf index out of range\\\");\\n\\n self.root = hash;\\n }\\n\\n /// @dev Removes a leaf from the tree.\\n /// @param self: Tree data.\\n /// @param leaf: Leaf to be removed.\\n /// @param proofSiblings: Array of the sibling nodes of the proof of membership.\\n /// @param proofPathIndices: Path of the proof of membership.\\n function remove(\\n BinaryIMTData storage self,\\n uint256 leaf,\\n uint256[] calldata proofSiblings,\\n uint8[] calldata proofPathIndices\\n ) public {\\n update(self, leaf, self.useDefaultZeroes ? Z_0 : self.zeroes[0], proofSiblings, proofPathIndices);\\n }\\n\\n /// @dev Verify if the path is correct and the leaf is part of the tree.\\n /// @param self: Tree data.\\n /// @param leaf: Leaf to be removed.\\n /// @param proofSiblings: Array of the sibling nodes of the proof of membership.\\n /// @param proofPathIndices: Path of the proof of membership.\\n /// @return True or false.\\n function verify(\\n BinaryIMTData storage self,\\n uint256 leaf,\\n uint256[] calldata proofSiblings,\\n uint8[] calldata proofPathIndices\\n ) private view returns (bool) {\\n require(leaf < SNARK_SCALAR_FIELD, \\\"BinaryIMT: leaf must be < SNARK_SCALAR_FIELD\\\");\\n uint256 depth = self.depth;\\n require(\\n proofPathIndices.length == depth && proofSiblings.length == depth,\\n \\\"BinaryIMT: length of path is not correct\\\"\\n );\\n\\n uint256 hash = leaf;\\n\\n for (uint8 i = 0; i < depth; ) {\\n require(proofSiblings[i] < SNARK_SCALAR_FIELD, \\\"BinaryIMT: sibling node must be < SNARK_SCALAR_FIELD\\\");\\n\\n require(proofPathIndices[i] == 1 || proofPathIndices[i] == 0, \\\"BinaryIMT: path index is neither 0 nor 1\\\");\\n\\n if (proofPathIndices[i] == 0) {\\n hash = PoseidonT3.hash([hash, proofSiblings[i]]);\\n } else {\\n hash = PoseidonT3.hash([proofSiblings[i], hash]);\\n }\\n\\n unchecked {\\n ++i;\\n }\\n }\\n\\n return hash == self.root;\\n }\\n}\\n\",\"keccak256\":\"0xdc7e7cc2e8176bb76bbd788ae2d50a4e9db13d3256d8b07a695856e073a78586\",\"license\":\"MIT\"},\"contracts/IVerifier.sol\":{\"content\":\"// SPDX-License-Identifier: Apache-2.0 OR MIT\\npragma solidity 0.8.15;\\n\\ninterface IVerifier {\\n function verifyProof(uint256[2] memory a, uint256[2][2] memory b, uint256[2] memory c, uint256[2] memory input)\\n external\\n view\\n returns (bool);\\n}\\n\",\"keccak256\":\"0x538e61fbb62bf1ef9f0c3f7e7d771ddfc8506a97e7d98aada763830fc741d8b8\",\"license\":\"Apache-2.0 OR MIT\"},\"contracts/PoseidonHasher.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.15;\\n\\nimport {PoseidonT3} from \\\"poseidon-solidity/PoseidonT3.sol\\\";\\n\\ninterface IPoseidonHasher {\\n /// @notice Hashes the input using the Poseidon hash function, n = 2\\n /// @param inputs The input to hash\\n function hash(uint256[2] memory inputs) external pure returns (uint256 result);\\n}\\n\\ncontract PoseidonHasher is IPoseidonHasher {\\n uint256 public constant Q = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\n function hash(uint256[2] memory inputs) external pure override returns (uint256 result) {\\n return PoseidonT3.hash(inputs);\\n }\\n}\\n\",\"keccak256\":\"0xdc41072af08ab2875f030e6ccc5781a7d5906aeaccc44535bb076e09146e86f9\",\"license\":\"MIT\"},\"contracts/Rln.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity 0.8.15;\\n\\nimport \\\"./RlnBase.sol\\\";\\n\\ncontract RLN is RlnBase {\\n constructor(uint256 membershipDeposit, uint256 depth, address _poseidonHasher, address _verifier)\\n RlnBase(membershipDeposit, depth, _poseidonHasher, _verifier)\\n {}\\n\\n function _validateRegistration(uint256 idCommitment) internal pure override {}\\n\\n function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof)\\n internal\\n pure\\n override\\n {}\\n}\\n\",\"keccak256\":\"0x32563f17d27b3468d141b47935cc7efaad748e44cb7605c9df0e9f4da62f4167\",\"license\":\"MIT\"},\"contracts/RlnBase.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity 0.8.15;\\n\\nimport {PoseidonHasher} from \\\"./PoseidonHasher.sol\\\";\\nimport {IVerifier} from \\\"./IVerifier.sol\\\";\\nimport {BinaryIMT, BinaryIMTData} from \\\"@zk-kit/imt.sol/BinaryIMT.sol\\\";\\n\\n/// The tree is full\\nerror FullTree();\\n\\n/// Invalid deposit amount\\n/// @param required The required deposit amount\\n/// @param provided The provided deposit amount\\nerror InsufficientDeposit(uint256 required, uint256 provided);\\n\\n/// Member is already registered\\nerror DuplicateIdCommitment();\\n\\n/// Failed validation on registration/slashing\\nerror FailedValidation();\\n\\n/// Invalid idCommitment\\nerror InvalidIdCommitment(uint256 idCommitment);\\n\\n/// Invalid receiver address, when the receiver is the contract itself or 0x0\\nerror InvalidReceiverAddress(address to);\\n\\n/// Member is not registered\\nerror MemberNotRegistered(uint256 idCommitment);\\n\\n/// Member has no stake\\nerror MemberHasNoStake(uint256 idCommitment);\\n\\n/// User has insufficient balance to withdraw\\nerror InsufficientWithdrawalBalance();\\n\\n/// Contract has insufficient balance to return\\nerror InsufficientContractBalance();\\n\\n/// Invalid proof\\nerror InvalidProof();\\n\\nabstract contract RlnBase {\\n /// @notice The deposit amount required to register as a member\\n uint256 public immutable MEMBERSHIP_DEPOSIT;\\n\\n /// @notice The depth of the merkle tree\\n uint256 public immutable DEPTH;\\n\\n /// @notice The size of the merkle tree, i.e 2^depth\\n uint256 public immutable SET_SIZE;\\n\\n /// @notice The index of the next member to be registered\\n uint256 public idCommitmentIndex = 0;\\n\\n /// @notice The amount of eth staked by each member\\n /// maps from idCommitment to the amount staked\\n mapping(uint256 => uint256) public stakedAmounts;\\n\\n /// @notice The membership status of each member\\n /// maps from idCommitment to their index in the set\\n mapping(uint256 => uint256) public members;\\n\\n /// @notice The membership status of each member\\n mapping(uint256 => bool) public memberExists;\\n\\n /// @notice The balance of each user that can be withdrawn\\n mapping(address => uint256) public withdrawalBalance;\\n\\n /// @notice The Poseidon hasher contract\\n PoseidonHasher public immutable poseidonHasher;\\n\\n /// @notice The groth16 verifier contract\\n IVerifier public immutable verifier;\\n\\n /// @notice the deployed block number\\n uint32 public immutable deployedBlockNumber;\\n\\n /// @notice the Incremental Merkle Tree\\n BinaryIMTData public imtData;\\n\\n /// Emitted when a new member is added to the set\\n /// @param idCommitment The idCommitment of the member\\n /// @param index The index of the member in the set\\n event MemberRegistered(uint256 idCommitment, uint256 index);\\n\\n /// Emitted when a member is removed from the set\\n /// @param idCommitment The idCommitment of the member\\n /// @param index The index of the member in the set\\n event MemberWithdrawn(uint256 idCommitment, uint256 index);\\n\\n modifier onlyValidIdCommitment(uint256 idCommitment) {\\n if (!isValidCommitment(idCommitment)) revert InvalidIdCommitment(idCommitment);\\n _;\\n }\\n\\n constructor(uint256 membershipDeposit, uint256 depth, address _poseidonHasher, address _verifier) {\\n MEMBERSHIP_DEPOSIT = membershipDeposit;\\n DEPTH = depth;\\n SET_SIZE = 1 << depth;\\n poseidonHasher = PoseidonHasher(_poseidonHasher);\\n verifier = IVerifier(_verifier);\\n deployedBlockNumber = uint32(block.number);\\n BinaryIMT.initWithDefaultZeroes(imtData, 20);\\n }\\n\\n /// Allows a user to register as a member\\n /// @param idCommitment The idCommitment of the member\\n function register(uint256 idCommitment) external payable virtual onlyValidIdCommitment(idCommitment) {\\n if (msg.value != MEMBERSHIP_DEPOSIT) {\\n revert InsufficientDeposit(MEMBERSHIP_DEPOSIT, msg.value);\\n }\\n _validateRegistration(idCommitment);\\n _register(idCommitment, msg.value);\\n }\\n\\n /// Registers a member\\n /// @param idCommitment The idCommitment of the member\\n /// @param stake The amount of eth staked by the member\\n function _register(uint256 idCommitment, uint256 stake) internal virtual {\\n if (memberExists[idCommitment]) revert DuplicateIdCommitment();\\n if (idCommitmentIndex >= SET_SIZE) revert FullTree();\\n\\n members[idCommitment] = idCommitmentIndex;\\n memberExists[idCommitment] = true;\\n BinaryIMT.insert(imtData, idCommitment);\\n stakedAmounts[idCommitment] = stake;\\n\\n emit MemberRegistered(idCommitment, idCommitmentIndex);\\n idCommitmentIndex += 1;\\n }\\n\\n /// @dev Inheriting contracts MUST override this function\\n function _validateRegistration(uint256 idCommitment) internal view virtual;\\n\\n /// @dev Allows a user to slash a member\\n /// @param idCommitment The idCommitment of the member\\n function slash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof)\\n external\\n virtual\\n onlyValidIdCommitment(idCommitment)\\n {\\n _validateSlash(idCommitment, receiver, proof);\\n _slash(idCommitment, receiver, proof);\\n }\\n\\n /// @dev Slashes a member by removing them from the set, and adding their\\n /// stake to the receiver's available withdrawal balance\\n /// @param idCommitment The idCommitment of the member\\n /// @param receiver The address to receive the funds\\n function _slash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof) internal virtual {\\n if (receiver == address(this) || receiver == address(0)) {\\n revert InvalidReceiverAddress(receiver);\\n }\\n\\n if (memberExists[idCommitment] == false) revert MemberNotRegistered(idCommitment);\\n // check if member is registered\\n if (stakedAmounts[idCommitment] == 0) {\\n revert MemberHasNoStake(idCommitment);\\n }\\n\\n if (!_verifyProof(idCommitment, receiver, proof)) {\\n revert InvalidProof();\\n }\\n\\n uint256 amountToTransfer = stakedAmounts[idCommitment];\\n\\n // delete member\\n uint256 index = members[idCommitment];\\n members[idCommitment] = 0;\\n memberExists[idCommitment] = false;\\n stakedAmounts[idCommitment] = 0;\\n // TODO: remove from IMT\\n\\n // refund deposit\\n withdrawalBalance[receiver] += amountToTransfer;\\n\\n emit MemberWithdrawn(idCommitment, index);\\n }\\n\\n function _validateSlash(uint256 idCommitment, address payable receiver, uint256[8] calldata proof)\\n internal\\n view\\n virtual;\\n\\n /// Allows a user to withdraw funds allocated to them upon slashing a member\\n function withdraw() external virtual {\\n uint256 amount = withdrawalBalance[msg.sender];\\n\\n if (amount == 0) revert InsufficientWithdrawalBalance();\\n if (amount > address(this).balance) {\\n revert InsufficientContractBalance();\\n }\\n\\n withdrawalBalance[msg.sender] = 0;\\n\\n payable(msg.sender).transfer(amount);\\n }\\n\\n /// Hashes a value using the Poseidon hasher\\n /// NOTE: The variant of Poseidon we use accepts only 1 input, assume n=2\\n /// @param inputs The values to hash\\n function hash(uint256[2] memory inputs) internal view returns (uint256) {\\n return poseidonHasher.hash(inputs);\\n }\\n\\n function isValidCommitment(uint256 idCommitment) public view returns (bool) {\\n return idCommitment != 0 && idCommitment < poseidonHasher.Q();\\n }\\n\\n /// @dev Groth16 proof verification\\n function _verifyProof(uint256 idCommitment, address receiver, uint256[8] calldata proof)\\n internal\\n view\\n virtual\\n returns (bool)\\n {\\n return verifier.verifyProof(\\n [proof[0], proof[1]],\\n [[proof[2], proof[3]], [proof[4], proof[5]]],\\n [proof[6], proof[7]],\\n [idCommitment, uint256(uint160(receiver))]\\n );\\n }\\n\\n function computeRoot() external view returns (uint256) {\\n return imtData.root;\\n }\\n}\\n\",\"keccak256\":\"0xe9068967bdc4e81b4ac05436fe967d60a62681a7c8df6798c847c1ab02b0aa1f\",\"license\":\"MIT\"},\"poseidon-solidity/PoseidonT3.sol\":{\"content\":\"/// SPDX-License-Identifier: MIT\\npragma solidity >=0.7.0;\\n\\nlibrary PoseidonT3 {\\n uint constant M00 = 0x109b7f411ba0e4c9b2b70caf5c36a7b194be7c11ad24378bfedb68592ba8118b;\\n uint constant M01 = 0x2969f27eed31a480b9c36c764379dbca2cc8fdd1415c3dded62940bcde0bd771;\\n uint constant M02 = 0x143021ec686a3f330d5f9e654638065ce6cd79e28c5b3753326244ee65a1b1a7;\\n uint constant M10 = 0x16ed41e13bb9c0c66ae119424fddbcbc9314dc9fdbdeea55d6c64543dc4903e0;\\n uint constant M11 = 0x2e2419f9ec02ec394c9871c832963dc1b89d743c8c7b964029b2311687b1fe23;\\n uint constant M12 = 0x176cc029695ad02582a70eff08a6fd99d057e12e58e7d7b6b16cdfabc8ee2911;\\n\\n // See here for a simplified implementation: https://github.com/vimwitch/poseidon-solidity/blob/e57becdabb65d99fdc586fe1e1e09e7108202d53/contracts/Poseidon.sol#L40\\n // Inspired by: https://github.com/iden3/circomlibjs/blob/v0.0.8/src/poseidon_slow.js\\n function hash(uint[2] memory) public pure returns (uint) {\\n assembly {\\n let F := 21888242871839275222246405745257275088548364400416034343698204186575808495617\\n let M20 := 0x2b90bba00fca0589f617e7dcbfe82e0df706ab640ceb247b791a93b74e36736d\\n let M21 := 0x101071f0032379b697315876690f053d148d4e109f5fb065c8aacc55a0f89bfa\\n let M22 := 0x19a3fc0a56702bf417ba7fee3802593fa644470307043f7773279cd71d25d5e0\\n\\n // load the inputs from memory\\n let state1 := add(mod(mload(0x80), F), 0x00f1445235f2148c5986587169fc1bcd887b08d4d00868df5696fff40956e864)\\n let state2 := add(mod(mload(0xa0), F), 0x08dff3487e8ac99e1f29a058d0fa80b930c728730b7ab36ce879f3890ecf73f5)\\n let scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(\\n 0x2f27be690fdaee46c3ce28f7532b13c856c35342c84bda6e20966310fadc01d0,\\n add(add(15452833169820924772166449970675545095234312153403844297388521437673434406763, mulmod(state1, M10, F)), mulmod(state2, M20, F))\\n )\\n let scratch1 := add(\\n 0x2b2ae1acf68b7b8d2416bebf3d4f6234b763fe04b8043ee48b8327bebca16cf2,\\n add(add(18674271267752038776579386132900109523609358935013267566297499497165104279117, mulmod(state1, M11, F)), mulmod(state2, M21, F))\\n )\\n let scratch2 := add(\\n 0x0319d062072bef7ecca5eac06f97d4d55952c175ab6b03eae64b44c7dbf11cfa,\\n add(add(14817777843080276494683266178512808687156649753153012854386334860566696099579, mulmod(state1, M12, F)), mulmod(state2, M22, F))\\n )\\n let state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x28813dcaebaeaa828a376df87af4a63bc8b7bf27ad49c6298ef7b387bf28526d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2727673b2ccbc903f181bf38e1c1d40d2033865200c352bc150928adddf9cb78, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x234ec45ca27727c2e74abd2b2a1494cd6efbd43e340587d6b8fb9e31e65cc632, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x15b52534031ae18f7f862cb2cf7cf760ab10a8150a337b1ccd99ff6e8797d428, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0dc8fad6d9e4b35f5ed9a3d186b79ce38e0e8a8d1b58b132d701d4eecf68d1f6, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1bcd95ffc211fbca600f705fad3fb567ea4eb378f62e1fec97805518a47e4d9c, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x10520b0ab721cadfe9eff81b016fc34dc76da36c2578937817cb978d069de559, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f6d48149b8e7f7d9b257d8ed5fbbaf42932498075fed0ace88a9eb81f5627f6, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1d9655f652309014d29e00ef35a2089bfff8dc1c816f0dc9ca34bdb5460c8705, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04df5a56ff95bcafb051f7b1cd43a99ba731ff67e47032058fe3d4185697cc7d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0672d995f8fff640151b3d290cedaf148690a10a8c8424a7f6ec282b6e4be828, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x099952b414884454b21200d7ffafdd5f0c9a9dcc06f2708e9fc1d8209b5c75b9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x052cba2255dfd00c7c483143ba8d469448e43586a9b4cd9183fd0e843a6b9fa6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0b8badee690adb8eb0bd74712b7999af82de55707251ad7716077cb93c464ddc, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x119b1590f13307af5a1ee651020c07c749c15d60683a8050b963d0a8e4b2bdd1, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x03150b7cd6d5d17b2529d36be0f67b832c4acfc884ef4ee5ce15be0bfb4a8d09, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2cc6182c5e14546e3cf1951f173912355374efb83d80898abe69cb317c9ea565, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x005032551e6378c450cfe129a404b3764218cadedac14e2b92d2cd73111bf0f9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x233237e3289baa34bb147e972ebcb9516469c399fcc069fb88f9da2cc28276b5, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x05c8f4f4ebd4a6e3c980d31674bfbe6323037f21b34ae5a4e80c2d4c24d60280, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a7b1db13042d396ba05d818a319f25252bcf35ef3aeed91ee1f09b2590fc65b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a73b71f9b210cf5b14296572c9d32dbf156e2b086ff47dc5df542365a404ec0, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1ac9b0417abcc9a1935107e9ffc91dc3ec18f2c4dbe7f22976a760bb5c50c460, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x12c0339ae08374823fabb076707ef479269f3e4d6cb104349015ee046dc93fc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b7475b102a165ad7f5b18db4e1e704f52900aa3253baac68246682e56e9a28e, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x037c2849e191ca3edb1c5e49f6e8b8917c843e379366f2ea32ab3aa88d7f8448, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x05a6811f8556f014e92674661e217e9bd5206c5c93a07dc145fdb176a716346f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x29a795e7d98028946e947b75d54e9f044076e87a7b2883b47b675ef5f38bd66e, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x20439a0c84b322eb45a3857afc18f5826e8c7382c8a1585c507be199981fd22f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2e0ba8d94d9ecf4a94ec2050c7371ff1bb50f27799a84b6d4a2a6f2a0982c887, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x143fd115ce08fb27ca38eb7cce822b4517822cd2109048d2e6d0ddcca17d71c8, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0c64cbecb1c734b857968dbbdcf813cdf8611659323dbcbfc84323623be9caf1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x028a305847c683f646fca925c163ff5ae74f348d62c2b670f1426cef9403da53, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2e4ef510ff0b6fda5fa940ab4c4380f26a6bcb64d89427b824d6755b5db9e30c, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0081c95bc43384e663d79270c956ce3b8925b4f6d033b078b96384f50579400e, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2ed5f0c91cbd9749187e2fade687e05ee2491b349c039a0bba8a9f4023a0bb38, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x30509991f88da3504bbf374ed5aae2f03448a22c76234c8c990f01f33a735206, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c3f20fd55409a53221b7c4d49a356b9f0a1119fb2067b41a7529094424ec6ad, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10b4e7f3ab5df003049514459b6e18eec46bb2213e8e131e170887b47ddcb96c, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2a1982979c3ff7f43ddd543d891c2abddd80f804c077d775039aa3502e43adef, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c74ee64f15e1db6feddbead56d6d55dba431ebc396c9af95cad0f1315bd5c91, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07533ec850ba7f98eab9303cace01b4b9e4f2e8b82708cfa9c2fe45a0ae146a0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x21576b438e500449a151e4eeaf17b154285c68f42d42c1808a11abf3764c0750, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2f17c0559b8fe79608ad5ca193d62f10bce8384c815f0906743d6930836d4a9e, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x2d477e3862d07708a79e8aae946170bc9775a4201318474ae665b0b1b7e2730e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x162f5243967064c390e095577984f291afba2266c38f5abcd89be0f5b2747eab, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2b4cb233ede9ba48264ecd2c8ae50d1ad7a8596a87f29f8a7777a70092393311, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2c8fbcb2dd8573dc1dbaf8f4622854776db2eece6d85c4cf4254e7c35e03b07a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1d6f347725e4816af2ff453f0cd56b199e1b61e9f601e9ade5e88db870949da9, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x204b0c397f4ebe71ebc2d8b3df5b913df9e6ac02b68d31324cd49af5c4565529, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0c4cb9dc3c4fd8174f1149b3c63c3c2f9ecb827cd7dc25534ff8fb75bc79c502, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x174ad61a1448c899a25416474f4930301e5c49475279e0639a616ddc45bc7b54, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a96177bcf4d8d89f759df4ec2f3cde2eaaa28c177cc0fa13a9816d49a38d2ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x066d04b24331d71cd0ef8054bc60c4ff05202c126a233c1a8242ace360b8a30a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a4c4fc6ec0b0cf52195782871c6dd3b381cc65f72e02ad527037a62aa1bd804, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x13ab2d136ccf37d447e9f2e14a7cedc95e727f8446f6d9d7e55afc01219fd649, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1121552fca26061619d24d843dc82769c1b04fcec26f55194c2e3e869acc6a9a, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00ef653322b13d6c889bc81715c37d77a6cd267d595c4a8909a5546c7c97cff1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0e25483e45a665208b261d8ba74051e6400c776d652595d9845aca35d8a397d3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29f536dcb9dd7682245264659e15d88e395ac3d4dde92d8c46448db979eeba89, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2a56ef9f2c53febadfda33575dbdbd885a124e2780bbea170e456baace0fa5be, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1c8361c78eb5cf5decfb7a2d17b5c409f2ae2999a46762e8ee416240a8cb9af1, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x151aff5f38b20a0fc0473089aaf0206b83e8e68a764507bfd3d0ab4be74319c5, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x04c6187e41ed881dc1b239c88f7f9d43a9f52fc8c8b6cdd1e76e47615b51f100, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x13b37bd80f4d27fb10d84331f6fb6d534b81c61ed15776449e801b7ddc9c2967, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x01a5c536273c2d9df578bfbd32c17b7a2ce3664c2a52032c9321ceb1c4e8a8e4, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ab3561834ca73835ad05f5d7acb950b4a9a2c666b9726da832239065b7c3b02, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1d4d8ec291e720db200fe6d686c0d613acaf6af4e95d3bf69f7ed516a597b646, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x041294d2cc484d228f5784fe7919fd2bb925351240a04b711514c9c80b65af1d, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x154ac98e01708c611c4fa715991f004898f57939d126e392042971dd90e81fc6, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0b339d8acca7d4f83eedd84093aef51050b3684c88f8b0b04524563bc6ea4da4, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0955e49e6610c94254a4f84cfbab344598f0e71eaff4a7dd81ed95b50839c82e, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x06746a6156eba54426b9e22206f15abca9a6f41e6f535c6f3525401ea0654626, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f18f5a0ecd1423c496f3820c549c27838e5790e2bd0a196ac917c7ff32077fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04f6eeca1751f7308ac59eff5beb261e4bb563583ede7bc92a738223d6f76e13, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2b56973364c4c4f5c1a3ec4da3cdce038811eb116fb3e45bc1768d26fc0b3758, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x123769dd49d5b054dcd76b89804b1bcb8e1392b385716a5d83feb65d437f29ef, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2147b424fc48c80a88ee52b91169aacea989f6446471150994257b2fb01c63e9, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0fdc1f58548b85701a6c5505ea332a29647e6f34ad4243c2ea54ad897cebe54d, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x12373a8251fea004df68abcf0f7786d4bceff28c5dbbe0c3944f685cc0a0b1f2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x21e4f4ea5f35f85bad7ea52ff742c9e8a642756b6af44203dd8a1f35c1a90035, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x16243916d69d2ca3dfb4722224d4c462b57366492f45e90d8a81934f1bc3b147, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1efbe46dd7a578b4f66f9adbc88b4378abc21566e1a0453ca13a4159cac04ac2, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x07ea5e8537cf5dd08886020e23a7f387d468d5525be66f853b672cc96a88969a, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x05a8c4f9968b8aa3b7b478a30f9a5b63650f19a75e7ce11ca9fe16c0b76c00bc, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x20f057712cc21654fbfe59bd345e8dac3f7818c701b9c7882d9d57b72a32e83f, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x04a12ededa9dfd689672f8c67fee31636dcd8e88d01d49019bd90b33eb33db69, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x27e88d8c15f37dcee44f1e5425a51decbd136ce5091a6767e49ec9544ccd101a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2feed17b84285ed9b8a5c8c5e95a41f66e096619a7703223176c41ee433de4d1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1ed7cc76edf45c7c404241420f729cf394e5942911312a0d6972b8bd53aff2b8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x15742e99b9bfa323157ff8c586f5660eac6783476144cdcadf2874be45466b1a, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1aac285387f65e82c895fc6887ddf40577107454c6ec0317284f033f27d0c785, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x25851c3c845d4790f9ddadbdb6057357832e2e7a49775f71ec75a96554d67c77, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x15a5821565cc2ec2ce78457db197edf353b7ebba2c5523370ddccc3d9f146a67, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2411d57a4813b9980efa7e31a1db5966dcf64f36044277502f15485f28c71727, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x002e6f8d6520cd4713e335b8c0b6d2e647e9a98e12f4cd2558828b5ef6cb4c9b, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2ff7bc8f4380cde997da00b616b0fcd1af8f0e91e2fe1ed7398834609e0315d2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x00b9831b948525595ee02724471bcd182e9521f6b7bb68f1e93be4febb0d3cbe, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0a2f53768b8ebf6a86913b0e57c04e011ca408648a4743a87d77adbf0c9c3512, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x00248156142fd0373a479f91ff239e960f599ff7e94be69b7f2a290305e1198d, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x171d5620b87bfb1328cf8c02ab3f0c9a397196aa6a542c2350eb512a2b2bcda9, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x170a4f55536f7dc970087c7c10d6fad760c952172dd54dd99d1045e4ec34a808, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x29aba33f799fe66c2ef3134aea04336ecc37e38c1cd211ba482eca17e2dbfae1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1e9bc179a4fdd758fdd1bb1945088d47e70d114a03f6a0e8b5ba650369e64973, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1dd269799b660fad58f7f4892dfb0b5afeaad869a9c4b44f9c9e1c43bdaf8f09, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x22cdbc8b70117ad1401181d02e15459e7ccd426fe869c7c95d1dd2cb0f24af38, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x0ef042e454771c533a9f57a55c503fcefd3150f52ed94a7cd5ba93b9c7dacefd, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x11609e06ad6c8fe2f287f3036037e8851318e8b08a0359a03b304ffca62e8284, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1166d9e554616dba9e753eea427c17b7fecd58c076dfe42708b08f5b783aa9af, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2de52989431a859593413026354413db177fbf4cd2ac0b56f855a888357ee466, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x3006eb4ffc7a85819a6da492f3a8ac1df51aee5b17b8e89d74bf01cf5f71e9ad, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2af41fbb61ba8a80fdcf6fff9e3f6f422993fe8f0a4639f962344c8225145086, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x119e684de476155fe5a6b41a8ebc85db8718ab27889e85e781b214bace4827c3, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1835b786e2e8925e188bea59ae363537b51248c23828f047cff784b97b3fd800, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x28201a34c594dfa34d794996c6433a20d152bac2a7905c926c40e285ab32eeb6, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x083efd7a27d1751094e80fefaf78b000864c82eb571187724a761f88c22cc4e7, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0b6f88a3577199526158e61ceea27be811c16df7774dd8519e079564f61fd13b, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0ec868e6d15e51d9644f66e1d6471a94589511ca00d29e1014390e6ee4254f5b, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2af33e3f866771271ac0c9b3ed2e1142ecd3e74b939cd40d00d937ab84c98591, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0b520211f904b5e7d09b5d961c6ace7734568c547dd6858b364ce5e47951f178, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0b2d722d0919a1aad8db58f10062a92ea0c56ac4270e822cca228620188a1d40, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x1f790d4d7f8cf094d980ceb37c2453e957b54a9991ca38bbe0061d1ed6e562d4, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x0171eb95dfbf7d1eaea97cd385f780150885c16235a2a6a8da92ceb01e504233, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0c2d0e3b5fd57549329bf6885da66b9b790b40defd2c8650762305381b168873, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1162fb28689c27154e5a8228b4e72b377cbcafa589e283c35d3803054407a18d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2f1459b65dee441b64ad386a91e8310f282c5a92a89e19921623ef8249711bc0, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x1e6ff3216b688c3d996d74367d5cd4c1bc489d46754eb712c243f70d1b53cfbb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x01ca8be73832b8d0681487d27d157802d741a6f36cdc2a0576881f9326478875, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1f7735706ffe9fc586f976d5bdf223dc680286080b10cea00b9b5de315f9650e, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2522b60f4ea3307640a0c2dce041fba921ac10a3d5f096ef4745ca838285f019, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x23f0bee001b1029d5255075ddc957f833418cad4f52b6c3f8ce16c235572575b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2bc1ae8b8ddbb81fcaac2d44555ed5685d142633e9df905f66d9401093082d59, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0f9406b8296564a37304507b8dba3ed162371273a07b1fc98011fcd6ad72205f, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x2360a8eb0cc7defa67b72998de90714e17e75b174a52ee4acb126c8cd995f0a8, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x15871a5cddead976804c803cbaef255eb4815a5e96df8b006dcbbc2767f88948, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193a56766998ee9e0a8652dd2f3b1da0362f4f54f72379544f957ccdeefb420f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x2a394a43934f86982f9be56ff4fab1703b2e63c8ad334834e4309805e777ae0f, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1859954cfeb8695f3e8b635dcb345192892cd11223443ba7b4166e8876c0d142, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x04e1181763050e58013444dbcb99f1902b11bc25d90bbdca408d3819f4fed32b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0fdb253dee83869d40c335ea64de8c5bb10eb82db08b5e8b1f5e5552bfd05f23, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x058cbe8a9a5027bdaa4efb623adead6275f08686f1c08984a9d7c5bae9b4f1c0, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x1382edce9971e186497eadb1aeb1f52b23b4b83bef023ab0d15228b4cceca59a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x03464990f045c6ee0819ca51fd11b0be7f61b8eb99f14b77e1e6634601d9e8b5, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x23f7bfc8720dc296fff33b41f98ff83c6fcab4605db2eb5aaa5bc137aeb70a58, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x0a59a158e3eec2117e6e94e7f0e9decf18c3ffd5e1531a9219636158bbaf62f2, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x06ec54c80381c052b58bf23b312ffd3ce2c4eba065420af8f4c23ed0075fd07b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x118872dc832e0eb5476b56648e867ec8b09340f7a7bcb1b4962f0ff9ed1f9d01, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x13d69fa127d834165ad5c7cba7ad59ed52e0b0f0e42d7fea95e1906b520921b1, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x169a177f63ea681270b1c6877a73d21bde143942fb71dc55fd8a49f19f10c77b, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x04ef51591c6ead97ef42f287adce40d93abeb032b922f66ffb7e9a5a7450544d, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x256e175a1dc079390ecd7ca703fb2e3b19ec61805d4f03ced5f45ee6dd0f69ec, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x30102d28636abd5fe5f2af412ff6004f75cc360d3205dd2da002813d3e2ceeb2, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x10998e42dfcd3bbf1c0714bc73eb1bf40443a3fa99bef4a31fd31be182fcc792, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x193edd8e9fcf3d7625fa7d24b598a1d89f3362eaf4d582efecad76f879e36860, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x18168afd34f2d915d0368ce80b7b3347d1c7a561ce611425f2664d7aa51f0b5d, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x29383c01ebd3b6ab0c017656ebe658b6a328ec77bc33626e29e2e95b33ea6111, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x10646d2f2603de39a1f4ae5e7771a64a702db6e86fb76ab600bf573f9010c711, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0beb5e07d1b27145f575f1395a55bf132f90c25b40da7b3864d0242dcb1117fb, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x16d685252078c133dc0d3ecad62b5c8830f95bb2e54b59abdffbf018d96fa336, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x0a6abd1d833938f33c74154e0404b4b40a555bbbec21ddfafd672dd62047f01a, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1a679f5d36eb7b5c8ea12a4c2dedc8feb12dffeec450317270a6f19b34cf1860, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x0980fb233bd456c23974d50e0ebfde4726a423eada4e8f6ffbc7592e3f1b93d6, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x161b42232e61b84cbf1810af93a38fc0cece3d5628c9282003ebacb5c312c72b, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0ada10a90c7f0520950f7d47a60d5e6a493f09787f1564e5d09203db47de1a0b, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1a730d372310ba82320345a29ac4238ed3f07a8a2b4e121bb50ddb9af407f451, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x2c8120f268ef054f817064c369dda7ea908377feaba5c4dffbda10ef58e8c556, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1c7c8824f758753fa57c00789c684217b930e95313bcb73e6e7b8649a4968f70, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x2cd9ed31f5f8691c8e39e4077a74faa0f400ad8b491eb3f7b47b27fa3fd1cf77, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x23ff4f9d46813457cf60d92f57618399a5e022ac321ca550854ae23918a22eea, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x09945a5d147a4f66ceece6405dddd9d0af5a2c5103529407dff1ea58f180426d, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x188d9c528025d4c2b67660c6b771b90f7c7da6eaa29d3f268a6dd223ec6fc630, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x3050e37996596b7f81f68311431d8734dba7d926d3633595e0c0d8ddf4f0f47f, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x15af1169396830a91600ca8102c35c426ceae5461e3f95d89d829518d30afd78, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x1da6d09885432ea9a06d9f37f873d985dae933e351466b2904284da3320d8acc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := add(0x2796ea90d269af29f5f8acf33921124e4e4fad3dbe658945e546ee411ddaa9cb, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x202d7dd1da0f6b4b0325c8b3307742f01e15612ec8e9304a7cb0319e01d32d60, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x096d6790d05bb759156a952ba263d672a2d7f9c788f4c831a29dace4c0f8be5f, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := add(0x054efa1f65b0fce283808965275d877b438da23ce5b13e1963798cb1447d25a4, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x1b162f83d917e93edb3308c29802deb9d8aa690113b2e14864ccf6e18e4165f1, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x21e5241e12564dd6fd9f1cdd2a0de39eedfefc1466cc568ec5ceb745a0506edc, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x1cfb5662e8cf5ac9226a80ee17b36abecb73ab5f87e161927b4349e10e4bdf08, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x0f21177e302a771bbae6d8d1ecb373b62c99af346220ac0129c53f666eb24100, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1671522374606992affb0dd7f71b12bec4236aede6290546bcef7e1f515c2320, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n scratch0 := add(0x0fa3ec5b9488259c2eb4cf24501bfad9be2ec9e42c5cc8ccd419d2a692cad870, add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)))\\n scratch1 := add(0x193c0e04e0bd298357cb266c1506080ed36edce85c648cc085e8c57b1ab54bba, add(add(mulmod(state0, M01, F), mulmod(state1, M11, F)), mulmod(state2, M21, F)))\\n scratch2 := add(0x102adf8ef74735a27e9128306dcbc3c99f6f7291cd406578ce14ea2adaba68f8, add(add(mulmod(state0, M02, F), mulmod(state1, M12, F)), mulmod(state2, M22, F)))\\n state0 := mulmod(scratch0, scratch0, F)\\n scratch0 := mulmod(mulmod(state0, state0, F), scratch0, F)\\n state0 := mulmod(scratch1, scratch1, F)\\n scratch1 := mulmod(mulmod(state0, state0, F), scratch1, F)\\n state0 := mulmod(scratch2, scratch2, F)\\n scratch2 := mulmod(mulmod(state0, state0, F), scratch2, F)\\n state0 := add(0x0fe0af7858e49859e2a54d6f1ad945b1316aa24bfbdd23ae40a6d0cb70c3eab1, add(add(mulmod(scratch0, M00, F), mulmod(scratch1, M10, F)), mulmod(scratch2, M20, F)))\\n state1 := add(0x216f6717bbc7dedb08536a2220843f4e2da5f1daa9ebdefde8a5ea7344798d22, add(add(mulmod(scratch0, M01, F), mulmod(scratch1, M11, F)), mulmod(scratch2, M21, F)))\\n state2 := add(0x1da55cc900f0d21f4a3e694391918a1b3c23b2ac773c6b3ef88e2e4228325161, add(add(mulmod(scratch0, M02, F), mulmod(scratch1, M12, F)), mulmod(scratch2, M22, F)))\\n scratch0 := mulmod(state0, state0, F)\\n state0 := mulmod(mulmod(scratch0, scratch0, F), state0, F)\\n scratch0 := mulmod(state1, state1, F)\\n state1 := mulmod(mulmod(scratch0, scratch0, F), state1, F)\\n scratch0 := mulmod(state2, state2, F)\\n state2 := mulmod(mulmod(scratch0, scratch0, F), state2, F)\\n\\n mstore(0x0, mod(add(add(mulmod(state0, M00, F), mulmod(state1, M10, F)), mulmod(state2, M20, F)), F))\\n\\n return(0, 0x20)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0102caa303bbc6690508f3615604f7730789ed990058c9513a87ccb30e4835be\",\"license\":\"MIT\"}},\"version\":1}",
|
|
"bytecode": "0x610140604052600080553480156200001657600080fd5b5060405162001a3f38038062001a3f83398181016040528101906200003c9190620001fc565b8383838383608081815250508260a08181525050826001901b60c081815250508173ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff16815250504363ffffffff166101208163ffffffff16815250507316eff5b01123605924d9BF74Ed947F8Fd3015f446314d8c626600560146040518363ffffffff1660e01b815260040162000117929190620002c2565b60006040518083038186803b1580156200013057600080fd5b505af415801562000145573d6000803e3d6000fd5b505050505050505050505050620002ef565b600080fd5b6000819050919050565b62000171816200015c565b81146200017d57600080fd5b50565b600081519050620001918162000166565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001c48262000197565b9050919050565b620001d681620001b7565b8114620001e257600080fd5b50565b600081519050620001f681620001cb565b92915050565b6000806000806080858703121562000219576200021862000157565b5b6000620002298782880162000180565b94505060206200023c8782880162000180565b93505060406200024f87828801620001e5565b92505060606200026287828801620001e5565b91505092959194509250565b8082525050565b6000819050919050565b6000819050919050565b6000620002aa620002a46200029e8462000275565b6200027f565b6200015c565b9050919050565b620002bc8162000289565b82525050565b6000604082019050620002d960008301856200026e565b620002e86020830184620002b1565b9392505050565b60805160a05160c05160e05161010051610120516116dd6200036260003960006106850152600081816104cb0152610d8e01526000818161043201526104ef0152600081816107a20152610bff015260006107480152600081816108110152818161083801526108ae01526116dd6000f3fe6080604052600436106100fe5760003560e01c80636bdcc8ab11610095578063bc49912811610064578063bc4991281461032a578063c5b208ff14610367578063d0383d68146103a4578063f207564e146103cf578063f220b9ec146103eb576100fe565b80636bdcc8ab1461026e5780638be9b119146102ab57806398366e35146102d4578063ae74552a146102ff576100fe565b80633c979b5f116100d15780633c979b5f146101c15780633ccfd60b146101ef5780634add651e146102065780635daf08ca14610231576100fe565b806315068a5a1461010357806322d9730c1461012e5780632b7ac3f31461016b578063331b6ab314610196575b600080fd5b34801561010f57600080fd5b50610118610416565b6040516101259190610f9c565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190610fe8565b610423565b6040516101629190611030565b60405180910390f35b34801561017757600080fd5b506101806104c9565b60405161018d91906110ca565b60405180910390f35b3480156101a257600080fd5b506101ab6104ed565b6040516101b89190611106565b60405180910390f35b3480156101cd57600080fd5b506101d6610511565b6040516101e69493929190611121565b60405180910390f35b3480156101fb57600080fd5b5061020461053c565b005b34801561021257600080fd5b5061021b610683565b6040516102289190611185565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190610fe8565b6106a7565b6040516102659190610f9c565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190610fe8565b6106bf565b6040516102a29190611030565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190611205565b6106df565b005b3480156102e057600080fd5b506102e9610746565b6040516102f69190610f9c565b60405180910390f35b34801561030b57600080fd5b5061031461076a565b6040516103219190610f9c565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190610fe8565b610770565b60405161035e9190610f9c565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190611297565b610788565b60405161039b9190610f9c565b60405180910390f35b3480156103b057600080fd5b506103b96107a0565b6040516103c69190610f9c565b60405180910390f35b6103e960048036038101906103e49190610fe8565b6107c4565b005b3480156103f757600080fd5b506104006108ac565b60405161040d9190610f9c565b60405180910390f35b6000600560010154905090565b60008082141580156104c257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e493ef8c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf91906112d9565b82105b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60058060000154908060010154908060020154908060050160009054906101000a900460ff16905084565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081036105ba576040517f6f50367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478111156105f4576040517f786e0a9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561067f573d6000803e3d6000fd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915054906101000a900460ff1681565b826106e981610423565b61072a57806040517f7f3e75af0000000000000000000000000000000000000000000000000000000081526004016107219190610f9c565b60405180910390fd5b6107358484846108d0565b6107408484846108d5565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005481565b60016020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b806107ce81610423565b61080f57806040517f7f3e75af0000000000000000000000000000000000000000000000000000000081526004016108069190610f9c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003414610895577f0000000000000000000000000000000000000000000000000000000000000000346040517f25c3f46e00000000000000000000000000000000000000000000000000000000815260040161088c929190611306565b60405180910390fd5b61089e82610ba3565b6108a88234610ba6565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b505050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061093b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561097d57816040517f4a149d080000000000000000000000000000000000000000000000000000000081526004016109749190611350565b60405180910390fd5b600015156003600085815260200190815260200160002060009054906101000a900460ff161515036109e657826040517f5a971ebb0000000000000000000000000000000000000000000000000000000081526004016109dd9190610f9c565b60405180910390fd5b6000600160008581526020019081526020016000205403610a3e57826040517faabeeba5000000000000000000000000000000000000000000000000000000008152600401610a359190610f9c565b60405180910390fd5b610a49838383610d8a565b610a7f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160008581526020019081526020016000205490506000600260008681526020019081526020016000205490506000600260008781526020019081526020016000208190555060006003600087815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600160008781526020019081526020016000208190555081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b5c919061139a565b925050819055507f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a9438582604051610b94929190611306565b60405180910390a15050505050565b50565b6003600083815260200190815260200160002060009054906101000a900460ff1615610bfd576040517e0a60f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060005410610c58576040517f57f6953100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054600260008481526020019081526020016000208190555060016003600084815260200190815260200160002060006101000a81548160ff0219169083151502179055507316eff5b01123605924d9BF74Ed947F8Fd3015f4463143dc3836005846040518363ffffffff1660e01b8152600401610cd8929190611406565b602060405180830381865af4158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1991906112d9565b508060016000848152602001908152602001600020819055507f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d282600054604051610d65929190611306565b60405180910390a16001600080828254610d7f919061139a565b925050819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5c9d69e604051806040016040528085600060088110610de757610de661142f565b5b6020020135815260200185600160088110610e0557610e0461142f565b5b60200201358152506040518060400160405280604051806040016040528088600260088110610e3757610e3661142f565b5b6020020135815260200188600360088110610e5557610e5461142f565b5b60200201358152508152602001604051806040016040528088600460088110610e8157610e8061142f565b5b6020020135815260200188600560088110610e9f57610e9e61142f565b5b6020020135815250815250604051806040016040528087600660088110610ec957610ec861142f565b5b6020020135815260200187600760088110610ee757610ee661142f565b5b602002013581525060405180604001604052808a81526020018973ffffffffffffffffffffffffffffffffffffffff168152506040518563ffffffff1660e01b8152600401610f399493929190611607565b602060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a919061167a565b90509392505050565b6000819050919050565b610f9681610f83565b82525050565b6000602082019050610fb16000830184610f8d565b92915050565b600080fd5b610fc581610f83565b8114610fd057600080fd5b50565b600081359050610fe281610fbc565b92915050565b600060208284031215610ffe57610ffd610fb7565b5b600061100c84828501610fd3565b91505092915050565b60008115159050919050565b61102a81611015565b82525050565b60006020820190506110456000830184611021565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061109061108b6110868461104b565b61106b565b61104b565b9050919050565b60006110a282611075565b9050919050565b60006110b482611097565b9050919050565b6110c4816110a9565b82525050565b60006020820190506110df60008301846110bb565b92915050565b60006110f082611097565b9050919050565b611100816110e5565b82525050565b600060208201905061111b60008301846110f7565b92915050565b60006080820190506111366000830187610f8d565b6111436020830186610f8d565b6111506040830185610f8d565b61115d6060830184611021565b95945050505050565b600063ffffffff82169050919050565b61117f81611166565b82525050565b600060208201905061119a6000830184611176565b92915050565b60006111ab8261104b565b9050919050565b6111bb816111a0565b81146111c657600080fd5b50565b6000813590506111d8816111b2565b92915050565b600080fd5b6000819050826020600802820111156111ff576111fe6111de565b5b92915050565b6000806000610140848603121561121f5761121e610fb7565b5b600061122d86828701610fd3565b935050602061123e868287016111c9565b925050604061124f868287016111e3565b9150509250925092565b60006112648261104b565b9050919050565b61127481611259565b811461127f57600080fd5b50565b6000813590506112918161126b565b92915050565b6000602082840312156112ad576112ac610fb7565b5b60006112bb84828501611282565b91505092915050565b6000815190506112d381610fbc565b92915050565b6000602082840312156112ef576112ee610fb7565b5b60006112fd848285016112c4565b91505092915050565b600060408201905061131b6000830185610f8d565b6113286020830184610f8d565b9392505050565b600061133a82611097565b9050919050565b61134a8161132f565b82525050565b60006020820190506113656000830184611341565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006113a582610f83565b91506113b083610f83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113e5576113e461136b565b5b828201905092915050565b8082525050565b61140081610f83565b82525050565b600060408201905061141b60008301856113f0565b61142860208301846113f7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b61148781610f83565b82525050565b6000611499838361147e565b60208301905092915050565b6000602082019050919050565b6114bb8161145e565b6114c58184611469565b92506114d082611474565b8060005b838110156115015781516114e8878261148d565b96506114f3836114a5565b9250506001810190506114d4565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61153d8161145e565b6115478184611529565b925061155282611474565b8060005b8381101561158357815161156a878261148d565b9650611575836114a5565b925050600181019050611556565b505050505050565b60006115978383611534565b60408301905092915050565b6000602082019050919050565b6115b981611509565b6115c38184611514565b92506115ce8261151f565b8060005b838110156115ff5781516115e6878261158b565b96506115f1836115a3565b9250506001810190506115d2565b505050505050565b60006101408201905061161d60008301876114b2565b61162a60408301866115b0565b61163760c08301856114b2565b6116456101008301846114b2565b95945050505050565b61165781611015565b811461166257600080fd5b50565b6000815190506116748161164e565b92915050565b6000602082840312156116905761168f610fb7565b5b600061169e84828501611665565b9150509291505056fea26469706673582212202157fc09c0b2c118b7a22bafd75155e57be31040586feb6eb2ba8b28b1918a0764736f6c634300080f0033",
|
|
"deployedBytecode": "0x6080604052600436106100fe5760003560e01c80636bdcc8ab11610095578063bc49912811610064578063bc4991281461032a578063c5b208ff14610367578063d0383d68146103a4578063f207564e146103cf578063f220b9ec146103eb576100fe565b80636bdcc8ab1461026e5780638be9b119146102ab57806398366e35146102d4578063ae74552a146102ff576100fe565b80633c979b5f116100d15780633c979b5f146101c15780633ccfd60b146101ef5780634add651e146102065780635daf08ca14610231576100fe565b806315068a5a1461010357806322d9730c1461012e5780632b7ac3f31461016b578063331b6ab314610196575b600080fd5b34801561010f57600080fd5b50610118610416565b6040516101259190610f9c565b60405180910390f35b34801561013a57600080fd5b5061015560048036038101906101509190610fe8565b610423565b6040516101629190611030565b60405180910390f35b34801561017757600080fd5b506101806104c9565b60405161018d91906110ca565b60405180910390f35b3480156101a257600080fd5b506101ab6104ed565b6040516101b89190611106565b60405180910390f35b3480156101cd57600080fd5b506101d6610511565b6040516101e69493929190611121565b60405180910390f35b3480156101fb57600080fd5b5061020461053c565b005b34801561021257600080fd5b5061021b610683565b6040516102289190611185565b60405180910390f35b34801561023d57600080fd5b5061025860048036038101906102539190610fe8565b6106a7565b6040516102659190610f9c565b60405180910390f35b34801561027a57600080fd5b5061029560048036038101906102909190610fe8565b6106bf565b6040516102a29190611030565b60405180910390f35b3480156102b757600080fd5b506102d260048036038101906102cd9190611205565b6106df565b005b3480156102e057600080fd5b506102e9610746565b6040516102f69190610f9c565b60405180910390f35b34801561030b57600080fd5b5061031461076a565b6040516103219190610f9c565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c9190610fe8565b610770565b60405161035e9190610f9c565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190611297565b610788565b60405161039b9190610f9c565b60405180910390f35b3480156103b057600080fd5b506103b96107a0565b6040516103c69190610f9c565b60405180910390f35b6103e960048036038101906103e49190610fe8565b6107c4565b005b3480156103f757600080fd5b506104006108ac565b60405161040d9190610f9c565b60405180910390f35b6000600560010154905090565b60008082141580156104c257507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e493ef8c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561049b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104bf91906112d9565b82105b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60058060000154908060010154908060020154908060050160009054906101000a900460ff16905084565b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081036105ba576040517f6f50367a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b478111156105f4576040517f786e0a9900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561067f573d6000803e3d6000fd5b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60026020528060005260406000206000915090505481565b60036020528060005260406000206000915054906101000a900460ff1681565b826106e981610423565b61072a57806040517f7f3e75af0000000000000000000000000000000000000000000000000000000081526004016107219190610f9c565b60405180910390fd5b6107358484846108d0565b6107408484846108d5565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60005481565b60016020528060005260406000206000915090505481565b60046020528060005260406000206000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000081565b806107ce81610423565b61080f57806040517f7f3e75af0000000000000000000000000000000000000000000000000000000081526004016108069190610f9c565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003414610895577f0000000000000000000000000000000000000000000000000000000000000000346040517f25c3f46e00000000000000000000000000000000000000000000000000000000815260040161088c929190611306565b60405180910390fd5b61089e82610ba3565b6108a88234610ba6565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b505050565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16148061093b5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b1561097d57816040517f4a149d080000000000000000000000000000000000000000000000000000000081526004016109749190611350565b60405180910390fd5b600015156003600085815260200190815260200160002060009054906101000a900460ff161515036109e657826040517f5a971ebb0000000000000000000000000000000000000000000000000000000081526004016109dd9190610f9c565b60405180910390fd5b6000600160008581526020019081526020016000205403610a3e57826040517faabeeba5000000000000000000000000000000000000000000000000000000008152600401610a359190610f9c565b60405180910390fd5b610a49838383610d8a565b610a7f576040517f09bde33900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600160008581526020019081526020016000205490506000600260008681526020019081526020016000205490506000600260008781526020019081526020016000208190555060006003600087815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600160008781526020019081526020016000208190555081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b5c919061139a565b925050819055507f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a9438582604051610b94929190611306565b60405180910390a15050505050565b50565b6003600083815260200190815260200160002060009054906101000a900460ff1615610bfd576040517e0a60f700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060005410610c58576040517f57f6953100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600054600260008481526020019081526020016000208190555060016003600084815260200190815260200160002060006101000a81548160ff02191690831515021790555073__$156f483e97cedd2612cb663a75817771d9$__63143dc3836005846040518363ffffffff1660e01b8152600401610cd8929190611406565b602060405180830381865af4158015610cf5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1991906112d9565b508060016000848152602001908152602001600020819055507f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d282600054604051610d65929190611306565b60405180910390a16001600080828254610d7f919061139a565b925050819055505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663f5c9d69e604051806040016040528085600060088110610de757610de661142f565b5b6020020135815260200185600160088110610e0557610e0461142f565b5b60200201358152506040518060400160405280604051806040016040528088600260088110610e3757610e3661142f565b5b6020020135815260200188600360088110610e5557610e5461142f565b5b60200201358152508152602001604051806040016040528088600460088110610e8157610e8061142f565b5b6020020135815260200188600560088110610e9f57610e9e61142f565b5b6020020135815250815250604051806040016040528087600660088110610ec957610ec861142f565b5b6020020135815260200187600760088110610ee757610ee661142f565b5b602002013581525060405180604001604052808a81526020018973ffffffffffffffffffffffffffffffffffffffff168152506040518563ffffffff1660e01b8152600401610f399493929190611607565b602060405180830381865afa158015610f56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7a919061167a565b90509392505050565b6000819050919050565b610f9681610f83565b82525050565b6000602082019050610fb16000830184610f8d565b92915050565b600080fd5b610fc581610f83565b8114610fd057600080fd5b50565b600081359050610fe281610fbc565b92915050565b600060208284031215610ffe57610ffd610fb7565b5b600061100c84828501610fd3565b91505092915050565b60008115159050919050565b61102a81611015565b82525050565b60006020820190506110456000830184611021565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061109061108b6110868461104b565b61106b565b61104b565b9050919050565b60006110a282611075565b9050919050565b60006110b482611097565b9050919050565b6110c4816110a9565b82525050565b60006020820190506110df60008301846110bb565b92915050565b60006110f082611097565b9050919050565b611100816110e5565b82525050565b600060208201905061111b60008301846110f7565b92915050565b60006080820190506111366000830187610f8d565b6111436020830186610f8d565b6111506040830185610f8d565b61115d6060830184611021565b95945050505050565b600063ffffffff82169050919050565b61117f81611166565b82525050565b600060208201905061119a6000830184611176565b92915050565b60006111ab8261104b565b9050919050565b6111bb816111a0565b81146111c657600080fd5b50565b6000813590506111d8816111b2565b92915050565b600080fd5b6000819050826020600802820111156111ff576111fe6111de565b5b92915050565b6000806000610140848603121561121f5761121e610fb7565b5b600061122d86828701610fd3565b935050602061123e868287016111c9565b925050604061124f868287016111e3565b9150509250925092565b60006112648261104b565b9050919050565b61127481611259565b811461127f57600080fd5b50565b6000813590506112918161126b565b92915050565b6000602082840312156112ad576112ac610fb7565b5b60006112bb84828501611282565b91505092915050565b6000815190506112d381610fbc565b92915050565b6000602082840312156112ef576112ee610fb7565b5b60006112fd848285016112c4565b91505092915050565b600060408201905061131b6000830185610f8d565b6113286020830184610f8d565b9392505050565b600061133a82611097565b9050919050565b61134a8161132f565b82525050565b60006020820190506113656000830184611341565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006113a582610f83565b91506113b083610f83565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156113e5576113e461136b565b5b828201905092915050565b8082525050565b61140081610f83565b82525050565b600060408201905061141b60008301856113f0565b61142860208301846113f7565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060029050919050565b600081905092915050565b6000819050919050565b61148781610f83565b82525050565b6000611499838361147e565b60208301905092915050565b6000602082019050919050565b6114bb8161145e565b6114c58184611469565b92506114d082611474565b8060005b838110156115015781516114e8878261148d565b96506114f3836114a5565b9250506001810190506114d4565b505050505050565b600060029050919050565b600081905092915050565b6000819050919050565b600081905092915050565b61153d8161145e565b6115478184611529565b925061155282611474565b8060005b8381101561158357815161156a878261148d565b9650611575836114a5565b925050600181019050611556565b505050505050565b60006115978383611534565b60408301905092915050565b6000602082019050919050565b6115b981611509565b6115c38184611514565b92506115ce8261151f565b8060005b838110156115ff5781516115e6878261158b565b96506115f1836115a3565b9250506001810190506115d2565b505050505050565b60006101408201905061161d60008301876114b2565b61162a60408301866115b0565b61163760c08301856114b2565b6116456101008301846114b2565b95945050505050565b61165781611015565b811461166257600080fd5b50565b6000815190506116748161164e565b92915050565b6000602082840312156116905761168f610fb7565b5b600061169e84828501611665565b9150509291505056fea26469706673582212202157fc09c0b2c118b7a22bafd75155e57be31040586feb6eb2ba8b28b1918a0764736f6c634300080f0033",
|
|
"libraries": {
|
|
"BinaryIMT": "0x16eff5b01123605924d9BF74Ed947F8Fd3015f44"
|
|
},
|
|
"devdoc": {
|
|
"errors": {
|
|
"InsufficientDeposit(uint256,uint256)": [
|
|
{
|
|
"params": {
|
|
"provided": "The provided deposit amount",
|
|
"required": "The required deposit amount"
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"kind": "dev",
|
|
"methods": {
|
|
"register(uint256)": {
|
|
"params": {
|
|
"idCommitment": "The idCommitment of the member"
|
|
}
|
|
},
|
|
"slash(uint256,address,uint256[8])": {
|
|
"details": "Allows a user to slash a member",
|
|
"params": {
|
|
"idCommitment": "The idCommitment of the member"
|
|
}
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"userdoc": {
|
|
"errors": {
|
|
"DuplicateIdCommitment()": [
|
|
{
|
|
"notice": "Member is already registered"
|
|
}
|
|
],
|
|
"FullTree()": [
|
|
{
|
|
"notice": "The tree is full"
|
|
}
|
|
],
|
|
"InsufficientContractBalance()": [
|
|
{
|
|
"notice": "Contract has insufficient balance to return"
|
|
}
|
|
],
|
|
"InsufficientDeposit(uint256,uint256)": [
|
|
{
|
|
"notice": "Invalid deposit amount"
|
|
}
|
|
],
|
|
"InsufficientWithdrawalBalance()": [
|
|
{
|
|
"notice": "User has insufficient balance to withdraw"
|
|
}
|
|
],
|
|
"InvalidIdCommitment(uint256)": [
|
|
{
|
|
"notice": "Invalid idCommitment"
|
|
}
|
|
],
|
|
"InvalidProof()": [
|
|
{
|
|
"notice": "Invalid proof"
|
|
}
|
|
],
|
|
"InvalidReceiverAddress(address)": [
|
|
{
|
|
"notice": "Invalid receiver address, when the receiver is the contract itself or 0x0"
|
|
}
|
|
],
|
|
"MemberHasNoStake(uint256)": [
|
|
{
|
|
"notice": "Member has no stake"
|
|
}
|
|
],
|
|
"MemberNotRegistered(uint256)": [
|
|
{
|
|
"notice": "Member is not registered"
|
|
}
|
|
]
|
|
},
|
|
"events": {
|
|
"MemberRegistered(uint256,uint256)": {
|
|
"notice": "Emitted when a new member is added to the set"
|
|
},
|
|
"MemberWithdrawn(uint256,uint256)": {
|
|
"notice": "Emitted when a member is removed from the set"
|
|
}
|
|
},
|
|
"kind": "user",
|
|
"methods": {
|
|
"DEPTH()": {
|
|
"notice": "The depth of the merkle tree"
|
|
},
|
|
"MEMBERSHIP_DEPOSIT()": {
|
|
"notice": "The deposit amount required to register as a member"
|
|
},
|
|
"SET_SIZE()": {
|
|
"notice": "The size of the merkle tree, i.e 2^depth"
|
|
},
|
|
"deployedBlockNumber()": {
|
|
"notice": "the deployed block number"
|
|
},
|
|
"idCommitmentIndex()": {
|
|
"notice": "The index of the next member to be registered"
|
|
},
|
|
"imtData()": {
|
|
"notice": "the Incremental Merkle Tree"
|
|
},
|
|
"memberExists(uint256)": {
|
|
"notice": "The membership status of each member"
|
|
},
|
|
"members(uint256)": {
|
|
"notice": "The membership status of each member maps from idCommitment to their index in the set"
|
|
},
|
|
"poseidonHasher()": {
|
|
"notice": "The Poseidon hasher contract"
|
|
},
|
|
"register(uint256)": {
|
|
"notice": "Allows a user to register as a member"
|
|
},
|
|
"stakedAmounts(uint256)": {
|
|
"notice": "The amount of eth staked by each member maps from idCommitment to the amount staked"
|
|
},
|
|
"verifier()": {
|
|
"notice": "The groth16 verifier contract"
|
|
},
|
|
"withdraw()": {
|
|
"notice": "Allows a user to withdraw funds allocated to them upon slashing a member"
|
|
},
|
|
"withdrawalBalance(address)": {
|
|
"notice": "The balance of each user that can be withdrawn"
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"storageLayout": {
|
|
"storage": [
|
|
{
|
|
"astId": 1069,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "idCommitmentIndex",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 1074,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "stakedAmounts",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_mapping(t_uint256,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 1079,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "members",
|
|
"offset": 0,
|
|
"slot": "2",
|
|
"type": "t_mapping(t_uint256,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 1084,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "memberExists",
|
|
"offset": 0,
|
|
"slot": "3",
|
|
"type": "t_mapping(t_uint256,t_bool)"
|
|
},
|
|
{
|
|
"astId": 1089,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "withdrawalBalance",
|
|
"offset": 0,
|
|
"slot": "4",
|
|
"type": "t_mapping(t_address,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 1104,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "imtData",
|
|
"offset": 0,
|
|
"slot": "5",
|
|
"type": "t_struct(BinaryIMTData)22_storage"
|
|
}
|
|
],
|
|
"types": {
|
|
"t_address": {
|
|
"encoding": "inplace",
|
|
"label": "address",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_array(t_uint256)2_storage": {
|
|
"base": "t_uint256",
|
|
"encoding": "inplace",
|
|
"label": "uint256[2]",
|
|
"numberOfBytes": "64"
|
|
},
|
|
"t_bool": {
|
|
"encoding": "inplace",
|
|
"label": "bool",
|
|
"numberOfBytes": "1"
|
|
},
|
|
"t_mapping(t_address,t_uint256)": {
|
|
"encoding": "mapping",
|
|
"key": "t_address",
|
|
"label": "mapping(address => uint256)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_uint256"
|
|
},
|
|
"t_mapping(t_uint256,t_array(t_uint256)2_storage)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => uint256[2])",
|
|
"numberOfBytes": "32",
|
|
"value": "t_array(t_uint256)2_storage"
|
|
},
|
|
"t_mapping(t_uint256,t_bool)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => bool)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_bool"
|
|
},
|
|
"t_mapping(t_uint256,t_uint256)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => uint256)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_uint256"
|
|
},
|
|
"t_struct(BinaryIMTData)22_storage": {
|
|
"encoding": "inplace",
|
|
"label": "struct BinaryIMTData",
|
|
"members": [
|
|
{
|
|
"astId": 5,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "depth",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 7,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "root",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 9,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "numberOfLeaves",
|
|
"offset": 0,
|
|
"slot": "2",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 13,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "zeroes",
|
|
"offset": 0,
|
|
"slot": "3",
|
|
"type": "t_mapping(t_uint256,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 19,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "lastSubtrees",
|
|
"offset": 0,
|
|
"slot": "4",
|
|
"type": "t_mapping(t_uint256,t_array(t_uint256)2_storage)"
|
|
},
|
|
{
|
|
"astId": 21,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "useDefaultZeroes",
|
|
"offset": 0,
|
|
"slot": "5",
|
|
"type": "t_bool"
|
|
}
|
|
],
|
|
"numberOfBytes": "192"
|
|
},
|
|
"t_uint256": {
|
|
"encoding": "inplace",
|
|
"label": "uint256",
|
|
"numberOfBytes": "32"
|
|
}
|
|
}
|
|
}
|
|
}
|