false
false
0
The new Blockscout UI is now open source! Learn how to deploy it here
- We're indexing this chain right now. Some of the counts may be inaccurate.

Contract Address Details

0x7DA446815C1dcB9D0A009C96CE28Ed1Fcfe751ed

Contract Name
Membranes
Creator
0xc9a9c4–b388c5 at 0xdd51b0–3db071
Balance
0 ETH
Tokens
Fetching tokens...
Transactions
Fetching transactions...
Transfers
Fetching transfers...
Gas Used
Fetching gas used...
Last Balance Update
1544232
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