Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingContractHandler
Compiler Version
v0.6.12+commit.27d51765
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.