S Price: $0.070283 (-1.47%)
Gas: 55 Gwei

Contract

0x694b19357E9Cb219Fa2d3db7483d09101D89F777

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Set Chain Dragon...582192842025-12-18 3:40:1937 days ago1766029219IN
0x694b1935...01D89F777
0 S0.0025947550
Set Ve Dragon582192832025-12-18 3:40:1737 days ago1766029217IN
0x694b1935...01D89F777
0 S0.0025528550
Set Gauge Contro...582192812025-12-18 3:40:1537 days ago1766029215IN
0x694b1935...01D89F777
0 S0.0025357550
Set Lottery Mana...582192792025-12-18 3:40:1137 days ago1766029211IN
0x694b1935...01D89F777
0 S0.0025437550
Set Dragon Token582192752025-12-18 3:40:0937 days ago1766029209IN
0x694b1935...01D89F777
0 S0.0025848550
Set Layer Zero E...582192732025-12-18 3:40:0737 days ago1766029207IN
0x694b1935...01D89F777
0 S0.0015478550
Register Chain582192712025-12-18 3:40:0437 days ago1766029204IN
0x694b1935...01D89F777
0 S0.0083876550
Register Chain582192692025-12-18 3:40:0237 days ago1766029202IN
0x694b1935...01D89F777
0 S0.0083148550
Register Chain582192652025-12-18 3:39:5937 days ago1766029199IN
0x694b1935...01D89F777
0 S0.008319150
Register Chain582192642025-12-18 3:39:5837 days ago1766029198IN
0x694b1935...01D89F777
0 S0.0083256550
Register Chain582192622025-12-18 3:39:5437 days ago1766029194IN
0x694b1935...01D89F777
0 S0.0083901550
Register Chain582192612025-12-18 3:39:5337 days ago1766029193IN
0x694b1935...01D89F777
0 S0.0083763550
Register Chain582192602025-12-18 3:39:5037 days ago1766029190IN
0x694b1935...01D89F777
0 S0.010099650
Set Chain Id To ...582192552025-12-18 3:39:4837 days ago1766029188IN
0x694b1935...01D89F777
0 S0.0036962550
Set Chain Id To ...582192512025-12-18 3:39:4637 days ago1766029186IN
0x694b1935...01D89F777
0 S0.0036669550
Set Chain Id To ...582192482025-12-18 3:39:4537 days ago1766029185IN
0x694b1935...01D89F777
0 S0.0016010550
Set Chain Id To ...582192442025-12-18 3:39:4237 days ago1766029182IN
0x694b1935...01D89F777
0 S0.0036962550
Set Chain Id To ...582192422025-12-18 3:39:4037 days ago1766029180IN
0x694b1935...01D89F777
0 S0.0036669550
Set Chain Id To ...582192402025-12-18 3:39:3837 days ago1766029178IN
0x694b1935...01D89F777
0 S0.0036962550
Set Chain Id To ...582192372025-12-18 3:39:3637 days ago1766029176IN
0x694b1935...01D89F777
0 S0.0016142550
Set Chain Id To ...582192362025-12-18 3:39:3437 days ago1766029174IN
0x694b1935...01D89F777
0 S0.0036669550
Set Lz Config578920072025-12-14 6:08:5841 days ago1765692538IN
0x694b1935...01D89F777
0 S0.01294750
Set Lz Config578919232025-12-14 6:07:2041 days ago1765692440IN
0x694b1935...01D89F777
0 S0.009963250
Set Layer Zero E...578897352025-12-14 5:19:2141 days ago1765689561IN
0x694b1935...01D89F777
0 S0.0024860550
Set Layer Zero E...578896732025-12-14 5:17:5541 days ago1765689475IN
0x694b1935...01D89F777
0 S0.0024860550
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
578830552025-12-14 2:40:2241 days ago1765680022  Contract Creation0 S
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
OmniDragonRegistry

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 1 runs

Other Settings:
cancun EvmVersion
File 1 of 4 : OmniDragonRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import "@openzeppelin/contracts/access/Ownable.sol";
import "../../interfaces/config/IOmniDragonRegistry.sol";

/**
 * @title OmniDragonRegistry
 * @author 0xakita.eth
 * @dev Registry for omniDRAGON deployment
 *
 * Provides:
 * - Deterministic address calculation via CREATE2
 * - Basic chain configuration storage
 * - LayerZero configuration during deployment
 */
contract OmniDragonRegistry is IOmniDragonRegistry, Ownable {
  // Chain configuration
  mapping(uint16 => IOmniDragonRegistry.ChainConfig) private chainConfigs;
  uint16[] private supportedChains;
  uint16 private currentChainId;
  uint256 public constant MAX_SUPPORTED_CHAINS = 69;

  // LayerZero endpoints and mapping
  mapping(uint256 => uint32) public chainIdToEid;
  mapping(uint32 => uint256) public eidToChainId;
  mapping(uint16 => address) public layerZeroEndpoints;
  address public immutable layerZeroCommonEndpoint;
  address public immutable layerZeroUncommonEndpoint;

  // Oracles
  mapping(uint16 => address) public priceOracles;
  mapping(uint16 => IOmniDragonRegistry.OracleConfig) public oracleConfigs;
  address public primaryOracle;
  uint32 public primaryChainEid;
  mapping(uint16 => address) public secondaryOracles;

  // ============ Ecosystem Contract Registry ============
  mapping(uint16 => address) public jackpotVaults;      // chainId => vault
  mapping(uint16 => address) public gasReserves;        // chainId => LZ gas reserve
  mapping(uint16 => address) public lotteryManagers;    // chainId => lottery manager
  mapping(uint16 => address) public v4Hooks;            // chainId => V4 hook
  mapping(uint16 => address) public dragonTokens;       // chainId => DRAGON token
  
  // ============ DragonOVault Vault System ============
  mapping(uint16 => address) public dragonOVaults;  // chainId => DragonOVault vault
  mapping(uint16 => address) public veDragonContracts;  // chainId => veDRAGON
  mapping(uint16 => address) public gaugeControllers;   // chainId => GaugeController
  mapping(uint16 => address) public lpManagers;         // chainId => DragonLPManager

  // Hub chain configuration (Base is the hub)
  uint16 public hubChainId = 8453;  // Base
  uint32 public hubChainEid = 30184;

  // ============ LayerZero Per-Chain Config ============
  mapping(uint16 => IOmniDragonRegistry.LzConfig) public lzConfigs;
  
  // Default LZ config for standard chains (uses common endpoint)
  IOmniDragonRegistry.LzConfig public defaultLzConfig;
  
  // Chains that require custom OApp setup (e.g., Monad, Sonic)
  mapping(uint16 => bool) public customOAppChains;

  // Events
  event CurrentChainSet(uint16 indexed chainId);
  event LayerZeroConfigured(address indexed oapp, uint32 indexed eid, string configType);
  event LayerZeroLibrarySet(address indexed oapp, uint32 indexed eid, address lib, string libraryType);
  event LayerZeroEndpointUpdated(uint16 indexed chainId, address endpoint);
  event WrappedNativeSymbolUpdated(uint16 indexed chainId, string symbol);
  event ChainIdToEidUpdated(uint256 chainId, uint32 eid);
  event SecondaryOracleSet(uint16 indexed chainId, address indexed oracle);
  event EcosystemContractSet(uint16 indexed chainId, string contractType, address indexed contractAddress);
  event HubChainSet(uint16 chainId, uint32 eid);

  // Errors
  error ChainAlreadyRegistered(uint16 chainId);
  error ChainNotRegistered(uint16 chainId);
  error ZeroAddress();
  error TooManyChains();

  struct SetConfigParam { uint32 eid; uint32 configType; bytes config; }

  constructor(address _initialOwner) Ownable(_initialOwner) {
    currentChainId = uint16(block.chainid);
    // Common LayerZero endpoint address (used as default fallback)
    layerZeroCommonEndpoint = 0x1a44076050125825900e736c501f859c50fE728c;
    layerZeroUncommonEndpoint = 0x6F475642a6e85809B1c36Fa62763669b1b48DD5B;
    
    // Only Base (hub chain) is pre-configured - all other chains configured via setLayerZeroEndpoint()
    layerZeroEndpoints[8453] = layerZeroCommonEndpoint; // Base (hub)
    chainIdToEid[8453] = 30184; // Base EID
    eidToChainId[30184] = 8453;
  }

  // Internal
  function _getDefaultWrappedNativeSymbol(uint256 _chainId) internal pure returns (string memory) {
    if (_chainId == 146) return "WS";
    if (_chainId == 43114) return "WAVAX";
    if (_chainId == 250) return "WFTM";
    if (_chainId == 137) return "WMATIC";
    if (_chainId == 56) return "WBNB";
    if (_chainId == 239) return "WTAC";
    if (_chainId == 999) return "WHYPE";  // HyperEVM (Hyperliquid)
    if (_chainId == 30390) return "WMONAD";
    return "WETH";
  }

  // Chain config
  function setCurrentChainId(uint16 _chainId) external onlyOwner { currentChainId = _chainId; emit CurrentChainSet(_chainId); }

  function registerChain(
    uint16 _chainId, 
    string calldata _chainName, 
    address _wrappedNativeToken, 
    bool _isActive
  ) external override onlyOwner {
    if (chainConfigs[_chainId].chainId == _chainId) revert ChainAlreadyRegistered(_chainId);
    if (supportedChains.length >= MAX_SUPPORTED_CHAINS) revert TooManyChains();
    chainConfigs[_chainId] = IOmniDragonRegistry.ChainConfig({
      chainId: _chainId,
      chainName: _chainName,
      wrappedNativeToken: _wrappedNativeToken,
      wrappedNativeSymbol: _getDefaultWrappedNativeSymbol(_chainId),
      poolManager: address(0),
      swapRouter: address(0),
      positionManager: address(0),
      quoter: address(0),
      chainlinkNativeFeed: address(0),
      isActive: _isActive
    });
    supportedChains.push(_chainId);
    emit ChainRegistered(_chainId, _chainName);
  }

  function setDexInfrastructure(
    uint16 _chainId,
    address _poolManager,
    address _swapRouter,
    address _positionManager,
    address _quoter
  ) external override onlyOwner {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    chainConfigs[_chainId].poolManager = _poolManager;
    chainConfigs[_chainId].swapRouter = _swapRouter;
    chainConfigs[_chainId].positionManager = _positionManager;
    chainConfigs[_chainId].quoter = _quoter;
    emit ChainUpdated(_chainId);
  }

  function updateChainName(uint16 _chainId, string calldata _chainName) external onlyOwner {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    chainConfigs[_chainId].chainName = _chainName;
    emit ChainUpdated(_chainId);
  }

  function updateWrappedNative(uint16 _chainId, address _wrappedNativeToken) external onlyOwner {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    chainConfigs[_chainId].wrappedNativeToken = _wrappedNativeToken;
    chainConfigs[_chainId].wrappedNativeSymbol = _getDefaultWrappedNativeSymbol(_chainId);
    emit ChainUpdated(_chainId);
  }

  function updateWrappedNativeSymbol(uint16 _chainId, string calldata _symbol) external onlyOwner {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    chainConfigs[_chainId].wrappedNativeSymbol = _symbol; emit WrappedNativeSymbolUpdated(_chainId, _symbol); emit ChainUpdated(_chainId);
  }

  function setChainStatus(uint16 _chainId, bool _isActive) external override onlyOwner {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    chainConfigs[_chainId].isActive = _isActive; emit ChainStatusChanged(_chainId, _isActive);
  }

  function getChainConfig(uint16 _chainId) external view override returns (IOmniDragonRegistry.ChainConfig memory) {
    if (chainConfigs[_chainId].chainId != _chainId) revert ChainNotRegistered(_chainId);
    return chainConfigs[_chainId];
  }

  function getSupportedChains() external view override returns (uint16[] memory) { return supportedChains; }
  function getCurrentChainId() external view override returns (uint16) { return currentChainId; }
  function isChainSupported(uint16 _chainId) external view override returns (bool) { return chainConfigs[_chainId].isActive && chainConfigs[_chainId].chainId == _chainId; }

  // Endpoints and mapping
  function setChainIdToEid(uint256 _chainId, uint32 _eid) external onlyOwner { chainIdToEid[_chainId] = _eid; eidToChainId[_eid] = _chainId; emit ChainIdToEidUpdated(_chainId, _eid); }
  function setLayerZeroEndpoint(uint16 _chainId, address _endpoint) external onlyOwner { if (_endpoint == address(0)) revert ZeroAddress(); layerZeroEndpoints[_chainId] = _endpoint; emit LayerZeroEndpointUpdated(_chainId, _endpoint); }
  function getLayerZeroEndpoint(uint16 _chainId) external view returns (address) {
    address ep = layerZeroEndpoints[_chainId];
    return ep == address(0) ? layerZeroCommonEndpoint : ep;
  }

  // Lookups
  function getWrappedNativeToken(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].wrappedNativeToken; }
  function getWrappedNativeSymbol(uint16 _chainId) external view override returns (string memory) { return chainConfigs[_chainId].wrappedNativeSymbol; }
  function getPoolManager(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].poolManager; }
  function getSwapRouter(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].swapRouter; }
  function getPositionManager(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].positionManager; }
  function getQuoter(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].quoter; }
  function getChainlinkNativeFeed(uint16 _chainId) external view override returns (address) { return chainConfigs[_chainId].chainlinkNativeFeed; }
  function setChainlinkNativeFeed(uint16 _chainId, address _feed) external override onlyOwner { require(_feed != address(0), "Invalid feed"); chainConfigs[_chainId].chainlinkNativeFeed = _feed; emit ChainUpdated(_chainId); }

  // Oracle management
  function setPriceOracle(uint16 _chainId, address _oracle) external override onlyOwner { require(_oracle != address(0), "Invalid oracle address"); priceOracles[_chainId] = _oracle; oracleConfigs[_chainId].isConfigured = true; emit PriceOracleSet(_chainId, _oracle); }
  function getPriceOracle(uint16 _chainId) external view returns (address) { return priceOracles[_chainId]; }
  function setSecondaryOracle(uint16 _chainId, address _oracle) external onlyOwner { require(_oracle != address(0), "Invalid oracle address"); secondaryOracles[_chainId] = _oracle; emit SecondaryOracleSet(_chainId, _oracle); }
  function getSecondaryOracle(uint16 _chainId) external view returns (address) { return secondaryOracles[_chainId]; }
  function configurePrimaryOracle(address _primaryOracle, uint32 _chainEid) external override onlyOwner { require(_primaryOracle != address(0), "Invalid oracle address"); primaryOracle = _primaryOracle; primaryChainEid = _chainEid; priceOracles[146] = _primaryOracle; oracleConfigs[146].primaryOracle = _primaryOracle; oracleConfigs[146].primaryChainEid = _chainEid; oracleConfigs[146].isConfigured = true; emit PrimaryOracleConfigured(_primaryOracle, _chainEid); }
  function setLzReadChannel(uint16 _chainId, uint32 _channelId) external override onlyOwner { oracleConfigs[_chainId].lzReadChannelId = _channelId; emit LzReadChannelConfigured(_chainId, _channelId); }
  function getOracleConfigByChainId(uint256 _chainId) external view returns (IOmniDragonRegistry.OracleConfig memory) {
    return oracleConfigs[uint16(_chainId)];
  }
  function getOracleConfig(uint16 _chainId) external view returns (IOmniDragonRegistry.OracleConfig memory) {
    return oracleConfigs[_chainId];
  }

  // ============ Ecosystem Contract Management ============
  
  function setJackpotVault(uint16 _chainId, address _vault) external onlyOwner {
    jackpotVaults[_chainId] = _vault;
    emit EcosystemContractSet(_chainId, "JackpotVault", _vault);
  }

  function setGasReserve(uint16 _chainId, address _reserve) external onlyOwner {
    gasReserves[_chainId] = _reserve;
    emit EcosystemContractSet(_chainId, "GasReserve", _reserve);
  }

  function setLotteryManager(uint16 _chainId, address _manager) external onlyOwner {
    lotteryManagers[_chainId] = _manager;
    emit EcosystemContractSet(_chainId, "LotteryManager", _manager);
  }

  function setV4Hook(uint16 _chainId, address _hook) external onlyOwner {
    v4Hooks[_chainId] = _hook;
    emit EcosystemContractSet(_chainId, "V4Hook", _hook);
  }

  function setDragonToken(uint16 _chainId, address _token) external onlyOwner {
    dragonTokens[_chainId] = _token;
    emit EcosystemContractSet(_chainId, "DragonToken", _token);
  }

  function setHubChain(uint16 _chainId, uint32 _eid) external onlyOwner {
    hubChainId = _chainId;
    hubChainEid = _eid;
    emit HubChainSet(_chainId, _eid);
  }

  // Ecosystem getters
  function getJackpotVault(uint16 _chainId) external view returns (address) { return jackpotVaults[_chainId]; }
  function getGasReserve(uint16 _chainId) external view returns (address) { return gasReserves[_chainId]; }
  function getLotteryManager(uint16 _chainId) external view returns (address) { return lotteryManagers[_chainId]; }
  function getV4Hook(uint16 _chainId) external view returns (address) { return v4Hooks[_chainId]; }
  function getDragonToken(uint16 _chainId) external view returns (address) { return dragonTokens[_chainId]; }
  function isHubChain() external view returns (bool) { return uint16(block.chainid) == hubChainId; }

  // ============ DragonOVault Vault System Setters ============
  
  function setChainDragonVault(uint16 _chainId, address _vault) external onlyOwner {
    dragonOVaults[_chainId] = _vault;
    emit EcosystemContractSet(_chainId, "ChainDragonVault", _vault);
  }

  function setVeDragon(uint16 _chainId, address _veDragon) external onlyOwner {
    veDragonContracts[_chainId] = _veDragon;
    emit EcosystemContractSet(_chainId, "veDRAGON", _veDragon);
  }

  function setGaugeController(uint16 _chainId, address _gaugeController) external onlyOwner {
    gaugeControllers[_chainId] = _gaugeController;
    emit EcosystemContractSet(_chainId, "GaugeController", _gaugeController);
  }

  function setLPManager(uint16 _chainId, address _lpManager) external onlyOwner {
    lpManagers[_chainId] = _lpManager;
    emit EcosystemContractSet(_chainId, "LPManager", _lpManager);
  }

  // DragonOVault Vault System Getters
  function getDragonOVault(uint16 _chainId) external view returns (address) { return dragonOVaults[_chainId]; }
  function getVeDragon(uint16 _chainId) external view returns (address) { return veDragonContracts[_chainId]; }
  function getGaugeController(uint16 _chainId) external view returns (address) { return gaugeControllers[_chainId]; }
  function getLPManager(uint16 _chainId) external view returns (address) { return lpManagers[_chainId]; }

  // Batch getter for cross-chain operations
  function getRemoteVaults() external view returns (uint32[] memory eids, address[] memory vaults) {
    uint256 count = 0;
    
    // Count non-hub chains with vaults
    for (uint i = 0; i < supportedChains.length; i++) {
      if (supportedChains[i] != hubChainId && jackpotVaults[supportedChains[i]] != address(0)) {
        count++;
      }
    }
    
    eids = new uint32[](count);
    vaults = new address[](count);
    uint256 idx = 0;
    
    for (uint i = 0; i < supportedChains.length; i++) {
      if (supportedChains[i] != hubChainId && jackpotVaults[supportedChains[i]] != address(0)) {
        eids[idx] = chainIdToEid[supportedChains[i]];
        vaults[idx] = jackpotVaults[supportedChains[i]];
        idx++;
      }
    }
  }

  // ============ LayerZero Config Setters ============

  /**
   * @notice Set full LZ config for a chain (custom OApp)
   * @dev Use this for chains like Monad/Sonic that need custom DVN setup
   */
  function setLzConfig(
    uint16 _chainId,
    address _endpoint,
    uint32 _eid,
    address _sendLib,
    address _receiveLib,
    address _executor,
    address _dvn,
    address _lzReadDvn,
    uint64 _confirmations,
    bool _useCustomOApp
  ) external onlyOwner {
    lzConfigs[_chainId] = IOmniDragonRegistry.LzConfig({
      endpoint: _endpoint,
      eid: _eid,
      sendLib: _sendLib,
      receiveLib: _receiveLib,
      executor: _executor,
      dvn: _dvn,
      lzReadDvn: _lzReadDvn,
      optionalDvns: new address[](0),
      confirmations: _confirmations,
      isConfigured: true,
      useCustomOApp: _useCustomOApp
    });
    
    customOAppChains[_chainId] = _useCustomOApp;
    
    // Update mappings
    layerZeroEndpoints[_chainId] = _endpoint;
    chainIdToEid[_chainId] = _eid;
    eidToChainId[_eid] = _chainId;
    
    emit LayerZeroConfigured(address(0), _eid, _useCustomOApp ? "CUSTOM_OAPP_SET" : "LZ_CONFIG_SET");
  }

  /**
   * @notice Set default LZ config for standard chains
   * @dev Used by chains that don't need custom DVN setup
   */
  function setDefaultLzConfig(
    address _endpoint,
    address _sendLib,
    address _receiveLib,
    address _executor,
    address _dvn,
    address _lzReadDvn,
    uint64 _confirmations
  ) external onlyOwner {
    defaultLzConfig = IOmniDragonRegistry.LzConfig({
      endpoint: _endpoint,
      eid: 0, // EID is chain-specific, set per-chain
      sendLib: _sendLib,
      receiveLib: _receiveLib,
      executor: _executor,
      dvn: _dvn,
      lzReadDvn: _lzReadDvn,
      optionalDvns: new address[](0),
      confirmations: _confirmations,
      isConfigured: true,
      useCustomOApp: false
    });
    
    emit LayerZeroConfigured(address(0), 0, "DEFAULT_LZ_CONFIG_SET");
  }

  /**
   * @notice Mark a chain as custom OApp (Monad, Sonic, etc.)
   */
  function setCustomOAppChain(uint16 _chainId, bool _isCustom) external onlyOwner {
    customOAppChains[_chainId] = _isCustom;
    lzConfigs[_chainId].useCustomOApp = _isCustom;
  }

  /**
   * @notice Set optional DVNs for a chain
   */
  function setOptionalDvns(uint16 _chainId, address[] calldata _dvns) external onlyOwner {
    lzConfigs[_chainId].optionalDvns = _dvns;
  }

  /**
   * @notice Update individual LZ config fields
   */
  function setLzEndpoint(uint16 _chainId, address _endpoint) external onlyOwner {
    lzConfigs[_chainId].endpoint = _endpoint;
    layerZeroEndpoints[_chainId] = _endpoint;
  }

  function setLzEid(uint16 _chainId, uint32 _eid) external onlyOwner {
    lzConfigs[_chainId].eid = _eid;
    chainIdToEid[_chainId] = _eid;
    eidToChainId[_eid] = _chainId;
  }

  function setLzSendLib(uint16 _chainId, address _sendLib) external onlyOwner {
    lzConfigs[_chainId].sendLib = _sendLib;
  }

  function setLzReceiveLib(uint16 _chainId, address _receiveLib) external onlyOwner {
    lzConfigs[_chainId].receiveLib = _receiveLib;
  }

  function setLzExecutor(uint16 _chainId, address _executor) external onlyOwner {
    lzConfigs[_chainId].executor = _executor;
  }

  function setLzDvn(uint16 _chainId, address _dvn) external onlyOwner {
    lzConfigs[_chainId].dvn = _dvn;
  }

  function setLzReadDvn(uint16 _chainId, address _lzReadDvn) external onlyOwner {
    lzConfigs[_chainId].lzReadDvn = _lzReadDvn;
  }

  function setLzConfirmations(uint16 _chainId, uint64 _confirmations) external onlyOwner {
    lzConfigs[_chainId].confirmations = _confirmations;
  }

  // ============ LayerZero Config Getters ============

  function getLzConfig(uint16 _chainId) external view returns (IOmniDragonRegistry.LzConfig memory) {
    return lzConfigs[_chainId];
  }

  function getEidForChainId(uint256 _chainId) external view returns (uint32) {
    return chainIdToEid[_chainId];
  }

  function getChainIdForEid(uint32 _eid) external view returns (uint256) {
    return eidToChainId[_eid];
  }

  function getDvn(uint16 _chainId) external view returns (address) {
    return lzConfigs[_chainId].dvn;
  }

  function getExecutor(uint16 _chainId) external view returns (address) {
    return lzConfigs[_chainId].executor;
  }

  function getSendLib(uint16 _chainId) external view returns (address) {
    return lzConfigs[_chainId].sendLib;
  }

  function getReceiveLib(uint16 _chainId) external view returns (address) {
    return lzConfigs[_chainId].receiveLib;
  }

  function getLzReadDvn(uint16 _chainId) external view returns (address) {
    return lzConfigs[_chainId].lzReadDvn;
  }

  function usesCustomOApp(uint16 _chainId) external view returns (bool) {
    return customOAppChains[_chainId];
  }

  function getDefaultLzConfig() external view returns (IOmniDragonRegistry.LzConfig memory) {
    return defaultLzConfig;
  }

  /**
   * @notice Get effective LZ config (custom if set, default otherwise)
   * @dev Returns chain-specific config if useCustomOApp, otherwise returns default with chain's EID
   */
  function getEffectiveLzConfig(uint16 _chainId) external view returns (IOmniDragonRegistry.LzConfig memory) {
    IOmniDragonRegistry.LzConfig memory config = lzConfigs[_chainId];
    
    // If chain has custom config, use it
    if (config.useCustomOApp || config.isConfigured) {
      return config;
    }
    
    // Otherwise, use default config with chain-specific EID and endpoint
    IOmniDragonRegistry.LzConfig memory effective = defaultLzConfig;
    effective.eid = chainIdToEid[_chainId];
    effective.endpoint = layerZeroEndpoints[_chainId] != address(0) 
      ? layerZeroEndpoints[_chainId] 
      : layerZeroCommonEndpoint;
    return effective;
  }

  // ============ OApp Auto-Configuration ============

  /// @notice OApp types for different configuration needs
  enum OAppType {
    OFT,          // Standard OFT (omniDRAGON, DragonOVault/vDRAGON)
    OAPP,         // Standard OApp messaging
    LZREAD,       // lzRead for cross-chain reads (Oracle)
    COMPOSER      // lzCompose receiver (DragonOVaultComposer)
  }

  /**
   * @notice Auto-configure an OApp for all supported chains
   * @dev Sets peers, DVN, executor, and enforced options using stored LZ config
   * @param _oapp The OApp address (omniDRAGON, Oracle, etc.)
   * @param _defaultGasLimit Default gas limit for enforced options
   */
  function configureOAppForAllChains(
    address _oapp,
    uint128 _defaultGasLimit
  ) external onlyOwner {
    require(_oapp != address(0), "Invalid OApp");
    
    uint16 thisChain = uint16(block.chainid);
    
    for (uint i = 0; i < supportedChains.length; i++) {
      uint16 remoteChainId = supportedChains[i];
      if (remoteChainId == thisChain) continue; // Skip self
      
      IOmniDragonRegistry.LzConfig memory remoteLz = lzConfigs[remoteChainId];
      if (!remoteLz.isConfigured) continue; // Skip unconfigured chains
      
      // Set peer (assumes same address on all chains for CREATE2)
      _setPeer(_oapp, remoteLz.eid, bytes32(uint256(uint160(_oapp))));
      
      // Configure send path (this chain -> remote)
      _configurePathToRemote(_oapp, remoteLz, _defaultGasLimit);
    }
    
    emit LayerZeroConfigured(_oapp, 0, "OAPP_AUTO_CONFIGURED");
  }

  /**
   * @notice Auto-configure an OApp with specific type for all supported chains
   * @dev Handles OFT, OApp, lzRead, and Composer patterns differently
   * @param _oapp The OApp address
   * @param _oappType Type of OApp (determines config pattern)
   * @param _defaultGasLimit Default gas limit for enforced options
   */
  function configureOAppWithType(
    address _oapp,
    OAppType _oappType,
    uint128 _defaultGasLimit
  ) external onlyOwner {
    require(_oapp != address(0), "Invalid OApp");
    
    uint16 thisChain = uint16(block.chainid);
    
    for (uint i = 0; i < supportedChains.length; i++) {
      uint16 remoteChainId = supportedChains[i];
      if (remoteChainId == thisChain) continue;
      
      IOmniDragonRegistry.LzConfig memory remoteLz = lzConfigs[remoteChainId];
      if (!remoteLz.isConfigured) continue;
      
      // Set peer (assumes same address on all chains for CREATE2)
      _setPeer(_oapp, remoteLz.eid, bytes32(uint256(uint160(_oapp))));
      
      // Configure based on type
      if (_oappType == OAppType.LZREAD) {
        _configurePathForLzRead(_oapp, remoteLz);
      } else {
        // OFT, OAPP, COMPOSER all use standard messaging
        _configurePathToRemote(_oapp, remoteLz, _defaultGasLimit);
      }
    }
    
    string memory typeStr = _oappType == OAppType.OFT ? "OFT" :
                            _oappType == OAppType.OAPP ? "OAPP" :
                            _oappType == OAppType.LZREAD ? "LZREAD" : "COMPOSER";
    emit LayerZeroConfigured(_oapp, 0, typeStr);
  }

  /**
   * @notice Configure lzRead path (uses lzReadDvn instead of regular DVN)
   * @dev lzRead is for cross-chain reads, used by Oracle
   */
  function _configurePathForLzRead(
    address _oapp,
    IOmniDragonRegistry.LzConfig memory _remoteLz
  ) internal {
    IOmniDragonRegistry.LzConfig memory localLz = lzConfigs[uint16(block.chainid)];
    require(localLz.isConfigured, "Local chain not configured");
    
    address ep = localLz.endpoint;
    require(ep != address(0), "No local endpoint");
    
    // lzRead uses the lzReadDvn instead of regular DVN
    address lzReadDvn = localLz.lzReadDvn;
    if (lzReadDvn == address(0)) {
      lzReadDvn = localLz.dvn; // Fallback to regular DVN
    }
    
    // Set send library for lzRead
    if (localLz.sendLib != address(0)) {
      bytes memory cd = abi.encodeWithSignature(
        "setSendLibrary(address,uint32,address)",
        _oapp, _remoteLz.eid, localLz.sendLib
      );
      _executeLowLevelCall(ep, cd, "setSendLibrary fail");
    }
    
    // Configure lzRead DVN
    if (lzReadDvn != address(0) && localLz.sendLib != address(0)) {
      address[] memory reqDvns = new address[](1);
      reqDvns[0] = lzReadDvn;
      bytes memory ulnCfg = abi.encode(
        uint64(1), // Minimal confirmations for reads
        uint8(1),
        uint8(0),
        uint8(0),
        reqDvns,
        new address[](0)
      );
      SetConfigParam[] memory params = new SetConfigParam[](1);
      params[0] = SetConfigParam({ eid: _remoteLz.eid, configType: 2, config: ulnCfg });
      bytes memory cd = abi.encodeWithSignature(
        "setConfig(address,address,(uint32,uint32,bytes)[])",
        _oapp, localLz.sendLib, params
      );
      _executeLowLevelCall(ep, cd, "setLzReadULN fail");
    }
  }

  /**
   * @notice Configure OApp for a specific remote chain
   * @param _oapp The OApp address
   * @param _remoteChainId Remote chain ID
   * @param _remotePeer Remote peer address (as bytes32)
   * @param _gasLimit Gas limit for enforced options
   */
  function configureOAppForChain(
    address _oapp,
    uint16 _remoteChainId,
    bytes32 _remotePeer,
    uint128 _gasLimit
  ) external onlyOwner {
    require(_oapp != address(0), "Invalid OApp");
    
    IOmniDragonRegistry.LzConfig memory remoteLz = lzConfigs[_remoteChainId];
    require(remoteLz.isConfigured, "Remote chain not configured");
    
    // Set peer
    _setPeer(_oapp, remoteLz.eid, _remotePeer);
    
    // Configure send path
    _configurePathToRemote(_oapp, remoteLz, _gasLimit);
    
    emit LayerZeroConfigured(_oapp, remoteLz.eid, "OAPP_CHAIN_CONFIGURED");
  }

  /**
   * @notice Configure send path from this chain to remote
   */
  function _configurePathToRemote(
    address _oapp,
    IOmniDragonRegistry.LzConfig memory _remoteLz,
    uint128 _gasLimit
  ) internal {
    IOmniDragonRegistry.LzConfig memory localLz = lzConfigs[uint16(block.chainid)];
    require(localLz.isConfigured, "Local chain not configured");
    
    address ep = localLz.endpoint;
    require(ep != address(0), "No local endpoint");
    
    // Set send library
    if (localLz.sendLib != address(0)) {
      bytes memory cd = abi.encodeWithSignature(
        "setSendLibrary(address,uint32,address)",
        _oapp, _remoteLz.eid, localLz.sendLib
      );
      _executeLowLevelCall(ep, cd, "setSendLibrary fail");
    }
    
    // Set receive library
    if (localLz.receiveLib != address(0)) {
      bytes memory cd = abi.encodeWithSignature(
        "setReceiveLibrary(address,uint32,address,uint256)",
        _oapp, _remoteLz.eid, localLz.receiveLib, 0
      );
      _executeLowLevelCall(ep, cd, "setReceiveLibrary fail");
    }
    
    // Configure executor
    if (localLz.executor != address(0) && localLz.sendLib != address(0)) {
      bytes memory execCfg = abi.encode(uint32(10000), localLz.executor);
      SetConfigParam[] memory params = new SetConfigParam[](1);
      params[0] = SetConfigParam({ eid: _remoteLz.eid, configType: 1, config: execCfg });
      bytes memory cd = abi.encodeWithSignature(
        "setConfig(address,address,(uint32,uint32,bytes)[])",
        _oapp, localLz.sendLib, params
      );
      _executeLowLevelCall(ep, cd, "setExecutorConfig fail");
    }
    
    // Configure DVN (ULN) for send
    if (localLz.dvn != address(0) && localLz.sendLib != address(0)) {
      address[] memory reqDvns = new address[](1);
      reqDvns[0] = localLz.dvn;
      bytes memory ulnCfg = abi.encode(
        localLz.confirmations,
        uint8(1), // requiredDVNCount
        uint8(0), // optionalDVNCount
        uint8(0), // optionalDVNThreshold
        reqDvns,
        new address[](0)
      );
      SetConfigParam[] memory params = new SetConfigParam[](1);
      params[0] = SetConfigParam({ eid: _remoteLz.eid, configType: 2, config: ulnCfg });
      bytes memory cd = abi.encodeWithSignature(
        "setConfig(address,address,(uint32,uint32,bytes)[])",
        _oapp, localLz.sendLib, params
      );
      _executeLowLevelCall(ep, cd, "setSendULN fail");
    }
    
    // Configure DVN (ULN) for receive (use remote chain's DVN)
    if (_remoteLz.dvn != address(0) && localLz.receiveLib != address(0)) {
      address[] memory reqDvns = new address[](1);
      reqDvns[0] = _remoteLz.dvn;
      bytes memory ulnCfg = abi.encode(
        _remoteLz.confirmations,
        uint8(1),
        uint8(0),
        uint8(0),
        reqDvns,
        new address[](0)
      );
      SetConfigParam[] memory params = new SetConfigParam[](1);
      params[0] = SetConfigParam({ eid: _remoteLz.eid, configType: 2, config: ulnCfg });
      bytes memory cd = abi.encodeWithSignature(
        "setConfig(address,address,(uint32,uint32,bytes)[])",
        _oapp, localLz.receiveLib, params
      );
      _executeLowLevelCall(ep, cd, "setReceiveULN fail");
    }
    
    // Set enforced options
    _setEnforcedOptions(_oapp, _remoteLz.eid, _gasLimit);
  }

  /**
   * @notice Set peer on OApp
   */
  function _setPeer(address _oapp, uint32 _eid, bytes32 _peer) internal {
    bytes memory cd = abi.encodeWithSignature("setPeer(uint32,bytes32)", _eid, _peer);
    _executeLowLevelCall(_oapp, cd, "setPeer fail");
  }

  /**
   * @notice Set enforced options on OApp
   */
  function _setEnforcedOptions(address _oapp, uint32 _eid, uint128 _gasLimit) internal {
    // Build enforced options for send (msgType 1) and sendAndCall (msgType 2)
    bytes memory options = abi.encodePacked(
      uint16(3),      // TYPE_3 options
      uint8(1),       // WORKER_ID for executor
      uint16(17),     // Option length (1 + 16)
      uint8(1),       // LZ_RECEIVE option type
      _gasLimit       // Gas limit
    );
    
    // Struct: (uint32 eid, uint16 msgType, bytes options)
    bytes memory opt1 = abi.encode(_eid, uint16(1), options); // Send
    bytes memory opt2 = abi.encode(_eid, uint16(2), options); // SendAndCall
    
    bytes[] memory allOpts = new bytes[](2);
    allOpts[0] = opt1;
    allOpts[1] = opt2;
    
    bytes memory cd = abi.encodeWithSignature(
      "setEnforcedOptions((uint32,uint16,bytes)[])",
      allOpts
    );
    // Don't revert if this fails (some OApps may not have this function)
    (bool success, ) = _oapp.call(cd);
    if (!success) {
      // Try alternate signature
      cd = abi.encodeWithSignature(
        "setEnforcedOptions(bytes[])",
        allOpts
      );
      _oapp.call(cd);
    }
  }

  // Low-level call helper (minimal)
  function _executeLowLevelCall(address target, bytes memory callData, string memory errorMessage) private {
    (bool success, bytes memory returnData) = target.call(callData);
    if (!success) { 
      if (returnData.length > 0) { 
        assembly { revert(add(returnData, 32), mload(returnData)) } 
      } else { 
        revert(errorMessage); 
      } 
    }
  }

  // NOTE: Additional LZ configuration helpers moved to separate OmniDragonConfigurator contract to reduce size
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;

import {Context} from "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 4 : IOmniDragonRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

/**
 * @title IOmniDragonRegistry
 * @dev Interface for OmniDragon registry with oracle management
 */
interface IOmniDragonRegistry {
  /**
   * @dev Chain configuration for DEX infrastructure
   */
  struct ChainConfig {
    uint16 chainId;
    string chainName;
    address wrappedNativeToken;   // WETH, WAVAX, WS, WMONAD, etc.
    string wrappedNativeSymbol;   // "WETH", "WAVAX", "WS", etc.
    // Core DEX infrastructure (version agnostic)
    address poolManager;          // Pool state manager (V4 PoolManager, etc.)
    address swapRouter;           // Swap execution (UniversalRouter, SwapRouter, etc.)
    address positionManager;      // LP position manager (V4 PositionManager, NonfungiblePositionManager, etc.)
    address quoter;               // Quote/preview swaps
    // Oracle
    address chainlinkNativeFeed;  // Chainlink native/USD feed (ETH/USD, MON/USD, etc.)
    bool isActive;
  }

  /**
   * @dev Oracle configuration struct
   */
  struct OracleConfig {
    address primaryOracle;      // Primary oracle address (Sonic chain)
    uint32 primaryChainEid;    // Primary chain EID
    uint32 lzReadChannelId;    // lzRead channel ID
    bool isConfigured;         // Whether oracle is configured
  }

  /**
   * @dev LayerZero configuration per chain
   */
  struct LzConfig {
    address endpoint;           // LZ Endpoint address
    uint32 eid;                 // LZ Endpoint ID
    address sendLib;            // SendLib302 address
    address receiveLib;         // ReceiveLib302 address
    address executor;           // LZ Executor address
    address dvn;                // Primary DVN (LayerZero Labs)
    address lzReadDvn;          // LzRead DVN for cross-chain reads
    address[] optionalDvns;     // Optional DVNs
    uint64 confirmations;       // Block confirmations required
    bool isConfigured;          // Whether LZ is configured
    bool useCustomOApp;         // True = custom DVN/Executor, False = use defaults
  }

  // Events
  event ChainRegistered(uint16 indexed chainId, string chainName);
  event ChainUpdated(uint16 indexed chainId);
  event ChainStatusChanged(uint16 indexed chainId, bool isActive);
  
  // Oracle events
  event PriceOracleSet(uint16 indexed chainId, address indexed oracle);
  event PrimaryOracleConfigured(address indexed primaryOracle, uint32 chainEid);
  event LzReadChannelConfigured(uint16 indexed chainId, uint32 channelId);

  // EID mappings
  function chainIdToEid(uint256 chainId) external view returns (uint32);
  function eidToChainId(uint32 eid) external view returns (uint256);

  /**
   * @notice Register a new chain configuration
   * @param _chainId The chain ID
   * @param _chainName The human-readable chain name
   * @param _wrappedNativeToken The wrapped native token address
   * @param _isActive Whether this chain is active
   */
  function registerChain(
    uint16 _chainId,
    string calldata _chainName,
    address _wrappedNativeToken,
    bool _isActive
  ) external;

  /**
   * @notice Set DEX infrastructure for a chain
   * @param _chainId The chain ID
   * @param _poolManager Pool manager address
   * @param _swapRouter Swap router address
   * @param _positionManager Position manager address
   * @param _quoter Quoter address
   */
  function setDexInfrastructure(
    uint16 _chainId,
    address _poolManager,
    address _swapRouter,
    address _positionManager,
    address _quoter
  ) external;

  /**
   * @notice Set chain active status
   * @param _chainId The chain ID
   * @param _isActive Whether the chain should be active
   */
  function setChainStatus(uint16 _chainId, bool _isActive) external;

  /**
   * @notice Get chain configuration
   * @param _chainId The chain ID
   * @return config The chain configuration
   */
  function getChainConfig(uint16 _chainId) external view returns (ChainConfig memory config);

  /**
   * @notice Get all supported chains
   * @return Array of supported chain IDs
   */
  function getSupportedChains() external view returns (uint16[] memory);

  /**
   * @notice Get current chain ID
   * @return The current chain ID
   */
  function getCurrentChainId() external view returns (uint16);

  /**
   * @notice Check if chain is supported and active
   * @param _chainId The chain ID to check
   * @return True if chain is supported and active
   */
  function isChainSupported(uint16 _chainId) external view returns (bool);

  /**
   * @notice Get wrapped native token address for a chain
   * @param _chainId The chain ID
   * @return The wrapped native token address
   */
  function getWrappedNativeToken(uint16 _chainId) external view returns (address);

  /**
   * @notice Get wrapped native token symbol for a chain
   * @param _chainId The chain ID
   * @return The wrapped native token symbol
   */
  function getWrappedNativeSymbol(uint16 _chainId) external view returns (string memory);

  /**
   * @notice Get pool manager for a chain (V4 PoolManager, etc.)
   * @param _chainId The chain ID
   * @return The pool manager address
   */
  function getPoolManager(uint16 _chainId) external view returns (address);

  /**
   * @notice Get swap router for a chain (UniversalRouter, SwapRouter, etc.)
   * @param _chainId The chain ID
   * @return The swap router address
   */
  function getSwapRouter(uint16 _chainId) external view returns (address);

  /**
   * @notice Get position manager for a chain (V4 PositionManager, etc.)
   * @param _chainId The chain ID
   * @return The position manager address
   */
  function getPositionManager(uint16 _chainId) external view returns (address);

  /**
   * @notice Get quoter for a chain
   * @param _chainId The chain ID
   * @return The quoter address
   */
  function getQuoter(uint16 _chainId) external view returns (address);

  /**
   * @notice Get Chainlink native/USD feed for a chain
   * @param _chainId The chain ID
   * @return The Chainlink feed address (ETH/USD, MON/USD, S/USD, etc.)
   */
  function getChainlinkNativeFeed(uint16 _chainId) external view returns (address);

  /**
   * @notice Set Chainlink native/USD feed for a chain
   * @param _chainId The chain ID
   * @param _feed The Chainlink feed address
   */
  function setChainlinkNativeFeed(uint16 _chainId, address _feed) external;

  /**
   * @notice Get LayerZero endpoint for a chain
   * @param _chainId The chain ID
   * @return The LayerZero endpoint address
   */
  function getLayerZeroEndpoint(uint16 _chainId) external view returns (address);

  // ============ ORACLE MANAGEMENT ============

  /**
   * @notice Set price oracle for a specific chain
   * @param _chainId Chain ID
   * @param _oracle Oracle address
   */
  function setPriceOracle(uint16 _chainId, address _oracle) external;

  /**
   * @notice Get price oracle for a specific chain
   * @param _chainId Chain ID
   * @return Oracle address
   */
  function getPriceOracle(uint16 _chainId) external view returns (address);

  /**
   * @notice Configure primary oracle (on Sonic chain)
   * @param _primaryOracle Primary oracle address
   * @param _chainEid Primary chain EID
   */
  function configurePrimaryOracle(address _primaryOracle, uint32 _chainEid) external;

  /**
   * @notice Set lzRead channel for a chain
   * @param _chainId Chain ID
   * @param _channelId lzRead channel ID
   */
  function setLzReadChannel(uint16 _chainId, uint32 _channelId) external;

  /**
   * @notice Get oracle configuration for a chain
   * @param _chainId Chain ID
   * @return Oracle configuration
   */
  function getOracleConfig(uint16 _chainId) external view returns (OracleConfig memory);

  // ============ ECOSYSTEM CONTRACT MANAGEMENT ============

  /**
   * @notice Get hub chain ID (Base)
   * @return Hub chain ID
   */
  function hubChainId() external view returns (uint16);

  /**
   * @notice Get hub chain EID
   * @return Hub chain LayerZero EID
   */
  function hubChainEid() external view returns (uint32);

  /**
   * @notice Check if current chain is the hub
   * @return True if current chain is hub
   */
  function isHubChain() external view returns (bool);

  /**
   * @notice Get jackpot vault for a chain
   * @param _chainId Chain ID
   * @return Vault address
   */
  function getJackpotVault(uint16 _chainId) external view returns (address);

  /**
   * @notice Get gas reserve for a chain
   * @param _chainId Chain ID
   * @return Gas reserve address
   */
  function getGasReserve(uint16 _chainId) external view returns (address);

  /**
   * @notice Get lottery manager for a chain
   * @param _chainId Chain ID
   * @return Lottery manager address
   */
  function getLotteryManager(uint16 _chainId) external view returns (address);

  /**
   * @notice Get V4 hook for a chain
   * @param _chainId Chain ID
   * @return V4 hook address
   */
  function getV4Hook(uint16 _chainId) external view returns (address);

  /**
   * @notice Get DRAGON token for a chain
   * @param _chainId Chain ID
   * @return DRAGON token address
   */
  function getDragonToken(uint16 _chainId) external view returns (address);

  /**
   * @notice Get all remote vaults (non-hub chains with vaults)
   * @return eids Array of chain EIDs
   * @return vaults Array of vault addresses
   */
  function getRemoteVaults() external view returns (uint32[] memory eids, address[] memory vaults);

  // ============ CHAINDRAGON VAULT SYSTEM ============

  /**
   * @notice Get DragonOVault vault for a chain
   * @param _chainId Chain ID
   * @return DragonOVault vault address
   */
  function getDragonOVault(uint16 _chainId) external view returns (address);

  /**
   * @notice Get veDRAGON contract for a chain
   * @param _chainId Chain ID
   * @return veDRAGON address
   */
  function getVeDragon(uint16 _chainId) external view returns (address);

  /**
   * @notice Get GaugeController for a chain
   * @param _chainId Chain ID
   * @return GaugeController address
   */
  function getGaugeController(uint16 _chainId) external view returns (address);

  /**
   * @notice Get LP Manager for a chain
   * @param _chainId Chain ID
   * @return LP Manager address
   */
  function getLPManager(uint16 _chainId) external view returns (address);

  // ============ LAYERZERO CONFIGURATION ============

  /**
   * @notice Get full LayerZero config for a chain
   * @param _chainId Chain ID
   * @return LZ configuration struct
   */
  function getLzConfig(uint16 _chainId) external view returns (LzConfig memory);

  /**
   * @notice Get LZ endpoint ID for a chain
   * @param _chainId Chain ID
   * @return LZ Endpoint ID (EID)
   */
  function getEidForChainId(uint256 _chainId) external view returns (uint32);

  /**
   * @notice Get chain ID for an LZ endpoint ID
   * @param _eid LZ Endpoint ID
   * @return Chain ID
   */
  function getChainIdForEid(uint32 _eid) external view returns (uint256);

  /**
   * @notice Get DVN address for a chain
   * @param _chainId Chain ID
   * @return Primary DVN address
   */
  function getDvn(uint16 _chainId) external view returns (address);

  /**
   * @notice Get Executor address for a chain
   * @param _chainId Chain ID
   * @return Executor address
   */
  function getExecutor(uint16 _chainId) external view returns (address);

  /**
   * @notice Get Send library for a chain
   * @param _chainId Chain ID
   * @return SendLib address
   */
  function getSendLib(uint16 _chainId) external view returns (address);

  /**
   * @notice Get Receive library for a chain
   * @param _chainId Chain ID
   * @return ReceiveLib address
   */
  function getReceiveLib(uint16 _chainId) external view returns (address);

  /**
   * @notice Get LzRead DVN for a chain
   * @param _chainId Chain ID
   * @return LzRead DVN address
   */
  function getLzReadDvn(uint16 _chainId) external view returns (address);

  /**
   * @notice Check if chain uses custom OApp config
   * @param _chainId Chain ID
   * @return True if chain uses custom OApp (Monad, Sonic, etc.)
   */
  function usesCustomOApp(uint16 _chainId) external view returns (bool);

  /**
   * @notice Get effective LZ config (custom if set, default otherwise)
   * @param _chainId Chain ID
   * @return Effective LZ configuration
   */
  function getEffectiveLzConfig(uint16 _chainId) external view returns (LzConfig memory);

  /**
   * @notice Get default LZ config for standard chains
   * @return Default LZ configuration
   */
  function getDefaultLzConfig() external view returns (LzConfig memory);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @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 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) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@layerzerolabs/=node_modules/@layerzerolabs/",
    "@layerzerolabs/oapp-evm/=node_modules/@layerzerolabs/lz-evm-oapp-v2/",
    "@layerzerolabs/oft-evm/=node_modules/@layerzerolabs/lz-evm-oapp-v2/",
    "@openzeppelin/=node_modules/@openzeppelin/",
    "@uniswap/v3-core/=node_modules/@uniswap/v3-core/",
    "@uniswap/v4-core/=lib/v4-core/",
    "@uniswap/v4-periphery/=lib/v4-periphery/",
    "@arbitrum/=node_modules/@arbitrum/",
    "@chainlink/=node_modules/@chainlink/",
    "@ensdomains/=lib/v4-core/node_modules/@ensdomains/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@offchainlabs/=node_modules/@offchainlabs/",
    "@scroll-tech/=node_modules/@scroll-tech/",
    "@zksync/=node_modules/@zksync/",
    "chainlink-vrf-v2.5/=lib/chainlink-vrf-v2.5/",
    "ds-test/=lib/v4-core/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/v4-core/lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-gas-snapshot/=lib/v4-periphery/lib/permit2/lib/forge-gas-snapshot/src/",
    "hardhat-deploy/=node_modules/hardhat-deploy/",
    "hardhat/=node_modules/hardhat/",
    "openzeppelin-contracts/=lib/v4-core/lib/openzeppelin-contracts/",
    "permit2/=lib/v4-periphery/lib/permit2/",
    "solady/=node_modules/solady/",
    "solidity-bytes-utils/=node_modules/solidity-bytes-utils/",
    "solmate/=node_modules/solmate/",
    "v3-core/=lib/v3-core/",
    "v4-core/=lib/v4-core/src/",
    "v4-periphery/=lib/v4-periphery/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_initialOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16"}],"name":"ChainAlreadyRegistered","type":"error"},{"inputs":[{"internalType":"uint16","name":"chainId","type":"uint16"}],"name":"ChainNotRegistered","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TooManyChains","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"}],"name":"ChainIdToEidUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"string","name":"chainName","type":"string"}],"name":"ChainRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"ChainStatusChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"}],"name":"ChainUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"}],"name":"CurrentChainSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"string","name":"contractType","type":"string"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"}],"name":"EcosystemContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint32","name":"eid","type":"uint32"}],"name":"HubChainSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oapp","type":"address"},{"indexed":true,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"string","name":"configType","type":"string"}],"name":"LayerZeroConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"address","name":"endpoint","type":"address"}],"name":"LayerZeroEndpointUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oapp","type":"address"},{"indexed":true,"internalType":"uint32","name":"eid","type":"uint32"},{"indexed":false,"internalType":"address","name":"lib","type":"address"},{"indexed":false,"internalType":"string","name":"libraryType","type":"string"}],"name":"LayerZeroLibrarySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"uint32","name":"channelId","type":"uint32"}],"name":"LzReadChannelConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"PriceOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"primaryOracle","type":"address"},{"indexed":false,"internalType":"uint32","name":"chainEid","type":"uint32"}],"name":"PrimaryOracleConfigured","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":true,"internalType":"address","name":"oracle","type":"address"}],"name":"SecondaryOracleSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint16","name":"chainId","type":"uint16"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"WrappedNativeSymbolUpdated","type":"event"},{"inputs":[],"name":"MAX_SUPPORTED_CHAINS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"chainIdToEid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint128","name":"_defaultGasLimit","type":"uint128"}],"name":"configureOAppForAllChains","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"uint16","name":"_remoteChainId","type":"uint16"},{"internalType":"bytes32","name":"_remotePeer","type":"bytes32"},{"internalType":"uint128","name":"_gasLimit","type":"uint128"}],"name":"configureOAppForChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oapp","type":"address"},{"internalType":"enum OmniDragonRegistry.OAppType","name":"_oappType","type":"uint8"},{"internalType":"uint128","name":"_defaultGasLimit","type":"uint128"}],"name":"configureOAppWithType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_primaryOracle","type":"address"},{"internalType":"uint32","name":"_chainEid","type":"uint32"}],"name":"configurePrimaryOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"customOAppChains","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultLzConfig","outputs":[{"internalType":"address","name":"endpoint","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"address","name":"sendLib","type":"address"},{"internalType":"address","name":"receiveLib","type":"address"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"dvn","type":"address"},{"internalType":"address","name":"lzReadDvn","type":"address"},{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"bool","name":"useCustomOApp","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"dragonOVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"dragonTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"}],"name":"eidToChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"gasReserves","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"gaugeControllers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getChainConfig","outputs":[{"components":[{"internalType":"uint16","name":"chainId","type":"uint16"},{"internalType":"string","name":"chainName","type":"string"},{"internalType":"address","name":"wrappedNativeToken","type":"address"},{"internalType":"string","name":"wrappedNativeSymbol","type":"string"},{"internalType":"address","name":"poolManager","type":"address"},{"internalType":"address","name":"swapRouter","type":"address"},{"internalType":"address","name":"positionManager","type":"address"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"address","name":"chainlinkNativeFeed","type":"address"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct IOmniDragonRegistry.ChainConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"getChainIdForEid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getChainlinkNativeFeed","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDefaultLzConfig","outputs":[{"components":[{"internalType":"address","name":"endpoint","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"address","name":"sendLib","type":"address"},{"internalType":"address","name":"receiveLib","type":"address"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"dvn","type":"address"},{"internalType":"address","name":"lzReadDvn","type":"address"},{"internalType":"address[]","name":"optionalDvns","type":"address[]"},{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"bool","name":"useCustomOApp","type":"bool"}],"internalType":"struct IOmniDragonRegistry.LzConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getDragonOVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getDragonToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getDvn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getEffectiveLzConfig","outputs":[{"components":[{"internalType":"address","name":"endpoint","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"address","name":"sendLib","type":"address"},{"internalType":"address","name":"receiveLib","type":"address"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"dvn","type":"address"},{"internalType":"address","name":"lzReadDvn","type":"address"},{"internalType":"address[]","name":"optionalDvns","type":"address[]"},{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"bool","name":"useCustomOApp","type":"bool"}],"internalType":"struct IOmniDragonRegistry.LzConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"}],"name":"getEidForChainId","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getGasReserve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getGaugeController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getJackpotVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getLPManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getLayerZeroEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getLotteryManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getLzConfig","outputs":[{"components":[{"internalType":"address","name":"endpoint","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"address","name":"sendLib","type":"address"},{"internalType":"address","name":"receiveLib","type":"address"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"dvn","type":"address"},{"internalType":"address","name":"lzReadDvn","type":"address"},{"internalType":"address[]","name":"optionalDvns","type":"address[]"},{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"bool","name":"useCustomOApp","type":"bool"}],"internalType":"struct IOmniDragonRegistry.LzConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getLzReadDvn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getOracleConfig","outputs":[{"components":[{"internalType":"address","name":"primaryOracle","type":"address"},{"internalType":"uint32","name":"primaryChainEid","type":"uint32"},{"internalType":"uint32","name":"lzReadChannelId","type":"uint32"},{"internalType":"bool","name":"isConfigured","type":"bool"}],"internalType":"struct IOmniDragonRegistry.OracleConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"}],"name":"getOracleConfigByChainId","outputs":[{"components":[{"internalType":"address","name":"primaryOracle","type":"address"},{"internalType":"uint32","name":"primaryChainEid","type":"uint32"},{"internalType":"uint32","name":"lzReadChannelId","type":"uint32"},{"internalType":"bool","name":"isConfigured","type":"bool"}],"internalType":"struct IOmniDragonRegistry.OracleConfig","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getPoolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getPositionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getPriceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getQuoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getReceiveLib","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemoteVaults","outputs":[{"internalType":"uint32[]","name":"eids","type":"uint32[]"},{"internalType":"address[]","name":"vaults","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getSecondaryOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getSendLib","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedChains","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getSwapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getV4Hook","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getVeDragon","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getWrappedNativeSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"getWrappedNativeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hubChainEid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hubChainId","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"isChainSupported","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isHubChain","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"jackpotVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroCommonEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"layerZeroEndpoints","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroUncommonEndpoint","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"lotteryManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"lpManagers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"lzConfigs","outputs":[{"internalType":"address","name":"endpoint","type":"address"},{"internalType":"uint32","name":"eid","type":"uint32"},{"internalType":"address","name":"sendLib","type":"address"},{"internalType":"address","name":"receiveLib","type":"address"},{"internalType":"address","name":"executor","type":"address"},{"internalType":"address","name":"dvn","type":"address"},{"internalType":"address","name":"lzReadDvn","type":"address"},{"internalType":"uint64","name":"confirmations","type":"uint64"},{"internalType":"bool","name":"isConfigured","type":"bool"},{"internalType":"bool","name":"useCustomOApp","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"oracleConfigs","outputs":[{"internalType":"address","name":"primaryOracle","type":"address"},{"internalType":"uint32","name":"primaryChainEid","type":"uint32"},{"internalType":"uint32","name":"lzReadChannelId","type":"uint32"},{"internalType":"bool","name":"isConfigured","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"priceOracles","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryChainEid","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"string","name":"_chainName","type":"string"},{"internalType":"address","name":"_wrappedNativeToken","type":"address"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"registerChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"secondaryOracles","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_vault","type":"address"}],"name":"setChainDragonVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"},{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"setChainIdToEid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setChainStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_feed","type":"address"}],"name":"setChainlinkNativeFeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"setCurrentChainId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bool","name":"_isCustom","type":"bool"}],"name":"setCustomOAppChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"address","name":"_sendLib","type":"address"},{"internalType":"address","name":"_receiveLib","type":"address"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_dvn","type":"address"},{"internalType":"address","name":"_lzReadDvn","type":"address"},{"internalType":"uint64","name":"_confirmations","type":"uint64"}],"name":"setDefaultLzConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_poolManager","type":"address"},{"internalType":"address","name":"_swapRouter","type":"address"},{"internalType":"address","name":"_positionManager","type":"address"},{"internalType":"address","name":"_quoter","type":"address"}],"name":"setDexInfrastructure","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_token","type":"address"}],"name":"setDragonToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_reserve","type":"address"}],"name":"setGasReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_gaugeController","type":"address"}],"name":"setGaugeController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"setHubChain","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_vault","type":"address"}],"name":"setJackpotVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_lpManager","type":"address"}],"name":"setLPManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_endpoint","type":"address"}],"name":"setLayerZeroEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_manager","type":"address"}],"name":"setLotteryManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_endpoint","type":"address"},{"internalType":"uint32","name":"_eid","type":"uint32"},{"internalType":"address","name":"_sendLib","type":"address"},{"internalType":"address","name":"_receiveLib","type":"address"},{"internalType":"address","name":"_executor","type":"address"},{"internalType":"address","name":"_dvn","type":"address"},{"internalType":"address","name":"_lzReadDvn","type":"address"},{"internalType":"uint64","name":"_confirmations","type":"uint64"},{"internalType":"bool","name":"_useCustomOApp","type":"bool"}],"name":"setLzConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint64","name":"_confirmations","type":"uint64"}],"name":"setLzConfirmations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_dvn","type":"address"}],"name":"setLzDvn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint32","name":"_eid","type":"uint32"}],"name":"setLzEid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_endpoint","type":"address"}],"name":"setLzEndpoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_executor","type":"address"}],"name":"setLzExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint32","name":"_channelId","type":"uint32"}],"name":"setLzReadChannel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_lzReadDvn","type":"address"}],"name":"setLzReadDvn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_receiveLib","type":"address"}],"name":"setLzReceiveLib","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_sendLib","type":"address"}],"name":"setLzSendLib","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address[]","name":"_dvns","type":"address[]"}],"name":"setOptionalDvns","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"setPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_oracle","type":"address"}],"name":"setSecondaryOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_hook","type":"address"}],"name":"setV4Hook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_veDragon","type":"address"}],"name":"setVeDragon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"string","name":"_chainName","type":"string"}],"name":"updateChainName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address","name":"_wrappedNativeToken","type":"address"}],"name":"updateWrappedNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"updateWrappedNativeSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"}],"name":"usesCustomOApp","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"v4Hooks","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"veDragonContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

60c0346200017357601f620059cd38819003918201601f191683019291906001600160401b03841183851017620001775781602092849260409687528339810103126200017357516001600160a01b03808216929091839003620001735782156200015d575f549260018060a01b03199281848616175f55825194167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e05f80a36375e8210565ffffffffffff19601454161760145561ffff461661ffff196003541617600355731a44076050125825900e736c501f859c50fe728c9182608052736f475642a6e85809b1c36fa62763669b1b48dd5b60a05261210592835f526006602052825f20918254161790556004602052805f206175e8908163ffffffff198254161790555f5260056020525f205561584190816200018c82396080518181816107600152818161243b01526146ae015260a0518161111c0152f35b51631e4fbdf760e01b81525f6004820152602490fd5b5f80fd5b634e487b7160e01b5f52604160045260245ffdfe60806040526004361015610011575f80fd5b5f3560e01c806301b774c81461065e578063027636ae146105f55780630348eca31461065e5780630375d4f814610659578063064232391461050f578063087bd7af146106545780630ade4f9e1461064f5780630b9549661461064a5780630d9ad8c01461064557806310e1c2b0146106405780631a21d86f1461063b5780631aede2b6146106365780631b04d0451461063157806320caeefe1461062c578063219d18da1461062757806324bb729314610622578063284e0a341461061d57806328f41de3146106185780633164b39914610609578063335635f6146106135780633593c41e1461059657806337e32a941461060e5780633a07b830146106095780634077a43d14610604578063413eef06146105ff57806342451a08146105fa578063424f5dba146105f55780634392fe86146105f057806346113785146105eb5780634707f548146105e657806347bf3faf146105b45780634af91330146104e25780634fb75116146105e1578063502ebb30146105dc57806350a06d91146105d75780635356b0b7146105d257806355e1a91a146105cd5780635696013b146105c85780635b998529146105c35780635cf0e8a4146105be5780635f89d111146105b95780635f931584146105505780636036d616146105b457806362c21b35146105af5780636616e9f5146105aa578063663abdd2146105a557806368452660146105a05780636faf75741461059b5780636ff6b53814610596578063715018a6146105915780637cb8d3bc1461058c5780637da670a0146105875780637fc7175e14610582578063861f3c6a1461057d5780638abe7fce146105785780638b42babd146105325780638cb3aaa3146105735780638d6a9afc1461050a5780638da5cb5b1461056e57806390e79f1914610569578063929f58401461056457806393029fa71461055f578063967301d41461055a57806396e78aef146104b057806398a84c24146105555780639d3b89ba14610550578063a08f4c7b1461054b578063a1368c9514610546578063a502e3ea14610541578063ada397381461053c578063af3de2d514610537578063b3829acf14610532578063b87f29e11461052d578063bb38494c14610528578063bcdae16014610523578063bd8f238e1461051e578063c0e3dcbc14610519578063c17786a014610514578063c23b3f9a1461050f578063c32c57a91461050a578063c4bffe2b14610505578063c51fea7a14610500578063c5294407146104fb578063cddf38fa146104ce578063cf236627146104f6578063d4b69041146104f1578063d580fbe8146104ec578063d72e68f4146104e7578063dc4b7148146104e2578063dd18eaca146104dd578063de6b9a96146104d8578063decb1d9a146104d3578063eba8cf8d146104ba578063ec370092146104ce578063ee3031eb146104c9578063eeb0b606146104a1578063f019e6ed146104c4578063f0a594a9146104bf578063f151e497146104ba578063f2fde38b146104b5578063f5de7899146104b0578063fb762f68146104ab578063fc9753ed146104a6578063fdc76817146104a15763fe01558f1461049c575f80fd5b6135b9565b6133cb565b61356f565b6134da565b61211b565b613467565b61327d565b61342c565b613406565b6132ad565b612c25565b6131e6565b61313b565b61309b565b611647565b613058565b612f22565b612d82565b612c60565b612ba0565b612b62565b612799565b611f8c565b61078f565b6126a3565b61255c565b612534565b6124a9565b61246b565b6123fc565b611ed9565b6123ad565b612365565b612327565b6122e9565b6121da565b611a53565b612156565b6120b9565b61207b565b61205a565b611fee565b611fc7565b611f11565b611e52565b611e0a565b611d84565b611d69565b611d45565b611d01565b61114b565b611cdb565b611c0a565b611bcc565b611b19565b611a8e565b61160c565b611a15565b6119f4565b611977565b61192f565b6117e6565b611782565b611744565b611706565b611682565b611561565b61139e565b611336565b610713565b6112a8565b611225565b6111ce565b6110cc565b611186565b611107565b611074565b610feb565b610f93565b610f55565b610ea7565b610e30565b610daa565b610c21565b610b2c565b610a8e565b6108f5565b61085c565b6107db565b61074b565b6106a2565b6004359061ffff8216820361067457565b5f80fd5b6024359061ffff8216820361067457565b6001600160a01b031690565b6001600160a01b03169052565b346106745760203660031901126106745761ffff6106be610663565b165f52600e602052602060018060a01b0360405f205416604051908152f35b61ffff165f52600160205260405f2090565b61ffff165f52601560205260405f2090565b61ffff165f52600660205260405f2090565b346106745760203660031901126106745761ffff61072f610663565b165f52601e602052602060ff60405f2054166040519015158152f35b34610674575f366003190112610674576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346106745760203660031901126106745761ffff6107ab610663565b165f52600c602052602060018060a01b0360405f205416604051908152f35b6001600160a01b0381160361067457565b34610674576040366003190112610674576107f4610663565b61ffff60243591610804836107ca565b61080c6148e7565b16805f52600e6020526108228260405f206135dd565b5f805160206157ec8339815191526060604051936020855260066020860152655634486f6f6b60d01b604086015260018060a01b031693a3005b346106745760203660031901126106745761ffff610878610663565b165f526001602052602060018060a01b03600860405f20015416604051908152f35b9181601f84011215610674578235916001600160401b038311610674576020838186019501011161067457565b60643590811515820361067457565b6101243590811515820361067457565b60243590811515820361067457565b346106745760803660031901126106745761090e610663565b6024356001600160401b0381116106745761092d90369060040161089a565b6044359161093a836107ca565b6109426108c7565b9261094b6148e7565b61095f610957866106dd565b5461ffff1690565b61ffff8087169691168614610a435760456002541015610a3157610a18610a1d92610a0a7f62bb0ad0b7a8956c331b58a2677c0309932bd3f9ff9275b0d913ee6f544a8a56976109ae8a614a36565b6109da6109b96136a5565b61ffff88168152946109cc368c8c6136fc565b602087015260408601613732565b60608401525f60808401525f60a08401525f60c08401525f60e08401525f61010084015261012083019015159052565b610a13836106dd565b6138be565b6139f7565b610a2c60405192839283613a3e565b0390a2005b60405163b73ef67b60e01b8152600490fd5b604051630b4ab72d60e21b815261ffff919091166004820152602490fd5b0390fd5b6024359063ffffffff8216820361067457565b60c435906001600160401b038216820361067457565b346106745761014036600319011261067457610aa8610663565b60243590610ab5826107ca565b60443563ffffffff8116810361067457606435610ad1816107ca565b608435610add816107ca565b60a435610ae9816107ca565b60c43591610af6836107ca565b60e43593610b03856107ca565b61010435956001600160401b038716870361067457610b2a98610b246108d6565b98613a65565b005b3461067457604036600319011261067457610b45610663565b61ffff60243591610b55836107ca565b610b5d6148e7565b16805f526012602052610b738260405f206135dd565b5f805160206157ec83398151915260606040519360208552600f60208601526e23b0bab3b2a1b7b73a3937b63632b960891b604086015260018060a01b031693a3005b6001600160a01b03918216815263ffffffff909216602083015291821660408201529181166060830152918216608082015291811660a083015290911660c08201526001600160401b0390911660e08201529015156101008201529015156101208201526101400190565b34610674575f3660031901126106745760165460018060a01b0390610c9182601754169183601854169380601954169080601a541681601b541690601d549360405198899860ff8760481c169760ff8860401c169760018060401b03169663ffffffff8260a01c1691168b610bb6565b0390f35b9081518082526020808093019301915f5b828110610cb4575050505090565b83516001600160a01b031685529381019392810192600101610ca6565b610da79060208152610ce7602082018451610695565b602083015163ffffffff166040820152610d0960408401516060830190610695565b610d1b60608401516080830190610695565b610d2d608084015160a0830190610695565b610d3f60a084015160c0830190610695565b610d5160c084015160e0830190610695565b60e08301519261016090610d72610100958387860152610180850190610c95565b948101516001600160401b03166101208481019190915281015190610d9e610140928386019015159052565b01511515910152565b90565b346106745760203660031901126106745761ffff610dc6610663565b610dce614187565b50165f526015602052610c91610de660405f20614390565b60405191829182610cd1565b9060406003198301126106745760043561ffff811681036106745791602435906001600160401b03821161067457610e2c9160040161089a565b9091565b3461067457610e3e36610df2565b90610e476148e7565b61ffff8093168093815f52600160205260405f20541603610e8e5790610e7b91835f526001602052600160405f2001614477565b5f8051602061578c8339815191525f80a2005b604051635112327760e01b815260048101849052602490fd5b3461067457604036600319011261067457610ec0610663565b602435906001600160401b03908183116106745736602384011215610674578260040135918211610674573660248360051b850101116106745761ffff90610f066148e7565b165f5260209160156020526024600660405f200191610f258484613c9e565b01905f5260205f20925f5b838110610f3957005b60019082843594610f49866107ca565b01938187015501610f30565b346106745760203660031901126106745761ffff610f71610663565b165f526001602052602060018060a01b03600660405f20015416604051908152f35b346106745760203660031901126106745761ffff610faf610663565b610fb76148e7565b168061ffff1960035416176003557ff6549dcfe73f8bc1cc6508ff53d144c3df78d7b2a4f3d670dd1cd6bb1752d3be5f80a2005b3461067457604036600319011261067457611004610663565b61ffff60243591611014836107ca565b61101c6148e7565b16805f52600d6020526110328260405f206135dd565b5f805160206157ec83398151915260606040519360208552600e60208601526d2637ba3a32b93ca6b0b730b3b2b960911b604086015260018060a01b031693a3005b3461067457602036600319011261067457602061ffff80611093610663565b16805f526001835260405f209160ff600884015460a01c1692836110bf575b5050506040519015158152f35b54161490505f80806110b2565b346106745760203660031901126106745761ffff6110e8610663565b165f52600f602052602060018060a01b0360405f205416604051908152f35b34610674575f366003190112610674576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346106745760203660031901126106745761ffff611167610663565b165f526013602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457610b2a6111a2610663565b61ffff602435916111b2836107ca565b6111ba6148e7565b165f526015602052600460405f20016135dd565b3461067457604036600319011261067457610b2a6111ea610663565b61ffff602435916111fa836107ca565b6112026148e7565b165f5260156020526112178160405f206135dd565b600660205260405f206135dd565b346106745760403660031901126106745761123e610663565b61ffff6024359161124e836107ca565b6112566148e7565b16805f52601160205261126c8260405f206135dd565b5f805160206157ec8339815191526060604051936020855260086020860152673b32a22920a3a7a760c11b604086015260018060a01b031693a3005b34610674576040366003190112610674576112c1610663565b602435906112ce826107ca565b6112d66148e7565b6001600160a01b038216156113025761ffff610e7b911691825f526001602052600860405f20016135dd565b60405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081999595960a21b6044820152606490fd5b34610674575f36600319011261067457602063ffffffff60145460101c16604051908152f35b604435906001600160801b038216820361067457565b602435906001600160801b038216820361067457565b606435906001600160801b038216820361067457565b34610674576060366003190112610674576004356113bb816107ca565b602435600481101561067457906113d061135c565b906113d96148e7565b6001600160a01b038116926113ef841515614533565b61ffff92834616945f9060029560028514925b87548110156114ac578061142861141a6001936139c5565b905461ffff9160031b1c1690565b8a848216146114a65761143d611442916106ef565b614390565b611457611453610120830151151590565b1590565b6114a65761147685611470602084015163ffffffff1690565b8b614ac7565b61147f8861456e565b868615611497575061149190896152fc565b01611402565b6114a1918a614e34565b611491565b50611491565b5f8385886114b98161456e565b801584146114ed5750505f805160206157cc8339815191526114e86114dc6145f2565b6040519182918261355e565b0390a3005b6114f68161456e565b6001811484146115205750505f805160206157cc8339815191526114e861151b6145d2565b6114dc565b6115299061456e565b8214611548575f805160206157cc8339815191526114e861151b6145b0565b5f805160206157cc8339815191526114e861151b61458c565b346106745760203660031901126106745761ffff61157d610663565b165f52601560205260405f20805490610c9160018060a01b039283600184015416926115ac6002820154610689565b946115ba6003830154610689565b916115c86004820154610689565b60076115d76005840154610689565b9201549360405198899860ff8760481c169760ff8860401c169760018060401b03169663ffffffff8260a01c1691168b610bb6565b346106745760203660031901126106745761ffff611628610663565b165f52600a602052602060018060a01b0360405f205416604051908152f35b346106745760203660031901126106745761ffff611663610663565b165f526007602052602060018060a01b0360405f205416604051908152f35b34610674576040366003190112610674577ffa8dff0fd33fe41758aabbe1501d22db0a4e4cb4bee446e3842f4891410ceadc60406116be610663565b63ffffffff61ffff6116ce610a65565b926116d76148e7565b16916014548365ffffffff00008360101b169165ffffffffffff191617176014558351928352166020820152a1005b346106745760203660031901126106745761ffff611722610663565b165f526015602052602060018060a01b03600560405f20015416604051908152f35b346106745760203660031901126106745761ffff611760610663565b165f526015602052602060018060a01b03600360405f20015416604051908152f35b346106745760203660031901126106745761ffff61179e610663565b165f526008602052608060405f205460ff63ffffffff916040519260018060a01b0382168452808260a01c1660208501528160c01c16604084015260e01c1615156060820152f35b346106745760e036600319011261067457600435611803816107ca565b60243561180f816107ca565b6044359061181c826107ca565b606435611828816107ca565b608435611834816107ca565b60a43591611841836107ca565b611849610a78565b946118526148e7565b61185a613bfa565b946118636136b4565b9761186e9089613732565b5f60208901526118819060408901613732565b61188e9060608801613732565b61189b9060808701613732565b6118a89060a08601613732565b6118b59060c08501613732565b60e08301526118c8906101008301613c6c565b60016101208201525f6101408201526118e090613df7565b60405180611918816060906020815260156020820152741111519055531517d31697d0d3d3919251d7d4d155605a1b60408201520190565b035f805160206157cc8339815191525f92918392a3005b3461067457604036600319011261067457610b2a61194b610663565b61ffff6024359161195b836107ca565b6119636148e7565b165f526015602052600360405f20016135dd565b3461067457604036600319011261067457611990610663565b6024359061199d826107ca565b6119a56148e7565b61ffff918282168093815f52600160205260405f20541603610e8e57906119da610e7b9260026119d4846106dd565b016135dd565b60036119ee6119e885614a36565b926106dd565b016137d2565b34610674575f36600319011261067457602061ffff60035416604051908152f35b346106745760203660031901126106745761ffff611a31610663565b165f526015602052602060018060a01b03600260405f20015416604051908152f35b346106745760203660031901126106745761ffff611a6f610663565b165f52600d602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457611aa7610663565b61ffff60243591611ab7836107ca565b611abf6148e7565b16805f526010602052611ad58260405f206135dd565b5f805160206157ec83398151915260606040519360208552601060208601526f10da185a5b911c9859dbdb95985d5b1d60821b604086015260018060a01b031693a3005b3461067457602036600319011261067457611b32614611565b5061ffff600435165f526008602052610c9160405f2060ff60405191611b5783613610565b5460018060a01b038116835263ffffffff808260a01c1660208501528160c01c16604084015260e01c161515606082015260405191829182919091606080608083019460018060a01b038151168452602081015163ffffffff8091166020860152604082015116604085015201511515910152565b346106745760203660031901126106745761ffff611be8610663565b165f526015602052602060018060a01b03600460405f20015416604051908152f35b346106745760a036600319011261067457611c23610663565b602435611c2f816107ca565b604435611c3b816107ca565b606435611c47816107ca565b60843591611c54836107ca565b611c5c6148e7565b61ffff938486168095815f526001602052611c7d60405f2061ffff90541690565b1603611cbf5794611cba600793611caf6119d494611ca4610e7b999a60046119d4886106dd565b60056119d4866106dd565b60066119d4846106dd565b6106dd565b604051635112327760e01b815261ffff87166004820152602490fd5b34610674575f36600319011261067457602063ffffffff60095460a01c16604051908152f35b34610674575f36600319011261067457611d196148e7565b5f80546001600160a01b0319811682556001600160a01b03165f805160206157ac8339815191528280a3005b3461067457602036600319011261067457610c91610de6611d64610663565b614635565b34610674575f36600319011261067457602060405160458152f35b3461067457604036600319011261067457611d9d610663565b61ffff60243591611dad836107ca565b611db56148e7565b16805f52600f602052611dcb8260405f206135dd565b5f805160206157ec83398151915260606040519360208552600b60208601526a223930b3b7b72a37b5b2b760a91b604086015260018060a01b031693a3005b3461067457604036600319011261067457610b2a611e26610663565b61ffff60243591611e36836107ca565b611e3e6148e7565b165f526015602052600560405f20016135dd565b3461067457604036600319011261067457611e6b610663565b61ffff60243591611e7b836107ca565b611e836148e7565b16805f52600b602052611e998260405f206135dd565b5f805160206157ec83398151915260606040519360208552600c60208601526b129858dadc1bdd15985d5b1d60a21b604086015260018060a01b031693a3005b346106745760203660031901126106745760043563ffffffff8116809103610674575f526005602052602060405f2054604051908152f35b34610674576040366003190112610674577f1121620854be62ee6386fe112976b58e1f8f41bec38d8bd2f2d8438ce15c8f70604060043563ffffffff611f55610a65565b611f5d6148e7565b825f526004602052611f7181855f2061411e565b16805f52600560205281835f205582519182526020820152a1005b346106745760203660031901126106745761ffff611fa8610663565b165f526011602052602060018060a01b0360405f205416604051908152f35b34610674575f366003190112610674575f546040516001600160a01b039091168152602090f35b3461067457604036600319011261067457612007610663565b63ffffffff61ffff612017610a65565b926120206148e7565b1691825f5260156020526120378160405f20613c7b565b60046020526120498160405f2061411e565b165f52600560205260405f20555f80f35b34610674575f36600319011261067457602061ffff60145416604051908152f35b346106745760203660031901126106745761ffff612097610663565b165f526001602052602060018060a01b03600260405f20015416604051908152f35b3461067457604036600319011261067457610b2a6120d5610663565b61ffff6120e06108e6565b916120e96148e7565b165f52601e60205261210a8160405f209060ff801983541691151516179055565b6015602052600760405f2001613dda565b346106745760203660031901126106745761ffff612137610663565b165f52600b602052602060018060a01b0360405f205416604051908152f35b346106745760403660031901126106745761216f610663565b60243561217b816107ca565b6121836148e7565b6001600160a01b038116916121b49061ffff906121a18515156146e5565b1691825f52600a60205260405f206135dd565b7ff649851bca835268631c2b872d43c76f647f6b53f43f1d28ef1b966483f197d15f80a3005b34610674576040366003190112610674576004356121f7816107ca565b6121ff611372565b6122076148e7565b6001600160a01b03821661221c811515614533565b61ffff91824616935f5b6002548110156122a2578061223f61141a6001936139c5565b878782161461229c5761143d612254916106ef565b84612266611453610120840151151590565b612295578161228988612283602061228f96015163ffffffff1690565b88614ac7565b85614e34565b01612226565b505061228f565b5061228f565b5f845f805160206157cc833981519152604051806114e88160609060208152601460208201527313d0541417d0555513d7d0d3d3919251d554915160621b60408201520190565b346106745760203660031901126106745761ffff612305610663565b165f526001602052602060018060a01b03600560405f20015416604051908152f35b346106745760203660031901126106745761ffff612343610663565b165f526015602052602060018060a01b03600160405f20015416604051908152f35b3461067457604036600319011261067457610b2a612381610663565b61ffff60243591612391836107ca565b6123996148e7565b165f526015602052600160405f20016135dd565b34610674576040366003190112610674576123c6610663565b6024356001600160401b03811681036106745761ffff610b2a926123e86148e7565b165f526015602052600760405f2001613dbb565b346106745760203660031901126106745761ffff612418610663565b165f526006602052602060018060a01b038060405f20541680155f1461246557507f0000000000000000000000000000000000000000000000000000000000000000905b60405191168152f35b9061245c565b346106745760203660031901126106745761ffff612487610663565b165f526001602052602060018060a01b03600760405f20015416604051908152f35b34610674576040366003190112610674576124c2610663565b7fc51601f82a6c70ee2efd5de798b118e577be43137e5c717056848d0bbbe7809b602061ffff6124f0610a65565b936124f96148e7565b165f81815260088352604090819020805463ffffffff60c01b191660c087901b63ffffffff60c01b161790555163ffffffff909416845292a2005b34610674575f366003190112610674576009546040516001600160a01b039091168152602090f35b3461067457604036600319011261067457610b2a612578610663565b61ffff60243591612588836107ca565b6125906148e7565b165f526015602052600260405f20016135dd565b91908251928382525f5b8481106125ce575050825f602080949584010152601f8019910116010190565b6020818301810151848301820152016125ae565b610da790602081526125fb60208201845161ffff169052565b602083015161264361261b610140928360408601526101608501906125a4565b61262d60408701516060860190610695565b6060860151848203601f190160808601526125a4565b93612656608082015160a0850190610695565b61266860a082015160c0850190610695565b61267a60c082015160e0850190610695565b60e081015161268f6101009182860190610695565b81015190610d9e6101209283860190610695565b34610674576020366003190112610674576126bc610663565b5f6101206040516126cc81613630565b828152606060208201528260408201526060808201528260808201528260a08201528260c08201528260e082015282610100820152015261270f610957826106dd565b61ffff80831691160361273c5761273061272b610c91926106dd565b6147ca565b604051918291826125e2565b604051635112327760e01b815261ffff919091166004820152602490fd5b60209060206040818301928281528551809452019301915f5b828110612781575050505090565b835161ffff1685529381019392810192600101612773565b34610674575f3660031901126106745760408051600254808252916020820160025f52905f8051602061576c833981519152935f915b81600f8401106129f9575091839161286d93610c919654918181106129e4575b8181106129cb575b8181106129b3575b81811061299a575b818110612981575b818110612968575b81811061294f575b818110612936575b81811061291d575b818110612904575b8181106128eb575b8181106128d2575b8181106128b9575b8181106128a0575b818110612887575b10612879575b500382613682565b6040519182918261275a565b60f01c81526020015f612865565b60e083901c61ffff16845292600190602001930161285f565b60d083901c61ffff168452926001906020019301612857565b60c083901c61ffff16845292600190602001930161284f565b60b083901c61ffff168452926001906020019301612847565b60a083901c61ffff16845292600190602001930161283f565b609083901c61ffff168452926001906020019301612837565b608083901c61ffff16845292600190602001930161282f565b607083901c61ffff168452926001906020019301612827565b606083901c61ffff16845292600190602001930161281f565b605083901c61ffff168452926001906020019301612817565b604083901c61ffff16845292600190602001930161280f565b603083901c61ffff168452926001906020019301612807565b602083811c61ffff16855290936001910193016127ff565b601083901c61ffff1684529260019060200193016127f7565b61ffff831684529260019060200193016127ef565b94926001610200601092612b568754612b4b838c612b2461ffff91612a238484881661ffff169052565b612a4c6020612a3c818701868f8b901c1661ffff169052565b8488848801921c1661ffff169052565b612afc606091612a66838701868a60301c1661ffff169052565b612a7c608091868a848a01921c1661ffff169052565b612ad460a091612a96838901888c60501c1661ffff169052565b612aac60c095888c888c01921c1661ffff169052565b868a61010060e09a612ac88c8201858560701c1661ffff169052565b01921c1661ffff169052565b612aea6101208b01868a60901c1661ffff169052565b84886101408c01921c1661ffff169052565b612b126101608901848860b01c1661ffff169052565b82866101808a01921c1661ffff169052565b612b3a6101a08701828660d01c1661ffff169052565b836101c08701921c1661ffff169052565b60f01c6101e0830152565b019401920191946127cf565b346106745760203660031901126106745761ffff612b7e610663565b165f526001602052602060018060a01b03600460405f20015416604051908152f35b3461067457604036600319011261067457612bb9610663565b61ffff60243591612bc9836107ca565b612bd16148e7565b16805f52600c602052612be78260405f206135dd565b5f805160206157ec83398151915260606040519360208552600a6020860152694761735265736572766560b01b604086015260018060a01b031693a3005b346106745760203660031901126106745761ffff612c41610663565b165f526012602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457612c79610663565b612c816108e6565b612c896148e7565b61ffff918281168093815f52600160205260405f20541603610e8e5781612cdf7f8a2e7bc3935fd57632299c1b85c1f2a2ca6b83577ced6c12e0516eb9d809c9d2936008612cd9610a2c956106dd565b016138a1565b60405190151581529081906020820190565b9081518082526020808093019301915f5b828110612d10575050505090565b83516001600160a01b031685529381019392810192600101612d02565b909291604082019160408152845180935260608101926020809601905f5b818110612d6857505050610da79394506020818403910152612cf1565b825163ffffffff1686529487019491870191600101612d4b565b34610674575f366003190112610674575f80600254612dae612da760145461ffff1690565b61ffff1690565b925b818110612ece5750612dca612dc483613c3a565b92613c3a565b925f905f5b838110612de55760405180610c91888883612d2d565b81612df5612da761141a846139c5565b141580612e9a575b612e0a575b600101612dcf565b91612e92600191612e4a612e35612e2b612e2661141a896139c5565b6140df565b5463ffffffff1690565b612e3f838a6148d3565b9063ffffffff169052565b612e8d612e7e612e71612e5f61141a896139c5565b61ffff165f52600b60205260405f2090565b546001600160a01b031690565b612e88838b6148d3565b613732565b614894565b929050612e02565b50612e5f612ec6612e71612ead846139c5565b90546001600160a01b0394919061ffff9160031b1c1690565b161515612dfd565b83612ede612da761141a846139c5565b141580612f07575b612ef3575b600101612db0565b91612eff600191614894565b929050612eeb565b50612e5f612f1a612e71612ead846139c5565b161515612ee6565b3461067457608036600319011261067457600435612f3f816107ca565b612f47610678565b90612f50611388565b612f586148e7565b6001600160a01b0382169261ffff90612f72851515614533565b165f526015602052612f8660405f20614390565b916101208301511561301557612fc3612fcd9284602063ffffffff960193612fbe604435612fb8875163ffffffff1690565b83614ac7565b614e34565b5163ffffffff1690565b16905f805160206157cc833981519152604051806114e88160609060208152601560208201527413d0541417d0d210525397d0d3d3919251d5549151605a1b60408201520190565b60405162461bcd60e51b815260206004820152601b60248201527a14995b5bdd194818da185a5b881b9bdd0818dbdb999a59dd5c9959602a1b6044820152606490fd5b346106745760203660031901126106745761ffff613074610663565b61307c614611565b50165f526008602052610c9160405f2060ff60405191611b5783613610565b34610674576040366003190112610674576130b4610663565b6024356130c0816107ca565b6130c86148e7565b6001600160a01b038116916130f99061ffff906130e68515156146e5565b1691825f52600760205260405f206135dd565b600860205260405f908120805460ff60e01b1916600160e01b1790557f2266a81f17c96c32ee098cae5157f8e48746474f861ecc33e0e9c477bc7d35d19080a3005b346106745761314936610df2565b906131526148e7565b61ffff928381168094815f52600160205260405f205416036131cd5791816131a8827f3b2cda9d4495d453fa37b754e82b0cb1f85969b6109ff9f7f115456dcdb81c009460036131a289986106dd565b01614477565b6131b760405192839283613a3e565b0390a25f8051602061578c8339815191525f80a2005b604051635112327760e01b815260048101859052602490fd5b34610674576040366003190112610674576131ff610663565b6024359061320c826107ca565b6132146148e7565b6001600160a01b03821690811561326b577f8efcbf71ab784f8ebb6bf61d2ae0526705fc7fb1c1ce8b4320688b03c21850149161326261ffff6020931694855f526006845260405f206135dd565b604051908152a2005b60405163d92e233d60e01b8152600490fd5b34610674576020366003190112610674576004355f526004602052602063ffffffff60405f205416604051908152f35b34610674576040366003190112610674576004356132ca816107ca565b7f36d1fadd15d1022f48d4477c2f58748713a8c2648a96be06b5852e2a7bb9b091610a2c6132f6610a65565b6132fe6148e7565b6001600160a01b03841693613385906133188615156146e5565b6009805463ffffffff60a01b1988166001600160c01b03199091161760a085901b63ffffffff60a01b1617905560925f526007602052613378817f6158b6df9f3d7178cf0df15ead8155214868eab5a79e7108878471a4bfa6c65c6135dd565b6133806140f1565b6135dd565b613396816133916140f1565b613c7b565b6133b46133a16140f1565b805460ff60e01b1916600160e01b179055565b60405163ffffffff90911681529081906020820190565b346106745760203660031901126106745761ffff6133e7610663565b165f526010602052602060018060a01b0360405f205416604051908152f35b34610674575f36600319011261067457602061ffff806014541690461614604051908152f35b346106745760203660031901126106745761ffff613448610663565b165f526006602052602060018060a01b0360405f205416604051908152f35b3461067457602036600319011261067457600435613484816107ca565b61348c6148e7565b6001600160a01b039081169081156134c2575f548260018060a01b03198216175f55165f805160206157ac8339815191525f80a3005b604051631e4fbdf760e01b81525f6004820152602490fd5b34610674576040366003190112610674576134f3610663565b61ffff60243591613503836107ca565b61350b6148e7565b16805f5260136020526135218260405f206135dd565b5f805160206157ec833981519152606060405193602085526009602086015268262826b0b730b3b2b960b91b604086015260018060a01b031693a3005b906020610da79281815201906125a4565b346106745760203660031901126106745761ffff61358b610663565b165f526001602052610c916135a5600360405f200161472a565b6040519182916020835260208301906125a4565b34610674575f366003190112610674576135d1614187565b50610c91610de6614299565b80546001600160a01b0319166001600160a01b03909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b0382111761362b57604052565b6135fc565b61014081019081106001600160401b0382111761362b57604052565b606081019081106001600160401b0382111761362b57604052565b604081019081106001600160401b0382111761362b57604052565b601f909101601f19168101906001600160401b0382119082101761362b57604052565b604051906136b282613630565b565b6040519061016082016001600160401b0381118382101761362b57604052565b604051906136b28261364c565b6001600160401b03811161362b57601f01601f191660200190565b929192613708826136e1565b916137166040519384613682565b829481845281830111610674578281602093845f960137010152565b6001600160a01b039091169052565b90600182811c9216801561376f575b602083101461375b57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613750565b818110613784575050565b5f8155600101613779565b9190601f811161379e57505050565b6136b2925f5260205f20906020601f840160051c830193106137c8575b601f0160051c0190613779565b90915081906137bb565b81519192916001600160401b03811161362b576137f9816137f38454613741565b8461378f565b602080601f831160011461383a5750819061382b9394955f9261382f575b50508160011b915f199060031b1c19161790565b9055565b015190505f80613817565b90601f1983169561384e855f5260205f2090565b925f905b88821061388957505083600195969710613871575b505050811b019055565b01515f1960f88460031b161c191690555f8080613867565b80600185968294968601518155019501930190613852565b805460ff60a01b191691151560a01b60ff60a01b16919091179055565b906139ab61012060086136b2946138ec6138da865161ffff1690565b825461ffff191661ffff909116178255565b6138fd6020860151600183016137d2565b61391661390d6040870151610689565b600283016135dd565b6139276060860151600383016137d2565b6139406139376080870151610689565b600483016135dd565b61395961395060a0870151610689565b600583016135dd565b61397261396960c0870151610689565b600683016135dd565b61398b61398260e0870151610689565b600783016135dd565b01926139a461399e610100830151610689565b856135dd565b0151151590565b906138a1565b634e487b7160e01b5f52603260045260245ffd5b906002548210156139f25760025f52600482901c5f8051602061576c833981519152019160011b601e1690565b6139b1565b60025490600160401b82101561362b5760018201806002558210156139f25760025f5260205f208260041c019161ffff8060f085549360041b169316831b921b1916179055565b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b96919897939294959095613a776148e7565b613a7f613bfa565b93613a886136b4565b96613a938989613732565b63ffffffff8c166020890152613aac9060408901613732565b613ab99060608801613732565b613ac69060808701613732565b613ad39060a08601613732565b613ae09060c08501613732565b60e0830152613af3906101008301613c6c565b6001610120820152831515610140820152613b0d836106ef565b90613b1791613fe4565b82613b2e8361ffff165f52601e60205260405f2090565b90613b44919060ff801983541691151516179055565b613b4d82610701565b90613b57916135dd565b82613b61826140df565b90613b6b9161411e565b61ffff16613b878363ffffffff165f52600560205260405f2090565b5515613bc1575f5f805160206157cc83398151915263ffffffff613ba961415c565b935b613bbc60405192839216958261355e565b0390a3565b5f5f805160206157cc83398151915263ffffffff613bdd614133565b93613bab565b6001600160401b03811161362b5760051b60200190565b604051602081016001600160401b0381118282101761362b576040525f8152905f368137565b60405190613c2d82613667565b6001825260203681840137565b90613c4482613be3565b613c516040519182613682565b8281528092613c62601f1991613be3565b0190602036910137565b6001600160401b039091169052565b805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b90600160401b811161362b57815490808355818110613cbc57505050565b6136b2925f5260205f209182019101613779565b8051906001600160401b03821161362b57600160401b821161362b57601c5482601c55808310613d41575b50601c5f9081526020918201915f8051602061574c833981519152915b848110613d26575050505050565b83516001600160a01b03168382015592810192600101613d18565b601c5f52613d62905f8051602061574c833981519152908101908401613779565b5f613cfb565b8151916001600160401b03831161362b57613d838383613c9e565b6020809101915f5260205f20905f5b848110613da0575050505050565b83516001600160a01b03168382015592810192600101613d92565b80546001600160401b0319166001600160401b03909216919091179055565b805460ff60481b191691151560481b60ff60481b16919091179055565b613fc56101406136b292613e30613e0e8251610689565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b613e69613e44602083015163ffffffff1690565b6016805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b613e9b613e796040830151610689565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b613ecd613eab6060830151610689565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b613eff613edd6080830151610689565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b613f31613f0f60a0830151610689565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b613f63613f4160c0830151610689565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b613f7060e0820151613cd0565b610100810151601d80546001600160401b0319166001600160401b039092169190911790556139a4613fa6610120830151151590565b601d805460ff60401b191691151560401b60ff60401b16919091179055565b601d805460ff60481b191691151560481b60ff60481b16919091179055565b906140d961014060076136b294614004613ffe8651610689565b826135dd565b61401e614018602087015163ffffffff1690565b82613c7b565b61403761402e6040870151610689565b600183016135dd565b61404761390d6060870151610689565b6140606140576080870151610689565b600383016135dd565b61407061393760a0870151610689565b61408061395060c0870151610689565b61409160e086015160068301613d68565b610100850151910193906140ae906001600160401b031685613dbb565b6139a46140bf610120830151151590565b855460ff60401b191690151560401b60ff60401b16178555565b90613dda565b61ffff165f52600460205260405f2090565b60925f5260086020527f0849f82a83851433a6d01f34de538eb67ba2a2b05e2943072947611bbb9c845690565b9063ffffffff1663ffffffff19825416179055565b6040519061414082613667565b600d82526c131697d0d3d3919251d7d4d155609a1b6020830152565b6040519061416982613667565b600f82526e10d554d513d357d3d0541417d4d155608a1b6020830152565b6040519061016082016001600160401b0381118382101761362b576040525f610140838281528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e082015282610100820152826101208201520152565b60405190601c54808352826020916020820190601c5f5260205f20935f905b82821061421f575050506136b292500383613682565b85546001600160a01b031684526001958601958895509381019390910190614209565b90604051918281549182825260209260208301915f5260205f20935f905b828210614276575050506136b292500383613682565b85546001600160a01b031684526001958601958895509381019390910190614260565b6142a16136b4565b906142d263ffffffff6016546142bf60018060a01b03821686613732565b60a01c16602084019063ffffffff169052565b6142e96142e0601754610689565b60408401613732565b6143006142f7601854610689565b60608401613732565b61431761430e601954610689565b60808401613732565b61432e614325601a54610689565b60a08401613732565b61434561433c601b54610689565b60c08401613732565b61434d6141ea565b60e0830152601d546136b29060ff906143736001600160401b0382166101008701613c6c565b604081901c8216151561012086015260481c161515610140840152565b906136b260ff60076143a06136b4565b946143d063ffffffff82546143bd60018060a01b0382168a613732565b60a01c16602088019063ffffffff169052565b6143e96143e06001830154610689565b60408801613732565b6144026143f96002830154610689565b60608801613732565b61441b6144126003830154610689565b60808801613732565b61443461442b6004830154610689565b60a08801613732565b61444d6144446005830154610689565b60c08801613732565b61445960068201614242565b60e087015201546143736001600160401b0382166101008701613c6c565b9092916001600160401b03811161362b57614496816137f38454613741565b5f601f82116001146144cf57819061382b9394955f926144c45750508160011b915f199060031b1c19161790565b013590505f80613817565b601f198216946144e2845f5260205f2090565b915f5b87811061451b57508360019596971061450257505050811b019055565b01355f19600384901b60f8161c191690555f8080613867565b909260206001819286860135815501940191016144e5565b1561453a57565b60405162461bcd60e51b815260206004820152600c60248201526b0496e76616c6964204f4170760a41b6044820152606490fd5b6004111561457857565b634e487b7160e01b5f52602160045260245ffd5b6040519061459982613667565b600882526721a7a6a827a9a2a960c11b6020830152565b604051906145bd82613667565b600682526513169491505160d21b6020830152565b604051906145df82613667565b600482526304f4150560e41b6020830152565b604051906145ff82613667565b600382526213d19560ea1b6020830152565b6040519061461e82613610565b5f6060838281528260208201528260408201520152565b61463d614187565b5061464a61143d826106ef565b610140810151158015906146d7575b6146d25750614666614299565b9063ffffffff614675826140df565b541660208301526001600160a01b039081908161469182610701565b5416156146aa576146a190610701565b54165b16815290565b50507f00000000000000000000000000000000000000000000000000000000000000006146a4565b905090565b506101208101511515614659565b156146ec57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7261636c65206164647265737360501b6044820152606490fd5b9060405191825f825461473c81613741565b908184526020946001916001811690815f146147a8575060011461476a575b5050506136b292500383613682565b5f90815285812095935091905b8183106147905750506136b293508201015f808061475b565b85548884018501529485019487945091830191614777565b925050506136b294925060ff191682840152151560051b8201015f808061475b565b906136b260ff60086147da6136a5565b946147f26147ea825461ffff1690565b61ffff168752565b6147fe6001820161472a565b60208701526148136143e06002830154610689565b61481f6003820161472a565b60608701526148346144126004830154610689565b61484461442b6005830154610689565b6148546144446006830154610689565b61486d6148646007830154610689565b60e08801613732565b01546148866001600160a01b0382166101008701613732565b60a01c161515610120840152565b5f1981146148a25760010190565b634e487b7160e01b5f52601160045260245ffd5b8051156139f25760200190565b8051600110156139f25760400190565b80518210156139f25760209160051b010190565b5f546001600160a01b031633036148fa57565b60405163118cdaa760e01b8152336004820152602490fd5b6040519061491f82613667565b6002825261575360f01b6020830152565b6040519061493d82613667565b60058252640ae82ac82b60db1b6020830152565b6040519061495e82613667565b60048252635746544d60e01b6020830152565b6040519061497e82613667565b6006825265574d4154494360d01b6020830152565b604051906149a082613667565b60048252632ba1272160e11b6020830152565b604051906149c082613667565b60048252635754414360e01b6020830152565b604051906149e082613667565b6005825264574859504560d81b6020830152565b60405190614a0182613667565b600682526515d353d3905160d21b6020830152565b60405190614a2382613667565b60048252630ae8aa8960e31b6020830152565b60928114614abe5761a86a8114614ab55760fa8114614aac5760898114614aa35760388114614a9a5760ef8114614a91576103e78114614a88576176b614614a8057610da7614a16565b610da76149f4565b50610da76149d3565b50610da76149b3565b50610da7614993565b50610da7614971565b50610da7614951565b50610da7614930565b50610da7614912565b906136b29263ffffffff60405192633400288b60e01b6020850152166024830152604482015260448152614afa81613610565b60405191614b0783613667565b600c83526b1cd95d1419595c8819985a5b60a21b60208401526154ce565b15614b2c57565b60405162461bcd60e51b815260206004820152601a602482015279131bd8d85b0818da185a5b881b9bdd0818dbdb999a59dd5c995960321b6044820152606490fd5b15614b7557565b60405162461bcd60e51b8152602060048201526011602482015270139bc81b1bd8d85b08195b991c1bda5b9d607a1b6044820152606490fd5b6001600160a01b03918216815263ffffffff9092166020830152909116604082015260600190565b60405190614be382613667565b60138252721cd95d14d95b99131a589c985c9e4819985a5b606a1b6020830152565b60405190614c1282613667565b60168252751cd95d149958d95a5d99531a589c985c9e4819985a5b60521b6020830152565b60409060405191614c4783613667565b6001835282915f5b602080821015614c8157835160209291614c688261364c565b5f82525f81830152606086830152828801015201614c4f565b505091925050565b9190606091606084019160018060a01b0380911685526020911681850152604092606060408601528551809352608085018260808560051b8801019701945f925b858410614cdc57505050505050505090565b9091929394959698978580614d1e6001938d607f1990820301885285878d5163ffffffff808251168552868201511686850152015191818982015201906125a4565b9a9b99019796959190910193019190614cca565b60405190614d3f82613667565b60168252751cd95d115e1958dd5d1bdc90dbdb999a59c819985a5b60521b6020830152565b91614d9c90610da7949260018060401b03168452600160208501525f60408501525f606085015260c0608085015260c0840190612cf1565b9160a0818403910152612cf1565b9091614d9c610da79360018452600160208501525f60408501525f606085015260c0608085015260c0840190612cf1565b60405190614de882613667565b600f82526e1cd95d14d95b991553138819985a5b608a1b6020830152565b60405190614e1382613667565b60128252711cd95d149958d95a5d995553138819985a5b60721b6020830152565b614f2b60206136b29493614e4e61143d61ffff46166106ef565b614e64614e5f610120830151151590565b614b25565b614e6e8151610689565b6001600160a01b0391614e848284161515614b6e565b6040908482820191614e968351610689565b86811661528a575b506060810195614eae8751610689565b818116615207575b50614ec46080830151610689565b9081161515806151f2575b615135575b5060a081018a614eec614ee78351610689565b610689565b151580615120575b615042575b50505060a091500190614f0f614ee78351610689565b15158061502d575b614f31575b50505050015163ffffffff1690565b90615602565b6150249361501691614f57614f4e614f47613c20565b9551610689565b612e88866148b6565b61010087015161500a90614fef906001600160401b0316614f86614f79613bfa565b85519889938e8501614d64565b0393614f9a601f1995868101895288613682565b614fa2614c37565b96614fb38c8c015163ffffffff1690565b90614fcb614fbf6136d4565b63ffffffff9093168352565b6002828e015285820152614fde886148b6565b52614fe8876148b6565b5051610689565b91516306dbd9f960e41b8a8201529485928c60248501614c89565b03908101835282613682565b61501e614e06565b916154ce565b5f808080614f1c565b5061503b614ee78551610689565b1515614f17565b61500a6150ec615116966150826101006151079761507461506b615064613c20565b9951610689565b612e888a6148b6565b01516001600160401b031690565b61509b61508d613bfa565b8b5197889360208501614d64565b03946150af601f1996878101835282613682565b6150c78e6150bb614c37565b99015163ffffffff1690565b906150d3614fbf6136d4565b6150df8f830160029052565b8a820152614fde886148b6565b9487519586936306dbd9f960e41b8e86015260248501614c89565b61510f614ddb565b90846154ce565b5f8481808a614ef9565b5061512e614ee78651610689565b1515614ef4565b84516127108a82019081526001600160a01b0390921660208301526151ec916151dd90829060400103615170601f1991828101855284613682565b615178614c37565b926151898d88015163ffffffff1690565b90615195614fbf6136d4565b6001828f0152898201526151a8846148b6565b526151b2836148b6565b508d61500a6151c18951610689565b948a519586936306dbd9f960e41b602086015260248501614c89565b6151e5614d32565b90876154ce565b5f614ed4565b50615200614ee78551610689565b1515614ecf565b615284906152758d6152676152228e89015163ffffffff1690565b8a51636a14d71560e01b60208201526001600160a01b03938416602482015263ffffffff90911660448201529190931660648201525f608482015291829060a4820190565b03601f198101835282613682565b61527d614c05565b90886154ce565b5f614eb6565b6152c9906152c18c6152676152a58d88015163ffffffff1690565b9389519485936309535ff360e41b602086015260248501614bae565b6151e5614bd6565b5f614e9e565b604051906152dc82613667565b60118252701cd95d131e949958591553138819985a5b607a1b6020830152565b9061530d61143d61ffff46166106ef565b9061531f614e5f610120840151151590565b6153298251610689565b916001600160a01b03906153408285161515614b6e565b61534d60c0820151610689565b9082821615615486575b604001916153658351610689565b818116615448575b508116151580615433575b615384575b5050505050565b6154299461500a615404615421946153a761539d613c20565b95612e88876148b6565b6153af613bfa565b946153c260405196879260208401614daa565b03946153d6601f1996878101835282613682565b6153e360206150bb614c37565b906153ef614fbf6136d4565b600260208301526040820152614fde886148b6565b946040519586936306dbd9f960e41b602086015260248501614c89565b61501e6152cf565b5f8080808061537d565b50615441614ee78351610689565b1515615378565b615480906152c1615460602088015163ffffffff1690565b6152676040519384926309535ff360e41b60208501528c60248501614bae565b5f61536d565b9050604061549760a0830151610689565b919050615357565b3d156154c9573d906154b0826136e1565b916154be6040519384613682565b82523d5f602084013e565b606090565b5f91829182602083519301915af1906154e561549f565b91156154ef575050565b8151156154ff5750602081519101fd5b60405162461bcd60e51b815260206004820152908190610a619060248301906125a4565b60609063ffffffff610da794931681526001602082015281604082015201906125a4565b60609063ffffffff610da794931681526002602082015281604082015201906125a4565b6040906040519161557b8361364c565b60028352825f5b82811061558e57505050565b806060602080938501015201615582565b6020808201906020835283518092526040830192602060408460051b8301019501935f915b8483106155d45750505050505090565b90919293949584806155f2600193603f198682030187528a516125a4565b98019301930191949392906155c4565b604051600360f01b6020820152600160f81b60228201819052601160f01b6023830152602582015260809390931b6001600160801b0319166026840152601683529091601f199190615655603682613682565b6156986040519461567a8661566e858460208401615523565b03868101885287613682565b61568c60405193849260208401615547565b03848101835282613682565b6156a061556b565b936156aa856148b6565b526156b4846148b6565b506156be846148c3565b526156c8836148c3565b505f806040516020810190630b98bd0760e41b82526156fa816156ee896024830161559f565b03878101835282613682565b519082855af161570861549f565b501561571357505050565b5f9283809361573b604051918261500a6020820196630502603d60e11b88526024830161559f565b51925af15061574861549f565b5056fe0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a211405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acee8242d0dc51110feb37170760dbf7f8f2f68ca3b7e0c076130099f0376e01df28be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e079e9965c0300757dfcd8b13acb16fd53a18e322fd9aa016353434bd82b375ddffc8d34b6ceb5f56f2100abe2e4df9f55de23da794df4d3eccc026037655afd84a264697066735822122076cc5b48fba7255937535d5a3f63263301e17e6a8a22a9b5afe4610451cfcf8064736f6c63430008180033000000000000000000000000b05cf01231cf2ff99499682e64d3780d57c80fdd

Deployed Bytecode

0x60806040526004361015610011575f80fd5b5f3560e01c806301b774c81461065e578063027636ae146105f55780630348eca31461065e5780630375d4f814610659578063064232391461050f578063087bd7af146106545780630ade4f9e1461064f5780630b9549661461064a5780630d9ad8c01461064557806310e1c2b0146106405780631a21d86f1461063b5780631aede2b6146106365780631b04d0451461063157806320caeefe1461062c578063219d18da1461062757806324bb729314610622578063284e0a341461061d57806328f41de3146106185780633164b39914610609578063335635f6146106135780633593c41e1461059657806337e32a941461060e5780633a07b830146106095780634077a43d14610604578063413eef06146105ff57806342451a08146105fa578063424f5dba146105f55780634392fe86146105f057806346113785146105eb5780634707f548146105e657806347bf3faf146105b45780634af91330146104e25780634fb75116146105e1578063502ebb30146105dc57806350a06d91146105d75780635356b0b7146105d257806355e1a91a146105cd5780635696013b146105c85780635b998529146105c35780635cf0e8a4146105be5780635f89d111146105b95780635f931584146105505780636036d616146105b457806362c21b35146105af5780636616e9f5146105aa578063663abdd2146105a557806368452660146105a05780636faf75741461059b5780636ff6b53814610596578063715018a6146105915780637cb8d3bc1461058c5780637da670a0146105875780637fc7175e14610582578063861f3c6a1461057d5780638abe7fce146105785780638b42babd146105325780638cb3aaa3146105735780638d6a9afc1461050a5780638da5cb5b1461056e57806390e79f1914610569578063929f58401461056457806393029fa71461055f578063967301d41461055a57806396e78aef146104b057806398a84c24146105555780639d3b89ba14610550578063a08f4c7b1461054b578063a1368c9514610546578063a502e3ea14610541578063ada397381461053c578063af3de2d514610537578063b3829acf14610532578063b87f29e11461052d578063bb38494c14610528578063bcdae16014610523578063bd8f238e1461051e578063c0e3dcbc14610519578063c17786a014610514578063c23b3f9a1461050f578063c32c57a91461050a578063c4bffe2b14610505578063c51fea7a14610500578063c5294407146104fb578063cddf38fa146104ce578063cf236627146104f6578063d4b69041146104f1578063d580fbe8146104ec578063d72e68f4146104e7578063dc4b7148146104e2578063dd18eaca146104dd578063de6b9a96146104d8578063decb1d9a146104d3578063eba8cf8d146104ba578063ec370092146104ce578063ee3031eb146104c9578063eeb0b606146104a1578063f019e6ed146104c4578063f0a594a9146104bf578063f151e497146104ba578063f2fde38b146104b5578063f5de7899146104b0578063fb762f68146104ab578063fc9753ed146104a6578063fdc76817146104a15763fe01558f1461049c575f80fd5b6135b9565b6133cb565b61356f565b6134da565b61211b565b613467565b61327d565b61342c565b613406565b6132ad565b612c25565b6131e6565b61313b565b61309b565b611647565b613058565b612f22565b612d82565b612c60565b612ba0565b612b62565b612799565b611f8c565b61078f565b6126a3565b61255c565b612534565b6124a9565b61246b565b6123fc565b611ed9565b6123ad565b612365565b612327565b6122e9565b6121da565b611a53565b612156565b6120b9565b61207b565b61205a565b611fee565b611fc7565b611f11565b611e52565b611e0a565b611d84565b611d69565b611d45565b611d01565b61114b565b611cdb565b611c0a565b611bcc565b611b19565b611a8e565b61160c565b611a15565b6119f4565b611977565b61192f565b6117e6565b611782565b611744565b611706565b611682565b611561565b61139e565b611336565b610713565b6112a8565b611225565b6111ce565b6110cc565b611186565b611107565b611074565b610feb565b610f93565b610f55565b610ea7565b610e30565b610daa565b610c21565b610b2c565b610a8e565b6108f5565b61085c565b6107db565b61074b565b6106a2565b6004359061ffff8216820361067457565b5f80fd5b6024359061ffff8216820361067457565b6001600160a01b031690565b6001600160a01b03169052565b346106745760203660031901126106745761ffff6106be610663565b165f52600e602052602060018060a01b0360405f205416604051908152f35b61ffff165f52600160205260405f2090565b61ffff165f52601560205260405f2090565b61ffff165f52600660205260405f2090565b346106745760203660031901126106745761ffff61072f610663565b165f52601e602052602060ff60405f2054166040519015158152f35b34610674575f366003190112610674576040517f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6001600160a01b03168152602090f35b346106745760203660031901126106745761ffff6107ab610663565b165f52600c602052602060018060a01b0360405f205416604051908152f35b6001600160a01b0381160361067457565b34610674576040366003190112610674576107f4610663565b61ffff60243591610804836107ca565b61080c6148e7565b16805f52600e6020526108228260405f206135dd565b5f805160206157ec8339815191526060604051936020855260066020860152655634486f6f6b60d01b604086015260018060a01b031693a3005b346106745760203660031901126106745761ffff610878610663565b165f526001602052602060018060a01b03600860405f20015416604051908152f35b9181601f84011215610674578235916001600160401b038311610674576020838186019501011161067457565b60643590811515820361067457565b6101243590811515820361067457565b60243590811515820361067457565b346106745760803660031901126106745761090e610663565b6024356001600160401b0381116106745761092d90369060040161089a565b6044359161093a836107ca565b6109426108c7565b9261094b6148e7565b61095f610957866106dd565b5461ffff1690565b61ffff8087169691168614610a435760456002541015610a3157610a18610a1d92610a0a7f62bb0ad0b7a8956c331b58a2677c0309932bd3f9ff9275b0d913ee6f544a8a56976109ae8a614a36565b6109da6109b96136a5565b61ffff88168152946109cc368c8c6136fc565b602087015260408601613732565b60608401525f60808401525f60a08401525f60c08401525f60e08401525f61010084015261012083019015159052565b610a13836106dd565b6138be565b6139f7565b610a2c60405192839283613a3e565b0390a2005b60405163b73ef67b60e01b8152600490fd5b604051630b4ab72d60e21b815261ffff919091166004820152602490fd5b0390fd5b6024359063ffffffff8216820361067457565b60c435906001600160401b038216820361067457565b346106745761014036600319011261067457610aa8610663565b60243590610ab5826107ca565b60443563ffffffff8116810361067457606435610ad1816107ca565b608435610add816107ca565b60a435610ae9816107ca565b60c43591610af6836107ca565b60e43593610b03856107ca565b61010435956001600160401b038716870361067457610b2a98610b246108d6565b98613a65565b005b3461067457604036600319011261067457610b45610663565b61ffff60243591610b55836107ca565b610b5d6148e7565b16805f526012602052610b738260405f206135dd565b5f805160206157ec83398151915260606040519360208552600f60208601526e23b0bab3b2a1b7b73a3937b63632b960891b604086015260018060a01b031693a3005b6001600160a01b03918216815263ffffffff909216602083015291821660408201529181166060830152918216608082015291811660a083015290911660c08201526001600160401b0390911660e08201529015156101008201529015156101208201526101400190565b34610674575f3660031901126106745760165460018060a01b0390610c9182601754169183601854169380601954169080601a541681601b541690601d549360405198899860ff8760481c169760ff8860401c169760018060401b03169663ffffffff8260a01c1691168b610bb6565b0390f35b9081518082526020808093019301915f5b828110610cb4575050505090565b83516001600160a01b031685529381019392810192600101610ca6565b610da79060208152610ce7602082018451610695565b602083015163ffffffff166040820152610d0960408401516060830190610695565b610d1b60608401516080830190610695565b610d2d608084015160a0830190610695565b610d3f60a084015160c0830190610695565b610d5160c084015160e0830190610695565b60e08301519261016090610d72610100958387860152610180850190610c95565b948101516001600160401b03166101208481019190915281015190610d9e610140928386019015159052565b01511515910152565b90565b346106745760203660031901126106745761ffff610dc6610663565b610dce614187565b50165f526015602052610c91610de660405f20614390565b60405191829182610cd1565b9060406003198301126106745760043561ffff811681036106745791602435906001600160401b03821161067457610e2c9160040161089a565b9091565b3461067457610e3e36610df2565b90610e476148e7565b61ffff8093168093815f52600160205260405f20541603610e8e5790610e7b91835f526001602052600160405f2001614477565b5f8051602061578c8339815191525f80a2005b604051635112327760e01b815260048101849052602490fd5b3461067457604036600319011261067457610ec0610663565b602435906001600160401b03908183116106745736602384011215610674578260040135918211610674573660248360051b850101116106745761ffff90610f066148e7565b165f5260209160156020526024600660405f200191610f258484613c9e565b01905f5260205f20925f5b838110610f3957005b60019082843594610f49866107ca565b01938187015501610f30565b346106745760203660031901126106745761ffff610f71610663565b165f526001602052602060018060a01b03600660405f20015416604051908152f35b346106745760203660031901126106745761ffff610faf610663565b610fb76148e7565b168061ffff1960035416176003557ff6549dcfe73f8bc1cc6508ff53d144c3df78d7b2a4f3d670dd1cd6bb1752d3be5f80a2005b3461067457604036600319011261067457611004610663565b61ffff60243591611014836107ca565b61101c6148e7565b16805f52600d6020526110328260405f206135dd565b5f805160206157ec83398151915260606040519360208552600e60208601526d2637ba3a32b93ca6b0b730b3b2b960911b604086015260018060a01b031693a3005b3461067457602036600319011261067457602061ffff80611093610663565b16805f526001835260405f209160ff600884015460a01c1692836110bf575b5050506040519015158152f35b54161490505f80806110b2565b346106745760203660031901126106745761ffff6110e8610663565b165f52600f602052602060018060a01b0360405f205416604051908152f35b34610674575f366003190112610674576040517f0000000000000000000000006f475642a6e85809b1c36fa62763669b1b48dd5b6001600160a01b03168152602090f35b346106745760203660031901126106745761ffff611167610663565b165f526013602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457610b2a6111a2610663565b61ffff602435916111b2836107ca565b6111ba6148e7565b165f526015602052600460405f20016135dd565b3461067457604036600319011261067457610b2a6111ea610663565b61ffff602435916111fa836107ca565b6112026148e7565b165f5260156020526112178160405f206135dd565b600660205260405f206135dd565b346106745760403660031901126106745761123e610663565b61ffff6024359161124e836107ca565b6112566148e7565b16805f52601160205261126c8260405f206135dd565b5f805160206157ec8339815191526060604051936020855260086020860152673b32a22920a3a7a760c11b604086015260018060a01b031693a3005b34610674576040366003190112610674576112c1610663565b602435906112ce826107ca565b6112d66148e7565b6001600160a01b038216156113025761ffff610e7b911691825f526001602052600860405f20016135dd565b60405162461bcd60e51b815260206004820152600c60248201526b125b9d985b1a59081999595960a21b6044820152606490fd5b34610674575f36600319011261067457602063ffffffff60145460101c16604051908152f35b604435906001600160801b038216820361067457565b602435906001600160801b038216820361067457565b606435906001600160801b038216820361067457565b34610674576060366003190112610674576004356113bb816107ca565b602435600481101561067457906113d061135c565b906113d96148e7565b6001600160a01b038116926113ef841515614533565b61ffff92834616945f9060029560028514925b87548110156114ac578061142861141a6001936139c5565b905461ffff9160031b1c1690565b8a848216146114a65761143d611442916106ef565b614390565b611457611453610120830151151590565b1590565b6114a65761147685611470602084015163ffffffff1690565b8b614ac7565b61147f8861456e565b868615611497575061149190896152fc565b01611402565b6114a1918a614e34565b611491565b50611491565b5f8385886114b98161456e565b801584146114ed5750505f805160206157cc8339815191526114e86114dc6145f2565b6040519182918261355e565b0390a3005b6114f68161456e565b6001811484146115205750505f805160206157cc8339815191526114e861151b6145d2565b6114dc565b6115299061456e565b8214611548575f805160206157cc8339815191526114e861151b6145b0565b5f805160206157cc8339815191526114e861151b61458c565b346106745760203660031901126106745761ffff61157d610663565b165f52601560205260405f20805490610c9160018060a01b039283600184015416926115ac6002820154610689565b946115ba6003830154610689565b916115c86004820154610689565b60076115d76005840154610689565b9201549360405198899860ff8760481c169760ff8860401c169760018060401b03169663ffffffff8260a01c1691168b610bb6565b346106745760203660031901126106745761ffff611628610663565b165f52600a602052602060018060a01b0360405f205416604051908152f35b346106745760203660031901126106745761ffff611663610663565b165f526007602052602060018060a01b0360405f205416604051908152f35b34610674576040366003190112610674577ffa8dff0fd33fe41758aabbe1501d22db0a4e4cb4bee446e3842f4891410ceadc60406116be610663565b63ffffffff61ffff6116ce610a65565b926116d76148e7565b16916014548365ffffffff00008360101b169165ffffffffffff191617176014558351928352166020820152a1005b346106745760203660031901126106745761ffff611722610663565b165f526015602052602060018060a01b03600560405f20015416604051908152f35b346106745760203660031901126106745761ffff611760610663565b165f526015602052602060018060a01b03600360405f20015416604051908152f35b346106745760203660031901126106745761ffff61179e610663565b165f526008602052608060405f205460ff63ffffffff916040519260018060a01b0382168452808260a01c1660208501528160c01c16604084015260e01c1615156060820152f35b346106745760e036600319011261067457600435611803816107ca565b60243561180f816107ca565b6044359061181c826107ca565b606435611828816107ca565b608435611834816107ca565b60a43591611841836107ca565b611849610a78565b946118526148e7565b61185a613bfa565b946118636136b4565b9761186e9089613732565b5f60208901526118819060408901613732565b61188e9060608801613732565b61189b9060808701613732565b6118a89060a08601613732565b6118b59060c08501613732565b60e08301526118c8906101008301613c6c565b60016101208201525f6101408201526118e090613df7565b60405180611918816060906020815260156020820152741111519055531517d31697d0d3d3919251d7d4d155605a1b60408201520190565b035f805160206157cc8339815191525f92918392a3005b3461067457604036600319011261067457610b2a61194b610663565b61ffff6024359161195b836107ca565b6119636148e7565b165f526015602052600360405f20016135dd565b3461067457604036600319011261067457611990610663565b6024359061199d826107ca565b6119a56148e7565b61ffff918282168093815f52600160205260405f20541603610e8e57906119da610e7b9260026119d4846106dd565b016135dd565b60036119ee6119e885614a36565b926106dd565b016137d2565b34610674575f36600319011261067457602061ffff60035416604051908152f35b346106745760203660031901126106745761ffff611a31610663565b165f526015602052602060018060a01b03600260405f20015416604051908152f35b346106745760203660031901126106745761ffff611a6f610663565b165f52600d602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457611aa7610663565b61ffff60243591611ab7836107ca565b611abf6148e7565b16805f526010602052611ad58260405f206135dd565b5f805160206157ec83398151915260606040519360208552601060208601526f10da185a5b911c9859dbdb95985d5b1d60821b604086015260018060a01b031693a3005b3461067457602036600319011261067457611b32614611565b5061ffff600435165f526008602052610c9160405f2060ff60405191611b5783613610565b5460018060a01b038116835263ffffffff808260a01c1660208501528160c01c16604084015260e01c161515606082015260405191829182919091606080608083019460018060a01b038151168452602081015163ffffffff8091166020860152604082015116604085015201511515910152565b346106745760203660031901126106745761ffff611be8610663565b165f526015602052602060018060a01b03600460405f20015416604051908152f35b346106745760a036600319011261067457611c23610663565b602435611c2f816107ca565b604435611c3b816107ca565b606435611c47816107ca565b60843591611c54836107ca565b611c5c6148e7565b61ffff938486168095815f526001602052611c7d60405f2061ffff90541690565b1603611cbf5794611cba600793611caf6119d494611ca4610e7b999a60046119d4886106dd565b60056119d4866106dd565b60066119d4846106dd565b6106dd565b604051635112327760e01b815261ffff87166004820152602490fd5b34610674575f36600319011261067457602063ffffffff60095460a01c16604051908152f35b34610674575f36600319011261067457611d196148e7565b5f80546001600160a01b0319811682556001600160a01b03165f805160206157ac8339815191528280a3005b3461067457602036600319011261067457610c91610de6611d64610663565b614635565b34610674575f36600319011261067457602060405160458152f35b3461067457604036600319011261067457611d9d610663565b61ffff60243591611dad836107ca565b611db56148e7565b16805f52600f602052611dcb8260405f206135dd565b5f805160206157ec83398151915260606040519360208552600b60208601526a223930b3b7b72a37b5b2b760a91b604086015260018060a01b031693a3005b3461067457604036600319011261067457610b2a611e26610663565b61ffff60243591611e36836107ca565b611e3e6148e7565b165f526015602052600560405f20016135dd565b3461067457604036600319011261067457611e6b610663565b61ffff60243591611e7b836107ca565b611e836148e7565b16805f52600b602052611e998260405f206135dd565b5f805160206157ec83398151915260606040519360208552600c60208601526b129858dadc1bdd15985d5b1d60a21b604086015260018060a01b031693a3005b346106745760203660031901126106745760043563ffffffff8116809103610674575f526005602052602060405f2054604051908152f35b34610674576040366003190112610674577f1121620854be62ee6386fe112976b58e1f8f41bec38d8bd2f2d8438ce15c8f70604060043563ffffffff611f55610a65565b611f5d6148e7565b825f526004602052611f7181855f2061411e565b16805f52600560205281835f205582519182526020820152a1005b346106745760203660031901126106745761ffff611fa8610663565b165f526011602052602060018060a01b0360405f205416604051908152f35b34610674575f366003190112610674575f546040516001600160a01b039091168152602090f35b3461067457604036600319011261067457612007610663565b63ffffffff61ffff612017610a65565b926120206148e7565b1691825f5260156020526120378160405f20613c7b565b60046020526120498160405f2061411e565b165f52600560205260405f20555f80f35b34610674575f36600319011261067457602061ffff60145416604051908152f35b346106745760203660031901126106745761ffff612097610663565b165f526001602052602060018060a01b03600260405f20015416604051908152f35b3461067457604036600319011261067457610b2a6120d5610663565b61ffff6120e06108e6565b916120e96148e7565b165f52601e60205261210a8160405f209060ff801983541691151516179055565b6015602052600760405f2001613dda565b346106745760203660031901126106745761ffff612137610663565b165f52600b602052602060018060a01b0360405f205416604051908152f35b346106745760403660031901126106745761216f610663565b60243561217b816107ca565b6121836148e7565b6001600160a01b038116916121b49061ffff906121a18515156146e5565b1691825f52600a60205260405f206135dd565b7ff649851bca835268631c2b872d43c76f647f6b53f43f1d28ef1b966483f197d15f80a3005b34610674576040366003190112610674576004356121f7816107ca565b6121ff611372565b6122076148e7565b6001600160a01b03821661221c811515614533565b61ffff91824616935f5b6002548110156122a2578061223f61141a6001936139c5565b878782161461229c5761143d612254916106ef565b84612266611453610120840151151590565b612295578161228988612283602061228f96015163ffffffff1690565b88614ac7565b85614e34565b01612226565b505061228f565b5061228f565b5f845f805160206157cc833981519152604051806114e88160609060208152601460208201527313d0541417d0555513d7d0d3d3919251d554915160621b60408201520190565b346106745760203660031901126106745761ffff612305610663565b165f526001602052602060018060a01b03600560405f20015416604051908152f35b346106745760203660031901126106745761ffff612343610663565b165f526015602052602060018060a01b03600160405f20015416604051908152f35b3461067457604036600319011261067457610b2a612381610663565b61ffff60243591612391836107ca565b6123996148e7565b165f526015602052600160405f20016135dd565b34610674576040366003190112610674576123c6610663565b6024356001600160401b03811681036106745761ffff610b2a926123e86148e7565b165f526015602052600760405f2001613dbb565b346106745760203660031901126106745761ffff612418610663565b165f526006602052602060018060a01b038060405f20541680155f1461246557507f0000000000000000000000001a44076050125825900e736c501f859c50fe728c905b60405191168152f35b9061245c565b346106745760203660031901126106745761ffff612487610663565b165f526001602052602060018060a01b03600760405f20015416604051908152f35b34610674576040366003190112610674576124c2610663565b7fc51601f82a6c70ee2efd5de798b118e577be43137e5c717056848d0bbbe7809b602061ffff6124f0610a65565b936124f96148e7565b165f81815260088352604090819020805463ffffffff60c01b191660c087901b63ffffffff60c01b161790555163ffffffff909416845292a2005b34610674575f366003190112610674576009546040516001600160a01b039091168152602090f35b3461067457604036600319011261067457610b2a612578610663565b61ffff60243591612588836107ca565b6125906148e7565b165f526015602052600260405f20016135dd565b91908251928382525f5b8481106125ce575050825f602080949584010152601f8019910116010190565b6020818301810151848301820152016125ae565b610da790602081526125fb60208201845161ffff169052565b602083015161264361261b610140928360408601526101608501906125a4565b61262d60408701516060860190610695565b6060860151848203601f190160808601526125a4565b93612656608082015160a0850190610695565b61266860a082015160c0850190610695565b61267a60c082015160e0850190610695565b60e081015161268f6101009182860190610695565b81015190610d9e6101209283860190610695565b34610674576020366003190112610674576126bc610663565b5f6101206040516126cc81613630565b828152606060208201528260408201526060808201528260808201528260a08201528260c08201528260e082015282610100820152015261270f610957826106dd565b61ffff80831691160361273c5761273061272b610c91926106dd565b6147ca565b604051918291826125e2565b604051635112327760e01b815261ffff919091166004820152602490fd5b60209060206040818301928281528551809452019301915f5b828110612781575050505090565b835161ffff1685529381019392810192600101612773565b34610674575f3660031901126106745760408051600254808252916020820160025f52905f8051602061576c833981519152935f915b81600f8401106129f9575091839161286d93610c919654918181106129e4575b8181106129cb575b8181106129b3575b81811061299a575b818110612981575b818110612968575b81811061294f575b818110612936575b81811061291d575b818110612904575b8181106128eb575b8181106128d2575b8181106128b9575b8181106128a0575b818110612887575b10612879575b500382613682565b6040519182918261275a565b60f01c81526020015f612865565b60e083901c61ffff16845292600190602001930161285f565b60d083901c61ffff168452926001906020019301612857565b60c083901c61ffff16845292600190602001930161284f565b60b083901c61ffff168452926001906020019301612847565b60a083901c61ffff16845292600190602001930161283f565b609083901c61ffff168452926001906020019301612837565b608083901c61ffff16845292600190602001930161282f565b607083901c61ffff168452926001906020019301612827565b606083901c61ffff16845292600190602001930161281f565b605083901c61ffff168452926001906020019301612817565b604083901c61ffff16845292600190602001930161280f565b603083901c61ffff168452926001906020019301612807565b602083811c61ffff16855290936001910193016127ff565b601083901c61ffff1684529260019060200193016127f7565b61ffff831684529260019060200193016127ef565b94926001610200601092612b568754612b4b838c612b2461ffff91612a238484881661ffff169052565b612a4c6020612a3c818701868f8b901c1661ffff169052565b8488848801921c1661ffff169052565b612afc606091612a66838701868a60301c1661ffff169052565b612a7c608091868a848a01921c1661ffff169052565b612ad460a091612a96838901888c60501c1661ffff169052565b612aac60c095888c888c01921c1661ffff169052565b868a61010060e09a612ac88c8201858560701c1661ffff169052565b01921c1661ffff169052565b612aea6101208b01868a60901c1661ffff169052565b84886101408c01921c1661ffff169052565b612b126101608901848860b01c1661ffff169052565b82866101808a01921c1661ffff169052565b612b3a6101a08701828660d01c1661ffff169052565b836101c08701921c1661ffff169052565b60f01c6101e0830152565b019401920191946127cf565b346106745760203660031901126106745761ffff612b7e610663565b165f526001602052602060018060a01b03600460405f20015416604051908152f35b3461067457604036600319011261067457612bb9610663565b61ffff60243591612bc9836107ca565b612bd16148e7565b16805f52600c602052612be78260405f206135dd565b5f805160206157ec83398151915260606040519360208552600a6020860152694761735265736572766560b01b604086015260018060a01b031693a3005b346106745760203660031901126106745761ffff612c41610663565b165f526012602052602060018060a01b0360405f205416604051908152f35b3461067457604036600319011261067457612c79610663565b612c816108e6565b612c896148e7565b61ffff918281168093815f52600160205260405f20541603610e8e5781612cdf7f8a2e7bc3935fd57632299c1b85c1f2a2ca6b83577ced6c12e0516eb9d809c9d2936008612cd9610a2c956106dd565b016138a1565b60405190151581529081906020820190565b9081518082526020808093019301915f5b828110612d10575050505090565b83516001600160a01b031685529381019392810192600101612d02565b909291604082019160408152845180935260608101926020809601905f5b818110612d6857505050610da79394506020818403910152612cf1565b825163ffffffff1686529487019491870191600101612d4b565b34610674575f366003190112610674575f80600254612dae612da760145461ffff1690565b61ffff1690565b925b818110612ece5750612dca612dc483613c3a565b92613c3a565b925f905f5b838110612de55760405180610c91888883612d2d565b81612df5612da761141a846139c5565b141580612e9a575b612e0a575b600101612dcf565b91612e92600191612e4a612e35612e2b612e2661141a896139c5565b6140df565b5463ffffffff1690565b612e3f838a6148d3565b9063ffffffff169052565b612e8d612e7e612e71612e5f61141a896139c5565b61ffff165f52600b60205260405f2090565b546001600160a01b031690565b612e88838b6148d3565b613732565b614894565b929050612e02565b50612e5f612ec6612e71612ead846139c5565b90546001600160a01b0394919061ffff9160031b1c1690565b161515612dfd565b83612ede612da761141a846139c5565b141580612f07575b612ef3575b600101612db0565b91612eff600191614894565b929050612eeb565b50612e5f612f1a612e71612ead846139c5565b161515612ee6565b3461067457608036600319011261067457600435612f3f816107ca565b612f47610678565b90612f50611388565b612f586148e7565b6001600160a01b0382169261ffff90612f72851515614533565b165f526015602052612f8660405f20614390565b916101208301511561301557612fc3612fcd9284602063ffffffff960193612fbe604435612fb8875163ffffffff1690565b83614ac7565b614e34565b5163ffffffff1690565b16905f805160206157cc833981519152604051806114e88160609060208152601560208201527413d0541417d0d210525397d0d3d3919251d5549151605a1b60408201520190565b60405162461bcd60e51b815260206004820152601b60248201527a14995b5bdd194818da185a5b881b9bdd0818dbdb999a59dd5c9959602a1b6044820152606490fd5b346106745760203660031901126106745761ffff613074610663565b61307c614611565b50165f526008602052610c9160405f2060ff60405191611b5783613610565b34610674576040366003190112610674576130b4610663565b6024356130c0816107ca565b6130c86148e7565b6001600160a01b038116916130f99061ffff906130e68515156146e5565b1691825f52600760205260405f206135dd565b600860205260405f908120805460ff60e01b1916600160e01b1790557f2266a81f17c96c32ee098cae5157f8e48746474f861ecc33e0e9c477bc7d35d19080a3005b346106745761314936610df2565b906131526148e7565b61ffff928381168094815f52600160205260405f205416036131cd5791816131a8827f3b2cda9d4495d453fa37b754e82b0cb1f85969b6109ff9f7f115456dcdb81c009460036131a289986106dd565b01614477565b6131b760405192839283613a3e565b0390a25f8051602061578c8339815191525f80a2005b604051635112327760e01b815260048101859052602490fd5b34610674576040366003190112610674576131ff610663565b6024359061320c826107ca565b6132146148e7565b6001600160a01b03821690811561326b577f8efcbf71ab784f8ebb6bf61d2ae0526705fc7fb1c1ce8b4320688b03c21850149161326261ffff6020931694855f526006845260405f206135dd565b604051908152a2005b60405163d92e233d60e01b8152600490fd5b34610674576020366003190112610674576004355f526004602052602063ffffffff60405f205416604051908152f35b34610674576040366003190112610674576004356132ca816107ca565b7f36d1fadd15d1022f48d4477c2f58748713a8c2648a96be06b5852e2a7bb9b091610a2c6132f6610a65565b6132fe6148e7565b6001600160a01b03841693613385906133188615156146e5565b6009805463ffffffff60a01b1988166001600160c01b03199091161760a085901b63ffffffff60a01b1617905560925f526007602052613378817f6158b6df9f3d7178cf0df15ead8155214868eab5a79e7108878471a4bfa6c65c6135dd565b6133806140f1565b6135dd565b613396816133916140f1565b613c7b565b6133b46133a16140f1565b805460ff60e01b1916600160e01b179055565b60405163ffffffff90911681529081906020820190565b346106745760203660031901126106745761ffff6133e7610663565b165f526010602052602060018060a01b0360405f205416604051908152f35b34610674575f36600319011261067457602061ffff806014541690461614604051908152f35b346106745760203660031901126106745761ffff613448610663565b165f526006602052602060018060a01b0360405f205416604051908152f35b3461067457602036600319011261067457600435613484816107ca565b61348c6148e7565b6001600160a01b039081169081156134c2575f548260018060a01b03198216175f55165f805160206157ac8339815191525f80a3005b604051631e4fbdf760e01b81525f6004820152602490fd5b34610674576040366003190112610674576134f3610663565b61ffff60243591613503836107ca565b61350b6148e7565b16805f5260136020526135218260405f206135dd565b5f805160206157ec833981519152606060405193602085526009602086015268262826b0b730b3b2b960b91b604086015260018060a01b031693a3005b906020610da79281815201906125a4565b346106745760203660031901126106745761ffff61358b610663565b165f526001602052610c916135a5600360405f200161472a565b6040519182916020835260208301906125a4565b34610674575f366003190112610674576135d1614187565b50610c91610de6614299565b80546001600160a01b0319166001600160a01b03909216919091179055565b634e487b7160e01b5f52604160045260245ffd5b608081019081106001600160401b0382111761362b57604052565b6135fc565b61014081019081106001600160401b0382111761362b57604052565b606081019081106001600160401b0382111761362b57604052565b604081019081106001600160401b0382111761362b57604052565b601f909101601f19168101906001600160401b0382119082101761362b57604052565b604051906136b282613630565b565b6040519061016082016001600160401b0381118382101761362b57604052565b604051906136b28261364c565b6001600160401b03811161362b57601f01601f191660200190565b929192613708826136e1565b916137166040519384613682565b829481845281830111610674578281602093845f960137010152565b6001600160a01b039091169052565b90600182811c9216801561376f575b602083101461375b57565b634e487b7160e01b5f52602260045260245ffd5b91607f1691613750565b818110613784575050565b5f8155600101613779565b9190601f811161379e57505050565b6136b2925f5260205f20906020601f840160051c830193106137c8575b601f0160051c0190613779565b90915081906137bb565b81519192916001600160401b03811161362b576137f9816137f38454613741565b8461378f565b602080601f831160011461383a5750819061382b9394955f9261382f575b50508160011b915f199060031b1c19161790565b9055565b015190505f80613817565b90601f1983169561384e855f5260205f2090565b925f905b88821061388957505083600195969710613871575b505050811b019055565b01515f1960f88460031b161c191690555f8080613867565b80600185968294968601518155019501930190613852565b805460ff60a01b191691151560a01b60ff60a01b16919091179055565b906139ab61012060086136b2946138ec6138da865161ffff1690565b825461ffff191661ffff909116178255565b6138fd6020860151600183016137d2565b61391661390d6040870151610689565b600283016135dd565b6139276060860151600383016137d2565b6139406139376080870151610689565b600483016135dd565b61395961395060a0870151610689565b600583016135dd565b61397261396960c0870151610689565b600683016135dd565b61398b61398260e0870151610689565b600783016135dd565b01926139a461399e610100830151610689565b856135dd565b0151151590565b906138a1565b634e487b7160e01b5f52603260045260245ffd5b906002548210156139f25760025f52600482901c5f8051602061576c833981519152019160011b601e1690565b6139b1565b60025490600160401b82101561362b5760018201806002558210156139f25760025f5260205f208260041c019161ffff8060f085549360041b169316831b921b1916179055565b90918060409360208452816020850152848401375f828201840152601f01601f1916010190565b96919897939294959095613a776148e7565b613a7f613bfa565b93613a886136b4565b96613a938989613732565b63ffffffff8c166020890152613aac9060408901613732565b613ab99060608801613732565b613ac69060808701613732565b613ad39060a08601613732565b613ae09060c08501613732565b60e0830152613af3906101008301613c6c565b6001610120820152831515610140820152613b0d836106ef565b90613b1791613fe4565b82613b2e8361ffff165f52601e60205260405f2090565b90613b44919060ff801983541691151516179055565b613b4d82610701565b90613b57916135dd565b82613b61826140df565b90613b6b9161411e565b61ffff16613b878363ffffffff165f52600560205260405f2090565b5515613bc1575f5f805160206157cc83398151915263ffffffff613ba961415c565b935b613bbc60405192839216958261355e565b0390a3565b5f5f805160206157cc83398151915263ffffffff613bdd614133565b93613bab565b6001600160401b03811161362b5760051b60200190565b604051602081016001600160401b0381118282101761362b576040525f8152905f368137565b60405190613c2d82613667565b6001825260203681840137565b90613c4482613be3565b613c516040519182613682565b8281528092613c62601f1991613be3565b0190602036910137565b6001600160401b039091169052565b805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b90600160401b811161362b57815490808355818110613cbc57505050565b6136b2925f5260205f209182019101613779565b8051906001600160401b03821161362b57600160401b821161362b57601c5482601c55808310613d41575b50601c5f9081526020918201915f8051602061574c833981519152915b848110613d26575050505050565b83516001600160a01b03168382015592810192600101613d18565b601c5f52613d62905f8051602061574c833981519152908101908401613779565b5f613cfb565b8151916001600160401b03831161362b57613d838383613c9e565b6020809101915f5260205f20905f5b848110613da0575050505050565b83516001600160a01b03168382015592810192600101613d92565b80546001600160401b0319166001600160401b03909216919091179055565b805460ff60481b191691151560481b60ff60481b16919091179055565b613fc56101406136b292613e30613e0e8251610689565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b613e69613e44602083015163ffffffff1690565b6016805463ffffffff60a01b191660a09290921b63ffffffff60a01b16919091179055565b613e9b613e796040830151610689565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b613ecd613eab6060830151610689565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b613eff613edd6080830151610689565b601980546001600160a01b0319166001600160a01b0392909216919091179055565b613f31613f0f60a0830151610689565b601a80546001600160a01b0319166001600160a01b0392909216919091179055565b613f63613f4160c0830151610689565b601b80546001600160a01b0319166001600160a01b0392909216919091179055565b613f7060e0820151613cd0565b610100810151601d80546001600160401b0319166001600160401b039092169190911790556139a4613fa6610120830151151590565b601d805460ff60401b191691151560401b60ff60401b16919091179055565b601d805460ff60481b191691151560481b60ff60481b16919091179055565b906140d961014060076136b294614004613ffe8651610689565b826135dd565b61401e614018602087015163ffffffff1690565b82613c7b565b61403761402e6040870151610689565b600183016135dd565b61404761390d6060870151610689565b6140606140576080870151610689565b600383016135dd565b61407061393760a0870151610689565b61408061395060c0870151610689565b61409160e086015160068301613d68565b610100850151910193906140ae906001600160401b031685613dbb565b6139a46140bf610120830151151590565b855460ff60401b191690151560401b60ff60401b16178555565b90613dda565b61ffff165f52600460205260405f2090565b60925f5260086020527f0849f82a83851433a6d01f34de538eb67ba2a2b05e2943072947611bbb9c845690565b9063ffffffff1663ffffffff19825416179055565b6040519061414082613667565b600d82526c131697d0d3d3919251d7d4d155609a1b6020830152565b6040519061416982613667565b600f82526e10d554d513d357d3d0541417d4d155608a1b6020830152565b6040519061016082016001600160401b0381118382101761362b576040525f610140838281528260208201528260408201528260608201528260808201528260a08201528260c0820152606060e082015282610100820152826101208201520152565b60405190601c54808352826020916020820190601c5f5260205f20935f905b82821061421f575050506136b292500383613682565b85546001600160a01b031684526001958601958895509381019390910190614209565b90604051918281549182825260209260208301915f5260205f20935f905b828210614276575050506136b292500383613682565b85546001600160a01b031684526001958601958895509381019390910190614260565b6142a16136b4565b906142d263ffffffff6016546142bf60018060a01b03821686613732565b60a01c16602084019063ffffffff169052565b6142e96142e0601754610689565b60408401613732565b6143006142f7601854610689565b60608401613732565b61431761430e601954610689565b60808401613732565b61432e614325601a54610689565b60a08401613732565b61434561433c601b54610689565b60c08401613732565b61434d6141ea565b60e0830152601d546136b29060ff906143736001600160401b0382166101008701613c6c565b604081901c8216151561012086015260481c161515610140840152565b906136b260ff60076143a06136b4565b946143d063ffffffff82546143bd60018060a01b0382168a613732565b60a01c16602088019063ffffffff169052565b6143e96143e06001830154610689565b60408801613732565b6144026143f96002830154610689565b60608801613732565b61441b6144126003830154610689565b60808801613732565b61443461442b6004830154610689565b60a08801613732565b61444d6144446005830154610689565b60c08801613732565b61445960068201614242565b60e087015201546143736001600160401b0382166101008701613c6c565b9092916001600160401b03811161362b57614496816137f38454613741565b5f601f82116001146144cf57819061382b9394955f926144c45750508160011b915f199060031b1c19161790565b013590505f80613817565b601f198216946144e2845f5260205f2090565b915f5b87811061451b57508360019596971061450257505050811b019055565b01355f19600384901b60f8161c191690555f8080613867565b909260206001819286860135815501940191016144e5565b1561453a57565b60405162461bcd60e51b815260206004820152600c60248201526b0496e76616c6964204f4170760a41b6044820152606490fd5b6004111561457857565b634e487b7160e01b5f52602160045260245ffd5b6040519061459982613667565b600882526721a7a6a827a9a2a960c11b6020830152565b604051906145bd82613667565b600682526513169491505160d21b6020830152565b604051906145df82613667565b600482526304f4150560e41b6020830152565b604051906145ff82613667565b600382526213d19560ea1b6020830152565b6040519061461e82613610565b5f6060838281528260208201528260408201520152565b61463d614187565b5061464a61143d826106ef565b610140810151158015906146d7575b6146d25750614666614299565b9063ffffffff614675826140df565b541660208301526001600160a01b039081908161469182610701565b5416156146aa576146a190610701565b54165b16815290565b50507f0000000000000000000000001a44076050125825900e736c501f859c50fe728c6146a4565b905090565b506101208101511515614659565b156146ec57565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c6964206f7261636c65206164647265737360501b6044820152606490fd5b9060405191825f825461473c81613741565b908184526020946001916001811690815f146147a8575060011461476a575b5050506136b292500383613682565b5f90815285812095935091905b8183106147905750506136b293508201015f808061475b565b85548884018501529485019487945091830191614777565b925050506136b294925060ff191682840152151560051b8201015f808061475b565b906136b260ff60086147da6136a5565b946147f26147ea825461ffff1690565b61ffff168752565b6147fe6001820161472a565b60208701526148136143e06002830154610689565b61481f6003820161472a565b60608701526148346144126004830154610689565b61484461442b6005830154610689565b6148546144446006830154610689565b61486d6148646007830154610689565b60e08801613732565b01546148866001600160a01b0382166101008701613732565b60a01c161515610120840152565b5f1981146148a25760010190565b634e487b7160e01b5f52601160045260245ffd5b8051156139f25760200190565b8051600110156139f25760400190565b80518210156139f25760209160051b010190565b5f546001600160a01b031633036148fa57565b60405163118cdaa760e01b8152336004820152602490fd5b6040519061491f82613667565b6002825261575360f01b6020830152565b6040519061493d82613667565b60058252640ae82ac82b60db1b6020830152565b6040519061495e82613667565b60048252635746544d60e01b6020830152565b6040519061497e82613667565b6006825265574d4154494360d01b6020830152565b604051906149a082613667565b60048252632ba1272160e11b6020830152565b604051906149c082613667565b60048252635754414360e01b6020830152565b604051906149e082613667565b6005825264574859504560d81b6020830152565b60405190614a0182613667565b600682526515d353d3905160d21b6020830152565b60405190614a2382613667565b60048252630ae8aa8960e31b6020830152565b60928114614abe5761a86a8114614ab55760fa8114614aac5760898114614aa35760388114614a9a5760ef8114614a91576103e78114614a88576176b614614a8057610da7614a16565b610da76149f4565b50610da76149d3565b50610da76149b3565b50610da7614993565b50610da7614971565b50610da7614951565b50610da7614930565b50610da7614912565b906136b29263ffffffff60405192633400288b60e01b6020850152166024830152604482015260448152614afa81613610565b60405191614b0783613667565b600c83526b1cd95d1419595c8819985a5b60a21b60208401526154ce565b15614b2c57565b60405162461bcd60e51b815260206004820152601a602482015279131bd8d85b0818da185a5b881b9bdd0818dbdb999a59dd5c995960321b6044820152606490fd5b15614b7557565b60405162461bcd60e51b8152602060048201526011602482015270139bc81b1bd8d85b08195b991c1bda5b9d607a1b6044820152606490fd5b6001600160a01b03918216815263ffffffff9092166020830152909116604082015260600190565b60405190614be382613667565b60138252721cd95d14d95b99131a589c985c9e4819985a5b606a1b6020830152565b60405190614c1282613667565b60168252751cd95d149958d95a5d99531a589c985c9e4819985a5b60521b6020830152565b60409060405191614c4783613667565b6001835282915f5b602080821015614c8157835160209291614c688261364c565b5f82525f81830152606086830152828801015201614c4f565b505091925050565b9190606091606084019160018060a01b0380911685526020911681850152604092606060408601528551809352608085018260808560051b8801019701945f925b858410614cdc57505050505050505090565b9091929394959698978580614d1e6001938d607f1990820301885285878d5163ffffffff808251168552868201511686850152015191818982015201906125a4565b9a9b99019796959190910193019190614cca565b60405190614d3f82613667565b60168252751cd95d115e1958dd5d1bdc90dbdb999a59c819985a5b60521b6020830152565b91614d9c90610da7949260018060401b03168452600160208501525f60408501525f606085015260c0608085015260c0840190612cf1565b9160a0818403910152612cf1565b9091614d9c610da79360018452600160208501525f60408501525f606085015260c0608085015260c0840190612cf1565b60405190614de882613667565b600f82526e1cd95d14d95b991553138819985a5b608a1b6020830152565b60405190614e1382613667565b60128252711cd95d149958d95a5d995553138819985a5b60721b6020830152565b614f2b60206136b29493614e4e61143d61ffff46166106ef565b614e64614e5f610120830151151590565b614b25565b614e6e8151610689565b6001600160a01b0391614e848284161515614b6e565b6040908482820191614e968351610689565b86811661528a575b506060810195614eae8751610689565b818116615207575b50614ec46080830151610689565b9081161515806151f2575b615135575b5060a081018a614eec614ee78351610689565b610689565b151580615120575b615042575b50505060a091500190614f0f614ee78351610689565b15158061502d575b614f31575b50505050015163ffffffff1690565b90615602565b6150249361501691614f57614f4e614f47613c20565b9551610689565b612e88866148b6565b61010087015161500a90614fef906001600160401b0316614f86614f79613bfa565b85519889938e8501614d64565b0393614f9a601f1995868101895288613682565b614fa2614c37565b96614fb38c8c015163ffffffff1690565b90614fcb614fbf6136d4565b63ffffffff9093168352565b6002828e015285820152614fde886148b6565b52614fe8876148b6565b5051610689565b91516306dbd9f960e41b8a8201529485928c60248501614c89565b03908101835282613682565b61501e614e06565b916154ce565b5f808080614f1c565b5061503b614ee78551610689565b1515614f17565b61500a6150ec615116966150826101006151079761507461506b615064613c20565b9951610689565b612e888a6148b6565b01516001600160401b031690565b61509b61508d613bfa565b8b5197889360208501614d64565b03946150af601f1996878101835282613682565b6150c78e6150bb614c37565b99015163ffffffff1690565b906150d3614fbf6136d4565b6150df8f830160029052565b8a820152614fde886148b6565b9487519586936306dbd9f960e41b8e86015260248501614c89565b61510f614ddb565b90846154ce565b5f8481808a614ef9565b5061512e614ee78651610689565b1515614ef4565b84516127108a82019081526001600160a01b0390921660208301526151ec916151dd90829060400103615170601f1991828101855284613682565b615178614c37565b926151898d88015163ffffffff1690565b90615195614fbf6136d4565b6001828f0152898201526151a8846148b6565b526151b2836148b6565b508d61500a6151c18951610689565b948a519586936306dbd9f960e41b602086015260248501614c89565b6151e5614d32565b90876154ce565b5f614ed4565b50615200614ee78551610689565b1515614ecf565b615284906152758d6152676152228e89015163ffffffff1690565b8a51636a14d71560e01b60208201526001600160a01b03938416602482015263ffffffff90911660448201529190931660648201525f608482015291829060a4820190565b03601f198101835282613682565b61527d614c05565b90886154ce565b5f614eb6565b6152c9906152c18c6152676152a58d88015163ffffffff1690565b9389519485936309535ff360e41b602086015260248501614bae565b6151e5614bd6565b5f614e9e565b604051906152dc82613667565b60118252701cd95d131e949958591553138819985a5b607a1b6020830152565b9061530d61143d61ffff46166106ef565b9061531f614e5f610120840151151590565b6153298251610689565b916001600160a01b03906153408285161515614b6e565b61534d60c0820151610689565b9082821615615486575b604001916153658351610689565b818116615448575b508116151580615433575b615384575b5050505050565b6154299461500a615404615421946153a761539d613c20565b95612e88876148b6565b6153af613bfa565b946153c260405196879260208401614daa565b03946153d6601f1996878101835282613682565b6153e360206150bb614c37565b906153ef614fbf6136d4565b600260208301526040820152614fde886148b6565b946040519586936306dbd9f960e41b602086015260248501614c89565b61501e6152cf565b5f8080808061537d565b50615441614ee78351610689565b1515615378565b615480906152c1615460602088015163ffffffff1690565b6152676040519384926309535ff360e41b60208501528c60248501614bae565b5f61536d565b9050604061549760a0830151610689565b919050615357565b3d156154c9573d906154b0826136e1565b916154be6040519384613682565b82523d5f602084013e565b606090565b5f91829182602083519301915af1906154e561549f565b91156154ef575050565b8151156154ff5750602081519101fd5b60405162461bcd60e51b815260206004820152908190610a619060248301906125a4565b60609063ffffffff610da794931681526001602082015281604082015201906125a4565b60609063ffffffff610da794931681526002602082015281604082015201906125a4565b6040906040519161557b8361364c565b60028352825f5b82811061558e57505050565b806060602080938501015201615582565b6020808201906020835283518092526040830192602060408460051b8301019501935f915b8483106155d45750505050505090565b90919293949584806155f2600193603f198682030187528a516125a4565b98019301930191949392906155c4565b604051600360f01b6020820152600160f81b60228201819052601160f01b6023830152602582015260809390931b6001600160801b0319166026840152601683529091601f199190615655603682613682565b6156986040519461567a8661566e858460208401615523565b03868101885287613682565b61568c60405193849260208401615547565b03848101835282613682565b6156a061556b565b936156aa856148b6565b526156b4846148b6565b506156be846148c3565b526156c8836148c3565b505f806040516020810190630b98bd0760e41b82526156fa816156ee896024830161559f565b03878101835282613682565b519082855af161570861549f565b501561571357505050565b5f9283809361573b604051918261500a6020820196630502603d60e11b88526024830161559f565b51925af15061574861549f565b5056fe0e4562a10381dec21b205ed72637e6b1b523bdd0e4d4d50af5cd23dd4500a211405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acee8242d0dc51110feb37170760dbf7f8f2f68ca3b7e0c076130099f0376e01df28be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e079e9965c0300757dfcd8b13acb16fd53a18e322fd9aa016353434bd82b375ddffc8d34b6ceb5f56f2100abe2e4df9f55de23da794df4d3eccc026037655afd84a264697066735822122076cc5b48fba7255937535d5a3f63263301e17e6a8a22a9b5afe4610451cfcf8064736f6c63430008180033

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

000000000000000000000000b05cf01231cf2ff99499682e64d3780d57c80fdd

-----Decoded View---------------
Arg [0] : _initialOwner (address): 0xB05Cf01231cF2fF99499682E64D3780d57c80FdD

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b05cf01231cf2ff99499682e64d3780d57c80fdd


Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ 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.