Contract 0x219e6e6520889d1F67Cc1ba39dAE26700cEfd989 1

 
Ad
Ad
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x24ededf6be7c84a5ab237d8a195f196e95d87248e00c2692ca594ebd12a84f9cSubscribe On Sig...195452322021-09-26 18:52:1821 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x4dfca2ca89d5f053005660c221bf09f3c7177f6f3a0db5c0122b8f6847f5852aSubscribe On Sig...195449832021-09-26 18:40:1633 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x30f7347412357de22a7fcf9094326ccebb45fafd292a29643c04adfccb15b49fSubscribe On Sig...195449402021-09-26 18:37:5836 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xc12bb78384122254a6e2dbf6653a67ca7f25a712fa4fc31b8cea96f437597bedSubscribe On Sig...195446312021-09-26 18:26:3047 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x00bf9156526f0c0f266afab125b7ba7063f2722436315c2468b3f3ebb56f1dcfSubscribe On Sig...195434152021-09-26 17:40:251 hr 33 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.0021896
0xac30ca7833970695f909555cd20913bf8fcfb5723ee32faac1a1f7e02736b5cdSubscribe On Sig...195417632021-09-26 16:38:382 hrs 35 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xf7823598fbe3ab19b6adab9e37598927571ddd84cfeaa8da78f0275d4d11d14aSubscribe On Sig...195402192021-09-26 15:40:583 hrs 33 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xdbce866b8fc1a5808a627640cd7206b36812acf5a76b858a7c85e7f0c7464f92Subscribe On Sig...195389742021-09-26 14:51:274 hrs 22 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xb9efc023a59a55f4b7c1beee51fb43ce0e32fd774853a4ef1d142b6d0f749116Subscribe On Sig...195388312021-09-26 14:46:334 hrs 27 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x2c0650e8c60f10bb01a0337f30a0f3c880974e91e23c162d55eae0b5da62865dSubscribe On Sig...195385622021-09-26 14:37:194 hrs 36 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xce128299647609d9445c6f32fce431e4c113f1bcfd0deb68b7aa2de88241ca2aSubscribe On Sig...195381232021-09-26 14:19:344 hrs 54 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xfd23168184aa73f164c363aaa1348e3c9783eb2973ddbb41a7965ac5f1eae274Subscribe On Sig...195374942021-09-26 13:53:165 hrs 20 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xd4c0e70c87d53de58b4a1f4256817b07753fb281542e432b9f15c653f7eaa286Subscribe On Sig...195368242021-09-26 13:28:025 hrs 46 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x66640b2d67d017a4a8aff044f15a47aa06f65d1f448f3f7aa059b0c2d649e376Subscribe On Sig...195361592021-09-26 12:58:466 hrs 15 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x6f2d1327b520676a0801fa3bb59fbb8d442722b0d79d0ab813e33b6d42061e1cSubscribe On Sig...195360452021-09-26 12:54:506 hrs 19 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x1ce88188f3c8bb94a32f96dda0e3d91ce2a1ca4d30147ce952e5396d365918cfSubscribe On Sig...195359912021-09-26 12:52:586 hrs 21 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x7ce5aeeee3ff3279c6d2426f2dee9e7c2000b8a502ce7d88634cf493aabc7481Subscribe On Sig...195359242021-09-26 12:50:406 hrs 23 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x80d2b402772786c3128db627122da09617c03b2787778c97e76d0dffa654ee40Subscribe On Sig...195358622021-09-26 12:48:306 hrs 25 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.0021896
0x598a50c6a2c90d06c2c3e8dc07832332e29019cd496a7ad2fc8e9dd507f57decSubscribe On Sig...195355772021-09-26 12:38:446 hrs 35 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x95a21e7d5e486dbc10e6f99f2eb9d775d4a11d027f05be2178b715cd27f94768Subscribe On Sig...195349132021-09-26 12:13:527 hrs ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x422def27ab629076cd6d1bfa161ad11e0bb5e6e9452004b31b97959c16d0b26aSubscribe On Sig...195313982021-09-26 9:58:209 hrs 15 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xf1e6a30893395e8158338ccfb049f981f3b7ff23630515a23050a8a5dc481dfdSubscribe On Sig...195300192021-09-26 9:08:4610 hrs 5 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x726acceffbaf68b55f56d45e3d65b636f5d30176adcd952443a5cdfb2fb88a5cSubscribe On Sig...195299782021-09-26 9:07:2010 hrs 6 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0xb44e2c1b5f4f36269c0d6d1510d3a1eb7da694558afc0050e8a4ef6e5c3ba671Subscribe On Sig...195299382021-09-26 9:06:0010 hrs 8 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
0x5a74f02038802a6caf0c79940004345c61c7f8ba19a727c80c09a177b2191c5dSubscribe On Sig...195299032021-09-26 9:04:4610 hrs 9 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00218984
[ 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.