Contract 0x219e6e6520889d1F67Cc1ba39dAE26700cEfd989 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x026e563a115db4d84e349903ab219b7ab5eef798837ab96ac0d4b1cb7f8d069fSubscribe On Sig...334381432022-09-22 20:19:091 day 20 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003339140001 30.500000015
0x89d8db8dbdd71f95de6f45f1b9be2c8f5c93860f71466956179dff6d606a225bSubscribe On Sig...334166902022-09-22 7:52:292 days 8 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003381112959 30.879999996
0x9b644d3efac3c4503b4a4111bd03c823196336130063c5d1f422efe1646fa362Subscribe On Sig...333985632022-09-21 21:26:472 days 19 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.004524602053 41.323585774
0x8bedf887a09a7635237bef79d64f6bb215cc2d219a178f31fd8974d143c29782Subscribe On Sig...333937962022-09-21 18:40:552 days 22 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.036437527558 332.823598449
0x0fd7fcab04ca7b197092df7a1510daec1da5cc96235b2bc2003dec985dfa23f3Subscribe On Sig...333818952022-09-21 11:42:503 days 5 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003595717163 32.839998936
0x5072b453e6f0c9ee67578255e90c86a1de7d083bdc85d5d6d910e8ac6cc48bc3Subscribe On Sig...333817632022-09-21 11:34:183 days 5 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003339506001 30.500000017
0x6e0c243e0435bf68d8cd5f879a66c471723cb55546d8f5b5e4a0ab0f5caad95eSubscribe On Sig...333804832022-09-21 10:47:543 days 5 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003339506001 30.500000013
0xbccd14e58f82912245f07ac2c54a2a72486d71e5c70b6d2d2bc866667e8e93a5Subscribe On Sig...333463322022-09-20 14:19:244 days 2 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003346774901 30.566387508
0xe9db6ca9f853c9f6798465f2e18fc3f8b950e2d3537d681a40a3c0cc3d032b94Subscribe On Sig...333463322022-09-20 14:19:244 days 2 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003346774901 30.566387508
0xc785f90ba1a86983c06bbd5734392ed69170d646c5cac8edddafa6f0d0f69c1fSubscribe On Sig...333460182022-09-20 14:07:384 days 2 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00433570936 39.598412306
0x052ac11dccb68901be47483cc1995f3eaf643d1523c61de2d8967ab714b03806Subscribe On Sig...333421022022-09-20 11:41:094 days 5 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00499064536 45.58
0xfe2463005aa89f609051efdc730f9ca0cb62f04cf8a4c6aa91e525b4218c3c6eSubscribe On Sig...333354462022-09-20 7:47:524 days 8 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.0038103216 34.800000007
0xd2ec84e1158e84fb84c6cfcd1db20669e846ec4f430eaae3e411de4c85276d23Subscribe On Sig...333086562022-09-19 16:18:485 days 27 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003489488141 31.8698
0x558eb31b04321f5ade9c375f74ff56206b98206b463c93e8c7de8dec58169d0aSubscribe On Sig...332808232022-09-19 0:18:445 days 16 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003928342695 35.877896975
0xc666f1cbc57baa5bb80a58bac42fcf55011f11b48bdc84f0bfa6cad5491c951eSubscribe On Sig...332790702022-09-18 23:18:065 days 17 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003565717987 32.566013844
0x2163b89f779830820584512a69adedce91a08dc6dfc1ad1a99ab576456ff6d37Subscribe On Sig...332788632022-09-18 23:10:575 days 17 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00392609076 35.857329856
0xb5370e542bde66c4a4dbd639aaebdea4af5f727d0c21aefce51a476694a70905Subscribe On Sig...332718192022-09-18 19:04:285 days 21 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.008638918727 78.899999338
0xf50079cde60ad2457c7a4b9684eb4eafbde4e9dcdf7840f3a36885d085abab4aSubscribe On Sig...332633762022-09-18 14:14:106 days 2 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003809519164 34.792671288
0x38d4279635a0ba025c233d3659dbbea49887a2c0a54eb98572e10184084ddacfSubscribe On Sig...331852752022-09-16 16:41:078 days 5 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.005114867429 46.714531015
0xa289c50a8845364f6c5d0be3729148b3f3a1e88ae7735dcdb888ee6e72902fbaSubscribe On Sig...331479672022-09-15 19:08:548 days 21 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003381112959 30.879999999
0x4fb6855a9231da9413430a67535a30cfce0f08063ba76b7dc8d1a863d75150d7Subscribe On Sig...331294602022-09-15 8:28:069 days 8 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.005419853998 49.499999989
0x89f810c8363c93503b2733882429f81bc60369e4b60bdf26a260941820c16745Subscribe On Sig...330645782022-09-13 19:12:2710 days 21 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003998105703 36.515048623
0x3efdd49a70be1251aae50e586e08a4959c3e7b2a7bc125996a195af4a6fc017cSubscribe On Sig...330240792022-09-12 19:41:3411 days 21 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003339506001 30.50000001
0xdfff40213f41973ca14cbddc32aba809396c5eb2f7c7d6104baee755db699cf8Subscribe On Sig...330079322022-09-12 10:19:0012 days 6 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.006663888017 60.861871347
0x8ad1aea533e1c941b1afc8ee12df896c8a8bfb91c539942029e980a274ff9811Subscribe On Sig...329974572022-09-12 4:18:5812 days 12 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.003595717281 32.840000013
[ 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.