From c143c9f2f29d963a669559d0d0cc97c70df040a1 Mon Sep 17 00:00:00 2001 From: Xoulomon Date: Fri, 8 Aug 2025 15:44:59 +0100 Subject: [PATCH] feat: membershipManager asignment --- .gitmodules | 3 + ASSIGNMENT.md | 4 + .../11155111/run-1754663773.json | 148 ++++++++++ .../11155111/run-latest.json | 148 ++++++++++ lib/openzeppelin-contracts | 1 + script/MembershipManager.s.sol | 20 ++ src/AccessToken.sol | 27 ++ src/ERC20.sol | 276 +++++++++--------- src/MembershipManager.sol | 66 +++++ src/MembershipNFT.sol | 21 ++ test/ERC20.t.sol | 206 ++++++------- test/MembershipManager.t.sol | 111 +++++++ 12 files changed, 791 insertions(+), 240 deletions(-) create mode 100644 ASSIGNMENT.md create mode 100644 broadcast/MembershipManager.s.sol/11155111/run-1754663773.json create mode 100644 broadcast/MembershipManager.s.sol/11155111/run-latest.json create mode 160000 lib/openzeppelin-contracts create mode 100644 script/MembershipManager.s.sol create mode 100644 src/AccessToken.sol create mode 100644 src/MembershipManager.sol create mode 100644 src/MembershipNFT.sol create mode 100644 test/MembershipManager.t.sol diff --git a/.gitmodules b/.gitmodules index 888d42d..e80ffd8 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "lib/openzeppelin-contracts"] + path = lib/openzeppelin-contracts + url = https://github.com/openzeppelin/openzeppelin-contracts diff --git a/ASSIGNMENT.md b/ASSIGNMENT.md new file mode 100644 index 0000000..cd0937c --- /dev/null +++ b/ASSIGNMENT.md @@ -0,0 +1,4 @@ +== Return == +0: contract AccessToken 0xBe7AbfF52fa56d8649DA14420B2f654102706447 +1: contract MembershipNFT 0xA77bFE3E9CaF800f50eAa127F0049861fc316b0E +2: contract MembershipManager 0xD136CbD359aDB48Fd0eF4721EE7D028ddd916144 \ No newline at end of file diff --git a/broadcast/MembershipManager.s.sol/11155111/run-1754663773.json b/broadcast/MembershipManager.s.sol/11155111/run-1754663773.json new file mode 100644 index 0000000..6025f35 --- /dev/null +++ b/broadcast/MembershipManager.s.sol/11155111/run-1754663773.json @@ -0,0 +1,148 @@ +{ + "transactions": [ + { + "hash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionType": "CREATE", + "contractName": "AccessToken", + "contractAddress": "0xbe7abff52fa56d8649da14420b2f654102706447", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x1542f2", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040518060400160405280600c81526020017f41636365737320546f6b656e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f4143540000000000000000000000000000000000000000000000000000000000815250816003908161008b91906105d1565b50806004908161009b91906105d1565b5050503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506100f133620f42406100f660201b60201c565b6107b5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610166575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161015d91906106df565b60405180910390fd5b6101775f838361017b60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101cb578060025f8282546101bf9190610725565b92505081905550610299565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610254578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161024b93929190610767565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102e0578060025f828254039250508190555061032a565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610387919061079c565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061040f57607f821691505b602082108103610422576104216103cb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610449565b61048e8683610449565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6104d26104cd6104c8846104a6565b6104af565b6104a6565b9050919050565b5f819050919050565b6104eb836104b8565b6104ff6104f7826104d9565b848454610455565b825550505050565b5f5f905090565b610516610507565b6105218184846104e2565b505050565b5b81811015610544576105395f8261050e565b600181019050610527565b5050565b601f8211156105895761055a81610428565b6105638461043a565b81016020851015610572578190505b61058661057e8561043a565b830182610526565b50505b505050565b5f82821c905092915050565b5f6105a95f198460080261058e565b1980831691505092915050565b5f6105c1838361059a565b9150826002028217905092915050565b6105da82610394565b67ffffffffffffffff8111156105f3576105f261039e565b5b6105fd82546103f8565b610608828285610548565b5f60209050601f831160018114610639575f8415610627578287015190505b61063185826105b6565b865550610698565b601f19841661064786610428565b5f5b8281101561066e57848901518255600182019150602085019450602081019050610649565b8683101561068b5784890151610687601f89168261059a565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106c9826106a0565b9050919050565b6106d9816106bf565b82525050565b5f6020820190506106f25f8301846106d0565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61072f826104a6565b915061073a836104a6565b9250828201905080821115610752576107516106f8565b5b92915050565b610761816104a6565b82525050565b5f60608201905061077a5f8301866106d0565b6107876020830185610758565b6107946040830184610758565b949350505050565b5f6020820190506107af5f830184610758565b92915050565b610fde806107c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100a7575f3560e01c806340c10f191161006f57806340c10f191461016557806370a0823114610181578063893d20e8146101b157806395d89b41146101cf578063a9059cbb146101ed578063dd62ed3e1461021d576100a7565b806306fdde03146100ab578063095ea7b3146100c957806318160ddd146100f957806323b872dd14610117578063313ce56714610147575b5f5ffd5b6100b361024d565b6040516100c09190610bef565b60405180910390f35b6100e360048036038101906100de9190610ca0565b6102dd565b6040516100f09190610cf8565b60405180910390f35b6101016102ff565b60405161010e9190610d20565b60405180910390f35b610131600480360381019061012c9190610d39565b610308565b60405161013e9190610cf8565b60405180910390f35b61014f610336565b60405161015c9190610da4565b60405180910390f35b61017f600480360381019061017a9190610ca0565b61033e565b005b61019b60048036038101906101969190610dbd565b6103db565b6040516101a89190610d20565b60405180910390f35b6101b9610420565b6040516101c69190610df7565b60405180910390f35b6101d7610448565b6040516101e49190610bef565b60405180910390f35b61020760048036038101906102029190610ca0565b6104d8565b6040516102149190610cf8565b60405180910390f35b61023760048036038101906102329190610e10565b6104fa565b6040516102449190610d20565b60405180910390f35b60606003805461025c90610e7b565b80601f016020809104026020016040519081016040528092919081815260200182805461028890610e7b565b80156102d35780601f106102aa576101008083540402835291602001916102d3565b820191905f5260205f20905b8154815290600101906020018083116102b657829003601f168201915b5050505050905090565b5f5f6102e761057c565b90506102f4818585610583565b600191505092915050565b5f600254905090565b5f5f61031261057c565b905061031f858285610595565b61032a858585610628565b60019150509392505050565b5f6012905090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c490610ef5565b60405180910390fd5b6103d78282610718565b5050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461045790610e7b565b80601f016020809104026020016040519081016040528092919081815260200182805461048390610e7b565b80156104ce5780601f106104a5576101008083540402835291602001916104ce565b820191905f5260205f20905b8154815290600101906020018083116104b157829003601f168201915b5050505050905090565b5f5f6104e261057c565b90506104ef818585610628565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6105908383836001610797565b505050565b5f6105a084846104fa565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106225781811015610613578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161060a93929190610f13565b60405180910390fd5b61062184848484035f610797565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610698575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161068f9190610df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610708575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106ff9190610df7565b60405180910390fd5b610713838383610966565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610788575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161077f9190610df7565b60405180910390fd5b6107935f8383610966565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610807575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016107fe9190610df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610877575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161086e9190610df7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610960578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109579190610d20565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b6578060025f8282546109aa9190610f75565b92505081905550610a84565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610a3f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610a3693929190610f13565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610acb578060025f8282540392505081905550610b15565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b729190610d20565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610bc182610b7f565b610bcb8185610b89565b9350610bdb818560208601610b99565b610be481610ba7565b840191505092915050565b5f6020820190508181035f830152610c078184610bb7565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610c3c82610c13565b9050919050565b610c4c81610c32565b8114610c56575f5ffd5b50565b5f81359050610c6781610c43565b92915050565b5f819050919050565b610c7f81610c6d565b8114610c89575f5ffd5b50565b5f81359050610c9a81610c76565b92915050565b5f5f60408385031215610cb657610cb5610c0f565b5b5f610cc385828601610c59565b9250506020610cd485828601610c8c565b9150509250929050565b5f8115159050919050565b610cf281610cde565b82525050565b5f602082019050610d0b5f830184610ce9565b92915050565b610d1a81610c6d565b82525050565b5f602082019050610d335f830184610d11565b92915050565b5f5f5f60608486031215610d5057610d4f610c0f565b5b5f610d5d86828701610c59565b9350506020610d6e86828701610c59565b9250506040610d7f86828701610c8c565b9150509250925092565b5f60ff82169050919050565b610d9e81610d89565b82525050565b5f602082019050610db75f830184610d95565b92915050565b5f60208284031215610dd257610dd1610c0f565b5b5f610ddf84828501610c59565b91505092915050565b610df181610c32565b82525050565b5f602082019050610e0a5f830184610de8565b92915050565b5f5f60408385031215610e2657610e25610c0f565b5b5f610e3385828601610c59565b9250506020610e4485828601610c59565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610e9257607f821691505b602082108103610ea557610ea4610e4e565b5b50919050565b7f416363657373546f6b656e3a3a20556e617574686f72697a65642055736572005f82015250565b5f610edf601f83610b89565b9150610eea82610eab565b602082019050919050565b5f6020820190508181035f830152610f0c81610ed3565b9050919050565b5f606082019050610f265f830186610de8565b610f336020830185610d11565b610f406040830184610d11565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f7f82610c6d565b9150610f8a83610c6d565b9250828201905080821115610fa257610fa1610f48565b5b9291505056fea2646970667358221220a2cda4a9d2a03fd7c7642ebf3a38ef32942c2cb64fbca47423753eab3a7497c664736f6c634300081e0033", + "nonce": "0x3", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xea6337064c814d597c1092fe08912da0747bd1486f3097c69474a77a037186c9", + "transactionType": "CREATE", + "contractName": "MembershipNFT", + "contractAddress": "0xa77bfe3e9caf800f50eaa127f0049861fc316b0e", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x22ddfa", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040518060400160405280600e81526020017f4d656d62657273686970204e46540000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4e465400000000000000000000000000000000000000000000000000000000815250815f908161008a91906102df565b50806001908161009a91906102df565b5050506103ae565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061011d57607f821691505b6020821081036101305761012f6100d9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610157565b61019c8683610157565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101e06101db6101d6846101b4565b6101bd565b6101b4565b9050919050565b5f819050919050565b6101f9836101c6565b61020d610205826101e7565b848454610163565b825550505050565b5f5f905090565b610224610215565b61022f8184846101f0565b505050565b5b81811015610252576102475f8261021c565b600181019050610235565b5050565b601f8211156102975761026881610136565b61027184610148565b81016020851015610280578190505b61029461028c85610148565b830182610234565b50505b505050565b5f82821c905092915050565b5f6102b75f198460080261029c565b1980831691505092915050565b5f6102cf83836102a8565b9150826002028217905092915050565b6102e8826100a2565b67ffffffffffffffff811115610301576103006100ac565b5b61030b8254610106565b610316828285610256565b5f60209050601f831160018114610347575f8415610335578287015190505b61033f85826102c4565b8655506103a6565b601f19841661035586610136565b5f5b8281101561037c57848901518255600182019150602085019450602081019050610357565b868310156103995784890151610395601f8916826102a8565b8355505b6001600288020188555050505b505050505050565b611dda806103bb5f395ff3fe608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610295578063b88d4fde146102b1578063c87b56dd146102cd578063e985e9c5146102fd576100f3565b80636352211e146101e75780636a6278421461021757806370a082311461024757806395d89b4114610277576100f3565b8063095ea7b3116100d1578063095ea7b31461017557806317d70f7c1461019157806323b872dd146101af57806342842e0e146101cb576100f3565b806301ffc9a7146100f757806306fdde0314610127578063081812fc14610145575b5f5ffd5b610111600480360381019061010c9190611611565b61032d565b60405161011e9190611656565b60405180910390f35b61012f61040e565b60405161013c91906116df565b60405180910390f35b61015f600480360381019061015a9190611732565b61049d565b60405161016c919061179c565b60405180910390f35b61018f600480360381019061018a91906117df565b6104b8565b005b6101996104ce565b6040516101a6919061182c565b60405180910390f35b6101c960048036038101906101c49190611845565b6104d4565b005b6101e560048036038101906101e09190611845565b6105d3565b005b61020160048036038101906101fc9190611732565b6105f2565b60405161020e919061179c565b60405180910390f35b610231600480360381019061022c9190611895565b610603565b60405161023e919061182c565b60405180910390f35b610261600480360381019061025c9190611895565b610636565b60405161026e919061182c565b60405180910390f35b61027f6106ec565b60405161028c91906116df565b60405180910390f35b6102af60048036038101906102aa91906118ea565b61077c565b005b6102cb60048036038101906102c69190611a54565b610792565b005b6102e760048036038101906102e29190611732565b6107b7565b6040516102f491906116df565b60405180910390f35b61031760048036038101906103129190611ad4565b61081d565b6040516103249190611656565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104075750610406826108ab565b5b9050919050565b60605f805461041c90611b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461044890611b3f565b80156104935780601f1061046a57610100808354040283529160200191610493565b820191905f5260205f20905b81548152906001019060200180831161047657829003601f168201915b5050505050905090565b5f6104a782610914565b506104b18261099a565b9050919050565b6104ca82826104c56109d3565b6109da565b5050565b60065481565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610544575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161053b919061179c565b60405180910390fd5b5f61055783836105526109d3565b6109ec565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105cd578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016105c493929190611b6f565b60405180910390fd5b50505050565b6105ed83838360405180602001604052805f815250610792565b505050565b5f6105fc82610914565b9050919050565b5f60065f81548092919061061690611bd1565b91905055505f600654905061062b8382610bf7565b600654915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106a7575f6040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161069e919061179c565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600180546106fb90611b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461072790611b3f565b80156107725780601f1061074957610100808354040283529160200191610772565b820191905f5260205f20905b81548152906001019060200180831161075557829003601f168201915b5050505050905090565b61078e6107876109d3565b8383610cea565b5050565b61079d8484846104d4565b6107b16107a86109d3565b85858585610e53565b50505050565b60606107c282610914565b505f6107cc610fff565b90505f8151116107ea5760405180602001604052805f815250610815565b806107f484611015565b604051602001610805929190611c52565b6040516020818303038152906040525b915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f5f61091f836110df565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361099157826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610988919061182c565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b6109e78383836001611118565b505050565b5f5f6109f7846110df565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a3857610a378184866112d7565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac357610a775f855f5f611118565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610b4257600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c67575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c5e919061179c565b60405180910390fd5b5f610c7383835f6109ec565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce5575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610cdc919061179c565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5a57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610d51919061179c565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e469190611656565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115610ff8578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401610eb19493929190611cc7565b6020604051808303815f875af1925050508015610eec57506040513d601f19601f82011682018060405250810190610ee99190611d25565b60015b610f6d573d805f8114610f1a576040519150601f19603f3d011682016040523d82523d5f602084013e610f1f565b606091505b505f815103610f6557836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610f5c919061179c565b60405180910390fd5b805160208201fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610ff657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fed919061179c565b60405180910390fd5b505b5050505050565b606060405180602001604052805f815250905090565b60605f60016110238461139a565b0190505f8167ffffffffffffffff81111561104157611040611930565b5b6040519080825280601f01601f1916602001820160405280156110735781602001600182028036833780820191505090505b5090505f82602083010190505b6001156110d4578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110c9576110c8611d50565b5b0494505f8503611080575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061115057505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611282575f61115f84610914565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111c957508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156111dc57506111da818461081d565b155b1561121e57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611215919061179c565b60405180910390fd5b811561128057838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6112e28383836114eb565b611395575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361135657806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161134d919061182c565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161138c929190611d7d565b60405180910390fd5b505050565b5f5f5f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106113f6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816113ec576113eb611d50565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611433576d04ee2d6d415b85acef8100000000838161142957611428611d50565b5b0492506020810190505b662386f26fc10000831061146257662386f26fc10000838161145857611457611d50565b5b0492506010810190505b6305f5e100831061148b576305f5e100838161148157611480611d50565b5b0492506008810190505b61271083106114b05761271083816114a6576114a5611d50565b5b0492506004810190505b606483106114d357606483816114c9576114c8611d50565b5b0492506002810190505b600a83106114e2576001810190505b80915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156115a257508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115635750611562848461081d565b5b806115a157508273ffffffffffffffffffffffffffffffffffffffff166115898361099a565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115f0816115bc565b81146115fa575f5ffd5b50565b5f8135905061160b816115e7565b92915050565b5f60208284031215611626576116256115b4565b5b5f611633848285016115fd565b91505092915050565b5f8115159050919050565b6116508161163c565b82525050565b5f6020820190506116695f830184611647565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6116b18261166f565b6116bb8185611679565b93506116cb818560208601611689565b6116d481611697565b840191505092915050565b5f6020820190508181035f8301526116f781846116a7565b905092915050565b5f819050919050565b611711816116ff565b811461171b575f5ffd5b50565b5f8135905061172c81611708565b92915050565b5f60208284031215611747576117466115b4565b5b5f6117548482850161171e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117868261175d565b9050919050565b6117968161177c565b82525050565b5f6020820190506117af5f83018461178d565b92915050565b6117be8161177c565b81146117c8575f5ffd5b50565b5f813590506117d9816117b5565b92915050565b5f5f604083850312156117f5576117f46115b4565b5b5f611802858286016117cb565b92505060206118138582860161171e565b9150509250929050565b611826816116ff565b82525050565b5f60208201905061183f5f83018461181d565b92915050565b5f5f5f6060848603121561185c5761185b6115b4565b5b5f611869868287016117cb565b935050602061187a868287016117cb565b925050604061188b8682870161171e565b9150509250925092565b5f602082840312156118aa576118a96115b4565b5b5f6118b7848285016117cb565b91505092915050565b6118c98161163c565b81146118d3575f5ffd5b50565b5f813590506118e4816118c0565b92915050565b5f5f60408385031215611900576118ff6115b4565b5b5f61190d858286016117cb565b925050602061191e858286016118d6565b9150509250929050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61196682611697565b810181811067ffffffffffffffff8211171561198557611984611930565b5b80604052505050565b5f6119976115ab565b90506119a3828261195d565b919050565b5f67ffffffffffffffff8211156119c2576119c1611930565b5b6119cb82611697565b9050602081019050919050565b828183375f83830152505050565b5f6119f86119f3846119a8565b61198e565b905082815260208101848484011115611a1457611a1361192c565b5b611a1f8482856119d8565b509392505050565b5f82601f830112611a3b57611a3a611928565b5b8135611a4b8482602086016119e6565b91505092915050565b5f5f5f5f60808587031215611a6c57611a6b6115b4565b5b5f611a79878288016117cb565b9450506020611a8a878288016117cb565b9350506040611a9b8782880161171e565b925050606085013567ffffffffffffffff811115611abc57611abb6115b8565b5b611ac887828801611a27565b91505092959194509250565b5f5f60408385031215611aea57611ae96115b4565b5b5f611af7858286016117cb565b9250506020611b08858286016117cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611b5657607f821691505b602082108103611b6957611b68611b12565b5b50919050565b5f606082019050611b825f83018661178d565b611b8f602083018561181d565b611b9c604083018461178d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611bdb826116ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c0d57611c0c611ba4565b5b600182019050919050565b5f81905092915050565b5f611c2c8261166f565b611c368185611c18565b9350611c46818560208601611689565b80840191505092915050565b5f611c5d8285611c22565b9150611c698284611c22565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f611c9982611c75565b611ca38185611c7f565b9350611cb3818560208601611689565b611cbc81611697565b840191505092915050565b5f608082019050611cda5f83018761178d565b611ce7602083018661178d565b611cf4604083018561181d565b8181036060830152611d068184611c8f565b905095945050505050565b5f81519050611d1f816115e7565b92915050565b5f60208284031215611d3a57611d396115b4565b5b5f611d4784828501611d11565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f604082019050611d905f83018561178d565b611d9d602083018461181d565b939250505056fea2646970667358221220f842971435d6f2302fd9922431906a6f357b41ea0ad1fa856c74bd4b55a88a6664736f6c634300081e0033", + "nonce": "0x4", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x47b437df14b3e4b520f35caf71ac36504329c5f0bf9f7c9ccc15c7ce48cfa30a", + "transactionType": "CREATE", + "contractName": "MembershipManager", + "contractAddress": "0xd136cbd359adb48fd0ef4721ee7d028ddd916144", + "function": null, + "arguments": [ + "0xBe7AbfF52fa56d8649DA14420B2f654102706447", + "0xA77bFE3E9CaF800f50eAa127F0049861fc316b0E", + "0xb39b7c02372dBBb003c05D6b4ABA2eC68842934D" + ], + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x109f31", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610e65380380610e6583398181016040528101906100319190610196565b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506101e6565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101658261013c565b9050919050565b6101758161015b565b811461017f575f5ffd5b50565b5f815190506101908161016c565b92915050565b5f5f5f606084860312156101ad576101ac610138565b5b5f6101ba86828701610182565b93505060206101cb86828701610182565b92505060406101dc86828701610182565b9150509250925092565b610c72806101f35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a7575f3560e01c80637f39a9391161006f5780637f39a93914610163578063893d20e81461017f5780638da5cb5b1461019d578063985d0b1e146101bb578063c85501bb146101d9578063e243c5fb146101f7576100a7565b806327e235e3146100ab57806329abf11c146100db57806347680d40146100f957806373b2e80e1461011557806378f9529d14610145575b5f5ffd5b6100c560048036038101906100c0919061078e565b610215565b6040516100d291906107d1565b60405180910390f35b6100e361022a565b6040516100f091906107f9565b60405180910390f35b610113600480360381019061010e919061083c565b61024f565b005b61012f600480360381019061012a919061078e565b61037e565b60405161013c9190610894565b60405180910390f35b61014d61039b565b60405161015a91906107d1565b60405180910390f35b61017d600480360381019061017891906108ad565b6105fb565b005b610187610694565b60405161019491906107f9565b60405180910390f35b6101a56106bc565b6040516101b291906107f9565b60405180910390f35b6101c36106e1565b6040516101d09190610933565b60405180910390f35b6101e1610706565b6040516101ee91906107d1565b60405180910390f35b6101ff61070c565b60405161020c919061096c565b60405180910390f35b6005602052805f5260405f205f915090505481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d590610a05565b60405180910390fd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610339929190610a23565b6020604051808303815f875af1158015610355573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103799190610a74565b505050565b6006602052805f5260405f205f915054906101000a900460ff1681565b5f6004545f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016103f891906107f9565b602060405180830381865afa158015610413573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104379190610ab3565b1015610478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046f90610b28565b60405180910390fd5b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990610b90565b60405180910390fd5b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016105b291906107f9565b6020604051808303815f875af11580156105ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f29190610ab3565b90508091505090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461068a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068190610c1e565b60405180910390fd5b8060048190555050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61075d82610734565b9050919050565b61076d81610753565b8114610777575f5ffd5b50565b5f8135905061078881610764565b92915050565b5f602082840312156107a3576107a2610730565b5b5f6107b08482850161077a565b91505092915050565b5f819050919050565b6107cb816107b9565b82525050565b5f6020820190506107e45f8301846107c2565b92915050565b6107f381610753565b82525050565b5f60208201905061080c5f8301846107ea565b92915050565b61081b816107b9565b8114610825575f5ffd5b50565b5f8135905061083681610812565b92915050565b5f5f6040838503121561085257610851610730565b5b5f61085f8582860161077a565b925050602061087085828601610828565b9150509250929050565b5f8115159050919050565b61088e8161087a565b82525050565b5f6020820190506108a75f830184610885565b92915050565b5f602082840312156108c2576108c1610730565b5b5f6108cf84828501610828565b91505092915050565b5f819050919050565b5f6108fb6108f66108f184610734565b6108d8565b610734565b9050919050565b5f61090c826108e1565b9050919050565b5f61091d82610902565b9050919050565b61092d81610913565b82525050565b5f6020820190506109465f830184610924565b92915050565b5f61095682610902565b9050919050565b6109668161094c565b82525050565b5f60208201905061097f5f83018461095d565b92915050565b5f82825260208201905092915050565b7f556e617574686f72697a656420746f2063616c6c2061636365737320746f6b655f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f6109ef602183610985565b91506109fa82610995565b604082019050919050565b5f6020820190508181035f830152610a1c816109e3565b9050919050565b5f604082019050610a365f8301856107ea565b610a4360208301846107c2565b9392505050565b610a538161087a565b8114610a5d575f5ffd5b50565b5f81519050610a6e81610a4a565b92915050565b5f60208284031215610a8957610a88610730565b5b5f610a9684828501610a60565b91505092915050565b5f81519050610aad81610812565b92915050565b5f60208284031215610ac857610ac7610730565b5b5f610ad584828501610a9f565b91505092915050565b7f596f7520646f6e7420686176652061636365737320746f206d696e74000000005f82015250565b5f610b12601c83610985565b9150610b1d82610ade565b602082019050919050565b5f6020820190508181035f830152610b3f81610b06565b9050919050565b7f436c61696d6564204e465420616c7265616479000000000000000000000000005f82015250565b5f610b7a601383610985565b9150610b8582610b46565b602082019050919050565b5f6020820190508181035f830152610ba781610b6e565b9050919050565b7f4d656d626572736869704d616e616765723a3a20556e617574686f72697a65645f8201527f2055736572000000000000000000000000000000000000000000000000000000602082015250565b5f610c08602583610985565b9150610c1382610bae565b604082019050919050565b5f6020820190508181035f830152610c3581610bfc565b905091905056fea26469706673582212208380460e65320a94428ec336c365c26a38b3a854acc486249cdd2e8200c2fa6664736f6c634300081e0033000000000000000000000000be7abff52fa56d8649da14420b2f654102706447000000000000000000000000a77bfe3e9caf800f50eaa127f0049861fc316b0e000000000000000000000000b39b7c02372dbbb003c05d6b4aba2ec68842934d", + "nonce": "0x5", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x17d48d7", + "logs": [ + { + "address": "0xbe7abff52fa56d8649da14420b2f654102706447", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b39b7c02372dbbb003c05d6b4aba2ec68842934d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "blockTimestamp": "0x68960b5c", + "transactionHash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionIndex": "0x91", + "logIndex": "0x1c4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000080000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000002020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000002000000000000000000000000000000000000000000000200000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionIndex": "0x91", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0x105ae2", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xbe7abff52fa56d8649da14420b2f654102706447" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1981afa", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xea6337064c814d597c1092fe08912da0747bd1486f3097c69474a77a037186c9", + "transactionIndex": "0x92", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0x1ad223", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xa77bfe3e9caf800f50eaa127f0049861fc316b0e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1acdeb1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x47b437df14b3e4b520f35caf71ac36504329c5f0bf9f7c9ccc15c7ce48cfa30a", + "transactionIndex": "0x96", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0xcc93a", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xd136cbd359adb48fd0ef4721ee7d028ddd916144" + } + ], + "libraries": [], + "pending": [], + "returns": { + "2": { + "internal_type": "contract MembershipManager", + "value": "0xD136CbD359aDB48Fd0eF4721EE7D028ddd916144" + }, + "0": { + "internal_type": "contract AccessToken", + "value": "0xBe7AbfF52fa56d8649DA14420B2f654102706447" + }, + "1": { + "internal_type": "contract MembershipNFT", + "value": "0xA77bFE3E9CaF800f50eAa127F0049861fc316b0E" + } + }, + "timestamp": 1754663773, + "chain": 11155111, + "commit": "d9d0015" +} \ No newline at end of file diff --git a/broadcast/MembershipManager.s.sol/11155111/run-latest.json b/broadcast/MembershipManager.s.sol/11155111/run-latest.json new file mode 100644 index 0000000..6025f35 --- /dev/null +++ b/broadcast/MembershipManager.s.sol/11155111/run-latest.json @@ -0,0 +1,148 @@ +{ + "transactions": [ + { + "hash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionType": "CREATE", + "contractName": "AccessToken", + "contractAddress": "0xbe7abff52fa56d8649da14420b2f654102706447", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x1542f2", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040518060400160405280600c81526020017f41636365737320546f6b656e00000000000000000000000000000000000000008152506040518060400160405280600381526020017f4143540000000000000000000000000000000000000000000000000000000000815250816003908161008b91906105d1565b50806004908161009b91906105d1565b5050503360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506100f133620f42406100f660201b60201c565b6107b5565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610166575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161015d91906106df565b60405180910390fd5b6101775f838361017b60201b60201c565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101cb578060025f8282546101bf9190610725565b92505081905550610299565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610254578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161024b93929190610767565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102e0578060025f828254039250508190555061032a565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610387919061079c565b60405180910390a3505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061040f57607f821691505b602082108103610422576104216103cb565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026104847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610449565b61048e8683610449565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6104d26104cd6104c8846104a6565b6104af565b6104a6565b9050919050565b5f819050919050565b6104eb836104b8565b6104ff6104f7826104d9565b848454610455565b825550505050565b5f5f905090565b610516610507565b6105218184846104e2565b505050565b5b81811015610544576105395f8261050e565b600181019050610527565b5050565b601f8211156105895761055a81610428565b6105638461043a565b81016020851015610572578190505b61058661057e8561043a565b830182610526565b50505b505050565b5f82821c905092915050565b5f6105a95f198460080261058e565b1980831691505092915050565b5f6105c1838361059a565b9150826002028217905092915050565b6105da82610394565b67ffffffffffffffff8111156105f3576105f261039e565b5b6105fd82546103f8565b610608828285610548565b5f60209050601f831160018114610639575f8415610627578287015190505b61063185826105b6565b865550610698565b601f19841661064786610428565b5f5b8281101561066e57848901518255600182019150602085019450602081019050610649565b8683101561068b5784890151610687601f89168261059a565b8355505b6001600288020188555050505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6106c9826106a0565b9050919050565b6106d9816106bf565b82525050565b5f6020820190506106f25f8301846106d0565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61072f826104a6565b915061073a836104a6565b9250828201905080821115610752576107516106f8565b5b92915050565b610761816104a6565b82525050565b5f60608201905061077a5f8301866106d0565b6107876020830185610758565b6107946040830184610758565b949350505050565b5f6020820190506107af5f830184610758565b92915050565b610fde806107c25f395ff3fe608060405234801561000f575f5ffd5b50600436106100a7575f3560e01c806340c10f191161006f57806340c10f191461016557806370a0823114610181578063893d20e8146101b157806395d89b41146101cf578063a9059cbb146101ed578063dd62ed3e1461021d576100a7565b806306fdde03146100ab578063095ea7b3146100c957806318160ddd146100f957806323b872dd14610117578063313ce56714610147575b5f5ffd5b6100b361024d565b6040516100c09190610bef565b60405180910390f35b6100e360048036038101906100de9190610ca0565b6102dd565b6040516100f09190610cf8565b60405180910390f35b6101016102ff565b60405161010e9190610d20565b60405180910390f35b610131600480360381019061012c9190610d39565b610308565b60405161013e9190610cf8565b60405180910390f35b61014f610336565b60405161015c9190610da4565b60405180910390f35b61017f600480360381019061017a9190610ca0565b61033e565b005b61019b60048036038101906101969190610dbd565b6103db565b6040516101a89190610d20565b60405180910390f35b6101b9610420565b6040516101c69190610df7565b60405180910390f35b6101d7610448565b6040516101e49190610bef565b60405180910390f35b61020760048036038101906102029190610ca0565b6104d8565b6040516102149190610cf8565b60405180910390f35b61023760048036038101906102329190610e10565b6104fa565b6040516102449190610d20565b60405180910390f35b60606003805461025c90610e7b565b80601f016020809104026020016040519081016040528092919081815260200182805461028890610e7b565b80156102d35780601f106102aa576101008083540402835291602001916102d3565b820191905f5260205f20905b8154815290600101906020018083116102b657829003601f168201915b5050505050905090565b5f5f6102e761057c565b90506102f4818585610583565b600191505092915050565b5f600254905090565b5f5f61031261057c565b905061031f858285610595565b61032a858585610628565b60019150509392505050565b5f6012905090565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103c490610ef5565b60405180910390fd5b6103d78282610718565b5050565b5f5f5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461045790610e7b565b80601f016020809104026020016040519081016040528092919081815260200182805461048390610e7b565b80156104ce5780601f106104a5576101008083540402835291602001916104ce565b820191905f5260205f20905b8154815290600101906020018083116104b157829003601f168201915b5050505050905090565b5f5f6104e261057c565b90506104ef818585610628565b600191505092915050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b5f33905090565b6105908383836001610797565b505050565b5f6105a084846104fa565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106225781811015610613578281836040517ffb8f41b200000000000000000000000000000000000000000000000000000000815260040161060a93929190610f13565b60405180910390fd5b61062184848484035f610797565b5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610698575f6040517f96c6fd1e00000000000000000000000000000000000000000000000000000000815260040161068f9190610df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610708575f6040517fec442f050000000000000000000000000000000000000000000000000000000081526004016106ff9190610df7565b60405180910390fd5b610713838383610966565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610788575f6040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161077f9190610df7565b60405180910390fd5b6107935f8383610966565b5050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610807575f6040517fe602df050000000000000000000000000000000000000000000000000000000081526004016107fe9190610df7565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610877575f6040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161086e9190610df7565b60405180910390fd5b8160015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015610960578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109579190610d20565b60405180910390a35b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109b6578060025f8282546109aa9190610f75565b92505081905550610a84565b5f5f5f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905081811015610a3f578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610a3693929190610f13565b60405180910390fd5b8181035f5f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610acb578060025f8282540392505081905550610b15565b805f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610b729190610d20565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f610bc182610b7f565b610bcb8185610b89565b9350610bdb818560208601610b99565b610be481610ba7565b840191505092915050565b5f6020820190508181035f830152610c078184610bb7565b905092915050565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610c3c82610c13565b9050919050565b610c4c81610c32565b8114610c56575f5ffd5b50565b5f81359050610c6781610c43565b92915050565b5f819050919050565b610c7f81610c6d565b8114610c89575f5ffd5b50565b5f81359050610c9a81610c76565b92915050565b5f5f60408385031215610cb657610cb5610c0f565b5b5f610cc385828601610c59565b9250506020610cd485828601610c8c565b9150509250929050565b5f8115159050919050565b610cf281610cde565b82525050565b5f602082019050610d0b5f830184610ce9565b92915050565b610d1a81610c6d565b82525050565b5f602082019050610d335f830184610d11565b92915050565b5f5f5f60608486031215610d5057610d4f610c0f565b5b5f610d5d86828701610c59565b9350506020610d6e86828701610c59565b9250506040610d7f86828701610c8c565b9150509250925092565b5f60ff82169050919050565b610d9e81610d89565b82525050565b5f602082019050610db75f830184610d95565b92915050565b5f60208284031215610dd257610dd1610c0f565b5b5f610ddf84828501610c59565b91505092915050565b610df181610c32565b82525050565b5f602082019050610e0a5f830184610de8565b92915050565b5f5f60408385031215610e2657610e25610c0f565b5b5f610e3385828601610c59565b9250506020610e4485828601610c59565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610e9257607f821691505b602082108103610ea557610ea4610e4e565b5b50919050565b7f416363657373546f6b656e3a3a20556e617574686f72697a65642055736572005f82015250565b5f610edf601f83610b89565b9150610eea82610eab565b602082019050919050565b5f6020820190508181035f830152610f0c81610ed3565b9050919050565b5f606082019050610f265f830186610de8565b610f336020830185610d11565b610f406040830184610d11565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610f7f82610c6d565b9150610f8a83610c6d565b9250828201905080821115610fa257610fa1610f48565b5b9291505056fea2646970667358221220a2cda4a9d2a03fd7c7642ebf3a38ef32942c2cb64fbca47423753eab3a7497c664736f6c634300081e0033", + "nonce": "0x3", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0xea6337064c814d597c1092fe08912da0747bd1486f3097c69474a77a037186c9", + "transactionType": "CREATE", + "contractName": "MembershipNFT", + "contractAddress": "0xa77bfe3e9caf800f50eaa127f0049861fc316b0e", + "function": null, + "arguments": null, + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x22ddfa", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b506040518060400160405280600e81526020017f4d656d62657273686970204e46540000000000000000000000000000000000008152506040518060400160405280600481526020017f4d4e465400000000000000000000000000000000000000000000000000000000815250815f908161008a91906102df565b50806001908161009a91906102df565b5050506103ae565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061011d57607f821691505b6020821081036101305761012f6100d9565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026101927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610157565b61019c8683610157565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6101e06101db6101d6846101b4565b6101bd565b6101b4565b9050919050565b5f819050919050565b6101f9836101c6565b61020d610205826101e7565b848454610163565b825550505050565b5f5f905090565b610224610215565b61022f8184846101f0565b505050565b5b81811015610252576102475f8261021c565b600181019050610235565b5050565b601f8211156102975761026881610136565b61027184610148565b81016020851015610280578190505b61029461028c85610148565b830182610234565b50505b505050565b5f82821c905092915050565b5f6102b75f198460080261029c565b1980831691505092915050565b5f6102cf83836102a8565b9150826002028217905092915050565b6102e8826100a2565b67ffffffffffffffff811115610301576103006100ac565b5b61030b8254610106565b610316828285610256565b5f60209050601f831160018114610347575f8415610335578287015190505b61033f85826102c4565b8655506103a6565b601f19841661035586610136565b5f5b8281101561037c57848901518255600182019150602085019450602081019050610357565b868310156103995784890151610395601f8916826102a8565b8355505b6001600288020188555050505b505050505050565b611dda806103bb5f395ff3fe608060405234801561000f575f5ffd5b50600436106100f3575f3560e01c80636352211e11610095578063a22cb46511610064578063a22cb46514610295578063b88d4fde146102b1578063c87b56dd146102cd578063e985e9c5146102fd576100f3565b80636352211e146101e75780636a6278421461021757806370a082311461024757806395d89b4114610277576100f3565b8063095ea7b3116100d1578063095ea7b31461017557806317d70f7c1461019157806323b872dd146101af57806342842e0e146101cb576100f3565b806301ffc9a7146100f757806306fdde0314610127578063081812fc14610145575b5f5ffd5b610111600480360381019061010c9190611611565b61032d565b60405161011e9190611656565b60405180910390f35b61012f61040e565b60405161013c91906116df565b60405180910390f35b61015f600480360381019061015a9190611732565b61049d565b60405161016c919061179c565b60405180910390f35b61018f600480360381019061018a91906117df565b6104b8565b005b6101996104ce565b6040516101a6919061182c565b60405180910390f35b6101c960048036038101906101c49190611845565b6104d4565b005b6101e560048036038101906101e09190611845565b6105d3565b005b61020160048036038101906101fc9190611732565b6105f2565b60405161020e919061179c565b60405180910390f35b610231600480360381019061022c9190611895565b610603565b60405161023e919061182c565b60405180910390f35b610261600480360381019061025c9190611895565b610636565b60405161026e919061182c565b60405180910390f35b61027f6106ec565b60405161028c91906116df565b60405180910390f35b6102af60048036038101906102aa91906118ea565b61077c565b005b6102cb60048036038101906102c69190611a54565b610792565b005b6102e760048036038101906102e29190611732565b6107b7565b6040516102f491906116df565b60405180910390f35b61031760048036038101906103129190611ad4565b61081d565b6040516103249190611656565b60405180910390f35b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104075750610406826108ab565b5b9050919050565b60605f805461041c90611b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461044890611b3f565b80156104935780601f1061046a57610100808354040283529160200191610493565b820191905f5260205f20905b81548152906001019060200180831161047657829003601f168201915b5050505050905090565b5f6104a782610914565b506104b18261099a565b9050919050565b6104ca82826104c56109d3565b6109da565b5050565b60065481565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610544575f6040517f64a0ae9200000000000000000000000000000000000000000000000000000000815260040161053b919061179c565b60405180910390fd5b5f61055783836105526109d3565b6109ec565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146105cd578382826040517f64283d7b0000000000000000000000000000000000000000000000000000000081526004016105c493929190611b6f565b60405180910390fd5b50505050565b6105ed83838360405180602001604052805f815250610792565b505050565b5f6105fc82610914565b9050919050565b5f60065f81548092919061061690611bd1565b91905055505f600654905061062b8382610bf7565b600654915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036106a7575f6040517f89c62b6400000000000000000000000000000000000000000000000000000000815260040161069e919061179c565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600180546106fb90611b3f565b80601f016020809104026020016040519081016040528092919081815260200182805461072790611b3f565b80156107725780601f1061074957610100808354040283529160200191610772565b820191905f5260205f20905b81548152906001019060200180831161075557829003601f168201915b5050505050905090565b61078e6107876109d3565b8383610cea565b5050565b61079d8484846104d4565b6107b16107a86109d3565b85858585610e53565b50505050565b60606107c282610914565b505f6107cc610fff565b90505f8151116107ea5760405180602001604052805f815250610815565b806107f484611015565b604051602001610805929190611c52565b6040516020818303038152906040525b915050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f5f61091f836110df565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361099157826040517f7e273289000000000000000000000000000000000000000000000000000000008152600401610988919061182c565b60405180910390fd5b80915050919050565b5f60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f33905090565b6109e78383836001611118565b505050565b5f5f6109f7846110df565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610a3857610a378184866112d7565b5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ac357610a775f855f5f611118565b600160035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055505b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614610b4257600160035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055505b8460025f8681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4809150509392505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c67575f6040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610c5e919061179c565b60405180910390fd5b5f610c7383835f6109ec565b90505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ce5575f6040517f73c6ac6e000000000000000000000000000000000000000000000000000000008152600401610cdc919061179c565b60405180910390fd5b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d5a57816040517f5b08ba18000000000000000000000000000000000000000000000000000000008152600401610d51919061179c565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e469190611656565b60405180910390a3505050565b5f8373ffffffffffffffffffffffffffffffffffffffff163b1115610ff8578273ffffffffffffffffffffffffffffffffffffffff1663150b7a02868685856040518563ffffffff1660e01b8152600401610eb19493929190611cc7565b6020604051808303815f875af1925050508015610eec57506040513d601f19601f82011682018060405250810190610ee99190611d25565b60015b610f6d573d805f8114610f1a576040519150601f19603f3d011682016040523d82523d5f602084013e610f1f565b606091505b505f815103610f6557836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610f5c919061179c565b60405180910390fd5b805160208201fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614610ff657836040517f64a0ae92000000000000000000000000000000000000000000000000000000008152600401610fed919061179c565b60405180910390fd5b505b5050505050565b606060405180602001604052805f815250905090565b60605f60016110238461139a565b0190505f8167ffffffffffffffff81111561104157611040611930565b5b6040519080825280601f01601f1916602001820160405280156110735781602001600182028036833780820191505090505b5090505f82602083010190505b6001156110d4578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816110c9576110c8611d50565b5b0494505f8503611080575b819350505050919050565b5f60025f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b808061115057505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15611282575f61115f84610914565b90505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156111c957508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b80156111dc57506111da818461081d565b155b1561121e57826040517fa9fbf51f000000000000000000000000000000000000000000000000000000008152600401611215919061179c565b60405180910390fd5b811561128057838573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b8360045f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050565b6112e28383836114eb565b611395575f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361135657806040517f7e27328900000000000000000000000000000000000000000000000000000000815260040161134d919061182c565b60405180910390fd5b81816040517f177e802f00000000000000000000000000000000000000000000000000000000815260040161138c929190611d7d565b60405180910390fd5b505050565b5f5f5f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106113f6577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816113ec576113eb611d50565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310611433576d04ee2d6d415b85acef8100000000838161142957611428611d50565b5b0492506020810190505b662386f26fc10000831061146257662386f26fc10000838161145857611457611d50565b5b0492506010810190505b6305f5e100831061148b576305f5e100838161148157611480611d50565b5b0492506008810190505b61271083106114b05761271083816114a6576114a5611d50565b5b0492506004810190505b606483106114d357606483816114c9576114c8611d50565b5b0492506002810190505b600a83106114e2576001810190505b80915050919050565b5f5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156115a257508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115635750611562848461081d565b5b806115a157508273ffffffffffffffffffffffffffffffffffffffff166115898361099a565b73ffffffffffffffffffffffffffffffffffffffff16145b5b90509392505050565b5f604051905090565b5f5ffd5b5f5ffd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6115f0816115bc565b81146115fa575f5ffd5b50565b5f8135905061160b816115e7565b92915050565b5f60208284031215611626576116256115b4565b5b5f611633848285016115fd565b91505092915050565b5f8115159050919050565b6116508161163c565b82525050565b5f6020820190506116695f830184611647565b92915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6116b18261166f565b6116bb8185611679565b93506116cb818560208601611689565b6116d481611697565b840191505092915050565b5f6020820190508181035f8301526116f781846116a7565b905092915050565b5f819050919050565b611711816116ff565b811461171b575f5ffd5b50565b5f8135905061172c81611708565b92915050565b5f60208284031215611747576117466115b4565b5b5f6117548482850161171e565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6117868261175d565b9050919050565b6117968161177c565b82525050565b5f6020820190506117af5f83018461178d565b92915050565b6117be8161177c565b81146117c8575f5ffd5b50565b5f813590506117d9816117b5565b92915050565b5f5f604083850312156117f5576117f46115b4565b5b5f611802858286016117cb565b92505060206118138582860161171e565b9150509250929050565b611826816116ff565b82525050565b5f60208201905061183f5f83018461181d565b92915050565b5f5f5f6060848603121561185c5761185b6115b4565b5b5f611869868287016117cb565b935050602061187a868287016117cb565b925050604061188b8682870161171e565b9150509250925092565b5f602082840312156118aa576118a96115b4565b5b5f6118b7848285016117cb565b91505092915050565b6118c98161163c565b81146118d3575f5ffd5b50565b5f813590506118e4816118c0565b92915050565b5f5f60408385031215611900576118ff6115b4565b5b5f61190d858286016117cb565b925050602061191e858286016118d6565b9150509250929050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61196682611697565b810181811067ffffffffffffffff8211171561198557611984611930565b5b80604052505050565b5f6119976115ab565b90506119a3828261195d565b919050565b5f67ffffffffffffffff8211156119c2576119c1611930565b5b6119cb82611697565b9050602081019050919050565b828183375f83830152505050565b5f6119f86119f3846119a8565b61198e565b905082815260208101848484011115611a1457611a1361192c565b5b611a1f8482856119d8565b509392505050565b5f82601f830112611a3b57611a3a611928565b5b8135611a4b8482602086016119e6565b91505092915050565b5f5f5f5f60808587031215611a6c57611a6b6115b4565b5b5f611a79878288016117cb565b9450506020611a8a878288016117cb565b9350506040611a9b8782880161171e565b925050606085013567ffffffffffffffff811115611abc57611abb6115b8565b5b611ac887828801611a27565b91505092959194509250565b5f5f60408385031215611aea57611ae96115b4565b5b5f611af7858286016117cb565b9250506020611b08858286016117cb565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611b5657607f821691505b602082108103611b6957611b68611b12565b5b50919050565b5f606082019050611b825f83018661178d565b611b8f602083018561181d565b611b9c604083018461178d565b949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611bdb826116ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611c0d57611c0c611ba4565b5b600182019050919050565b5f81905092915050565b5f611c2c8261166f565b611c368185611c18565b9350611c46818560208601611689565b80840191505092915050565b5f611c5d8285611c22565b9150611c698284611c22565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f611c9982611c75565b611ca38185611c7f565b9350611cb3818560208601611689565b611cbc81611697565b840191505092915050565b5f608082019050611cda5f83018761178d565b611ce7602083018661178d565b611cf4604083018561181d565b8181036060830152611d068184611c8f565b905095945050505050565b5f81519050611d1f816115e7565b92915050565b5f60208284031215611d3a57611d396115b4565b5b5f611d4784828501611d11565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f604082019050611d905f83018561178d565b611d9d602083018461181d565b939250505056fea2646970667358221220f842971435d6f2302fd9922431906a6f357b41ea0ad1fa856c74bd4b55a88a6664736f6c634300081e0033", + "nonce": "0x4", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + }, + { + "hash": "0x47b437df14b3e4b520f35caf71ac36504329c5f0bf9f7c9ccc15c7ce48cfa30a", + "transactionType": "CREATE", + "contractName": "MembershipManager", + "contractAddress": "0xd136cbd359adb48fd0ef4721ee7d028ddd916144", + "function": null, + "arguments": [ + "0xBe7AbfF52fa56d8649DA14420B2f654102706447", + "0xA77bFE3E9CaF800f50eAa127F0049861fc316b0E", + "0xb39b7c02372dBBb003c05D6b4ABA2eC68842934D" + ], + "transaction": { + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "gas": "0x109f31", + "value": "0x0", + "input": "0x608060405234801561000f575f5ffd5b50604051610e65380380610e6583398181016040528101906100319190610196565b825f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503360035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050506101e6565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101658261013c565b9050919050565b6101758161015b565b811461017f575f5ffd5b50565b5f815190506101908161016c565b92915050565b5f5f5f606084860312156101ad576101ac610138565b5b5f6101ba86828701610182565b93505060206101cb86828701610182565b92505060406101dc86828701610182565b9150509250925092565b610c72806101f35f395ff3fe608060405234801561000f575f5ffd5b50600436106100a7575f3560e01c80637f39a9391161006f5780637f39a93914610163578063893d20e81461017f5780638da5cb5b1461019d578063985d0b1e146101bb578063c85501bb146101d9578063e243c5fb146101f7576100a7565b806327e235e3146100ab57806329abf11c146100db57806347680d40146100f957806373b2e80e1461011557806378f9529d14610145575b5f5ffd5b6100c560048036038101906100c0919061078e565b610215565b6040516100d291906107d1565b60405180910390f35b6100e361022a565b6040516100f091906107f9565b60405180910390f35b610113600480360381019061010e919061083c565b61024f565b005b61012f600480360381019061012a919061078e565b61037e565b60405161013c9190610894565b60405180910390f35b61014d61039b565b60405161015a91906107d1565b60405180910390f35b61017d600480360381019061017891906108ad565b6105fb565b005b610187610694565b60405161019491906107f9565b60405180910390f35b6101a56106bc565b6040516101b291906107f9565b60405180910390f35b6101c36106e1565b6040516101d09190610933565b60405180910390f35b6101e1610706565b6040516101ee91906107d1565b60405180910390f35b6101ff61070c565b60405161020c919061096c565b60405180910390f35b6005602052805f5260405f205f915090505481565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146102de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d590610a05565b60405180910390fd5b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401610339929190610a23565b6020604051808303815f875af1158015610355573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103799190610a74565b505050565b6006602052805f5260405f205f915054906101000a900460ff1681565b5f6004545f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b81526004016103f891906107f9565b602060405180830381865afa158015610413573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104379190610ab3565b1015610478576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161046f90610b28565b60405180910390fd5b60065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615610502576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104f990610b90565b60405180910390fd5b600160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a627842336040518263ffffffff1660e01b81526004016105b291906107f9565b6020604051808303815f875af11580156105ce573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105f29190610ab3565b90508091505090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461068a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068190610c1e565b60405180910390fd5b8060048190555050565b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f61075d82610734565b9050919050565b61076d81610753565b8114610777575f5ffd5b50565b5f8135905061078881610764565b92915050565b5f602082840312156107a3576107a2610730565b5b5f6107b08482850161077a565b91505092915050565b5f819050919050565b6107cb816107b9565b82525050565b5f6020820190506107e45f8301846107c2565b92915050565b6107f381610753565b82525050565b5f60208201905061080c5f8301846107ea565b92915050565b61081b816107b9565b8114610825575f5ffd5b50565b5f8135905061083681610812565b92915050565b5f5f6040838503121561085257610851610730565b5b5f61085f8582860161077a565b925050602061087085828601610828565b9150509250929050565b5f8115159050919050565b61088e8161087a565b82525050565b5f6020820190506108a75f830184610885565b92915050565b5f602082840312156108c2576108c1610730565b5b5f6108cf84828501610828565b91505092915050565b5f819050919050565b5f6108fb6108f66108f184610734565b6108d8565b610734565b9050919050565b5f61090c826108e1565b9050919050565b5f61091d82610902565b9050919050565b61092d81610913565b82525050565b5f6020820190506109465f830184610924565b92915050565b5f61095682610902565b9050919050565b6109668161094c565b82525050565b5f60208201905061097f5f83018461095d565b92915050565b5f82825260208201905092915050565b7f556e617574686f72697a656420746f2063616c6c2061636365737320746f6b655f8201527f6e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f6109ef602183610985565b91506109fa82610995565b604082019050919050565b5f6020820190508181035f830152610a1c816109e3565b9050919050565b5f604082019050610a365f8301856107ea565b610a4360208301846107c2565b9392505050565b610a538161087a565b8114610a5d575f5ffd5b50565b5f81519050610a6e81610a4a565b92915050565b5f60208284031215610a8957610a88610730565b5b5f610a9684828501610a60565b91505092915050565b5f81519050610aad81610812565b92915050565b5f60208284031215610ac857610ac7610730565b5b5f610ad584828501610a9f565b91505092915050565b7f596f7520646f6e7420686176652061636365737320746f206d696e74000000005f82015250565b5f610b12601c83610985565b9150610b1d82610ade565b602082019050919050565b5f6020820190508181035f830152610b3f81610b06565b9050919050565b7f436c61696d6564204e465420616c7265616479000000000000000000000000005f82015250565b5f610b7a601383610985565b9150610b8582610b46565b602082019050919050565b5f6020820190508181035f830152610ba781610b6e565b9050919050565b7f4d656d626572736869704d616e616765723a3a20556e617574686f72697a65645f8201527f2055736572000000000000000000000000000000000000000000000000000000602082015250565b5f610c08602583610985565b9150610c1382610bae565b604082019050919050565b5f6020820190508181035f830152610c3581610bfc565b905091905056fea26469706673582212208380460e65320a94428ec336c365c26a38b3a854acc486249cdd2e8200c2fa6664736f6c634300081e0033000000000000000000000000be7abff52fa56d8649da14420b2f654102706447000000000000000000000000a77bfe3e9caf800f50eaa127f0049861fc316b0e000000000000000000000000b39b7c02372dbbb003c05d6b4aba2ec68842934d", + "nonce": "0x5", + "chainId": "0xaa36a7" + }, + "additionalContracts": [], + "isFixedGasLimit": false + } + ], + "receipts": [ + { + "status": "0x1", + "cumulativeGasUsed": "0x17d48d7", + "logs": [ + { + "address": "0xbe7abff52fa56d8649da14420b2f654102706447", + "topics": [ + "0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000b39b7c02372dbbb003c05d6b4aba2ec68842934d" + ], + "data": "0x00000000000000000000000000000000000000000000000000000000000f4240", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "blockTimestamp": "0x68960b5c", + "transactionHash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionIndex": "0x91", + "logIndex": "0x1c4", + "removed": false + } + ], + "logsBloom": "0x00000000000000000000000000000000000080000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000008000000000000000000000000000000000000000000000002020000000000000000000800000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000002000000000000000000000000000000000000000000000200000020000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x1303b56475973453136bb3cdcca7886f9ab6ace6438e9102162414808fb67479", + "transactionIndex": "0x91", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0x105ae2", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xbe7abff52fa56d8649da14420b2f654102706447" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1981afa", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0xea6337064c814d597c1092fe08912da0747bd1486f3097c69474a77a037186c9", + "transactionIndex": "0x92", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0x1ad223", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xa77bfe3e9caf800f50eaa127f0049861fc316b0e" + }, + { + "status": "0x1", + "cumulativeGasUsed": "0x1acdeb1", + "logs": [], + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "type": "0x2", + "transactionHash": "0x47b437df14b3e4b520f35caf71ac36504329c5f0bf9f7c9ccc15c7ce48cfa30a", + "transactionIndex": "0x96", + "blockHash": "0x5daffdfb5d5d30984d47a4ffcebd90e8362e44975d6bd4bbbabdda906fe6060b", + "blockNumber": "0x886ac5", + "gasUsed": "0xcc93a", + "effectiveGasPrice": "0xeca1e3", + "from": "0xb39b7c02372dbbb003c05d6b4aba2ec68842934d", + "to": null, + "contractAddress": "0xd136cbd359adb48fd0ef4721ee7d028ddd916144" + } + ], + "libraries": [], + "pending": [], + "returns": { + "2": { + "internal_type": "contract MembershipManager", + "value": "0xD136CbD359aDB48Fd0eF4721EE7D028ddd916144" + }, + "0": { + "internal_type": "contract AccessToken", + "value": "0xBe7AbfF52fa56d8649DA14420B2f654102706447" + }, + "1": { + "internal_type": "contract MembershipNFT", + "value": "0xA77bFE3E9CaF800f50eAa127F0049861fc316b0E" + } + }, + "timestamp": 1754663773, + "chain": 11155111, + "commit": "d9d0015" +} \ No newline at end of file diff --git a/lib/openzeppelin-contracts b/lib/openzeppelin-contracts new file mode 160000 index 0000000..c64a1ed --- /dev/null +++ b/lib/openzeppelin-contracts @@ -0,0 +1 @@ +Subproject commit c64a1edb67b6e3f4a15cca8909c9482ad33a02b0 diff --git a/script/MembershipManager.s.sol b/script/MembershipManager.s.sol new file mode 100644 index 0000000..3df10cd --- /dev/null +++ b/script/MembershipManager.s.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.15; + +import {Script} from "forge-std/Script.sol"; +import {AccessToken} from "../src/AccessToken.sol"; +import {MembershipNFT} from "../src/MembershipNFT.sol"; +import {MembershipManager} from "../src/MembershipManager.sol"; + +contract deployContracts is Script { + function run() external returns(AccessToken, MembershipNFT, MembershipManager) { + vm.startBroadcast(); + AccessToken accessToken = new AccessToken(); + MembershipNFT membershipNFT = new MembershipNFT(); + MembershipManager membershipManager = new MembershipManager(address(accessToken), address(membershipNFT), accessToken.getOwner()); + vm.stopBroadcast(); + + return (accessToken, membershipNFT, membershipManager); + } +} \ No newline at end of file diff --git a/src/AccessToken.sol b/src/AccessToken.sol new file mode 100644 index 0000000..77c41c6 --- /dev/null +++ b/src/AccessToken.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.15; + +import {ERC20} from "lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol"; +contract AccessToken is ERC20{ + + address private owner; + + modifier onlyOwner { + require(msg.sender == owner, "AccessToken:: Unauthorized User"); + _; + } + + constructor() ERC20("Access Token", "ACT"){ + owner = msg.sender; + _mint(msg.sender, 1000000); + } + + function mint(address to, uint256 _amount) onlyOwner external { + _mint(to, _amount); + } + + function getOwner() external view returns(address) { + return owner; + } +} \ No newline at end of file diff --git a/src/ERC20.sol b/src/ERC20.sol index ddd66b4..c000b35 100644 --- a/src/ERC20.sol +++ b/src/ERC20.sol @@ -1,138 +1,138 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.0; - -interface IERC20 { - function totalSupply() external view returns (uint256); - function balanceOf(address account) external view returns (uint256); - function transfer( - address recipient, - uint256 amount - ) external returns (bool); - function allowance( - address owner, - address spender - ) external view returns (uint256); - function approve(address spender, uint256 amount) external returns (bool); - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool); -} - -contract ERC20 is IERC20 { - event Transfer(address indexed from, address indexed to, uint256 value); - event Approval( - address indexed owner, - address indexed spender, - uint256 value - ); - - struct X { - uint256 x; - uint256 y; - } - - // Experimental - event DummyEvent(X indexed structA, X structB); - - uint256 public totalSupply; - - mapping(address account => uint256 balance) public balanceOf; - mapping(address owner => mapping(address spender => uint256 amount)) - public allowance; - - string public name; - string public symbol; - uint8 public decimals; - address public adminAddress; - - error InsufficientFundsError(); - error UnauthorizedError(); - - constructor( - string memory _name, - string memory _symbol, - uint8 _decimals, - address _adminAddress - ) { - name = _name; - symbol = _symbol; - decimals = _decimals; - adminAddress = _adminAddress; - } - - function transfer( - address recipient, - uint256 amount - ) external returns (bool) { - // Verify that caller is not from address(0) - require(msg.sender != address(0), "Invalid caller"); - - // Verify that caller has enough tokens to send - // require(balanceOf[msg.sender] >= amount, "Insufficient funds"); - if (balanceOf[msg.sender] < amount) { - revert InsufficientFundsError(); - } - - balanceOf[msg.sender] = balanceOf[msg.sender] - amount; - balanceOf[recipient] += amount; - - emit Transfer(msg.sender, recipient, amount); - return true; - } - - // Experimental - function emitDummyEvent() public { - X memory x; - x.x = 1; - x.y = 2; - - emit DummyEvent(x, x); - } - - function approve(address spender, uint256 amount) external returns (bool) { - allowance[msg.sender][spender] = amount; - emit Approval(msg.sender, spender, amount); - - return true; - } - - function transferFrom( - address from, - address to, - uint256 amount - ) external returns (bool) { - allowance[from][msg.sender] -= amount; - balanceOf[from] -= amount; - balanceOf[to] += amount; - - emit Transfer(from, to, amount); - return true; - } - - function _mint(address to, uint256 amount) internal { - balanceOf[to] += amount; - totalSupply += amount; - - emit Transfer(address(0), to, amount); - } - - function _burn(address from, uint256 amount) internal { - balanceOf[from] -= amount; - totalSupply -= amount; - - emit Transfer(from, address(0), amount); - } - - function mint(address to, uint256 amount) external { - require(msg.sender == adminAddress, "Unauthorized"); - _mint(to, amount); - } - - function burn(address from, uint256 amount) external { - require(balanceOf[from] >= amount, "Insufficient funds"); - _burn(from, amount); - } -} +// // SPDX-License-Identifier: MIT + +// pragma solidity ^0.8.0; + +// interface IERC20 { +// function totalSupply() external view returns (uint256); +// function balanceOf(address account) external view returns (uint256); +// function transfer( +// address recipient, +// uint256 amount +// ) external returns (bool); +// function allowance( +// address owner, +// address spender +// ) external view returns (uint256); +// function approve(address spender, uint256 amount) external returns (bool); +// function transferFrom( +// address from, +// address to, +// uint256 amount +// ) external returns (bool); +// } + +// contract ERC20 is IERC20 { +// event Transfer(address indexed from, address indexed to, uint256 value); +// event Approval( +// address indexed owner, +// address indexed spender, +// uint256 value +// ); + +// struct X { +// uint256 x; +// uint256 y; +// } + +// // Experimental +// event DummyEvent(X indexed structA, X structB); + +// uint256 public totalSupply; + +// mapping(address account => uint256 balance) public balanceOf; +// mapping(address owner => mapping(address spender => uint256 amount)) +// public allowance; + +// string public name; +// string public symbol; +// uint8 public decimals; +// address public adminAddress; + +// error InsufficientFundsError(); +// error UnauthorizedError(); + +// constructor( +// string memory _name, +// string memory _symbol, +// uint8 _decimals, +// address _adminAddress +// ) { +// name = _name; +// symbol = _symbol; +// decimals = _decimals; +// adminAddress = _adminAddress; +// } + +// function transfer( +// address recipient, +// uint256 amount +// ) external returns (bool) { +// // Verify that caller is not from address(0) +// require(msg.sender != address(0), "Invalid caller"); + +// // Verify that caller has enough tokens to send +// // require(balanceOf[msg.sender] >= amount, "Insufficient funds"); +// if (balanceOf[msg.sender] < amount) { +// revert InsufficientFundsError(); +// } + +// balanceOf[msg.sender] = balanceOf[msg.sender] - amount; +// balanceOf[recipient] += amount; + +// emit Transfer(msg.sender, recipient, amount); +// return true; +// } + +// // Experimental +// function emitDummyEvent() public { +// X memory x; +// x.x = 1; +// x.y = 2; + +// emit DummyEvent(x, x); +// } + +// function approve(address spender, uint256 amount) external returns (bool) { +// allowance[msg.sender][spender] = amount; +// emit Approval(msg.sender, spender, amount); + +// return true; +// } + +// function transferFrom( +// address from, +// address to, +// uint256 amount +// ) external returns (bool) { +// allowance[from][msg.sender] -= amount; +// balanceOf[from] -= amount; +// balanceOf[to] += amount; + +// emit Transfer(from, to, amount); +// return true; +// } + +// function _mint(address to, uint256 amount) internal { +// balanceOf[to] += amount; +// totalSupply += amount; + +// emit Transfer(address(0), to, amount); +// } + +// function _burn(address from, uint256 amount) internal { +// balanceOf[from] -= amount; +// totalSupply -= amount; + +// emit Transfer(from, address(0), amount); +// } + +// function mint(address to, uint256 amount) external { +// require(msg.sender == adminAddress, "Unauthorized"); +// _mint(to, amount); +// } + +// function burn(address from, uint256 amount) external { +// require(balanceOf[from] >= amount, "Insufficient funds"); +// _burn(from, amount); +// } +// } diff --git a/src/MembershipManager.sol b/src/MembershipManager.sol new file mode 100644 index 0000000..3a586c5 --- /dev/null +++ b/src/MembershipManager.sol @@ -0,0 +1,66 @@ +// SPDX-License-Identifier: MIT +// This is a Token-Gated Membership System where users gain access to exclusive features by holding a minimum amount of ERC20 tokens and are awarded ERC721 membership NFTs for elite participation. + +pragma solidity ^0.8.15; + +// Import contracts for Token and NFT +import {MembershipNFT} from "src/MembershipNFT.sol"; +import {AccessToken} from "src/AccessToken.sol"; + +contract MembershipManager { + AccessToken public accessToken; + MembershipNFT public membershipNFT; + + // State variables + address public AccessTokenOwner; + address public owner; + uint256 public minThreshold; + + modifier onlyOwner { + require(msg.sender == owner, "MembershipManager:: Unauthorized User"); + _; + } + + modifier onlyAccessTokenOwner { + require(msg.sender == AccessTokenOwner, "Unauthorized to call access token"); + _; + } + + // Custom errors + error AmountTooHigh(); + // error InsufficientBalance(); + // error UnauthorizedClaim(); + + constructor(address _deployedAccessToken, address _deployedNFT, address _owner) { + accessToken = AccessToken(_deployedAccessToken); + membershipNFT = MembershipNFT(_deployedNFT); + owner = msg.sender; + AccessTokenOwner = _owner; + } + + mapping (address => uint256) public balances; + mapping (address => bool) public hasClaimed; + + function setMinThreshold(uint256 _newThreshold) external onlyOwner() { + minThreshold = _newThreshold; + } + + function giveAccessToken(address to, uint256 amount) external onlyAccessTokenOwner() { + accessToken.transfer(to, amount); + } + + function claimMembershipNFT() external returns(uint256) { + // if (accessToken.balanceOf(msg.sender) < MAX_AMOUNT) {revert InsufficientBalance();} + require(accessToken.balanceOf(msg.sender) >= minThreshold, "You dont have access to mint"); + require(!hasClaimed[msg.sender], "Claimed NFT already"); + hasClaimed[msg.sender] = true; + + uint256 tokenId = membershipNFT.mint(msg.sender); + return tokenId; + } + + function getOwner() external view returns(address) { + return owner; + } +} + diff --git a/src/MembershipNFT.sol b/src/MembershipNFT.sol new file mode 100644 index 0000000..21da96c --- /dev/null +++ b/src/MembershipNFT.sol @@ -0,0 +1,21 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.15; + +import {ERC721} from "lib/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol"; + +contract MembershipNFT is ERC721{ + uint256 public tokenId; + + // mapping (uint256 => address) public NFTowners; + constructor() ERC721("Membership NFT", "MNFT"){} + + function mint(address recipient) external returns(uint256){ + tokenId++; + uint256 _tokenId = tokenId; + + // NFTowners[_tokenId] = msg.sender; + _mint(recipient, _tokenId); + return tokenId; + } +} \ No newline at end of file diff --git a/test/ERC20.t.sol b/test/ERC20.t.sol index a1a15b1..afbbc4c 100644 --- a/test/ERC20.t.sol +++ b/test/ERC20.t.sol @@ -1,105 +1,107 @@ // SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; -import {Test} from "forge-std/Test.sol"; -// import {Vm} from "forge-std/Vm.sol"; -import {console} from "forge-std/Console.sol"; -import {ERC20} from "../src/ERC20.sol"; - -contract ERC20Test is Test { - ERC20 public erc20; - - string tokenName = "IBS Token"; - string tokenSymbol = "IBST"; - uint8 tokenDecimals = 6; - address adminAddress = address(0x123); - address account1 = address(0x567); - address account2 = address(0x678); - address zeroAddress = address(0); - - struct X { - uint256 x; - uint256 y; - } - error InsufficientFundsError(); - event Transfer(address indexed from, address indexed to, uint256 value); - event DummyEvent(X indexed structA, X structB); - - function setUp() public { - erc20 = new ERC20(tokenName, tokenSymbol, tokenDecimals, adminAddress); - // Get address of deployed contract (erc20) - console.log(address(erc20)); - vm.prank(adminAddress); - erc20.mint(adminAddress, 1000 ** tokenDecimals); - } - - function test_Deployment() public view { - assertEq(erc20.name(), tokenName); - assertEq(erc20.symbol(), tokenSymbol); - assertEq(erc20.decimals(), tokenDecimals); - assertEq(erc20.adminAddress(), adminAddress); - assertEq(erc20.balanceOf(adminAddress), 1000 ** tokenDecimals); - } - - function test_TransferRevertedWhen_SenderHasInsufficientFunds() public { - assertEq(erc20.balanceOf(account1), 0); - vm.startPrank(account1); - // vm.expectRevert("Insufficient fund"); - vm.expectRevert(InsufficientFundsError.selector); - erc20.transfer(account2, 50 ** tokenDecimals); - vm.stopPrank(); - } - - function test_TransferRevertedWhen_CallerIsZeroAddress() public { - vm.prank(zeroAddress); - vm.expectRevert("Invalid caller"); - erc20.transfer(account1, 1 ** tokenDecimals); - } - - function test_Transfer_BalanceChanged() public { - uint256 initialAdminBalance = erc20.balanceOf(adminAddress); - uint256 initialRecipientBalance = erc20.balanceOf(account1); - uint256 transferAmount = 5 ** tokenDecimals; - - assertEq(initialAdminBalance, 1000 ** tokenDecimals); - assertEq(initialRecipientBalance, 0); - - vm.startPrank(adminAddress); - erc20.transfer(account1, transferAmount); - vm.stopPrank(); - - uint256 currentAdminBalance = erc20.balanceOf(adminAddress); - uint256 currentRecipientBalance = erc20.balanceOf(account1); - - assertEq(currentAdminBalance, initialAdminBalance - transferAmount); - assertEq( - currentRecipientBalance, - initialRecipientBalance + transferAmount - ); - } - - function test_Transfer_emitTransferEvent() public { - uint256 transferAmount = 5 ** tokenDecimals; - vm.prank(adminAddress); - vm.expectEmit(true, true, false, true); - emit Transfer(adminAddress, account1, transferAmount); - erc20.transfer(account1, transferAmount); - } - - // Experimental - function test_EmitDummyEvent() public { - X memory x; - X memory y; - - x.x = 1; - x.y = 2; - - y.x = 11; - y.y = 22; - - vm.expectEmit(true, false, false, true); - emit DummyEvent(x, x); - erc20.emitDummyEvent(); - console.log(address(this)); - } -} +// import {Test} from "forge-std/Test.sol"; +// // import {Vm} from "forge-std/Vm.sol"; +// import {console} from "forge-std/console.sol"; +// import {ERC20} from "../src/ERC20.sol"; + +// contract ERC20Test is Test { +// ERC20 public erc20; + +// string tokenName = "IBS Token"; +// string tokenSymbol = "IBST"; +// uint8 tokenDecimals = 6; +// // function getOwner() external view returns(address) { +// // return owner; +// // } address adminAddress = address(0x123); +// address account1 = address(0x567); +// address account2 = address(0x678); +// address zeroAddress = address(0); + +// struct X { +// uint256 x; +// uint256 y; +// } +// error InsufficientFundsError(); +// event Transfer(address indexed from, address indexed to, uint256 value); +// event DummyEvent(X indexed structA, X structB); + +// function setUp() public { +// erc20 = new ERC20(tokenName, tokenSymbol, tokenDecimals, adminAddress); +// // Get address of deployed contract (erc20) +// console.log(address(erc20)); +// vm.prank(adminAddress); +// erc20.mint(adminAddress, 1000 ** tokenDecimals); +// } + +// function test_Deployment() public view { +// assertEq(erc20.name(), tokenName); +// assertEq(erc20.symbol(), tokenSymbol); +// assertEq(erc20.decimals(), tokenDecimals); +// assertEq(erc20.adminAddress(), adminAddress); +// assertEq(erc20.balanceOf(adminAddress), 1000 ** tokenDecimals); +// } + +// function test_TransferRevertedWhen_SenderHasInsufficientFunds() public { +// assertEq(erc20.balanceOf(account1), 0); +// vm.startPrank(account1); +// // vm.expectRevert("Insufficient fund"); +// vm.expectRevert(InsufficientFundsError.selector); +// erc20.transfer(account2, 50 ** tokenDecimals); +// vm.stopPrank(); +// } + +// function test_TransferRevertedWhen_CallerIsZeroAddress() public { +// vm.prank(zeroAddress); +// vm.expectRevert("Invalid caller"); +// erc20.transfer(account1, 1 ** tokenDecimals); +// } + +// function test_Transfer_BalanceChanged() public { +// uint256 initialAdminBalance = erc20.balanceOf(adminAddress); +// uint256 initialRecipientBalance = erc20.balanceOf(account1); +// uint256 transferAmount = 5 ** tokenDecimals; + +// assertEq(initialAdminBalance, 1000 ** tokenDecimals); +// assertEq(initialRecipientBalance, 0); + +// vm.startPrank(adminAddress); +// erc20.transfer(account1, transferAmount); +// vm.stopPrank(); + +// uint256 currentAdminBalance = erc20.balanceOf(adminAddress); +// uint256 currentRecipientBalance = erc20.balanceOf(account1); + +// assertEq(currentAdminBalance, initialAdminBalance - transferAmount); +// assertEq( +// currentRecipientBalance, +// initialRecipientBalance + transferAmount +// ); +// } + +// function test_Transfer_emitTransferEvent() public { +// uint256 transferAmount = 5 ** tokenDecimals; +// vm.prank(adminAddress); +// vm.expectEmit(true, true, false, true); +// emit Transfer(adminAddress, account1, transferAmount); +// erc20.transfer(account1, transferAmount); +// } + +// // Experimental +// function test_EmitDummyEvent() public { +// X memory x; +// X memory y; + +// x.x = 1; +// x.y = 2; + +// y.x = 11; +// y.y = 22; + +// vm.expectEmit(true, false, false, true); +// emit DummyEvent(x, x); +// erc20.emitDummyEvent(); +// console.log(address(this)); +// } +// } diff --git a/test/MembershipManager.t.sol b/test/MembershipManager.t.sol new file mode 100644 index 0000000..e94d034 --- /dev/null +++ b/test/MembershipManager.t.sol @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.15; + +import {Test, console} from "forge-std/Test.sol"; +import {MembershipManager} from "../src/MembershipManager.sol"; +import {AccessToken} from "../src/AccessToken.sol"; +import {MembershipNFT} from "../src/MembershipNFT.sol"; + +contract MemberShipManagerTest is Test { + MembershipManager public membershipManager; + AccessToken public accessToken; + MembershipNFT public membershipNFT; + + address account1 = address(0x345); + address account2 = address(0x678); + + function setUp() public { + accessToken = new AccessToken(); + membershipNFT = new MembershipNFT(); + + membershipManager = new MembershipManager(address(accessToken), address(membershipNFT), accessToken.getOwner()); + accessToken.mint(address(membershipManager), 1000); + } + + function test_Deployment() public view { + assertEq(accessToken.balanceOf(address(membershipManager)), 1000); + assertEq(accessToken.name(), "Access Token"); + assertEq(accessToken.symbol(), "ACT"); + assertEq(accessToken.getOwner(), address(this)); + assertEq(membershipNFT.name(), "Membership NFT"); + assertEq(membershipNFT.symbol(), "MNFT"); + } + + function test_Revert_If_Unauthorized_Minter() public { + vm.prank(account1); + vm.expectRevert(); + accessToken.mint(account2, 1000); + } + + function test_OnlyOwner_Can_Call_MinimumThreshold() public { + vm.prank(account1); + vm.expectRevert("MembershipManager:: Unauthorized User"); + membershipManager.setMinThreshold(200); + } + + function test_Successfully_SetMinimumThreshold () public { + vm.prank(membershipManager.getOwner()); + assertEq(membershipManager.minThreshold(), 0); + membershipManager.setMinThreshold(100); + assertEq(membershipManager.minThreshold(), 100); + } + + function test_Revert_Call_From_Unauthorised_User_To_Change_MinThreshld() public { + vm.startPrank(account1); + vm.expectRevert("Unauthorized to call access token"); + membershipManager.giveAccessToken(account2,100); + vm.stopPrank(); + } + + function test_AccessToken_Transfer_Successfully () public { + uint256 initialBalance = accessToken.balanceOf(account1); + uint256 transferAmount = 200; + vm.startPrank(accessToken.getOwner()); + membershipManager.giveAccessToken(account2, transferAmount); + uint256 currentBalance = accessToken.balanceOf(account2); + assertEq(currentBalance, initialBalance + transferAmount); + vm.stopPrank(); + } + + function test_Revert_If_Caller_Has_Claimed_NFT() public { + test_AccessToken_Transfer_Successfully(); + vm.startPrank(account2); + + assertEq(membershipManager.hasClaimed(account2), false); + membershipManager.claimMembershipNFT(); + + vm.expectRevert("Claimed NFT already"); + membershipManager.claimMembershipNFT(); + + vm.stopPrank(); + } + + function test_Revert_If_Caller_Access_Token_Doesnt_Reach_Min_Threshold() public { + test_AccessToken_Transfer_Successfully(); + + vm.startPrank(membershipManager.getOwner()); + membershipManager.setMinThreshold(500); + vm.stopPrank(); + + vm.startPrank(account2); + + assertEq(membershipManager.hasClaimed(account2), false); + vm.expectRevert("You dont have access to mint"); + membershipManager.claimMembershipNFT(); + + vm.stopPrank(); + } + + function test_If_User_Claimed_NFT_Successfully() public { + test_AccessToken_Transfer_Successfully(); + + vm.startPrank(account2); + + uint256 mintedTokenId = membershipManager.claimMembershipNFT(); + + assertEq(mintedTokenId, 1); + assertEq(membershipNFT.ownerOf(mintedTokenId), account2); + vm.stopPrank(); + } +} \ No newline at end of file