mirror of
https://github.com/vacp2p/rln-interep-contract.git
synced 2025-02-28 22:20:42 +00:00
411 lines
103 KiB
JSON
411 lines
103 KiB
JSON
{
|
|
"address": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9",
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "membershipDeposit",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "depth",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "_poseidonHasher",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"internalType": "address",
|
|
"name": "_validGroupStorage",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "constructor"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "pubkey",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "index",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "MemberRegistered",
|
|
"type": "event"
|
|
},
|
|
{
|
|
"anonymous": false,
|
|
"inputs": [
|
|
{
|
|
"indexed": false,
|
|
"internalType": "uint256",
|
|
"name": "pubkey",
|
|
"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": "interep",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract IInterep",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"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 IPoseidonHasher",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "pubkeyIndex",
|
|
"outputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "groupId",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "signal",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "nullifierHash",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "externalNullifier",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256[8]",
|
|
"name": "proof",
|
|
"type": "uint256[8]"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "pubkey",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "pubkey",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "register",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "pubkeys",
|
|
"type": "uint256[]"
|
|
}
|
|
],
|
|
"name": "registerBatch",
|
|
"outputs": [],
|
|
"stateMutability": "payable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "validGroupStorage",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract IValidGroupStorage",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "secret",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "_pubkeyIndex",
|
|
"type": "uint256"
|
|
},
|
|
{
|
|
"internalType": "address payable",
|
|
"name": "receiver",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"name": "withdraw",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "secrets",
|
|
"type": "uint256[]"
|
|
},
|
|
{
|
|
"internalType": "uint256[]",
|
|
"name": "pubkeyIndexes",
|
|
"type": "uint256[]"
|
|
},
|
|
{
|
|
"internalType": "address payable[]",
|
|
"name": "receivers",
|
|
"type": "address[]"
|
|
}
|
|
],
|
|
"name": "withdrawBatch",
|
|
"outputs": [],
|
|
"stateMutability": "nonpayable",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"transactionHash": "0xe33c88ccdf92f52f876387a36331e7dba7d59a669bd7348a1078211292661883",
|
|
"receipt": {
|
|
"to": null,
|
|
"from": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
|
|
"contractAddress": "0xDc64a140Aa3E981100a9becA4E685f962f0cF6C9",
|
|
"transactionIndex": 0,
|
|
"gasUsed": "1680598",
|
|
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
"blockHash": "0x84ebfaeb7ba4166c293ffe42d9a77353d889b66e99076f8a3858f5be38ada6fc",
|
|
"transactionHash": "0xe33c88ccdf92f52f876387a36331e7dba7d59a669bd7348a1078211292661883",
|
|
"logs": [],
|
|
"blockNumber": 5,
|
|
"cumulativeGasUsed": "1680598",
|
|
"status": 1,
|
|
"byzantium": true
|
|
},
|
|
"args": [
|
|
1000000000000000,
|
|
20,
|
|
"0x5FbDB2315678afecb367f032d93F642f64180aa3",
|
|
"0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9"
|
|
],
|
|
"numDeployments": 1,
|
|
"solcInputHash": "772faab6f90f985c3c5f77daa2db6940",
|
|
"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\":\"_validGroupStorage\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pubkey\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"MemberRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"pubkey\",\"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\":\"interep\",\"outputs\":[{\"internalType\":\"contract IInterep\",\"name\":\"\",\"type\":\"address\"}],\"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 IPoseidonHasher\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pubkeyIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"groupId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"signal\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"nullifierHash\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"externalNullifier\",\"type\":\"uint256\"},{\"internalType\":\"uint256[8]\",\"name\":\"proof\",\"type\":\"uint256[8]\"},{\"internalType\":\"uint256\",\"name\":\"pubkey\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"pubkey\",\"type\":\"uint256\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"pubkeys\",\"type\":\"uint256[]\"}],\"name\":\"registerBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"validGroupStorage\",\"outputs\":[{\"internalType\":\"contract IValidGroupStorage\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"secret\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_pubkeyIndex\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"secrets\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"pubkeyIndexes\",\"type\":\"uint256[]\"},{\"internalType\":\"address payable[]\",\"name\":\"receivers\",\"type\":\"address[]\"}],\"name\":\"withdrawBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"register(uint256,bytes32,uint256,uint256,uint256[8],uint256)\":{\"details\":\"Registers a member via a valid Interep Semaphore group.\",\"params\":{\"externalNullifier\":\": External nullifier.\",\"groupId\":\": Id of the group.\",\"nullifierHash\":\": Nullifier hash.\",\"proof\":\": Zero-knowledge proof.\",\"pubkey\":\": Public key of the member.\",\"signal\":\": Semaphore signal.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/Rln.sol\":\"RLN\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@appliedzkp/semaphore-contracts/base/SemaphoreConstants.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nuint256 constant SNARK_SCALAR_FIELD = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\",\"keccak256\":\"0xe6b5681413ca90c626c619c996eed0aaff7f532f6217c6e594cf1ace7586e5fc\",\"license\":\"MIT\"},\"@appliedzkp/semaphore-contracts/base/SemaphoreCore.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"../interfaces/ISemaphoreCore.sol\\\";\\nimport \\\"../interfaces/IVerifier.sol\\\";\\n\\n/// @title Semaphore core contract.\\n/// @notice Minimal code to allow users to signal their endorsement of an arbitrary string.\\n/// @dev The following code verifies that the proof is correct and saves the hash of the\\n/// nullifier to prevent double-signaling. External nullifier and Merkle trees (i.e. groups) must be\\n/// managed externally.\\ncontract SemaphoreCore is ISemaphoreCore {\\n /// @dev Gets a nullifier hash and returns true or false.\\n /// It is used to prevent double-signaling.\\n mapping(uint256 => bool) internal nullifierHashes;\\n\\n /// @dev Asserts that no nullifier already exists and if the zero-knowledge proof is valid.\\n /// Otherwise it reverts.\\n /// @param signal: Semaphore signal.\\n /// @param root: Root of the Merkle tree.\\n /// @param nullifierHash: Nullifier hash.\\n /// @param externalNullifier: External nullifier.\\n /// @param proof: Zero-knowledge proof.\\n /// @param verifier: Verifier address.\\n function _verifyProof(\\n bytes32 signal,\\n uint256 root,\\n uint256 nullifierHash,\\n uint256 externalNullifier,\\n uint256[8] calldata proof,\\n IVerifier verifier\\n ) internal view {\\n require(!nullifierHashes[nullifierHash], \\\"SemaphoreCore: you cannot use the same nullifier twice\\\");\\n\\n uint256 signalHash = _hashSignal(signal);\\n\\n verifier.verifyProof(\\n [proof[0], proof[1]],\\n [[proof[2], proof[3]], [proof[4], proof[5]]],\\n [proof[6], proof[7]],\\n [root, nullifierHash, signalHash, externalNullifier]\\n );\\n }\\n\\n /// @dev Stores the nullifier hash to prevent double-signaling.\\n /// Attention! Remember to call it when you verify a proof if you\\n /// need to prevent double-signaling.\\n /// @param nullifierHash: Semaphore nullifier hash.\\n function _saveNullifierHash(uint256 nullifierHash) internal {\\n nullifierHashes[nullifierHash] = true;\\n }\\n\\n /// @dev Creates a keccak256 hash of the signal.\\n /// @param signal: Semaphore signal.\\n /// @return Hash of the signal.\\n function _hashSignal(bytes32 signal) private pure returns (uint256) {\\n return uint256(keccak256(abi.encodePacked(signal))) >> 8;\\n }\\n}\\n\",\"keccak256\":\"0x6f734ca6321305d55a12da52907886d9549843984337e89962f582ce2421310f\",\"license\":\"MIT\"},\"@appliedzkp/semaphore-contracts/interfaces/ISemaphoreCore.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @title SemaphoreCore interface.\\n/// @dev Interface of SemaphoreCore contract.\\ninterface ISemaphoreCore {\\n /// @notice Emitted when a proof is verified correctly and a new nullifier hash is added.\\n /// @param nullifierHash: Hash of external and identity nullifiers.\\n event NullifierHashAdded(uint256 nullifierHash);\\n}\\n\",\"keccak256\":\"0x00259e30ecf574e0b731cecc846aa9877a2dc6a7e243d5e93013bb9074361013\",\"license\":\"MIT\"},\"@appliedzkp/semaphore-contracts/interfaces/IVerifier.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @title Verifier interface.\\n/// @dev Interface of Verifier contract.\\ninterface IVerifier {\\n function verifyProof(\\n uint256[2] memory a,\\n uint256[2][2] memory b,\\n uint256[2] memory c,\\n uint256[4] memory input\\n ) external view;\\n}\\n\",\"keccak256\":\"0xa1bb8241f34d5bba01327eb4927e1ff2cf68a33ccbd51cd6c61b4a8c5187309e\",\"license\":\"MIT\"},\"@interep/contracts/IInterep.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @title Interep interface.\\n/// @dev Interface of a Interep contract.\\ninterface IInterep {\\n struct Verifier {\\n address contractAddress;\\n uint8 merkleTreeDepth;\\n }\\n\\n struct Group {\\n bytes32 provider;\\n bytes32 name;\\n uint256 root;\\n uint8 depth;\\n }\\n\\n /// @dev Emitted when a Semaphore proof is verified.\\n /// @param groupId: Id of the group.\\n /// @param signal: Semaphore signal.\\n event ProofVerified(uint256 indexed groupId, bytes32 signal);\\n\\n /// @dev Emitted when an Interep group is updated.\\n /// @param groupId: Id of the group.\\n /// @param provider: Provider of the group.\\n /// @param name: Name of the group.\\n /// @param root: Root hash of the tree.\\n /// @param depth: Depth of the tree.\\n event GroupUpdated(\\n uint256 groupId,\\n bytes32 indexed provider,\\n bytes32 indexed name,\\n uint256 root,\\n uint8 indexed depth\\n );\\n\\n /// @dev Updates the Interep groups.\\n /// @param groups: List of Interep groups.\\n function updateGroups(Group[] calldata groups) external;\\n\\n /// @dev Saves the nullifier hash to avoid double signaling and emits an event\\n /// if the zero-knowledge proof is valid.\\n /// @param groupId: Id of the group.\\n /// @param signal: Semaphore signal.\\n /// @param nullifierHash: Nullifier hash.\\n /// @param externalNullifier: External nullifier.\\n /// @param proof: Zero-knowledge proof.\\n function verifyProof(\\n uint256 groupId,\\n bytes32 signal,\\n uint256 nullifierHash,\\n uint256 externalNullifier,\\n uint256[8] calldata proof\\n ) external;\\n\\n /// @dev Returns the root hash of an Interep group.\\n /// @param groupId: Id of the group.\\n /// @return Root hash of the group.\\n function getRoot(uint256 groupId) external view returns (uint256);\\n\\n /// @dev Returns the tree depth of an Interep group.\\n /// @param groupId: Id of the group.\\n /// @return Tree depth of the group.\\n function getDepth(uint256 groupId) external view returns (uint8);\\n}\\n\",\"keccak256\":\"0xd3279ce9fbbb58b7567f66d18735f81df7e8ee61c677e9dd739d3a4823e31c5d\",\"license\":\"MIT\"},\"@interep/contracts/Interep.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"./IInterep.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport \\\"@appliedzkp/semaphore-contracts/interfaces/IVerifier.sol\\\";\\nimport \\\"@appliedzkp/semaphore-contracts/base/SemaphoreCore.sol\\\";\\nimport \\\"@appliedzkp/semaphore-contracts/base/SemaphoreConstants.sol\\\";\\n\\n/// @title Interep\\n/// @dev Interep is a collection of reputation Semaphore groups in which members\\n/// can prove their Web2 reputation (or their membership in a group) without revealing their identity.\\n/// Each Interep group is actually a Merkle tree, whose leaves represent the members of the group.\\n/// Interep groups are saved off-chain but the Merkle tree roots of those groups are saved on-chain\\n/// at regular intervals, so that users can verify their Semaphore ZK proof on-chain with this contract.\\ncontract Interep is IInterep, Ownable, SemaphoreCore {\\n /// @dev Gets a tree depth and returns its verifier address.\\n mapping(uint8 => IVerifier) public verifiers;\\n\\n /// @dev Gets a group id and returns the group data.\\n mapping(uint256 => Group) public groups;\\n\\n /// @dev Checks if there is a verifier for the given tree depth.\\n /// @param depth: Depth of the tree.\\n modifier onlySupportedDepth(uint8 depth) {\\n require(address(verifiers[depth]) != address(0), \\\"Interep: tree depth is not supported\\\");\\n _;\\n }\\n\\n /// @dev Initializes the Semaphore verifiers used to verify the user's ZK proofs.\\n /// @param _verifiers: List of Semaphore verifiers (address and related Merkle tree depth).\\n constructor(Verifier[] memory _verifiers) {\\n for (uint8 i = 0; i < _verifiers.length; i++) {\\n verifiers[_verifiers[i].merkleTreeDepth] = IVerifier(_verifiers[i].contractAddress);\\n }\\n }\\n\\n /// @dev See {IInterep-updateGroups}.\\n function updateGroups(Group[] calldata _groups) external override onlyOwner {\\n for (uint8 i = 0; i < _groups.length; i++) {\\n uint256 groupId = uint256(keccak256(abi.encodePacked(_groups[i].provider, _groups[i].name))) %\\n SNARK_SCALAR_FIELD;\\n\\n _updateGroup(groupId, _groups[i]);\\n }\\n }\\n\\n /// @dev See {IInterep-verifyProof}.\\n function verifyProof(\\n uint256 groupId,\\n bytes32 signal,\\n uint256 nullifierHash,\\n uint256 externalNullifier,\\n uint256[8] calldata proof\\n ) external override {\\n uint256 root = getRoot(groupId);\\n uint8 depth = getDepth(groupId);\\n\\n require(depth != 0, \\\"Interep: group does not exist\\\");\\n\\n IVerifier verifier = verifiers[depth];\\n\\n _verifyProof(signal, root, nullifierHash, externalNullifier, proof, verifier);\\n\\n _saveNullifierHash(nullifierHash);\\n\\n emit ProofVerified(groupId, signal);\\n }\\n\\n /// @dev See {IInterep-getRoot}.\\n function getRoot(uint256 groupId) public view override returns (uint256) {\\n return groups[groupId].root;\\n }\\n\\n /// @dev See {IInterep-getDepth}.\\n function getDepth(uint256 groupId) public view override returns (uint8) {\\n return groups[groupId].depth;\\n }\\n\\n /// @dev Updates an Interep group.\\n /// @param groupId: Id of the group.\\n /// @param group: Group data.\\n function _updateGroup(uint256 groupId, Group calldata group) private onlySupportedDepth(group.depth) {\\n groups[groupId] = group;\\n\\n emit GroupUpdated(groupId, group.provider, group.name, group.root, group.depth);\\n }\\n}\\n\",\"keccak256\":\"0xba5b8393318508d65c7f8d61e2ce59c134b72ba4ee59c200c93ad03a07150adb\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"contracts/PoseidonHasher.sol\":{\"content\":\"pragma solidity 0.8.15;\\n\\ninterface IPoseidonHasher {\\n\\tfunction hash(uint256 input) external pure returns (uint256 result);\\n\\n\\tfunction identity() external pure returns (uint256);\\n}\\n\\ncontract PoseidonHasher is IPoseidonHasher {\\n\\tuint256 constant Q = 21888242871839275222246405745257275088548364400416034343698204186575808495617;\\n\\tuint256 constant C0 = 4417881134626180770308697923359573201005643519861877412381846989312604493735;\\n\\tuint256 constant C1 = 5433650512959517612316327474713065966758808864213826738576266661723522780033;\\n\\tuint256 constant C2 = 13641176377184356099764086973022553863760045607496549923679278773208775739952;\\n\\tuint256 constant C3 = 17949713444224994136330421782109149544629237834775211751417461773584374506783;\\n\\tuint256 constant C4 = 13765628375339178273710281891027109699578766420463125835325926111705201856003;\\n\\tuint256 constant C5 = 19179513468172002314585757290678967643352171735526887944518845346318719730387;\\n\\tuint256 constant C6 = 5157412437176756884543472904098424903141745259452875378101256928559722612176;\\n\\tuint256 constant C7 = 535160875740282236955320458485730000677124519901643397458212725410971557409;\\n\\tuint256 constant C8 = 1050793453380762984940163090920066886770841063557081906093018330633089036729;\\n\\tuint256 constant C9 = 10665495010329663932664894101216428400933984666065399374198502106997623173873;\\n\\tuint256 constant C10 = 19965634623406616956648724894636666805991993496469370618546874926025059150737;\\n\\tuint256 constant C11 = 13007250030070838431593222885902415182312449212965120303174723305710127422213;\\n\\tuint256 constant C12 = 16877538715074991604507979123743768693428157847423939051086744213162455276374;\\n\\tuint256 constant C13 = 18211747749504876135588847560312685184956239426147543810126553367063157141465;\\n\\tuint256 constant C14 = 18151553319826126919739798892854572062191241985315767086020821632812331245635;\\n\\tuint256 constant C15 = 19957033149976712666746140949846950406660099037474791840946955175819555930825;\\n\\tuint256 constant C16 = 3469514863538261843186854830917934449567467100548474599735384052339577040841;\\n\\tuint256 constant C17 = 989698510043911779243192466312362856042600749099921773896924315611668507708;\\n\\tuint256 constant C18 = 12568377015646290945235387813564567111330046038050864455358059568128000172201;\\n\\tuint256 constant C19 = 20856104135605479600325529349246932565148587186338606236677138505306779314172;\\n\\tuint256 constant C20 = 8206918720503535523121349917159924938835810381723474192155637697065780938424;\\n\\tuint256 constant C21 = 1309058477013932989380617265069188723120054926187607548493110334522527703566;\\n\\tuint256 constant C22 = 14076116939332667074621703729512195584105250395163383769419390236426287710606;\\n\\tuint256 constant C23 = 10153498892749751942204288991871286290442690932856658983589258153608012428674;\\n\\tuint256 constant C24 = 18202499207234128286137597834010475797175973146805180988367589376893530181575;\\n\\tuint256 constant C25 = 12739388830157083522877690211447248168864006284243907142044329113461613743052;\\n\\tuint256 constant C26 = 15123358710467780770838026754240340042441262572309759635224051333176022613949;\\n\\tuint256 constant C27 = 19925004701844594370904593774447343836015483888496504201331110250494635362184;\\n\\tuint256 constant C28 = 10352416606816998476681131583320899030072315953910679608943150613208329645891;\\n\\tuint256 constant C29 = 10567371822366244361703342347428230537114808440249611395507235283708966113221;\\n\\tuint256 constant C30 = 5635498582763880627392290206431559361272660937399944184533035305989295959602;\\n\\tuint256 constant C31 = 11866432933224219174041051738704352719163271639958083608224676028593315904909;\\n\\tuint256 constant C32 = 5795020705294401441272215064554385591292330721703923167136157291459784140431;\\n\\tuint256 constant C33 = 9482202378699252817564375087302794636287866584767523335624368774856230692758;\\n\\tuint256 constant C34 = 4245237636894546151746468406560945873445548423466753843402086544922216329298;\\n\\tuint256 constant C35 = 12000500941313982757584712677991730019124834399479314697467598397927435905133;\\n\\tuint256 constant C36 = 7596790274058425558167520209857956363736666939016807569082239187494363541787;\\n\\tuint256 constant C37 = 2484867918246116343205467273440098378820186751202461278013576281097918148877;\\n\\tuint256 constant C38 = 18312645949449997391810445935615409295369169383463185688973803378104013950190;\\n\\tuint256 constant C39 = 15320686572748723004980855263301182130424010735782762814513954166519592552733;\\n\\tuint256 constant C40 = 12618438900597948888520621062416758747872180395546164387827245287017031303859;\\n\\tuint256 constant C41 = 17438141672027706116733201008397064011774368832458707512367404736905021019585;\\n\\tuint256 constant C42 = 6374197807230665998865688675365359100400438034755781666913068586172586548950;\\n\\tuint256 constant C43 = 2189398913433273865510950346186699930188746169476472274335177556702504595264;\\n\\tuint256 constant C44 = 6268495580028970231803791523870131137294646402347399003576649137450213034606;\\n\\tuint256 constant C45 = 17896250365994900261202920044129628104272791547990619503076839618914047059275;\\n\\tuint256 constant C46 = 13692156312448722528008862371944543449350293305158722920787736248435893008873;\\n\\tuint256 constant C47 = 15234446864368744483209945022439268713300180233589581910497691316744177619376;\\n\\tuint256 constant C48 = 1572426502623310766593681563281600503979671244997798691029595521622402217227;\\n\\tuint256 constant C49 = 80103447810215150918585162168214870083573048458555897999822831203653996617;\\n\\tuint256 constant C50 = 8228820324013669567851850635126713973797711779951230446503353812192849106342;\\n\\tuint256 constant C51 = 5375851433746509614045812476958526065449377558695752132494533666370449415873;\\n\\tuint256 constant C52 = 12115998939203497346386774317892338270561208357481805380546938146796257365018;\\n\\tuint256 constant C53 = 9764067909645821279940531410531154041386008396840887338272986634350423466622;\\n\\tuint256 constant C54 = 8538708244538850542384936174629541085495830544298260335345008245230827876882;\\n\\tuint256 constant C55 = 7140127896620013355910287215441004676619168261422440177712039790284719613114;\\n\\tuint256 constant C56 = 14297402962228458726038826185823085337698917275385741292940049024977027409762;\\n\\tuint256 constant C57 = 6667115556431351074165934212337261254608231545257434281887966406956835140819;\\n\\tuint256 constant C58 = 20226761165244293291042617464655196752671169026542832236139342122602741090001;\\n\\tuint256 constant C59 = 12038289506489256655759141386763477208196694421666339040483042079632134429119;\\n\\tuint256 constant C60 = 19027757334170818571203982241812412991528769934917288000224335655934473717551;\\n\\tuint256 constant C61 = 16272152964456553579565580463468069884359929612321610357528838696790370074720;\\n\\tuint256 constant C62 = 2500392889689246014710135696485946334448570271481948765283016105301740284071;\\n\\tuint256 constant C63 = 8595254970528530312401637448610398388203855633951264114100575485022581946023;\\n\\tuint256 constant C64 = 11635945688914011450976408058407206367914559009113158286982919675551688078198;\\n\\tuint256 constant C65 = 614739068603482619581328040478536306925147663946742687395148680260956671871;\\n\\tuint256 constant C66 = 18692271780377861570175282183255720350972693125537599213951106550953176268753;\\n\\tuint256 constant C67 = 4987059230784976306647166378298632695585915319042844495357753339378260807164;\\n\\tuint256 constant C68 = 21851403978498723616722415377430107676258664746210815234490134600998983955497;\\n\\tuint256 constant C69 = 9830635451186415300891533983087800047564037813328875992115573428596207326204;\\n\\tuint256 constant C70 = 4842706106434537116860242620706030229206345167233200482994958847436425185478;\\n\\tuint256 constant C71 = 6422235064906823218421386871122109085799298052314922856340127798647926126490;\\n\\tuint256 constant C72 = 4564364104986856861943331689105797031330091877115997069096365671501473357846;\\n\\tuint256 constant C73 = 1944043894089780613038197112872830569538541856657037469098448708685350671343;\\n\\tuint256 constant C74 = 21179865974855950600518216085229498748425990426231530451599322283119880194955;\\n\\tuint256 constant C75 = 14296697761894107574369608843560006996183955751502547883167824879840894933162;\\n\\tuint256 constant C76 = 12274619649702218570450581712439138337725246879938860735460378251639845671898;\\n\\tuint256 constant C77 = 16371396450276899401411886674029075408418848209575273031725505038938314070356;\\n\\tuint256 constant C78 = 3702561221750983937578095019779188631407216522704543451228773892695044653565;\\n\\tuint256 constant C79 = 19721616877735564664624984774636557499099875603996426215495516594530838681980;\\n\\tuint256 constant C80 = 6383350109027696789969911008057747025018308755462287526819231672217685282429;\\n\\tuint256 constant C81 = 20860583956177367265984596617324237471765572961978977333122281041544719622905;\\n\\tuint256 constant C82 = 5766390934595026947545001478457407504285452477687752470140790011329357286275;\\n\\tuint256 constant C83 = 4043175758319898049344746138515323336207420888499903387536875603879441092484;\\n\\tuint256 constant C84 = 15579382179133608217098622223834161692266188678101563820988612253342538956534;\\n\\tuint256 constant C85 = 1864640783252634743892105383926602930909039567065240010338908865509831749824;\\n\\tuint256 constant C86 = 15943719865023133586707144161652035291705809358178262514871056013754142625673;\\n\\tuint256 constant C87 = 2326415993032390211558498780803238091925402878871059708106213703504162832999;\\n\\tuint256 constant C88 = 19995326402773833553207196590622808505547443523750970375738981396588337910289;\\n\\tuint256 constant C89 = 5143583711361588952673350526320181330406047695593201009385718506918735286622;\\n\\tuint256 constant C90 = 15436006486881920976813738625999473183944244531070780793506388892313517319583;\\n\\tuint256 constant C91 = 16660446760173633166698660166238066533278664023818938868110282615200613695857;\\n\\tuint256 constant C92 = 4966065365695755376133119391352131079892396024584848298231004326013366253934;\\n\\tuint256 constant C93 = 20683781957411705574951987677641476019618457561419278856689645563561076926702;\\n\\tuint256 constant C94 = 17280836839165902792086432296371645107551519324565649849400948918605456875699;\\n\\tuint256 constant C95 = 17045635513701208892073056357048619435743564064921155892004135325530808465371;\\n\\tuint256 constant C96 = 17055032967194400710390142791334572297458033582458169295920670679093585707295;\\n\\tuint256 constant C97 = 15727174639569115300068198908071514334002742825679221638729902577962862163505;\\n\\tuint256 constant C98 = 1001755657610446661315902885492677747789366510875120894840818704741370398633;\\n\\tuint256 constant C99 = 18638547332826171619311285502376343504539399518545103511265465604926625041234;\\n\\tuint256 constant C100 = 6751954224763196429755298529194402870632445298969935050224267844020826420799;\\n\\tuint256 constant C101 = 3526747115904224771452549517614107688674036840088422555827581348280834879405;\\n\\tuint256 constant C102 = 15705897908180497062880001271426561999724005008972544196300715293701537574122;\\n\\tuint256 constant C103 = 574386695213920937259007343820417029802510752426579750428758189312416867750;\\n\\tuint256 constant C104 = 15973040855000600860816974646787367136127946402908768408978806375685439868553;\\n\\tuint256 constant C105 = 20934130413948796333037139460875996342810005558806621330680156931816867321122;\\n\\tuint256 constant C106 = 6918585327145564636398173845411579411526758237572034236476079610890705810764;\\n\\tuint256 constant C107 = 14158163500813182062258176233162498241310167509137716527054939926126453647182;\\n\\tuint256 constant C108 = 4164602626597695668474100217150111342272610479949122406544277384862187287433;\\n\\tuint256 constant C109 = 12146526846507496913615390662823936206892812880963914267275606265272996025304;\\n\\tuint256 constant C110 = 10153527926900017763244212043512822363696541810586522108597162891799345289938;\\n\\tuint256 constant C111 = 13564663485965299104296214940873270349072051793008946663855767889066202733588;\\n\\tuint256 constant C112 = 5612449256997576125867742696783020582952387615430650198777254717398552960096;\\n\\tuint256 constant C113 = 12151885480032032868507892738683067544172874895736290365318623681886999930120;\\n\\tuint256 constant C114 = 380452237704664384810613424095477896605414037288009963200982915188629772177;\\n\\tuint256 constant C115 = 9067557551252570188533509616805287919563636482030947363841198066124642069518;\\n\\tuint256 constant C116 = 21280306817619711661335268484199763923870315733198162896599997188206277056900;\\n\\tuint256 constant C117 = 5567165819557297006750252582140767993422097822227408837378089569369734876257;\\n\\tuint256 constant C118 = 10411936321072105429908396649383171465939606386380071222095155850987201580137;\\n\\tuint256 constant C119 = 21338390051413922944780864872652000187403217966653363270851298678606449622266;\\n\\tuint256 constant C120 = 12156296560457833712186127325312904760045212412680904475497938949653569234473;\\n\\tuint256 constant C121 = 4271647814574748734312113971565139132510281260328947438246615707172526380757;\\n\\tuint256 constant C122 = 9061738206062369647211128232833114177054715885442782773131292534862178874950;\\n\\tuint256 constant C123 = 10134551893627587797380445583959894183158393780166496661696555422178052339133;\\n\\tuint256 constant C124 = 8932270237664043612366044102088319242789325050842783721780970129656616386103;\\n\\tuint256 constant C125 = 3339412934966886386194449782756711637636784424032779155216609410591712750636;\\n\\tuint256 constant C126 = 9704903972004596791086522314847373103670545861209569267884026709445485704400;\\n\\tuint256 constant C127 = 17467570179597572575614276429760169990940929887711661192333523245667228809456;\\n\\tuint256 constant M00 = 2910766817845651019878574839501801340070030115151021261302834310722729507541;\\n\\tuint256 constant M01 = 19727366863391167538122140361473584127147630672623100827934084310230022599144;\\n\\tuint256 constant M10 = 5776684794125549462448597414050232243778680302179439492664047328281728356345;\\n\\tuint256 constant M11 = 8348174920934122550483593999453880006756108121341067172388445916328941978568;\\n\\n\\tfunction hash(uint256 input) external pure override returns (uint256 result) {\\n\\t\\treturn _hash(input);\\n\\t}\\n\\n\\tfunction _hash(uint256 input) internal pure returns (uint256 result) {\\n\\t\\tassembly {\\n\\n\\t\\t\\t// Poseidon parameters should be t = 2, RF = 8, RP = 56\\n\\t\\t\\t\\n\\t\\t\\t// We load the characteristic\\n\\t\\t\\tlet q := Q\\n\\n\\t\\t\\t// In zerokit implementation, if we pass inp = [a0,a1,..,an] to Poseidon what is effectively hashed is [0,a0,a1,..,an]\\n\\t\\t\\t// Note that a sequence of MIX-ARK involves 3 Bn254 field additions before the mulmod happens. Worst case we have a value corresponding to 2*(p-1) which is less than 2^256 and hence doesn't overflow\\n\\t\\t\\t//ROUND 0 - FULL\\n\\t\\t\\tlet s0 := C0\\n\\t\\t\\tlet s1 := add(input, C1)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tlet t := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 1 - FULL\\n\\t\\t\\ts0 := add(s0, C2)\\n\\t\\t\\ts1 := add(s1, C3)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 2 - FULL\\n\\t\\t\\ts0 := add(s0, C4)\\n\\t\\t\\ts1 := add(s1, C5)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 3 - FULL\\n\\t\\t\\ts0 := add(s0, C6)\\n\\t\\t\\ts1 := add(s1, C7)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 4 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C8)\\n\\t\\t\\ts1 := add(s1, C9)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 5 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C10)\\n\\t\\t\\ts1 := add(s1, C11)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 6 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C12)\\n\\t\\t\\ts1 := add(s1, C13)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 7 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C14)\\n\\t\\t\\ts1 := add(s1, C15)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 8 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C16)\\n\\t\\t\\ts1 := add(s1, C17)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 9 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C18)\\n\\t\\t\\ts1 := add(s1, C19)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 10 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C20)\\n\\t\\t\\ts1 := add(s1, C21)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 11 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C22)\\n\\t\\t\\ts1 := add(s1, C23)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 12 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C24)\\n\\t\\t\\ts1 := add(s1, C25)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 13 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C26)\\n\\t\\t\\ts1 := add(s1, C27)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 14 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C28)\\n\\t\\t\\ts1 := add(s1, C29)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 15 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C30)\\n\\t\\t\\ts1 := add(s1, C31)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 16 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C32)\\n\\t\\t\\ts1 := add(s1, C33)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 17 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C34)\\n\\t\\t\\ts1 := add(s1, C35)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 18 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C36)\\n\\t\\t\\ts1 := add(s1, C37)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 19 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C38)\\n\\t\\t\\ts1 := add(s1, C39)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 20 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C40)\\n\\t\\t\\ts1 := add(s1, C41)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 21 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C42)\\n\\t\\t\\ts1 := add(s1, C43)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 22 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C44)\\n\\t\\t\\ts1 := add(s1, C45)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 23 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C46)\\n\\t\\t\\ts1 := add(s1, C47)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 24 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C48)\\n\\t\\t\\ts1 := add(s1, C49)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 25 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C50)\\n\\t\\t\\ts1 := add(s1, C51)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 26 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C52)\\n\\t\\t\\ts1 := add(s1, C53)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 27 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C54)\\n\\t\\t\\ts1 := add(s1, C55)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 28 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C56)\\n\\t\\t\\ts1 := add(s1, C57)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 29 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C58)\\n\\t\\t\\ts1 := add(s1, C59)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 30 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C60)\\n\\t\\t\\ts1 := add(s1, C61)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 31 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C62)\\n\\t\\t\\ts1 := add(s1, C63)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 32 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C64)\\n\\t\\t\\ts1 := add(s1, C65)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 33 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C66)\\n\\t\\t\\ts1 := add(s1, C67)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 34 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C68)\\n\\t\\t\\ts1 := add(s1, C69)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 35 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C70)\\n\\t\\t\\ts1 := add(s1, C71)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 36 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C72)\\n\\t\\t\\ts1 := add(s1, C73)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 37 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C74)\\n\\t\\t\\ts1 := add(s1, C75)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 38 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C76)\\n\\t\\t\\ts1 := add(s1, C77)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 39 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C78)\\n\\t\\t\\ts1 := add(s1, C79)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 40 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C80)\\n\\t\\t\\ts1 := add(s1, C81)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 41 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C82)\\n\\t\\t\\ts1 := add(s1, C83)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 42 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C84)\\n\\t\\t\\ts1 := add(s1, C85)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 43 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C86)\\n\\t\\t\\ts1 := add(s1, C87)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 44 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C88)\\n\\t\\t\\ts1 := add(s1, C89)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 45 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C90)\\n\\t\\t\\ts1 := add(s1, C91)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 46 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C92)\\n\\t\\t\\ts1 := add(s1, C93)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 47 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C94)\\n\\t\\t\\ts1 := add(s1, C95)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 48 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C96)\\n\\t\\t\\ts1 := add(s1, C97)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 49 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C98)\\n\\t\\t\\ts1 := add(s1, C99)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 50 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C100)\\n\\t\\t\\ts1 := add(s1, C101)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 51 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C102)\\n\\t\\t\\ts1 := add(s1, C103)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 52 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C104)\\n\\t\\t\\ts1 := add(s1, C105)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 53 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C106)\\n\\t\\t\\ts1 := add(s1, C107)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 54 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C108)\\n\\t\\t\\ts1 := add(s1, C109)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 55 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C110)\\n\\t\\t\\ts1 := add(s1, C111)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 56 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C112)\\n\\t\\t\\ts1 := add(s1, C113)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 57 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C114)\\n\\t\\t\\ts1 := add(s1, C115)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 58 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C116)\\n\\t\\t\\ts1 := add(s1, C117)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 59 - PARTIAL\\n\\t\\t\\ts0 := add(s0, C118)\\n\\t\\t\\ts1 := add(s1, C119)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 60 - FULL\\n\\t\\t\\ts0 := add(s0, C120)\\n\\t\\t\\ts1 := add(s1, C121)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 61 - FULL\\n\\t\\t\\ts0 := add(s0, C122)\\n\\t\\t\\ts1 := add(s1, C123)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\t\\t\\t//ROUND 62 - FULL\\n\\t\\t\\ts0 := add(s0, C124)\\n\\t\\t\\ts1 := add(s1, C125)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\tt := add(mulmod(s0, M00, q), mulmod(s1, M01, q))\\n\\t\\t\\ts1 := add(mulmod(s0, M10, q), mulmod(s1, M11, q))\\n\\t\\t\\ts0 := t\\n\\n\\n\\t\\t\\t//ROUND 63 - FULL\\n\\t\\t\\ts0 := add(s0, C126)\\n\\t\\t\\ts1 := add(s1, C127)\\n\\t\\t\\t// SBOX\\n\\t\\t\\tt := mulmod(s0, s0, q)\\n\\t\\t\\ts0 := mulmod(mulmod(t, t, q), s0, q)\\n\\t\\t\\tt := mulmod(s1, s1, q)\\n\\t\\t\\ts1 := mulmod(mulmod(t, t, q), s1, q)\\n\\t\\t\\t// MIX\\n\\t\\t\\ts0 := mod(add(mulmod(s0, M00, q), mulmod(s1, M01, q)),q)\\n\\n\\n\\t\\t\\tresult := s0\\n\\n\\t\\t}\\n\\t}\\n\\n\\tfunction identity() external pure override returns (uint256) {\\n\\t\\treturn _identity();\\n\\t}\\n\\n\\t// The hash of 0\\n\\tfunction _identity() internal pure returns (uint256) {\\n\\t\\treturn 0x2a09a9fd93c590c26b91effbb2499f07e8f7aa12e2b4940a3aed2411cb65e11c;\\n\\t}\\n}\",\"keccak256\":\"0xbfa670154ad664d0416623048f99ed7bd1caa73d9ade5d272af979992ba18f1d\"},\"contracts/Rln.sol\":{\"content\":\"pragma solidity 0.8.15;\\n\\nimport {IPoseidonHasher} from \\\"./PoseidonHasher.sol\\\";\\nimport {IValidGroupStorage} from \\\"./ValidGroupStorage.sol\\\";\\nimport {IInterep} from \\\"@interep/contracts/IInterep.sol\\\";\\n\\ncontract RLN {\\n uint256 public immutable MEMBERSHIP_DEPOSIT;\\n uint256 public immutable DEPTH;\\n uint256 public immutable SET_SIZE;\\n\\n uint256 public pubkeyIndex = 0;\\n mapping(uint256 => uint256) public members;\\n\\n IPoseidonHasher public poseidonHasher;\\n IValidGroupStorage public validGroupStorage;\\n IInterep public interep;\\n\\n event MemberRegistered(uint256 pubkey, uint256 index);\\n event MemberWithdrawn(uint256 pubkey, uint256 index);\\n\\n constructor(\\n uint256 membershipDeposit,\\n uint256 depth,\\n address _poseidonHasher,\\n address _validGroupStorage\\n ) {\\n MEMBERSHIP_DEPOSIT = membershipDeposit;\\n DEPTH = depth;\\n SET_SIZE = 1 << depth;\\n poseidonHasher = IPoseidonHasher(_poseidonHasher);\\n validGroupStorage = IValidGroupStorage(_validGroupStorage);\\n interep = IInterep(validGroupStorage.interep());\\n }\\n\\n function register(uint256 pubkey) external payable {\\n require(pubkeyIndex < SET_SIZE, \\\"RLN, register: set is full\\\");\\n require(\\n msg.value == MEMBERSHIP_DEPOSIT,\\n \\\"RLN, register: membership deposit is not satisfied\\\"\\n );\\n _register(pubkey);\\n }\\n\\n /// @dev Registers a member via a valid Interep Semaphore group.\\n /// @param groupId: Id of the group.\\n /// @param signal: Semaphore signal.\\n /// @param nullifierHash: Nullifier hash.\\n /// @param externalNullifier: External nullifier.\\n /// @param proof: Zero-knowledge proof.\\n /// @param pubkey: Public key of the member.\\n function register(\\n uint256 groupId,\\n bytes32 signal,\\n uint256 nullifierHash,\\n uint256 externalNullifier,\\n uint256[8] calldata proof,\\n uint256 pubkey\\n ) external {\\n require(\\n validGroupStorage.isValidGroup(groupId),\\n \\\"RLN, register: invalid interep group\\\"\\n );\\n require(pubkeyIndex < SET_SIZE, \\\"RLN, register: set is full\\\");\\n interep.verifyProof(\\n groupId,\\n signal,\\n nullifierHash,\\n externalNullifier,\\n proof\\n );\\n _register(pubkey);\\n }\\n\\n function registerBatch(uint256[] calldata pubkeys) external payable {\\n uint256 pubkeylen = pubkeys.length;\\n require(\\n pubkeyIndex + pubkeylen <= SET_SIZE,\\n \\\"RLN, registerBatch: set is full\\\"\\n );\\n require(\\n msg.value == MEMBERSHIP_DEPOSIT * pubkeylen,\\n \\\"RLN, registerBatch: membership deposit is not satisfied\\\"\\n );\\n for (uint256 i = 0; i < pubkeylen; i++) {\\n _register(pubkeys[i]);\\n }\\n }\\n\\n function _register(uint256 pubkey) internal {\\n members[pubkeyIndex] = pubkey;\\n emit MemberRegistered(pubkey, pubkeyIndex);\\n pubkeyIndex += 1;\\n }\\n\\n function withdrawBatch(\\n uint256[] calldata secrets,\\n uint256[] calldata pubkeyIndexes,\\n address payable[] calldata receivers\\n ) external {\\n uint256 batchSize = secrets.length;\\n require(batchSize != 0, \\\"RLN, withdrawBatch: batch size zero\\\");\\n require(\\n batchSize == pubkeyIndexes.length,\\n \\\"RLN, withdrawBatch: batch size mismatch pubkey indexes\\\"\\n );\\n require(\\n batchSize == receivers.length,\\n \\\"RLN, withdrawBatch: batch size mismatch receivers\\\"\\n );\\n for (uint256 i = 0; i < batchSize; i++) {\\n _withdraw(secrets[i], pubkeyIndexes[i], receivers[i]);\\n }\\n }\\n\\n function withdraw(\\n uint256 secret,\\n uint256 _pubkeyIndex,\\n address payable receiver\\n ) external {\\n _withdraw(secret, _pubkeyIndex, receiver);\\n }\\n\\n function _withdraw(\\n uint256 secret,\\n uint256 _pubkeyIndex,\\n address payable receiver\\n ) internal {\\n require(\\n _pubkeyIndex < SET_SIZE,\\n \\\"RLN, _withdraw: invalid pubkey index\\\"\\n );\\n require(\\n members[_pubkeyIndex] != 0,\\n \\\"RLN, _withdraw: member doesn't exist\\\"\\n );\\n require(\\n receiver != address(0),\\n \\\"RLN, _withdraw: empty receiver address\\\"\\n );\\n\\n // derive public key\\n uint256 pubkey = hash(secret);\\n require(\\n members[_pubkeyIndex] == pubkey,\\n \\\"RLN, _withdraw: not verified\\\"\\n );\\n\\n // delete member\\n members[_pubkeyIndex] = 0;\\n\\n // refund deposit\\n (bool sent, bytes memory data) = receiver.call{\\n value: MEMBERSHIP_DEPOSIT\\n }(\\\"\\\");\\n require(sent, \\\"transfer failed\\\");\\n\\n emit MemberWithdrawn(pubkey, _pubkeyIndex);\\n }\\n\\n function hash(uint256 input) internal view returns (uint256) {\\n return poseidonHasher.hash(input);\\n }\\n}\\n\",\"keccak256\":\"0xb6998586350a9bf788b939ef303f7a5e7c0da517611950b35c05448a5e2a96a8\"},\"contracts/ValidGroupStorage.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nimport \\\"@interep/contracts/Interep.sol\\\";\\n\\ninterface IValidGroupStorage {\\n function isValidGroup(uint256 groupId) external view returns (bool);\\n\\n function interep() external view returns (address);\\n}\\n\\ncontract ValidGroupStorage {\\n mapping(uint256 => bool) public validGroups;\\n\\n Interep public interep;\\n\\n struct Group {\\n bytes32 provider;\\n bytes32 name;\\n }\\n\\n constructor(address _interep, Group[] memory _groups) {\\n interep = Interep(_interep);\\n for (uint8 i = 0; i < _groups.length; i++) {\\n uint256 groupId = uint256(\\n keccak256(\\n abi.encodePacked(_groups[i].provider, _groups[i].name)\\n )\\n ) % SNARK_SCALAR_FIELD;\\n (bytes32 provider, bytes32 name, , ) = interep.groups(groupId);\\n if (provider == _groups[i].provider && name == _groups[i].name) {\\n validGroups[groupId] = true;\\n } else {\\n revert(\\\"[ValidGroupStorage] Invalid group\\\");\\n }\\n }\\n }\\n\\n function isValidGroup(uint256 _groupId) public view returns (bool) {\\n return validGroups[_groupId];\\n }\\n}\\n\",\"keccak256\":\"0xb1a8a3f7ae01b2955783b063fa70cca284cdeeb7aa548147fd19616f818fb9aa\",\"license\":\"MIT\"}},\"version\":1}",
|
|
"bytecode": "0x60e0604052600080553480156200001557600080fd5b5060405162001f6c38038062001f6c83398181016040528101906200003b91906200025c565b83608081815250508260a08181525050826001901b60c0818152505081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635d0a8dc26040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000147573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200016d9190620002ce565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505062000300565b600080fd5b6000819050919050565b620001d181620001bc565b8114620001dd57600080fd5b50565b600081519050620001f181620001c6565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022482620001f7565b9050919050565b620002368162000217565b81146200024257600080fd5b50565b60008151905062000256816200022b565b92915050565b60008060008060808587031215620002795762000278620001b7565b5b60006200028987828801620001e0565b94505060206200029c87828801620001e0565b9350506040620002af8782880162000245565b9250506060620002c28782880162000245565b91505092959194509250565b600060208284031215620002e757620002e6620001b7565b5b6000620002f78482850162000245565b91505092915050565b60805160a05160c051611c0b6200036160003960008181610368015281816107110152818161081b0152818161083f01526109350152600061048b0152600081816103d9015281816108a3015281816109110152610af10152611c0b6000f3fe6080604052600436106100c25760003560e01c806398366e351161007f578063baa8d18911610059578063baa8d18914610249578063d0383d6814610272578063f207564e1461029d578063f220b9ec146102b9576100c2565b806398366e35146101ca578063a19aaee8146101f5578063a9d85eba14610220576100c2565b80630ad58d2f146100c7578063331b6ab3146100f05780635d0a8dc21461011b5780635daf08ca1461014657806361579a931461018357806369e4863f146101ae575b600080fd5b3480156100d357600080fd5b506100ee60048036038101906100e99190610d97565b6102e4565b005b3480156100fc57600080fd5b506101056102f4565b6040516101129190610e49565b60405180910390f35b34801561012757600080fd5b5061013061031a565b60405161013d9190610e85565b60405180910390f35b34801561015257600080fd5b5061016d60048036038101906101689190610ea0565b610340565b60405161017a9190610edc565b60405180910390f35b34801561018f57600080fd5b50610198610358565b6040516101a59190610edc565b60405180910390f35b6101c860048036038101906101c39190610f5c565b61035e565b005b3480156101d657600080fd5b506101df610489565b6040516101ec9190610edc565b60405180910390f35b34801561020157600080fd5b5061020a6104ad565b6040516102179190610fca565b60405180910390f35b34801561022c57600080fd5b506102476004803603810190610242919061103b565b6104d3565b005b34801561025557600080fd5b50610270600480360381019061026b9190611147565b610634565b005b34801561027e57600080fd5b50610287610819565b6040516102949190610edc565b60405180910390f35b6102b760048036038101906102b29190610ea0565b61083d565b005b3480156102c557600080fd5b506102ce61090f565b6040516102db9190610edc565b60405180910390f35b6102ef838383610933565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915090505481565b60005481565b60008282905090507f0000000000000000000000000000000000000000000000000000000000000000816000546103959190611205565b11156103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd906112b8565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000000000000000061040291906112d8565b3414610443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043a906113a4565b60405180910390fd5b60005b8181101561048357610470848483818110610464576104636113c4565b5b90506020020135610be4565b808061047b906113f3565b915050610446565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008686905090506000810361051e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610515906114ad565b60405180910390fd5b848490508114610563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055a9061153f565b60405180910390fd5b8282905081146105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059f906115d1565b60405180910390fd5b60005b8181101561062a576106178888838181106105c9576105c86113c4565b5b905060200201358787848181106105e3576105e26113c4565b5b905060200201358686858181106105fd576105fc6113c4565b5b905060200201602081019061061291906115f1565b610933565b8080610622906113f3565b9150506105ab565b5050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b655ee34876040518263ffffffff1660e01b815260040161068f9190610edc565b602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190611656565b61070f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610706906116f5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060005410610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90611761565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636673e84987878787876040518663ffffffff1660e01b81526004016107d69594939291906117b0565b600060405180830381600087803b1580156107f057600080fd5b505af1158015610804573d6000803e3d6000fd5b5050505061081181610be4565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000600054106108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890611761565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003414610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa90611876565b60405180910390fd5b61090c81610be4565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000008210610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90611908565b60405180910390fd5b60006001600084815260200190815260200160002054036109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e29061199a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190611a2c565b60405180910390fd5b6000610a6584610c54565b905080600160008581526020019081526020016000205414610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390611a98565b60405180910390fd5b600060016000858152602001908152602001600020819055506000808373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000604051610b1c90611ae9565b60006040518083038185875af1925050503d8060008114610b59576040519150601f19603f3d011682016040523d82523d6000602084013e610b5e565b606091505b509150915081610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90611b4a565b60405180910390fd5b7f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a9438386604051610bd4929190611b6a565b60405180910390a1505050505050565b806001600080548152602001908152602001600020819055507f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d281600054604051610c30929190611b6a565b60405180910390a16001600080828254610c4a9190611205565b9250508190555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b189fd4c836040518263ffffffff1660e01b8152600401610cb19190610edc565b602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190611ba8565b9050919050565b600080fd5b600080fd5b6000819050919050565b610d1681610d03565b8114610d2157600080fd5b50565b600081359050610d3381610d0d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d6482610d39565b9050919050565b610d7481610d59565b8114610d7f57600080fd5b50565b600081359050610d9181610d6b565b92915050565b600080600060608486031215610db057610daf610cf9565b5b6000610dbe86828701610d24565b9350506020610dcf86828701610d24565b9250506040610de086828701610d82565b9150509250925092565b6000819050919050565b6000610e0f610e0a610e0584610d39565b610dea565b610d39565b9050919050565b6000610e2182610df4565b9050919050565b6000610e3382610e16565b9050919050565b610e4381610e28565b82525050565b6000602082019050610e5e6000830184610e3a565b92915050565b6000610e6f82610e16565b9050919050565b610e7f81610e64565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610cf9565b5b6000610ec484828501610d24565b91505092915050565b610ed681610d03565b82525050565b6000602082019050610ef16000830184610ecd565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610f1c57610f1b610ef7565b5b8235905067ffffffffffffffff811115610f3957610f38610efc565b5b602083019150836020820283011115610f5557610f54610f01565b5b9250929050565b60008060208385031215610f7357610f72610cf9565b5b600083013567ffffffffffffffff811115610f9157610f90610cfe565b5b610f9d85828601610f06565b92509250509250929050565b6000610fb482610e16565b9050919050565b610fc481610fa9565b82525050565b6000602082019050610fdf6000830184610fbb565b92915050565b60008083601f840112610ffb57610ffa610ef7565b5b8235905067ffffffffffffffff81111561101857611017610efc565b5b60208301915083602082028301111561103457611033610f01565b5b9250929050565b6000806000806000806060878903121561105857611057610cf9565b5b600087013567ffffffffffffffff81111561107657611075610cfe565b5b61108289828a01610f06565b9650965050602087013567ffffffffffffffff8111156110a5576110a4610cfe565b5b6110b189828a01610f06565b9450945050604087013567ffffffffffffffff8111156110d4576110d3610cfe565b5b6110e089828a01610fe5565b92509250509295509295509295565b6000819050919050565b611102816110ef565b811461110d57600080fd5b50565b60008135905061111f816110f9565b92915050565b60008190508260206008028201111561114157611140610f01565b5b92915050565b6000806000806000806101a0878903121561116557611164610cf9565b5b600061117389828a01610d24565b965050602061118489828a01611110565b955050604061119589828a01610d24565b94505060606111a689828a01610d24565b93505060806111b789828a01611125565b9250506101806111c989828a01610d24565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061121082610d03565b915061121b83610d03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156112505761124f6111d6565b5b828201905092915050565b600082825260208201905092915050565b7f524c4e2c20726567697374657242617463683a207365742069732066756c6c00600082015250565b60006112a2601f8361125b565b91506112ad8261126c565b602082019050919050565b600060208201905081810360008301526112d181611295565b9050919050565b60006112e382610d03565b91506112ee83610d03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611327576113266111d6565b5b828202905092915050565b7f524c4e2c20726567697374657242617463683a206d656d62657273686970206460008201527f65706f736974206973206e6f7420736174697366696564000000000000000000602082015250565b600061138e60378361125b565b915061139982611332565b604082019050919050565b600060208201905081810360008301526113bd81611381565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006113fe82610d03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114305761142f6111d6565b5b600182019050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65207a60008201527f65726f0000000000000000000000000000000000000000000000000000000000602082015250565b600061149760238361125b565b91506114a28261143b565b604082019050919050565b600060208201905081810360008301526114c68161148a565b9050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65206d60008201527f69736d61746368207075626b657920696e646578657300000000000000000000602082015250565b600061152960368361125b565b9150611534826114cd565b604082019050919050565b600060208201905081810360008301526115588161151c565b9050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65206d60008201527f69736d6174636820726563656976657273000000000000000000000000000000602082015250565b60006115bb60318361125b565b91506115c68261155f565b604082019050919050565b600060208201905081810360008301526115ea816115ae565b9050919050565b60006020828403121561160757611606610cf9565b5b600061161584828501610d82565b91505092915050565b60008115159050919050565b6116338161161e565b811461163e57600080fd5b50565b6000815190506116508161162a565b92915050565b60006020828403121561166c5761166b610cf9565b5b600061167a84828501611641565b91505092915050565b7f524c4e2c2072656769737465723a20696e76616c696420696e7465726570206760008201527f726f757000000000000000000000000000000000000000000000000000000000602082015250565b60006116df60248361125b565b91506116ea82611683565b604082019050919050565b6000602082019050818103600083015261170e816116d2565b9050919050565b7f524c4e2c2072656769737465723a207365742069732066756c6c000000000000600082015250565b600061174b601a8361125b565b915061175682611715565b602082019050919050565b6000602082019050818103600083015261177a8161173e565b9050919050565b61178a816110ef565b82525050565b82818337600083830152505050565b6117ac6101008383611790565b5050565b6000610180820190506117c66000830188610ecd565b6117d36020830187611781565b6117e06040830186610ecd565b6117ed6060830185610ecd565b6117fa608083018461179f565b9695505050505050565b7f524c4e2c2072656769737465723a206d656d62657273686970206465706f736960008201527f74206973206e6f74207361746973666965640000000000000000000000000000602082015250565b600061186060328361125b565b915061186b82611804565b604082019050919050565b6000602082019050818103600083015261188f81611853565b9050919050565b7f524c4e2c205f77697468647261773a20696e76616c6964207075626b6579206960008201527f6e64657800000000000000000000000000000000000000000000000000000000602082015250565b60006118f260248361125b565b91506118fd82611896565b604082019050919050565b60006020820190508181036000830152611921816118e5565b9050919050565b7f524c4e2c205f77697468647261773a206d656d62657220646f65736e2774206560008201527f7869737400000000000000000000000000000000000000000000000000000000602082015250565b600061198460248361125b565b915061198f82611928565b604082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f524c4e2c205f77697468647261773a20656d707479207265636569766572206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611a1660268361125b565b9150611a21826119ba565b604082019050919050565b60006020820190508181036000830152611a4581611a09565b9050919050565b7f524c4e2c205f77697468647261773a206e6f7420766572696669656400000000600082015250565b6000611a82601c8361125b565b9150611a8d82611a4c565b602082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b600081905092915050565b50565b6000611ad3600083611ab8565b9150611ade82611ac3565b600082019050919050565b6000611af482611ac6565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000611b34600f8361125b565b9150611b3f82611afe565b602082019050919050565b60006020820190508181036000830152611b6381611b27565b9050919050565b6000604082019050611b7f6000830185610ecd565b611b8c6020830184610ecd565b9392505050565b600081519050611ba281610d0d565b92915050565b600060208284031215611bbe57611bbd610cf9565b5b6000611bcc84828501611b93565b9150509291505056fea2646970667358221220467b74ba781ee3a9ee18af2d7118be94004b30b136ae96cb759ff60c2553d88c64736f6c634300080f0033",
|
|
"deployedBytecode": "0x6080604052600436106100c25760003560e01c806398366e351161007f578063baa8d18911610059578063baa8d18914610249578063d0383d6814610272578063f207564e1461029d578063f220b9ec146102b9576100c2565b806398366e35146101ca578063a19aaee8146101f5578063a9d85eba14610220576100c2565b80630ad58d2f146100c7578063331b6ab3146100f05780635d0a8dc21461011b5780635daf08ca1461014657806361579a931461018357806369e4863f146101ae575b600080fd5b3480156100d357600080fd5b506100ee60048036038101906100e99190610d97565b6102e4565b005b3480156100fc57600080fd5b506101056102f4565b6040516101129190610e49565b60405180910390f35b34801561012757600080fd5b5061013061031a565b60405161013d9190610e85565b60405180910390f35b34801561015257600080fd5b5061016d60048036038101906101689190610ea0565b610340565b60405161017a9190610edc565b60405180910390f35b34801561018f57600080fd5b50610198610358565b6040516101a59190610edc565b60405180910390f35b6101c860048036038101906101c39190610f5c565b61035e565b005b3480156101d657600080fd5b506101df610489565b6040516101ec9190610edc565b60405180910390f35b34801561020157600080fd5b5061020a6104ad565b6040516102179190610fca565b60405180910390f35b34801561022c57600080fd5b506102476004803603810190610242919061103b565b6104d3565b005b34801561025557600080fd5b50610270600480360381019061026b9190611147565b610634565b005b34801561027e57600080fd5b50610287610819565b6040516102949190610edc565b60405180910390f35b6102b760048036038101906102b29190610ea0565b61083d565b005b3480156102c557600080fd5b506102ce61090f565b6040516102db9190610edc565b60405180910390f35b6102ef838383610933565b505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915090505481565b60005481565b60008282905090507f0000000000000000000000000000000000000000000000000000000000000000816000546103959190611205565b11156103d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103cd906112b8565b60405180910390fd5b807f000000000000000000000000000000000000000000000000000000000000000061040291906112d8565b3414610443576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043a906113a4565b60405180910390fd5b60005b8181101561048357610470848483818110610464576104636113c4565b5b90506020020135610be4565b808061047b906113f3565b915050610446565b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008686905090506000810361051e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610515906114ad565b60405180910390fd5b848490508114610563576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055a9061153f565b60405180910390fd5b8282905081146105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161059f906115d1565b60405180910390fd5b60005b8181101561062a576106178888838181106105c9576105c86113c4565b5b905060200201358787848181106105e3576105e26113c4565b5b905060200201358686858181106105fd576105fc6113c4565b5b905060200201602081019061061291906115f1565b610933565b8080610622906113f3565b9150506105ab565b5050505050505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b655ee34876040518263ffffffff1660e01b815260040161068f9190610edc565b602060405180830381865afa1580156106ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d09190611656565b61070f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610706906116f5565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000060005410610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90611761565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636673e84987878787876040518663ffffffff1660e01b81526004016107d69594939291906117b0565b600060405180830381600087803b1580156107f057600080fd5b505af1158015610804573d6000803e3d6000fd5b5050505061081181610be4565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f0000000000000000000000000000000000000000000000000000000000000000600054106108a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089890611761565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003414610903576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fa90611876565b60405180910390fd5b61090c81610be4565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f00000000000000000000000000000000000000000000000000000000000000008210610995576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098c90611908565b60405180910390fd5b60006001600084815260200190815260200160002054036109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e29061199a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190611a2c565b60405180910390fd5b6000610a6584610c54565b905080600160008581526020019081526020016000205414610abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab390611a98565b60405180910390fd5b600060016000858152602001908152602001600020819055506000808373ffffffffffffffffffffffffffffffffffffffff167f0000000000000000000000000000000000000000000000000000000000000000604051610b1c90611ae9565b60006040518083038185875af1925050503d8060008114610b59576040519150601f19603f3d011682016040523d82523d6000602084013e610b5e565b606091505b509150915081610ba3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9a90611b4a565b60405180910390fd5b7f62ec3a516d22a993ce5cb4e7593e878c74f4d799dde522a88dc27a994fd5a9438386604051610bd4929190611b6a565b60405180910390a1505050505050565b806001600080548152602001908152602001600020819055507f5a92c2530f207992057b9c3e544108ffce3beda4a63719f316967c49bf6159d281600054604051610c30929190611b6a565b60405180910390a16001600080828254610c4a9190611205565b9250508190555050565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b189fd4c836040518263ffffffff1660e01b8152600401610cb19190610edc565b602060405180830381865afa158015610cce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf29190611ba8565b9050919050565b600080fd5b600080fd5b6000819050919050565b610d1681610d03565b8114610d2157600080fd5b50565b600081359050610d3381610d0d565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610d6482610d39565b9050919050565b610d7481610d59565b8114610d7f57600080fd5b50565b600081359050610d9181610d6b565b92915050565b600080600060608486031215610db057610daf610cf9565b5b6000610dbe86828701610d24565b9350506020610dcf86828701610d24565b9250506040610de086828701610d82565b9150509250925092565b6000819050919050565b6000610e0f610e0a610e0584610d39565b610dea565b610d39565b9050919050565b6000610e2182610df4565b9050919050565b6000610e3382610e16565b9050919050565b610e4381610e28565b82525050565b6000602082019050610e5e6000830184610e3a565b92915050565b6000610e6f82610e16565b9050919050565b610e7f81610e64565b82525050565b6000602082019050610e9a6000830184610e76565b92915050565b600060208284031215610eb657610eb5610cf9565b5b6000610ec484828501610d24565b91505092915050565b610ed681610d03565b82525050565b6000602082019050610ef16000830184610ecd565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610f1c57610f1b610ef7565b5b8235905067ffffffffffffffff811115610f3957610f38610efc565b5b602083019150836020820283011115610f5557610f54610f01565b5b9250929050565b60008060208385031215610f7357610f72610cf9565b5b600083013567ffffffffffffffff811115610f9157610f90610cfe565b5b610f9d85828601610f06565b92509250509250929050565b6000610fb482610e16565b9050919050565b610fc481610fa9565b82525050565b6000602082019050610fdf6000830184610fbb565b92915050565b60008083601f840112610ffb57610ffa610ef7565b5b8235905067ffffffffffffffff81111561101857611017610efc565b5b60208301915083602082028301111561103457611033610f01565b5b9250929050565b6000806000806000806060878903121561105857611057610cf9565b5b600087013567ffffffffffffffff81111561107657611075610cfe565b5b61108289828a01610f06565b9650965050602087013567ffffffffffffffff8111156110a5576110a4610cfe565b5b6110b189828a01610f06565b9450945050604087013567ffffffffffffffff8111156110d4576110d3610cfe565b5b6110e089828a01610fe5565b92509250509295509295509295565b6000819050919050565b611102816110ef565b811461110d57600080fd5b50565b60008135905061111f816110f9565b92915050565b60008190508260206008028201111561114157611140610f01565b5b92915050565b6000806000806000806101a0878903121561116557611164610cf9565b5b600061117389828a01610d24565b965050602061118489828a01611110565b955050604061119589828a01610d24565b94505060606111a689828a01610d24565b93505060806111b789828a01611125565b9250506101806111c989828a01610d24565b9150509295509295509295565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061121082610d03565b915061121b83610d03565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156112505761124f6111d6565b5b828201905092915050565b600082825260208201905092915050565b7f524c4e2c20726567697374657242617463683a207365742069732066756c6c00600082015250565b60006112a2601f8361125b565b91506112ad8261126c565b602082019050919050565b600060208201905081810360008301526112d181611295565b9050919050565b60006112e382610d03565b91506112ee83610d03565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611327576113266111d6565b5b828202905092915050565b7f524c4e2c20726567697374657242617463683a206d656d62657273686970206460008201527f65706f736974206973206e6f7420736174697366696564000000000000000000602082015250565b600061138e60378361125b565b915061139982611332565b604082019050919050565b600060208201905081810360008301526113bd81611381565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006113fe82610d03565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036114305761142f6111d6565b5b600182019050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65207a60008201527f65726f0000000000000000000000000000000000000000000000000000000000602082015250565b600061149760238361125b565b91506114a28261143b565b604082019050919050565b600060208201905081810360008301526114c68161148a565b9050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65206d60008201527f69736d61746368207075626b657920696e646578657300000000000000000000602082015250565b600061152960368361125b565b9150611534826114cd565b604082019050919050565b600060208201905081810360008301526115588161151c565b9050919050565b7f524c4e2c20776974686472617742617463683a2062617463682073697a65206d60008201527f69736d6174636820726563656976657273000000000000000000000000000000602082015250565b60006115bb60318361125b565b91506115c68261155f565b604082019050919050565b600060208201905081810360008301526115ea816115ae565b9050919050565b60006020828403121561160757611606610cf9565b5b600061161584828501610d82565b91505092915050565b60008115159050919050565b6116338161161e565b811461163e57600080fd5b50565b6000815190506116508161162a565b92915050565b60006020828403121561166c5761166b610cf9565b5b600061167a84828501611641565b91505092915050565b7f524c4e2c2072656769737465723a20696e76616c696420696e7465726570206760008201527f726f757000000000000000000000000000000000000000000000000000000000602082015250565b60006116df60248361125b565b91506116ea82611683565b604082019050919050565b6000602082019050818103600083015261170e816116d2565b9050919050565b7f524c4e2c2072656769737465723a207365742069732066756c6c000000000000600082015250565b600061174b601a8361125b565b915061175682611715565b602082019050919050565b6000602082019050818103600083015261177a8161173e565b9050919050565b61178a816110ef565b82525050565b82818337600083830152505050565b6117ac6101008383611790565b5050565b6000610180820190506117c66000830188610ecd565b6117d36020830187611781565b6117e06040830186610ecd565b6117ed6060830185610ecd565b6117fa608083018461179f565b9695505050505050565b7f524c4e2c2072656769737465723a206d656d62657273686970206465706f736960008201527f74206973206e6f74207361746973666965640000000000000000000000000000602082015250565b600061186060328361125b565b915061186b82611804565b604082019050919050565b6000602082019050818103600083015261188f81611853565b9050919050565b7f524c4e2c205f77697468647261773a20696e76616c6964207075626b6579206960008201527f6e64657800000000000000000000000000000000000000000000000000000000602082015250565b60006118f260248361125b565b91506118fd82611896565b604082019050919050565b60006020820190508181036000830152611921816118e5565b9050919050565b7f524c4e2c205f77697468647261773a206d656d62657220646f65736e2774206560008201527f7869737400000000000000000000000000000000000000000000000000000000602082015250565b600061198460248361125b565b915061198f82611928565b604082019050919050565b600060208201905081810360008301526119b381611977565b9050919050565b7f524c4e2c205f77697468647261773a20656d707479207265636569766572206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611a1660268361125b565b9150611a21826119ba565b604082019050919050565b60006020820190508181036000830152611a4581611a09565b9050919050565b7f524c4e2c205f77697468647261773a206e6f7420766572696669656400000000600082015250565b6000611a82601c8361125b565b9150611a8d82611a4c565b602082019050919050565b60006020820190508181036000830152611ab181611a75565b9050919050565b600081905092915050565b50565b6000611ad3600083611ab8565b9150611ade82611ac3565b600082019050919050565b6000611af482611ac6565b9150819050919050565b7f7472616e73666572206661696c65640000000000000000000000000000000000600082015250565b6000611b34600f8361125b565b9150611b3f82611afe565b602082019050919050565b60006020820190508181036000830152611b6381611b27565b9050919050565b6000604082019050611b7f6000830185610ecd565b611b8c6020830184610ecd565b9392505050565b600081519050611ba281610d0d565b92915050565b600060208284031215611bbe57611bbd610cf9565b5b6000611bcc84828501611b93565b9150509291505056fea2646970667358221220467b74ba781ee3a9ee18af2d7118be94004b30b136ae96cb759ff60c2553d88c64736f6c634300080f0033",
|
|
"devdoc": {
|
|
"kind": "dev",
|
|
"methods": {
|
|
"register(uint256,bytes32,uint256,uint256,uint256[8],uint256)": {
|
|
"details": "Registers a member via a valid Interep Semaphore group.",
|
|
"params": {
|
|
"externalNullifier": ": External nullifier.",
|
|
"groupId": ": Id of the group.",
|
|
"nullifierHash": ": Nullifier hash.",
|
|
"proof": ": Zero-knowledge proof.",
|
|
"pubkey": ": Public key of the member.",
|
|
"signal": ": Semaphore signal."
|
|
}
|
|
}
|
|
},
|
|
"version": 1
|
|
},
|
|
"userdoc": {
|
|
"kind": "user",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"storageLayout": {
|
|
"storage": [
|
|
{
|
|
"astId": 1107,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "pubkeyIndex",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_uint256"
|
|
},
|
|
{
|
|
"astId": 1111,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "members",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_mapping(t_uint256,t_uint256)"
|
|
},
|
|
{
|
|
"astId": 1114,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "poseidonHasher",
|
|
"offset": 0,
|
|
"slot": "2",
|
|
"type": "t_contract(IPoseidonHasher)648"
|
|
},
|
|
{
|
|
"astId": 1117,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "validGroupStorage",
|
|
"offset": 0,
|
|
"slot": "3",
|
|
"type": "t_contract(IValidGroupStorage)1510"
|
|
},
|
|
{
|
|
"astId": 1120,
|
|
"contract": "contracts/Rln.sol:RLN",
|
|
"label": "interep",
|
|
"offset": 0,
|
|
"slot": "4",
|
|
"type": "t_contract(IInterep)236"
|
|
}
|
|
],
|
|
"types": {
|
|
"t_contract(IInterep)236": {
|
|
"encoding": "inplace",
|
|
"label": "contract IInterep",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_contract(IPoseidonHasher)648": {
|
|
"encoding": "inplace",
|
|
"label": "contract IPoseidonHasher",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_contract(IValidGroupStorage)1510": {
|
|
"encoding": "inplace",
|
|
"label": "contract IValidGroupStorage",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_mapping(t_uint256,t_uint256)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => uint256)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_uint256"
|
|
},
|
|
"t_uint256": {
|
|
"encoding": "inplace",
|
|
"label": "uint256",
|
|
"numberOfBytes": "32"
|
|
}
|
|
}
|
|
}
|
|
} |