mirror of
https://github.com/vacp2p/rln-interep-contract.git
synced 2025-02-28 14:10:35 +00:00
189 lines
29 KiB
JSON
189 lines
29 KiB
JSON
{
|
|
"address": "0x97bB97A470c8fE3b98589089Ae3994fC4ce053F9",
|
|
"abi": [
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "address",
|
|
"name": "_interep",
|
|
"type": "address"
|
|
},
|
|
{
|
|
"components": [
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "provider",
|
|
"type": "bytes32"
|
|
},
|
|
{
|
|
"internalType": "bytes32",
|
|
"name": "name",
|
|
"type": "bytes32"
|
|
}
|
|
],
|
|
"internalType": "struct ValidGroupStorage.Group[]",
|
|
"name": "_groups",
|
|
"type": "tuple[]"
|
|
}
|
|
],
|
|
"stateMutability": "nonpayable",
|
|
"type": "constructor"
|
|
},
|
|
{
|
|
"inputs": [],
|
|
"name": "interep",
|
|
"outputs": [
|
|
{
|
|
"internalType": "contract Interep",
|
|
"name": "",
|
|
"type": "address"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "_groupId",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "isValidGroup",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bool",
|
|
"name": "",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
},
|
|
{
|
|
"inputs": [
|
|
{
|
|
"internalType": "uint256",
|
|
"name": "",
|
|
"type": "uint256"
|
|
}
|
|
],
|
|
"name": "validGroups",
|
|
"outputs": [
|
|
{
|
|
"internalType": "bool",
|
|
"name": "",
|
|
"type": "bool"
|
|
}
|
|
],
|
|
"stateMutability": "view",
|
|
"type": "function"
|
|
}
|
|
],
|
|
"transactionHash": "0x00f503f58d4169714741c53a550722240652dc0534629731b5f071d90e498e80",
|
|
"receipt": {
|
|
"to": null,
|
|
"from": "0xabD73e893D0398772f1a679B86C3148f724546ec",
|
|
"contractAddress": "0x97bB97A470c8fE3b98589089Ae3994fC4ce053F9",
|
|
"transactionIndex": 0,
|
|
"gasUsed": "397310",
|
|
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
|
"blockHash": "0x6a2879cf7824d0e8197b8405a2f15cc72aac4704d83c567602e932e2e143044f",
|
|
"transactionHash": "0x00f503f58d4169714741c53a550722240652dc0534629731b5f071d90e498e80",
|
|
"logs": [],
|
|
"blockNumber": 29,
|
|
"cumulativeGasUsed": "397310",
|
|
"status": 1,
|
|
"byzantium": true
|
|
},
|
|
"args": [
|
|
"0xf1F12331aF91E04ea488C941BDF313d278Dc662e",
|
|
[
|
|
{
|
|
"provider": "0x6769746875620000000000000000000000000000000000000000000000000000",
|
|
"name": "0x676f6c6400000000000000000000000000000000000000000000000000000000",
|
|
"root": 1,
|
|
"depth": 20
|
|
},
|
|
{
|
|
"provider": "0x6769746875620000000000000000000000000000000000000000000000000000",
|
|
"name": "0x62726f6e7a650000000000000000000000000000000000000000000000000000",
|
|
"root": 1,
|
|
"depth": 20
|
|
},
|
|
{
|
|
"provider": "0x6769746875620000000000000000000000000000000000000000000000000000",
|
|
"name": "0x756e726174656400000000000000000000000000000000000000000000000000",
|
|
"root": 1,
|
|
"depth": 20
|
|
},
|
|
{
|
|
"provider": "0x7265646469740000000000000000000000000000000000000000000000000000",
|
|
"name": "0x756e726174656400000000000000000000000000000000000000000000000000",
|
|
"root": 1,
|
|
"depth": 20
|
|
}
|
|
]
|
|
],
|
|
"numDeployments": 1,
|
|
"solcInputHash": "b8e33ba299e95051cdf4858cd81bbca9",
|
|
"metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_interep\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"provider\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"name\",\"type\":\"bytes32\"}],\"internalType\":\"struct ValidGroupStorage.Group[]\",\"name\":\"_groups\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"interep\",\"outputs\":[{\"internalType\":\"contract Interep\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_groupId\",\"type\":\"uint256\"}],\"name\":\"isValidGroup\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"validGroups\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/ValidGroupStorage.sol\":\"ValidGroupStorage\"},\"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/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": "0x60806040523480156200001157600080fd5b5060405162000b6e38038062000b6e83398181016040528101906200003791906200054d565b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b81518160ff161015620002bd5760007f30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001838360ff1681518110620000c457620000c3620005b3565b5b602002602001015160000151848460ff1681518110620000e957620000e8620005b3565b5b6020026020010151602001516040516020016200010892919062000607565b6040516020818303038152906040528051906020012060001c6200012d919062000670565b9050600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396324bd4846040518263ffffffff1660e01b81526004016200018f9190620006b9565b608060405180830381865afa158015620001ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001d3919062000745565b505091509150848460ff1681518110620001f257620001f1620005b3565b5b60200260200101516000015182148015620002305750848460ff1681518110620002215762000220620005b3565b5b60200260200101516020015181145b156200026757600160008085815260200190815260200160002060006101000a81548160ff021916908315150217905550620002a4565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200029b906200083e565b60405180910390fd5b5050508080620002b4906200088f565b9150506200007b565b505050620008bd565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200030782620002da565b9050919050565b6200031981620002fa565b81146200032557600080fd5b50565b60008151905062000339816200030e565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200038f8262000344565b810181811067ffffffffffffffff82111715620003b157620003b062000355565b5b80604052505050565b6000620003c6620002c6565b9050620003d4828262000384565b919050565b600067ffffffffffffffff821115620003f757620003f662000355565b5b602082029050602081019050919050565b600080fd5b600080fd5b6000819050919050565b620004278162000412565b81146200043357600080fd5b50565b60008151905062000447816200041c565b92915050565b6000604082840312156200046657620004656200040d565b5b620004726040620003ba565b90506000620004848482850162000436565b60008301525060206200049a8482850162000436565b60208301525092915050565b6000620004bd620004b784620003d9565b620003ba565b90508083825260208201905060408402830185811115620004e357620004e262000408565b5b835b81811015620005105780620004fb88826200044d565b845260208401935050604081019050620004e5565b5050509392505050565b600082601f8301126200053257620005316200033f565b5b815162000544848260208601620004a6565b91505092915050565b60008060408385031215620005675762000566620002d0565b5b6000620005778582860162000328565b925050602083015167ffffffffffffffff8111156200059b576200059a620002d5565b5b620005a9858286016200051a565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b62000601620005fb8262000412565b620005e2565b82525050565b6000620006158285620005ec565b602082019150620006278284620005ec565b6020820191508190509392505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200067d8262000637565b91506200068a8362000637565b9250826200069d576200069c62000641565b5b828206905092915050565b620006b38162000637565b82525050565b6000602082019050620006d06000830184620006a8565b92915050565b620006e18162000637565b8114620006ed57600080fd5b50565b6000815190506200070181620006d6565b92915050565b600060ff82169050919050565b6200071f8162000707565b81146200072b57600080fd5b50565b6000815190506200073f8162000714565b92915050565b60008060008060808587031215620007625762000761620002d0565b5b6000620007728782880162000436565b9450506020620007858782880162000436565b93505060406200079887828801620006f0565b9250506060620007ab878288016200072e565b91505092959194509250565b600082825260208201905092915050565b7f5b56616c696447726f757053746f726167655d20496e76616c69642067726f7560008201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b600062000826602183620007b7565b91506200083382620007c8565b604082019050919050565b60006020820190508181036000830152620008598162000817565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006200089c8262000707565b915060ff8203620008b257620008b162000860565b5b600182019050919050565b6102a180620008cd6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80635d0a8dc214610046578063b655ee3414610064578063c166109a14610094575b600080fd5b61004e6100c4565b60405161005b91906101b2565b60405180910390f35b61007e60048036038101906100799190610208565b6100ea565b60405161008b9190610250565b60405180910390f35b6100ae60048036038101906100a99190610208565b610113565b6040516100bb9190610250565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083815260200190815260200160002060009054906101000a900460ff169050919050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061017861017361016e84610133565b610153565b610133565b9050919050565b600061018a8261015d565b9050919050565b600061019c8261017f565b9050919050565b6101ac81610191565b82525050565b60006020820190506101c760008301846101a3565b92915050565b600080fd5b6000819050919050565b6101e5816101d2565b81146101f057600080fd5b50565b600081359050610202816101dc565b92915050565b60006020828403121561021e5761021d6101cd565b5b600061022c848285016101f3565b91505092915050565b60008115159050919050565b61024a81610235565b82525050565b60006020820190506102656000830184610241565b9291505056fea264697066735822122078e0998aea3f01f62577d57895d91f9c48a837a5dfc5deb31ac4c89159abc25464736f6c634300080f0033",
|
|
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c80635d0a8dc214610046578063b655ee3414610064578063c166109a14610094575b600080fd5b61004e6100c4565b60405161005b91906101b2565b60405180910390f35b61007e60048036038101906100799190610208565b6100ea565b60405161008b9190610250565b60405180910390f35b6100ae60048036038101906100a99190610208565b610113565b6040516100bb9190610250565b60405180910390f35b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600083815260200190815260200160002060009054906101000a900460ff169050919050565b60006020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061017861017361016e84610133565b610153565b610133565b9050919050565b600061018a8261015d565b9050919050565b600061019c8261017f565b9050919050565b6101ac81610191565b82525050565b60006020820190506101c760008301846101a3565b92915050565b600080fd5b6000819050919050565b6101e5816101d2565b81146101f057600080fd5b50565b600081359050610202816101dc565b92915050565b60006020828403121561021e5761021d6101cd565b5b600061022c848285016101f3565b91505092915050565b60008115159050919050565b61024a81610235565b82525050565b60006020820190506102656000830184610241565b9291505056fea264697066735822122078e0998aea3f01f62577d57895d91f9c48a837a5dfc5deb31ac4c89159abc25464736f6c634300080f0033",
|
|
"devdoc": {
|
|
"kind": "dev",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"userdoc": {
|
|
"kind": "user",
|
|
"methods": {},
|
|
"version": 1
|
|
},
|
|
"storageLayout": {
|
|
"storage": [
|
|
{
|
|
"astId": 2810,
|
|
"contract": "contracts/ValidGroupStorage.sol:ValidGroupStorage",
|
|
"label": "validGroups",
|
|
"offset": 0,
|
|
"slot": "0",
|
|
"type": "t_mapping(t_uint256,t_bool)"
|
|
},
|
|
{
|
|
"astId": 2813,
|
|
"contract": "contracts/ValidGroupStorage.sol:ValidGroupStorage",
|
|
"label": "interep",
|
|
"offset": 0,
|
|
"slot": "1",
|
|
"type": "t_contract(Interep)498"
|
|
}
|
|
],
|
|
"types": {
|
|
"t_bool": {
|
|
"encoding": "inplace",
|
|
"label": "bool",
|
|
"numberOfBytes": "1"
|
|
},
|
|
"t_contract(Interep)498": {
|
|
"encoding": "inplace",
|
|
"label": "contract Interep",
|
|
"numberOfBytes": "20"
|
|
},
|
|
"t_mapping(t_uint256,t_bool)": {
|
|
"encoding": "mapping",
|
|
"key": "t_uint256",
|
|
"label": "mapping(uint256 => bool)",
|
|
"numberOfBytes": "32",
|
|
"value": "t_bool"
|
|
},
|
|
"t_uint256": {
|
|
"encoding": "inplace",
|
|
"label": "uint256",
|
|
"numberOfBytes": "32"
|
|
}
|
|
}
|
|
}
|
|
}
|