Sonic Blaze Testnet

Contract

0x9445F36d1478E5252B05DA294b8f1Bfdb0cc3DBa

Overview

S Balance

Sonic Blaze LogoSonic Blaze LogoSonic Blaze Logo0 S

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

4 Internal Transactions found.

Latest 4 internal transactions

Parent Transaction Hash Block From To
227305792025-02-24 14:46:5415 days ago1740408414
0x9445F36d...db0cc3DBa
0 S
227305792025-02-24 14:46:5415 days ago1740408414
0x9445F36d...db0cc3DBa
0 S
227305792025-02-24 14:46:5415 days ago1740408414
0x9445F36d...db0cc3DBa
0 S
227305792025-02-24 14:46:5415 days ago1740408414
0x9445F36d...db0cc3DBa
0 S
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0xa39cDdD5...415ca287C
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
DisposableNXMaster

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 13 : DisposableNXMaster.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.18;

import "../../modules/governance/NXMaster.sol";

contract DisposableNXMaster is NXMaster {

  function initialize(
    address _owner,
    address _tokenAddress,
    address _emergencyAdmin,
    bytes2[] calldata _contractNames,
    uint8[] calldata _contractTypes, // 0 - eternal storage, 1 - "upgradable", 2 - proxy
    address payable[] calldata _contractAddresses
  ) external {

    require(!masterInitialized, "!init");
    masterInitialized = true;

    owner = _owner;
    tokenAddress = _tokenAddress;
    emergencyAdmin = _emergencyAdmin;

    contractsActive[address(this)] = true;

    require(
      _contractNames.length == _contractTypes.length,
      "check names & types arrays length"
    );

    for (uint i = 0; i < _contractNames.length; i++) {

      bytes2 name = _contractNames[i];
      address payable contractAddress = _contractAddresses[i];

      contractCodes.push(name);
      contractAddresses[name] = contractAddress;
      contractsActive[contractAddress] = true;

      if (_contractTypes[i] == 1) {
        isReplaceable[name] = true;
      } else if (_contractTypes[i] == 2) {
        isProxy[name] = true;
      }
    }
  }

  function switchGovernanceAddress(address payable newGV) external {

    {// change governance address
      address currentGV = contractAddresses["GV"];
      contractAddresses["GV"] = newGV;
      contractsActive[currentGV] = false;
      contractsActive[newGV] = true;
    }

    // notify all contracts about address change
    for (uint i = 0; i < contractCodes.length; i++) {
      address _address = contractAddresses[contractCodes[i]];
      IMasterAwareV2 up = IMasterAwareV2(_address);
      up.changeMasterAddress(address(this));
      up.changeDependentContractAddress();
    }
  }

}

File 2 of 13 : ILegacyClaimsReward.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface ILegacyClaimsReward {

  /// @dev Decides the next course of action for a given claim.
  function changeClaimStatus(uint claimid) external;

  function transferRewards() external;

  function getCurrencyAssetAddress(bytes4 currency) external view returns (address);

  function upgrade(address _newAdd) external;
}

File 3 of 13 : IMasterAwareV2.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IMasterAwareV2 {

  // TODO: if you update this enum, update lib/constants.js as well
  enum ID {
    TC, // TokenController.sol
    P1, // Pool.sol
    MR, // MemberRoles.sol
    MC, // MCR.sol
    CO, // Cover.sol
    SP, // StakingProducts.sol
    PS, // LegacyPooledStaking.sol
    GV, // Governance.sol
    GW, // LegacyGateway.sol - removed
    CL, // CoverMigrator.sol - removed
    AS, // Assessment.sol
    CI, // IndividualClaims.sol - Claims for Individuals
    CG, // YieldTokenIncidents.sol - Claims for Groups
    RA, // Ramm.sol
    ST,  // SafeTracker.sol
    CP  // CoverProducts.sol
  }

  function changeMasterAddress(address masterAddress) external;

  function changeDependentContractAddress() external;

  function internalContracts(uint) external view returns (address payable);
}

File 4 of 13 : IMemberRoles.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface IMemberRoles {

  enum Role {Unassigned, AdvisoryBoard, Member, Owner, Auditor}

  function join(address _userAddress, uint nonce, bytes calldata signature) external payable;

  function switchMembership(address _newAddress) external;

  function switchMembershipAndAssets(
    address newAddress,
    uint[] calldata coverIds,
    uint[] calldata stakingTokenIds
  ) external;

  function switchMembershipOf(address member, address _newAddress) external;

  function totalRoles() external view returns (uint256);

  function changeAuthorized(uint _roleId, address _newAuthorized) external;

  function setKycAuthAddress(address _add) external;

  function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray);

  function numberOfMembers(uint _memberRoleId) external view returns (uint);

  function authorized(uint _memberRoleId) external view returns (address);

  function roles(address _memberAddress) external view returns (uint[] memory);

  function checkRole(address _memberAddress, uint _roleId) external view returns (bool);

  function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers);

  function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool);

  function membersLength(uint _memberRoleId) external view returns (uint);

  event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription);

  event MemberJoined(address indexed newMember, uint indexed nonce);

  event switchedMembership(address indexed previousMember, address indexed newMember, uint timeStamp);
  
  event MembershipWithdrawn(address indexed member, uint timestamp);
}

File 5 of 13 : IPool.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

import "./IPriceFeedOracle.sol";

struct SwapDetails {
  uint104 minAmount;
  uint104 maxAmount;
  uint32 lastSwapTime;
  // 2 decimals of precision. 0.01% -> 0.0001 -> 1e14
  uint16 maxSlippageRatio;
}

struct Asset {
  address assetAddress;
  bool isCoverAsset;
  bool isAbandoned;
}

interface IPool {

  function swapOperator() external view returns (address);

  function getAsset(uint assetId) external view returns (Asset memory);

  function getAssets() external view returns (Asset[] memory);

  function transferAssetToSwapOperator(address asset, uint amount) external;

  function setSwapDetailsLastSwapTime(address asset, uint32 lastSwapTime) external;

  function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory);

  function sendPayout(uint assetIndex, address payable payoutAddress, uint amount, uint ethDepositAmount) external;

  function sendEth(address payoutAddress, uint amount) external;

  function upgradeCapitalPool(address payable newPoolAddress) external;

  function priceFeedOracle() external view returns (IPriceFeedOracle);

  function getPoolValueInEth() external view returns (uint);

  function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint);

  function getInternalTokenPriceInAsset(uint assetId) external view returns (uint tokenPrice);

  function getInternalTokenPriceInAssetAndUpdateTwap(uint assetId) external returns (uint tokenPrice);

  function getTokenPrice() external view returns (uint tokenPrice);

  function getMCRRatio() external view returns (uint);

  function setSwapValue(uint value) external;
}

File 6 of 13 : IPriceFeedOracle.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface Aggregator {
  function decimals() external view returns (uint8);
  function latestAnswer() external view returns (int);
}

interface IPriceFeedOracle {

  struct OracleAsset {
    Aggregator aggregator;
    uint8 decimals;
  }

  function ETH() external view returns (address);
  function assets(address) external view returns (Aggregator, uint8);

  function getAssetToEthRate(address asset) external view returns (uint);
  function getAssetForEth(address asset, uint ethIn) external view returns (uint);
  function getEthForAsset(address asset, uint amount) external view returns (uint);

}

File 7 of 13 : ISAFURAMaster.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface ISAFURAMaster {

  function tokenAddress() external view returns (address);

  function owner() external view returns (address);

  function emergencyAdmin() external view returns (address);

  function masterInitialized() external view returns (bool);

  function isInternal(address _add) external view returns (bool);

  function isPause() external view returns (bool check);

  function isMember(address _add) external view returns (bool);

  function checkIsAuthToGoverned(address _add) external view returns (bool);

  function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress);

  function contractAddresses(bytes2 code) external view returns (address payable);

  function upgradeMultipleContracts(
    bytes2[] calldata _contractCodes,
    address payable[] calldata newAddresses
  ) external;

  function removeContracts(bytes2[] calldata contractCodesToRemove) external;

  function addNewInternalContracts(
    bytes2[] calldata _contractCodes,
    address payable[] calldata newAddresses,
    uint[] calldata _types
  ) external;

  function updateOwnerParameters(bytes8 code, address payable val) external;
}

File 8 of 13 : ISAFURAToken.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

interface ISAFURAToken {

  function burn(uint256 amount) external returns (bool);

  function burnFrom(address from, uint256 value) external returns (bool);

  function operatorTransfer(address from, uint256 value) external returns (bool);

  function mint(address account, uint256 amount) external;

  function isLockedForMV(address member) external view returns (uint);

  function whiteListed(address member) external view returns (bool);

  function addToWhiteList(address _member) external returns (bool);

  function removeFromWhiteList(address _member) external returns (bool);

  function changeOperator(address _newOperator) external returns (bool);

  function lockForMemberVote(address _of, uint _days) external;

  /**
 * @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 9 of 13 : ITokenController.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity >=0.5.0;

import "./ISAFURAToken.sol";

interface ITokenController {

  struct StakingPoolNXMBalances {
    uint128 rewards;
    uint128 deposits;
  }

  struct CoverInfo {
    uint16 claimCount;
    bool hasOpenClaim;
    bool hasAcceptedClaim;
    uint96 requestedPayoutAmount;
    // note: still 128 bits available here, can be used later
  }

  struct StakingPoolOwnershipOffer {
    address proposedManager;
    uint96 deadline;
  }

  function coverInfo(uint id) external view returns (
    uint16 claimCount,
    bool hasOpenClaim,
    bool hasAcceptedClaim,
    uint96 requestedPayoutAmount
  );

  function withdrawCoverNote(
    address _of,
    uint[] calldata _coverIds,
    uint[] calldata _indexes
  ) external;

  function changeOperator(address _newOperator) external;

  function operatorTransfer(address _from, address _to, uint _value) external returns (bool);

  function burnFrom(address _of, uint amount) external returns (bool);

  function addToWhitelist(address _member) external;

  function removeFromWhitelist(address _member) external;

  function mint(address _member, uint _amount) external;

  function lockForMemberVote(address _of, uint _days) external;

  function withdrawClaimAssessmentTokens(address[] calldata users) external;

  function getLockReasons(address _of) external view returns (bytes32[] memory reasons);

  function totalSupply() external view returns (uint);

  function totalBalanceOf(address _of) external view returns (uint amount);

  function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount);

  function getTokenPrice() external view returns (uint tokenPrice);

  function token() external view returns (ISAFURAToken);

  function getStakingPoolManager(uint poolId) external view returns (address manager);

  function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds);

  function isStakingPoolManager(address member) external view returns (bool);

  function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline);

  function transferStakingPoolsOwnership(address from, address to) external;

  function assignStakingPoolManager(uint poolId, address manager) external;

  function createStakingPoolOwnershipOffer(uint poolId, address proposedManager, uint deadline) external;

  function acceptStakingPoolOwnershipOffer(uint poolId) external;

  function cancelStakingPoolOwnershipOffer(uint poolId) external;

  function mintStakingPoolNXMRewards(uint amount, uint poolId) external;

  function burnStakingPoolNXMRewards(uint amount, uint poolId) external;

  function depositStakedNXM(address from, uint amount, uint poolId) external;

  function withdrawNXMStakeAndRewards(address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId) external;

  function burnStakedNXM(uint amount, uint poolId) external;

  function stakingPoolNXMBalances(uint poolId) external view returns(uint128 rewards, uint128 deposits);

  function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount);

  function getWithdrawableCoverNotes(
    address coverOwner
  ) external view returns (
    uint[] memory coverIds,
    bytes32[] memory lockReasons,
    uint withdrawableAmount
  );

  function getPendingRewards(address member) external view returns (uint);
}

File 10 of 13 : OwnedUpgradeabilityProxy.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.18;

import "./UpgradeabilityProxy.sol";

/**
 * @title OwnedUpgradeabilityProxy
 * @dev This contract combines an upgradeability proxy with basic authorization control functionalities
 */
contract OwnedUpgradeabilityProxy is UpgradeabilityProxy {
  /**
  * @dev Event to show ownership has been transferred
  * @param previousOwner representing the address of the previous owner
  * @param newOwner representing the address of the new owner
  */
  event ProxyOwnershipTransferred(address previousOwner, address newOwner);

  // Storage position of the owner of the contract
  bytes32 private constant PROXY_OWNER_POSITION = keccak256("org.govblocks.proxy.owner");

  /**
  * @dev the constructor sets the original owner of the contract to the sender account.
  */
  constructor(address _implementation) {
    _setUpgradeabilityOwner(msg.sender);
    _upgradeTo(_implementation);
  }

  /**
  * @dev Throws if called by any account other than the owner.
  */
  modifier onlyProxyOwner() {
    require(msg.sender == proxyOwner());
    _;
  }

  /**
  * @dev Tells the address of the owner
  * @return owner - the address of the owner
  */
  function proxyOwner() public view returns (address owner) {
    bytes32 position = PROXY_OWNER_POSITION;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      owner := sload(position)
    }
  }

  /**
  * @dev Allows the current owner to transfer control of the contract to a newOwner.
  * @param _newOwner The address to transfer ownership to.
  */
  function transferProxyOwnership(address _newOwner) public onlyProxyOwner {
    require(_newOwner != address(0));
    _setUpgradeabilityOwner(_newOwner);
    emit ProxyOwnershipTransferred(proxyOwner(), _newOwner);
  }

  /**
  * @dev Allows the proxy owner to upgrade the current version of the proxy.
  * @param _implementation representing the address of the new implementation to be set.
  */
  function upgradeTo(address _implementation) public onlyProxyOwner {
    _upgradeTo(_implementation);
  }

  /**
   * @dev Sets the address of the owner
  */
  function _setUpgradeabilityOwner(address _newProxyOwner) internal {
    bytes32 position = PROXY_OWNER_POSITION;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      sstore(position, _newProxyOwner)
    }
  }
}

File 11 of 13 : Proxy.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.18;

/**
 * @title Proxy
 * @dev Gives the possibility to delegate any call to a foreign implementation.
 */
abstract contract Proxy {

  /**
   * @dev Delegates the current call to `implementation`.
   */
  function _delegate() internal {
    address _impl = implementation();
    require(_impl != address(0));

    // solhint-disable-next-line no-inline-assembly
    assembly {
      let ptr := mload(0x40)
      calldatacopy(ptr, 0, calldatasize())
      let result := delegatecall(gas(), _impl, ptr, calldatasize(), 0, 0)
      let size := returndatasize()
      returndatacopy(ptr, 0, size)

      switch result
      case 0 {revert(ptr, size)}
      default {return (ptr, size)}
    }
  }

  /**
  * @dev Fallback function allowing to perform a delegatecall to the given implementation.
  * This function will return whatever the implementation call returns
  */
  fallback() external payable {
    _delegate();
  }

  /**
  * @dev Receive function allowing to perform a delegatecall to the given implementation.
  * This function will return whatever the implementation call returns
  */
  receive() external payable {
    _delegate();
  }

  /**
  * @dev Tells the address of the implementation where every call will be delegated.
  * @return address of the implementation to which it will be delegated
  */
  function implementation() virtual public view returns (address);
}

File 12 of 13 : UpgradeabilityProxy.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.18;

import "./Proxy.sol";

/**
 * @title UpgradeabilityProxy
 * @dev This contract represents a proxy where the implementation address to which it will delegate can be upgraded
 */
contract UpgradeabilityProxy is Proxy {
  /**
  * @dev This event will be emitted every time the implementation gets upgraded
  * @param implementation representing the address of the upgraded implementation
  */
  event Upgraded(address indexed implementation);

  // Storage position of the address of the current implementation
  bytes32 private constant IMPLEMENTATION_POSITION = keccak256("org.govblocks.proxy.implementation");

  /**
  * @dev Constructor function
  */
  // solhint-disable-next-line no-empty-blocks
  constructor() {}

  /**
  * @dev Tells the address of the current implementation
  * @return impl - address of the current implementation
  */
  function implementation() public override view returns (address impl) {
    bytes32 position = IMPLEMENTATION_POSITION;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      impl := sload(position)
    }
  }

  /**
  * @dev Sets the address of the current implementation
  * @param _newImplementation address representing the new implementation to be set
  */
  function _setImplementation(address _newImplementation) internal {
    bytes32 position = IMPLEMENTATION_POSITION;
    // solhint-disable-next-line no-inline-assembly
    assembly {
      sstore(position, _newImplementation)
    }
  }

  /**
  * @dev Upgrades the implementation address
  * @param _newImplementation representing the address of the new implementation to be set
  */
  function _upgradeTo(address _newImplementation) internal {
    address currentImplementation = implementation();
    require(currentImplementation != _newImplementation);
    _setImplementation(_newImplementation);
    emit Upgraded(_newImplementation);
  }
}

File 13 of 13 : NXMaster.sol
// SPDX-License-Identifier: GPL-3.0-only

pragma solidity ^0.8.18;

import "../../interfaces/IMasterAwareV2.sol";
import "../../interfaces/IMemberRoles.sol";
import "../../interfaces/ISAFURAMaster.sol";
import "../../interfaces/IPool.sol";
import "./external/OwnedUpgradeabilityProxy.sol";
import "../../interfaces/ITokenController.sol";
import "../../interfaces/ILegacyClaimsReward.sol";

contract NXMaster is ISAFURAMaster {

  address public _unusedM; // Governed contract masterAddress slot
  uint public _unused0;

  bytes2[] public contractCodes;
  mapping(address => bool) public contractsActive;
  mapping(bytes2 => address payable) public contractAddresses;
  mapping(bytes2 => bool) public isProxy;
  mapping(bytes2 => bool) public isReplaceable;

  address public tokenAddress;
  bool internal reentrancyLock;
  bool public masterInitialized;
  address public owner;
  uint public _unused1;

  address public emergencyAdmin;
  bool public paused;

  enum ContractType { Undefined, Replaceable, Proxy }

  event InternalContractAdded(bytes2 indexed code, address contractAddress, ContractType indexed contractType);
  event ContractUpgraded(bytes2 indexed code, address newAddress, address previousAddress, ContractType indexed contractType);
  event ContractRemoved(bytes2 indexed code, address contractAddress);
  event PauseConfigured(bool paused);

  modifier onlyAuthorizedToGovern() {
    require(getLatestAddress("GV") == msg.sender, "Not authorized");
    _;
  }

  modifier noReentrancy() {
    require(!reentrancyLock, "Reentrant call.");
    reentrancyLock = true;
    _;
    reentrancyLock = false;
  }

  modifier onlyEmergencyAdmin() {
    require(msg.sender == emergencyAdmin, "NXMaster: Not emergencyAdmin");
    _;
  }

  function initializeEmergencyAdmin() external {
    if (emergencyAdmin == address(0)) {
      emergencyAdmin = 0x422D71fb8040aBEF53f3a05d21A9B85eebB2995D;
    }
  }

  function addNewInternalContracts(
    bytes2[] calldata newContractCodes,
    address payable[] calldata newAddresses,
    uint[] calldata _types
  ) external onlyAuthorizedToGovern {
    require(newContractCodes.length == newAddresses.length, "NXMaster: newContractCodes.length != newAddresses.length.");
    require(newContractCodes.length == _types.length, "NXMaster: newContractCodes.length != _types.length");

    for (uint i = 0; i < newContractCodes.length; i++) {
      addNewInternalContract(newContractCodes[i], newAddresses[i], _types[i]);
    }

    updateAllDependencies();
  }

  /// @dev Adds new internal contract
  /// @param contractCode contract code for new contract
  /// @param contractAddress contract address for new contract
  /// @param _type pass 1 if contract is replaceable, 2 if contract is proxy
  function addNewInternalContract(
    bytes2 contractCode,
    address payable contractAddress,
    uint _type
  ) internal {

    require(contractAddresses[contractCode] == address(0), "NXMaster: Code already in use");
    require(contractAddress != address(0), "NXMaster: Contract address is 0");

    contractCodes.push(contractCode);
    address payable newInternalContract;
    uint contractType = uint8(_type);

    if (contractType == uint(ContractType.Replaceable)) {

      newInternalContract = contractAddress;
      isReplaceable[contractCode] = true;

    } else if (contractType == uint(ContractType.Proxy)) {

      uint salt = _type >> 8;

      if (salt == 0) {
        // contractCode will use the 16 most significant bits (leftmost)
        // block.number will use the least significant bits (rightmost)
        // example: contractCode = "XX" = 0x5858, block.number = 13565952 = 0xcf0000
        // result:  0x5858000000000000000000000000000000000000000000000000000000cf0000
        salt = uint(bytes32(contractCode)) + block.number;
      }

      // using the max address as the initial implementation to avoid revert in upgradeTo
      OwnedUpgradeabilityProxy proxy = new OwnedUpgradeabilityProxy{salt: bytes32(salt)}(address(type(uint160).max));
      proxy.upgradeTo(contractAddress);

      newInternalContract = payable(proxy);
      isProxy[contractCode] = true;

    } else {
      revert("NXMaster: Unsupported contract type");
    }

    contractAddresses[contractCode] = newInternalContract;
    contractsActive[newInternalContract] = true;

    IMasterAwareV2 up = IMasterAwareV2(newInternalContract);
    up.changeMasterAddress(address(this));

    emit InternalContractAdded(contractCode, contractAddress, ContractType(contractType));
  }

  /// @dev upgrades multiple contracts at a time
  function upgradeMultipleContracts(
    bytes2[] calldata _contractCodes,
    address payable[] calldata newAddresses
  ) external onlyAuthorizedToGovern {
    require(_contractCodes.length == newAddresses.length, "NXMaster: _contractCodes.length != newAddresses.length");

    for (uint i = 0; i < _contractCodes.length; i++) {
      address payable newAddress = newAddresses[i];
      bytes2 code = _contractCodes[i];
      require(newAddress != address(0), "NXMaster: Contract address is 0");

      if (isProxy[code]) {
        OwnedUpgradeabilityProxy proxy = OwnedUpgradeabilityProxy(contractAddresses[code]);
        address previousAddress = proxy.implementation();
        proxy.upgradeTo(newAddress);
        emit ContractUpgraded(code, newAddress, previousAddress, ContractType.Proxy);
        continue;
      }

      if (isReplaceable[code]) {
        address previousAddress = getLatestAddress(code);
        replaceContract(code, newAddress);
        emit ContractUpgraded(code, newAddress, previousAddress, ContractType.Replaceable);
        continue;
      }

      revert("NXMaster: Non-existant or non-upgradeable contract code");
    }

    updateAllDependencies();
  }

  function replaceContract(bytes2 code, address payable newAddress) internal {
    if (code == "CR") {
      ITokenController tc = ITokenController(getLatestAddress("TC"));
      tc.addToWhitelist(newAddress);
      tc.removeFromWhitelist(contractAddresses["CR"]);
      ILegacyClaimsReward cr = ILegacyClaimsReward(contractAddresses["CR"]);
      cr.upgrade(newAddress);
    } else if (code == "P1") {
      IPool p1 = IPool(contractAddresses["P1"]);
      p1.upgradeCapitalPool(newAddress);
    }
    address payable oldAddress = contractAddresses[code];
    contractsActive[oldAddress] = false;
    contractAddresses[code] = newAddress;
    contractsActive[newAddress] = true;

    IMasterAwareV2 up = IMasterAwareV2(contractAddresses[code]);
    up.changeMasterAddress(address(this));
  }

  function removeContracts(bytes2[] calldata contractCodesToRemove) external onlyAuthorizedToGovern {

    for (uint i = 0; i < contractCodesToRemove.length; i++) {
      bytes2 code = contractCodesToRemove[i];
      address contractAddress = contractAddresses[code];
      require(contractAddress != address(0), "NXMaster: Address is 0");
      require(isInternal(contractAddress), "NXMaster: Contract not internal");
      contractsActive[contractAddress] = false;
      contractAddresses[code] = payable(0);

      if (isProxy[code]) {
        isProxy[code] = false;
      }

      if (isReplaceable[code]) {
        isReplaceable[code] = false;
      }
      emit ContractRemoved(code, contractAddress);
    }

    // delete elements from contractCodes
    for (uint i = 0; i < contractCodes.length;) {
      for (uint j = 0; j < contractCodesToRemove.length; j++) {
        if (contractCodes[i] == contractCodesToRemove[j]) {
          contractCodes[i] = contractCodes[contractCodes.length - 1];
          contractCodes.pop();
          unchecked { i--; }
          break;
        }
      }
      unchecked { i++; }
    }

    updateAllDependencies();
  }

  function updateAllDependencies() internal {
    for (uint i = 0; i < contractCodes.length; i++) {
      IMasterAwareV2 up = IMasterAwareV2(contractAddresses[contractCodes[i]]);
      up.changeDependentContractAddress();
    }
  }

  /**
   * @dev set Emergency pause
   * @param _paused to toggle emergency pause ON/OFF
   */
  function setEmergencyPause(bool _paused) public onlyEmergencyAdmin {
    paused = _paused;
    emit PauseConfigured(_paused);
  }

  /// @dev checks whether the address is an internal contract address.
  function isInternal(address _contractAddress) public view returns (bool) {
    return contractsActive[_contractAddress];
  }

  /// @dev Checks whether emergency pause is on/not.
  function isPause() public view returns (bool) {
    return paused;
  }

  /// @dev checks whether the address is a member of the mutual or not.
  function isMember(address _add) public view returns (bool) {
    IMemberRoles mr = IMemberRoles(getLatestAddress("MR"));
    return mr.checkRole(_add, uint(IMemberRoles.Role.Member));
  }

  /// @dev Gets current contract codes and their addresses
  /// @return _contractCodes - all stored contract codes
  /// @return _contractAddresses - all stored contract addresses
  function getInternalContracts() public view returns (
    bytes2[] memory _contractCodes,
    address[] memory _contractAddresses
  ) {
    _contractCodes = contractCodes;
    _contractAddresses = new address[](contractCodes.length);

    for (uint i = 0; i < _contractCodes.length; i++) {
      _contractAddresses[i] = contractAddresses[contractCodes[i]];
    }
  }

  /**
 * @dev returns the address of token controller
   * @return address is returned
   */
  function dAppLocker() public view returns (address) {
    return getLatestAddress("TC");
  }

  /// @dev Gets latest contract address
  /// @param _contractName Contract name to fetch
  function getLatestAddress(bytes2 _contractName) public view returns (address payable contractAddress) {
    contractAddress = contractAddresses[_contractName];
  }

  /**
   * @dev to check if the address is authorized to govern or not
   * @param _add is the address in concern
   * @return the boolean status status for the check
   */
  function checkIsAuthToGoverned(address _add) public view returns (bool) {
    return getLatestAddress("GV") == _add;
  }

  /**
   * @dev to update the owner parameters
   * @param code is the associated code
   * @param val is value to be set
   */
  function updateOwnerParameters(bytes8 code, address payable val) public onlyAuthorizedToGovern {
    if (code == "EMADMIN") {
      emergencyAdmin = val;
    } else {
      revert("Invalid param code");
    }
  }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes2","name":"code","type":"bytes2"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"}],"name":"ContractRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes2","name":"code","type":"bytes2"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"},{"indexed":false,"internalType":"address","name":"previousAddress","type":"address"},{"indexed":true,"internalType":"enum NXMaster.ContractType","name":"contractType","type":"uint8"}],"name":"ContractUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes2","name":"code","type":"bytes2"},{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"enum NXMaster.ContractType","name":"contractType","type":"uint8"}],"name":"InternalContractAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"paused","type":"bool"}],"name":"PauseConfigured","type":"event"},{"inputs":[],"name":"_unused0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unused1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unusedM","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2[]","name":"newContractCodes","type":"bytes2[]"},{"internalType":"address payable[]","name":"newAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_types","type":"uint256[]"}],"name":"addNewInternalContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"checkIsAuthToGoverned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2","name":"","type":"bytes2"}],"name":"contractAddresses","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"contractCodes","outputs":[{"internalType":"bytes2","name":"","type":"bytes2"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dAppLocker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInternalContracts","outputs":[{"internalType":"bytes2[]","name":"_contractCodes","type":"bytes2[]"},{"internalType":"address[]","name":"_contractAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2","name":"_contractName","type":"bytes2"}],"name":"getLatestAddress","outputs":[{"internalType":"address payable","name":"contractAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_emergencyAdmin","type":"address"},{"internalType":"bytes2[]","name":"_contractNames","type":"bytes2[]"},{"internalType":"uint8[]","name":"_contractTypes","type":"uint8[]"},{"internalType":"address payable[]","name":"_contractAddresses","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initializeEmergencyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"isInternal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2","name":"","type":"bytes2"}],"name":"isProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2","name":"","type":"bytes2"}],"name":"isReplaceable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes2[]","name":"contractCodesToRemove","type":"bytes2[]"}],"name":"removeContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setEmergencyPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newGV","type":"address"}],"name":"switchGovernanceAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"},{"internalType":"address payable","name":"val","type":"address"}],"name":"updateOwnerParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes2[]","name":"_contractCodes","type":"bytes2[]"},{"internalType":"address payable[]","name":"newAddresses","type":"address[]"}],"name":"upgradeMultipleContracts","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620001e95760003560e01c80638da5cb5b116200010d578063c15041d511620000a3578063d21f14ef116200007a578063d21f14ef1462000495578063d8d1a657146200049f578063e2cab14d14620004b6578063ff0938a714620004cd57600080fd5b8063c15041d5146200044a578063c64c2c35146200045f578063d13c9cc1146200048b57600080fd5b80639d76ea5811620000e45780639d76ea5814620003f4578063a230c5241462000408578063a54a9b47146200041f578063b96a8995146200043357600080fd5b80638da5cb5b146200038b5780638f16c41c146200039f578063973e753b14620003ce57600080fd5b8063469fc1d211620001835780636575eea5116200015a5780636575eea514620003305780636fc4ed4c146200034757806370905dce146200035e578063738e91a8146200037257600080fd5b8063469fc1d214620002ed5780635834e67a14620003045780635c975abb146200031b57600080fd5b80632079632311620001c457806320796323146200028a57806338c8349414620002a45780633a12507f14620002bd57806344d479e714620002c757600080fd5b80630138285814620001ee57806301c09f1414620002225780630997d56b1462000259575b600080fd5b62000205620001ff36600462001fad565b620004e0565b6040516001600160a01b0390911681526020015b60405180910390f35b620002486200023336600462001fef565b60036020526000908152604090205460ff1681565b604051901515815260200162000219565b620002706200026a3660046200200f565b62000505565b6040516001600160f01b0319909116815260200162000219565b620002946200053d565b6040516200021992919062002029565b620002bb620002b53660046200210a565b620006c5565b005b62000205620009c5565b62000248620002d836600462001fad565b60056020526000908152604090205460ff1681565b620002bb620002fe366004620021ee565b620009dc565b620002486200031536600462001fef565b62000de7565b600a546200024890600160a01b900460ff1681565b620002bb6200034136600462002234565b62000e13565b620002bb6200035836600462001fef565b62000fe2565b600a5462000205906001600160a01b031681565b6200037c60015481565b60405190815260200162000219565b60085462000205906001600160a01b031681565b62000248620003b036600462001fef565b6001600160a01b031660009081526003602052604090205460ff1690565b62000248620003df36600462001fad565b60066020526000908152604090205460ff1681565b60075462000205906001600160a01b031681565b620002486200041936600462001fef565b6200117d565b60005462000205906001600160a01b031681565b620002bb62000444366004620022d8565b6200120f565b6007546200024890600160a81b900460ff1681565b620002056200047036600462001fad565b6004602052600090815260409020546001600160a01b031681565b620002bb62001618565b6200037c60095481565b620002bb620004b03660046200235a565b62001652565b620002bb620004c73660046200237a565b62001707565b600a54600160a01b900460ff1662000248565b6001600160f01b0319166000908152600460205260409020546001600160a01b031690565b600281815481106200051657600080fd5b9060005260206000209060109182820401919006600202915054906101000a900460f01b81565b6060806002805480602002602001604051908101604052809291908181526020018280548015620005bb57602002820191906000526020600020906000905b82829054906101000a900460f01b6001600160f01b031916815260200190600201906020826001010492830192600103820291508084116200057c5790505b5050600254939550505067ffffffffffffffff8211159050620005e257620005e2620023c4565b6040519080825280602002602001820160405280156200060c578160200160208202803683370190505b50905060005b8251811015620006c0576004600060028381548110620006365762000636620023da565b60009182526020808320601083040154600f9092166002026101000a90910460f01b6001600160f01b031916835282019290925260400190205482516001600160a01b0390911690839083908110620006935762000693620023da565b6001600160a01b039092166020928302919091019091015280620006b78162002406565b91505062000612565b509091565b600754600160a81b900460ff16156200070d5760405162461bcd60e51b8152602060048201526005602482015264085a5b9a5d60da1b60448201526064015b60405180910390fd5b60078054600880546001600160a01b03808e166001600160a01b0319928316179092558b8216600161ff0160a01b031990931692909217600160a81b17909255600a8054928a1692909116919091179055306000908152600360205260409020805460ff19166001179055848314620007d35760405162461bcd60e51b815260206004820152602160248201527f636865636b206e616d6573202620747970657320617272617973206c656e67746044820152600d60fb1b606482015260840162000704565b60005b85811015620009b9576000878783818110620007f657620007f6620023da565b90506020020160208101906200080d919062001fad565b90506000848484818110620008265762000826620023da565b90506020020160208101906200083d919062001fef565b6002805460018181018355601082047f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805460f088901c600f9094169094026101000a92830261ffff90930219909316919091179091556001600160f01b03198416600090815260046020908152604080832080546001600160a01b0387166001600160a01b03199091168117909155835260039091529020805460ff191690911790559050868684818110620008f957620008f9620023da565b905060200201602081019062000910919062002422565b60ff1660010362000945576001600160f01b031982166000908152600660205260409020805460ff19166001179055620009a1565b8686848181106200095a576200095a620023da565b905060200201602081019062000971919062002422565b60ff16600203620009a1576001600160f01b031982166000908152600560205260409020805460ff191660011790555b50508080620009b09062002406565b915050620007d6565b50505050505050505050565b6000620009d761544360f01b620004e0565b905090565b33620009ed6123ab60f11b620004e0565b6001600160a01b03161462000a165760405162461bcd60e51b8152600401620007049062002447565b60005b8181101562000c4557600083838381811062000a395762000a39620023da565b905060200201602081019062000a50919062001fad565b6001600160f01b031981166000908152600460205260409020549091506001600160a01b03168062000abe5760405162461bcd60e51b815260206004820152601660248201527504e584d61737465723a204164647265737320697320360541b604482015260640162000704565b6001600160a01b03811660009081526003602052604090205460ff1662000b285760405162461bcd60e51b815260206004820152601f60248201527f4e584d61737465723a20436f6e7472616374206e6f7420696e7465726e616c00604482015260640162000704565b6001600160a01b0381166000908152600360209081526040808320805460ff191690556001600160f01b0319851683526004825280832080546001600160a01b0319169055600590915290205460ff161562000ba0576001600160f01b031982166000908152600560205260409020805460ff191690555b6001600160f01b0319821660009081526006602052604090205460ff161562000be5576001600160f01b031982166000908152600660205260409020805460ff191690555b6040516001600160a01b03821681526001600160f01b03198316907f9a0e76e7e16765c82c2120b84ccaa2e1034a7862b90608e5e6e7c688a512145f9060200160405180910390a25050808062000c3c9062002406565b91505062000a19565b5060005b60025481101562000dd85760005b8281101562000dce5783838281811062000c755762000c75620023da565b905060200201602081019062000c8c919062001fad565b6001600160f01b0319166002838154811062000cac5762000cac620023da565b90600052602060002090601091828204019190066002029054906101000a900460f01b6001600160f01b0319160362000db9576002805462000cf1906001906200246f565b8154811062000d045762000d04620023da565b90600052602060002090601091828204019190066002029054906101000a900460f01b6002838154811062000d3d5762000d3d620023da565b90600052602060002090601091828204019190066002026101000a81548161ffff021916908360f01c0217905550600280548062000d7f5762000d7f6200248b565b6000828152602090206010600019928301908104909101805461ffff6002600f8516026101000a0219169055909155919091019062000dce565b8062000dc58162002406565b91505062000c57565b5060010162000c49565b5062000de3620017bc565b5050565b6000816001600160a01b031662000e036123ab60f11b620004e0565b6001600160a01b03161492915050565b3362000e246123ab60f11b620004e0565b6001600160a01b03161462000e4d5760405162461bcd60e51b8152600401620007049062002447565b84831462000ec45760405162461bcd60e51b815260206004820152603960248201527f4e584d61737465723a206e6577436f6e7472616374436f6465732e6c656e677460448201527f6820213d206e65774164647265737365732e6c656e6774682e00000000000000606482015260840162000704565b84811462000f305760405162461bcd60e51b815260206004820152603260248201527f4e584d61737465723a206e6577436f6e7472616374436f6465732e6c656e67746044820152710d040427a40bee8f2e0cae65cd8cadccee8d60731b606482015260840162000704565b60005b8581101562000fcf5762000fba87878381811062000f555762000f55620023da565b905060200201602081019062000f6c919062001fad565b86868481811062000f815762000f81620023da565b905060200201602081019062000f98919062001fef565b85858581811062000fad5762000fad620023da565b9050602002013562001895565b8062000fc68162002406565b91505062000f33565b5062000fda620017bc565b505050505050565b7f48b5d77e6708fd7f3423a4467845bea6010627a481f796e5f084bf79a1374f4d80546001600160a01b038381166001600160a01b03198316811790935516600090815260036020526040808220805460ff19908116909155928252812080549092166001179091555b60025481101562000de35760006004600060028481548110620010735762001073620023da565b60009182526020808320601083040154600f9092166002026101000a90910460f01b6001600160f01b03191683528201929092526040908101909120549051633519957d60e21b81523060048201526001600160a01b0390911691508190819063d46655f490602401600060405180830381600087803b158015620010f757600080fd5b505af11580156200110c573d6000803e3d6000fd5b50505050806001600160a01b0316630ea9c9846040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156200114c57600080fd5b505af115801562001161573d6000803e3d6000fd5b5050505050508080620011749062002406565b9150506200104c565b600080620011906126a960f11b620004e0565b60405163505ef22f60e01b81526001600160a01b038581166004830152600260248301529192509082169063505ef22f90604401602060405180830381865afa158015620011e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012089190620024b7565b9392505050565b33620012206123ab60f11b620004e0565b6001600160a01b031614620012495760405162461bcd60e51b8152600401620007049062002447565b828114620012b95760405162461bcd60e51b815260206004820152603660248201527f4e584d61737465723a205f636f6e7472616374436f6465732e6c656e677468206044820152750427a40dccaee82c8c8e4cae6e6cae65cd8cadccee8d60531b606482015260840162000704565b60005b8381101562001607576000838383818110620012dc57620012dc620023da565b9050602002016020810190620012f3919062001fef565b905060008686848181106200130c576200130c620023da565b905060200201602081019062001323919062001fad565b90506001600160a01b0382166200137d5760405162461bcd60e51b815260206004820152601f60248201527f4e584d61737465723a20436f6e74726163742061646472657373206973203000604482015260640162000704565b6001600160f01b0319811660009081526005602052604090205460ff1615620014eb576001600160f01b031981166000908152600460208181526040808420548151635c60da1b60e01b815291516001600160a01b0390911694938593635c60da1b93808301939192908290030181865afa15801562001401573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620014279190620024d7565b604051631b2ce7f360e11b81526001600160a01b03868116600483015291925090831690633659cfe690602401600060405180830381600087803b1580156200146f57600080fd5b505af115801562001484573d6000803e3d6000fd5b506002925062001492915050565b604080516001600160a01b038088168252841660208201526001600160f01b03198616917fad196ff1639327e1b88a90842d4140c2c8bdd4c0bbb4f3800484c0229fd0b3bc910160405180910390a350505050620015f2565b6001600160f01b0319811660009081526006602052604090205460ff1615620015835760006200151b82620004e0565b905062001529828462001c76565b6001604080516001600160a01b038087168252841660208201526001600160f01b03198516917fad196ff1639327e1b88a90842d4140c2c8bdd4c0bbb4f3800484c0229fd0b3bc910160405180910390a3505050620015f2565b60405162461bcd60e51b815260206004820152603760248201527f4e584d61737465723a204e6f6e2d6578697374616e74206f72206e6f6e2d757060448201527f677261646561626c6520636f6e747261637420636f6465000000000000000000606482015260840162000704565b80620015fe8162002406565b915050620012bc565b5062001612620017bc565b50505050565b600a546001600160a01b03166200165057600a80546001600160a01b03191673422d71fb8040abef53f3a05d21a9b85eebb2995d1790555b565b600a546001600160a01b03163314620016ae5760405162461bcd60e51b815260206004820152601c60248201527f4e584d61737465723a204e6f7420656d657267656e637941646d696e00000000604482015260640162000704565b600a8054821515600160a01b0260ff60a01b199091161790556040517faf0a7aed9964225ce1e722b34382b891b7fa58d0542f9bef86ac8b465790849690620016fc90831515815260200190565b60405180910390a150565b33620017186123ab60f11b620004e0565b6001600160a01b031614620017415760405162461bcd60e51b8152600401620007049062002447565b6001600160c01b031982166622a6a0a226a4a760c91b036200177e57600a80546001600160a01b0383166001600160a01b03199091161790555050565b60405162461bcd60e51b8152602060048201526012602482015271496e76616c696420706172616d20636f646560701b604482015260640162000704565b60005b600254811015620018925760006004600060028481548110620017e657620017e6620023da565b60009182526020808320601083040154600f9092166002026101000a90910460f01b6001600160f01b0319168352820192909252604090810182205481516303aa726160e21b815291516001600160a01b0390911693508392630ea9c984926004808201939182900301818387803b1580156200186257600080fd5b505af115801562001877573d6000803e3d6000fd5b50505050508080620018899062002406565b915050620017bf565b50565b6001600160f01b031983166000908152600460205260409020546001600160a01b031615620019075760405162461bcd60e51b815260206004820152601d60248201527f4e584d61737465723a20436f646520616c726561647920696e20757365000000604482015260640162000704565b6001600160a01b0382166200195f5760405162461bcd60e51b815260206004820152601f60248201527f4e584d61737465723a20436f6e74726163742061646472657373206973203000604482015260640162000704565b6002805460018101825560008281527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace6010830401805461ffff600f9094169094026101000a9283021990931660f087901c929092029190911790915560ff82166000198101620019f7576001600160f01b031985166000908152600660205260409020805460ff1916600117905583915062001b5a565b6002810362001b0557600883901c600081900362001a285762001a25436001600160f01b03198816620024f7565b90505b60008160001b6001600160a01b0360405162001a449062001f9f565b6001600160a01b0390911681526020018190604051809103906000f590508015801562001a75573d6000803e3d6000fd5b50604051631b2ce7f360e11b81526001600160a01b03888116600483015291925090821690633659cfe690602401600060405180830381600087803b15801562001abe57600080fd5b505af115801562001ad3573d6000803e3d6000fd5b5050506001600160f01b031988166000908152600560205260409020805460ff1916600117905550925062001b5a9050565b60405162461bcd60e51b815260206004820152602360248201527f4e584d61737465723a20556e737570706f7274656420636f6e7472616374207460448201526279706560e81b606482015260840162000704565b6001600160f01b03198516600090815260046020818152604080842080546001600160a01b0319166001600160a01b038816908117909155808552600390925292839020805460ff191660011790559151633519957d60e21b8152309181019190915283919063d46655f490602401600060405180830381600087803b15801562001be457600080fd5b505af115801562001bf9573d6000803e3d6000fd5b5050505081600281111562001c125762001c12620024a1565b600281111562001c265762001c26620024a1565b6040516001600160a01b03871681526001600160f01b03198816907f6eba5fe8fc6be4cbbc0b7b5881ffa36428b8dee7170dd5a96cd4e76da2c682ec9060200160405180910390a3505050505050565b6001600160f01b031982166121a960f11b0362001e2b57600062001c9f61544360f01b620004e0565b60405163e43252d760e01b81526001600160a01b0384811660048301529192509082169063e43252d790602401600060405180830381600087803b15801562001ce757600080fd5b505af115801562001cfc573d6000803e3d6000fd5b50506121a960f11b6000525050600460208190527f81a16a8e02e895bc8f23c4b57164801632b22336e581fdbd05bc322b5dbf847454604051638ab1d68160e01b81526001600160a01b0391821692810192909252821690638ab1d68190602401600060405180830381600087803b15801562001d7857600080fd5b505af115801562001d8d573d6000803e3d6000fd5b50506121a960f11b6000525050600460208190527f81a16a8e02e895bc8f23c4b57164801632b22336e581fdbd05bc322b5dbf84745460405162900f0160e41b81526001600160a01b03858116938201939093529116908190630900f01090602401600060405180830381600087803b15801562001e0a57600080fd5b505af115801562001e1f573d6000803e3d6000fd5b50505050505062001ed7565b6001600160f01b0319821661503160f01b0362001ed75761503160f01b600052600460208190527f65e528c366d24fe1267504a3fd0d0e6ee46d1498cc6709837295d0fa5e628654546040516366fd551d60e01b81526001600160a01b038481169382019390935291169081906366fd551d90602401600060405180830381600087803b15801562001ebc57600080fd5b505af115801562001ed1573d6000803e3d6000fd5b50505050505b6001600160f01b03198216600081815260046020818152604080842080546001600160a01b0390811680875260038552838720805460ff1990811690915583546001600160a01b0319168a84169081178555885284882080549091166001179055969095529183905290549051633519957d60e21b8152309281019290925290911690819063d46655f490602401600060405180830381600087803b15801562001f8057600080fd5b505af115801562001f95573d6000803e3d6000fd5b5050505050505050565b6104aa806200250e83390190565b60006020828403121562001fc057600080fd5b81356001600160f01b0319811681146200120857600080fd5b6001600160a01b03811681146200189257600080fd5b6000602082840312156200200257600080fd5b8135620012088162001fd9565b6000602082840312156200202257600080fd5b5035919050565b604080825283519082018190526000906020906060840190828701845b828110156200206e5781516001600160f01b0319168452928401929084019060010162002046565b5050508381038285015284518082528583019183019060005b81811015620020ae5783516001600160a01b03168352928401929184019160010162002087565b5090979650505050505050565b60008083601f840112620020ce57600080fd5b50813567ffffffffffffffff811115620020e757600080fd5b6020830191508360208260051b85010111156200210357600080fd5b9250929050565b600080600080600080600080600060c08a8c0312156200212957600080fd5b8935620021368162001fd9565b985060208a0135620021488162001fd9565b975060408a01356200215a8162001fd9565b965060608a013567ffffffffffffffff808211156200217857600080fd5b620021868d838e01620020bb565b909850965060808c0135915080821115620021a057600080fd5b620021ae8d838e01620020bb565b909650945060a08c0135915080821115620021c857600080fd5b50620021d78c828d01620020bb565b915080935050809150509295985092959850929598565b600080602083850312156200220257600080fd5b823567ffffffffffffffff8111156200221a57600080fd5b6200222885828601620020bb565b90969095509350505050565b600080600080600080606087890312156200224e57600080fd5b863567ffffffffffffffff808211156200226757600080fd5b620022758a838b01620020bb565b909850965060208901359150808211156200228f57600080fd5b6200229d8a838b01620020bb565b90965094506040890135915080821115620022b757600080fd5b50620022c689828a01620020bb565b979a9699509497509295939492505050565b60008060008060408587031215620022ef57600080fd5b843567ffffffffffffffff808211156200230857600080fd5b6200231688838901620020bb565b909650945060208701359150808211156200233057600080fd5b506200233f87828801620020bb565b95989497509550505050565b80151581146200189257600080fd5b6000602082840312156200236d57600080fd5b813562001208816200234b565b600080604083850312156200238e57600080fd5b82356001600160c01b031981168114620023a757600080fd5b91506020830135620023b98162001fd9565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016200241b576200241b620023f0565b5060010190565b6000602082840312156200243557600080fd5b813560ff811681146200120857600080fd5b6020808252600e908201526d139bdd08185d5d1a1bdc9a5e995960921b604082015260600190565b81810381811115620024855762002485620023f0565b92915050565b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b600060208284031215620024ca57600080fd5b815162001208816200234b565b600060208284031215620024ea57600080fd5b8151620012088162001fd9565b80820180821115620024855762002485620023f056fe608060405234801561001057600080fd5b506040516104aa3803806104aa83398101604081905261002f916100ec565b610057337f2dbc9b6b8d09ee15269835797a45b6f772b81406ec218e6fd64b114f376266ba55565b61006081610066565b5061011c565b600061007e60008051602061048a8339815191525490565b9050816001600160a01b0316816001600160a01b03160361009e57600080fd5b6100b48260008051602061048a83398151915255565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000602082840312156100fe57600080fd5b81516001600160a01b038116811461011557600080fd5b9392505050565b61035f8061012b6000396000f3fe6080604052600436106100435760003560e01c8063025313a21461005a5780633659cfe6146100945780635c60da1b146100b4578063f1739cae146100d657610052565b36610052576100506100f6565b005b6100506100f6565b34801561006657600080fd5b506000805160206102ea833981519152545b6040516001600160a01b03909116815260200160405180910390f35b3480156100a057600080fd5b506100506100af3660046102b9565b610148565b3480156100c057600080fd5b5060008051602061030a83398151915254610078565b3480156100e257600080fd5b506100506100f13660046102b9565b610181565b600061010e60008051602061030a8339815191525490565b90506001600160a01b03811661012357600080fd5b60405136600082376000803683855af43d806000843e818015610144578184f35b8184fd5b6000805160206102ea833981519152546001600160a01b0316336001600160a01b03161461017557600080fd5b61017e81610233565b50565b6000805160206102ea833981519152546001600160a01b0316336001600160a01b0316146101ae57600080fd5b6001600160a01b0381166101c157600080fd5b6101d7816000805160206102ea83398151915255565b7f5a3e66efaa1e445ebd894728a69d6959842ea1e97bd79b892797106e270efcd961020e6000805160206102ea8339815191525490565b604080516001600160a01b03928316815291841660208301520160405180910390a150565b600061024b60008051602061030a8339815191525490565b9050816001600160a01b0316816001600160a01b03160361026b57600080fd5b6102818260008051602061030a83398151915255565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a25050565b6000602082840312156102cb57600080fd5b81356001600160a01b03811681146102e257600080fd5b939250505056fe2dbc9b6b8d09ee15269835797a45b6f772b81406ec218e6fd64b114f376266ba7fb5080a7084f4c60aade0a78fc13ba4ba6555b60e554360d005f0d684cea186a26469706673582212201057513f99002041344c19a488bd48c257a905888fbb455418e934b436488f0b64736f6c634300081200337fb5080a7084f4c60aade0a78fc13ba4ba6555b60e554360d005f0d684cea186a26469706673582212209bf52131e7a333b18ee004ec0f774aa8b99dc28aaa3805bbbae069d831c8309164736f6c63430008120033

Block Transaction 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
[ Download: CSV Export  ]

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.