ETH Price: $3,910.77 (+0.65%)

Contract

0x77A4e01C20d4a67372f300297fB69Da981c19755
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 26 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
213969962024-12-13 23:53:111 hr ago1734133991
0x77A4e01C...981c19755
0 ETH
213969962024-12-13 23:53:111 hr ago1734133991
0x77A4e01C...981c19755
0 ETH
213969602024-12-13 23:45:471 hr ago1734133547
0x77A4e01C...981c19755
0 ETH
213969602024-12-13 23:45:471 hr ago1734133547
0x77A4e01C...981c19755
0 ETH
213942272024-12-13 14:35:5910 hrs ago1734100559
0x77A4e01C...981c19755
0 ETH
213942272024-12-13 14:35:5910 hrs ago1734100559
0x77A4e01C...981c19755
0 ETH
213942012024-12-13 14:30:4710 hrs ago1734100247
0x77A4e01C...981c19755
0 ETH
213942012024-12-13 14:30:4710 hrs ago1734100247
0x77A4e01C...981c19755
0 ETH
213932302024-12-13 11:16:1113 hrs ago1734088571
0x77A4e01C...981c19755
0 ETH
213932302024-12-13 11:16:1113 hrs ago1734088571
0x77A4e01C...981c19755
0 ETH
213912352024-12-13 4:35:1120 hrs ago1734064511
0x77A4e01C...981c19755
0 ETH
213912352024-12-13 4:35:1120 hrs ago1734064511
0x77A4e01C...981c19755
0 ETH
213910832024-12-13 4:04:3520 hrs ago1734062675
0x77A4e01C...981c19755
0 ETH
213910832024-12-13 4:04:3520 hrs ago1734062675
0x77A4e01C...981c19755
0 ETH
213910802024-12-13 4:03:5920 hrs ago1734062639
0x77A4e01C...981c19755
0 ETH
213910802024-12-13 4:03:5920 hrs ago1734062639
0x77A4e01C...981c19755
0 ETH
213909022024-12-13 3:28:1121 hrs ago1734060491
0x77A4e01C...981c19755
0 ETH
213909022024-12-13 3:28:1121 hrs ago1734060491
0x77A4e01C...981c19755
0 ETH
213903042024-12-13 1:27:4723 hrs ago1734053267
0x77A4e01C...981c19755
0 ETH
213903042024-12-13 1:27:4723 hrs ago1734053267
0x77A4e01C...981c19755
0 ETH
213844872024-12-12 5:58:5943 hrs ago1733983139
0x77A4e01C...981c19755
0 ETH
213844872024-12-12 5:58:5943 hrs ago1733983139
0x77A4e01C...981c19755
0 ETH
213841822024-12-12 4:57:3544 hrs ago1733979455
0x77A4e01C...981c19755
0 ETH
213841822024-12-12 4:57:3544 hrs ago1733979455
0x77A4e01C...981c19755
0 ETH
213838072024-12-12 3:42:2345 hrs ago1733974943
0x77A4e01C...981c19755
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StakingContractHandler

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 10000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-11-04
*/

// File: contracts/spec_interfaces/IStakingContractHandler.sol

// SPDX-License-Identifier: MIT

pragma solidity 0.6.12;

/// @title Staking contract handler contract interface in addition to IStakeChangeNotifier
interface IStakingContractHandler {
    event StakeChangeNotificationSkipped(address indexed stakeOwner);
    event StakeChangeBatchNotificationSkipped(address[] stakeOwners);
    event StakeMigrationNotificationSkipped(address indexed stakeOwner);

    /*
    * External functions
    */

    /// Returns the stake of the specified stake owner (excluding unstaked tokens).
    /// @param stakeOwner address The address to check.
    /// @return uint256 The total stake.
    function getStakeBalanceOf(address stakeOwner) external view returns (uint256);

    /// Returns the total amount staked tokens (excluding unstaked tokens).
    /// @return uint256 is the total staked tokens of all stake owners.
    function getTotalStakedTokens() external view returns (uint256);

    /*
    * Governance functions
    */

    event NotifyDelegationsChanged(bool notifyDelegations);

    /// Sets notifications to the delegation contract
    /// @dev staking while notifications are disabled may lead to a discrepancy in the delegation data  
    /// @dev governance function called only by the migration manager
    /// @param notifyDelegations is a bool indicating whether to notify the delegation contract
    function setNotifyDelegations(bool notifyDelegations) external; /* onlyMigrationManager */

    /// Returns the notifications to the delegation contract status
    /// @return notifyDelegations is a bool indicating whether notifications are enabled
    function getNotifyDelegations() external view returns (bool);
}

// File: contracts/IStakeChangeNotifier.sol

pragma solidity 0.6.12;

/// @title An interface for notifying of stake change events (e.g., stake, unstake, partial unstake, restate, etc.).
interface IStakeChangeNotifier {
    /// @dev Notifies of stake change event.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount uint256 The difference in the total staked amount.
    /// @param _sign bool The sign of the added (true) or subtracted (false) amount.
    /// @param _updatedStake uint256 The updated total staked amount.
    function stakeChange(address _stakeOwner, uint256 _amount, bool _sign, uint256 _updatedStake) external;

    /// @dev Notifies of multiple stake change events.
    /// @param _stakeOwners address[] The addresses of subject stake owners.
    /// @param _amounts uint256[] The differences in total staked amounts.
    /// @param _signs bool[] The signs of the added (true) or subtracted (false) amounts.
    /// @param _updatedStakes uint256[] The updated total staked amounts.
    function stakeChangeBatch(address[] calldata _stakeOwners, uint256[] calldata _amounts, bool[] calldata _signs,
        uint256[] calldata _updatedStakes) external;

    /// @dev Notifies of stake migration event.
    /// @param _stakeOwner address The address of the subject stake owner.
    /// @param _amount uint256 The migrated amount.
    function stakeMigration(address _stakeOwner, uint256 _amount) external;
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: contracts/IMigratableStakingContract.sol

pragma solidity 0.6.12;


/// @title An interface for staking contracts which support stake migration.
interface IMigratableStakingContract {
    /// @dev Returns the address of the underlying staked token.
    /// @return IERC20 The address of the token.
    function getToken() external view returns (IERC20);

    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _stakeOwner address The specified stake owner.
    /// @param _amount uint256 The number of tokens to stake.
    function acceptMigration(address _stakeOwner, uint256 _amount) external;

    event AcceptedMigration(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}

// File: contracts/IStakingContract.sol

pragma solidity 0.6.12;


/// @title An interface for staking contracts.
interface IStakingContract {
    /// @dev Stakes ORBS tokens on behalf of msg.sender. This method assumes that the user has already approved at least
    /// the required amount using ERC20 approve.
    /// @param _amount uint256 The amount of tokens to stake.
    function stake(uint256 _amount) external;

    /// @dev Unstakes ORBS tokens from msg.sender. If successful, this will start the cooldown period, after which
    /// msg.sender would be able to withdraw all of his tokens.
    /// @param _amount uint256 The amount of tokens to unstake.
    function unstake(uint256 _amount) external;

    /// @dev Requests to withdraw all of staked ORBS tokens back to msg.sender. Stake owners can withdraw their ORBS
    /// tokens only after previously unstaking them and after the cooldown period has passed (unless the contract was
    /// requested to release all stakes).
    function withdraw() external;

    /// @dev Restakes unstaked ORBS tokens (in or after cooldown) for msg.sender.
    function restake() external;

    /// @dev Distributes staking rewards to a list of addresses by directly adding rewards to their stakes. This method
    /// assumes that the user has already approved at least the required amount using ERC20 approve. Since this is a
    /// convenience method, we aren't concerned about reaching block gas limit by using large lists. We assume that
    /// callers will be able to properly batch/paginate their requests.
    /// @param _totalAmount uint256 The total amount of rewards to distribute.
    /// @param _stakeOwners address[] The addresses of the stake owners.
    /// @param _amounts uint256[] The amounts of the rewards.
    function distributeRewards(uint256 _totalAmount, address[] calldata _stakeOwners, uint256[] calldata _amounts) external;

    /// @dev Returns the stake of the specified stake owner (excluding unstaked tokens).
    /// @param _stakeOwner address The address to check.
    /// @return uint256 The total stake.
    function getStakeBalanceOf(address _stakeOwner) external view returns (uint256);

    /// @dev Returns the total amount staked tokens (excluding unstaked tokens).
    /// @return uint256 The total staked tokens of all stake owners.
    function getTotalStakedTokens() external view returns (uint256);

    /// @dev Returns the time that the cooldown period ends (or ended) and the amount of tokens to be released.
    /// @param _stakeOwner address The address to check.
    /// @return cooldownAmount uint256 The total tokens in cooldown.
    /// @return cooldownEndTime uint256 The time when the cooldown period ends (in seconds).
    function getUnstakeStatus(address _stakeOwner) external view returns (uint256 cooldownAmount,
        uint256 cooldownEndTime);

    /// @dev Migrates the stake of msg.sender from this staking contract to a new approved staking contract.
    /// @param _newStakingContract IMigratableStakingContract The new staking contract which supports stake migration.
    /// @param _amount uint256 The amount of tokens to migrate.
    function migrateStakedTokens(IMigratableStakingContract _newStakingContract, uint256 _amount) external;

    event Staked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Unstaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Withdrew(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event Restaked(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
    event MigratedStake(address indexed stakeOwner, uint256 amount, uint256 totalStakedAmount);
}

// File: contracts/spec_interfaces/IManagedContract.sol

pragma solidity 0.6.12;

/// @title managed contract interface, used by the contracts registry to notify the contract on updates
interface IManagedContract /* is ILockable, IContractRegistryAccessor, Initializable */ {

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
    function refreshContracts() external;

}

// File: contracts/spec_interfaces/IContractRegistry.sol

pragma solidity 0.6.12;

/// @title Contract registry contract interface
/// @dev The contract registry holds Orbs PoS contracts and managers lists
/// @dev The contract registry updates the managed contracts on changes in the contract list
/// @dev Governance functions restricted to managers access the registry to retrieve the manager address 
/// @dev The contract registry represents the source of truth for Orbs Ethereum contracts 
/// @dev By tracking the registry events or query before interaction, one can access the up to date contracts 
interface IContractRegistry {

	event ContractAddressUpdated(string contractName, address addr, bool managedContract);
	event ManagerChanged(string role, address newManager);
	event ContractRegistryUpdated(address newContractRegistry);

	/*
	* External functions
	*/

    /// Updates the contracts address and emits a corresponding event
    /// @dev governance function called only by the migrationManager or registryAdmin
    /// @param contractName is the contract name, used to identify it
    /// @param addr is the contract updated address
    /// @param managedContract indicates whether the contract is managed by the registry and notified on changes
	function setContract(string calldata contractName, address addr, bool managedContract) external /* onlyAdminOrMigrationManager */;

    /// Returns the current address of the given contracts
    /// @param contractName is the contract name, used to identify it
    /// @return addr is the contract updated address
	function getContract(string calldata contractName) external view returns (address);

    /// Returns the list of contract addresses managed by the registry
    /// @dev Managed contracts are updated on changes in the registry contracts addresses 
    /// @return addrs is the list of managed contracts
	function getManagedContracts() external view returns (address[] memory);

    /// Locks all the managed contracts 
    /// @dev governance function called only by the migrationManager or registryAdmin
    /// @dev When set all onlyWhenActive functions will revert
	function lockContracts() external /* onlyAdminOrMigrationManager */;

    /// Unlocks all the managed contracts 
    /// @dev governance function called only by the migrationManager or registryAdmin
	function unlockContracts() external /* onlyAdminOrMigrationManager */;
	
    /// Updates a manager address and emits a corresponding event
    /// @dev governance function called only by the registryAdmin
    /// @dev the managers list is a flexible list of role to the manager's address
    /// @param role is the managers' role name, for example "functionalManager"
    /// @param manager is the manager updated address
	function setManager(string calldata role, address manager) external /* onlyAdmin */;

    /// Returns the current address of the given manager
    /// @param role is the manager name, used to identify it
    /// @return addr is the manager updated address
	function getManager(string calldata role) external view returns (address);

    /// Sets a new contract registry to migrate to
    /// @dev governance function called only by the registryAdmin
    /// @dev updates the registry address record in all the managed contracts
    /// @dev by tracking the emitted ContractRegistryUpdated, tools can track the up to date contracts
    /// @param newRegistry is the new registry contract 
	function setNewContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */;

    /// Returns the previous contract registry address 
    /// @dev used when the setting the contract as a new registry to assure a valid registry
    /// @return previousContractRegistry is the previous contract registry
	function getPreviousContractRegistry() external view returns (address);
}

// File: contracts/spec_interfaces/IContractRegistryAccessor.sol

pragma solidity 0.6.12;


interface IContractRegistryAccessor {

    /// Sets the contract registry address
    /// @dev governance function called only by an admin
    /// @param newRegistry is the new registry contract 
    function setContractRegistry(IContractRegistry newRegistry) external /* onlyAdmin */;

    /// Returns the contract registry address
    /// @return contractRegistry is the contract registry address
    function getContractRegistry() external view returns (IContractRegistry contractRegistry);

    function setRegistryAdmin(address _registryAdmin) external /* onlyInitializationAdmin */;

}

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: contracts/WithClaimableRegistryManagement.sol

pragma solidity 0.6.12;


/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract WithClaimableRegistryManagement is Context {
    address private _registryAdmin;
    address private _pendingRegistryAdmin;

    event RegistryManagementTransferred(address indexed previousRegistryAdmin, address indexed newRegistryAdmin);

    /**
     * @dev Initializes the contract setting the deployer as the initial registryRegistryAdmin.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _registryAdmin = msgSender;
        emit RegistryManagementTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current registryAdmin.
     */
    function registryAdmin() public view returns (address) {
        return _registryAdmin;
    }

    /**
     * @dev Throws if called by any account other than the registryAdmin.
     */
    modifier onlyRegistryAdmin() {
        require(isRegistryAdmin(), "WithClaimableRegistryManagement: caller is not the registryAdmin");
        _;
    }

    /**
     * @dev Returns true if the caller is the current registryAdmin.
     */
    function isRegistryAdmin() public view returns (bool) {
        return _msgSender() == _registryAdmin;
    }

    /**
     * @dev Leaves the contract without registryAdmin. It will not be possible to call
     * `onlyManager` functions anymore. Can only be called by the current registryAdmin.
     *
     * NOTE: Renouncing registryManagement will leave the contract without an registryAdmin,
     * thereby removing any functionality that is only available to the registryAdmin.
     */
    function renounceRegistryManagement() public onlyRegistryAdmin {
        emit RegistryManagementTransferred(_registryAdmin, address(0));
        _registryAdmin = address(0);
    }

    /**
     * @dev Transfers registryManagement of the contract to a new account (`newManager`).
     */
    function _transferRegistryManagement(address newRegistryAdmin) internal {
        require(newRegistryAdmin != address(0), "RegistryAdmin: new registryAdmin is the zero address");
        emit RegistryManagementTransferred(_registryAdmin, newRegistryAdmin);
        _registryAdmin = newRegistryAdmin;
    }

    /**
     * @dev Modifier throws if called by any account other than the pendingManager.
     */
    modifier onlyPendingRegistryAdmin() {
        require(msg.sender == _pendingRegistryAdmin, "Caller is not the pending registryAdmin");
        _;
    }
    /**
     * @dev Allows the current registryAdmin to set the pendingManager address.
     * @param newRegistryAdmin The address to transfer registryManagement to.
     */
    function transferRegistryManagement(address newRegistryAdmin) public onlyRegistryAdmin {
        _pendingRegistryAdmin = newRegistryAdmin;
    }

    /**
     * @dev Allows the _pendingRegistryAdmin address to finalize the transfer.
     */
    function claimRegistryManagement() external onlyPendingRegistryAdmin {
        _transferRegistryManagement(_pendingRegistryAdmin);
        _pendingRegistryAdmin = address(0);
    }

    /**
     * @dev Returns the current pendingRegistryAdmin
    */
    function pendingRegistryAdmin() public view returns (address) {
       return _pendingRegistryAdmin;  
    }
}

// File: contracts/Initializable.sol

pragma solidity 0.6.12;

contract Initializable {

    address private _initializationAdmin;

    event InitializationComplete();

    /// Constructor
    /// Sets the initializationAdmin to the contract deployer
    /// The initialization admin may call any manager only function until initializationComplete
    constructor() public{
        _initializationAdmin = msg.sender;
    }

    modifier onlyInitializationAdmin() {
        require(msg.sender == initializationAdmin(), "sender is not the initialization admin");

        _;
    }

    /*
    * External functions
    */

    /// Returns the initializationAdmin address
    function initializationAdmin() public view returns (address) {
        return _initializationAdmin;
    }

    /// Finalizes the initialization and revokes the initializationAdmin role 
    function initializationComplete() external onlyInitializationAdmin {
        _initializationAdmin = address(0);
        emit InitializationComplete();
    }

    /// Checks if the initialization was completed
    function isInitializationComplete() public view returns (bool) {
        return _initializationAdmin == address(0);
    }

}

// File: contracts/ContractRegistryAccessor.sol

pragma solidity 0.6.12;





contract ContractRegistryAccessor is IContractRegistryAccessor, WithClaimableRegistryManagement, Initializable {

    IContractRegistry private contractRegistry;

    /// Constructor
    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) public {
        require(address(_contractRegistry) != address(0), "_contractRegistry cannot be 0");
        setContractRegistry(_contractRegistry);
        _transferRegistryManagement(_registryAdmin);
    }

    modifier onlyAdmin {
        require(isAdmin(), "sender is not an admin (registryManger or initializationAdmin)");

        _;
    }

    modifier onlyMigrationManager {
        require(isMigrationManager(), "sender is not the migration manager");

        _;
    }

    modifier onlyFunctionalManager {
        require(isFunctionalManager(), "sender is not the functional manager");

        _;
    }

    /// Checks whether the caller is Admin: either the contract registry, the registry admin, or the initialization admin
    function isAdmin() internal view returns (bool) {
        return msg.sender == address(contractRegistry) || msg.sender == registryAdmin() || msg.sender == initializationAdmin();
    }

    /// Checks whether the caller is a specific manager role or and Admin
    /// @dev queries the registry contract for the up to date manager assignment
    function isManager(string memory role) internal view returns (bool) {
        IContractRegistry _contractRegistry = contractRegistry;
        return isAdmin() || _contractRegistry != IContractRegistry(0) && contractRegistry.getManager(role) == msg.sender;
    }

    /// Checks whether the caller is the migration manager
    function isMigrationManager() internal view returns (bool) {
        return isManager('migrationManager');
    }

    /// Checks whether the caller is the functional manager
    function isFunctionalManager() internal view returns (bool) {
        return isManager('functionalManager');
    }

    /* 
     * Contract getters, return the address of a contract by calling the contract registry 
     */ 

    function getProtocolContract() internal view returns (address) {
        return contractRegistry.getContract("protocol");
    }

    function getStakingRewardsContract() internal view returns (address) {
        return contractRegistry.getContract("stakingRewards");
    }

    function getFeesAndBootstrapRewardsContract() internal view returns (address) {
        return contractRegistry.getContract("feesAndBootstrapRewards");
    }

    function getCommitteeContract() internal view returns (address) {
        return contractRegistry.getContract("committee");
    }

    function getElectionsContract() internal view returns (address) {
        return contractRegistry.getContract("elections");
    }

    function getDelegationsContract() internal view returns (address) {
        return contractRegistry.getContract("delegations");
    }

    function getGuardiansRegistrationContract() internal view returns (address) {
        return contractRegistry.getContract("guardiansRegistration");
    }

    function getCertificationContract() internal view returns (address) {
        return contractRegistry.getContract("certification");
    }

    function getStakingContract() internal view returns (address) {
        return contractRegistry.getContract("staking");
    }

    function getSubscriptionsContract() internal view returns (address) {
        return contractRegistry.getContract("subscriptions");
    }

    function getStakingRewardsWallet() internal view returns (address) {
        return contractRegistry.getContract("stakingRewardsWallet");
    }

    function getBootstrapRewardsWallet() internal view returns (address) {
        return contractRegistry.getContract("bootstrapRewardsWallet");
    }

    function getGeneralFeesWallet() internal view returns (address) {
        return contractRegistry.getContract("generalFeesWallet");
    }

    function getCertifiedFeesWallet() internal view returns (address) {
        return contractRegistry.getContract("certifiedFeesWallet");
    }

    function getStakingContractHandler() internal view returns (address) {
        return contractRegistry.getContract("stakingContractHandler");
    }

    /*
    * Governance functions
    */

    event ContractRegistryAddressUpdated(address addr);

    /// Sets the contract registry address
    /// @dev governance function called only by an admin
    /// @param newContractRegistry is the new registry contract 
    function setContractRegistry(IContractRegistry newContractRegistry) public override onlyAdmin {
        require(newContractRegistry.getPreviousContractRegistry() == address(contractRegistry), "new contract registry must provide the previous contract registry");
        contractRegistry = newContractRegistry;
        emit ContractRegistryAddressUpdated(address(newContractRegistry));
    }

    /// Returns the contract registry that the contract is set to use
    /// @return contractRegistry is the registry contract address
    function getContractRegistry() public override view returns (IContractRegistry) {
        return contractRegistry;
    }

    function setRegistryAdmin(address _registryAdmin) external override onlyInitializationAdmin {
        _transferRegistryManagement(_registryAdmin);
    }

}

// File: contracts/spec_interfaces/ILockable.sol

pragma solidity 0.6.12;

/// @title lockable contract interface, allows to lock a contract
interface ILockable {

    event Locked();
    event Unlocked();

    /// Locks the contract to external non-governance function calls
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon locking all managed contracts
    /// @dev getters and migration functions remain active also for locked contracts
    /// @dev checked by the onlyWhenActive modifier
    function lock() external /* onlyMigrationManager */;

    /// Unlocks the contract 
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon unlocking all managed contracts
    function unlock() external /* onlyMigrationManager */;

    /// Returns the contract locking status
    /// @return isLocked is a bool indicating the contract is locked 
    function isLocked() view external returns (bool);

}

// File: contracts/Lockable.sol

pragma solidity 0.6.12;



/// @title lockable contract
contract Lockable is ILockable, ContractRegistryAccessor {

    bool public locked;

    /// Constructor
    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) ContractRegistryAccessor(_contractRegistry, _registryAdmin) public {}

    /// Locks the contract to external non-governance function calls
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon locking all managed contracts
    /// @dev getters and migration functions remain active also for locked contracts
    /// @dev checked by the onlyWhenActive modifier
    function lock() external override onlyMigrationManager {
        locked = true;
        emit Locked();
    }

    /// Unlocks the contract 
    /// @dev governance function called only by the migration manager or an admin
    /// @dev typically called by the registry contract upon unlocking all managed contracts
    function unlock() external override onlyMigrationManager {
        locked = false;
        emit Unlocked();
    }

    /// Returns the contract locking status
    /// @return isLocked is a bool indicating the contract is locked 
    function isLocked() external override view returns (bool) {
        return locked;
    }

    modifier onlyWhenActive() {
        require(!locked, "contract is locked for this operation");

        _;
    }
}

// File: contracts/ManagedContract.sol

pragma solidity 0.6.12;



/// @title managed contract
contract ManagedContract is IManagedContract, Lockable {

    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) Lockable(_contractRegistry, _registryAdmin) public {}

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
    function refreshContracts() virtual override external {}

}

// File: contracts/StakingContractHandler.sol

pragma solidity 0.6.12;





/// @title Staking contract handler
/// @dev instantiated between the staking contract and delegation contract
/// @dev handles migration and governance for the staking contract notification
contract StakingContractHandler is IStakingContractHandler, IStakeChangeNotifier, ManagedContract {

    IStakingContract stakingContract;
    struct Settings {
        IStakeChangeNotifier delegationsContract;
        bool notifyDelegations;
    }
    Settings settings;

    /// @param _contractRegistry is the contract registry address
    /// @param _registryAdmin is the registry admin address
    constructor(IContractRegistry _contractRegistry, address _registryAdmin) public ManagedContract(_contractRegistry, _registryAdmin) {
        settings.notifyDelegations = true;
    }

    modifier onlyStakingContract() {
        require(msg.sender == address(stakingContract), "caller is not the staking contract");

        _;
    }

    /*
    * External functions
    */

    /// @dev Notifies of stake change event.
    /// @dev IStakeChangeNotifier interface function.
    /// @param stakeOwner address The address of the subject stake owner.
    /// @param amount uint256 The difference in the total staked amount.
    /// @param sign bool The sign of the added (true) or subtracted (false) amount.
    /// @param updatedStake uint256 The updated total staked amount.
    function stakeChange(address stakeOwner, uint256 amount, bool sign, uint256 updatedStake) external override onlyStakingContract {
        Settings memory _settings = settings;
        if (!_settings.notifyDelegations) {
            emit StakeChangeNotificationSkipped(stakeOwner);
            return;
        }

        _settings.delegationsContract.stakeChange(stakeOwner, amount, sign, updatedStake);
    }

    /// @dev Notifies of multiple stake change events.
    /// @dev IStakeChangeNotifier interface function.
    /// @param stakeOwners address[] The addresses of subject stake owners.
    /// @param amounts uint256[] The differences in total staked amounts.
    /// @param signs bool[] The signs of the added (true) or subtracted (false) amounts.
    /// @param updatedStakes uint256[] The updated total staked amounts.
    function stakeChangeBatch(address[] calldata stakeOwners, uint256[] calldata amounts, bool[] calldata signs, uint256[] calldata updatedStakes) external override onlyStakingContract {
        Settings memory _settings = settings;
        if (!_settings.notifyDelegations) {
            emit StakeChangeBatchNotificationSkipped(stakeOwners);
            return;
        }

        _settings.delegationsContract.stakeChangeBatch(stakeOwners, amounts, signs, updatedStakes);
    }

    /// @dev Notifies of stake migration event.
    /// @dev IStakeChangeNotifier interface function.
    /// @param stakeOwner address The address of the subject stake owner.
    /// @param amount uint256 The migrated amount.
    function stakeMigration(address stakeOwner, uint256 amount) external override onlyStakingContract {
        Settings memory _settings = settings;
        if (!_settings.notifyDelegations) {
            emit StakeMigrationNotificationSkipped(stakeOwner);
            return;
        }

        _settings.delegationsContract.stakeMigration(stakeOwner, amount);
    }

    /// Returns the stake of the specified stake owner (excluding unstaked tokens).
    /// @param stakeOwner address The address to check.
    /// @return uint256 The total stake.
    function getStakeBalanceOf(address stakeOwner) external override view returns (uint256) {
        return stakingContract.getStakeBalanceOf(stakeOwner);
    }

    /// Returns the total amount staked tokens (excluding unstaked tokens).
    /// @return uint256 is the total staked tokens of all stake owners.
    function getTotalStakedTokens() external override view returns (uint256) {
        return stakingContract.getTotalStakedTokens();
    }

    /*
    * Governance functions
    */

    /// Sets notifications to the delegation contract
    /// @dev staking while notifications are disabled may lead to a discrepancy in the delegation data
    /// @dev governance function called only by the migration manager
    /// @param notifyDelegations is a bool indicating whether to notify the delegation contract
    function setNotifyDelegations(bool notifyDelegations) external override onlyMigrationManager {
        settings.notifyDelegations = notifyDelegations;
        emit NotifyDelegationsChanged(notifyDelegations);
    }

    /// Returns the notifications to the delegation contract status
    /// @return notifyDelegations is a bool indicating whether notifications are enabled
    function getNotifyDelegations() external view override returns (bool) {
        return settings.notifyDelegations;
    }

    /*
     * Contracts topology / registry interface
     */

    /// Refreshes the address of the other contracts the contract interacts with
    /// @dev called by the registry contract upon an update of a contract in the registry
    function refreshContracts() external override {
        settings.delegationsContract = IStakeChangeNotifier(getDelegationsContract());
        stakingContract = IStakingContract(getStakingContract());
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IContractRegistry","name":"_contractRegistry","type":"address"},{"internalType":"address","name":"_registryAdmin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ContractRegistryAddressUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"InitializationComplete","type":"event"},{"anonymous":false,"inputs":[],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"notifyDelegations","type":"bool"}],"name":"NotifyDelegationsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousRegistryAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"RegistryManagementTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"stakeOwners","type":"address[]"}],"name":"StakeChangeBatchNotificationSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"}],"name":"StakeChangeNotificationSkipped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakeOwner","type":"address"}],"name":"StakeMigrationNotificationSkipped","type":"event"},{"anonymous":false,"inputs":[],"name":"Unlocked","type":"event"},{"inputs":[],"name":"claimRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getContractRegistry","outputs":[{"internalType":"contract IContractRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNotifyDelegations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"stakeOwner","type":"address"}],"name":"getStakeBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalStakedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializationComplete","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitializationComplete","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRegistryAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingRegistryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refreshContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IContractRegistry","name":"newContractRegistry","type":"address"}],"name":"setContractRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"notifyDelegations","type":"bool"}],"name":"setNotifyDelegations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_registryAdmin","type":"address"}],"name":"setRegistryAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakeOwner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"sign","type":"bool"},{"internalType":"uint256","name":"updatedStake","type":"uint256"}],"name":"stakeChange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"stakeOwners","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bool[]","name":"signs","type":"bool[]"},{"internalType":"uint256[]","name":"updatedStakes","type":"uint256[]"}],"name":"stakeChangeBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"stakeOwner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakeMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRegistryAdmin","type":"address"}],"name":"transferRegistryManagement","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001cda38038062001cda833981810160405260408110156200003757600080fd5b50805160209091015181818181818160006200005262000131565b600080546001600160a01b0319166001600160a01b03831690811782556040519293509160008051602062001cba833981519152908290a350600280546001600160a01b031916331790556001600160a01b038216620000f9576040805162461bcd60e51b815260206004820152601d60248201527f5f636f6e747261637452656769737472792063616e6e6f742062652030000000604482015290519081900360640190fd5b620001048262000135565b6200010f816200028d565b50506005805460ff60a01b1916600160a01b179055506200039e945050505050565b3390565b6200013f6200031e565b6200017c5760405162461bcd60e51b815260040180806020018281038252603e81526020018062001c07603e913960400191505060405180910390fd5b600354604080516301e32edf60e21b815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b158015620001c457600080fd5b505afa158015620001d9573d6000803e3d6000fd5b505050506040513d6020811015620001f057600080fd5b50516001600160a01b031614620002395760405162461bcd60e51b815260040180806020018281038252604181526020018062001c456041913960600191505060405180910390fd5b600380546001600160a01b0383166001600160a01b0319909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b6001600160a01b038116620002d45760405162461bcd60e51b815260040180806020018281038252603481526020018062001c866034913960400191505060405180910390fd5b600080546040516001600160a01b038085169392169160008051602062001cba83398151915291a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6003546000906001600160a01b03163314806200035557506200034062000380565b6001600160a01b0316336001600160a01b0316145b806200037b5750620003666200038f565b6001600160a01b0316336001600160a01b0316145b905090565b6000546001600160a01b031690565b6002546001600160a01b031690565b61185980620003ae6000396000f3fe608060405234801561001057600080fd5b50600436106101985760003560e01c806390ef9d3f116100e3578063d25235261161008c578063eec0701f11610066578063eec0701f146104ae578063f83d08ba146104b6578063fcd13d65146104be57610198565b8063d252352614610478578063e4e9922214610480578063e9aea8c81461048857610198565b8063acdb8e04116100bd578063acdb8e041461043c578063ce257ab814610444578063cf3090121461047057610198565b806390ef9d3f146102c6578063a4e2d6341461042c578063a69df4b51461043457610198565b80633e2ac140116101455780635f94cd9c1161011f5780635f94cd9c146102ae57806370b639aa146102b657806374c16b23146102be57610198565b80633e2ac1401461026d57806348106fe31461028c57806351d185981461029457610198565b80632a1fac72116101765780632a1fac721461021b578063333df1541461022357806339069d8c1461024757610198565b80630e3b7c951461019d5780631a0b2c4f146101d95780632987cea0146101f5575b600080fd5b6101d7600480360360808110156101b357600080fd5b506001600160a01b03813516906020810135906040810135151590606001356104e4565b005b6101e161064d565b604080519115158252519081900360200190f35b6101d76004803603602081101561020b57600080fd5b50356001600160a01b0316610671565b6101d76106ee565b61022b610798565b604080516001600160a01b039092168252519081900360200190f35b6101d76004803603602081101561025d57600080fd5b50356001600160a01b03166107a7565b6101d76004803603602081101561028357600080fd5b5035151561080a565b6101e16108cc565b61029c6108dc565b60408051918252519081900360200190f35b61022b61095d565b6101e161096c565b61022b61098d565b6101d7600480360360808110156102dc57600080fd5b8101906020810181356401000000008111156102f757600080fd5b82018360208201111561030957600080fd5b8035906020019184602083028401116401000000008311171561032b57600080fd5b91939092909160208101903564010000000081111561034957600080fd5b82018360208201111561035b57600080fd5b8035906020019184602083028401116401000000008311171561037d57600080fd5b91939092909160208101903564010000000081111561039b57600080fd5b8201836020820111156103ad57600080fd5b803590602001918460208302840111640100000000831117156103cf57600080fd5b9193909290916020810190356401000000008111156103ed57600080fd5b8201836020820111156103ff57600080fd5b8035906020019184602083028401116401000000008311171561042157600080fd5b50909250905061099c565b6101e1610c3d565b6101d7610c5e565b6101d7610cf4565b6101d76004803603604081101561045a57600080fd5b506001600160a01b038135169060200135610d99565b6101e1610edf565b6101d7610f00565b61022b610f88565b61029c6004803603602081101561049e57600080fd5b50356001600160a01b0316610f97565b6101d761102d565b6101d76110af565b6101d7600480360360208110156104d457600080fd5b50356001600160a01b031661115c565b6004546001600160a01b0316331461052d5760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b610535611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff161515602082018190526105b1576040516001600160a01b038616907f7c1973c86555ff78610f7c9cee82f6d4d6e044ab7e06d9cdac7446493ea2115b90600090a250610647565b8051604080517f0e3b7c950000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526024820188905286151560448301526064820186905291519190921691630e3b7c9591608480830192600092919082900301818387803b15801561062d57600080fd5b505af1158015610641573d6000803e3d6000fd5b50505050505b50505050565b600080546001600160a01b03166106626112dc565b6001600160a01b031614905090565b61067961064d565b6106b45760405162461bcd60e51b81526004018080602001828103825260408152602001806117e46040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6106f6610798565b6001600160a01b0316336001600160a01b0316146107455760405162461bcd60e51b81526004018080602001828103825260268152602001806117456026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b6107af610798565b6001600160a01b0316336001600160a01b0316146107fe5760405162461bcd60e51b81526004018080602001828103825260268152602001806117456026913960400191505060405180910390fd5b610807816112e0565b50565b610812611398565b61084d5760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600580548215157401000000000000000000000000000000000000000081027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790915560408051918252517fa1731b0e4e40301cedc90d6a2b635591826af86d321c5f497b6d510620f734d99181900360200190a150565b6002546001600160a01b03161590565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166351d185986040518163ffffffff1660e01b815260040160206040518083038186803b15801561092c57600080fd5b505afa158015610940573d6000803e3d6000fd5b505050506040513d602081101561095657600080fd5b5051905090565b6001546001600160a01b031690565b60055474010000000000000000000000000000000000000000900460ff1690565b6000546001600160a01b031690565b6004546001600160a01b031633146109e55760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b6109ed611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff16151560208201819052610ab6577f828b0a243e722c25b76c488685680de65b7d8cd463a6230956396cb736a5ab5a898960405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a150610c33565b80600001516001600160a01b03166390ef9d3f8a8a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401808060200180602001806020018060200185810385528d8d82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910186810385528b8152602090810191508c908c0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018681038452898152602090810191508a908a0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018681038352878152602090810191508890880280828437600081840152601f19601f8201169050808301925050509c50505050505050505050505050600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b50505050505b5050505050505050565b60035474010000000000000000000000000000000000000000900460ff1690565b610c66611398565b610ca15760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b610cfc61064d565b610d375760405162461bcd60e51b81526004018080602001828103825260408152602001806117e46040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6004546001600160a01b03163314610de25760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b610dea611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff16151560208201819052610e66576040516001600160a01b038416907fc3c3676476bb348ea01d34d229cd14554114e3f5083e83227a4d1bd6c8a6523690600090a250610edb565b80600001516001600160a01b031663ce257ab884846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b50505050505b5050565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b03163314610f495760405162461bcd60e51b815260040180806020018281038252602781526020018061171e6027913960400191505060405180910390fd5b600154610f5e906001600160a01b03166112e0565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b031690565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663e9aea8c8836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d602081101561102557600080fd5b505192915050565b6110356113dd565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561107561146d565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6110b7611398565b6110f25760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b6111646114fd565b61119f5760405162461bcd60e51b815260040180806020018281038252603e81526020018061169f603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d602081101561122957600080fd5b50516001600160a01b0316146112705760405162461bcd60e51b81526004018080602001828103825260418152602001806116dd6041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b3390565b6001600160a01b0381166113255760405162461bcd60e51b81526004018080602001828103825260348152602001806117b06034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006113d86040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250611558565b905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561092c57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600760248301527f7374616b696e6700000000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561092c57600080fd5b6003546000906001600160a01b0316331480611531575061151c61098d565b6001600160a01b0316336001600160a01b0316145b806113d8575061153f610798565b6001600160a01b0316336001600160a01b031614905090565b6003546000906001600160a01b031661156f6114fd565b8061168057506001600160a01b0381161580159061168057506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b838110156115ff5781810151838201526020016115e7565b50505050905090810190601f16801561162c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d602081101561167357600080fd5b50516001600160a01b0316145b9392505050565b60408051808201909152600080825260208201529056fe73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e73656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f7420746865206d6967726174696f6e206d616e6167657263616c6c6572206973206e6f7420746865207374616b696e6720636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696ea2646970667358221220ef917d3800330277c042c4f55619d9a09876bd1547ba82be07d5b85d17f6a0bf64736f6c634300060c003373656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e7472616374207265676973747279526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f20616464726573731f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101985760003560e01c806390ef9d3f116100e3578063d25235261161008c578063eec0701f11610066578063eec0701f146104ae578063f83d08ba146104b6578063fcd13d65146104be57610198565b8063d252352614610478578063e4e9922214610480578063e9aea8c81461048857610198565b8063acdb8e04116100bd578063acdb8e041461043c578063ce257ab814610444578063cf3090121461047057610198565b806390ef9d3f146102c6578063a4e2d6341461042c578063a69df4b51461043457610198565b80633e2ac140116101455780635f94cd9c1161011f5780635f94cd9c146102ae57806370b639aa146102b657806374c16b23146102be57610198565b80633e2ac1401461026d57806348106fe31461028c57806351d185981461029457610198565b80632a1fac72116101765780632a1fac721461021b578063333df1541461022357806339069d8c1461024757610198565b80630e3b7c951461019d5780631a0b2c4f146101d95780632987cea0146101f5575b600080fd5b6101d7600480360360808110156101b357600080fd5b506001600160a01b03813516906020810135906040810135151590606001356104e4565b005b6101e161064d565b604080519115158252519081900360200190f35b6101d76004803603602081101561020b57600080fd5b50356001600160a01b0316610671565b6101d76106ee565b61022b610798565b604080516001600160a01b039092168252519081900360200190f35b6101d76004803603602081101561025d57600080fd5b50356001600160a01b03166107a7565b6101d76004803603602081101561028357600080fd5b5035151561080a565b6101e16108cc565b61029c6108dc565b60408051918252519081900360200190f35b61022b61095d565b6101e161096c565b61022b61098d565b6101d7600480360360808110156102dc57600080fd5b8101906020810181356401000000008111156102f757600080fd5b82018360208201111561030957600080fd5b8035906020019184602083028401116401000000008311171561032b57600080fd5b91939092909160208101903564010000000081111561034957600080fd5b82018360208201111561035b57600080fd5b8035906020019184602083028401116401000000008311171561037d57600080fd5b91939092909160208101903564010000000081111561039b57600080fd5b8201836020820111156103ad57600080fd5b803590602001918460208302840111640100000000831117156103cf57600080fd5b9193909290916020810190356401000000008111156103ed57600080fd5b8201836020820111156103ff57600080fd5b8035906020019184602083028401116401000000008311171561042157600080fd5b50909250905061099c565b6101e1610c3d565b6101d7610c5e565b6101d7610cf4565b6101d76004803603604081101561045a57600080fd5b506001600160a01b038135169060200135610d99565b6101e1610edf565b6101d7610f00565b61022b610f88565b61029c6004803603602081101561049e57600080fd5b50356001600160a01b0316610f97565b6101d761102d565b6101d76110af565b6101d7600480360360208110156104d457600080fd5b50356001600160a01b031661115c565b6004546001600160a01b0316331461052d5760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b610535611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff161515602082018190526105b1576040516001600160a01b038616907f7c1973c86555ff78610f7c9cee82f6d4d6e044ab7e06d9cdac7446493ea2115b90600090a250610647565b8051604080517f0e3b7c950000000000000000000000000000000000000000000000000000000081526001600160a01b0388811660048301526024820188905286151560448301526064820186905291519190921691630e3b7c9591608480830192600092919082900301818387803b15801561062d57600080fd5b505af1158015610641573d6000803e3d6000fd5b50505050505b50505050565b600080546001600160a01b03166106626112dc565b6001600160a01b031614905090565b61067961064d565b6106b45760405162461bcd60e51b81526004018080602001828103825260408152602001806117e46040913960400191505060405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6106f6610798565b6001600160a01b0316336001600160a01b0316146107455760405162461bcd60e51b81526004018080602001828103825260268152602001806117456026913960400191505060405180910390fd5b600280547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556040517f2a2b3ea974fb057582c3b210ef8b5f81492d15673f49d4384bfa3b896a964c3c90600090a1565b6002546001600160a01b031690565b6107af610798565b6001600160a01b0316336001600160a01b0316146107fe5760405162461bcd60e51b81526004018080602001828103825260268152602001806117456026913960400191505060405180910390fd5b610807816112e0565b50565b610812611398565b61084d5760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600580548215157401000000000000000000000000000000000000000081027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff9092169190911790915560408051918252517fa1731b0e4e40301cedc90d6a2b635591826af86d321c5f497b6d510620f734d99181900360200190a150565b6002546001600160a01b03161590565b6000600460009054906101000a90046001600160a01b03166001600160a01b03166351d185986040518163ffffffff1660e01b815260040160206040518083038186803b15801561092c57600080fd5b505afa158015610940573d6000803e3d6000fd5b505050506040513d602081101561095657600080fd5b5051905090565b6001546001600160a01b031690565b60055474010000000000000000000000000000000000000000900460ff1690565b6000546001600160a01b031690565b6004546001600160a01b031633146109e55760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b6109ed611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff16151560208201819052610ab6577f828b0a243e722c25b76c488685680de65b7d8cd463a6230956396cb736a5ab5a898960405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a150610c33565b80600001516001600160a01b03166390ef9d3f8a8a8a8a8a8a8a8a6040518963ffffffff1660e01b8152600401808060200180602001806020018060200185810385528d8d82818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690910186810385528b8152602090810191508c908c0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018681038452898152602090810191508a908a0280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018681038352878152602090810191508890880280828437600081840152601f19601f8201169050808301925050509c50505050505050505050505050600060405180830381600087803b158015610c1957600080fd5b505af1158015610c2d573d6000803e3d6000fd5b50505050505b5050505050505050565b60035474010000000000000000000000000000000000000000900460ff1690565b610c66611398565b610ca15760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040517f19aad37188a1d3921e29eb3c66acf43d81975e107cb650d58cca878627955fd690600090a1565b610cfc61064d565b610d375760405162461bcd60e51b81526004018080602001828103825260408152602001806117e46040913960400191505060405180910390fd5b600080546040516001600160a01b03909116907f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6004546001600160a01b03163314610de25760405162461bcd60e51b815260040180806020018281038252602281526020018061178e6022913960400191505060405180910390fd5b610dea611687565b50604080518082019091526005546001600160a01b038116825274010000000000000000000000000000000000000000900460ff16151560208201819052610e66576040516001600160a01b038416907fc3c3676476bb348ea01d34d229cd14554114e3f5083e83227a4d1bd6c8a6523690600090a250610edb565b80600001516001600160a01b031663ce257ab884846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015610ec157600080fd5b505af1158015610ed5573d6000803e3d6000fd5b50505050505b5050565b60035474010000000000000000000000000000000000000000900460ff1681565b6001546001600160a01b03163314610f495760405162461bcd60e51b815260040180806020018281038252602781526020018061171e6027913960400191505060405180910390fd5b600154610f5e906001600160a01b03166112e0565b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b6003546001600160a01b031690565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663e9aea8c8836040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015610ffb57600080fd5b505afa15801561100f573d6000803e3d6000fd5b505050506040513d602081101561102557600080fd5b505192915050565b6110356113dd565b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905561107561146d565b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6110b7611398565b6110f25760405162461bcd60e51b815260040180806020018281038252602381526020018061176b6023913960400191505060405180910390fd5b600380547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040517f0f2e5b6c72c6a4491efd919a9f9a409f324ef0708c11ee57d410c2cb06c0992b90600090a1565b6111646114fd565b61119f5760405162461bcd60e51b815260040180806020018281038252603e81526020018061169f603e913960400191505060405180910390fd5b600354604080517f078cbb7c00000000000000000000000000000000000000000000000000000000815290516001600160a01b039283169284169163078cbb7c916004808301926020929190829003018186803b1580156111ff57600080fd5b505afa158015611213573d6000803e3d6000fd5b505050506040513d602081101561122957600080fd5b50516001600160a01b0316146112705760405162461bcd60e51b81526004018080602001828103825260418152602001806116dd6041913960600191505060405180910390fd5b600380546001600160a01b0383167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517ffea2d033438b968078a6264409d0104b5f3d2ce7b795afc74918e70f3534f22b9181900360200190a150565b3390565b6001600160a01b0381166113255760405162461bcd60e51b81526004018080602001828103825260348152602001806117b06034913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f1f5f028be638d6a0e3b8d56fd05b812ce325cc8dc73cdb0e16df94d6b2725c2e91a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b60006113d86040518060400160405280601081526020017f6d6967726174696f6e4d616e6167657200000000000000000000000000000000815250611558565b905090565b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600b60248301527f64656c65676174696f6e73000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561092c57600080fd5b600354604080517f35817773000000000000000000000000000000000000000000000000000000008152602060048201819052600760248301527f7374616b696e6700000000000000000000000000000000000000000000000000604483015291516000936001600160a01b03169263358177739260648082019391829003018186803b15801561092c57600080fd5b6003546000906001600160a01b0316331480611531575061151c61098d565b6001600160a01b0316336001600160a01b0316145b806113d8575061153f610798565b6001600160a01b0316336001600160a01b031614905090565b6003546000906001600160a01b031661156f6114fd565b8061168057506001600160a01b0381161580159061168057506003546040517f1ee441e900000000000000000000000000000000000000000000000000000000815260206004820181815286516024840152865133946001600160a01b031693631ee441e99389939283926044019185019080838360005b838110156115ff5781810151838201526020016115e7565b50505050905090810190601f16801561162c5780820380516001836020036101000a031916815260200191505b509250505060206040518083038186803b15801561164957600080fd5b505afa15801561165d573d6000803e3d6000fd5b505050506040513d602081101561167357600080fd5b50516001600160a01b0316145b9392505050565b60408051808201909152600080825260208201529056fe73656e646572206973206e6f7420616e2061646d696e202872656769737472794d616e676572206f7220696e697469616c697a6174696f6e41646d696e296e657720636f6e7472616374207265676973747279206d7573742070726f76696465207468652070726576696f757320636f6e747261637420726567697374727943616c6c6572206973206e6f74207468652070656e64696e6720726567697374727941646d696e73656e646572206973206e6f742074686520696e697469616c697a6174696f6e2061646d696e73656e646572206973206e6f7420746865206d6967726174696f6e206d616e6167657263616c6c6572206973206e6f7420746865207374616b696e6720636f6e7472616374526567697374727941646d696e3a206e657720726567697374727941646d696e20697320746865207a65726f206164647265737357697468436c61696d61626c6552656769737472794d616e6167656d656e743a2063616c6c6572206973206e6f742074686520726567697374727941646d696ea2646970667358221220ef917d3800330277c042c4f55619d9a09876bd1547ba82be07d5b85d17f6a0bf64736f6c634300060c0033

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

000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92

-----Decoded View---------------
Arg [0] : _contractRegistry (address): 0xD859701C81119aB12A1e62AF6270aD2AE05c7AB3
Arg [1] : _registryAdmin (address): 0xf1fD5233E60E7Ef797025FE9DD066d60d59BcB92

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000d859701c81119ab12a1e62af6270ad2ae05c7ab3
Arg [1] : 000000000000000000000000f1fd5233e60e7ef797025fe9dd066d60d59bcb92


Deployed Bytecode Sourcemap

31016:5150:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32227:416;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32227:416:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;18183:110;;;:::i;:::-;;;;;;;;;;;;;;;;;;19744:146;;;;;;;;;;;;;;;;-1:-1:-1;19744:146:0;-1:-1:-1;;;;;19744:146:0;;:::i;21270:159::-;;;:::i;21075:107::-;;;:::i;:::-;;;;-1:-1:-1;;;;;21075:107:0;;;;;;;;;;;;;;27144:154;;;;;;;;;;;;;;;;-1:-1:-1;27144:154:0;-1:-1:-1;;;;;27144:154:0;;:::i;35200:217::-;;;;;;;;;;;;;;;;-1:-1:-1;35200:217:0;;;;:::i;21489:123::-;;;:::i;34682:137::-;;;:::i;:::-;;;;;;;;;;;;;;;;20258:110;;;:::i;35584:122::-;;;:::i;17737:95::-;;;:::i;33078:484::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33078:484:0;;-1:-1:-1;33078:484:0;-1:-1:-1;33078:484:0;:::i;29851:90::-;;;:::i;29611:116::-;;;:::i;18687:182::-;;;:::i;33801:372::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33801:372:0;;;;;;;;:::i;28576:18::-;;;:::i;19996:183::-;;;:::i;27014:122::-;;;:::i;34365:159::-;;;;;;;;;;;;;;;;-1:-1:-1;34365:159:0;-1:-1:-1;;;;;34365:159:0;;:::i;35954:209::-;;;:::i;29285:111::-;;;:::i;26474:394::-;;;;;;;;;;;;;;;;-1:-1:-1;26474:394:0;-1:-1:-1;;;;;26474:394:0;;:::i;32227:416::-;31693:15;;-1:-1:-1;;;;;31693:15:0;31671:10;:38;31663:85;;;;-1:-1:-1;;;31663:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32366:25:::1;;:::i;:::-;-1:-1:-1::0;32366:36:0::1;::::0;;;;::::1;::::0;;;32394:8:::1;32366:36:::0;-1:-1:-1;;;;;32366:36:0;::::1;::::0;;;;::::1;;;;;;::::0;::::1;::::0;;;32413:129:::1;;32467:42;::::0;-1:-1:-1;;;;;32467:42:0;::::1;::::0;::::1;::::0;;;::::1;32524:7;;;32413:129;32554:29:::0;;:81:::1;::::0;;;;;-1:-1:-1;;;;;32554:81:0;;::::1;;::::0;::::1;::::0;;;;;;;;::::1;;::::0;;;;;;;;;;;;:41;;;::::1;::::0;::::1;::::0;:81;;;;;:29:::1;::::0;:81;;;;;;;:29;:41;:81;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31761:1;;32227:416:::0;;;;:::o;18183:110::-;18231:4;18271:14;;-1:-1:-1;;;;;18271:14:0;18255:12;:10;:12::i;:::-;-1:-1:-1;;;;;18255:30:0;;18248:37;;18183:110;:::o;19744:146::-;17981:17;:15;:17::i;:::-;17973:94;;;;-1:-1:-1;;;17973:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19842:21:::1;:40:::0;;;::::1;-1:-1:-1::0;;;;;19842:40:0;;;::::1;::::0;;;::::1;::::0;;19744:146::o;21270:159::-;20888:21;:19;:21::i;:::-;-1:-1:-1;;;;;20874:35:0;:10;-1:-1:-1;;;;;20874:35:0;;20866:86;;;;-1:-1:-1;;;20866:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21348:20:::1;:33:::0;;;::::1;::::0;;21397:24:::1;::::0;::::1;::::0;21379:1:::1;::::0;21397:24:::1;21270:159::o:0;21075:107::-;21154:20;;-1:-1:-1;;;;;21154:20:0;21075:107;:::o;27144:154::-;20888:21;:19;:21::i;:::-;-1:-1:-1;;;;;20874:35:0;:10;-1:-1:-1;;;;;20874:35:0;;20866:86;;;;-1:-1:-1;;;20866:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27247:43:::1;27275:14;27247:27;:43::i;:::-;27144:154:::0;:::o;35200:217::-;22512:20;:18;:20::i;:::-;22504:68;;;;-1:-1:-1;;;22504:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35304:8:::1;:46:::0;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;35366:43:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;35200:217:::0;:::o;21489:123::-;21570:20;;-1:-1:-1;;;;;21570:20:0;:34;21489:123;:::o;34682:137::-;34746:7;34773:15;;;;;;;;;-1:-1:-1;;;;;34773:15:0;-1:-1:-1;;;;;34773:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34773:38:0;;-1:-1:-1;34682:137:0;:::o;20258:110::-;20337:21;;-1:-1:-1;;;;;20337:21:0;20258:110;:::o;35584:122::-;35672:8;:26;;;;;;;35584:122::o;17737:95::-;17783:7;17810:14;-1:-1:-1;;;;;17810:14:0;17737:95;:::o;33078:484::-;31693:15;;-1:-1:-1;;;;;31693:15:0;31671:10;:38;31663:85;;;;-1:-1:-1;;;31663:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33270:25:::1;;:::i;:::-;-1:-1:-1::0;33270:36:0::1;::::0;;;;::::1;::::0;;;33298:8:::1;33270:36:::0;-1:-1:-1;;;;;33270:36:0;::::1;::::0;;;;::::1;;;;;;::::0;::::1;::::0;;;33317:135:::1;;33371:48;33407:11;;33371:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;33371:48:0;;-1:-1:-1;;;;33371:48:0::1;33434:7;;;33317:135;33464:9;:29;;;-1:-1:-1::0;;;;;33464:46:0::1;;33511:11;;33524:7;;33533:5;;33540:13;;33464:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33464:90:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33464:90:0;;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;::::1;;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;-1:-1:-1;33464:90:0;;;::::1;::::0;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31761:1;;33078:484:::0;;;;;;;;:::o;29851:90::-;29927:6;;;;;;;;29851:90::o;29611:116::-;22512:20;:18;:20::i;:::-;22504:68;;;;-1:-1:-1;;;22504:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29679:6:::1;:14:::0;;;::::1;::::0;;29709:10:::1;::::0;::::1;::::0;29688:5:::1;::::0;29709:10:::1;29611:116::o:0;18687:182::-;17981:17;:15;:17::i;:::-;17973:94;;;;-1:-1:-1;;;17973:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18820:1:::1;18796:14:::0;;18766:57:::1;::::0;-1:-1:-1;;;;;18796:14:0;;::::1;::::0;18766:57:::1;::::0;18820:1;;18766:57:::1;18859:1;18834:27:::0;;;::::1;::::0;;18687:182::o;33801:372::-;31693:15;;-1:-1:-1;;;;;31693:15:0;31671:10;:38;31663:85;;;;-1:-1:-1;;;31663:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33910:25:::1;;:::i;:::-;-1:-1:-1::0;33910:36:0::1;::::0;;;;::::1;::::0;;;33938:8:::1;33910:36:::0;-1:-1:-1;;;;;33910:36:0;::::1;::::0;;;;::::1;;;;;;::::0;::::1;::::0;;;33957:132:::1;;34011:45;::::0;-1:-1:-1;;;;;34011:45:0;::::1;::::0;::::1;::::0;;;::::1;34071:7;;;33957:132;34101:9;:29;;;-1:-1:-1::0;;;;;34101:44:0::1;;34146:10;34158:6;34101:64;;;;;;;;;;;;;-1:-1:-1::0;;;;;34101:64:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31761:1;;33801:372:::0;;:::o;28576:18::-;;;;;;;;;:::o;19996:183::-;19475:21;;-1:-1:-1;;;;;19475:21:0;19461:10;:35;19453:87;;;;-1:-1:-1;;;19453:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20104:21:::1;::::0;20076:50:::1;::::0;-1:-1:-1;;;;;20104:21:0::1;20076:27;:50::i;:::-;20137:21;:34:::0;;;::::1;::::0;;19996:183::o;27014:122::-;27112:16;;-1:-1:-1;;;;;27112:16:0;27014:122;:::o;34365:159::-;34444:7;34471:15;;;;;;;;;-1:-1:-1;;;;;34471:15:0;-1:-1:-1;;;;;34471:33:0;;34505:10;34471:45;;;;;;;;;;;;;-1:-1:-1;;;;;34471:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34471:45:0;;34365:159;-1:-1:-1;;34365:159:0:o;35954:209::-;36063:24;:22;:24::i;:::-;36011:8;:77;;;;-1:-1:-1;;;;;36011:77:0;;;;;;;;;;36134:20;:18;:20::i;:::-;36099:15;:56;;;;-1:-1:-1;;;;;36099:56:0;;;;;;;;;;35954:209::o;29285:111::-;22512:20;:18;:20::i;:::-;22504:68;;;;-1:-1:-1;;;22504:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29351:6:::1;:13:::0;;;::::1;::::0;::::1;::::0;;29380:8:::1;::::0;::::1;::::0;29351:13;;29380:8:::1;29285:111::o:0;26474:394::-;22357:9;:7;:9::i;:::-;22349:84;;;;-1:-1:-1;;;22349:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26648:16:::1;::::0;26587:49:::1;::::0;;;;;;;-1:-1:-1;;;;;26648:16:0;;::::1;::::0;26587:47;::::1;::::0;::::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:47;:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;26587:49:0;-1:-1:-1;;;;;26587:78:0::1;;26579:156;;;;-1:-1:-1::0;;;26579:156:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26746:16;:38:::0;;-1:-1:-1;;;;;26746:38:0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;26800:60:::1;::::0;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;26474:394:::0;:::o;16482:106::-;16570:10;16482:106;:::o;18986:309::-;-1:-1:-1;;;;;19077:30:0;;19069:95;;;;-1:-1:-1;;;19069:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19210:14;;;19180:63;;-1:-1:-1;;;;;19180:63:0;;;;19210:14;;;19180:63;;;19254:14;:33;;;;-1:-1:-1;;;;;19254:33:0;;;;;;;;;;18986:309::o;23549:114::-;23602:4;23626:29;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;23619:36;;23549:114;:::o;24701:135::-;24785:16;;:43;;;;;;;;;;;;;;;;;;;;;;;;;24758:7;;-1:-1:-1;;;;;24785:16:0;;:28;;:43;;;;;;;;;;;:16;:43;;;;;;;;;;25154:127;25234:16;;:39;;;;;;;;;;;;;;;;;;;;;;;;;25207:7;;-1:-1:-1;;;;;25234:16:0;;:28;;:39;;;;;;;;;;;:16;:39;;;;;;;;;;22867:185;22955:16;;22909:4;;-1:-1:-1;;;;;22955:16:0;22933:10;:39;;:72;;;22990:15;:13;:15::i;:::-;-1:-1:-1;;;;;22976:29:0;:10;-1:-1:-1;;;;;22976:29:0;;22933:72;:111;;;;23023:21;:19;:21::i;:::-;-1:-1:-1;;;;;23009:35:0;:10;-1:-1:-1;;;;;23009:35:0;;22926:118;;22867:185;:::o;23217:264::-;23334:16;;23279:4;;-1:-1:-1;;;;;23334:16:0;23368:9;:7;:9::i;:::-;:105;;;-1:-1:-1;;;;;;23381:41:0;;;;;;:92;;-1:-1:-1;23426:16:0;;:33;;;;;;;;;;;;;;;;;;;;23463:10;;-1:-1:-1;;;;;23426:16:0;;:27;;23454:4;;23426:33;;;;;;;;;;;;:16;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23426:33:0;-1:-1:-1;;;;;23426:47:0;;23381:92;23361:112;23217:264;-1:-1:-1;;;23217:264:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://ef917d3800330277c042c4f55619d9a09876bd1547ba82be07d5b85d17f6a0bf

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.