Overview
AVAX Balance
0 AVAX
AVAX Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 42 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xbe9d40ac | 31094651 | 589 days ago | IN | 0.1 AVAX | 0.0006001 | ||||
Swap | 30514375 | 603 days ago | IN | 0.02747444 AVAX | 0.00074633 | ||||
Swap | 30009051 | 615 days ago | IN | 0.1072814 AVAX | 0.00076541 | ||||
Transfer Ownersh... | 12573309 | 1030 days ago | IN | 0 AVAX | 0.00135203 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Gas Amount | 12378047 | 1034 days ago | IN | 0 AVAX | 0.00094379 | ||||
Set Bridge | 12219069 | 1038 days ago | IN | 0 AVAX | 0.00245786 | ||||
Set Gas Amount | 12219063 | 1038 days ago | IN | 0 AVAX | 0.00244549 | ||||
Set Gas Amount | 12219037 | 1038 days ago | IN | 0 AVAX | 0.00249368 | ||||
Set Gas Amount | 12219032 | 1038 days ago | IN | 0 AVAX | 0.00245014 | ||||
Set Gas Amount | 12218999 | 1038 days ago | IN | 0 AVAX | 0.00237233 | ||||
Set Bridge | 12218990 | 1038 days ago | IN | 0 AVAX | 0.00246322 | ||||
Set Gas Amount | 12218673 | 1038 days ago | IN | 0 AVAX | 0.00244587 | ||||
Set Gas Amount | 12218645 | 1038 days ago | IN | 0 AVAX | 0.0024903 | ||||
Set Gas Amount | 12218642 | 1038 days ago | IN | 0 AVAX | 0.00250302 | ||||
Set Gas Amount | 12218639 | 1038 days ago | IN | 0 AVAX | 0.00254323 | ||||
Set Bridge | 12218620 | 1038 days ago | IN | 0 AVAX | 0.00254152 | ||||
Set Gas Amount | 12218597 | 1038 days ago | IN | 0 AVAX | 0.00253452 | ||||
Set Gas Amount | 12218564 | 1038 days ago | IN | 0 AVAX | 0.00254663 | ||||
Set Bridge | 12218540 | 1038 days ago | IN | 0 AVAX | 0.00162061 | ||||
Set Bridge | 12218540 | 1038 days ago | IN | 0 AVAX | 0.00254005 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
56010389 | 3 mins ago | 0.01454986 AVAX | ||||
56010389 | 3 mins ago | 0.01454986 AVAX | ||||
56009234 | 39 mins ago | 0.00358492 AVAX | ||||
56009234 | 39 mins ago | 0.00358492 AVAX | ||||
56007836 | 1 hr ago | 0.00803556 AVAX | ||||
56007836 | 1 hr ago | 0.00803556 AVAX | ||||
56006477 | 2 hrs ago | 0.01454986 AVAX | ||||
56006477 | 2 hrs ago | 0.01454986 AVAX | ||||
56006462 | 2 hrs ago | 0.01454986 AVAX | ||||
56006462 | 2 hrs ago | 0.01454986 AVAX | ||||
56006361 | 2 hrs ago | 0.00484664 AVAX | ||||
56006361 | 2 hrs ago | 0.00484664 AVAX | ||||
56006271 | 2 hrs ago | 0.01454986 AVAX | ||||
56006271 | 2 hrs ago | 0.01454986 AVAX | ||||
56005696 | 2 hrs ago | 0.01454986 AVAX | ||||
56005696 | 2 hrs ago | 0.01454986 AVAX | ||||
56005487 | 2 hrs ago | 0.42150701 AVAX | ||||
56005487 | 2 hrs ago | 0.42150701 AVAX | ||||
56004624 | 3 hrs ago | 0.01454986 AVAX | ||||
56004624 | 3 hrs ago | 0.01454986 AVAX | ||||
56004460 | 3 hrs ago | 0.01163727 AVAX | ||||
56004460 | 3 hrs ago | 0.01163727 AVAX | ||||
56004148 | 3 hrs ago | 0.01454986 AVAX | ||||
56004148 | 3 hrs ago | 0.01454986 AVAX | ||||
56003555 | 3 hrs ago | 0.00512515 AVAX |
Loading...
Loading
Contract Name:
Bridge
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./Pool.sol"; import "./Router.sol"; // interfaces import "./ILayerZeroReceiver.sol"; import "./ILayerZeroEndpoint.sol"; import "./ILayerZeroUserApplicationConfig.sol"; // libraries import "./SafeMath.sol"; contract Bridge is Ownable, ILayerZeroReceiver, ILayerZeroUserApplicationConfig { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS uint8 internal constant TYPE_SWAP_REMOTE = 1; uint8 internal constant TYPE_ADD_LIQUIDITY = 2; uint8 internal constant TYPE_REDEEM_LOCAL_CALL_BACK = 3; uint8 internal constant TYPE_WITHDRAW_REMOTE = 4; //--------------------------------------------------------------------------- // VARIABLES ILayerZeroEndpoint public immutable layerZeroEndpoint; mapping(uint16 => bytes) public bridgeLookup; mapping(uint16 => mapping(uint8 => uint256)) public gasLookup; Router public immutable router; bool public useLayerZeroToken; //--------------------------------------------------------------------------- // EVENTS event SendMsg(uint8 msgType, uint64 nonce); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == address(router), "Stargate: caller must be Router."); _; } constructor(address _layerZeroEndpoint, address _router) { require(_layerZeroEndpoint != address(0x0), "Stargate: _layerZeroEndpoint cannot be 0x0"); require(_router != address(0x0), "Stargate: _router cannot be 0x0"); layerZeroEndpoint = ILayerZeroEndpoint(_layerZeroEndpoint); router = Router(_router); } //--------------------------------------------------------------------------- // EXTERNAL functions function lzReceive( uint16 _srcChainId, bytes memory _srcAddress, uint64 _nonce, bytes memory _payload ) external override { require(msg.sender == address(layerZeroEndpoint), "Stargate: only LayerZero endpoint can call lzReceive"); require( _srcAddress.length == bridgeLookup[_srcChainId].length && keccak256(_srcAddress) == keccak256(bridgeLookup[_srcChainId]), "Stargate: bridge does not match" ); uint8 functionType; assembly { functionType := mload(add(_payload, 32)) } if (functionType == TYPE_SWAP_REMOTE) { ( , uint256 srcPoolId, uint256 dstPoolId, uint256 dstGasForCall, Pool.CreditObj memory c, Pool.SwapObj memory s, bytes memory to, bytes memory payload ) = abi.decode(_payload, (uint8, uint256, uint256, uint256, Pool.CreditObj, Pool.SwapObj, bytes, bytes)); address toAddress; assembly { toAddress := mload(add(to, 20)) } router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, toAddress, s, payload); } else if (functionType == TYPE_ADD_LIQUIDITY) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c) = abi.decode(_payload, (uint8, uint256, uint256, Pool.CreditObj)); router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); } else if (functionType == TYPE_REDEEM_LOCAL_CALL_BACK) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi .decode(_payload, (uint8, uint256, uint256, Pool.CreditObj, uint256, uint256, bytes)); address toAddress; assembly { toAddress := mload(add(to, 20)) } router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, toAddress, amountSD, mintAmountSD); } else if (functionType == TYPE_WITHDRAW_REMOTE) { (, uint256 srcPoolId, uint256 dstPoolId, Pool.CreditObj memory c, uint256 amountSD, bytes memory to) = abi.decode( _payload, (uint8, uint256, uint256, Pool.CreditObj, uint256, bytes) ); router.creditChainPath(_srcChainId, srcPoolId, dstPoolId, c); router.redeemLocalCheckOnRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, amountSD, to); } } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function swap( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c, Pool.SwapObj memory _s, IStargateRouter.lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_SWAP_REMOTE, _srcPoolId, _dstPoolId, _lzTxParams.dstGasForCall, _c, _s, _to, _payload); _call(_chainId, TYPE_SWAP_REMOTE, _refundAddress, _lzTxParams, payload); } function redeemLocalCallback( uint16 _chainId, address payable _refundAddress, Pool.CreditObj memory _c, IStargateRouter.lzTxObj memory _lzTxParams, bytes memory _payload ) external payable onlyRouter { bytes memory payload; { (, uint256 srcPoolId, uint256 dstPoolId, uint256 amountSD, uint256 mintAmountSD, bytes memory to) = abi.decode( _payload, (uint8, uint256, uint256, uint256, uint256, bytes) ); // swap dst and src because we are headed back payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, dstPoolId, srcPoolId, _c, amountSD, mintAmountSD, to); } _call(_chainId, TYPE_REDEEM_LOCAL_CALL_BACK, _refundAddress, _lzTxParams, payload); } function redeemLocal( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c, uint256 _amountSD, bytes calldata _to, IStargateRouter.lzTxObj memory _lzTxParams ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_WITHDRAW_REMOTE, _srcPoolId, _dstPoolId, _c, _amountSD, _to); _call(_chainId, TYPE_WITHDRAW_REMOTE, _refundAddress, _lzTxParams, payload); } function sendCredits( uint16 _chainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, Pool.CreditObj memory _c ) external payable onlyRouter { bytes memory payload = abi.encode(TYPE_ADD_LIQUIDITY, _srcPoolId, _dstPoolId, _c); IStargateRouter.lzTxObj memory lzTxObj = IStargateRouter.lzTxObj(0, 0, "0x"); _call(_chainId, TYPE_ADD_LIQUIDITY, _refundAddress, lzTxObj, payload); } function quoteLayerZeroFee( uint16 _chainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, IStargateRouter.lzTxObj memory _lzTxParams ) external view returns (uint256, uint256) { bytes memory payload = ""; Pool.CreditObj memory c = Pool.CreditObj(1, 1); if (_functionType == TYPE_SWAP_REMOTE) { Pool.SwapObj memory s = Pool.SwapObj(1, 1, 1, 1, 1, 1); payload = abi.encode(TYPE_SWAP_REMOTE, 0, 0, 0, c, s, _toAddress, _transferAndCallPayload); } else if (_functionType == TYPE_ADD_LIQUIDITY) { payload = abi.encode(TYPE_ADD_LIQUIDITY, 0, 0, c); } else if (_functionType == TYPE_REDEEM_LOCAL_CALL_BACK) { payload = abi.encode(TYPE_REDEEM_LOCAL_CALL_BACK, 0, 0, c, 0, 0, _toAddress); } else if (_functionType == TYPE_WITHDRAW_REMOTE) { payload = abi.encode(TYPE_WITHDRAW_REMOTE, 0, 0, c, 0, _toAddress); } else { revert("Stargate: unsupported function type"); } bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _functionType, _lzTxParams); return layerZeroEndpoint.estimateFees(_chainId, address(this), payload, useLayerZeroToken, lzTxParamBuilt); } //--------------------------------------------------------------------------- // dao functions function setBridge(uint16 _chainId, bytes calldata _bridgeAddress) external onlyOwner { require(bridgeLookup[_chainId].length == 0, "Stargate: Bridge already set!"); bridgeLookup[_chainId] = _bridgeAddress; } function setGasAmount( uint16 _chainId, uint8 _functionType, uint256 _gasAmount ) external onlyOwner { require(_functionType >= 1 && _functionType <= 4, "Stargate: invalid _functionType"); gasLookup[_chainId][_functionType] = _gasAmount; } function approveTokenSpender( address token, address spender, uint256 amount ) external onlyOwner { IERC20(token).approve(spender, amount); } function setUseLayerZeroToken(bool enable) external onlyOwner { useLayerZeroToken = enable; } function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external override onlyOwner { layerZeroEndpoint.forceResumeReceive(_srcChainId, _srcAddress); } //--------------------------------------------------------------------------- // generic config for user Application function setConfig( uint16 _version, uint16 _chainId, uint256 _configType, bytes calldata _config ) external override onlyOwner { layerZeroEndpoint.setConfig(_version, _chainId, _configType, _config); } function setSendVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setSendVersion(version); } function setReceiveVersion(uint16 version) external override onlyOwner { layerZeroEndpoint.setReceiveVersion(version); } //--------------------------------------------------------------------------- // INTERNAL functions function txParamBuilderType1(uint256 _gasAmount) internal pure returns (bytes memory) { uint16 txType = 1; return abi.encodePacked(txType, _gasAmount); } function txParamBuilderType2( uint256 _gasAmount, uint256 _dstNativeAmount, bytes memory _dstNativeAddr ) internal pure returns (bytes memory) { uint16 txType = 2; return abi.encodePacked(txType, _gasAmount, _dstNativeAmount, _dstNativeAddr); } function _txParamBuilder( uint16 _chainId, uint8 _type, IStargateRouter.lzTxObj memory _lzTxParams ) internal view returns (bytes memory) { bytes memory lzTxParam; address dstNativeAddr; { bytes memory dstNativeAddrBytes = _lzTxParams.dstNativeAddr; assembly { dstNativeAddr := mload(add(dstNativeAddrBytes, 20)) } } uint256 totalGas = gasLookup[_chainId][_type].add(_lzTxParams.dstGasForCall); if (_lzTxParams.dstNativeAmount > 0 && dstNativeAddr != address(0x0)) { lzTxParam = txParamBuilderType2(totalGas, _lzTxParams.dstNativeAmount, _lzTxParams.dstNativeAddr); } else { lzTxParam = txParamBuilderType1(totalGas); } return lzTxParam; } function _call( uint16 _chainId, uint8 _type, address payable _refundAddress, IStargateRouter.lzTxObj memory _lzTxParams, bytes memory _payload ) internal { bytes memory lzTxParamBuilt = _txParamBuilder(_chainId, _type, _lzTxParams); uint64 nextNonce = layerZeroEndpoint.getOutboundNonce(_chainId, address(this)) + 1; layerZeroEndpoint.send{value: msg.value}(_chainId, bridgeLookup[_chainId], _payload, _refundAddress, address(this), lzTxParamBuilt); emit SendMsg(_type, nextNonce); } function renounceOwnership() public override onlyOwner {} }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; import "./SafeMath.sol"; import "./Ownable.sol"; import "./Pool.sol"; contract Factory is Ownable { using SafeMath for uint256; //--------------------------------------------------------------------------- // VARIABLES mapping(uint256 => Pool) public getPool; // poolId -> PoolInfo address[] public allPools; address public immutable router; address public defaultFeeLibrary; // address for retrieving fee params for swaps //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == router, "Stargate: caller must be Router."); _; } constructor(address _router) { require(_router != address(0x0), "Stargate: _router cant be 0x0"); // 1 time only router = _router; } function setDefaultFeeLibrary(address _defaultFeeLibrary) external onlyOwner { require(_defaultFeeLibrary != address(0x0), "Stargate: fee library cant be 0x0"); defaultFeeLibrary = _defaultFeeLibrary; } function allPoolsLength() external view returns (uint256) { return allPools.length; } function createPool( uint256 _poolId, address _token, uint8 _sharedDecimals, uint8 _localDecimals, string memory _name, string memory _symbol ) public onlyRouter returns (address poolAddress) { require(address(getPool[_poolId]) == address(0x0), "Stargate: Pool already created"); Pool pool = new Pool(_poolId, router, _token, _sharedDecimals, _localDecimals, defaultFeeLibrary, _name, _symbol); getPool[_poolId] = pool; poolAddress = address(pool); allPools.push(poolAddress); } function renounceOwnership() public override onlyOwner {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; import "./ILayerZeroUserApplicationConfig.sol"; interface ILayerZeroEndpoint is ILayerZeroUserApplicationConfig { // @notice send a LayerZero message to the specified address at a LayerZero endpoint. // @param _dstChainId - the destination chain identifier // @param _destination - the address on destination chain (in bytes). address length/format may vary by chains // @param _payload - a custom bytes payload to send to the destination contract // @param _refundAddress - if the source transaction is cheaper than the amount of value passed, refund the additional amount to this address // @param _zroPaymentAddress - the address of the ZRO token holder who would pay for the transaction // @param _adapterParams - parameters for custom functionality. ie: pay for a specified destination gasAmount, or receive airdropped native gas from the relayer on destination function send(uint16 _dstChainId, bytes calldata _destination, bytes calldata _payload, address payable _refundAddress, address _zroPaymentAddress, bytes calldata _adapterParams) external payable; // @notice used by the messaging library to publish verified payload // @param _srcChainId - the source chain identifier // @param _srcAddress - the source contract (as bytes) at the source chain // @param _dstAddress - the address on destination chain // @param _nonce - the unbound message ordering nonce // @param _gasLimit - the gas limit for external contract execution // @param _payload - verified payload to send to the destination contract function receivePayload(uint16 _srcChainId, bytes calldata _srcAddress, address _dstAddress, uint64 _nonce, uint _gasLimit, bytes calldata _payload) external; // @notice get the inboundNonce of a receiver from a source chain which could be EVM or non-EVM chain // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function getInboundNonce(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (uint64); // @notice get the outboundNonce from this source chain which, consequently, is always an EVM // @param _srcAddress - the source chain contract address function getOutboundNonce(uint16 _dstChainId, address _srcAddress) external view returns (uint64); // @notice gets a quote in source native gas, for the amount that send() requires to pay for message delivery // @param _dstChainId - the destination chain identifier // @param _userApplication - the user app address on this EVM chain // @param _payload - the custom message to send over LayerZero // @param _payInZRO - if false, user app pays the protocol fee in native token // @param _adapterParam - parameters for the adapter service, e.g. send some dust native token to dstChain function estimateFees(uint16 _dstChainId, address _userApplication, bytes calldata _payload, bool _payInZRO, bytes calldata _adapterParam) external view returns (uint nativeFee, uint zroFee); // @notice get this Endpoint's immutable source identifier function getChainId() external view returns (uint16); // @notice the interface to retry failed message on this Endpoint destination // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address // @param _payload - the payload to be retried function retryPayload(uint16 _srcChainId, bytes calldata _srcAddress, bytes calldata _payload) external; // @notice query if any STORED payload (message blocking) at the endpoint. // @param _srcChainId - the source chain identifier // @param _srcAddress - the source chain contract address function hasStoredPayload(uint16 _srcChainId, bytes calldata _srcAddress) external view returns (bool); // @notice query if the _libraryAddress is valid for sending msgs. // @param _userApplication - the user app address on this EVM chain function getSendLibraryAddress(address _userApplication) external view returns (address); // @notice query if the _libraryAddress is valid for receiving msgs. // @param _userApplication - the user app address on this EVM chain function getReceiveLibraryAddress(address _userApplication) external view returns (address); // @notice query if the non-reentrancy guard for send() is on // @return true if the guard is on. false otherwise function isSendingPayload() external view returns (bool); // @notice query if the non-reentrancy guard for receive() is on // @return true if the guard is on. false otherwise function isReceivingPayload() external view returns (bool); // @notice get the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _userApplication - the contract address of the user application // @param _configType - type of configuration. every messaging library has its own convention. function getConfig(uint16 _version, uint16 _chainId, address _userApplication, uint _configType) external view returns (bytes memory); // @notice get the send() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getSendVersion(address _userApplication) external view returns (uint16); // @notice get the lzReceive() LayerZero messaging library version // @param _userApplication - the contract address of the user application function getReceiveVersion(address _userApplication) external view returns (uint16); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroReceiver { // @notice LayerZero endpoint will invoke this function to deliver the message on the destination // @param _srcChainId - the source endpoint identifier // @param _srcAddress - the source sending contract address from the source chain // @param _nonce - the ordered message nonce // @param _payload - the signed payload is the UA bytes has encoded to be sent function lzReceive(uint16 _srcChainId, bytes calldata _srcAddress, uint64 _nonce, bytes calldata _payload) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity >=0.5.0; interface ILayerZeroUserApplicationConfig { // @notice set the configuration of the LayerZero messaging library of the specified version // @param _version - messaging library version // @param _chainId - the chainId for the pending config change // @param _configType - type of configuration. every messaging library has its own convention. // @param _config - configuration in the bytes. can encode arbitrary content. function setConfig(uint16 _version, uint16 _chainId, uint _configType, bytes calldata _config) external; // @notice set the send() LayerZero messaging library version to _version // @param _version - new messaging library version function setSendVersion(uint16 _version) external; // @notice set the lzReceive() LayerZero messaging library version to _version // @param _version - new messaging library version function setReceiveVersion(uint16 _version) external; // @notice Only when the UA needs to resume the message flow in blocking mode and clear the stored payload // @param _srcChainId - the chainId of the source chain // @param _srcAddress - the contract address of the source contract at the source chain function forceResumeReceive(uint16 _srcChainId, bytes calldata _srcAddress) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity ^0.7.6; pragma abicoder v2; import "./Pool.sol"; interface IStargateFeeLibrary { function getFees( uint256 _srcPoolId, uint256 _dstPoolId, uint16 _dstChainId, address _from, uint256 _amountSD ) external returns (Pool.SwapObj memory s); function getVersion() external view returns (string memory); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; interface IStargateReceiver { function sgReceive( uint16 _chainId, bytes memory _srcAddress, uint256 _nonce, address _token, uint256 amountLD, bytes memory payload ) external; }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; interface IStargateRouter { struct lzTxObj { uint256 dstGasForCall; uint256 dstNativeAmount; bytes dstNativeAddr; } function addLiquidity( uint256 _poolId, uint256 _amountLD, address _to ) external; function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable; function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function instantRedeemLocal( uint16 _srcPoolId, uint256 _amountLP, address _to ) external returns (uint256); function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable; function sendCredits( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress ) external payable; function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, lzTxObj memory _lzTxParams ) external view returns (uint256, uint256); }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; // libraries import "./SafeMath.sol"; contract LPTokenERC20 { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS string public name; string public symbol; bytes32 public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; // set in constructor bytes32 public DOMAIN_SEPARATOR; //--------------------------------------------------------------------------- // VARIABLES uint256 public decimals; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public nonces; //--------------------------------------------------------------------------- // EVENTS event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); constructor(string memory _name, string memory _symbol) { name = _name; symbol = _symbol; uint256 chainId; assembly { chainId := chainid() } DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), chainId, address(this) ) ); } function _mint(address to, uint256 value) internal { totalSupply = totalSupply.add(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(address(0), to, value); } function _burn(address from, uint256 value) internal { balanceOf[from] = balanceOf[from].sub(value); totalSupply = totalSupply.sub(value); emit Transfer(from, address(0), value); } function _approve( address owner, address spender, uint256 value ) private { allowance[owner][spender] = value; emit Approval(owner, spender, value); } function _transfer( address from, address to, uint256 value ) private { balanceOf[from] = balanceOf[from].sub(value); balanceOf[to] = balanceOf[to].add(value); emit Transfer(from, to, value); } function approve(address spender, uint256 value) external returns (bool) { _approve(msg.sender, spender, value); return true; } function transfer(address to, uint256 value) external returns (bool) { _transfer(msg.sender, to, value); return true; } function transferFrom( address from, address to, uint256 value ) external returns (bool) { if (allowance[from][msg.sender] != uint256(-1)) { allowance[from][msg.sender] = allowance[from][msg.sender].sub(value); } _transfer(from, to, value); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(msg.sender, spender, allowance[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "Bridge: EXPIRED"); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline)) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require(recoveredAddress != address(0) && recoveredAddress == owner, "Bridge: INVALID_SIGNATURE"); _approve(owner, spender, value); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./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. * * By default, the owner account will be the one that deploys the contract. 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; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./LPTokenERC20.sol"; import "./IStargateFeeLibrary.sol"; // libraries import "./SafeMath.sol"; /// Pool contracts on other chains and managed by the Stargate protocol. contract Pool is LPTokenERC20, ReentrancyGuard { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS bytes4 private constant SELECTOR = bytes4(keccak256(bytes("transfer(address,uint256)"))); uint256 public constant BP_DENOMINATOR = 10000; //--------------------------------------------------------------------------- // STRUCTS struct ChainPath { bool ready; // indicate if the counter chainPath has been created. uint16 dstChainId; uint256 dstPoolId; uint256 weight; uint256 balance; uint256 lkb; uint256 credits; uint256 idealBalance; } struct SwapObj { uint256 amount; uint256 eqFee; uint256 eqReward; uint256 lpFee; uint256 protocolFee; uint256 lkbRemove; } struct CreditObj { uint256 credits; uint256 idealBalance; } //--------------------------------------------------------------------------- // VARIABLES // chainPath ChainPath[] public chainPaths; // list of connected chains with shared pools mapping(uint16 => mapping(uint256 => uint256)) public chainPathIndexLookup; // lookup for chainPath by chainId => poolId =>index // metadata uint256 public immutable poolId; // shared id between chains to represent same pool uint256 public sharedDecimals; // the shared decimals (lowest common decimals between chains) uint256 public localDecimals; // the decimals for the token uint256 public immutable convertRate; // the decimals for the token address public immutable token; // the token for the pool address public immutable router; // the token for the pool bool public stopSwap; // flag to stop swapping in extreme cases // Fee and Liquidity uint256 public totalLiquidity; // the total amount of tokens added on this side of the chain (fees + deposits - withdrawals) uint256 public totalWeight; // total weight for pool percentages uint256 public mintFeeBP; // fee basis points for the mint/deposit uint256 public protocolFeeBalance; // fee balance created from dao fee uint256 public mintFeeBalance; // fee balance created from mint fee uint256 public eqFeePool; // pool rewards in Shared Decimal format. indicate the total budget for reverse swap incentive address public feeLibrary; // address for retrieving fee params for swaps // Delta related uint256 public deltaCredit; // credits accumulated from txn bool public batched; // flag to indicate if we want batch processing. bool public defaultSwapMode; // flag for the default mode for swap bool public defaultLPMode; // flag for the default mode for lp uint256 public swapDeltaBP; // basis points of poolCredits to activate Delta in swap uint256 public lpDeltaBP; // basis points of poolCredits to activate Delta in liquidity events //--------------------------------------------------------------------------- // EVENTS event Mint(address to, uint256 amountLP, uint256 amountSD, uint256 mintFeeAmountSD); event Burn(address from, uint256 amountLP, uint256 amountSD); event RedeemLocalCallback(address _to, uint256 _amountSD, uint256 _amountToMintSD); event Swap( uint16 chainId, uint256 dstPoolId, address from, uint256 amountSD, uint256 eqReward, uint256 eqFee, uint256 protocolFee, uint256 lpFee ); event SendCredits(uint16 dstChainId, uint256 dstPoolId, uint256 credits, uint256 idealBalance); event RedeemRemote(uint16 chainId, uint256 dstPoolId, address from, uint256 amountLP, uint256 amountSD); event RedeemLocal(address from, uint256 amountLP, uint256 amountSD, uint16 chainId, uint256 dstPoolId, bytes to); event InstantRedeemLocal(address from, uint256 amountLP, uint256 amountSD, address to); event CreditChainPath(uint16 chainId, uint256 srcPoolId, uint256 amountSD, uint256 idealBalance); event SwapRemote(address to, uint256 amountSD, uint256 protocolFee, uint256 dstFee); event WithdrawRemote(uint16 srcChainId, uint256 srcPoolId, uint256 swapAmount, uint256 mintAmount); event ChainPathUpdate(uint16 dstChainId, uint256 dstPoolId, uint256 weight); event FeesUpdated(uint256 mintFeeBP); event FeeLibraryUpdated(address feeLibraryAddr); event StopSwapUpdated(bool swapStop); event WithdrawProtocolFeeBalance(address to, uint256 amountSD); event WithdrawMintFeeBalance(address to, uint256 amountSD); event DeltaParamUpdated(bool batched, uint256 swapDeltaBP, uint256 lpDeltaBP, bool defaultSwapMode, bool defaultLPMode); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyRouter() { require(msg.sender == router, "Stargate: only the router can call this method"); _; } constructor( uint256 _poolId, address _router, address _token, uint256 _sharedDecimals, uint256 _localDecimals, address _feeLibrary, string memory _name, string memory _symbol ) LPTokenERC20(_name, _symbol) { require(_token != address(0x0), "Stargate: _token cannot be 0x0"); require(_router != address(0x0), "Stargate: _router cannot be 0x0"); poolId = _poolId; router = _router; token = _token; sharedDecimals = _sharedDecimals; decimals = uint8(_sharedDecimals); localDecimals = _localDecimals; convertRate = 10**(uint256(localDecimals).sub(sharedDecimals)); totalWeight = 0; feeLibrary = _feeLibrary; //delta algo related batched = false; defaultSwapMode = true; defaultLPMode = true; } function getChainPathsLength() public view returns (uint256) { return chainPaths.length; } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function mint(address _to, uint256 _amountLD) external nonReentrant onlyRouter returns (uint256) { return _mintLocal(_to, _amountLD, true, true); } // Local Remote // ------- --------- // swap -> swapRemote function swap( uint16 _dstChainId, uint256 _dstPoolId, address _from, uint256 _amountLD, uint256 _minAmountLD, bool newLiquidity ) external nonReentrant onlyRouter returns (SwapObj memory) { require(!stopSwap, "Stargate: swap func stopped"); ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == true, "Stargate: counter chainPath is not ready"); uint256 amountSD = amountLDtoSD(_amountLD); uint256 minAmountSD = amountLDtoSD(_minAmountLD); // request fee params from library SwapObj memory s = IStargateFeeLibrary(feeLibrary).getFees(poolId, _dstPoolId, _dstChainId, _from, amountSD); // equilibrium fee and reward. note eqFee/eqReward are separated from swap liquidity eqFeePool = eqFeePool.sub(s.eqReward); // update the new amount the user gets minus the fees s.amount = amountSD.sub(s.eqFee).sub(s.protocolFee).sub(s.lpFee); // users will also get the eqReward require(s.amount.add(s.eqReward) >= minAmountSD, "Stargate: slippage too high"); // behaviours // - protocolFee: booked, stayed and withdrawn at remote. // - eqFee: booked, stayed and withdrawn at remote. // - lpFee: booked and stayed at remote, can be withdrawn anywhere s.lkbRemove = amountSD.sub(s.lpFee).add(s.eqReward); // check for transfer solvency. require(cp.balance >= s.lkbRemove, "Stargate: dst balance too low"); cp.balance = cp.balance.sub(s.lkbRemove); if (newLiquidity) { deltaCredit = deltaCredit.add(amountSD).add(s.eqReward); } else if (s.eqReward > 0) { deltaCredit = deltaCredit.add(s.eqReward); } // distribute credits on condition. if (!batched || deltaCredit >= totalLiquidity.mul(swapDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultSwapMode); } emit Swap(_dstChainId, _dstPoolId, _from, s.amount, s.eqReward, s.eqFee, s.protocolFee, s.lpFee); return s; } // Local Remote // ------- --------- // sendCredits -> creditChainPath function sendCredits(uint16 _dstChainId, uint256 _dstPoolId) external nonReentrant onlyRouter returns (CreditObj memory c) { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == true, "Stargate: counter chainPath is not ready"); cp.lkb = cp.lkb.add(cp.credits); c.idealBalance = totalLiquidity.mul(cp.weight).div(totalWeight); c.credits = cp.credits; cp.credits = 0; emit SendCredits(_dstChainId, _dstPoolId, c.credits, c.idealBalance); } // Local Remote // ------- --------- // redeemRemote -> swapRemote function redeemRemote( uint16 _dstChainId, uint256 _dstPoolId, address _from, uint256 _amountLP ) external nonReentrant onlyRouter { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); uint256 amountSD = _burnLocal(_from, _amountLP); //run Delta if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultLPMode); } uint256 amountLD = amountSDtoLD(amountSD); emit RedeemRemote(_dstChainId, _dstPoolId, _from, _amountLP, amountLD); } function instantRedeemLocal( address _from, uint256 _amountLP, address _to ) external nonReentrant onlyRouter returns (uint256 amountSD) { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); uint256 _deltaCredit = deltaCredit; // sload optimization. uint256 _capAmountLP = _amountSDtoLP(_deltaCredit); if (_amountLP > _capAmountLP) _amountLP = _capAmountLP; amountSD = _burnLocal(_from, _amountLP); deltaCredit = _deltaCredit.sub(amountSD); uint256 amountLD = amountSDtoLD(amountSD); _safeTransfer(token, _to, amountLD); emit InstantRedeemLocal(_from, _amountLP, amountSD, _to); } // Local Remote // ------- --------- // redeemLocal -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocal( address _from, uint256 _amountLP, uint16 _dstChainId, uint256 _dstPoolId, bytes calldata _to ) external nonReentrant onlyRouter returns (uint256 amountSD) { require(_from != address(0x0), "Stargate: _from cannot be 0x0"); // safeguard. require(chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]].ready == true, "Stargate: counter chainPath is not ready"); amountSD = _burnLocal(_from, _amountLP); // run Delta if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(false); } emit RedeemLocal(_from, _amountLP, amountSD, _dstChainId, _dstPoolId, _to); } //--------------------------------------------------------------------------- // REMOTE CHAIN FUNCTIONS // Local Remote // ------- --------- // sendCredits -> creditChainPath function creditChainPath( uint16 _dstChainId, uint256 _dstPoolId, CreditObj memory _c ) external nonReentrant onlyRouter { ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; cp.balance = cp.balance.add(_c.credits); if (cp.idealBalance != _c.idealBalance) { cp.idealBalance = _c.idealBalance; } emit CreditChainPath(_dstChainId, _dstPoolId, _c.credits, _c.idealBalance); } // Local Remote // ------- --------- // swap -> swapRemote function swapRemote( uint16 _srcChainId, uint256 _srcPoolId, address _to, SwapObj memory _s ) external nonReentrant onlyRouter returns (uint256 amountLD) { // booking lpFee totalLiquidity = totalLiquidity.add(_s.lpFee); // booking eqFee eqFeePool = eqFeePool.add(_s.eqFee); // booking stargateFee protocolFeeBalance = protocolFeeBalance.add(_s.protocolFee); // update LKB uint256 chainPathIndex = chainPathIndexLookup[_srcChainId][_srcPoolId]; chainPaths[chainPathIndex].lkb = chainPaths[chainPathIndex].lkb.sub(_s.lkbRemove); // user receives the amount + the srcReward amountLD = amountSDtoLD(_s.amount.add(_s.eqReward)); _safeTransfer(token, _to, amountLD); emit SwapRemote(_to, _s.amount.add(_s.eqReward), _s.protocolFee, _s.eqFee); } // Local Remote // ------- --------- // redeemLocal -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocalCallback( uint16 _srcChainId, uint256 _srcPoolId, address _to, uint256 _amountSD, uint256 _amountToMintSD ) external nonReentrant onlyRouter { if (_amountToMintSD > 0) { _mintLocal(_to, amountSDtoLD(_amountToMintSD), false, false); } ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId); cp.lkb = cp.lkb.sub(_amountSD); uint256 amountLD = amountSDtoLD(_amountSD); _safeTransfer(token, _to, amountLD); emit RedeemLocalCallback(_to, _amountSD, _amountToMintSD); } // Local Remote // ------- --------- // redeemLocal(amount) -> redeemLocalCheckOnRemote // redeemLocalCallback <- function redeemLocalCheckOnRemote( uint16 _srcChainId, uint256 _srcPoolId, uint256 _amountSD ) external nonReentrant onlyRouter returns (uint256 swapAmount, uint256 mintAmount) { ChainPath storage cp = getAndCheckCP(_srcChainId, _srcPoolId); if (_amountSD > cp.balance) { mintAmount = _amountSD - cp.balance; swapAmount = cp.balance; cp.balance = 0; } else { cp.balance = cp.balance.sub(_amountSD); swapAmount = _amountSD; mintAmount = 0; } emit WithdrawRemote(_srcChainId, _srcPoolId, swapAmount, mintAmount); } //--------------------------------------------------------------------------- // DAO Calls function createChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint256 _weight ) external onlyRouter { for (uint256 i = 0; i < chainPaths.length; ++i) { ChainPath memory cp = chainPaths[i]; bool exists = cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId; require(!exists, "Stargate: cant createChainPath of existing dstChainId and _dstPoolId"); } totalWeight = totalWeight.add(_weight); chainPathIndexLookup[_dstChainId][_dstPoolId] = chainPaths.length; chainPaths.push(ChainPath(false, _dstChainId, _dstPoolId, _weight, 0, 0, 0, 0)); emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight); } function setWeightForChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint16 _weight ) external onlyRouter { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); totalWeight = totalWeight.sub(cp.weight).add(_weight); cp.weight = _weight; emit ChainPathUpdate(_dstChainId, _dstPoolId, _weight); } function setFee(uint256 _mintFeeBP) external onlyRouter { require(_mintFeeBP <= BP_DENOMINATOR, "Bridge: cum fees > 100%"); mintFeeBP = _mintFeeBP; emit FeesUpdated(mintFeeBP); } function setFeeLibrary(address _feeLibraryAddr) external onlyRouter { require(_feeLibraryAddr != address(0x0), "Stargate: fee library cant be 0x0"); feeLibrary = _feeLibraryAddr; emit FeeLibraryUpdated(_feeLibraryAddr); } function setSwapStop(bool _swapStop) external onlyRouter { stopSwap = _swapStop; emit StopSwapUpdated(_swapStop); } function setDeltaParam( bool _batched, uint256 _swapDeltaBP, uint256 _lpDeltaBP, bool _defaultSwapMode, bool _defaultLPMode ) external onlyRouter { require(_swapDeltaBP <= BP_DENOMINATOR && _lpDeltaBP <= BP_DENOMINATOR, "Stargate: wrong Delta param"); batched = _batched; swapDeltaBP = _swapDeltaBP; lpDeltaBP = _lpDeltaBP; defaultSwapMode = _defaultSwapMode; defaultLPMode = _defaultLPMode; emit DeltaParamUpdated(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode); } function callDelta(bool _fullMode) external onlyRouter { _delta(_fullMode); } function activateChainPath(uint16 _dstChainId, uint256 _dstPoolId) external onlyRouter { ChainPath storage cp = getAndCheckCP(_dstChainId, _dstPoolId); require(cp.ready == false, "Stargate: chainPath is already active"); // this func will only be called once cp.ready = true; } function withdrawProtocolFeeBalance(address _to) external onlyRouter { if (protocolFeeBalance > 0) { uint256 amountOfLD = amountSDtoLD(protocolFeeBalance); protocolFeeBalance = 0; _safeTransfer(token, _to, amountOfLD); emit WithdrawProtocolFeeBalance(_to, amountOfLD); } } function withdrawMintFeeBalance(address _to) external onlyRouter { if (mintFeeBalance > 0) { uint256 amountOfLD = amountSDtoLD(mintFeeBalance); mintFeeBalance = 0; _safeTransfer(token, _to, amountOfLD); emit WithdrawMintFeeBalance(_to, amountOfLD); } } //--------------------------------------------------------------------------- // INTERNAL // Conversion Helpers //--------------------------------------------------------------------------- function amountLPtoLD(uint256 _amountLP) external view returns (uint256) { return amountSDtoLD(_amountLPtoSD(_amountLP)); } function _amountLPtoSD(uint256 _amountLP) internal view returns (uint256) { require(totalSupply > 0, "Stargate: cant convert LPtoSD when totalSupply == 0"); return _amountLP.mul(totalLiquidity).div(totalSupply); } function _amountSDtoLP(uint256 _amountSD) internal view returns (uint256) { require(totalLiquidity > 0, "Stargate: cant convert SDtoLP when totalLiq == 0"); return _amountSD.mul(totalSupply).div(totalLiquidity); } function amountSDtoLD(uint256 _amount) internal view returns (uint256) { return _amount.mul(convertRate); } function amountLDtoSD(uint256 _amount) internal view returns (uint256) { return _amount.div(convertRate); } function getAndCheckCP(uint16 _dstChainId, uint256 _dstPoolId) internal view returns (ChainPath storage) { require(chainPaths.length > 0, "Stargate: no chainpaths exist"); ChainPath storage cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist"); return cp; } function getChainPath(uint16 _dstChainId, uint256 _dstPoolId) external view returns (ChainPath memory) { ChainPath memory cp = chainPaths[chainPathIndexLookup[_dstChainId][_dstPoolId]]; require(cp.dstChainId == _dstChainId && cp.dstPoolId == _dstPoolId, "Stargate: local chainPath does not exist"); return cp; } function _burnLocal(address _from, uint256 _amountLP) internal returns (uint256) { require(totalSupply > 0, "Stargate: cant burn when totalSupply == 0"); uint256 amountOfLPTokens = balanceOf[_from]; require(amountOfLPTokens >= _amountLP, "Stargate: not enough LP tokens to burn"); uint256 amountSD = _amountLP.mul(totalLiquidity).div(totalSupply); //subtract totalLiquidity accordingly totalLiquidity = totalLiquidity.sub(amountSD); _burn(_from, _amountLP); emit Burn(_from, _amountLP, amountSD); return amountSD; } function _delta(bool fullMode) internal { if (deltaCredit > 0 && totalWeight > 0) { uint256 cpLength = chainPaths.length; uint256[] memory deficit = new uint256[](cpLength); uint256 totalDeficit = 0; // algorithm steps 6-9: calculate the total and the amounts required to get to balance state for (uint256 i = 0; i < cpLength; ++i) { ChainPath storage cp = chainPaths[i]; // (liquidity * (weight/totalWeight)) - (lkb+credits) uint256 balLiq = totalLiquidity.mul(cp.weight).div(totalWeight); uint256 currLiq = cp.lkb.add(cp.credits); if (balLiq > currLiq) { // save gas since we know balLiq > currLiq and we know deficit[i] > 0 deficit[i] = balLiq - currLiq; totalDeficit = totalDeficit.add(deficit[i]); } } // indicates how much delta credit is distributed uint256 spent; // handle credits with 2 tranches. the [ < totalDeficit] [excessCredit] // run full Delta, allocate all credits if (totalDeficit == 0) { // only fullMode delta will allocate excess credits if (fullMode && deltaCredit > 0) { // credit ChainPath by weights for (uint256 i = 0; i < cpLength; ++i) { ChainPath storage cp = chainPaths[i]; // credits = credits + toBalanceChange + remaining allocation based on weight uint256 amtToCredit = deltaCredit.mul(cp.weight).div(totalWeight); spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } // else do nth } else if (totalDeficit <= deltaCredit) { if (fullMode) { // algorithm step 13: calculate amount to disperse to bring to balance state or as close as possible uint256 excessCredit = deltaCredit - totalDeficit; // algorithm steps 14-16: calculate credits for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; // credits = credits + deficit + remaining allocation based on weight uint256 amtToCredit = deficit[i].add(excessCredit.mul(cp.weight).div(totalWeight)); spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } } else { // totalDeficit <= deltaCredit but not running fullMode // credit chainPaths as is if any deficit, not using all deltaCredit for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; uint256 amtToCredit = deficit[i]; spent = spent.add(amtToCredit); cp.credits = cp.credits.add(amtToCredit); } } } } else { // totalDeficit > deltaCredit, fullMode or not, normalize the deficit by deltaCredit for (uint256 i = 0; i < cpLength; ++i) { if (deficit[i] > 0) { ChainPath storage cp = chainPaths[i]; uint256 proportionalDeficit = deficit[i].mul(deltaCredit).div(totalDeficit); spent = spent.add(proportionalDeficit); cp.credits = cp.credits.add(proportionalDeficit); } } } // deduct the amount of credit sent deltaCredit = deltaCredit.sub(spent); } } function _mintLocal( address _to, uint256 _amountLD, bool _feesEnabled, bool _creditDelta ) internal returns (uint256 amountSD) { require(totalWeight > 0, "Stargate: No ChainPaths exist"); amountSD = amountLDtoSD(_amountLD); uint256 mintFeeSD = 0; if (_feesEnabled) { mintFeeSD = amountSD.mul(mintFeeBP).div(BP_DENOMINATOR); amountSD = amountSD.sub(mintFeeSD); mintFeeBalance = mintFeeBalance.add(mintFeeSD); } if (_creditDelta) { deltaCredit = deltaCredit.add(amountSD); } uint256 amountLPTokens = amountSD; if (totalSupply != 0) { amountLPTokens = amountSD.mul(totalSupply).div(totalLiquidity); } totalLiquidity = totalLiquidity.add(amountSD); _mint(_to, amountLPTokens); emit Mint(_to, amountLPTokens, amountSD, mintFeeSD); // add to credits and call delta. short circuit to save gas if (!batched || deltaCredit > totalLiquidity.mul(lpDeltaBP).div(BP_DENOMINATOR)) { _delta(defaultLPMode); } } function _safeTransfer( address _token, address _to, uint256 _value ) private { (bool success, bytes memory data) = _token.call(abi.encodeWithSelector(SELECTOR, _to, _value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Stargate: TRANSFER_FAILED"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.7.6; pragma abicoder v2; // imports import "./Ownable.sol"; import "./ReentrancyGuard.sol"; import "./Factory.sol"; import "./Pool.sol"; import "./Bridge.sol"; // interfaces import "./IERC20.sol"; import "./IStargateRouter.sol"; import "./IStargateReceiver.sol"; // libraries import "./SafeMath.sol"; contract Router is IStargateRouter, Ownable, ReentrancyGuard { using SafeMath for uint256; //--------------------------------------------------------------------------- // CONSTANTS uint8 internal constant TYPE_REDEEM_LOCAL_RESPONSE = 1; uint8 internal constant TYPE_REDEEM_LOCAL_CALLBACK_RETRY = 2; uint8 internal constant TYPE_SWAP_REMOTE_RETRY = 3; //--------------------------------------------------------------------------- // STRUCTS struct CachedSwap { address token; uint256 amountLD; address to; bytes payload; } //--------------------------------------------------------------------------- // VARIABLES Factory public factory; // used for creating pools address public protocolFeeOwner; // can call methods to pull Stargate fees collected in pools address public mintFeeOwner; // can call methods to pull mint fees collected in pools Bridge public bridge; mapping(uint16 => mapping(bytes => mapping(uint256 => bytes))) public revertLookup; //[chainId][srcAddress][nonce] mapping(uint16 => mapping(bytes => mapping(uint256 => CachedSwap))) public cachedSwapLookup; //[chainId][srcAddress][nonce] //--------------------------------------------------------------------------- // EVENTS event Revert(uint8 bridgeFunctionType, uint16 chainId, bytes srcAddress, uint256 nonce); event CachedSwapSaved(uint16 chainId, bytes srcAddress, uint256 nonce, address token, uint256 amountLD, address to, bytes payload, bytes reason); event RevertRedeemLocal(uint16 srcChainId, uint256 _srcPoolId, uint256 _dstPoolId, bytes to, uint256 redeemAmountSD, uint256 mintAmountSD, uint256 indexed nonce, bytes indexed srcAddress); event RedeemLocalCallback(uint16 srcChainId, bytes indexed srcAddress, uint256 indexed nonce, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD); //--------------------------------------------------------------------------- // MODIFIERS modifier onlyBridge() { require(msg.sender == address(bridge), "Bridge: caller must be Bridge."); _; } constructor() {} function setBridgeAndFactory(Bridge _bridge, Factory _factory) external onlyOwner { require(address(bridge) == address(0x0) && address(factory) == address(0x0), "Stargate: bridge and factory already initialized"); // 1 time only require(address(_bridge) != address(0x0), "Stargate: bridge cant be 0x0"); require(address(_factory) != address(0x0), "Stargate: factory cant be 0x0"); bridge = _bridge; factory = _factory; } //--------------------------------------------------------------------------- // VIEWS function _getPool(uint256 _poolId) internal view returns (Pool pool) { pool = factory.getPool(_poolId); require(address(pool) != address(0x0), "Stargate: Pool does not exist"); } //--------------------------------------------------------------------------- // INTERNAL function _safeTransferFrom( address token, address from, address to, uint256 value ) private { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), "Stargate: TRANSFER_FROM_FAILED"); } //--------------------------------------------------------------------------- // LOCAL CHAIN FUNCTIONS function addLiquidity( uint256 _poolId, uint256 _amountLD, address _to ) external override nonReentrant { Pool pool = _getPool(_poolId); uint256 convertRate = pool.convertRate(); _amountLD = _amountLD.div(convertRate).mul(convertRate); _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD); pool.mint(_to, _amountLD); } function swap( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLD, uint256 _minAmountLD, lzTxObj memory _lzTxParams, bytes calldata _to, bytes calldata _payload ) external payable override nonReentrant { require(_amountLD > 0, "Stargate: cannot swap 0"); require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool.SwapObj memory s; Pool.CreditObj memory c; { Pool pool = _getPool(_srcPoolId); { uint256 convertRate = pool.convertRate(); _amountLD = _amountLD.div(convertRate).mul(convertRate); } s = pool.swap(_dstChainId, _dstPoolId, msg.sender, _amountLD, _minAmountLD, true); _safeTransferFrom(pool.token(), msg.sender, address(pool), _amountLD); c = pool.sendCredits(_dstChainId, _dstPoolId); } bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, _payload); } function redeemRemote( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, uint256 _minAmountLD, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); require(_amountLP > 0, "Stargate: not enough lp to redeemRemote"); Pool.SwapObj memory s; Pool.CreditObj memory c; { Pool pool = _getPool(_srcPoolId); uint256 amountLD = pool.amountLPtoLD(_amountLP); // perform a swap with no liquidity s = pool.swap(_dstChainId, _dstPoolId, msg.sender, amountLD, _minAmountLD, false); pool.redeemRemote(_dstChainId, _dstPoolId, msg.sender, _amountLP); c = pool.sendCredits(_dstChainId, _dstPoolId); } // equal to a swap, with no payload ("0x") no dstGasForCall 0 bridge.swap{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, s, _lzTxParams, _to, ""); } function instantRedeemLocal( uint16 _srcPoolId, uint256 _amountLP, address _to ) external override nonReentrant returns (uint256 amountSD) { require(_amountLP > 0, "Stargate: not enough lp to redeem"); Pool pool = _getPool(_srcPoolId); amountSD = pool.instantRedeemLocal(msg.sender, _amountLP, _to); } function redeemLocal( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress, uint256 _amountLP, bytes calldata _to, lzTxObj memory _lzTxParams ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool pool = _getPool(_srcPoolId); require(_amountLP > 0, "Stargate: not enough lp to redeem"); uint256 amountSD = pool.redeemLocal(msg.sender, _amountLP, _dstChainId, _dstPoolId, _to); require(amountSD > 0, "Stargate: not enough lp to redeem with amountSD"); Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId); bridge.redeemLocal{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c, amountSD, _to, _lzTxParams); } function sendCredits( uint16 _dstChainId, uint256 _srcPoolId, uint256 _dstPoolId, address payable _refundAddress ) external payable override nonReentrant { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); Pool pool = _getPool(_srcPoolId); Pool.CreditObj memory c = pool.sendCredits(_dstChainId, _dstPoolId); bridge.sendCredits{value: msg.value}(_dstChainId, _srcPoolId, _dstPoolId, _refundAddress, c); } function quoteLayerZeroFee( uint16 _dstChainId, uint8 _functionType, bytes calldata _toAddress, bytes calldata _transferAndCallPayload, Router.lzTxObj memory _lzTxParams ) external view override returns (uint256, uint256) { return bridge.quoteLayerZeroFee(_dstChainId, _functionType, _toAddress, _transferAndCallPayload, _lzTxParams); } function revertRedeemLocal( uint16 _dstChainId, bytes calldata _srcAddress, uint256 _nonce, address payable _refundAddress, lzTxObj memory _lzTxParams ) external payable { require(_refundAddress != address(0x0), "Stargate: _refundAddress cannot be 0x0"); bytes memory payload = revertLookup[_dstChainId][_srcAddress][_nonce]; require(payload.length > 0, "Stargate: no retry revert"); { uint8 functionType; assembly { functionType := mload(add(payload, 32)) } require(functionType == TYPE_REDEEM_LOCAL_RESPONSE, "Stargate: invalid function type"); } // empty it revertLookup[_dstChainId][_srcAddress][_nonce] = ""; uint256 srcPoolId; uint256 dstPoolId; assembly { srcPoolId := mload(add(payload, 64)) dstPoolId := mload(add(payload, 96)) } Pool.CreditObj memory c; { Pool pool = _getPool(dstPoolId); c = pool.sendCredits(_dstChainId, srcPoolId); } bridge.redeemLocalCallback{value: msg.value}(_dstChainId, _refundAddress, c, _lzTxParams, payload); } function retryRevert( uint16 _srcChainId, bytes calldata _srcAddress, uint256 _nonce ) external payable { bytes memory payload = revertLookup[_srcChainId][_srcAddress][_nonce]; require(payload.length > 0, "Stargate: no retry revert"); // empty it revertLookup[_srcChainId][_srcAddress][_nonce] = ""; uint8 functionType; assembly { functionType := mload(add(payload, 32)) } if (functionType == TYPE_REDEEM_LOCAL_CALLBACK_RETRY) { (, uint256 srcPoolId, uint256 dstPoolId, address to, uint256 amountSD, uint256 mintAmountSD) = abi.decode( payload, (uint8, uint256, uint256, address, uint256, uint256) ); _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, to, amountSD, mintAmountSD); } // for retrying the swapRemote. if it fails again, retry else if (functionType == TYPE_SWAP_REMOTE_RETRY) { (, uint256 srcPoolId, uint256 dstPoolId, uint256 dstGasForCall, address to, Pool.SwapObj memory s, bytes memory p) = abi.decode( payload, (uint8, uint256, uint256, uint256, address, Pool.SwapObj, bytes) ); _swapRemote(_srcChainId, _srcAddress, _nonce, srcPoolId, dstPoolId, dstGasForCall, to, s, p); } else { revert("Stargate: invalid function type"); } } function clearCachedSwap( uint16 _srcChainId, bytes calldata _srcAddress, uint256 _nonce ) external { CachedSwap memory cs = cachedSwapLookup[_srcChainId][_srcAddress][_nonce]; require(cs.to != address(0x0), "Stargate: cache already cleared"); // clear the data cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(address(0x0), 0, address(0x0), ""); IStargateReceiver(cs.to).sgReceive(_srcChainId, _srcAddress, _nonce, cs.token, cs.amountLD, cs.payload); } function creditChainPath( uint16 _dstChainId, uint256 _dstPoolId, uint256 _srcPoolId, Pool.CreditObj memory _c ) external onlyBridge { Pool pool = _getPool(_srcPoolId); pool.creditChainPath(_dstChainId, _dstPoolId, _c); } //--------------------------------------------------------------------------- // REMOTE CHAIN FUNCTIONS function redeemLocalCheckOnRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _amountSD, bytes calldata _to ) external onlyBridge { Pool pool = _getPool(_dstPoolId); try pool.redeemLocalCheckOnRemote(_srcChainId, _srcPoolId, _amountSD) returns (uint256 redeemAmountSD, uint256 mintAmountSD) { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_REDEEM_LOCAL_RESPONSE, _srcPoolId, _dstPoolId, redeemAmountSD, mintAmountSD, _to ); emit RevertRedeemLocal(_srcChainId, _srcPoolId, _dstPoolId, _to, redeemAmountSD, mintAmountSD, _nonce, _srcAddress); } catch { // if the func fail, return [swapAmount: 0, mintAMount: _amountSD] // swapAmount represents the amount of chainPath balance deducted on the remote side, which because the above tx failed, should be 0 // mintAmount is the full amount of tokens the user attempted to redeem on the src side, which gets converted back into the lp amount revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode(TYPE_REDEEM_LOCAL_RESPONSE, _srcPoolId, _dstPoolId, 0, _amountSD, _to); emit Revert(TYPE_REDEEM_LOCAL_RESPONSE, _srcChainId, _srcAddress, _nonce); } } function redeemLocalCallback( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, address _to, uint256 _amountSD, uint256 _mintAmountSD ) external onlyBridge { _redeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD); } function _redeemLocalCallback( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, address _to, uint256 _amountSD, uint256 _mintAmountSD ) internal { Pool pool = _getPool(_dstPoolId); try pool.redeemLocalCallback(_srcChainId, _srcPoolId, _to, _amountSD, _mintAmountSD) {} catch { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_REDEEM_LOCAL_CALLBACK_RETRY, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD ); emit Revert(TYPE_REDEEM_LOCAL_CALLBACK_RETRY, _srcChainId, _srcAddress, _nonce); } emit RedeemLocalCallback(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _to, _amountSD, _mintAmountSD); } function swapRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _dstGasForCall, address _to, Pool.SwapObj memory _s, bytes memory _payload ) external onlyBridge { _swapRemote(_srcChainId, _srcAddress, _nonce, _srcPoolId, _dstPoolId, _dstGasForCall, _to, _s, _payload); } function _swapRemote( uint16 _srcChainId, bytes memory _srcAddress, uint256 _nonce, uint256 _srcPoolId, uint256 _dstPoolId, uint256 _dstGasForCall, address _to, Pool.SwapObj memory _s, bytes memory _payload ) internal { Pool pool = _getPool(_dstPoolId); // first try catch the swap remote try pool.swapRemote(_srcChainId, _srcPoolId, _to, _s) returns (uint256 amountLD) { if (_payload.length > 0) { // then try catch the external contract call try IStargateReceiver(_to).sgReceive{gas: _dstGasForCall}(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _payload) { // do nothing } catch (bytes memory reason) { cachedSwapLookup[_srcChainId][_srcAddress][_nonce] = CachedSwap(pool.token(), amountLD, _to, _payload); emit CachedSwapSaved(_srcChainId, _srcAddress, _nonce, pool.token(), amountLD, _to, _payload, reason); } } } catch { revertLookup[_srcChainId][_srcAddress][_nonce] = abi.encode( TYPE_SWAP_REMOTE_RETRY, _srcPoolId, _dstPoolId, _dstGasForCall, _to, _s, _payload ); emit Revert(TYPE_SWAP_REMOTE_RETRY, _srcChainId, _srcAddress, _nonce); } } //--------------------------------------------------------------------------- // DAO Calls function createPool( uint256 _poolId, address _token, uint8 _sharedDecimals, uint8 _localDecimals, string memory _name, string memory _symbol ) external onlyOwner returns (address) { require(_token != address(0x0), "Stargate: _token cannot be 0x0"); return factory.createPool(_poolId, _token, _sharedDecimals, _localDecimals, _name, _symbol); } function createChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId, uint256 _weight ) external onlyOwner { Pool pool = _getPool(_poolId); pool.createChainPath(_dstChainId, _dstPoolId, _weight); } function activateChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId ) external onlyOwner { Pool pool = _getPool(_poolId); pool.activateChainPath(_dstChainId, _dstPoolId); } function setWeightForChainPath( uint256 _poolId, uint16 _dstChainId, uint256 _dstPoolId, uint16 _weight ) external onlyOwner { Pool pool = _getPool(_poolId); pool.setWeightForChainPath(_dstChainId, _dstPoolId, _weight); } function setProtocolFeeOwner(address _owner) external onlyOwner { require(_owner != address(0x0), "Stargate: _owner cannot be 0x0"); protocolFeeOwner = _owner; } function setMintFeeOwner(address _owner) external onlyOwner { require(_owner != address(0x0), "Stargate: _owner cannot be 0x0"); mintFeeOwner = _owner; } function setFees(uint256 _poolId, uint256 _mintFeeBP) external onlyOwner { Pool pool = _getPool(_poolId); pool.setFee(_mintFeeBP); } function setFeeLibrary(uint256 _poolId, address _feeLibraryAddr) external onlyOwner { Pool pool = _getPool(_poolId); pool.setFeeLibrary(_feeLibraryAddr); } function setSwapStop(uint256 _poolId, bool _swapStop) external onlyOwner { Pool pool = _getPool(_poolId); pool.setSwapStop(_swapStop); } function setDeltaParam( uint256 _poolId, bool _batched, uint256 _swapDeltaBP, uint256 _lpDeltaBP, bool _defaultSwapMode, bool _defaultLPMode ) external onlyOwner { Pool pool = _getPool(_poolId); pool.setDeltaParam(_batched, _swapDeltaBP, _lpDeltaBP, _defaultSwapMode, _defaultLPMode); } function callDelta(uint256 _poolId, bool _fullMode) external { Pool pool = _getPool(_poolId); pool.callDelta(_fullMode); } function withdrawMintFee(uint256 _poolId, address _to) external { require(mintFeeOwner == msg.sender, "Stargate: only mintFeeOwner"); Pool pool = _getPool(_poolId); pool.withdrawMintFeeBalance(_to); } function withdrawProtocolFee(uint256 _poolId, address _to) external { require(protocolFeeOwner == msg.sender, "Stargate: only protocolFeeOwner"); Pool pool = _getPool(_poolId); pool.withdrawProtocolFeeBalance(_to); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_layerZeroEndpoint","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"uint8","name":"msgType","type":"uint8"},{"indexed":false,"internalType":"uint64","name":"nonce","type":"uint64"}],"name":"SendMsg","type":"event"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approveTokenSpender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"bridgeLookup","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"}],"name":"forceResumeReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"gasLookup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"layerZeroEndpoint","outputs":[{"internalType":"contract ILayerZeroEndpoint","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_srcChainId","type":"uint16"},{"internalType":"bytes","name":"_srcAddress","type":"bytes"},{"internalType":"uint64","name":"_nonce","type":"uint64"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"lzReceive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint8","name":"_functionType","type":"uint8"},{"internalType":"bytes","name":"_toAddress","type":"bytes"},{"internalType":"bytes","name":"_transferAndCallPayload","type":"bytes"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"quoteLayerZeroFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"},{"internalType":"uint256","name":"_amountSD","type":"uint256"},{"internalType":"bytes","name":"_to","type":"bytes"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"}],"name":"redeemLocal","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"redeemLocalCallback","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"}],"name":"sendCredits","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"bytes","name":"_bridgeAddress","type":"bytes"}],"name":"setBridge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_version","type":"uint16"},{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_configType","type":"uint256"},{"internalType":"bytes","name":"_config","type":"bytes"}],"name":"setConfig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint8","name":"_functionType","type":"uint8"},{"internalType":"uint256","name":"_gasAmount","type":"uint256"}],"name":"setGasAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setReceiveVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"version","type":"uint16"}],"name":"setSendVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enable","type":"bool"}],"name":"setUseLayerZeroToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_chainId","type":"uint16"},{"internalType":"uint256","name":"_srcPoolId","type":"uint256"},{"internalType":"uint256","name":"_dstPoolId","type":"uint256"},{"internalType":"address payable","name":"_refundAddress","type":"address"},{"components":[{"internalType":"uint256","name":"credits","type":"uint256"},{"internalType":"uint256","name":"idealBalance","type":"uint256"}],"internalType":"struct Pool.CreditObj","name":"_c","type":"tuple"},{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"eqFee","type":"uint256"},{"internalType":"uint256","name":"eqReward","type":"uint256"},{"internalType":"uint256","name":"lpFee","type":"uint256"},{"internalType":"uint256","name":"protocolFee","type":"uint256"},{"internalType":"uint256","name":"lkbRemove","type":"uint256"}],"internalType":"struct Pool.SwapObj","name":"_s","type":"tuple"},{"components":[{"internalType":"uint256","name":"dstGasForCall","type":"uint256"},{"internalType":"uint256","name":"dstNativeAmount","type":"uint256"},{"internalType":"bytes","name":"dstNativeAddr","type":"bytes"}],"internalType":"struct IStargateRouter.lzTxObj","name":"_lzTxParams","type":"tuple"},{"internalType":"bytes","name":"_to","type":"bytes"},{"internalType":"bytes","name":"_payload","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"useLayerZeroToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620031d3380380620031d3833981016040819052620000349162000125565b60006200004062000104565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160a01b038216620000bc5760405162461bcd60e51b8152600401620000b39062000193565b60405180910390fd5b6001600160a01b038116620000e55760405162461bcd60e51b8152600401620000b3906200015c565b6001600160601b0319606092831b8116608052911b1660a052620001dd565b3390565b80516001600160a01b03811681146200012057600080fd5b919050565b6000806040838503121562000138578182fd5b620001438362000108565b9150620001536020840162000108565b90509250929050565b6020808252601f908201527f53746172676174653a205f726f757465722063616e6e6f742062652030783000604082015260600190565b6020808252602a908201527f53746172676174653a205f6c617965725a65726f456e64706f696e742063616e60408201526906e6f74206265203078360b41b606082015260800190565b60805160601c60a05160601c612f6d62000266600039806104ff5280610583528061064a528061071552806107ac528061086452806108fb5280610d795280610fbf5280611172528061122d52806116285250806103e6528061099c5280610a375280610bfd5280610d395280610e7a52806113cc52806117ad52806118795250612f6d6000f3fe6080604052600436106101345760003560e01c80638c7ae0fc116100ab578063c213dc2b1161006f578063c213dc2b14610326578063cbed8b9c14610346578063d7d3c3b914610366578063f2fde38b14610386578063f887ea40146103a6578063fc869108146103bb57610134565b80638c7ae0fc1461029c5780638da5cb5b146102be5780638e3b5d6a146102d357806396aae4af14610300578063be9d40ac1461031357610134565b806310ddb137116100fd57806310ddb137146102015780633cef94b91461022157806342d65a8d1461023457806343b180091461025457806351156e7314610274578063715018a61461028757610134565b80621d356714610139578063024220541461015b57806307968db11461019157806307e0db17146101b35780630a512369146101d3575b600080fd5b34801561014557600080fd5b50610159610154366004611e98565b6103db565b005b34801561016757600080fd5b5061017b61017636600461218e565b61097d565b6040516101889190612be6565b60405180910390f35b34801561019d57600080fd5b506101a661099a565b6040516101889190612705565b3480156101bf57600080fd5b506101596101ce366004611d99565b6109be565b3480156101df57600080fd5b506101f36101ee3660046121c4565b610a9a565b604051610188929190612bef565b34801561020d57600080fd5b5061015961021c366004611d99565b610cc0565b61015961022f3660046120d6565b610d6e565b34801561024057600080fd5b5061015961024f366004611e48565b610e01565b34801561026057600080fd5b5061015961026f366004611e48565b610eea565b610159610282366004611fe2565b610fb4565b34801561029357600080fd5b50610159611051565b3480156102a857600080fd5b506102b16110b5565b6040516101889190612732565b3480156102ca57600080fd5b506101a66110be565b3480156102df57600080fd5b506102f36102ee366004611d99565b6110cd565b604051610188919061273d565b61015961030e366004611db3565b611167565b610159610321366004611f89565b611222565b34801561033257600080fd5b50610159610341366004611d61565b6112de565b34801561035257600080fd5b50610159610361366004611f1d565b611353565b34801561037257600080fd5b50610159610381366004611d21565b611442565b34801561039257600080fd5b506101596103a1366004611d05565b611524565b3480156103b257600080fd5b506101a6611626565b3480156103c757600080fd5b506101596103d6366004612276565b61164a565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461042c5760405162461bcd60e51b815260040161042390612787565b60405180910390fd5b600160008561ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490508351148015610499575061ffff8416600090815260016020526040908190209051610487919061263a565b60405180910390208380519060200120145b6104b55760405162461bcd60e51b815260040161042390612812565b602081015160ff81166001141561061c576000806000806000806000888060200190518101906104e5919061241e565b9750975097509750975097509750506000601483015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048e8a8a896040518563ffffffff1660e01b815260040161054f9493929190612bc0565b600060405180830381600087803b15801561056957600080fd5b505af115801561057d573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632f9255558e8e8e8c8c8c888c8b6040518a63ffffffff1660e01b81526004016105dd999897969594939291906129cb565b600060405180830381600087803b1580156105f757600080fd5b505af115801561060b573d6000803e3d6000fd5b505050505050505050505050610976565b60ff8116600214156106d45760008060008480602001905181019061064191906122e2565b935093509350507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa804898585856040518563ffffffff1660e01b815260040161069a9493929190612bc0565b600060405180830381600087803b1580156106b457600080fd5b505af11580156106c8573d6000803e3d6000fd5b50505050505050610976565b60ff81166003141561082f57600080600080600080878060200190518101906106fd91906123a6565b965096509650965096509650506000601482015190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048d8989896040518563ffffffff1660e01b81526004016107659493929190612bc0565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b5050604051630fee425360e31b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250637f72129891506107f1908f908f908f908d908d9089908d908d90600401612968565b600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050505050505050610976565b60ff81166004141561097657600080600080600086806020019051810190610857919061232b565b95509550955095509550507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a18fa8048b8787876040518563ffffffff1660e01b81526004016108b49493929190612bc0565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050604051630403bce560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250630403bce5915061093e908d908d908d908b908b908a908a90600401612a4e565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505050505050505b5050505050565b600260209081526000928352604080842090915290825290205481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6109c6611705565b6001600160a01b03166109d76110be565b6001600160a01b031614610a20576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516307e0db1760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906307e0db1790610a6c9084906004016128c1565b600060405180830381600087803b158015610a8657600080fd5b505af1158015610976573d6000803e3d6000fd5b60408051602080820183526000808352835180850190945260018085529184018290529283929160ff8b161415610b3f5760006040518060c001604052806001815260200160018152602001600181526020016001815260200160018152602001600181525090506001600080600085858f8f8f8f604051602001610b289a99989796959493929190612bfd565b604051602081830303815290604052925050610bec565b60ff8a1660021415610b7a57600260008083604051602001610b649493929190612c78565b6040516020818303038152906040529150610bec565b60ff8a1660031415610ba8576003600080836000808e8e604051602001610b64989796959493929190612ce4565b60ff8a1660041415610bd45760046000808360008d8d604051602001610b649796959493929190612c9f565b60405162461bcd60e51b815260040161042390612849565b6000610bf98c8c88611709565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166340a7bb108d3086600360009054906101000a900460ff16866040518663ffffffff1660e01b8152600401610c5e9594939291906128ed565b604080518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906122a3565b9450945050505097509795505050505050565b610cc8611705565b6001600160a01b0316610cd96110be565b6001600160a01b031614610d22576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516310ddb13760e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906310ddb13790610a6c9084906004016128c1565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610db65760405162461bcd60e51b81526004016104239061288c565b60006004898988888888604051602001610dd69796959493929190612d67565b6040516020818303038152906040529050610df58a600489858561179a565b50505050505050505050565b610e09611705565b6001600160a01b0316610e1a6110be565b6001600160a01b031614610e63576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516342d65a8d60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906342d65a8d90610eb390869086908690600401612941565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b610ef2611705565b6001600160a01b0316610f036110be565b6001600160a01b031614610f4c576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b61ffff83166000908152600160208190526040909120546002918116156101000260001901160415610f905760405162461bcd60e51b815260040161042390612750565b61ffff83166000908152600160205260409020610fae9083836119f4565b50505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ffc5760405162461bcd60e51b81526004016104239061288c565b8451604051600091611024916001918e918e91908d908d908c908c908c908c90602001612de5565b60405160208183030381529060405290506110438c60018b898561179a565b505050505050505050505050565b611059611705565b6001600160a01b031661106a6110be565b6001600160a01b0316146110b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b565b60035460ff1681565b6000546001600160a01b031690565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835291929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b505050505081565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146111af5760405162461bcd60e51b81526004016104239061288c565b60606000806000806000868060200190518101906111cd9190612533565b9550955095509550955050600384868b8686866040516020016111f69796959493929190612da3565b6040516020818303038152906040529550505050505061121a86600387868561179a565b505050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461126a5760405162461bcd60e51b81526004016104239061288c565b600060028585846040516020016112849493929190612d42565b604051602081830303815290604052905060006040518060600160405280600081526020016000815260200160405180604001604052806002815260200161060f60f31b8152508152509050610ee187600286848661179a565b6112e6611705565b6001600160a01b03166112f76110be565b6001600160a01b031614611340576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b61135b611705565b6001600160a01b031661136c6110be565b6001600160a01b0316146113b5576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063cbed8b9c906114099088908890889088908890600401612b87565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050505050505050565b61144a611705565b6001600160a01b031661145b6110be565b6001600160a01b0316146114a4576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b3906114d29085908590600401612719565b602060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190611d7d565b61152c611705565b6001600160a01b031661153d6110be565b6001600160a01b031614611586576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6001600160a01b0381166115cb5760405162461bcd60e51b8152600401808060200182810382526026815260200180612ef26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b611652611705565b6001600160a01b03166116636110be565b6001600160a01b0316146116ac576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b60018260ff16101580156116c4575060048260ff1611155b6116e05760405162461bcd60e51b8152600401610423906127db565b61ffff909216600090815260026020908152604080832060ff90941683529290522055565b3390565b60408082015160140151825161ffff861660009081526002602090815284822060ff8816835290529283205460609384939290916117469161192c565b90506000856020015111801561176457506001600160a01b03821615155b156117835761177c818660200151876040015161198d565b925061178f565b61178c816119c3565b92505b509095945050505050565b60006117a7868685611709565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637a14574888306040518363ffffffff1660e01b81526004016117f99291906128d0565b60206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184991906122c6565b61ffff8816600090815260016020819052604091829020915162c5803160e81b8152920192506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163c58031009134916118b8918c9189908c9030908b90600401612aac565b6000604051808303818588803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050507f8d3ee0df6a4b7e82a7f20a763f1c6826e6176323e655af64f32318827d2112d4868260405161191b929190612e0f565b60405180910390a150505050505050565b600082820183811015611986576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6040516060906002906119aa9082908790879087906020016126c7565b6040516020818303038152906040529150509392505050565b6040516060906001906119dc90829085906020016126aa565b6040516020818303038152906040529150505b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611a2a5760008555611a70565b82601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611a80565b5090565b5b80821115611a7c5760008155600101611a81565b80356119ef81612ea7565b60008083601f840112611ab1578182fd5b5081356001600160401b03811115611ac7578182fd5b602083019150836020828501011115611adf57600080fd5b9250929050565b600082601f830112611af6578081fd5b8135611b09611b0482612e4e565b612e2b565b818152846020838601011115611b1d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611b47578081fd5b8151611b55611b0482612e4e565b818152846020838601011115611b69578283fd5b611b7a826020830160208701612e7b565b949350505050565b600060408284031215611b93578081fd5b604051604081018181106001600160401b0382111715611baf57fe5b604052823581526020928301359281019290925250919050565b600060408284031215611bda578081fd5b604051604081018181106001600160401b0382111715611bf657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611c21578081fd5b60405160c081018181106001600160401b0382111715611c3d57fe5b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b600060608284031215611c93578081fd5b604051606081016001600160401b038282108183111715611cb057fe5b8160405282935084358352602085013560208401526040850135915080821115611cd957600080fd5b50611ce685828601611ae6565b6040830152505092915050565b803561ffff811681146119ef57600080fd5b600060208284031215611d16578081fd5b813561198681612ea7565b600080600060608486031215611d35578182fd5b8335611d4081612ea7565b92506020840135611d5081612ea7565b929592945050506040919091013590565b600060208284031215611d72578081fd5b813561198681612ebf565b600060208284031215611d8e578081fd5b815161198681612ebf565b600060208284031215611daa578081fd5b61198682611cf3565b600080600080600060c08688031215611dca578283fd5b611dd386611cf3565b94506020860135611de381612ea7565b9350611df28760408801611b82565b925060808601356001600160401b0380821115611e0d578283fd5b611e1989838a01611c82565b935060a0880135915080821115611e2e578283fd5b50611e3b88828901611ae6565b9150509295509295909350565b600080600060408486031215611e5c578081fd5b611e6584611cf3565b925060208401356001600160401b03811115611e7f578182fd5b611e8b86828701611aa0565b9497909650939450505050565b60008060008060808587031215611ead578182fd5b611eb685611cf3565b935060208501356001600160401b0380821115611ed1578384fd5b611edd88838901611ae6565b945060408701359150611eef82612ecd565b90925060608601359080821115611f04578283fd5b50611f1187828801611ae6565b91505092959194509250565b600080600080600060808688031215611f34578283fd5b611f3d86611cf3565b9450611f4b60208701611cf3565b93506040860135925060608601356001600160401b03811115611f6c578182fd5b611f7888828901611aa0565b969995985093965092949392505050565b600080600080600060c08688031215611fa0578283fd5b611fa986611cf3565b945060208601359350604086013592506060860135611fc781612ea7565b9150611fd68760808801611b82565b90509295509295909350565b60008060008060008060008060008060006101e08c8e031215612003578889fd5b61200c8c611cf3565b9a5060208c0135995060408c0135985061202860608d01611a95565b97506120378d60808e01611b82565b96506120468d60c08e01611c10565b95506001600160401b03806101808e01351115612061578586fd5b6120728e6101808f01358f01611c82565b9550806101a08e01351115612085578485fd5b6120968e6101a08f01358f01611aa0565b90955093506101c08d01358110156120ac578283fd5b506120be8d6101c08e01358e01611aa0565b81935080925050509295989b509295989b9093969950565b60008060008060008060008060006101208a8c0312156120f4578283fd5b6120fd8a611cf3565b985060208a0135975060408a0135965060608a013561211b81612ea7565b955061212a8b60808c01611b82565b945060c08a0135935060e08a01356001600160401b038082111561214c578485fd5b6121588d838e01611aa0565b90955093506101008c0135915080821115612171578283fd5b5061217e8c828d01611c82565b9150509295985092959850929598565b600080604083850312156121a0578182fd5b6121a983611cf3565b915060208301356121b981612ee2565b809150509250929050565b600080600080600080600060a0888a0312156121de578081fd5b6121e788611cf3565b965060208801356121f781612ee2565b955060408801356001600160401b0380821115612212578283fd5b61221e8b838c01611aa0565b909750955060608a0135915080821115612236578283fd5b6122428b838c01611aa0565b909550935060808a013591508082111561225a578283fd5b506122678a828b01611c82565b91505092959891949750929550565b60008060006060848603121561228a578081fd5b61229384611cf3565b92506020840135611d5081612ee2565b600080604083850312156122b5578182fd5b505080516020909101519092909150565b6000602082840312156122d7578081fd5b815161198681612ecd565b60008060008060a085870312156122f7578182fd5b845161230281612ee2565b60208601516040870151919550935091506123208660608701611bc9565b905092959194509250565b60008060008060008060e08789031215612343578384fd5b865161234e81612ee2565b602088015160408901519197509550935061236c8860608901611bc9565b925060a0870151915060c08701516001600160401b0381111561238d578182fd5b61239989828a01611b37565b9150509295509295509295565b6000806000806000806000610100888a0312156123c1578081fd5b87516123cc81612ee2565b602089015160408a0151919850965094506123ea8960608a01611bc9565b935060a0880151925060c0880151915060e08801516001600160401b03811115612412578182fd5b6122678a828b01611b37565b600080600080600080600080888a036101c081121561243b578283fd5b895161244681612ee2565b8099505060208a0151975060408a0151965060608a0151955061246c8b60808c01611bc9565b945060c060bf198201121561247f578283fd5b5060405160c081016001600160401b03828210818311171561249d57fe5b604082815260c08d0151845260e08d015160208501526101008d0151908401526101208c015160608401526101408c015160808401526101608c015160a08401526101808c0151929550808311156124f3578485fd5b6124ff8d848e01611b37565b94506101a08c0151925080831115612515578384fd5b50506125238b828c01611b37565b9150509295985092959890939650565b60008060008060008060c0878903121561254b578384fd5b865161255681612ee2565b809650506020870151945060408701519350606087015192506080870151915060a08701516001600160401b0381111561238d578182fd5b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526125dd816020860160208601612e7b565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600080835460018082166000811461265957600181146126705761269f565b60ff198316865260028304607f168601935061269f565b600283048786526020808720875b838110156126975781548a82015290850190820161267e565b505050860193505b509195945050505050565b60f09290921b6001600160f01b0319168252600282015260220190565b600061ffff60f01b8660f01b16825284600283015283602283015282516126f5816042850160208701612e7b565b9190910160420195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261198660208301846125c5565b6020808252601d908201527f53746172676174653a2042726964676520616c72656164792073657421000000604082015260600190565b60208082526034908201527f53746172676174653a206f6e6c79204c617965725a65726f20656e64706f696e604082015273742063616e2063616c6c206c7a5265636569766560601b606082015260800190565b6020808252601f908201527f53746172676174653a20696e76616c6964205f66756e6374696f6e5479706500604082015260600190565b6020808252601f908201527f53746172676174653a2062726964676520646f6573206e6f74206d6174636800604082015260600190565b60208082526023908201527f53746172676174653a20756e737570706f727465642066756e6374696f6e207460408201526279706560e81b606082015260800190565b6020808252818101527f53746172676174653a2063616c6c6572206d75737420626520526f757465722e604082015260600190565b61ffff91909116815260200190565b61ffff9290921682526001600160a01b0316602082015260400190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061291b908301866125c5565b8415156060840152828103608084015261293581856125c5565b98975050505050505050565b600061ffff851682526040602083015261295f60408301848661259b565b95945050505050565b600061010061ffff8b1683528060208401526129868184018b6125c5565b6001600160401b039990991660408401525050606081019590955260808501939093526001600160a01b039190911660a084015260c083015260e09091015292915050565b60006101c061ffff8c1683528060208401526129e98184018c6125c5565b6001600160401b038b166040850152606084018a90526080840189905260a084018890526001600160a01b03871660c08501529050612a2b60e0840186612600565b8281036101a0840152612a3e81856125c5565b9c9b505050505050505050505050565b600061ffff8916825260e06020830152612a6b60e08301896125c5565b6001600160401b03881660408401528660608401528560808401528460a084015282810360c0840152612a9e81856125c5565b9a9950505050505050505050565b600060c0820161ffff89168352602060c081850152828954600180821660008114612ade5760018114612afd57612b35565b60028304607f16865260ff19831660e089015261010088019350612b35565b60028304808752612b0d8e612e6f565b885b82811015612b2b5781548b820160e00152908401908701612b0f565b8a0160e001955050505b5050508481036040860152612b4a818a6125c5565b92505050612b5b606084018761258e565b612b68608084018661258e565b82810360a0840152612b7a81856125c5565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612bb560808301848661259b565b979650505050505050565b61ffff85168152602081018490526040810183905260a0810161295f60608301846125f1565b90815260200190565b918252602082015260400190565b60006101c060ff8d16835260ff8c16602084015260ff8b16604084015260ff8a166060840152612c30608084018a6125f1565b612c3d60c0840189612600565b80610180840152612c51818401878961259b565b90508281036101a0840152612c6781858761259b565b9d9c50505050505050505050505050565b60ff858116825284811660208301528316604082015260a0810161295f60608301846125f1565b600060ff8916825260ff8816602083015260ff87166040830152612cc660608301876125f1565b60ff851660a083015260e060c0830152612b7a60e08301848661259b565b600061010060ff8b16835260ff8a16602084015260ff89166040840152612d0e60608401896125f1565b60ff871660a084015260ff861660c08401528060e0840152612d33818401858761259b565b9b9a5050505050505050505050565b60ff85168152602081018490526040810183905260a0810161295f60608301846125f1565b600060ff89168252876020830152866040830152612d8860608301876125f1565b8460a083015260e060c0830152612b7a60e08301848661259b565b600061010060ff8a168352886020840152876040840152612dc760608401886125f1565b8560a08401528460c08401528060e0840152612a9e818401856125c5565b60006101c060ff8d1683528b60208401528a6040840152896060840152612c30608084018a6125f1565b60ff9290921682526001600160401b0316602082015260400190565b6040518181016001600160401b0381118282101715612e4657fe5b604052919050565b60006001600160401b03821115612e6157fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015612e96578181015183820152602001612e7e565b83811115610fae5750506000910152565b6001600160a01b0381168114612ebc57600080fd5b50565b8015158114612ebc57600080fd5b6001600160401b0381168114612ebc57600080fd5b60ff81168114612ebc57600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122074965d55741e5ec229cb2b28e91d0ded45a666403b01fd551b67baeabfdbc7ed64736f6c634300070600330000000000000000000000003c2269811836af69497e5f486a85d7316753cf6200000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd
Deployed Bytecode
0x6080604052600436106101345760003560e01c80638c7ae0fc116100ab578063c213dc2b1161006f578063c213dc2b14610326578063cbed8b9c14610346578063d7d3c3b914610366578063f2fde38b14610386578063f887ea40146103a6578063fc869108146103bb57610134565b80638c7ae0fc1461029c5780638da5cb5b146102be5780638e3b5d6a146102d357806396aae4af14610300578063be9d40ac1461031357610134565b806310ddb137116100fd57806310ddb137146102015780633cef94b91461022157806342d65a8d1461023457806343b180091461025457806351156e7314610274578063715018a61461028757610134565b80621d356714610139578063024220541461015b57806307968db11461019157806307e0db17146101b35780630a512369146101d3575b600080fd5b34801561014557600080fd5b50610159610154366004611e98565b6103db565b005b34801561016757600080fd5b5061017b61017636600461218e565b61097d565b6040516101889190612be6565b60405180910390f35b34801561019d57600080fd5b506101a661099a565b6040516101889190612705565b3480156101bf57600080fd5b506101596101ce366004611d99565b6109be565b3480156101df57600080fd5b506101f36101ee3660046121c4565b610a9a565b604051610188929190612bef565b34801561020d57600080fd5b5061015961021c366004611d99565b610cc0565b61015961022f3660046120d6565b610d6e565b34801561024057600080fd5b5061015961024f366004611e48565b610e01565b34801561026057600080fd5b5061015961026f366004611e48565b610eea565b610159610282366004611fe2565b610fb4565b34801561029357600080fd5b50610159611051565b3480156102a857600080fd5b506102b16110b5565b6040516101889190612732565b3480156102ca57600080fd5b506101a66110be565b3480156102df57600080fd5b506102f36102ee366004611d99565b6110cd565b604051610188919061273d565b61015961030e366004611db3565b611167565b610159610321366004611f89565b611222565b34801561033257600080fd5b50610159610341366004611d61565b6112de565b34801561035257600080fd5b50610159610361366004611f1d565b611353565b34801561037257600080fd5b50610159610381366004611d21565b611442565b34801561039257600080fd5b506101596103a1366004611d05565b611524565b3480156103b257600080fd5b506101a6611626565b3480156103c757600080fd5b506101596103d6366004612276565b61164a565b336001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62161461042c5760405162461bcd60e51b815260040161042390612787565b60405180910390fd5b600160008561ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490508351148015610499575061ffff8416600090815260016020526040908190209051610487919061263a565b60405180910390208380519060200120145b6104b55760405162461bcd60e51b815260040161042390612812565b602081015160ff81166001141561061c576000806000806000806000888060200190518101906104e5919061241e565b9750975097509750975097509750506000601483015190507f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd6001600160a01b031663a18fa8048e8a8a896040518563ffffffff1660e01b815260040161054f9493929190612bc0565b600060405180830381600087803b15801561056957600080fd5b505af115801561057d573d6000803e3d6000fd5b505050507f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd6001600160a01b0316632f9255558e8e8e8c8c8c888c8b6040518a63ffffffff1660e01b81526004016105dd999897969594939291906129cb565b600060405180830381600087803b1580156105f757600080fd5b505af115801561060b573d6000803e3d6000fd5b505050505050505050505050610976565b60ff8116600214156106d45760008060008480602001905181019061064191906122e2565b935093509350507f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd6001600160a01b031663a18fa804898585856040518563ffffffff1660e01b815260040161069a9493929190612bc0565b600060405180830381600087803b1580156106b457600080fd5b505af11580156106c8573d6000803e3d6000fd5b50505050505050610976565b60ff81166003141561082f57600080600080600080878060200190518101906106fd91906123a6565b965096509650965096509650506000601482015190507f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd6001600160a01b031663a18fa8048d8989896040518563ffffffff1660e01b81526004016107659493929190612bc0565b600060405180830381600087803b15801561077f57600080fd5b505af1158015610793573d6000803e3d6000fd5b5050604051630fee425360e31b81526001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd169250637f72129891506107f1908f908f908f908d908d9089908d908d90600401612968565b600060405180830381600087803b15801561080b57600080fd5b505af115801561081f573d6000803e3d6000fd5b5050505050505050505050610976565b60ff81166004141561097657600080600080600086806020019051810190610857919061232b565b95509550955095509550507f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd6001600160a01b031663a18fa8048b8787876040518563ffffffff1660e01b81526004016108b49493929190612bc0565b600060405180830381600087803b1580156108ce57600080fd5b505af11580156108e2573d6000803e3d6000fd5b5050604051630403bce560e01b81526001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd169250630403bce5915061093e908d908d908d908b908b908a908a90600401612a4e565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505050505050505b5050505050565b600260209081526000928352604080842090915290825290205481565b7f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6281565b6109c6611705565b6001600160a01b03166109d76110be565b6001600160a01b031614610a20576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516307e0db1760e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906307e0db1790610a6c9084906004016128c1565b600060405180830381600087803b158015610a8657600080fd5b505af1158015610976573d6000803e3d6000fd5b60408051602080820183526000808352835180850190945260018085529184018290529283929160ff8b161415610b3f5760006040518060c001604052806001815260200160018152602001600181526020016001815260200160018152602001600181525090506001600080600085858f8f8f8f604051602001610b289a99989796959493929190612bfd565b604051602081830303815290604052925050610bec565b60ff8a1660021415610b7a57600260008083604051602001610b649493929190612c78565b6040516020818303038152906040529150610bec565b60ff8a1660031415610ba8576003600080836000808e8e604051602001610b64989796959493929190612ce4565b60ff8a1660041415610bd45760046000808360008d8d604051602001610b649796959493929190612c9f565b60405162461bcd60e51b815260040161042390612849565b6000610bf98c8c88611709565b90507f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b03166340a7bb108d3086600360009054906101000a900460ff16866040518663ffffffff1660e01b8152600401610c5e9594939291906128ed565b604080518083038186803b158015610c7557600080fd5b505afa158015610c89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cad91906122a3565b9450945050505097509795505050505050565b610cc8611705565b6001600160a01b0316610cd96110be565b6001600160a01b031614610d22576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516310ddb13760e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906310ddb13790610a6c9084906004016128c1565b336001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd1614610db65760405162461bcd60e51b81526004016104239061288c565b60006004898988888888604051602001610dd69796959493929190612d67565b6040516020818303038152906040529050610df58a600489858561179a565b50505050505050505050565b610e09611705565b6001600160a01b0316610e1a6110be565b6001600160a01b031614610e63576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516342d65a8d60e01b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6216906342d65a8d90610eb390869086908690600401612941565b600060405180830381600087803b158015610ecd57600080fd5b505af1158015610ee1573d6000803e3d6000fd5b50505050505050565b610ef2611705565b6001600160a01b0316610f036110be565b6001600160a01b031614610f4c576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b61ffff83166000908152600160208190526040909120546002918116156101000260001901160415610f905760405162461bcd60e51b815260040161042390612750565b61ffff83166000908152600160205260409020610fae9083836119f4565b50505050565b336001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd1614610ffc5760405162461bcd60e51b81526004016104239061288c565b8451604051600091611024916001918e918e91908d908d908c908c908c908c90602001612de5565b60405160208183030381529060405290506110438c60018b898561179a565b505050505050505050505050565b611059611705565b6001600160a01b031661106a6110be565b6001600160a01b0316146110b3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b565b60035460ff1681565b6000546001600160a01b031690565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835291929083018282801561115f5780601f106111345761010080835404028352916020019161115f565b820191906000526020600020905b81548152906001019060200180831161114257829003601f168201915b505050505081565b336001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd16146111af5760405162461bcd60e51b81526004016104239061288c565b60606000806000806000868060200190518101906111cd9190612533565b9550955095509550955050600384868b8686866040516020016111f69796959493929190612da3565b6040516020818303038152906040529550505050505061121a86600387868561179a565b505050505050565b336001600160a01b037f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd161461126a5760405162461bcd60e51b81526004016104239061288c565b600060028585846040516020016112849493929190612d42565b604051602081830303815290604052905060006040518060600160405280600081526020016000815260200160405180604001604052806002815260200161060f60f31b8152508152509050610ee187600286848661179a565b6112e6611705565b6001600160a01b03166112f76110be565b6001600160a01b031614611340576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6003805460ff1916911515919091179055565b61135b611705565b6001600160a01b031661136c6110be565b6001600160a01b0316146113b5576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6040516332fb62e760e21b81526001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169063cbed8b9c906114099088908890889088908890600401612b87565b600060405180830381600087803b15801561142357600080fd5b505af1158015611437573d6000803e3d6000fd5b505050505050505050565b61144a611705565b6001600160a01b031661145b6110be565b6001600160a01b0316146114a4576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b60405163095ea7b360e01b81526001600160a01b0384169063095ea7b3906114d29085908590600401612719565b602060405180830381600087803b1580156114ec57600080fd5b505af1158015611500573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fae9190611d7d565b61152c611705565b6001600160a01b031661153d6110be565b6001600160a01b031614611586576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b6001600160a01b0381166115cb5760405162461bcd60e51b8152600401808060200182810382526026815260200180612ef26026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b7f00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd81565b611652611705565b6001600160a01b03166116636110be565b6001600160a01b0316146116ac576040805162461bcd60e51b81526020600482018190526024820152600080516020612f18833981519152604482015290519081900360640190fd5b60018260ff16101580156116c4575060048260ff1611155b6116e05760405162461bcd60e51b8152600401610423906127db565b61ffff909216600090815260026020908152604080832060ff90941683529290522055565b3390565b60408082015160140151825161ffff861660009081526002602090815284822060ff8816835290529283205460609384939290916117469161192c565b90506000856020015111801561176457506001600160a01b03821615155b156117835761177c818660200151876040015161198d565b925061178f565b61178c816119c3565b92505b509095945050505050565b60006117a7868685611709565b905060007f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf626001600160a01b0316637a14574888306040518363ffffffff1660e01b81526004016117f99291906128d0565b60206040518083038186803b15801561181157600080fd5b505afa158015611825573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184991906122c6565b61ffff8816600090815260016020819052604091829020915162c5803160e81b8152920192506001600160a01b037f0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62169163c58031009134916118b8918c9189908c9030908b90600401612aac565b6000604051808303818588803b1580156118d157600080fd5b505af11580156118e5573d6000803e3d6000fd5b50505050507f8d3ee0df6a4b7e82a7f20a763f1c6826e6176323e655af64f32318827d2112d4868260405161191b929190612e0f565b60405180910390a150505050505050565b600082820183811015611986576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6040516060906002906119aa9082908790879087906020016126c7565b6040516020818303038152906040529150509392505050565b6040516060906001906119dc90829085906020016126aa565b6040516020818303038152906040529150505b919050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282611a2a5760008555611a70565b82601f10611a435782800160ff19823516178555611a70565b82800160010185558215611a70579182015b82811115611a70578235825591602001919060010190611a55565b50611a7c929150611a80565b5090565b5b80821115611a7c5760008155600101611a81565b80356119ef81612ea7565b60008083601f840112611ab1578182fd5b5081356001600160401b03811115611ac7578182fd5b602083019150836020828501011115611adf57600080fd5b9250929050565b600082601f830112611af6578081fd5b8135611b09611b0482612e4e565b612e2b565b818152846020838601011115611b1d578283fd5b816020850160208301379081016020019190915292915050565b600082601f830112611b47578081fd5b8151611b55611b0482612e4e565b818152846020838601011115611b69578283fd5b611b7a826020830160208701612e7b565b949350505050565b600060408284031215611b93578081fd5b604051604081018181106001600160401b0382111715611baf57fe5b604052823581526020928301359281019290925250919050565b600060408284031215611bda578081fd5b604051604081018181106001600160401b0382111715611bf657fe5b604052825181526020928301519281019290925250919050565b600060c08284031215611c21578081fd5b60405160c081018181106001600160401b0382111715611c3d57fe5b8060405250809150823581526020830135602082015260408301356040820152606083013560608201526080830135608082015260a083013560a08201525092915050565b600060608284031215611c93578081fd5b604051606081016001600160401b038282108183111715611cb057fe5b8160405282935084358352602085013560208401526040850135915080821115611cd957600080fd5b50611ce685828601611ae6565b6040830152505092915050565b803561ffff811681146119ef57600080fd5b600060208284031215611d16578081fd5b813561198681612ea7565b600080600060608486031215611d35578182fd5b8335611d4081612ea7565b92506020840135611d5081612ea7565b929592945050506040919091013590565b600060208284031215611d72578081fd5b813561198681612ebf565b600060208284031215611d8e578081fd5b815161198681612ebf565b600060208284031215611daa578081fd5b61198682611cf3565b600080600080600060c08688031215611dca578283fd5b611dd386611cf3565b94506020860135611de381612ea7565b9350611df28760408801611b82565b925060808601356001600160401b0380821115611e0d578283fd5b611e1989838a01611c82565b935060a0880135915080821115611e2e578283fd5b50611e3b88828901611ae6565b9150509295509295909350565b600080600060408486031215611e5c578081fd5b611e6584611cf3565b925060208401356001600160401b03811115611e7f578182fd5b611e8b86828701611aa0565b9497909650939450505050565b60008060008060808587031215611ead578182fd5b611eb685611cf3565b935060208501356001600160401b0380821115611ed1578384fd5b611edd88838901611ae6565b945060408701359150611eef82612ecd565b90925060608601359080821115611f04578283fd5b50611f1187828801611ae6565b91505092959194509250565b600080600080600060808688031215611f34578283fd5b611f3d86611cf3565b9450611f4b60208701611cf3565b93506040860135925060608601356001600160401b03811115611f6c578182fd5b611f7888828901611aa0565b969995985093965092949392505050565b600080600080600060c08688031215611fa0578283fd5b611fa986611cf3565b945060208601359350604086013592506060860135611fc781612ea7565b9150611fd68760808801611b82565b90509295509295909350565b60008060008060008060008060008060006101e08c8e031215612003578889fd5b61200c8c611cf3565b9a5060208c0135995060408c0135985061202860608d01611a95565b97506120378d60808e01611b82565b96506120468d60c08e01611c10565b95506001600160401b03806101808e01351115612061578586fd5b6120728e6101808f01358f01611c82565b9550806101a08e01351115612085578485fd5b6120968e6101a08f01358f01611aa0565b90955093506101c08d01358110156120ac578283fd5b506120be8d6101c08e01358e01611aa0565b81935080925050509295989b509295989b9093969950565b60008060008060008060008060006101208a8c0312156120f4578283fd5b6120fd8a611cf3565b985060208a0135975060408a0135965060608a013561211b81612ea7565b955061212a8b60808c01611b82565b945060c08a0135935060e08a01356001600160401b038082111561214c578485fd5b6121588d838e01611aa0565b90955093506101008c0135915080821115612171578283fd5b5061217e8c828d01611c82565b9150509295985092959850929598565b600080604083850312156121a0578182fd5b6121a983611cf3565b915060208301356121b981612ee2565b809150509250929050565b600080600080600080600060a0888a0312156121de578081fd5b6121e788611cf3565b965060208801356121f781612ee2565b955060408801356001600160401b0380821115612212578283fd5b61221e8b838c01611aa0565b909750955060608a0135915080821115612236578283fd5b6122428b838c01611aa0565b909550935060808a013591508082111561225a578283fd5b506122678a828b01611c82565b91505092959891949750929550565b60008060006060848603121561228a578081fd5b61229384611cf3565b92506020840135611d5081612ee2565b600080604083850312156122b5578182fd5b505080516020909101519092909150565b6000602082840312156122d7578081fd5b815161198681612ecd565b60008060008060a085870312156122f7578182fd5b845161230281612ee2565b60208601516040870151919550935091506123208660608701611bc9565b905092959194509250565b60008060008060008060e08789031215612343578384fd5b865161234e81612ee2565b602088015160408901519197509550935061236c8860608901611bc9565b925060a0870151915060c08701516001600160401b0381111561238d578182fd5b61239989828a01611b37565b9150509295509295509295565b6000806000806000806000610100888a0312156123c1578081fd5b87516123cc81612ee2565b602089015160408a0151919850965094506123ea8960608a01611bc9565b935060a0880151925060c0880151915060e08801516001600160401b03811115612412578182fd5b6122678a828b01611b37565b600080600080600080600080888a036101c081121561243b578283fd5b895161244681612ee2565b8099505060208a0151975060408a0151965060608a0151955061246c8b60808c01611bc9565b945060c060bf198201121561247f578283fd5b5060405160c081016001600160401b03828210818311171561249d57fe5b604082815260c08d0151845260e08d015160208501526101008d0151908401526101208c015160608401526101408c015160808401526101608c015160a08401526101808c0151929550808311156124f3578485fd5b6124ff8d848e01611b37565b94506101a08c0151925080831115612515578384fd5b50506125238b828c01611b37565b9150509295985092959890939650565b60008060008060008060c0878903121561254b578384fd5b865161255681612ee2565b809650506020870151945060408701519350606087015192506080870151915060a08701516001600160401b0381111561238d578182fd5b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600081518084526125dd816020860160208601612e7b565b601f01601f19169290920160200192915050565b80518252602090810151910152565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b600080835460018082166000811461265957600181146126705761269f565b60ff198316865260028304607f168601935061269f565b600283048786526020808720875b838110156126975781548a82015290850190820161267e565b505050860193505b509195945050505050565b60f09290921b6001600160f01b0319168252600282015260220190565b600061ffff60f01b8660f01b16825284600283015283602283015282516126f5816042850160208701612e7b565b9190910160420195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825261198660208301846125c5565b6020808252601d908201527f53746172676174653a2042726964676520616c72656164792073657421000000604082015260600190565b60208082526034908201527f53746172676174653a206f6e6c79204c617965725a65726f20656e64706f696e604082015273742063616e2063616c6c206c7a5265636569766560601b606082015260800190565b6020808252601f908201527f53746172676174653a20696e76616c6964205f66756e6374696f6e5479706500604082015260600190565b6020808252601f908201527f53746172676174653a2062726964676520646f6573206e6f74206d6174636800604082015260600190565b60208082526023908201527f53746172676174653a20756e737570706f727465642066756e6374696f6e207460408201526279706560e81b606082015260800190565b6020808252818101527f53746172676174653a2063616c6c6572206d75737420626520526f757465722e604082015260600190565b61ffff91909116815260200190565b61ffff9290921682526001600160a01b0316602082015260400190565b61ffff861681526001600160a01b038516602082015260a06040820181905260009061291b908301866125c5565b8415156060840152828103608084015261293581856125c5565b98975050505050505050565b600061ffff851682526040602083015261295f60408301848661259b565b95945050505050565b600061010061ffff8b1683528060208401526129868184018b6125c5565b6001600160401b039990991660408401525050606081019590955260808501939093526001600160a01b039190911660a084015260c083015260e09091015292915050565b60006101c061ffff8c1683528060208401526129e98184018c6125c5565b6001600160401b038b166040850152606084018a90526080840189905260a084018890526001600160a01b03871660c08501529050612a2b60e0840186612600565b8281036101a0840152612a3e81856125c5565b9c9b505050505050505050505050565b600061ffff8916825260e06020830152612a6b60e08301896125c5565b6001600160401b03881660408401528660608401528560808401528460a084015282810360c0840152612a9e81856125c5565b9a9950505050505050505050565b600060c0820161ffff89168352602060c081850152828954600180821660008114612ade5760018114612afd57612b35565b60028304607f16865260ff19831660e089015261010088019350612b35565b60028304808752612b0d8e612e6f565b885b82811015612b2b5781548b820160e00152908401908701612b0f565b8a0160e001955050505b5050508481036040860152612b4a818a6125c5565b92505050612b5b606084018761258e565b612b68608084018661258e565b82810360a0840152612b7a81856125c5565b9998505050505050505050565b600061ffff808816835280871660208401525084604083015260806060830152612bb560808301848661259b565b979650505050505050565b61ffff85168152602081018490526040810183905260a0810161295f60608301846125f1565b90815260200190565b918252602082015260400190565b60006101c060ff8d16835260ff8c16602084015260ff8b16604084015260ff8a166060840152612c30608084018a6125f1565b612c3d60c0840189612600565b80610180840152612c51818401878961259b565b90508281036101a0840152612c6781858761259b565b9d9c50505050505050505050505050565b60ff858116825284811660208301528316604082015260a0810161295f60608301846125f1565b600060ff8916825260ff8816602083015260ff87166040830152612cc660608301876125f1565b60ff851660a083015260e060c0830152612b7a60e08301848661259b565b600061010060ff8b16835260ff8a16602084015260ff89166040840152612d0e60608401896125f1565b60ff871660a084015260ff861660c08401528060e0840152612d33818401858761259b565b9b9a5050505050505050505050565b60ff85168152602081018490526040810183905260a0810161295f60608301846125f1565b600060ff89168252876020830152866040830152612d8860608301876125f1565b8460a083015260e060c0830152612b7a60e08301848661259b565b600061010060ff8a168352886020840152876040840152612dc760608401886125f1565b8560a08401528460c08401528060e0840152612a9e818401856125c5565b60006101c060ff8d1683528b60208401528a6040840152896060840152612c30608084018a6125f1565b60ff9290921682526001600160401b0316602082015260400190565b6040518181016001600160401b0381118282101715612e4657fe5b604052919050565b60006001600160401b03821115612e6157fe5b50601f01601f191660200190565b60009081526020902090565b60005b83811015612e96578181015183820152602001612e7e565b83811115610fae5750506000910152565b6001600160a01b0381168114612ebc57600080fd5b50565b8015158114612ebc57600080fd5b6001600160401b0381168114612ebc57600080fd5b60ff81168114612ebc57600080fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a264697066735822122074965d55741e5ec229cb2b28e91d0ded45a666403b01fd551b67baeabfdbc7ed64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003c2269811836af69497e5f486a85d7316753cf6200000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd
-----Decoded View---------------
Arg [0] : _layerZeroEndpoint (address): 0x3c2269811836af69497E5F486A85D7316753cf62
Arg [1] : _router (address): 0x45A01E4e04F14f7A4a6702c74187c5F6222033cd
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000003c2269811836af69497e5f486a85d7316753cf62
Arg [1] : 00000000000000000000000045a01e4e04f14f7a4a6702c74187c5f6222033cd
Deployed Bytecode Sourcemap
334:12013:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1948:2780;;;;;;;;;;-1:-1:-1;1948:2780:0;;;;;:::i;:::-;;:::i;:::-;;978:61;;;;;;;;;;-1:-1:-1;978:61:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;869:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10036:126::-;;;;;;;;;;-1:-1:-1;10036:126:0;;;;;:::i;:::-;;:::i;7236:1296::-;;;;;;;;;;-1:-1:-1;7236:1296:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;10168:132::-;;;;;;;;;;-1:-1:-1;10168:132:0;;;;;:::i;:::-;;:::i;6233:518::-;;;;;;:::i;:::-;;:::i;9466:183::-;;;;;;;;;;-1:-1:-1;9466:183:0;;;;;:::i;:::-;;:::i;8641:228::-;;;;;;;;;;-1:-1:-1;8641:228:0;;;;;:::i;:::-;;:::i;4845:571::-;;;;;;:::i;:::-;;:::i;12288:57::-;;;;;;;;;;;;;:::i;1081:29::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1061:85:11:-;;;;;;;;;;;;;:::i;928:44:0:-;;;;;;;;;;-1:-1:-1;928:44:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;5422:805::-;;;;;;:::i;:::-;;:::i;6757:473::-;;;;;;:::i;:::-;;:::i;9355:105::-;;;;;;;;;;-1:-1:-1;9355:105:0;;;;;:::i;:::-;;:::i;9780:250::-;;;;;;;;;;-1:-1:-1;9780:250:0;;;;;:::i;:::-;;:::i;9168:181::-;;;;;;;;;;-1:-1:-1;9168:181:0;;;;;:::i;:::-;;:::i;1987:240:11:-;;;;;;;;;;-1:-1:-1;1987:240:11;;;;;:::i;:::-;;:::i;1045:30:0:-;;;;;;;;;;;;;:::i;8875:287::-;;;;;;;;;;-1:-1:-1;8875:287:0;;;;;:::i;:::-;;:::i;1948:2780::-;2125:10;-1:-1:-1;;;;;2147:17:0;2125:40;;2117:105;;;;-1:-1:-1;;;2117:105:0;;;;;;;:::i;:::-;;;;;;;;;2275:12;:25;2288:11;2275:25;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;2253:11;:18;:54;:120;;;;-1:-1:-1;2347:25:0;;;;;;;:12;:25;;;;;;;2337:36;;;;2347:25;2337:36;:::i;:::-;;;;;;;;2321:11;2311:22;;;;;;:62;2253:120;2232:198;;;;-1:-1:-1;;;2232:198:0;;;;;;;:::i;:::-;2528:2;2514:17;;2508:24;2556:32;;;595:1;2556:32;2552:2170;;;2640:17;2675;2710:21;2749:23;2790:21;2829:15;2862:20;2910:8;2899:100;;;;;;;;;;;;:::i;:::-;2604:395;;;;;;;;;;;;;;;3013:17;3098:2;3094;3090:11;3084:18;3071:31;;3129:6;-1:-1:-1;;;;;3129:22:0;;3152:11;3165:9;3176;3187:1;3129:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3203:6;-1:-1:-1;;;;;3203:17:0;;3221:11;3234;3247:6;3255:9;3266;3277:13;3292:9;3303:1;3306:7;3203:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2552:2170;;;;;;;;;;;3335:34;;;647:1;3335:34;3331:1391;;;3388:17;3407;3426:23;3464:8;3453:63;;;;;;;;;;;;:::i;:::-;3385:131;;;;;;;3530:6;-1:-1:-1;;;;;3530:22:0;;3553:11;3566:9;3577;3588:1;3530:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3331:1391;;;;;;3611:43;;;708:1;3611:43;3607:1115;;;3673:17;3692;3711:23;3736:16;3754:20;3776:15;3823:8;3795:105;;;;;;;;;;;;:::i;:::-;3670:230;;;;;;;;;;;;;3914:17;3999:2;3995;3991:11;3985:18;3972:31;;4030:6;-1:-1:-1;;;;;4030:22:0;;4053:11;4066:9;4077;4088:1;4030:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4104:117:0;;-1:-1:-1;;;4104:117:0;;-1:-1:-1;;;;;4104:6:0;:26;;-1:-1:-1;4104:26:0;;-1:-1:-1;4104:117:0;;4131:11;;4144;;4157:6;;4165:9;;4176;;4187;;4198:8;;4208:12;;4104:117;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3607:1115;;;;;;;;;;4242:36;;;762:1;4242:36;4238:484;;;4297:17;4316;4335:23;4360:16;4378:15;4425:8;4397:125;;;;;;;;;;;;:::i;:::-;4294:228;;;;;;;;;;;4536:6;-1:-1:-1;;;;;4536:22:0;;4559:11;4572:9;4583;4594:1;4536:60;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;4610:101:0;;-1:-1:-1;;;4610:101:0;;-1:-1:-1;;;;;4610:6:0;:31;;-1:-1:-1;4610:31:0;;-1:-1:-1;4610:101:0;;4642:11;;4655;;4668:6;;4676:9;;4687;;4698:8;;4708:2;;4610:101;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4238:484;;;;;;1948:2780;;;;;:::o;978:61::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;869:53::-;;;:::o;10036:126::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;10114:41:0::1;::::0;-1:-1:-1;;;10114:41:0;;-1:-1:-1;;;;;10114:17:0::1;:32;::::0;::::1;::::0;:41:::1;::::0;10147:7;;10114:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;7236:1296:::0;7509:25;;;;;;;;;7481:7;7509:25;;;7570:20;;;;;;;;7585:1;7570:20;;;;;;;;;7481:7;;;7509:25;7604:33;;;;7600:716;;;7653:21;7677:30;;;;;;;;7690:1;7677:30;;;;7693:1;7677:30;;;;7696:1;7677:30;;;;7699:1;7677:30;;;;7702:1;7677:30;;;;7705:1;7677:30;;;7653:54;;595:1;7760;7763;7766;7769;7772;7775:10;;7787:23;;7731:80;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7721:90;;7600:716;;;;7832:35;;;647:1;7832:35;7828:488;;;647:1;7924;7927;7930;7893:39;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7883:49;;7828:488;;;7953:44;;;708:1;7953:44;7949:367;;;708:1;8063;8066;8069;8072;8075;8078:10;;8023:66;;;;;;;;;;;;;;;:::i;7949:367::-;8110:37;;;762:1;8110:37;8106:210;;;762:1;8206;8209;8212;8215;8218:10;;8173:56;;;;;;;;;;;;;;:::i;8106:210::-;8260:45;;-1:-1:-1;;;8260:45:0;;;;;;;:::i;8106:210::-;8326:27;8356:53;8372:8;8382:13;8397:11;8356:15;:53::i;:::-;8326:83;;8426:17;-1:-1:-1;;;;;8426:30:0;;8457:8;8475:4;8482:7;8491:17;;;;;;;;;;;8510:14;8426:99;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8419:106;;;;;;;7236:1296;;;;;;;;;;:::o;10168:132::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;10249:44:0::1;::::0;-1:-1:-1;;;10249:44:0;;-1:-1:-1;;;;;10249:17:0::1;:35;::::0;::::1;::::0;:44:::1;::::0;10285:7;;10249:44:::1;;;:::i;6233:518::-:0;1401:10;-1:-1:-1;;;;;1423:6:0;1401:29;;1393:74;;;;-1:-1:-1;;;1393:74:0;;;;;;;:::i;:::-;6560:20:::1;762:1;6616:10;6628;6640:2;6644:9;6655:3;;6583:76;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6560:99;;6669:75;6675:8;762:1;6707:14;6723:11;6736:7;6669:5;:75::i;:::-;1477:1;6233:518:::0;;;;;;;;;:::o;9466:183::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;9580:62:0::1;::::0;-1:-1:-1;;;9580:62:0;;-1:-1:-1;;;;;9580:17:0::1;:36;::::0;::::1;::::0;:62:::1;::::0;9617:11;;9630;;;;9580:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9466:183:::0;;;:::o;8641:228::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;8745:22:0::1;::::0;::::1;;::::0;;;:12:::1;:22;::::0;;;;;;;:29;::::1;::::0;;::::1;;;;-1:-1:-1::0;;8745:29:0;::::1;;:34:::0;8737:76:::1;;;;-1:-1:-1::0;;;8737:76:0::1;;;;;;;:::i;:::-;8823:22;::::0;::::1;;::::0;;;:12:::1;:22;::::0;;;;:39:::1;::::0;8848:14;;8823:39:::1;:::i;:::-;;8641:228:::0;;;:::o;4845:571::-;1401:10;-1:-1:-1;;;;;1423:6:0;1401:29;;1393:74;;;;-1:-1:-1;;;1393:74:0;;;;;;;:::i;:::-;5279:25;;5226:102:::1;::::0;5203:20:::1;::::0;5226:102:::1;::::0;595:1:::1;::::0;5255:10;;5267;;5279:25;5306:2;;5310;;5314:3;;;;5319:8;;;;5226:102:::1;;;:::i;:::-;;;;;;;;;;;;;5203:125;;5338:71;5344:8;595:1;5372:14;5388:11;5401:7;5338:5;:71::i;:::-;1477:1;4845:571:::0;;;;;;;;;;;:::o;12288:57::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;12288:57:0:o;1081:29::-;;;;;;:::o;1061:85:11:-;1107:7;1133:6;-1:-1:-1;;;;;1133:6:11;1061:85;:::o;928:44:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;928:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5422:805::-;1401:10;-1:-1:-1;;;;;1423:6:0;1401:29;;1393:74;;;;-1:-1:-1;;;1393:74:0;;;;;;;:::i;:::-;5677:20:::1;5725:17;5744::::0;5763:16:::1;5781:20:::0;5803:15:::1;5850:8;5822:118;;;;;;;;;;;;:::i;:::-;5722:218;;;;;;;;;;;708:1;6064:9;6075;6086:2;6090:8;6100:12;6114:2;6024:93;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6014:103;;1477:1;;;;;6138:82;6144:8;708:1;6183:14;6199:11;6212:7;6138:5;:82::i;:::-;1477:1;5422:805:::0;;;;;:::o;6757:473::-;1401:10;-1:-1:-1;;;;;1423:6:0;1401:29;;1393:74;;;;-1:-1:-1;;;1393:74:0;;;;;;;:::i;:::-;6977:20:::1;647:1;7031:10;7043;7055:2;7000:58;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6977:81;;7068:38;7109:35;;;;;;;;7133:1;7109:35;;;;7136:1;7109:35;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;7109:35:0::1;;::::0;::::1;;::::0;7068:76:::1;;7154:69;7160:8;647:1;7190:14;7206:7;7215;7154:5;:69::i;9355:105::-:0;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;9427:17:0::1;:26:::0;;-1:-1:-1;;9427:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;9355:105::o;9780:250::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;9954:69:0::1;::::0;-1:-1:-1;;;9954:69:0;;-1:-1:-1;;;;;9954:17:0::1;:27;::::0;::::1;::::0;:69:::1;::::0;9982:8;;9992;;10002:11;;10015:7;;;;9954:69:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;9780:250:::0;;;;;:::o;9168:181::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;9304:38:0::1;::::0;-1:-1:-1;;;9304:38:0;;-1:-1:-1;;;;;9304:21:0;::::1;::::0;::::1;::::0;:38:::1;::::0;9326:7;;9335:6;;9304:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1987:240:11:-:0;1284:12;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;-1:-1:-1;;;;;2075:22:11;::::1;2067:73;;;;-1:-1:-1::0;;;2067:73:11::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2176:6;::::0;;2155:38:::1;::::0;-1:-1:-1;;;;;2155:38:11;;::::1;::::0;2176:6;::::1;::::0;2155:38:::1;::::0;::::1;2203:6;:17:::0;;-1:-1:-1;;;;;;2203:17:11::1;-1:-1:-1::0;;;;;2203:17:11;;;::::1;::::0;;;::::1;::::0;;1987:240::o;1045:30:0:-;;;:::o;8875:287::-;1284:12:11;:10;:12::i;:::-;-1:-1:-1;;;;;1273:23:11;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1273:23:11;;1265:68;;;;;-1:-1:-1;;;1265:68:11;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1265:68:11;;;;;;;;;;;;;;;9039:1:0::1;9022:13;:18;;;;:40;;;;;9061:1;9044:13;:18;;;;9022:40;9014:84;;;;-1:-1:-1::0;;;9014:84:0::1;;;;;;;:::i;:::-;9108:19;::::0;;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;;:34:::1;::::0;;::::1;::::0;;;;;;:47;8875:287::o;598:104:1:-;685:10;598:104;:::o;10891:821:0:-;11178:25;;;;;11291:2;11267:27;11261:34;11379:25;;11348:19;;;11099:21;11348:19;;;:9;:19;;;;;;;:26;;;;;;;;;;;11043:12;;;;11261:34;11099:21;;11348:57;;:30;:57::i;:::-;11329:76;;11449:1;11419:11;:27;;;:31;:64;;;;-1:-1:-1;;;;;;11454:29:0;;;;11419:64;11415:264;;;11511:85;11531:8;11541:11;:27;;;11570:11;:25;;;11511:19;:85::i;:::-;11499:97;;11415:264;;;11639:29;11659:8;11639:19;:29::i;:::-;11627:41;;11415:264;-1:-1:-1;11696:9:0;;10891:821;-1:-1:-1;;;;;10891:821:0:o;11718:564::-;11927:27;11957:45;11973:8;11983:5;11990:11;11957:15;:45::i;:::-;11927:75;;12012:16;12031:17;-1:-1:-1;;;;;12031:34:0;;12066:8;12084:4;12031:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12155:22;;;;;;;12093:1;12155:22;;;;;;;;;12104:131;;-1:-1:-1;;;12104:131:0;;12031:63;;;-1:-1:-1;;;;;;12104:17:0;:22;;;;12134:9;;12104:131;;12145:8;;12179;;12189:14;;12213:4;;12220:14;;12104:131;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12250:25;12258:5;12265:9;12250:25;;;;;;;:::i;:::-;;;;;;;;11718:564;;;;;;;:::o;2682:175:15:-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;-1:-1:-1;;;2786:46:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;2849:1;2682:175;-1:-1:-1;;;2682:175:15:o;10593:292:0:-;10808:70;;10750:12;;10790:1;;10808:70;;10790:1;;10833:10;;10845:16;;10863:14;;10808:70;;;:::i;:::-;;;;;;;;;;;;;10801:77;;;10593:292;;;;;:::o;10414:173::-;10544:36;;10486:12;;10526:1;;10544:36;;10526:1;;10569:10;;10544:36;;;:::i;:::-;;;;;;;;;;;;;10537:43;;;10414:173;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:146:16;92:20;;121:33;92:20;121:33;:::i;165:377::-;;;282:3;275:4;267:6;263:17;259:27;249:2;;307:8;297;290:26;249:2;-1:-1:-1;337:20:16;;-1:-1:-1;;;;;369:30:16;;366:2;;;419:8;409;402:26;366:2;463:4;455:6;451:17;439:29;;515:3;508:4;499:6;491;487:19;483:30;480:39;477:2;;;532:1;529;522:12;477:2;239:303;;;;;:::o;547:485::-;;644:3;637:4;629:6;625:17;621:27;611:2;;666:5;659;652:20;611:2;706:6;693:20;737:49;752:33;782:2;752:33;:::i;:::-;737:49;:::i;:::-;811:2;802:7;795:19;857:3;850:4;845:2;837:6;833:15;829:26;826:35;823:2;;;878:5;871;864:20;823:2;947;940:4;932:6;928:17;921:4;912:7;908:18;895:55;970:16;;;988:4;966:27;959:42;;;;974:7;601:431;-1:-1:-1;;601:431:16:o;1037:447::-;;1145:3;1138:4;1130:6;1126:17;1122:27;1112:2;;1167:5;1160;1153:20;1112:2;1200:6;1194:13;1231:49;1246:33;1276:2;1246:33;:::i;1231:49::-;1305:2;1296:7;1289:19;1351:3;1344:4;1339:2;1331:6;1327:15;1323:26;1320:35;1317:2;;;1372:5;1365;1358:20;1317:2;1389:64;1450:2;1443:4;1434:7;1430:18;1423:4;1415:6;1411:17;1389:64;:::i;:::-;1471:7;1102:382;-1:-1:-1;;;;1102:382:16:o;1489:480::-;;1596:4;1584:9;1579:3;1575:19;1571:30;1568:2;;;1618:5;1611;1604:20;1568:2;1655:4;1649:11;1699:4;1691:6;1687:17;1770:6;1758:10;1755:22;-1:-1:-1;;;;;1722:10:16;1719:34;1716:62;1713:2;;;1781:9;1713:2;1808:4;1801:24;1873:23;;1858:39;;1958:2;1943:18;;;1930:32;1913:15;;;1906:57;;;;-1:-1:-1;1843:6:16;1558:411;-1:-1:-1;1558:411:16:o;1974:477::-;;2092:4;2080:9;2075:3;2071:19;2067:30;2064:2;;;2114:5;2107;2100:20;2064:2;2151:4;2145:11;2195:4;2187:6;2183:17;2266:6;2254:10;2251:22;-1:-1:-1;;;;;2218:10:16;2215:34;2212:62;2209:2;;;2277:9;2209:2;2304:4;2297:24;2369:16;;2354:32;;2440:2;2425:18;;;2419:25;2402:15;;;2395:50;;;;-1:-1:-1;2339:6:16;2054:397;-1:-1:-1;2054:397:16:o;2456:742::-;;2561:4;2549:9;2544:3;2540:19;2536:30;2533:2;;;2583:5;2576;2569:20;2533:2;2620;2614:9;2662:4;2654:6;2650:17;2733:6;2721:10;2718:22;-1:-1:-1;;;;;2685:10:16;2682:34;2679:62;2676:2;;;2744:9;2676:2;2775:10;2771:2;2764:22;;2804:6;2795:15;;2847:9;2834:23;2826:6;2819:39;2919:2;2908:9;2904:18;2891:32;2886:2;2878:6;2874:15;2867:57;2985:2;2974:9;2970:18;2957:32;2952:2;2944:6;2940:15;2933:57;3051:2;3040:9;3036:18;3023:32;3018:2;3010:6;3006:15;2999:57;3118:3;3107:9;3103:19;3090:33;3084:3;3076:6;3072:16;3065:59;3186:3;3175:9;3171:19;3158:33;3152:3;3144:6;3140:16;3133:59;;2523:675;;;;:::o;3203:674::-;;3308:4;3296:9;3291:3;3287:19;3283:30;3280:2;;;3330:5;3323;3316:20;3280:2;3367;3361:9;3409:4;3401:6;3397:17;-1:-1:-1;;;;;3501:6:16;3489:10;3486:22;3481:2;3469:10;3466:18;3463:46;3460:2;;;3512:9;3460:2;3543:10;3539:2;3532:22;3572:6;3563:15;;3615:9;3602:23;3594:6;3587:39;3687:2;3676:9;3672:18;3659:32;3654:2;3646:6;3642:15;3635:57;3743:2;3732:9;3728:18;3715:32;3701:46;;3770:2;3762:6;3759:14;3756:2;;;3786:1;3783;3776:12;3756:2;;3823:47;3866:3;3857:6;3846:9;3842:22;3823:47;:::i;:::-;3818:2;3810:6;3806:15;3799:72;;;3270:607;;;;:::o;3882:161::-;3951:20;;4011:6;4000:18;;3990:29;;3980:2;;4033:1;4030;4023:12;4048:259;;4160:2;4148:9;4139:7;4135:23;4131:32;4128:2;;;4181:6;4173;4166:22;4128:2;4225:9;4212:23;4244:33;4271:5;4244:33;:::i;4312:470::-;;;;4458:2;4446:9;4437:7;4433:23;4429:32;4426:2;;;4479:6;4471;4464:22;4426:2;4523:9;4510:23;4542:33;4569:5;4542:33;:::i;:::-;4594:5;-1:-1:-1;4651:2:16;4636:18;;4623:32;4664:35;4623:32;4664:35;:::i;:::-;4416:366;;4718:7;;-1:-1:-1;;;4772:2:16;4757:18;;;;4744:32;;4416:366::o;4787:253::-;;4896:2;4884:9;4875:7;4871:23;4867:32;4864:2;;;4917:6;4909;4902:22;4864:2;4961:9;4948:23;4980:30;5004:5;4980:30;:::i;5045:257::-;;5165:2;5153:9;5144:7;5140:23;5136:32;5133:2;;;5186:6;5178;5171:22;5133:2;5223:9;5217:16;5242:30;5266:5;5242:30;:::i;5307:196::-;;5418:2;5406:9;5397:7;5393:23;5389:32;5386:2;;;5439:6;5431;5424:22;5386:2;5467:30;5487:9;5467:30;:::i;5508:943::-;;;;;;5756:3;5744:9;5735:7;5731:23;5727:33;5724:2;;;5778:6;5770;5763:22;5724:2;5806:30;5826:9;5806:30;:::i;:::-;5796:40;;5886:2;5875:9;5871:18;5858:32;5899:33;5926:5;5899:33;:::i;:::-;5951:5;-1:-1:-1;5975:59:16;6026:7;6021:2;6006:18;;5975:59;:::i;:::-;5965:69;;6085:3;6074:9;6070:19;6057:33;-1:-1:-1;;;;;6150:2:16;6142:6;6139:14;6136:2;;;6171:6;6163;6156:22;6136:2;6199:61;6252:7;6243:6;6232:9;6228:22;6199:61;:::i;:::-;6189:71;;6313:3;6302:9;6298:19;6285:33;6269:49;;6343:2;6333:8;6330:16;6327:2;;;6364:6;6356;6349:22;6327:2;;6392:53;6437:7;6426:8;6415:9;6411:24;6392:53;:::i;:::-;6382:63;;;5714:737;;;;;;;;:::o;6456:505::-;;;;6603:2;6591:9;6582:7;6578:23;6574:32;6571:2;;;6624:6;6616;6609:22;6571:2;6652:30;6672:9;6652:30;:::i;:::-;6642:40;;6733:2;6722:9;6718:18;6705:32;-1:-1:-1;;;;;6752:6:16;6749:30;6746:2;;;6797:6;6789;6782:22;6746:2;6841:60;6893:7;6884:6;6873:9;6869:22;6841:60;:::i;:::-;6561:400;;6920:8;;-1:-1:-1;6815:86:16;;-1:-1:-1;;;;6561:400:16:o;6966:783::-;;;;;7145:3;7133:9;7124:7;7120:23;7116:33;7113:2;;;7167:6;7159;7152:22;7113:2;7195:30;7215:9;7195:30;:::i;:::-;7185:40;;7276:2;7265:9;7261:18;7248:32;-1:-1:-1;;;;;7340:2:16;7332:6;7329:14;7326:2;;;7361:6;7353;7346:22;7326:2;7389:51;7432:7;7423:6;7412:9;7408:22;7389:51;:::i;:::-;7379:61;;7490:2;7479:9;7475:18;7462:32;7449:45;;7503:32;7529:5;7503:32;:::i;:::-;7554:5;;-1:-1:-1;7612:2:16;7597:18;;7584:32;;7628:16;;;7625:2;;;7662:6;7654;7647:22;7625:2;;7690:53;7735:7;7724:8;7713:9;7709:24;7690:53;:::i;:::-;7680:63;;;7103:646;;;;;;;:::o;7754:648::-;;;;;;7934:3;7922:9;7913:7;7909:23;7905:33;7902:2;;;7956:6;7948;7941:22;7902:2;7984:30;8004:9;7984:30;:::i;:::-;7974:40;;8033:39;8068:2;8057:9;8053:18;8033:39;:::i;:::-;8023:49;;8119:2;8108:9;8104:18;8091:32;8081:42;;8174:2;8163:9;8159:18;8146:32;-1:-1:-1;;;;;8193:6:16;8190:30;8187:2;;;8238:6;8230;8223:22;8187:2;8282:60;8334:7;8325:6;8314:9;8310:22;8282:60;:::i;:::-;7892:510;;;;-1:-1:-1;7892:510:16;;-1:-1:-1;8361:8:16;;8256:86;7892:510;-1:-1:-1;;;7892:510:16:o;8407:601::-;;;;;;8621:3;8609:9;8600:7;8596:23;8592:33;8589:2;;;8643:6;8635;8628:22;8589:2;8671:30;8691:9;8671:30;:::i;:::-;8661:40;;8748:2;8737:9;8733:18;8720:32;8710:42;;8799:2;8788:9;8784:18;8771:32;8761:42;;8853:2;8842:9;8838:18;8825:32;8866:33;8893:5;8866:33;:::i;:::-;8918:5;-1:-1:-1;8942:60:16;8994:7;8988:3;8973:19;;8942:60;:::i;:::-;8932:70;;8579:429;;;;;;;;:::o;9013:1521::-;;;;;;;;;;;;9384:3;9372:9;9363:7;9359:23;9355:33;9352:2;;;9406:6;9398;9391:22;9352:2;9434:30;9454:9;9434:30;:::i;:::-;9424:40;;9511:2;9500:9;9496:18;9483:32;9473:42;;9562:2;9551:9;9547:18;9534:32;9524:42;;9585:48;9629:2;9618:9;9614:18;9585:48;:::i;:::-;9575:58;;9652:60;9704:7;9698:3;9687:9;9683:19;9652:60;:::i;:::-;9642:70;;9731:58;9781:7;9775:3;9764:9;9760:19;9731:58;:::i;:::-;9721:68;;-1:-1:-1;;;;;9876:2:16;9869:3;9858:9;9854:19;9841:33;9838:41;9835:2;;;9897:6;9889;9882:22;9835:2;9925:88;10005:7;9997:3;9986:9;9982:19;9969:33;9958:9;9954:49;9925:88;:::i;:::-;9915:98;;10063:2;10056:3;10045:9;10041:19;10028:33;10025:41;10022:2;;;10084:6;10076;10069:22;10022:2;10128:87;10207:7;10199:3;10188:9;10184:19;10171:33;10160:9;10156:49;10128:87;:::i;:::-;10234:8;;-1:-1:-1;10261:8:16;-1:-1:-1;10312:3:16;10297:19;;10284:33;10281:41;-1:-1:-1;10278:2:16;;;10340:6;10332;10325:22;10278:2;;10385:87;10464:7;10456:3;10445:9;10441:19;10428:33;10417:9;10413:49;10385:87;:::i;:::-;10491:8;10481:18;;10519:9;10508:20;;;;9342:1192;;;;;;;;;;;;;;:::o;10539:1238::-;;;;;;;;;;10848:3;10836:9;10827:7;10823:23;10819:33;10816:2;;;10870:6;10862;10855:22;10816:2;10898:30;10918:9;10898:30;:::i;:::-;10888:40;;10975:2;10964:9;10960:18;10947:32;10937:42;;11026:2;11015:9;11011:18;10998:32;10988:42;;11080:2;11069:9;11065:18;11052:32;11093:33;11120:5;11093:33;:::i;:::-;11145:5;-1:-1:-1;11169:60:16;11221:7;11215:3;11200:19;;11169:60;:::i;:::-;11159:70;;11276:3;11265:9;11261:19;11248:33;11238:43;;11332:3;11321:9;11317:19;11304:33;-1:-1:-1;;;;;11397:2:16;11389:6;11386:14;11383:2;;;11418:6;11410;11403:22;11383:2;11462:60;11514:7;11505:6;11494:9;11490:22;11462:60;:::i;:::-;11541:8;;-1:-1:-1;11436:86:16;-1:-1:-1;11629:3:16;11614:19;;11601:33;;-1:-1:-1;11646:16:16;;;11643:2;;;11680:6;11672;11665:22;11643:2;;11708:63;11763:7;11752:8;11741:9;11737:24;11708:63;:::i;:::-;11698:73;;;10806:971;;;;;;;;;;;:::o;11782:329::-;;;11908:2;11896:9;11887:7;11883:23;11879:32;11876:2;;;11929:6;11921;11914:22;11876:2;11957:30;11977:9;11957:30;:::i;:::-;11947:40;;12037:2;12026:9;12022:18;12009:32;12050:31;12075:5;12050:31;:::i;:::-;12100:5;12090:15;;;11866:245;;;;;:::o;12116:1196::-;;;;;;;;12356:3;12344:9;12335:7;12331:23;12327:33;12324:2;;;12378:6;12370;12363:22;12324:2;12406:30;12426:9;12406:30;:::i;:::-;12396:40;;12486:2;12475:9;12471:18;12458:32;12499:31;12524:5;12499:31;:::i;:::-;12549:5;-1:-1:-1;12605:2:16;12590:18;;12577:32;-1:-1:-1;;;;;12658:14:16;;;12655:2;;;12690:6;12682;12675:22;12655:2;12734:60;12786:7;12777:6;12766:9;12762:22;12734:60;:::i;:::-;12813:8;;-1:-1:-1;12708:86:16;-1:-1:-1;12901:2:16;12886:18;;12873:32;;-1:-1:-1;12917:16:16;;;12914:2;;;12951:6;12943;12936:22;12914:2;12995:62;13049:7;13038:8;13027:9;13023:24;12995:62;:::i;:::-;13076:8;;-1:-1:-1;12969:88:16;-1:-1:-1;13164:3:16;13149:19;;13136:33;;-1:-1:-1;13181:16:16;;;13178:2;;;13215:6;13207;13200:22;13178:2;;13243:63;13298:7;13287:8;13276:9;13272:24;13243:63;:::i;:::-;13233:73;;;12314:998;;;;;;;;;;:::o;13317:397::-;;;;13460:2;13448:9;13439:7;13435:23;13431:32;13428:2;;;13481:6;13473;13466:22;13428:2;13509:30;13529:9;13509:30;:::i;:::-;13499:40;;13589:2;13578:9;13574:18;13561:32;13602:31;13627:5;13602:31;:::i;13719:255::-;;;13859:2;13847:9;13838:7;13834:23;13830:32;13827:2;;;13880:6;13872;13865:22;13827:2;-1:-1:-1;;13908:16:16;;13964:2;13949:18;;;13943:25;13908:16;;13943:25;;-1:-1:-1;13817:157:16:o;13979:261::-;;14101:2;14089:9;14080:7;14076:23;14072:32;14069:2;;;14122:6;14114;14107:22;14069:2;14159:9;14153:16;14178:32;14204:5;14178:32;:::i;14245:515::-;;;;;14444:3;14432:9;14423:7;14419:23;14415:33;14412:2;;;14466:6;14458;14451:22;14412:2;14503:9;14497:16;14522:31;14547:5;14522:31;:::i;:::-;14617:2;14602:18;;14596:25;14661:2;14646:18;;14640:25;14572:5;;-1:-1:-1;14596:25:16;-1:-1:-1;14640:25:16;-1:-1:-1;14684:70:16;14746:7;14741:2;14726:18;;14684:70;:::i;:::-;14674:80;;14402:358;;;;;;;:::o;14765:802::-;;;;;;;15007:3;14995:9;14986:7;14982:23;14978:33;14975:2;;;15029:6;15021;15014:22;14975:2;15066:9;15060:16;15085:31;15110:5;15085:31;:::i;:::-;15180:2;15165:18;;15159:25;15224:2;15209:18;;15203:25;15135:5;;-1:-1:-1;15159:25:16;-1:-1:-1;15203:25:16;-1:-1:-1;15247:70:16;15309:7;15304:2;15289:18;;15247:70;:::i;:::-;15237:80;;15357:3;15346:9;15342:19;15336:26;15326:36;;15406:3;15395:9;15391:19;15385:26;-1:-1:-1;;;;;15426:6:16;15423:30;15420:2;;;15471:6;15463;15456:22;15420:2;15499:62;15553:7;15544:6;15533:9;15529:22;15499:62;:::i;:::-;15489:72;;;14965:602;;;;;;;;:::o;15572:864::-;;;;;;;;15831:3;15819:9;15810:7;15806:23;15802:33;15799:2;;;15853:6;15845;15838:22;15799:2;15890:9;15884:16;15909:31;15934:5;15909:31;:::i;:::-;16004:2;15989:18;;15983:25;16048:2;16033:18;;16027:25;15959:5;;-1:-1:-1;15983:25:16;-1:-1:-1;16027:25:16;-1:-1:-1;16071:70:16;16133:7;16128:2;16113:18;;16071:70;:::i;:::-;16061:80;;16181:3;16170:9;16166:19;16160:26;16150:36;;16226:3;16215:9;16211:19;16205:26;16195:36;;16275:3;16264:9;16260:19;16254:26;-1:-1:-1;;;;;16295:6:16;16292:30;16289:2;;;16340:6;16332;16325:22;16289:2;16368:62;16422:7;16413:6;16402:9;16398:22;16368:62;:::i;16441:1723::-;;;;;;;;;16742:9;16733:7;16729:23;16772:3;16768:2;16764:12;16761:2;;;16794:6;16786;16779:22;16761:2;16831:9;16825:16;16850:31;16875:5;16850:31;:::i;:::-;16900:5;16890:15;;;16945:2;16934:9;16930:18;16924:25;16914:35;;16989:2;16978:9;16974:18;16968:25;16958:35;;17033:2;17022:9;17018:18;17012:25;17002:35;;17056:71;17119:7;17113:3;17102:9;17098:19;17056:71;:::i;:::-;17046:81;-1:-1:-1;17162:3:16;-1:-1:-1;;17143:17:16;;17139:27;17136:2;;;17184:6;17176;17169:22;17136:2;;17222;17216:9;17264:3;17256:6;17252:16;-1:-1:-1;;;;;17355:6:16;17343:10;17340:22;17335:2;17323:10;17320:18;17317:46;17314:2;;;17366:9;17314:2;17393;17386:22;;;17453:3;17438:19;;17432:26;17417:42;;17513:3;17498:19;;17492:26;17487:2;17475:15;;17468:51;17573:3;17558:19;;17552:26;17535:15;;;17528:51;17633:3;17618:19;;17612:26;17607:2;17595:15;;17588:51;17694:3;17679:19;;17673:26;17667:3;17655:16;;17648:52;17755:3;17740:19;;17734:26;17728:3;17716:16;;17709:52;17830:3;17815:19;;17809:26;17424:6;;-1:-1:-1;17847:14:16;;;17844:2;;;17879:6;17871;17864:22;17844:2;17907:62;17961:7;17952:6;17941:9;17937:22;17907:62;:::i;:::-;17897:72;;18015:3;18004:9;18000:19;17994:26;17978:42;;18045:2;18035:8;18032:16;18029:2;;;18066:6;18058;18051:22;18029:2;;;18094:64;18150:7;18139:8;18128:9;18124:24;18094:64;:::i;:::-;18084:74;;;16709:1455;;;;;;;;;;;:::o;18169:730::-;;;;;;;18384:3;18372:9;18363:7;18359:23;18355:33;18352:2;;;18406:6;18398;18391:22;18352:2;18443:9;18437:16;18462:31;18487:5;18462:31;:::i;:::-;18512:5;18502:15;;;18557:2;18546:9;18542:18;18536:25;18526:35;;18601:2;18590:9;18586:18;18580:25;18570:35;;18645:2;18634:9;18630:18;18624:25;18614:35;;18689:3;18678:9;18674:19;18668:26;18658:36;;18738:3;18727:9;18723:19;18717:26;-1:-1:-1;;;;;18758:6:16;18755:30;18752:2;;;18803:6;18795;18788:22;18904:114;-1:-1:-1;;;;;18980:31:16;18968:44;;18958:60::o;19023:270::-;;19113:6;19108:3;19101:19;19165:6;19158:5;19151:4;19146:3;19142:14;19129:43;19217:3;19210:4;19201:6;19196:3;19192:16;19188:27;19181:40;19282:4;19275:2;19271:7;19266:2;19258:6;19254:15;19250:29;19245:3;19241:39;19237:50;19230:57;;19091:202;;;;;:::o;19298:259::-;;19379:5;19373:12;19406:6;19401:3;19394:19;19422:63;19478:6;19471:4;19466:3;19462:14;19455:4;19448:5;19444:16;19422:63;:::i;:::-;19539:2;19518:15;-1:-1:-1;;19514:29:16;19505:39;;;;19546:4;19501:50;;19349:208;-1:-1:-1;;19349:208:16:o;19562:153::-;19640:12;;19628:25;;19702:4;19691:16;;;19685:23;19669:14;;19662:47;19618:97::o;19720:375::-;19802:5;19796:12;19791:3;19784:25;19858:4;19851:5;19847:16;19841:23;19834:4;19829:3;19825:14;19818:47;19914:4;19907:5;19903:16;19897:23;19890:4;19885:3;19881:14;19874:47;19970:4;19963:5;19959:16;19953:23;19946:4;19941:3;19937:14;19930:47;20026:4;20019:5;20015:16;20009:23;20002:4;19997:3;19993:14;19986:47;20082:4;20075:5;20071:16;20065:23;20058:4;20053:3;20049:14;20042:47;19774:321;;:::o;20100:826::-;;20255:3;20290:6;20284:13;20316:1;20348:2;20337:9;20333:18;20365:1;20360:126;;;;20500:1;20495:406;;;;20326:575;;20360:126;-1:-1:-1;;20393:24:16;;20381:37;;20466:1;20451:17;;20470:4;20447:28;20438:38;;;-1:-1:-1;20360:126:16;;20495:406;20545:1;20534:9;20530:17;20572:6;20567:3;20560:19;20602:4;20649:2;20644:3;20634:18;20674:3;20690:165;20704:6;20701:1;20698:13;20690:165;;;20782:14;;20769:11;;;20762:35;20825:16;;;;20719:10;;20690:165;;;-1:-1:-1;;;20875:16:16;;;-1:-1:-1;20326:575:16;-1:-1:-1;20917:3:16;;20234:692;-1:-1:-1;;;;;20234:692:16:o;20931:276::-;21124:3;21102:16;;;;-1:-1:-1;;;;;;21098:38:16;21086:51;;21162:1;21153:11;;21146:27;21198:2;21189:12;;21076:131::o;21212:507::-;;21484:5;21479:3;21475:15;21466:6;21461:3;21457:16;21453:38;21448:3;21441:51;21521:6;21517:1;21512:3;21508:11;21501:27;21558:6;21553:2;21548:3;21544:12;21537:28;21594:6;21588:13;21610:62;21665:6;21660:2;21655:3;21651:12;21644:4;21636:6;21632:17;21610:62;:::i;:::-;21692:16;;;;21710:2;21688:25;;21431:288;-1:-1:-1;;;;;21431:288:16:o;21724:203::-;-1:-1:-1;;;;;21888:32:16;;;;21870:51;;21858:2;21843:18;;21825:102::o;21932:274::-;-1:-1:-1;;;;;22124:32:16;;;;22106:51;;22188:2;22173:18;;22166:34;22094:2;22079:18;;22061:145::o;22211:187::-;22376:14;;22369:22;22351:41;;22339:2;22324:18;;22306:92::o;22403:219::-;;22550:2;22539:9;22532:21;22570:46;22612:2;22601:9;22597:18;22589:6;22570:46;:::i;23085:353::-;23287:2;23269:21;;;23326:2;23306:18;;;23299:30;23365:31;23360:2;23345:18;;23338:59;23429:2;23414:18;;23259:179::o;23443:416::-;23645:2;23627:21;;;23684:2;23664:18;;;23657:30;23723:34;23718:2;23703:18;;23696:62;-1:-1:-1;;;23789:2:16;23774:18;;23767:50;23849:3;23834:19;;23617:242::o;23864:355::-;24066:2;24048:21;;;24105:2;24085:18;;;24078:30;24144:33;24139:2;24124:18;;24117:61;24210:2;24195:18;;24038:181::o;24224:355::-;24426:2;24408:21;;;24465:2;24445:18;;;24438:30;24504:33;24499:2;24484:18;;24477:61;24570:2;24555:18;;24398:181::o;24584:399::-;24786:2;24768:21;;;24825:2;24805:18;;;24798:30;24864:34;24859:2;24844:18;;24837:62;-1:-1:-1;;;24930:2:16;24915:18;;24908:33;24973:3;24958:19;;24758:225::o;24988:356::-;25190:2;25172:21;;;25209:18;;;25202:30;25268:34;25263:2;25248:18;;25241:62;25335:2;25320:18;;25162:182::o;25349:188::-;25523:6;25511:19;;;;25493:38;;25481:2;25466:18;;25448:89::o;25542:285::-;25744:6;25732:19;;;;25714:38;;-1:-1:-1;;;;;25788:32:16;25783:2;25768:18;;25761:60;25702:2;25687:18;;25669:158::o;25832:644::-;26113:6;26101:19;;26083:38;;-1:-1:-1;;;;;26157:32:16;;26152:2;26137:18;;26130:60;26177:3;26221:2;26206:18;;26199:31;;;25832:644;;26253:47;;26280:19;;26272:6;26253:47;:::i;:::-;26350:6;26343:14;26336:22;26331:2;26320:9;26316:18;26309:50;26408:9;26400:6;26396:22;26390:3;26379:9;26375:19;26368:51;26436:34;26463:6;26455;26436:34;:::i;:::-;26428:42;26073:403;-1:-1:-1;;;;;;;;26073:403:16:o;26481:328::-;;26676:6;26668;26664:19;26653:9;26646:38;26720:2;26715;26704:9;26700:18;26693:30;26740:63;26799:2;26788:9;26784:18;26776:6;26768;26740:63;:::i;:::-;26732:71;26636:173;-1:-1:-1;;;;;26636:173:16:o;26814:803::-;;27146:3;27188:6;27180;27176:19;27165:9;27158:38;27232:2;27227;27216:9;27212:18;27205:30;27252:46;27294:2;27283:9;27279:18;27271:6;27252:46;:::i;:::-;-1:-1:-1;;;;;27334:31:16;;;;27329:2;27314:18;;27307:59;-1:-1:-1;;27397:2:16;27382:18;;27375:34;;;;27440:3;27425:19;;27418:35;;;;-1:-1:-1;;;;;27490:32:16;;;;27510:3;27469:19;;27462:61;27554:3;27539:19;;27532:35;27598:3;27583:19;;;27576:35;27244:54;27126:491;-1:-1:-1;;27126:491:16:o;27622:1038::-;;28050:3;28092:6;28084;28080:19;28069:9;28062:38;28136:2;28131;28120:9;28116:18;28109:30;28162:46;28204:2;28193:9;28189:18;28181:6;28162:46;:::i;:::-;-1:-1:-1;;;;;28244:31:16;;28239:2;28224:18;;28217:59;28307:2;28292:18;;28285:34;;;28350:3;28335:19;;28328:35;;;28394:3;28379:19;;28372:35;;;-1:-1:-1;;;;;28444:32:16;;28438:3;28423:19;;28416:61;28148:60;-1:-1:-1;28486:57:16;28538:3;28523:19;;28515:6;28486:57;:::i;:::-;28592:9;28584:6;28580:22;28574:3;28563:9;28559:19;28552:51;28620:34;28647:6;28639;28620:34;:::i;:::-;28612:42;28030:630;-1:-1:-1;;;;;;;;;;;;28030:630:16:o;28665:776::-;;29007:6;28999;28995:19;28984:9;28977:38;29051:3;29046:2;29035:9;29031:18;29024:31;29078:47;29120:3;29109:9;29105:19;29097:6;29078:47;:::i;:::-;-1:-1:-1;;;;;29165:6:16;29161:31;29156:2;29145:9;29141:18;29134:59;29229:6;29224:2;29213:9;29209:18;29202:34;29273:6;29267:3;29256:9;29252:19;29245:35;29317:6;29311:3;29300:9;29296:19;29289:35;29373:9;29365:6;29361:22;29355:3;29344:9;29340:19;29333:51;29401:34;29428:6;29420;29401:34;:::i;:::-;29393:42;28967:474;-1:-1:-1;;;;;;;;;;28967:474:16:o;29446:1560::-;;29791:3;29780:9;29776:19;29834:6;29826;29822:19;29811:9;29804:38;29861:2;29899:3;29894:2;29883:9;29879:18;29872:31;29923:4;29959:6;29953:13;29985:1;30017:2;30006:9;30002:18;30034:1;30029:180;;;;30223:1;30218:430;;;;29995:653;;30029:180;30084:1;30069:17;;30088:4;30065:28;30050:44;;-1:-1:-1;;30135:24:16;;30129:3;30114:19;;30107:53;30195:3;30180:19;;;-1:-1:-1;30029:180:16;;30218:430;30268:1;30257:9;30253:17;30298:6;30290;30283:22;30333:38;30364:6;30333:38;:::i;:::-;30393:4;30410:181;30424:6;30421:1;30418:13;30410:181;;;30518:14;;30493:17;;;30512:3;30489:27;30482:51;30561:16;;;;30439:10;;30410:181;;;30615:17;;30634:3;30611:27;;-1:-1:-1;;;29995:653:16;;;;30693:9;30688:3;30684:19;30679:2;30668:9;30664:18;30657:47;30727:31;30754:3;30746:6;30727:31;:::i;:::-;30713:45;;;;30767:56;30819:2;30808:9;30804:18;30796:6;30767:56;:::i;:::-;30832:57;30884:3;30873:9;30869:19;30861:6;30832:57;:::i;:::-;30938:9;30930:6;30926:22;30920:3;30909:9;30905:19;30898:51;30966:34;30993:6;30985;30966:34;:::i;:::-;30958:42;29752:1254;-1:-1:-1;;;;;;;;;29752:1254:16:o;31011:500::-;;31240:6;31285:2;31277:6;31273:15;31262:9;31255:34;31337:2;31329:6;31325:15;31320:2;31309:9;31305:18;31298:43;;31377:6;31372:2;31361:9;31357:18;31350:34;31420:3;31415:2;31404:9;31400:18;31393:31;31441:64;31500:3;31489:9;31485:19;31477:6;31469;31441:64;:::i;:::-;31433:72;31220:291;-1:-1:-1;;;;;;;31220:291:16:o;31516:480::-;31829:6;31817:19;;31799:38;;31868:2;31853:18;;31846:34;;;31911:2;31896:18;;31889:34;;;31786:3;31771:19;;31932:58;31986:2;31971:18;;31963:6;31932:58;:::i;32001:177::-;32147:25;;;32135:2;32120:18;;32102:76::o;32183:248::-;32357:25;;;32413:2;32398:18;;32391:34;32345:2;32330:18;;32312:119::o;32436:1095::-;;32927:3;32969:4;32961:6;32957:17;32946:9;32939:36;33023:4;33015:6;33011:17;33006:2;32995:9;32991:18;32984:45;33077:4;33069:6;33065:17;33060:2;33049:9;33045:18;33038:45;33131:4;33123:6;33119:17;33114:2;33103:9;33099:18;33092:45;33146:59;33200:3;33189:9;33185:19;33177:6;33146:59;:::i;:::-;33214:57;33266:3;33255:9;33251:19;33243:6;33214:57;:::i;:::-;33308:2;33302:3;33291:9;33287:19;33280:31;33334:63;33393:2;33382:9;33378:18;33370:6;33362;33334:63;:::i;:::-;33320:77;;33446:9;33438:6;33434:22;33428:3;33417:9;33413:19;33406:51;33474;33518:6;33510;33502;33474:51;:::i;:::-;33466:59;32907:624;-1:-1:-1;;;;;;;;;;;;;32907:624:16:o;33536:510::-;33859:4;33847:17;;;33829:36;;33901:17;;;33896:2;33881:18;;33874:45;33955:17;;33950:2;33935:18;;33928:45;33816:3;33801:19;;33982:58;34036:2;34021:18;;34013:6;33982:58;:::i;34051:741::-;;34428:4;34420:6;34416:17;34405:9;34398:36;34482:4;34474:6;34470:17;34465:2;34454:9;34450:18;34443:45;34536:4;34528:6;34524:17;34519:2;34508:9;34504:18;34497:45;34551:58;34605:2;34594:9;34590:18;34582:6;34551:58;:::i;:::-;34658:4;34650:6;34646:17;34640:3;34629:9;34625:19;34618:46;34701:3;34695;34684:9;34680:19;34673:32;34722:64;34781:3;34770:9;34766:19;34758:6;34750;34722:64;:::i;34797:850::-;;35188:3;35230:4;35222:6;35218:17;35207:9;35200:36;35284:4;35276:6;35272:17;35267:2;35256:9;35252:18;35245:45;35338:4;35330:6;35326:17;35321:2;35310:9;35306:18;35299:45;35353:58;35407:2;35396:9;35392:18;35384:6;35353:58;:::i;:::-;35460:4;35452:6;35448:17;35442:3;35431:9;35427:19;35420:46;35515:4;35507:6;35503:17;35497:3;35486:9;35482:19;35475:46;35558:2;35552:3;35541:9;35537:19;35530:31;35578:63;35637:2;35626:9;35622:18;35614:6;35606;35578:63;:::i;:::-;35570:71;35168:479;-1:-1:-1;;;;;;;;;;;35168:479:16:o;35652:476::-;35963:4;35951:17;;35933:36;;36000:2;35985:18;;35978:34;;;36043:2;36028:18;;36021:34;;;35920:3;35905:19;;36064:58;36118:2;36103:18;;36095:6;36064:58;:::i;36133:690::-;;36492:4;36484:6;36480:17;36469:9;36462:36;36534:6;36529:2;36518:9;36514:18;36507:34;36577:6;36572:2;36561:9;36557:18;36550:34;36593:58;36647:2;36636:9;36632:18;36624:6;36593:58;:::i;:::-;36688:6;36682:3;36671:9;36667:19;36660:35;36732:3;36726;36715:9;36711:19;36704:32;36753:64;36812:3;36801:9;36797:19;36789:6;36781;36753:64;:::i;36828:755::-;;37185:3;37227:4;37219:6;37215:17;37204:9;37197:36;37269:6;37264:2;37253:9;37249:18;37242:34;37312:6;37307:2;37296:9;37292:18;37285:34;37328:58;37382:2;37371:9;37367:18;37359:6;37328:58;:::i;:::-;37423:6;37417:3;37406:9;37402:19;37395:35;37467:6;37461:3;37450:9;37446:19;37439:35;37511:2;37505:3;37494:9;37490:19;37483:31;37531:46;37573:2;37562:9;37558:18;37550:6;37531:46;:::i;37588:1044::-;;38061:3;38103:4;38095:6;38091:17;38080:9;38073:36;38145:6;38140:2;38129:9;38125:18;38118:34;38188:6;38183:2;38172:9;38168:18;38161:34;38231:6;38226:2;38215:9;38211:18;38204:34;38247:59;38301:3;38290:9;38286:19;38278:6;38247:59;:::i;38637:278::-;38835:4;38823:17;;;;38805:36;;-1:-1:-1;;;;;38877:31:16;38872:2;38857:18;;38850:59;38793:2;38778:18;;38760:155::o;38920:242::-;38990:2;38984:9;39020:17;;;-1:-1:-1;;;;;39052:34:16;;39088:22;;;39049:62;39046:2;;;39114:9;39046:2;39141;39134:22;38964:198;;-1:-1:-1;38964:198:16:o;39167:181::-;;-1:-1:-1;;;;;39242:6:16;39239:30;39236:2;;;39272:9;39236:2;-1:-1:-1;39331:2:16;39308:17;-1:-1:-1;;39304:31:16;39337:4;39300:42;;39226:122::o;39353:128::-;;39420:17;;;39470:4;39454:21;;;39410:71::o;39486:258::-;39558:1;39568:113;39582:6;39579:1;39576:13;39568:113;;;39658:11;;;39652:18;39639:11;;;39632:39;39604:2;39597:10;39568:113;;;39699:6;39696:1;39693:13;39690:2;;;-1:-1:-1;;39734:1:16;39716:16;;39709:27;39539:205::o;39749:133::-;-1:-1:-1;;;;;39826:31:16;;39816:42;;39806:2;;39872:1;39869;39862:12;39806:2;39796:86;:::o;39887:120::-;39975:5;39968:13;39961:21;39954:5;39951:32;39941:2;;39997:1;39994;39987:12;40012:131;-1:-1:-1;;;;;40092:5:16;40088:30;40081:5;40078:41;40068:2;;40133:1;40130;40123:12;40148:116;40234:4;40227:5;40223:16;40216:5;40213:27;40203:2;;40254:1;40251;40244:12
Swarm Source
ipfs://74965d55741e5ec229cb2b28e91d0ded45a666403b01fd551b67baeabfdbc7ed
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $3,315.68 | 0.00230092 | $7.63 |
[ 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.