Contract 0x219e6e6520889d1F67Cc1ba39dAE26700cEfd989

 

Contract Overview

Balance:
0 MATIC

MATIC Value:
$0.00

Token:
Txn Hash
Block
From
To
Value [Txn Fee]
0xcc5b68a35b4d9a2fa27f43bbd951ad4305e5204a39e4c6b083dc0d8dcfc77762173821022021-07-29 6:11:061 min ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xd826cd9c3f4a30b3c5c5f4f16e89182327ca546ed10ac249b2c8fa670c3a5cee173820952021-07-29 6:10:522 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x7b2dd01156dc690e0bd056b35baef3ab4258842e220740a5c662daf168e870bd173820952021-07-29 6:10:522 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x271e4405f66f39a712b22a17003af525ea076c1c65bc0a447baeb36c39291361173820172021-07-29 6:04:048 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x539652dd6238d9edec2007e7c38e1a21e58fbc4a8d705c6b0eba81d4d4a9af25173818092021-07-29 5:56:4416 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xbe409a04ffeb7b8d52550184eee1393c496f688468343558a8267e80303f282d173818092021-07-29 5:56:4416 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xc90c11427232cb30e0273b60b975453427bdc24e2421b0975bd5c1e0b0bb018e173815862021-07-29 5:44:5028 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xe6f8e1a6fbbeb779bb4edfe65639604967459e6a83cc065a28f04f374b24a50e173814852021-07-29 5:41:2031 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x572f216158369649949a1b4b870682ed145f86f9caae64f5ffd7399504ec8fee173814382021-07-29 5:39:4233 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xb1a8a965d1d7e347070fa2ef0b3e857a33f52312ba5f59a93255bca43a01427d173814372021-07-29 5:39:4033 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x5ce05a746a70b8834d9171b8efa9799dadbe7e4bc28a67376441a21006f2a6df173814372021-07-29 5:39:4033 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x53f917784cb03e791df1a3dc64add010b01a81f111dec41a5f3a6f2e181c00c3173814372021-07-29 5:39:4033 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x0d2b3cd93ea87482328257c0412a395cced65dc80a98c4ba66f8447a737a343b173811782021-07-29 5:26:3046 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xd1b10f30e04ca13698dae5230206e881e0f9cf1b6d47bb8cf56fa768fb608e27173809472021-07-29 5:18:3454 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xe6a24f0dd8af750f760da1d4359ca417e081134c1e002a3d4c8d5ead80579075173808772021-07-29 5:12:501 hr ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xe79807343a9b2e8da34a2c41cc63badcfcff33b50518bfd25e3083b29034771d173808242021-07-29 5:10:041 hr 2 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xd1f8b039e59980a728fcceb883c9985002b2c144db455172139f9a04fcbb177b173807152021-07-29 5:06:181 hr 6 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x45d1a33fd9f293f7d43197241163e35ca5b8157d16a51f898be5a51e2f7a2aa6173807012021-07-29 5:05:501 hr 7 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x232673d841c55a2696fcf1036676985584738094140de86665807849b012126a173805952021-07-29 5:02:101 hr 10 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.00021896
0x077b56dc409edc32fb5a1461e533a85991b86f6b7904b6b6d120738c0009394f173805002021-07-29 4:56:041 hr 16 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xc845c44079db32769b9f29b89e13fb6f6fada4c02e406fe428d27181d3b24d55173804892021-07-29 4:54:581 hr 17 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x202d6d8326de55e6f8f4ce6d4c88a6b61c70bab2b1008dba4622fe1bd8c6e27b173804892021-07-29 4:54:581 hr 17 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xca80d4e4a2000fd6aa4d171aaaf30d6423597f2a89529dfc227c25df53030393173804272021-07-29 4:52:101 hr 20 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0x13edddf0ea8236d6b7c32dbd477bd11b25745cff92580e01df6f6c55da06979d173802162021-07-29 4:44:521 hr 28 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
0xc78024c6d1cef6007807b8c3abd53334dac3f5e8ca565f8f71e5839a606faf2f173801722021-07-29 4:43:241 hr 29 mins ago0xcb58388e139ac9215a483660b426bea78689f38d IN  0x219e6e6520889d1f67cc1ba39dae26700cefd9890 MATIC0.000218984
[ 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 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

-----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.