Contract 0x219e6e6520889d1F67Cc1ba39dAE26700cEfd989 1

 
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xbe5c67d66f0a21ded87aaa6ec60f1fdeedf453b37765338eb03ba1559460aa24Subscribe On Sig...220491572021-12-02 12:45:3913 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x128c03cb4335fa52e4a06b855b7e88645b8bc11a9e6aff60ccb859ed2b03b80fSubscribe On Sig...220489992021-12-02 12:40:1119 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x210c3aeddf3e58ea37517129f2e2bdbabe329c99f62a6345d386d119d9aa042bSubscribe On Sig...220477942021-12-02 11:56:371 hr 2 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0xc85d47ce301d5e23e1e3055ab4c09b6960de474993a489178cfbde6feb760d33Subscribe On Sig...220454132021-12-02 10:13:152 hrs 46 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x75021315b9d4785e24b603036b01232568b994be27eb9c5b774d394d5894de49Subscribe On Sig...220450132021-12-02 9:53:073 hrs 6 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x46fffe7a1d100934236ec093f09f18c5f3ddcb8e39f7fdb64beb695cbe6937afSubscribe On Sig...220377322021-12-02 4:59:457 hrs 59 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.0043792
0x792843d2e0fb8d2356773e91adaf133fac41073ade0a2d1040cbb85b7bb20ec4Subscribe On Sig...220350882021-12-02 3:19:599 hrs 39 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0xca02e40cde583b56895526e3ba93eafa828b17b306eab9f46cc4e6004c10b26eSubscribe On Sig...220314562021-12-02 1:08:1211 hrs 51 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0xe3e3708df15f2e07af02c4c389920f8d459d5d4d8cfcc56e7b08c280661e3c26Subscribe On Sig...220299472021-12-02 0:11:4712 hrs 47 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x9ccf2696a18afe37014a8fe0f82ec0accc4abc95358a683a60e6c6277f70f372Subscribe On Sig...220285702021-12-01 23:19:5213 hrs 39 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x51859f68ce46cf6f83576a02ee3b1de9ff971168005da854d239efa416a40052Subscribe On Sig...220225212021-12-01 18:57:5818 hrs 1 min ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.0043792
0x8a6f37c76e062b5d4ac1625b462b91e720c34287684db5c425e1faab9f5f1c3dSubscribe On Sig...220196882021-12-01 16:59:2520 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x53278819f81a94b4fff55291e9c96e74b478dfb07dc3fbf693fec402ce92a772Subscribe On Sig...220184172021-12-01 16:07:0020 hrs 52 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x7e2efbf8a7b8add2e03705cbb0e8e82fdf22002d57183c9bf0f254bac4328c6fSubscribe On Sig...220178092021-12-01 15:46:0221 hrs 13 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x7a491d16d51f8d2ae8c75cf807c3f16cbfde4ec85bbb5fb66b4807aabf3d31f5Subscribe On Sig...220128602021-12-01 12:36:071 day 23 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x9cf3c64be80bb4ce2325181111bf2b55e67eecebf0f19987d2afed591375dcf4Subscribe On Sig...220125652021-12-01 12:25:361 day 33 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0xf8f9941e4cbccf046ea7556dd5f38fd5cf66d185889c981219eed608f1c99a60Subscribe On Sig...220088322021-12-01 10:10:321 day 2 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x05b5fb3f3c99b62bf5ba5168befaef41d272d5785355231413806f455252da96Subscribe On Sig...220080532021-12-01 9:39:141 day 3 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x2fdb60fed4f63e842edf2da17fa334ac995f8da8df573b8630ba9785b4149083Subscribe On Sig...220068362021-12-01 8:48:521 day 4 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x5385dbb5deb2f079aebbf5f42e8e06abf4f7cb91474af396d3adbb5997470fbcSubscribe On Sig...220058452021-12-01 8:14:451 day 4 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x7de0fc3541b1aefb8785bd191d7c31d4d8e6684a3bc9567255198cef6ada4661Subscribe On Sig...220050572021-12-01 7:47:411 day 5 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x13c4457914988d8baa21e6ac29f63cff18f8a7e40b13b71c95c164f277750402Subscribe On Sig...220003812021-12-01 4:58:041 day 8 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x2e7b163e734d8832bb7eb63afb48eeea7d8e2b4b17d48924e82988faf2b97023Subscribe On Sig...219981272021-12-01 3:35:481 day 9 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x14d66b5750791e96c47d9bd60646e25eb5bff6c26ceabd12c7f672ec8b989ecaSubscribe On Sig...219968602021-12-01 2:50:231 day 10 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
0x5dbbf1cd57e2a26acfe3f457070a7c796eef5028a45e4411717bd17dce96a58bSubscribe On Sig...219966082021-12-01 2:39:351 day 10 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00437968
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SynergyOfSerraWhitelist

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 1337 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2021-06-09
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
    @author The Calystral Team
    @title The RegistrableContractState's Interface
*/
interface IRegistrableContractState is IERC165 {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /// @dev MUST emit when the contract is set to an active state.
    event Activated();
    /// @dev MUST emit when the contract is set to an inactive state.
    event Inactivated();

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the contract state to active.
        @dev Sets the contract state to active.
    */
    function setActive() external;

    /**
        @notice Sets the contract state to inactive.
        @dev Sets the contract state to inactive.
    */
    function setInactive() external;

    /**
        @dev Sets the registry contract object.
        Reverts if the registryAddress doesn't implement the IRegistry interface.
        @param registryAddress The registry address
    */
    function setRegistry(address registryAddress) external;

    /**
        @notice Returns the current contract state.
        @dev Returns the current contract state.
        @return The current contract state (true == active; false == inactive)
    */
    function getIsActive() external view returns (bool);

    /**
        @notice Returns the Registry address.
        @dev Returns the Registry address.
        @return The Registry address
    */
    function getRegistryAddress() external view returns (address);

    /**
        @notice Returns the current address associated with `key` identifier.
        @dev Look-up in the Registry.
        Returns the current address associated with `key` identifier.
        @return The key identifier
    */
    function getContractAddress(uint256 key) external view returns (address);
}

/**
    @author The Calystral Team
    @title The Whitelist's Interface
*/
interface IWhitelist is IRegistrableContractState {
    /*==============================
    =            EVENTS            =
    ==============================*/
    /**
        @dev Emits on successful subscription.
        @param _subscriberAddress The address of the subscriber.
     */
    event OnSubscribed(address _subscriberAddress);
    /**
        @dev Emits on successful unsubscription.
        @param _subscriberAddress The address of the unsubscriber.
     */
    event OnUnsubscribed(address _subscriberAddress);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Calls the subscribe function if no specific function was called.
        @dev Fallback function forwards to subscribe function.
     */
    fallback() external;

    /**
        @notice Any user can add him or herself to the subscriber list.
        @dev Subscribes the message sender to the list. Other contracts are not allowed to subscribe.
     */
    function subscribe() external;

    /**
        @notice Any user can revoke his or her subscription.
        @dev Deletes the index entry in the _subscriberIndexToAddress mapping for the message sender.
     */
    function unsubscribe() external;

    /**
        @notice Migrates whitelisted users from a legacy Whitelist contract.
        @dev Migrates whitelisted users from a legacy Whitelist contract.
        @param userAccounts Array of user addresses to migrate. Note: Mind the block gas limit !
    */
    function migrate(address[] memory userAccounts) external;

    /**
        @notice Any user is added to this whitelist on sign-up.
        @dev Subscribes the user to this whitelist on sign-up.
        @param user The user address of the new user
     */
    function subscribeOnSignUp(address user) external;

    /**
        @notice Checks wether a user is in the subscriber list.
        @dev tx.origin is used instead of msg.sender so other contracts may forward a user request (e.g. limited rewards contract).
        @return The blocknumber at which the user has subscribed or 0 if not subscribed at all.
     */
    function isSubscriber() external view returns (uint256);

    /**
        @notice Checks wheter the given address is in the subscriber list.
        @dev This function isn't external since it's used by the contract as well.
        @param _subscriberAddress The address to check for.
        @return The blocknumber at which the user has subscribed or 0 if not subscribed at all.
     */
    function isSubscriber(address _subscriberAddress)
        external
        view
        returns (uint256);

    /**
        @notice Shows the whole subscriber list.
        @dev Returns all current subscribers as an address array.
        @return A list of subscriber addresses.
     */
    function getSubscriberList() external view returns (address[] memory);

    /**
        @notice Shows the count of subscribers.
        @dev Returns the subscriber count as an integer.
        @return The count of subscribers
     */
    function getSubscriberCount() external view returns (uint256);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /*
     * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7
     */
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;

    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor() {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(_INTERFACE_ID_ERC165);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override
        returns (bool)
    {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

/**
    @author The Calystral Team
    @title The Registry's Interface
*/
interface IRegistry is IRegistrableContractState {
    /*==============================
    =           EVENTS             =
    ==============================*/
    /**
        @dev MUST emit when an entry in the Registry is set or updated.
        The `key` argument MUST be the key of the entry which is set or updated.
        The `value` argument MUST be the address of the entry which is set or updated.
    */
    event EntrySet(uint256 indexed key, address value);
    /**
        @dev MUST emit when an entry in the Registry is removed.
        The `key` argument MUST be the key of the entry which is removed.
        The `value` argument MUST be the address of the entry which is removed.
    */
    event EntryRemoved(uint256 indexed key, address value);

    /*==============================
    =          FUNCTIONS           =
    ==============================*/
    /**
        @notice Sets the MultiSigAdmin contract as Registry entry 1.
        @dev Sets the MultiSigAdmin contract as Registry entry 1.
        @param msaAddress The contract address of the MultiSigAdmin
    */
    function initializeMultiSigAdmin(address msaAddress) external;

    /**
        @notice Checks if the registry Map contains the key.
        @dev Returns true if the key is in the registry map. O(1).
        @param key  The key to search for
        @return     The boolean result
    */
    function contains(uint256 key) external view returns (bool);

    /**
        @notice Returns the registry map length.
        @dev Returns the number of key-value pairs in the registry map. O(1).
        @return     The registry map length
    */
    function length() external view returns (uint256);

    /**
        @notice Returns the key-value pair stored at position `index` in the registry map.
        @dev Returns the key-value pair stored at position `index` in the registry map. O(1).
        Note that there are no guarantees on the ordering of entries inside the
        array, and it may change when more entries are added or removed.
        Requirements:
        - `index` must be strictly less than {length}.
        @param index    The position in the registry map
        @return         The key-value pair as a tuple
    */
    function at(uint256 index) external view returns (uint256, address);

    /**
        @notice Tries to return the value associated with `key`.
        @dev Tries to return the value associated with `key`.  O(1).
        Does not revert if `key` is not in the registry map.
        @param key    The key to search for
        @return       The key-value pair as a tuple
    */
    function tryGet(uint256 key) external view returns (bool, address);

    /**
        @notice Returns the value associated with `key`.
        @dev Returns the value associated with `key`.  O(1).
        Requirements:
        - `key` must be in the registry map.
        @param key    The key to search for
        @return       The contract address
    */
    function get(uint256 key) external view returns (address);

    /**
        @notice Returns all indices, keys, addresses.
        @dev Returns all indices, keys, addresses as three seperate arrays.
        @return Indices, keys, addresses
    */
    function getAll()
        external
        view
        returns (
            uint256[] memory,
            uint256[] memory,
            address[] memory
        );

    /**
        @notice Adds a key-value pair to a map, or updates the value for an existing
        key.
        @dev Adds a key-value pair to the registry map, or updates the value for an existing
        key. O(1).
        Returns true if the key was added to the registry map, that is if it was not
        already present.
        @param key    The key as an identifier
        @param value  The address of the contract
        @return       Success as a bool
    */
    function set(uint256 key, address value) external returns (bool);

    /**
        @notice Removes a value from the registry map.
        @dev Removes a value from the registry map. O(1).
        Returns true if the key was removed from the registry map, that is if it was present.
        @param key    The key as an identifier
        @return       Success as a bool
    */
    function remove(uint256 key) external returns (bool);

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param key    The key as an identifier
    */
    function setContractActiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to active.
        @dev Sets a contract state to active.
        @param contractAddress The contract's address
    */
    function setContractActiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state active.
        @dev Sets all contracts within the registry to state active.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsActive() external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param key    The key as an identifier
    */
    function setContractInactiveByKey(uint256 key) external;

    /**
        @notice Sets a contract state to inactive.
        @dev Sets a contract state to inactive.
        @param contractAddress The contract's address
    */
    function setContractInactiveByAddress(address contractAddress) external;

    /**
        @notice Sets all contracts within the registry to state inactive.
        @dev Sets all contracts within the registry to state inactive.
        Does NOT revert if any contract doesn't implement the RegistrableContractState interface.
        Does NOT revert if it is an externally owned user account.
    */
    function setAllContractsInactive() external;
}

/**
    @author The Calystral Team
    @title A helper parent contract: Pausable & Registry
*/
contract RegistrableContractState is IRegistrableContractState, ERC165 {
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Current contract state
    bool private _isActive;
    /// @dev Current registry pointer
    address private _registryAddress;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    modifier isActive() {
        _isActiveCheck();
        _;
    }

    modifier isAuthorizedAdmin() {
        _isAuthorizedAdmin();
        _;
    }

    modifier isAuthorizedAdminOrRegistry() {
        _isAuthorizedAdminOrRegistry();
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates and initializes the contract.
        @dev Creates and initializes the contract.
        Registers all implemented interfaces.
        Inheriting contracts are INACTIVE by default.
    */
    constructor(address registryAddress) {
        _registryAddress = registryAddress;

        _registerInterface(type(IRegistrableContractState).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function setActive() external override isAuthorizedAdminOrRegistry() {
        _isActive = true;

        emit Activated();
    }

    function setInactive() external override isAuthorizedAdminOrRegistry() {
        _isActive = false;

        emit Inactivated();
    }

    function setRegistry(address registryAddress)
        external
        override
        isAuthorizedAdmin()
    {
        _registryAddress = registryAddress;

        try
            _registryContract().supportsInterface(type(IRegistry).interfaceId)
        returns (bool supportsInterface) {
            require(
                supportsInterface,
                "The provided contract does not implement the Registry interface"
            );
        } catch {
            revert(
                "The provided contract does not implement the Registry interface"
            );
        }
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function getIsActive() public view override returns (bool) {
        return _isActive;
    }

    function getRegistryAddress() public view override returns (address) {
        return _registryAddress;
    }

    function getContractAddress(uint256 key)
        public
        view
        override
        returns (address)
    {
        return _registryContract().get(key);
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev Returns the target Registry object.
        @return The target Registry object
    */
    function _registryContract() internal view returns (IRegistry) {
        return IRegistry(_registryAddress);
    }

    /**
        @dev Checks if the contract is in an active state.
        Reverts if the contract is INACTIVE.
    */
    function _isActiveCheck() internal view {
        require(_isActive == true, "The contract is not active");
    }

    /**
        @dev Checks if the msg.sender is the Admin.
        Reverts if msg.sender is not the Admin.
    */
    function _isAuthorizedAdmin() internal view {
        require(msg.sender == getContractAddress(1), "Unauthorized call");
    }

    /**
        @dev Checks if the msg.sender is the Admin or the Registry.
        Reverts if msg.sender is not the Admin or the Registry.
    */
    function _isAuthorizedAdminOrRegistry() internal view {
        require(
            msg.sender == _registryAddress ||
                msg.sender == getContractAddress(1),
            "Unauthorized call"
        );
    }
}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) =
            target.call{value: value}(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/// @author The Calystral Team
/// @title Sign-up contract for all tech pioneers
/// @notice A list, which is maintained to grant extras to the community
contract SynergyOfSerraWhitelist is IWhitelist, RegistrableContractState {
    using Address for address;
    /*==============================
    =          CONSTANTS           =
    ==============================*/

    /*==============================
    =            STORAGE           =
    ==============================*/
    /// @dev Used to point towards the subscriber address. Caution: This will be likely unequal to the actual subscriber count. We start at 1 because 0 will be the indicator that an address is not a subscriber.
    uint256 private _subscriberIndex = 1;

    /// @dev Maps the subscriber index to an address
    mapping(uint256 => address) private _subscriberIndexToAddress;
    /// @dev Maps the subscriber address to the subscriber index or 0 if not subscriped.
    mapping(address => uint256) private _subscriberAddressToSubscribed;
    /// @dev Maps the subscriber address to the blocknumber of subscription or 0 if not subscriped.
    mapping(address => uint256) private _subscriberAddressToBlockNumber;

    /*==============================
    =          MODIFIERS           =
    ==============================*/
    /// @notice This modifier prevents other smart contracts from subscribing.
    modifier isNotAContract() {
        address adr = msg.sender;
        require(!adr.isContract(), "Contracts are not allowed to interact");
        _;
    }

    /// @notice This modifier allows the ListAdmin to subscribe users on sign-up.
    modifier isAuthorizedListAdmin() {
        require(msg.sender == getContractAddress(1001), "Unauthorized call");
        _;
    }

    /*==============================
    =          CONSTRUCTOR         =
    ==============================*/
    /**
        @notice Creates the smart contract and initializes the whitelist.
        Contract is INACTIVE by default.
        @param registryAddress  Address of the RegistryManager contract
     */
    constructor(address registryAddress)
        RegistrableContractState(registryAddress)
    {
        _registerInterface(type(IWhitelist).interfaceId);
    }

    /*==============================
    =      PUBLIC & EXTERNAL       =
    ==============================*/
    fallback() external override isActive() {
        subscribe();
    }

    function subscribe() public override isNotAContract() isActive() {
        _subscribe(msg.sender);
    }

    function unsubscribe() public override isNotAContract() isActive() {
        require(isSubscriber(msg.sender) != 0, "You have not subscribed yet.");

        uint256 index = _subscriberAddressToSubscribed[msg.sender];
        delete _subscriberIndexToAddress[index];

        emit OnUnsubscribed(msg.sender);
    }

    /*==============================
    =          RESTRICTED          =
    ==============================*/
    function migrate(address[] memory userAccounts)
        external
        override
        isAuthorizedAdmin()
    {
        for (uint256 index = 0; index < userAccounts.length; ++index) {
            _subscribe(userAccounts[index]);
        }
    }

    function subscribeOnSignUp(address user)
        public
        override
        isAuthorizedListAdmin()
    {
        _subscribe(user);
    }

    /*==============================
    =          VIEW & PURE         =
    ==============================*/
    function isSubscriber() public view override returns (uint256) {
        return isSubscriber(tx.origin);
    }

    function isSubscriber(address _subscriberAddress)
        public
        view
        override
        returns (uint256)
    {
        if (
            _subscriberIndexToAddress[
                _subscriberAddressToSubscribed[_subscriberAddress]
            ] != address(0)
        ) {
            return _subscriberAddressToBlockNumber[_subscriberAddress];
        } else {
            return 0;
        }
    }

    function getSubscriberList()
        public
        view
        override
        returns (address[] memory)
    {
        uint256 subscriberListCounter = 0;
        uint256 subscriberListCount = getSubscriberCount();
        address[] memory subscriberList = new address[](subscriberListCount);

        for (uint256 i = 1; i < _subscriberIndex; i++) {
            address subscriberAddress = _subscriberIndexToAddress[i];
            if (isSubscriber(subscriberAddress) != 0) {
                subscriberList[subscriberListCounter] = subscriberAddress;
                subscriberListCounter++;
            }
        }

        return subscriberList;
    }

    function getSubscriberCount() public view override returns (uint256) {
        uint256 subscriberListCount = 0;

        for (uint256 i = 1; i < _subscriberIndex; i++) {
            address subscriberAddress = _subscriberIndexToAddress[i];
            if (isSubscriber(subscriberAddress) != 0) {
                subscriberListCount++;
            }
        }

        return subscriberListCount;
    }

    /*==============================
    =      INTERNAL & PRIVATE      =
    ==============================*/
    /**
        @dev This function is necessary, so it can be used by the constructor. Nobody should be able to add other people to the list.
        @param _subscriber The user address, which should be added.
     */
    function _subscribe(address _subscriber) private {
        require(isSubscriber(_subscriber) == 0, "You already subscribed.");

        _subscriberAddressToSubscribed[_subscriber] = _subscriberIndex;
        _subscriberAddressToBlockNumber[_subscriber] = block.number;
        _subscriberIndexToAddress[_subscriberIndex] = _subscriber;
        _subscriberIndex++;

        emit OnSubscribed(_subscriber);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Activated","type":"event"},{"anonymous":false,"inputs":[],"name":"Inactivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_subscriberAddress","type":"address"}],"name":"OnSubscribed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_subscriberAddress","type":"address"}],"name":"OnUnsubscribed","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"key","type":"uint256"}],"name":"getContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubscriberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubscriberList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSubscriber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_subscriberAddress","type":"address"}],"name":"isSubscriber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAccounts","type":"address[]"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setInactive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registryAddress","type":"address"}],"name":"setRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"subscribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"subscribeOnSignUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unsubscribe","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600160025534801561001557600080fd5b50604051610f4a380380610f4a8339810160408190526100349161010f565b806100456301ffc9a760e01b61008c565b60018054610100600160a81b0319166101006001600160a01b038416021790556100756389edd2db60e01b61008c565b506100866312d1067960e21b61008c565b5061013d565b6001600160e01b031980821614156100ea5760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b600060208284031215610120578081fd5b81516001600160a01b0381168114610136578182fd5b9392505050565b610dfe8061014c6000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c80638f449a0511610097578063f1b9ee2411610066578063f1b9ee24146101e1578063f21de1e8146101e9578063fba7cc7914610200578063fcae44841461020b576100f5565b80638f449a05146100fd578063a91ee0dc14610190578063aefa7d98146101a3578063c4804ef0146101ce576100f5565b80632e558d69116100d35780632e558d691461014d57806351d5d80d14610160578063760a8c2a146101755780638b8291be1461017d576100f5565b806301ffc9a71461010757806317e703ab1461012f5780631fcb4ee414610145575b6100fd610213565b610105610270565b005b61011a610115366004610cd1565b6102e2565b60405190151581526020015b60405180910390f35b61013761031d565b604051908152602001610126565b61013761037a565b61010561015b366004610beb565b61038a565b6101686103e2565b6040516101269190610d29565b6101056104db565b61010561018b366004610bac565b61051a565b61010561019e366004610bac565b61058e565b6101b66101b1366004610d11565b610773565b6040516001600160a01b039091168152602001610126565b6101376101dc366004610bac565b61080f565b610105610865565b6101b660015461010090046001600160a01b031690565b60015460ff1661011a565b6101056108a2565b6001805460ff1615151461026e5760405162461bcd60e51b815260206004820152601a60248201527f54686520636f6e7472616374206973206e6f742061637469766500000000000060448201526064015b60405180910390fd5b565b33803b156102ce5760405162461bcd60e51b815260206004820152602560248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e74604482015264195c9858dd60da1b6064820152608401610265565b6102d6610213565b6102df336109cb565b50565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526020819052604090205460ff165b919050565b60008060015b600254811015610374576000818152600360205260409020546001600160a01b031661034e8161080f565b15610361578261035d81610d76565b9350505b508061036c81610d76565b915050610323565b50905090565b60006103853261080f565b905090565b610392610ac8565b60005b81518110156103de576103ce8282815181106103c157634e487b7160e01b600052603260045260246000fd5b60200260200101516109cb565b6103d781610d76565b9050610395565b5050565b60606000806103ef61031d565b905060008167ffffffffffffffff81111561041a57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610443578160200160208202803683370190505b50905060015b6002548110156104d3576000818152600360205260409020546001600160a01b03166104748161080f565b156104c0578083868151811061049a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b0390921660209283029190910190910152846104bc81610d76565b9550505b50806104cb81610d76565b915050610449565b509250505090565b6104e3610b32565b6001805460ff1916811790556040517fed1cd0670ee0c0017f550451a038818c696d0b6a9d6ce5b369e44275573cf9b090600090a1565b6105256103e9610773565b6001600160a01b0316336001600160a01b0316146105855760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c0000000000000000000000000000006044820152606401610265565b6102df816109cb565b610596610ac8565b600180547fffffffffffffffffffffff0000000000000000000000000000000000000000ff166101006001600160a01b038416021790556105e460015461010090046001600160a01b031690565b6040517f01ffc9a70000000000000000000000000000000000000000000000000000000081527f60e56d110000000000000000000000000000000000000000000000000000000060048201526001600160a01b0391909116906301ffc9a79060240160206040518083038186803b15801561065e57600080fd5b505afa92505050801561068e575060408051601f3d908101601f1916820190925261068b91810190610cb1565b60015b6107005760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610265565b806103de5760405162461bcd60e51b815260206004820152603f60248201527f5468652070726f766964656420636f6e747261637420646f6573206e6f74206960448201527f6d706c656d656e742074686520526567697374727920696e74657266616365006064820152608401610265565b600061078c60015461010090046001600160a01b031690565b6001600160a01b0316639507d39a836040518263ffffffff1660e01b81526004016107b991815260200190565b60206040518083038186803b1580156107d157600080fd5b505afa1580156107e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108099190610bcf565b92915050565b6001600160a01b03818116600090815260046020908152604080832054835260039091528120549091161561085d57506001600160a01b038116600090815260056020526040902054610318565b506000610318565b61086d610b32565b6001805460ff191690556040517f83b03c3d41b5de9902c98822951ff375666c0cd7fd69f8993c0267ad087734d190600090a1565b33803b156109005760405162461bcd60e51b815260206004820152602560248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e74604482015264195c9858dd60da1b6064820152608401610265565b610908610213565b6109113361080f565b61095d5760405162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f742073756273637269626564207965742e000000006044820152606401610265565b336000818152600460209081526040808320548084526003835292819020805473ffffffffffffffffffffffffffffffffffffffff191690555192835290917f8d2aae3bd92acf221b185992d11dffa4ff32f3b5f8d9a474d3b7a6ccf067a321910160405180910390a15050565b6109d48161080f565b15610a215760405162461bcd60e51b815260206004820152601760248201527f596f7520616c726561647920737562736372696265642e0000000000000000006044820152606401610265565b600280546001600160a01b038316600081815260046020908152604080832094909455600581528382204390558454825260039052918220805473ffffffffffffffffffffffffffffffffffffffff1916909117905581549190610a8483610d76565b90915550506040516001600160a01b03821681527fea9dde00ed9f1133889d723ccfcd41c6d6cc3120be2c167eae94d8b65b463f019060200160405180910390a150565b610ad26001610773565b6001600160a01b0316336001600160a01b03161461026e5760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c0000000000000000000000000000006044820152606401610265565b60015461010090046001600160a01b0316331480610b555750610ad26001610773565b61026e5760405162461bcd60e51b815260206004820152601160248201527f556e617574686f72697a65642063616c6c0000000000000000000000000000006044820152606401610265565b803561031881610db3565b600060208284031215610bbd578081fd5b8135610bc881610db3565b9392505050565b600060208284031215610be0578081fd5b8151610bc881610db3565b60006020808385031215610bfd578182fd5b823567ffffffffffffffff80821115610c14578384fd5b818501915085601f830112610c27578384fd5b813581811115610c3957610c39610d9d565b838102604051601f19603f83011681018181108582111715610c5d57610c5d610d9d565b604052828152858101935084860182860187018a1015610c7b578788fd5b8795505b83861015610ca457610c9081610ba1565b855260019590950194938601938601610c7f565b5098975050505050505050565b600060208284031215610cc2578081fd5b81518015158114610bc8578182fd5b600060208284031215610ce2578081fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610bc8578182fd5b600060208284031215610d22578081fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b81811015610d6a5783516001600160a01b031683529284019291840191600101610d45565b50909695505050505050565b6000600019821415610d9657634e487b7160e01b81526011600452602481fd5b5060010190565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146102df57600080fdfea26469706673582212205088e71017235eb9ab3d39c8dc2c1ea4da6931b47ce6386c23d5850a1dda252264736f6c63430008020033000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51

-----Decoded View---------------
Arg [0] : registryAddress (address): 0x801b308f0213445e070f0d0cc052db38c17eda51

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000801b308f0213445e070f0d0cc052db38c17eda51


Deployed ByteCode Sourcemap

27113:5835:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14680:16;:14;:16::i;:::-;29413:11:::1;:9;:11::i;:::-;27113:5835:::0;6970:183;;;;;;:::i;:::-;;:::i;:::-;;;3803:14:1;;3796:22;3778:41;;3766:2;3751:18;6970:183:0;;;;;;;;31770:412;;;:::i;:::-;;;6477:25:1;;;6465:2;6450:18;31770:412:0;6432:76:1;30531:112:0;;;:::i;29997:256::-;;;;;;:::i;:::-;;:::i;31086:676::-;;;:::i;:::-;;;;;;;:::i;15664:133::-;;;:::i;30261:148::-;;;;;;:::i;:::-;;:::i;15951:615::-;;;;;;:::i;:::-;;:::i;16909:175::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2882:55:1;;;2864:74;;2852:2;2837:18;16909:175:0;2819:125:1;30651:427:0;;;;;;:::i;:::-;;:::i;15805:138::-;;;:::i;16790:111::-;;16877:16;;;;;-1:-1:-1;;;;;16877:16:0;;16790:111;16688:94;16765:9;;;;16688:94;;29554:321;;;:::i;17564:115::-;17623:9;;;;;:17;;;17615:56;;;;-1:-1:-1;;;17615:56:0;;5063:2:1;17615:56:0;;;5045:21:1;5102:2;5082:18;;;5075:30;5141:28;5121:18;;;5114:56;5187:18;;17615:56:0;;;;;;;;;17564:115::o;29440:106::-;28419:10;19387:20;;19435:8;28440:67;;;;-1:-1:-1;;;28440:67:0;;5775:2:1;28440:67:0;;;5757:21:1;5814:2;5794:18;;;5787:30;5853:34;5833:18;;;5826:62;-1:-1:-1;;;5904:18:1;;;5897:35;5949:19;;28440:67:0;5747:227:1;28440:67:0;14680:16:::1;:14;:16::i;:::-;29516:22:::2;29527:10;29516;:22::i;:::-;29440:106:::0;:::o;6970:183::-;7112:33;;;7083:4;7112:33;;;;;;;;;;;;;6970:183;;;;:::o;31770:412::-;31830:7;;31911:1;31894:242;31918:16;;31914:1;:20;31894:242;;;31956:25;31984:28;;;:25;:28;;;;;;-1:-1:-1;;;;;31984:28:0;32031:31;31984:28;32031:12;:31::i;:::-;:36;32027:98;;32088:21;;;;:::i;:::-;;;;32027:98;-1:-1:-1;31936:3:0;;;;:::i;:::-;;;;31894:242;;;-1:-1:-1;32155:19:0;-1:-1:-1;31770:412:0;:::o;30531:112::-;30585:7;30612:23;30625:9;30612:12;:23::i;:::-;30605:30;;30531:112;:::o;29997:256::-;14764:20;:18;:20::i;:::-;30131:13:::1;30126:120;30158:12;:19;30150:5;:27;30126:120;;;30203:31;30214:12;30227:5;30214:19;;;;;;-1:-1:-1::0;;;30214:19:0::1;;;;;;;;;;;;;;;30203:10;:31::i;:::-;30179:7;::::0;::::1;:::i;:::-;;;30126:120;;;;29997:256:::0;:::o;31086:676::-;31181:16;31215:29;31259:27;31289:20;:18;:20::i;:::-;31259:50;;31320:31;31368:19;31354:34;;;;;;-1:-1:-1;;;31354:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31354:34:0;-1:-1:-1;31320:68:0;-1:-1:-1;31418:1:0;31401:320;31425:16;;31421:1;:20;31401:320;;;31463:25;31491:28;;;:25;:28;;;;;;-1:-1:-1;;;;;31491:28:0;31538:31;31491:28;31538:12;:31::i;:::-;:36;31534:176;;31635:17;31595:14;31610:21;31595:37;;;;;;-1:-1:-1;;;31595:37:0;;;;;;;;;-1:-1:-1;;;;;31595:57:0;;;:37;;;;;;;;;;;:57;31671:23;;;;:::i;:::-;;;;31534:176;-1:-1:-1;31443:3:0;;;;:::i;:::-;;;;31401:320;;;-1:-1:-1;31740:14:0;-1:-1:-1;;;31086:676:0;:::o;15664:133::-;14862:30;:28;:30::i;:::-;15756:4:::1;15744:16:::0;;-1:-1:-1;;15744:16:0::1;::::0;::::1;::::0;;15778:11:::1;::::0;::::1;::::0;15744:9:::1;::::0;15778:11:::1;15664:133::o:0;30261:148::-;28684:24;28703:4;28684:18;:24::i;:::-;-1:-1:-1;;;;;28670:38:0;:10;-1:-1:-1;;;;;28670:38:0;;28662:68;;;;-1:-1:-1;;;28662:68:0;;4717:2:1;28662:68:0;;;4699:21:1;4756:2;4736:18;;;4729:30;4795:19;4775:18;;;4768:47;4832:18;;28662:68:0;4689:167:1;28662:68:0;30385:16:::1;30396:4;30385:10;:16::i;15951:615::-:0;14764:20;:18;:20::i;:::-;16078:16:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;;;16078:34:0;::::1;;;::::0;;16142:19:::1;16877:16:::0;;;;;-1:-1:-1;;;;;16877:16:0;;16790:111;16142:19:::1;:66;::::0;;;;16180:27:::1;16142:66;::::0;::::1;3974:98:1::0;-1:-1:-1;;;;;16142:37:0;;;::::1;::::0;::::1;::::0;3947:18:1;;16142:66:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;16142:66:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;16142:66:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;16125:434;;16442:105;::::0;-1:-1:-1;;;16442:105:0;;4285:2:1;16442:105:0::1;::::0;::::1;4267:21:1::0;4324:2;4304:18;;;4297:30;4363:34;4343:18;;;4336:62;4434:33;4414:18;;;4407:61;4485:19;;16442:105:0::1;4257:253:1::0;16125:434:0::1;16292:17;16266:142;;;::::0;-1:-1:-1;;;16266:142:0;;4285:2:1;16266:142:0::1;::::0;::::1;4267:21:1::0;4324:2;4304:18;;;4297:30;4363:34;4343:18;;;4336:62;4434:33;4414:18;;;4407:61;4485:19;;16266:142:0::1;4257:253:1::0;16909:175:0;17016:7;17048:19;16877:16;;;;;-1:-1:-1;;;;;16877:16:0;;16790:111;17048:19;-1:-1:-1;;;;;17048:23:0;;17072:3;17048:28;;;;;;;;;;;;;6477:25:1;;6465:2;6450:18;;6432:76;17048:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17041:35;16909:175;-1:-1:-1;;16909:175:0:o;30651:427::-;-1:-1:-1;;;;;30854:50:0;;;30767:7;30854:50;;;:30;:50;;;;;;;;;30810:109;;:25;:109;;;;;;30767:7;;30810:109;:123;30792:279;;-1:-1:-1;;;;;;30967:51:0;;;;;;:31;:51;;;;;;30960:58;;30792:279;-1:-1:-1;31058:1:0;31051:8;;15805:138;14862:30;:28;:30::i;:::-;15887:9:::1;:17:::0;;-1:-1:-1;;15887:17:0::1;::::0;;15922:13:::1;::::0;::::1;::::0;15899:5:::1;::::0;15922:13:::1;15805:138::o:0;29554:321::-;28419:10;19387:20;;19435:8;28440:67;;;;-1:-1:-1;;;28440:67:0;;5775:2:1;28440:67:0;;;5757:21:1;5814:2;5794:18;;;5787:30;5853:34;5833:18;;;5826:62;-1:-1:-1;;;5904:18:1;;;5897:35;5949:19;;28440:67:0;5747:227:1;28440:67:0;14680:16:::1;:14;:16::i;:::-;29640:24:::2;29653:10;29640:12;:24::i;:::-;29632:70;;;::::0;-1:-1:-1;;;29632:70:0;;5418:2:1;29632:70:0::2;::::0;::::2;5400:21:1::0;5457:2;5437:18;;;5430:30;5496;5476:18;;;5469:58;5544:18;;29632:70:0::2;5390:178:1::0;29632:70:0::2;29762:10;29715:13;29731:42:::0;;;:30:::2;:42;::::0;;;;;;;;29791:32;;;:25:::2;:32:::0;;;;;;29784:39;;-1:-1:-1;;29784:39:0::2;::::0;;29841:26;2864:74:1;;;29731:42:0;;29841:26:::2;::::0;2837:18:1;29841:26:0::2;;;;;;;14707:1;29554:321:::0;:::o;32526:419::-;32594:25;32607:11;32594:12;:25::i;:::-;:30;32586:66;;;;-1:-1:-1;;;32586:66:0;;6181:2:1;32586:66:0;;;6163:21:1;6220:2;6200:18;;;6193:30;6259:25;6239:18;;;6232:53;6302:18;;32586:66:0;6153:173:1;32586:66:0;32711:16;;;-1:-1:-1;;;;;32665:43:0;;;;;;:30;:43;;;;;;;;:62;;;;32738:31;:44;;;;;32785:12;32738:59;;32834:16;;32808:43;;:25;:43;;;;;:57;;-1:-1:-1;;32808:57:0;;;;;;32876:18;;;32711:16;32876:18;;;:::i;:::-;;;;-1:-1:-1;;32912:25:0;;-1:-1:-1;;;;;2882:55:1;;2864:74;;32912:25:0;;2852:2:1;2837:18;32912:25:0;;;;;;;32526:419;:::o;17806:128::-;17883:21;17902:1;17883:18;:21::i;:::-;-1:-1:-1;;;;;17869:35:0;:10;-1:-1:-1;;;;;17869:35:0;;17861:65;;;;-1:-1:-1;;;17861:65:0;;4717:2:1;17861:65:0;;;4699:21:1;4756:2;4736:18;;;4729:30;4795:19;4775:18;;;4768:47;4832:18;;17861:65:0;4689:167:1;18093:226:0;18194:16;;;;;-1:-1:-1;;;;;18194:16:0;18180:10;:30;;:86;;;18245:21;18264:1;18245:18;:21::i;18180:86::-;18158:153;;;;-1:-1:-1;;;18158:153:0;;4717:2:1;18158:153:0;;;4699:21:1;4756:2;4736:18;;;4729:30;4795:19;4775:18;;;4768:47;4832:18;;18158:153:0;4689:167:1;14:134;82:20;;111:31;82:20;111:31;:::i;153:257::-;;265:2;253:9;244:7;240:23;236:32;233:2;;;286:6;278;271:22;233:2;330:9;317:23;349:31;374:5;349:31;:::i;:::-;399:5;223:187;-1:-1:-1;;;223:187:1:o;415:261::-;;538:2;526:9;517:7;513:23;509:32;506:2;;;559:6;551;544:22;506:2;596:9;590:16;615:31;640:5;615:31;:::i;681:1178::-;;796:2;839;827:9;818:7;814:23;810:32;807:2;;;860:6;852;845:22;807:2;905:9;892:23;934:18;975:2;967:6;964:14;961:2;;;996:6;988;981:22;961:2;1039:6;1028:9;1024:22;1014:32;;1084:7;1077:4;1073:2;1069:13;1065:27;1055:2;;1111:6;1103;1096:22;1055:2;1152;1139:16;1174:2;1170;1167:10;1164:2;;;1180:18;;:::i;:::-;1227:2;1223;1219:11;1259:2;1253:9;1322:2;1318:7;1313:2;1309;1305:11;1301:25;1293:6;1289:38;1377:6;1365:10;1362:22;1357:2;1345:10;1342:18;1339:46;1336:2;;;1388:18;;:::i;:::-;1424:2;1417:22;1474:18;;;1508:15;;;;-1:-1:-1;1543:11:1;;;1573;;;1569:20;;1566:33;-1:-1:-1;1563:2:1;;;1617:6;1609;1602:22;1563:2;1644:6;1635:15;;1659:169;1673:2;1670:1;1667:9;1659:169;;;1730:23;1749:3;1730:23;:::i;:::-;1718:36;;1691:1;1684:9;;;;;1774:12;;;;1806;;1659:169;;;-1:-1:-1;1847:6:1;776:1083;-1:-1:-1;;;;;;;;776:1083:1:o;1864:297::-;;1984:2;1972:9;1963:7;1959:23;1955:32;1952:2;;;2005:6;1997;1990:22;1952:2;2042:9;2036:16;2095:5;2088:13;2081:21;2074:5;2071:32;2061:2;;2122:6;2114;2107:22;2166:352;;2277:2;2265:9;2256:7;2252:23;2248:32;2245:2;;;2298:6;2290;2283:22;2245:2;2342:9;2329:23;2392:66;2385:5;2381:78;2374:5;2371:89;2361:2;;2479:6;2471;2464:22;2523:190;;2635:2;2623:9;2614:7;2610:23;2606:32;2603:2;;;2656:6;2648;2641:22;2603:2;-1:-1:-1;2684:23:1;;2593:120;-1:-1:-1;2593:120:1:o;2949:684::-;3120:2;3172:21;;;3242:13;;3145:18;;;3264:22;;;2949:684;;3120:2;3343:15;;;;3317:2;3302:18;;;2949:684;3389:218;3403:6;3400:1;3397:13;3389:218;;;3468:13;;-1:-1:-1;;;;;3464:62:1;3452:75;;3582:15;;;;3547:12;;;;3425:1;3418:9;3389:218;;;-1:-1:-1;3624:3:1;;3100:533;-1:-1:-1;;;;;;3100:533:1:o;6513:293::-;;-1:-1:-1;;6573:17:1;;6570:2;;;-1:-1:-1;;;6620:3:1;6613:90;6726:4;6723:1;6716:15;6756:4;6751:3;6744:17;6570:2;-1:-1:-1;6798:1:1;6787:13;;6560:246::o;6811:184::-;-1:-1:-1;;;6860:1:1;6853:88;6960:4;6957:1;6950:15;6984:4;6981:1;6974:15;7000:154;-1:-1:-1;;;;;7079:5:1;7075:54;7068:5;7065:65;7055:2;;7144:1;7141;7134:12

Swarm Source

ipfs://5088e71017235eb9ab3d39c8dc2c1ea4da6931b47ce6386c23d5850a1dda2522
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.