Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
- Contract name:
- Membranes
- Optimization enabled
- true
- Compiler version
- v0.8.25+commit.b61c2a91
- Optimization runs
- 800
- EVM Version
- paris
- Verified at
- 2024-10-10T00:22:09.852810Z
src/Membranes.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.3; import "./interfaces/IMembrane.sol"; import "openzeppelin-contracts/contracts/token/ERC20/IERC20.sol"; /// @title Membrane /// @author parseb contract Membranes is IMembrane { mapping(uint256 => Membrane) membraneById; error membraneNotFound(); error Membrane__EmptyFieldOnMembraneCreation(); /// @inheritdoc IMembrane function createMembrane(address[] memory tokens_, uint256[] memory balances_, string memory meta_) public virtual returns (uint256 id) { if (!((tokens_.length / balances_.length) * bytes(meta_).length >= 1)) { revert Membrane__EmptyFieldOnMembraneCreation(); } Membrane memory M; M.tokens = tokens_; M.balances = balances_; M.meta = meta_; id = uint256(keccak256(abi.encode(M))) % type(uint176).max; membraneById[id] = M; } ////////////////////////////////////////////////// //////////########## Internal /// @notice checks if given address respects the conditions of the specified membrane /// @param who_: address of agent to be checked /// @param membraneID_: conditions function gCheck(address who_, uint256 membraneID_) public view returns (bool s) { Membrane memory M = membraneById[membraneID_]; membraneID_ = 0; s = true; for (membraneID_; membraneID_ < M.tokens.length;) { if ( M.balances[membraneID_] == 0 && M.tokens[membraneID_] != address(0) && (IERC20(M.tokens[membraneID_]).balanceOf(who_) == 0) ) continue; /// @dev "not member in" s = s && (IERC20(M.tokens[membraneID_]).balanceOf(who_) >= M.balances[membraneID_]); if (!s) return false; unchecked { ++membraneID_; } } } function getMembraneById(uint256 id_) public view returns (Membrane memory) { return membraneById[id_]; } }
lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
src/interfaces/IMembrane.sol
// SPDX-License-Identifier: UNLICENSED pragma solidity >=0.8.3; struct Membrane { address[] tokens; uint256[] balances; string meta; } interface IMembrane { /// @notice creates membrane. Used to control and define. /// @notice To be read and understood as: Givent this membrane, of each of the tokens_[x], the user needs at least balances_[x]. /// @param tokens_ ERC20 or ERC721 token addresses array. Each is used as a constituent item of the membrane and condition for /// @param tokens_ belonging or not. Membership is established by a chain of binary claims whereby /// @param tokens_ the balance of address checked needs to satisfy all balances_ of all tokens_ stated as benchmark for belonging /// @param balances_ amounts required of each of tokens_. The order of required balances needs to map to token addresses. /// @param meta_ anything you want. Preferably stable CID for reaching aditional metadata such as an IPFS hash of type string. function createMembrane(address[] memory tokens_, uint256[] memory balances_, string memory meta_) external returns (uint256); function gCheck(address who_, uint256 membraneID_) external view returns (bool s); function getMembraneById(uint256 id_) external view returns (Membrane memory); }
Compiler Settings
{"viaIR":false,"remappings":["openzeppelin-contracts/token/=lib/openzeppelin-contracts/contracts/token/","openzeppelin-contracts/contracts/=lib/openzeppelin-contracts/contracts/","@solady/=lib/solady/src/","src/vendor/interfaces/=lib/optimism/packages/contracts-bedrock/src/vendor/interfaces/","@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/","@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/","ERC20ASG/=lib/ERC20ASG/","automate/=lib/optimism/packages/contracts-bedrock/lib/automate/contracts/","ds-test/=lib/openzeppelin-contracts/lib/forge-std/lib/ds-test/src/","erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/","forge-std/=lib/forge-std/src/","halmos-cheatcodes/=lib/halmos-cheatcodes/src/","kontrol-cheatcodes/=lib/optimism/packages/contracts-bedrock/lib/kontrol-cheatcodes/src/","lib-keccak/=lib/optimism/packages/contracts-bedrock/lib/lib-keccak/contracts/","openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/","openzeppelin-contracts-v5/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts-v5/","openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/","openzeppelin/=lib/openzeppelin-contracts/contracts/","optimism/=lib/optimism/","prb-test/=lib/optimism/packages/contracts-bedrock/lib/automate/lib/prb-test/src/","safe-contracts/=lib/optimism/packages/contracts-bedrock/lib/safe-contracts/contracts/","solady/=lib/solady/src/","solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/","solmate/=lib/optimism/packages/contracts-bedrock/lib/solmate/src/"],"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","storageLayout"],"":["ast"]}},"optimizer":{"runs":800,"enabled":true},"metadata":{"useLiteralContent":false,"bytecodeHash":"ipfs","appendCBOR":true},"libraries":{},"evmVersion":"paris"}
Contract ABI
[{"type":"error","name":"Membrane__EmptyFieldOnMembraneCreation","inputs":[]},{"type":"error","name":"membraneNotFound","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"id","internalType":"uint256"}],"name":"createMembrane","inputs":[{"type":"address[]","name":"tokens_","internalType":"address[]"},{"type":"uint256[]","name":"balances_","internalType":"uint256[]"},{"type":"string","name":"meta_","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"s","internalType":"bool"}],"name":"gCheck","inputs":[{"type":"address","name":"who_","internalType":"address"},{"type":"uint256","name":"membraneID_","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct Membrane","components":[{"type":"address[]","name":"tokens","internalType":"address[]"},{"type":"uint256[]","name":"balances","internalType":"uint256[]"},{"type":"string","name":"meta","internalType":"string"}]}],"name":"getMembraneById","inputs":[{"type":"uint256","name":"id_","internalType":"uint256"}]}]
Contract Creation Code
0x6080604052348015600f57600080fd5b50610d0c8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c8063333cabc51461004657806389160e0e1461006c578063dd151ad81461008f575b600080fd5b6100596100543660046108bb565b6100af565b6040519081526020015b60405180910390f35b61007f61007a36600461099f565b6101ce565b6040519015158152602001610063565b6100a261009d3660046109c9565b610502565b6040516100639190610a64565b600060018251845186516100c39190610b0f565b6100cd9190610b23565b10156100ec57604051631ea02bc360e31b815260040160405180910390fd5b61011060405180606001604052806060815260200160608152602001606081525090565b848152602080820185905260408083018590525175ffffffffffffffffffffffffffffffffffffffffffff9161014891849101610a64565b6040516020818303038152906040528051906020012060001c61016b9190610b48565b600081815260208181526040909120835180519395508493919261019492849290910190610688565b5060208281015180516101ad9260018501920190610705565b50604082015160028201906101c29082610be7565b50905050509392505050565b600081815260208181526040808320815181546080948102820185019093526060810183815285949193849284919084018282801561023657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610218575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561028e57602002820191906000526020600020905b81548152602001906001019080831161027a575b505050505081526020016002820180546102a790610b5c565b80601f01602080910402602001604051908101604052809291908181526020018280546102d390610b5c565b80156103205780601f106102f557610100808354040283529160200191610320565b820191906000526020600020905b81548152906001019060200180831161030357829003601f168201915b505050505081525050905060009250600191505b8051518310156104fa578060200151838151811061035457610354610ca7565b60200260200101516000148015610392575080518051600091908590811061037e5761037e610ca7565b60200260200101516001600160a01b031614155b8015610425575080518051849081106103ad576103ad610ca7565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156103ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104239190610cbd565b155b610334578180156104de57508060200151838151811061044757610447610ca7565b60200260200101518160000151848151811061046557610465610ca7565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190610cbd565b10155b9150816104ef5760009150506104fc565b826001019250610334565b505b92915050565b61052660405180606001604052806060815260200160608152602001606081525090565b600082815260208181526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561058e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610570575b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156105e657602002820191906000526020600020905b8154815260200190600101908083116105d2575b505050505081526020016002820180546105ff90610b5c565b80601f016020809104026020016040519081016040528092919081815260200182805461062b90610b5c565b80156106785780601f1061064d57610100808354040283529160200191610678565b820191906000526020600020905b81548152906001019060200180831161065b57829003601f168201915b5050505050815250509050919050565b8280548282559060005260206000209081019282156106f5579160200282015b828111156106f557825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161782556020909201916001909101906106a8565b50610701929150610740565b5090565b8280548282559060005260206000209081019282156106f5579160200282015b828111156106f5578251825591602001919060010190610725565b5b808211156107015760008155600101610741565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561079457610794610755565b604052919050565b600067ffffffffffffffff8211156107b6576107b6610755565b5060051b60200190565b80356001600160a01b03811681146107d757600080fd5b919050565b600082601f8301126107ed57600080fd5b813560206108026107fd8361079c565b61076b565b8083825260208201915060208460051b87010193508684111561082457600080fd5b602086015b848110156108405780358352918301918301610829565b509695505050505050565b600082601f83011261085c57600080fd5b813567ffffffffffffffff81111561087657610876610755565b610889601f8201601f191660200161076b565b81815284602083860101111561089e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156108d057600080fd5b833567ffffffffffffffff808211156108e857600080fd5b818601915086601f8301126108fc57600080fd5b8135602061090c6107fd8361079c565b82815260059290921b8401810191818101908a84111561092b57600080fd5b948201945b8386101561095057610941866107c0565b82529482019490820190610930565b9750508701359250508082111561096657600080fd5b610972878388016107dc565b9350604086013591508082111561098857600080fd5b506109958682870161084b565b9150509250925092565b600080604083850312156109b257600080fd5b6109bb836107c0565b946020939093013593505050565b6000602082840312156109db57600080fd5b5035919050565b60008151808452602080850194506020840160005b83811015610a13578151875295820195908201906001016109f7565b509495945050505050565b6000815180845260005b81811015610a4457602081850181015186830182015201610a28565b506000602082860101526020601f19601f83011685010191505092915050565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610ab25783516001600160a01b03168252928401926001929092019190840190610a89565b50838701519350601f19925082868203016040870152610ad281856109e2565b93505050604085015181858403016060860152610aef8382610a1e565b9695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082610b1e57610b1e610af9565b500490565b80820281158282048414176104fc57634e487b7160e01b600052601160045260246000fd5b600082610b5757610b57610af9565b500690565b600181811c90821680610b7057607f821691505b602082108103610b9057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610be2576000816000526020600020601f850160051c81016020861015610bbf5750805b601f850160051c820191505b81811015610bde57828155600101610bcb565b5050505b505050565b815167ffffffffffffffff811115610c0157610c01610755565b610c1581610c0f8454610b5c565b84610b96565b602080601f831160018114610c4a5760008415610c325750858301515b600019600386901b1c1916600185901b178555610bde565b600085815260208120601f198616915b82811015610c7957888601518255948401946001909101908401610c5a565b5085821015610c975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610ccf57600080fd5b505191905056fea2646970667358221220e19bda110ca03d236b363fc7857695aa9046dcaa00b1a61c8246cc8e14d3779564736f6c63430008190033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106100415760003560e01c8063333cabc51461004657806389160e0e1461006c578063dd151ad81461008f575b600080fd5b6100596100543660046108bb565b6100af565b6040519081526020015b60405180910390f35b61007f61007a36600461099f565b6101ce565b6040519015158152602001610063565b6100a261009d3660046109c9565b610502565b6040516100639190610a64565b600060018251845186516100c39190610b0f565b6100cd9190610b23565b10156100ec57604051631ea02bc360e31b815260040160405180910390fd5b61011060405180606001604052806060815260200160608152602001606081525090565b848152602080820185905260408083018590525175ffffffffffffffffffffffffffffffffffffffffffff9161014891849101610a64565b6040516020818303038152906040528051906020012060001c61016b9190610b48565b600081815260208181526040909120835180519395508493919261019492849290910190610688565b5060208281015180516101ad9260018501920190610705565b50604082015160028201906101c29082610be7565b50905050509392505050565b600081815260208181526040808320815181546080948102820185019093526060810183815285949193849284919084018282801561023657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610218575b505050505081526020016001820180548060200260200160405190810160405280929190818152602001828054801561028e57602002820191906000526020600020905b81548152602001906001019080831161027a575b505050505081526020016002820180546102a790610b5c565b80601f01602080910402602001604051908101604052809291908181526020018280546102d390610b5c565b80156103205780601f106102f557610100808354040283529160200191610320565b820191906000526020600020905b81548152906001019060200180831161030357829003601f168201915b505050505081525050905060009250600191505b8051518310156104fa578060200151838151811061035457610354610ca7565b60200260200101516000148015610392575080518051600091908590811061037e5761037e610ca7565b60200260200101516001600160a01b031614155b8015610425575080518051849081106103ad576103ad610ca7565b60209081029190910101516040516370a0823160e01b81526001600160a01b038681166004830152909116906370a0823190602401602060405180830381865afa1580156103ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104239190610cbd565b155b610334578180156104de57508060200151838151811061044757610447610ca7565b60200260200101518160000151848151811061046557610465610ca7565b60209081029190910101516040516370a0823160e01b81526001600160a01b038781166004830152909116906370a0823190602401602060405180830381865afa1580156104b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104db9190610cbd565b10155b9150816104ef5760009150506104fc565b826001019250610334565b505b92915050565b61052660405180606001604052806060815260200160608152602001606081525090565b600082815260208181526040918290208251815460809381028201840190945260608101848152909391928492849184018282801561058e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610570575b50505050508152602001600182018054806020026020016040519081016040528092919081815260200182805480156105e657602002820191906000526020600020905b8154815260200190600101908083116105d2575b505050505081526020016002820180546105ff90610b5c565b80601f016020809104026020016040519081016040528092919081815260200182805461062b90610b5c565b80156106785780601f1061064d57610100808354040283529160200191610678565b820191906000526020600020905b81548152906001019060200180831161065b57829003601f168201915b5050505050815250509050919050565b8280548282559060005260206000209081019282156106f5579160200282015b828111156106f557825182547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039091161782556020909201916001909101906106a8565b50610701929150610740565b5090565b8280548282559060005260206000209081019282156106f5579160200282015b828111156106f5578251825591602001919060010190610725565b5b808211156107015760008155600101610741565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561079457610794610755565b604052919050565b600067ffffffffffffffff8211156107b6576107b6610755565b5060051b60200190565b80356001600160a01b03811681146107d757600080fd5b919050565b600082601f8301126107ed57600080fd5b813560206108026107fd8361079c565b61076b565b8083825260208201915060208460051b87010193508684111561082457600080fd5b602086015b848110156108405780358352918301918301610829565b509695505050505050565b600082601f83011261085c57600080fd5b813567ffffffffffffffff81111561087657610876610755565b610889601f8201601f191660200161076b565b81815284602083860101111561089e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806000606084860312156108d057600080fd5b833567ffffffffffffffff808211156108e857600080fd5b818601915086601f8301126108fc57600080fd5b8135602061090c6107fd8361079c565b82815260059290921b8401810191818101908a84111561092b57600080fd5b948201945b8386101561095057610941866107c0565b82529482019490820190610930565b9750508701359250508082111561096657600080fd5b610972878388016107dc565b9350604086013591508082111561098857600080fd5b506109958682870161084b565b9150509250925092565b600080604083850312156109b257600080fd5b6109bb836107c0565b946020939093013593505050565b6000602082840312156109db57600080fd5b5035919050565b60008151808452602080850194506020840160005b83811015610a13578151875295820195908201906001016109f7565b509495945050505050565b6000815180845260005b81811015610a4457602081850181015186830182015201610a28565b506000602082860101526020601f19601f83011685010191505092915050565b6020808252825160608383015280516080840181905260009291820190839060a08601905b80831015610ab25783516001600160a01b03168252928401926001929092019190840190610a89565b50838701519350601f19925082868203016040870152610ad281856109e2565b93505050604085015181858403016060860152610aef8382610a1e565b9695505050505050565b634e487b7160e01b600052601260045260246000fd5b600082610b1e57610b1e610af9565b500490565b80820281158282048414176104fc57634e487b7160e01b600052601160045260246000fd5b600082610b5757610b57610af9565b500690565b600181811c90821680610b7057607f821691505b602082108103610b9057634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610be2576000816000526020600020601f850160051c81016020861015610bbf5750805b601f850160051c820191505b81811015610bde57828155600101610bcb565b5050505b505050565b815167ffffffffffffffff811115610c0157610c01610755565b610c1581610c0f8454610b5c565b84610b96565b602080601f831160018114610c4a5760008415610c325750858301515b600019600386901b1c1916600185901b178555610bde565b600085815260208120601f198616915b82811015610c7957888601518255948401946001909101908401610c5a565b5085821015610c975787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600060208284031215610ccf57600080fd5b505191905056fea2646970667358221220e19bda110ca03d236b363fc7857695aa9046dcaa00b1a61c8246cc8e14d3779564736f6c63430008190033