Contract Address Details

0x616e317FceB00d16D71855323d24105D2012D75D

WhitelistMatic Last Balance Update: Block #7463765
Created by 0x3c2c–0675c4 at 0x815c–4ca441

Balance

0 MATIC

(@ /MATIC)

Fetching tokens...

Contract name:
WhitelistMatic




Optimization enabled
true
Compiler version
v0.6.10+commit.00c0fcaf




Optimization runs
1337
EVM Version
default

Constructor Arguments

000000000000000000000000cb58388e139ac9215a483660b426bea78689f38d0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000e59af21fa6e9afff780ae3193301c0effe3d79d000000000000000000000000000000000000000000000000000000000000009a000000000000000000000000000000000000000000000000000000000000000480000000000000000000000005441bf9aa27e79c7aa4a8d1b340d16973695dee10000000000000000000000009d7007416e7ccb2c352463d42640acc6c95eda6e000000000000000000000000c24f97bb1d7a75d9f986c99dfcfa2a558058904c0000000000000000000000004b8d2447f6c07abd5f26ae0d1228b8a2e22647120000000000000000000000008cf465f396cdbffc31b5305391d403fa2b4e3f44000000000000000000000000a2381223639181689cd6c46d38a1a4884bb6d83c000000000000000000000000a5be3060605c97ca38fc0568f5e51cbdbf620d3a000000000000000000000000d42aeae643cd863a3ccc1484d2b43dd289fac0010000000000000000000000009b83cabacb296bcee80a8fc4562805a0b63a2ced0000000000000000000000009a0cf297c8143d8e08296f5257ba81081b1a2e5b0000000000000000000000005d3b0e94d3372b0a436ee3a7ebca0be472dfc0c7000000000000000000000000a8da576545b65c91fd04e517b22490cd85da501a00000000000000000000000078805dd0a19ac89af3cc334c79330e6ad9cdaf0c000000000000000000000000d914a19f0e1420ace988b01863cf68a85c4ae554000000000000000000000000e9421ceb7eb2ed9c535f8ecf448d9c00c3ece0590000000000000000000000001114cd70cfd66592e0b73c0bc577fb06694624fb00000000000000000000000000a7c209c6282cb10b36ab34ec635f48a8e37e1c00000000000000000000000090407b81b697bcd2fab04bbf0f11d96d2859e3d80000000000000000000000006b1e722f7783c65757e92b1eaa98d6860f0581d9000000000000000000000000f5b502edabf38b46dcf1f00cd08c89e7b72766f900000000000000000000000078672830d19ec5595f357c19bcff1e995ac708e2000000000000000000000000c964dc7ed61a47a599183d968245c0df50b0f510000000000000000000000000cf2cdc39afd1c6c49a38e2d1d798b3d1147db2e1000000000000000000000000ca4dc5fc7665346fcc2b68abac7252903007ada60000000000000000000000007328446b2a45920a78e11e6c6628a1549178f4e3000000000000000000000000df2ce9b473898f9959252ef2ae69af104960ab5200000000000000000000000085949325f584c37058e52e2cc5e1e55d4aaf6c68000000000000000000000000c7c652c842a6b67654ee38b928f6328425a1d259000000000000000000000000486e03258ec1eb261080d2b1e2395db9607fa0e7000000000000000000000000c55f18f30f6d0ad39a879dfdb5be94fbebc61f150000000000000000000000004a263f7416345f9d25fa2d4ac242f2d63db0ba16000000000000000000000000642a21829dfd2fc84e9717661159efa5119891a5000000000000000000000000a7b33cd26f27f1c6b709db5cae442e42387ba69a000000000000000000000000445ba6f9f553872fa9cdc14f5c0639365b39c14000000000000000000000000037b2199f06ce7c100bb2a4c45bfc0bd895bd5c00000000000000000000000000e1cda441ffa203eca692e3398f3c3346ee2b786e0000000000000000000000006e0ea3db88b9c1c72cda80b1bead95cb84deebc00000000000000000000000003097bfe7ae48454d04f19fae50e159f871b7c9a0000000000000000000000000c7ded8d808fc92e2f1696bf8b130e3f9984c7529000000000000000000000000f022c36029cd2516c1d6e45200118df8160501e500000000000000000000000033b9d76e0279cae767c007e45ddb0206e78d295400000000000000000000000062eb3e90696d302f80c48d859943f0e24482343600000000000000000000000043c7fb67850bdbca289bcefc8f7ad2e218a7955d000000000000000000000000d1eddfcc4596cc8bd0bd7495beab9b979fc503360000000000000000000000003e6d16933c6ee697aabe2f437d696ecd0b74af66000000000000000000000000b9fedb203920981e26d84a4dea867b4927085074000000000000000000000000973ade00c477ed794f5372d571a0160ed0a5ec43000000000000000000000000686ec32c61ae7d3ff16e26403ebea633274cdfb900000000000000000000000021d9a66a0a68d66c02104f3cdb9cee10b1470510000000000000000000000000851ebdf713e1b07d9859d090c9af25214dd1813d00000000000000000000000053422d7da1334bab84a5ee9b70e1c5f39f635a0b0000000000000000000000007a759facfa62c35c40025a3445a357b1910fa1d200000000000000000000000011212865eee18f141014fa262aa7ee6d09a1a7d20000000000000000000000006954d0255cfed71d55ad8b371b4170b8bf7709dc000000000000000000000000dfea4be32b1f777d82a6389a0d4f399569c46202000000000000000000000000bd0b197f1de8f0cb6efa059f51039535aa66604c00000000000000000000000045c374ce0c5e36cd1bc751577673583b4d61fd33000000000000000000000000262a29b47708c95079c8d29bcbb4b1b48e8c6f5f0000000000000000000000009f0574a5f28779a1a682cfe4bbd090ee058d07aa000000000000000000000000b6d820e80a2a7c49f94c9d6c8ea08dccedc9ce4c0000000000000000000000002cffaf39f38e46356083cee0df3b92496fde85d8000000000000000000000000edd15d52406074b18e6b38ad29a83ee84864babc000000000000000000000000bce3bd3b206946abbe094903ae2b4244b52fb4e90000000000000000000000007f8d82d0d413627575b3b726060bc6f0904d1f150000000000000000000000006186290b28d511bff971631c916244a9fc539cfe000000000000000000000000bbce57c4604149f97a10eaa4a718bc8f88b2e2b4000000000000000000000000507dadeace4af88cc7e9645a521a75cf9b6ff45d00000000000000000000000094dbc4e8c818609a9304df7e4fc4fc2749fa01d50000000000000000000000002d1e70b9a850634059e81a05208633ef03408e790000000000000000000000003eeb5bbe2a6aaa7e9d6a56306c0354d298191dc400000000000000000000000055d4d7f40a3a527768d7b19f4eaedf73687f89cc000000000000000000000000a8bafc88e36ba1223dff19452309f96e1b351e6700000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
              

Contract source code

/**
* Submitted for verification at blockscout.com on 2020-08-02 07:40:53.665235Z
*/
pragma solidity ^0.6.0;
/**
@author The Calystral Team
@title A parent contract which can be used to keep track of a current contract state
*/
contract ContractState {
/// @dev Get the current contract state enum.
State private _currentState;
/**
@dev Get the current contract state enum.
First activation == 1.
*/
uint256 private _activatedCounter;
/**
@dev Get the current contract state enum.
First inactivation == 1.
*/
uint256 private _inactivatedCounter;
/// @dev Includes all three possible contract states.
enum State {CREATED, INACTIVE, ACTIVE}
modifier isCurrentState(State _state) {
_isCurrentState(_state);
_;
}
modifier isCurrentStates(State _state1, State _state2) {
_isCurrentStates(_state1, _state2);
_;
}
modifier isAnyState() {
_;
}
/**
@notice Get the current contract state.
@dev Get the current contract state enum.
@return The current contract state
*/
function getCurrentState() public view returns (State) {
return _currentState;
}
/**
@notice Get the current activated counter.
@dev Get the current activated counter.
@return The current activated counter.
*/
function getActivatedCounter() public view returns (uint256) {
return _activatedCounter;
}
/**
@notice Get the current inactivated counter.
@dev Get the current inactivated counter.
@return The current inactivated counter.
*/
function getInactivatedCounter() public view returns (uint256) {
return _inactivatedCounter;
}
/**
@dev Checks if the contract is in the correct state for execution.
MUST revert if the `_currentState` does not match with the required `_state`.
*/
function _isCurrentState(State _state) internal view {
require(
_currentState == _state,
"The function call is not possible in the current contract state."
);
}
/**
@dev Checks if the contract is in one of the correct states for execution.
MUST revert if the `_currentState` does not match with one of the required states `_state1`, `_state2`.
*/
function _isCurrentStates(State _state1, State _state2) internal view {
require(
_currentState == _state1 || _currentState == _state2,
"The function call is not possible in the current contract state."
);
}
/**
@dev Modifies the contract state from State.CREATED or State.ACTIVE into State.INACTIVE.
Increments the `_inactivatedCounter`.
*/
function _transitionINACTIVE()
internal
isCurrentStates(State.CREATED, State.ACTIVE)
{
_currentState = State.INACTIVE;
_inactivatedCounter++;
_inactivated(_inactivatedCounter);
}
/**
@dev Modifies the contract state from State.INACTIVE into State.ACTIVE.
Increments the `_activatedCounter`.
*/
function _transitionACTIVE() internal isCurrentState(State.INACTIVE) {
_currentState = State.ACTIVE;
_activatedCounter++;
_activated(_activatedCounter);
}
/**
@dev Executes when the contract is set into State.ACTIVE.
The child contract has to override this function to make use of it.
The `activatedCouted` parameter is used to execute this function at a specific time only once.
@param activatedCounter The `activatedCouted` for which the function should be executed once.
*/
function _activated(uint256 activatedCounter)
internal
virtual
isCurrentState(State.ACTIVE)
{}
/**
@dev Executes when the contract is set into State.INACTIVE.
The child contract has to override this function to make use of it.
The `inactivatedCouted` parameter is used to execute this function at a specific time only once.
@param inactivatedCounter The `inactivatedCouted` for which the function should be executed once.
*/
function _inactivated(uint256 inactivatedCounter)
internal
virtual
isCurrentState(State.INACTIVE)
{}
}
/**
@author The Calystral Team
@title The Registry's Interface
*/
interface IRegistry {
/**
@notice Updates an incoming contract address for relevant contracts or itself.
@dev Updates an incoming contract address for relevant contracts or itself.
Sets itself INACTIVE if it was updated by the registry.
Sets itself ACTIVE if it was registered by the registry.
@param contractAddress The address of the contract update
@param id The id of the contract update
*/
function updateContractAddress(address contractAddress, uint256 id)
external;
/**
@notice Get the contract address of a specific id.
@dev Get the contract address of a specific id.
@param id The contract id
@return The contract address of a specific id
*/
function getContractAddress(uint256 id) external view returns (address);
/**
@notice Get if a specific id is relevant for this contract.
@dev Get if a specific id is relevant for this contract.
@param id The contract id
@return If the id is relevant for this contract
*/
function isIdRelevant(uint256 id) external view returns (bool);
/**
@notice Get the list of relevant contract ids.
@dev Get the list of relevant contract ids.
@return The list of relevant contract ids.
*/
function getRelevantList() external view returns (uint16[] memory);
/**
@notice Get this contract's registry id.
@dev Get this contract's `_registryId`.
@return Get this contract's registry id.
*/
function getRegistryId() external view returns (uint256);
}
/**
* @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);
}
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts may inherit from this and call {_registerInterface} to declare
* their support of an interface.
*/
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() internal {
// 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
override
view
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 A parent contract which can be used to integrate with a global contract registry
*/
contract Registry is IRegistry, ContractState, ERC165 {
/// @dev id => contract address
mapping(uint256 => address) private _idToContractAddress;
/// @dev id => a bool showing if it is relevant for updates etc.
mapping(uint256 => bool) private _idToIsRelevant;
/**
@dev This list includes all Ids of contracts that are relevant for this contract listening on address updates in the future.
This should be immutable but immutable variables cannot have a non-value type.
*/
uint16[] private _relevantList;
/**
@dev The id of this contract.
Id 0 does not exist but is just reserved.
Whenever a contract is INACTIVE its id is set to 0.
*/
uint256 private _registryId;
modifier isAuthorizedRegistryManager() {
_isAuthorizedRegistryManager();
_;
}
modifier isAuthorizedAny() {
_;
}
/**
@notice Initialized and creates the contract including the address of the RegistryManager and a list of relevant contract ids.
@dev Creates the contract with an initialized `registryManagerAddress` and `relevantList`.
Registers this interface for ERC-165.
MUST revert if the `relevantList` does not include id 1 at index 0.
@param registryManagerAddress Address of the RegistryManager contract
@param relevantList Array of ids for contracts that are relevant for execution and are tracked for updates
*/
constructor(address registryManagerAddress, uint16[] memory relevantList)
public
{
require(
relevantList[0] == 1,
"The registry manager is required to create a registry type contract."
);
_idToContractAddress[1] = registryManagerAddress;
_relevantList = relevantList;
for (uint256 i = 0; i < relevantList.length; i++) {
_idToIsRelevant[relevantList[i]] = true;
}
_registerInterface(type(IRegistry).interfaceId); // 0x7bbb2267
}
/**
@notice Updates an incoming contract address for relevant contracts or itself.
@dev Updates an incoming contract address for relevant contracts or itself.
Sets itself INACTIVE if it was updated by the registry.
Sets itself ACTIVE if it was registered by the registry.
@param contractAddress The address of the contract update
@param id The id of the contract update
*/
function updateContractAddress(address contractAddress, uint256 id)
external
override
isCurrentStates(State.ACTIVE, State.INACTIVE)
isAuthorizedRegistryManager()
{
// only execute if it's an relevant contract or this contract
if (
_idToIsRelevant[id] == true ||
contractAddress == address(this) ||
id == _registryId
) {
// if this contract was updated, set INACTIVE
if (id == _registryId) {
_registryId = 0;
_transitionINACTIVE();
} else {
// if this contract got registered, set ACTIVE
if (contractAddress == address(this)) {
_registryId = id;
_transitionACTIVE();
}
_idToContractAddress[id] = contractAddress;
}
}
}
/**
@notice Get the contract address of a specific id.
@dev Get the contract address of a specific id.
@param id The contract id
@return The contract address of a specific id
*/
function getContractAddress(uint256 id)
public
override
view
returns (address)
{
return _idToContractAddress[id];
}
/**
@notice Get if a specific id is relevant for this contract.
@dev Get if a specific id is relevant for this contract.
@param id The contract id
@return If the id is relevant for this contract
*/
function isIdRelevant(uint256 id) public override view returns (bool) {
return _idToIsRelevant[id];
}
/**
@notice Get the list of relevant contract ids.
@dev Get the list of relevant contract ids.
@return The list of relevant contract ids.
*/
function getRelevantList() public override view returns (uint16[] memory) {
return _relevantList;
}
/**
@notice Get this contract's registry id.
@dev Get this contract's `_registryId`.
@return Get this contract's registry id.
*/
function getRegistryId() public override view returns (uint256) {
return _registryId;
}
/**
@dev Checks if the msg.sender is the RegistryManager.
Reverts if msg.sender is not the RegistryManager.
*/
function _isAuthorizedRegistryManager() internal view {
require(
msg.sender == _idToContractAddress[1],
"Unauthorized call. Thanks for supporting the network with your ETH."
);
}
}
/// @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 WhitelistMatic is Registry {
/// @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;
/// @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 Address of the ListAdmin.
address private immutable _listAdminAddress;
/**
@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);
/// @notice This modifier prevents other smart contracts from subscribing.
modifier isNotAContract() {
require(
msg.sender == tx.origin,
"Contracts are not allowed to interact."
);
_;
}
/// @notice This modifier allows the ListAdmin to subscribe users on sign-up.
modifier isAuthorizedListAdmin() {
require(
_listAdminAddress == msg.sender,
"Unauthorized call. Thanks for supporting the network with your MATIC."
);
_;
}
/**
@notice Creates the smart contract and initializes the whitelist.
@dev The constructor, which initializes the whitelist with all the subscribers from the legacy contract. Legacy subscribers are initialized by the current block number.
@param subscriberList Address of the list admin
@param subscriberList All subsribers that already signed up on Ethereum
@param registryManagerAddress Address of the RegistryManager contract
@param relevantList Array of ids for contracts that are relevant for execution and are tracked for updates
*/
constructor(
address listAdminAddress,
address[] memory subscriberList,
address registryManagerAddress,
uint16[] memory relevantList
) public Registry(registryManagerAddress, relevantList) {
_listAdminAddress = listAdminAddress;
for (uint256 i = 0; i < subscriberList.length; i++) {
_subscribe(subscriberList[i]);
}
_transitionINACTIVE();
}
/**
@notice Calls the subscribe function if no specific function was called.
@dev Fallback function forwards to subscribe function.
*/
fallback() external {
subscribe();
}
/**
@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()
public
isNotAContract()
isCurrentState(State.ACTIVE)
isAuthorizedAny()
{
_subscribe(msg.sender);
}
/**
@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)
public
isCurrentState(State.ACTIVE)
isAuthorizedListAdmin()
{
_subscribe(user);
}
/**
@notice Any user can revoke his or her subscription.
@dev Deletes the index entry in the _subscriberIndexToAddress mapping for the message sender.
*/
function unsubscribe()
public
isNotAContract()
isAnyState()
isAuthorizedAny()
{
require(isSubscriber(msg.sender) != 0, "You have not subscribed yet.");
uint256 index = _subscriberAddressToSubscribed[msg.sender];
delete _subscriberIndexToAddress[index];
emit OnUnsubscribed(msg.sender);
}
/**
@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() public view returns (uint256) {
return isSubscriber(tx.origin);
}
/**
@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)
public
view
returns (uint256)
{
if (
_subscriberIndexToAddress[_subscriberAddressToSubscribed[_subscriberAddress]] !=
address(0)
) {
return _subscriberAddressToBlockNumber[_subscriberAddress];
} else {
return 0;
}
}
/**
@notice Shows the whole subscriber list.
@dev Returns all current subscribers as an address array.
@return A list of subscriber addresses.
*/
function getSubscriberList() public view 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;
}
/**
@notice Shows the count of subscribers.
@dev Returns the subscriber count as an integer.
@return The count of subscribers
*/
function getSubscriberCount() public view returns (uint256) {
uint256 subscriberListCount = 0;
for (uint256 i = 1; i < _subscriberIndex; i++) {
address subscriberAddress = _subscriberIndexToAddress[i];
if (isSubscriber(subscriberAddress) != 0) {
subscriberListCount++;
}
}
return subscriberListCount;
}
/**
@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

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"listAdminAddress","internalType":"address"},{"type":"address[]","name":"subscriberList","internalType":"address[]"},{"type":"address","name":"registryManagerAddress","internalType":"address"},{"type":"uint16[]","name":"relevantList","internalType":"uint16[]"}]},{"type":"event","name":"OnSubscribed","inputs":[{"type":"address","name":"_subscriberAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OnUnsubscribed","inputs":[{"type":"address","name":"_subscriberAddress","internalType":"address","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"nonpayable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getActivatedCounter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getContractAddress","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum ContractState.State"}],"name":"getCurrentState","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getInactivatedCounter","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getRegistryId","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint16[]","name":"","internalType":"uint16[]"}],"name":"getRelevantList","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getSubscriberCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"}],"name":"getSubscriberList","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isIdRelevant","inputs":[{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"isSubscriber","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"isSubscriber","inputs":[{"type":"address","name":"_subscriberAddress","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"subscribe","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"subscribeOnSignUp","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"supportsInterface","inputs":[{"type":"bytes4","name":"interfaceId","internalType":"bytes4"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unsubscribe","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateContractAddress","inputs":[{"type":"address","name":"contractAddress","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]}]
            

Contract Byte Code

0x608060405234801561001057600080fd5b50600436106101005760003560e01c80636d13956b11610097578063aefa7d9811610066578063aefa7d9814610266578063c4804ef01461029f578063fb479d9b146102c5578063fcae4484146102f157610100565b80636d13956b14610230578063839f2387146102385780638b8291be146102405780638f449a051461010057610100565b8063378aa701116100d3578063378aa7011461019c57806339bd89c2146101c857806351d5d80d146101d05780636af51c5e1461022857610100565b806301ffc9a71461010a57806317e703ab1461015d5780631fcb4ee41461017757806329e04b511461017f575b6101086102f9565b005b6101496004803603602081101561012057600080fd5b50357fffffffff000000000000000000000000000000000000000000000000000000001661034e565b604080519115158252519081900360200190f35b610165610389565b60408051918252519081900360200190f35b6101656103d5565b6101496004803603602081101561019557600080fd5b50356103e5565b6101a46103fa565b604051808260028111156101b457fe5b60ff16815260200191505060405180910390f35b610165610403565b6101d8610409565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102145781810151838201526020016101fc565b505050509050019250505060405180910390f35b6101656104ce565b6101d86104d4565b610165610554565b6101086004803603602081101561025657600080fd5b50356001600160a01b031661055a565b6102836004803603602081101561027c57600080fd5b50356105d9565b604080516001600160a01b039092168252519081900360200190f35b610165600480360360208110156102b557600080fd5b50356001600160a01b03166105f4565b610108600480360360408110156102db57600080fd5b506001600160a01b03813516906020013561064a565b610108610710565b3332146103375760405162461bcd60e51b8152600401808060200182810382526026815260200180610b4c6026913960400191505060405180910390fd5b600261034281610817565b61034b33610870565b50565b7fffffffff00000000000000000000000000000000000000000000000000000000811660009081526003602052604090205460ff165b919050565b60008060015b600b548110156103cf576000818152600860205260409020546001600160a01b03166103ba816105f4565b156103c6576001909201915b5060010161038f565b50905090565b60006103e0326105f4565b905090565b60009081526005602052604090205460ff1690565b60005460ff1690565b60025490565b6060600080610416610389565b905060608167ffffffffffffffff8111801561043157600080fd5b5060405190808252806020026020018201604052801561045b578160200160208202803683370190505b50905060015b600b548110156104c6576000818152600860205260409020546001600160a01b031661048c816105f4565b156104bd578083868151811061049e57fe5b6001600160a01b03909216602092830291909101909101526001909401935b50600101610461565b509250505090565b60075490565b6060600680548060200260200160405190810160405280929190818152602001828054801561054a57602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116105115790505b5050505050905090565b60015490565b600261056581610817565b7f000000000000000000000000cb58388e139ac9215a483660b426bea78689f38d6001600160a01b031633146105cc5760405162461bcd60e51b8152600401808060200182810382526045815260200180610ac46045913960600191505060405180910390fd5b6105d582610870565b5050565b6000908152600460205260409020546001600160a01b031690565b6001600160a01b03818116600090815260096020908152604080832054835260089091528120549091161561064257506001600160a01b0381166000908152600a6020526040902054610384565b506000610384565b60026001610658828261095e565b6106606109dc565b60008381526005602052604090205460ff1615156001148061068a57506001600160a01b03841630145b80610696575060075483145b1561070a576007548314156106b75760006007556106b2610a50565b61070a565b6001600160a01b0384163014156106d55760078390556106d5610a82565b6000838152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386161790555b50505050565b33321461074e5760405162461bcd60e51b8152600401808060200182810382526026815260200180610b4c6026913960400191505060405180910390fd5b610757336105f4565b6107a8576040805162461bcd60e51b815260206004820152601c60248201527f596f752068617665206e6f742073756273637269626564207965742e00000000604482015290519081900360640190fd5b336000818152600960209081526040808320548084526008835292819020805473ffffffffffffffffffffffffffffffffffffffff1916905580519384525191927f8d2aae3bd92acf221b185992d11dffa4ff32f3b5f8d9a474d3b7a6ccf067a321929081900390910190a150565b80600281111561082357fe5b60005460ff16600281111561083457fe5b1461034b5760405162461bcd60e51b8152600401808060200182810382526040815260200180610b726040913960400191505060405180910390fd5b610879816105f4565b156108cb576040805162461bcd60e51b815260206004820152601760248201527f596f7520616c726561647920737562736372696265642e000000000000000000604482015290519081900360640190fd5b600b80546001600160a01b038316600081815260096020908152604080832094909455600a8152838220439055845482526008815290839020805473ffffffffffffffffffffffffffffffffffffffff1916831790558354600101909355815190815290517fea9dde00ed9f1133889d723ccfcd41c6d6cc3120be2c167eae94d8b65b463f01929181900390910190a150565b81600281111561096a57fe5b60005460ff16600281111561097b57fe5b14806109a1575080600281111561098e57fe5b60005460ff16600281111561099f57fe5b145b6105d55760405162461bcd60e51b8152600401808060200182810382526040815260200180610b726040913960400191505060405180910390fd5b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05546001600160a01b03163314610a4e5760405162461bcd60e51b8152600401808060200182810382526043815260200180610b096043913960600191505060405180910390fd5b565b60006002610a5e828261095e565b6000805460ff1916600190811790915560028054909101908190556105d590610aad565b6001610a8d81610817565b6000805460ff191660021790556001805481019081905561034b90610ab8565b60016105d581610817565b60026105d58161081756fe556e617574686f72697a65642063616c6c2e205468616e6b7320666f7220737570706f7274696e6720746865206e6574776f726b207769746820796f7572204d415449432e556e617574686f72697a65642063616c6c2e205468616e6b7320666f7220737570706f7274696e6720746865206e6574776f726b207769746820796f7572204554482e436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7465726163742e5468652066756e6374696f6e2063616c6c206973206e6f7420706f737369626c6520696e207468652063757272656e7420636f6e74726163742073746174652ea264697066735822122039c2df2fefab3c30f82ae29683b5842a481710518934a1014b05d5422b891abc64736f6c634300060a0033