Source Code
Overview
GLMR Balance
GLMR Value
$0.00Cross-Chain Transactions
Loading...
Loading
Contract Name:
Router
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2023-01-07
*/
// File: contracts/core/interfaces/IRouter.sol
pragma solidity 0.6.12;
interface IRouter {
function addPlugin(address _plugin) external;
function pluginTransfer(address _token, address _account, address _receiver, uint256 _amount) external;
function pluginIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function pluginDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function swap(address[] memory _path, uint256 _amountIn, uint256 _minOut, address _receiver) external;
}
// File: contracts/core/interfaces/IVaultUtils.sol
pragma solidity 0.6.12;
interface IVaultUtils {
function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool);
function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view;
function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view;
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256);
function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256);
function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256);
function getBuyUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSellUsdgFeeBasisPoints(address _token, uint256 _usdgAmount) external view returns (uint256);
function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdgAmount) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
}
// File: contracts/core/interfaces/IVault.sol
pragma solidity 0.6.12;
interface IVault {
function isInitialized() external view returns (bool);
function isSwapEnabled() external view returns (bool);
function isLeverageEnabled() external view returns (bool);
function setVaultUtils(IVaultUtils _vaultUtils) external;
function setError(uint256 _errorCode, string calldata _error) external;
function router() external view returns (address);
function usdg() external view returns (address);
function gov() external view returns (address);
function whitelistedTokenCount() external view returns (uint256);
function maxLeverage() external view returns (uint256);
function minProfitTime() external view returns (uint256);
function hasDynamicFees() external view returns (bool);
function fundingInterval() external view returns (uint256);
function totalTokenWeights() external view returns (uint256);
function getTargetUsdgAmount(address _token) external view returns (uint256);
function inManagerMode() external view returns (bool);
function inPrivateLiquidationMode() external view returns (bool);
function maxGasPrice() external view returns (uint256);
function approvedRouters(address _account, address _router) external view returns (bool);
function isLiquidator(address _account) external view returns (bool);
function isManager(address _account) external view returns (bool);
function minProfitBasisPoints(address _token) external view returns (uint256);
function tokenBalances(address _token) external view returns (uint256);
function lastFundingTimes(address _token) external view returns (uint256);
function setMaxLeverage(uint256 _maxLeverage) external;
function setInManagerMode(bool _inManagerMode) external;
function setManager(address _manager, bool _isManager) external;
function setIsSwapEnabled(bool _isSwapEnabled) external;
function setIsLeverageEnabled(bool _isLeverageEnabled) external;
function setMaxGasPrice(uint256 _maxGasPrice) external;
function setUsdgAmount(address _token, uint256 _amount) external;
function setBufferAmount(address _token, uint256 _amount) external;
function setMaxGlobalShortSize(address _token, uint256 _amount) external;
function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external;
function setLiquidator(address _liquidator, bool _isActive) external;
function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external;
function setFees(
uint256 _taxBasisPoints,
uint256 _stableTaxBasisPoints,
uint256 _mintBurnFeeBasisPoints,
uint256 _swapFeeBasisPoints,
uint256 _stableSwapFeeBasisPoints,
uint256 _marginFeeBasisPoints,
uint256 _liquidationFeeUsd,
uint256 _minProfitTime,
bool _hasDynamicFees
) external;
function setTokenConfig(
address _token,
uint256 _tokenDecimals,
uint256 _redemptionBps,
uint256 _minProfitBps,
uint256 _maxUsdgAmount,
bool _isStable,
bool _isShortable
) external;
function setPriceFeed(address _priceFeed) external;
function withdrawFees(address _token, address _receiver) external returns (uint256);
function directPoolDeposit(address _token) external;
function buyUSDG(address _token, address _receiver) external returns (uint256);
function sellUSDG(address _token, address _receiver) external returns (uint256);
function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256);
function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external;
function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256);
function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256);
function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external;
function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256);
function priceFeed() external view returns (address);
function fundingRateFactor() external view returns (uint256);
function stableFundingRateFactor() external view returns (uint256);
function cumulativeFundingRates(address _token) external view returns (uint256);
function getNextFundingRate(address _token) external view returns (uint256);
function getFeeBasisPoints(address _token, uint256 _usdgDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256);
function liquidationFeeUsd() external view returns (uint256);
function taxBasisPoints() external view returns (uint256);
function stableTaxBasisPoints() external view returns (uint256);
function mintBurnFeeBasisPoints() external view returns (uint256);
function swapFeeBasisPoints() external view returns (uint256);
function stableSwapFeeBasisPoints() external view returns (uint256);
function marginFeeBasisPoints() external view returns (uint256);
function allWhitelistedTokensLength() external view returns (uint256);
function allWhitelistedTokens(uint256) external view returns (address);
function whitelistedTokens(address _token) external view returns (bool);
function stableTokens(address _token) external view returns (bool);
function shortableTokens(address _token) external view returns (bool);
function feeReserves(address _token) external view returns (uint256);
function globalShortSizes(address _token) external view returns (uint256);
function globalShortAveragePrices(address _token) external view returns (uint256);
function maxGlobalShortSizes(address _token) external view returns (uint256);
function tokenDecimals(address _token) external view returns (uint256);
function tokenWeights(address _token) external view returns (uint256);
function guaranteedUsd(address _token) external view returns (uint256);
function poolAmounts(address _token) external view returns (uint256);
function bufferAmounts(address _token) external view returns (uint256);
function reservedAmounts(address _token) external view returns (uint256);
function usdgAmounts(address _token) external view returns (uint256);
function maxUsdgAmounts(address _token) external view returns (uint256);
function getRedemptionAmount(address _token, uint256 _usdgAmount) external view returns (uint256);
function getMaxPrice(address _token) external view returns (uint256);
function getMinPrice(address _token) external view returns (uint256);
function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256);
function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256);
}
// File: contracts/tokens/interfaces/IWETH.sol
//SPDX-License-Identifier: MIT
pragma solidity 0.6.12;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}
// File: contracts/libraries/utils/Address.sol
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.3._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: contracts/libraries/token/IERC20.sol
pragma solidity 0.6.12;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/libraries/math/SafeMath.sol
pragma solidity 0.6.12;
/**
* @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, 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) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* 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);
uint256 c = a - b;
return c;
}
/**
* @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) {
// 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 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts 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) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts 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) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: contracts/libraries/token/SafeERC20.sol
pragma solidity 0.6.12;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: contracts/core/Router.sol
pragma solidity 0.6.12;
contract Router is IRouter {
using SafeMath for uint256;
using SafeERC20 for IERC20;
using Address for address payable;
address public gov;
// wrapped BNB / ETH
address public weth;
address public usdg;
address public vault;
mapping (address => bool) public plugins;
mapping (address => mapping (address => bool)) public approvedPlugins;
event Swap(address account, address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut);
modifier onlyGov() {
require(msg.sender == gov, "Router: forbidden");
_;
}
constructor(address _vault, address _usdg, address _weth) public {
vault = _vault;
usdg = _usdg;
weth = _weth;
gov = msg.sender;
}
receive() external payable {
require(msg.sender == weth, "Router: invalid sender");
}
function setGov(address _gov) external onlyGov {
gov = _gov;
}
function addPlugin(address _plugin) external override onlyGov {
plugins[_plugin] = true;
}
function removePlugin(address _plugin) external onlyGov {
plugins[_plugin] = false;
}
function approvePlugin(address _plugin) external {
approvedPlugins[msg.sender][_plugin] = true;
}
function denyPlugin(address _plugin) external {
approvedPlugins[msg.sender][_plugin] = false;
}
function pluginTransfer(address _token, address _account, address _receiver, uint256 _amount) external override {
_validatePlugin(_account);
IERC20(_token).safeTransferFrom(_account, _receiver, _amount);
}
function pluginIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external override {
_validatePlugin(_account);
IVault(vault).increasePosition(_account, _collateralToken, _indexToken, _sizeDelta, _isLong);
}
function pluginDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external override returns (uint256) {
_validatePlugin(_account);
return IVault(vault).decreasePosition(_account, _collateralToken, _indexToken, _collateralDelta, _sizeDelta, _isLong, _receiver);
}
function directPoolDeposit(address _token, uint256 _amount) external {
IERC20(_token).safeTransferFrom(_sender(), vault, _amount);
IVault(vault).directPoolDeposit(_token);
}
function swap(address[] memory _path, uint256 _amountIn, uint256 _minOut, address _receiver) public override {
IERC20(_path[0]).safeTransferFrom(_sender(), vault, _amountIn);
uint256 amountOut = _swap(_path, _minOut, _receiver);
emit Swap(msg.sender, _path[0], _path[_path.length - 1], _amountIn, amountOut);
}
function swapETHToTokens(address[] memory _path, uint256 _minOut, address _receiver) external payable {
require(_path[0] == weth, "Router: invalid _path");
_transferETHToVault();
uint256 amountOut = _swap(_path, _minOut, _receiver);
emit Swap(msg.sender, _path[0], _path[_path.length - 1], msg.value, amountOut);
}
function swapTokensToETH(address[] memory _path, uint256 _amountIn, uint256 _minOut, address payable _receiver) external {
require(_path[_path.length - 1] == weth, "Router: invalid _path");
IERC20(_path[0]).safeTransferFrom(_sender(), vault, _amountIn);
uint256 amountOut = _swap(_path, _minOut, address(this));
_transferOutETH(amountOut, _receiver);
emit Swap(msg.sender, _path[0], _path[_path.length - 1], _amountIn, amountOut);
}
function increasePosition(address[] memory _path, address _indexToken, uint256 _amountIn, uint256 _minOut, uint256 _sizeDelta, bool _isLong, uint256 _price) external {
if (_amountIn > 0) {
IERC20(_path[0]).safeTransferFrom(_sender(), vault, _amountIn);
}
if (_path.length > 1 && _amountIn > 0) {
uint256 amountOut = _swap(_path, _minOut, address(this));
IERC20(_path[_path.length - 1]).safeTransfer(vault, amountOut);
}
_increasePosition(_path[_path.length - 1], _indexToken, _sizeDelta, _isLong, _price);
}
function increasePositionETH(address[] memory _path, address _indexToken, uint256 _minOut, uint256 _sizeDelta, bool _isLong, uint256 _price) external payable {
require(_path[0] == weth, "Router: invalid _path");
if (msg.value > 0) {
_transferETHToVault();
}
if (_path.length > 1 && msg.value > 0) {
uint256 amountOut = _swap(_path, _minOut, address(this));
IERC20(_path[_path.length - 1]).safeTransfer(vault, amountOut);
}
_increasePosition(_path[_path.length - 1], _indexToken, _sizeDelta, _isLong, _price);
}
function decreasePosition(address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver, uint256 _price) external {
_decreasePosition(_collateralToken, _indexToken, _collateralDelta, _sizeDelta, _isLong, _receiver, _price);
}
function decreasePositionETH(address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address payable _receiver, uint256 _price) external {
uint256 amountOut = _decreasePosition(_collateralToken, _indexToken, _collateralDelta, _sizeDelta, _isLong, address(this), _price);
_transferOutETH(amountOut, _receiver);
}
function decreasePositionAndSwap(address[] memory _path, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver, uint256 _price, uint256 _minOut) external {
uint256 amount = _decreasePosition(_path[0], _indexToken, _collateralDelta, _sizeDelta, _isLong, address(this), _price);
IERC20(_path[0]).safeTransfer(vault, amount);
_swap(_path, _minOut, _receiver);
}
function decreasePositionAndSwapETH(address[] memory _path, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address payable _receiver, uint256 _price, uint256 _minOut) external {
require(_path[_path.length - 1] == weth, "Router: invalid _path");
uint256 amount = _decreasePosition(_path[0], _indexToken, _collateralDelta, _sizeDelta, _isLong, address(this), _price);
IERC20(_path[0]).safeTransfer(vault, amount);
uint256 amountOut = _swap(_path, _minOut, address(this));
_transferOutETH(amountOut, _receiver);
}
function _increasePosition(address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong, uint256 _price) private {
if (_isLong) {
require(IVault(vault).getMaxPrice(_indexToken) <= _price, "Router: mark price higher than limit");
} else {
require(IVault(vault).getMinPrice(_indexToken) >= _price, "Router: mark price lower than limit");
}
IVault(vault).increasePosition(_sender(), _collateralToken, _indexToken, _sizeDelta, _isLong);
}
function _decreasePosition(address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver, uint256 _price) private returns (uint256) {
if (_isLong) {
require(IVault(vault).getMinPrice(_indexToken) >= _price, "Router: mark price lower than limit");
} else {
require(IVault(vault).getMaxPrice(_indexToken) <= _price, "Router: mark price higher than limit");
}
return IVault(vault).decreasePosition(_sender(), _collateralToken, _indexToken, _collateralDelta, _sizeDelta, _isLong, _receiver);
}
function _transferETHToVault() private {
IWETH(weth).deposit{value: msg.value}();
IERC20(weth).safeTransfer(vault, msg.value);
}
function _transferOutETH(uint256 _amountOut, address payable _receiver) private {
IWETH(weth).withdraw(_amountOut);
_receiver.sendValue(_amountOut);
}
function _swap(address[] memory _path, uint256 _minOut, address _receiver) private returns (uint256) {
if (_path.length == 2) {
return _vaultSwap(_path[0], _path[1], _minOut, _receiver);
}
if (_path.length == 3) {
uint256 midOut = _vaultSwap(_path[0], _path[1], 0, address(this));
IERC20(_path[1]).safeTransfer(vault, midOut);
return _vaultSwap(_path[1], _path[2], _minOut, _receiver);
}
revert("Router: invalid _path.length");
}
function _vaultSwap(address _tokenIn, address _tokenOut, uint256 _minOut, address _receiver) private returns (uint256) {
uint256 amountOut;
if (_tokenOut == usdg) { // buyUSDG
amountOut = IVault(vault).buyUSDG(_tokenIn, _receiver);
} else if (_tokenIn == usdg) { // sellUSDG
amountOut = IVault(vault).sellUSDG(_tokenOut, _receiver);
} else { // swap
amountOut = IVault(vault).swap(_tokenIn, _tokenOut, _receiver);
}
require(amountOut >= _minOut, "Router: insufficient amountOut");
return amountOut;
}
function _sender() private view returns (address) {
return msg.sender;
}
function _validatePlugin(address _account) private view {
require(plugins[msg.sender], "Router: invalid plugin");
require(approvedPlugins[_account][msg.sender], "Router: plugin not approved");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_usdg","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"address","name":"_plugin","type":"address"}],"name":"addPlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_plugin","type":"address"}],"name":"approvePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"approvedPlugins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"decreasePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"decreasePositionAndSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"decreasePositionAndSwapETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address payable","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"decreasePositionETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_plugin","type":"address"}],"name":"denyPlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"directPoolDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"increasePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"increasePositionETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_collateralDelta","type":"uint256"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"pluginDecreasePosition","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_collateralToken","type":"address"},{"internalType":"address","name":"_indexToken","type":"address"},{"internalType":"uint256","name":"_sizeDelta","type":"uint256"},{"internalType":"bool","name":"_isLong","type":"bool"}],"name":"pluginIncreasePosition","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pluginTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"plugins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_plugin","type":"address"}],"name":"removePlugin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"swapETHToTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint256","name":"_amountIn","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"swapTokensToETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdg","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b506040516124773803806124778339818101604052606081101561003357600080fd5b5080516020820151604090920151600380546001600160a01b039384166001600160a01b0319918216179091556002805494841694821694909417909355600180549290911691831691909117905560008054909116331790556123db8061009c6000396000f3fe60806040526004361061011f5760003560e01c806312d43a51146101835780631b827878146101b45780631f1dd176146101fd5780632662166b1461024e5780632d4ba6a7146102c15780633039e37f1461038357806338c74dd9146104635780633fc8cef314610496578063430ed37c146104ab5780634b12e6431461050a5780635fc8500e146105515780636023e9661461063157806390205d8c146106f357806390b64ad314610752578063956f285e1461078b578063a4d95b64146107c6578063abe68eaa146107f9578063b32755de146108a8578063b7ddc9921461096b578063cedd437514610a41578063cfad57a214610a74578063d8867fc814610aa7578063f5b91b7b14610ada578063fbfa77cf14610aef5761017e565b3661017e576001546001600160a01b0316331461017c576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561018f57600080fd5b50610198610b04565b604080516001600160a01b039092168252519081900360200190f35b3480156101c057600080fd5b5061017c600480360360808110156101d757600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610b13565b34801561020957600080fd5b5061017c600480360360a081101561022057600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001351515610b37565b34801561025a57600080fd5b506102af600480360360e081101561027157600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013515159160c09091013516610bcc565b60408051918252519081900360200190f35b3480156102cd57600080fd5b5061017c600480360360808110156102e457600080fd5b810190602081018135600160201b8111156102fe57600080fd5b82018360208201111561031057600080fd5b803590602001918460208302840111600160201b8311171561033157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013590604001356001600160a01b0316610c8c565b34801561038f57600080fd5b5061017c60048036036101008110156103a757600080fd5b810190602081018135600160201b8111156103c157600080fd5b8201836020820111156103d357600080fd5b803590602001918460208302840111600160201b831117156103f457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505081356001600160a01b0390811693506020830135926040810135925060608101351515916080820135169060a08101359060c00135610df3565b34801561046f57600080fd5b5061017c6004803603602081101561048657600080fd5b50356001600160a01b0316610ef8565b3480156104a257600080fd5b50610198610f29565b3480156104b757600080fd5b5061017c600480360360e08110156104ce57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c00135610f38565b34801561051657600080fd5b5061053d6004803603602081101561052d57600080fd5b50356001600160a01b0316610f5f565b604080519115158252519081900360200190f35b34801561055d57600080fd5b5061017c600480360361010081101561057557600080fd5b810190602081018135600160201b81111561058f57600080fd5b8201836020820111156105a157600080fd5b803590602001918460208302840111600160201b831117156105c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505081356001600160a01b0390811693506020830135926040810135925060608101351515916080820135169060a08101359060c00135610f74565b34801561063d57600080fd5b5061017c6004803603608081101561065457600080fd5b810190602081018135600160201b81111561066e57600080fd5b82018360208201111561068057600080fd5b803590602001918460208302840111600160201b831117156106a157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013590604001356001600160a01b0316610fba565b3480156106ff57600080fd5b5061017c600480360360e081101561071657600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c00135610ff1565b34801561075e57600080fd5b5061017c6004803603604081101561077557600080fd5b506001600160a01b038135169060200135611000565b34801561079757600080fd5b5061053d600480360360408110156107ae57600080fd5b506001600160a01b038135811691602001351661108c565b3480156107d257600080fd5b5061017c600480360360208110156107e957600080fd5b50356001600160a01b03166110ac565b61017c6004803603606081101561080f57600080fd5b810190602081018135600160201b81111561082957600080fd5b82018360208201111561083b57600080fd5b803590602001918460208302840111600160201b8311171561085c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611120565b61017c600480360360c08110156108be57600080fd5b810190602081018135600160201b8111156108d857600080fd5b8201836020820111156108ea57600080fd5b803590602001918460208302840111600160201b8311171561090b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b0383351693505050602081013590604081013590606081013515159060800135611235565b34801561097757600080fd5b5061017c600480360360e081101561098e57600080fd5b810190602081018135600160201b8111156109a857600080fd5b8201836020820111156109ba57600080fd5b803590602001918460208302840111600160201b831117156109db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b0383351693505050602081013590604081013590606081013590608081013515159060a00135611325565b348015610a4d57600080fd5b5061017c60048036036020811015610a6457600080fd5b50356001600160a01b03166113d2565b348015610a8057600080fd5b5061017c60048036036020811015610a9757600080fd5b50356001600160a01b0316611400565b348015610ab357600080fd5b5061017c60048036036020811015610aca57600080fd5b50356001600160a01b0316611475565b348015610ae657600080fd5b506101986114ec565b348015610afb57600080fd5b506101986114fb565b6000546001600160a01b031681565b610b1c8361150a565b610b316001600160a01b0385168484846115e0565b50505050565b610b408561150a565b600354604080516348d91abf60e01b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690528415156084830152915191909216916348d91abf9160a480830192600092919082900301818387803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b505050505050505050565b6000610bd78861150a565b6003546040805163082a084960e41b81526001600160a01b038b811660048301528a811660248301528981166044830152606482018990526084820188905286151560a483015285811660c4830152915191909216916382a084909160e48083019260209291908290030181600087803b158015610c5457600080fd5b505af1158015610c68573d6000803e3d6000fd5b505050506040513d6020811015610c7e57600080fd5b505198975050505050505050565b60015484516001600160a01b039091169085906000198101908110610cad57fe5b60200260200101516001600160a01b031614610cfe576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b610d48610d0961163a565b60035486516001600160a01b039091169086908890600090610d2757fe5b60200260200101516001600160a01b03166115e0909392919063ffffffff16565b6000610d5585843061163e565b9050610d61818361177e565b6000805160206123388339815191523386600081518110610d7e57fe5b602002602001015187600189510381518110610d9657fe5b6020026020010151878560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050505050565b60015488516001600160a01b039091169089906000198101908110610e1457fe5b60200260200101516001600160a01b031614610e65576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b6000610e8a89600081518110610e7757fe5b60200260200101518989898930896117fb565b9050610ed3600360009054906101000a90046001600160a01b0316828b600081518110610eb357fe5b60200260200101516001600160a01b0316611a089092919063ffffffff16565b6000610ee08a843061163e565b9050610eec818661177e565b50505050505050505050565b3360009081526005602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6001546001600160a01b031681565b6000610f49888888888830886117fb565b9050610f55818461177e565b5050505050505050565b60046020526000908152604090205460ff1681565b6000610f8689600081518110610e7757fe5b9050610faf600360009054906101000a90046001600160a01b0316828b600081518110610eb357fe5b610eec89838661163e565b610fc5610d0961163a565b6000610fd285848461163e565b90506000805160206123388339815191523386600081518110610d7e57fe5b610f55878787878787876117fb565b61102261100b61163a565b6003546001600160a01b03858116929116846115e0565b60035460408051635f7bc11960e01b81526001600160a01b03858116600483015291519190921691635f7bc11991602480830192600092919082900301818387803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b031633146110ff576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60015483516001600160a01b0390911690849060009061113c57fe5b60200260200101516001600160a01b03161461118d576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b611195611a5f565b60006111a284848461163e565b905060008051602061233883398151915233856000815181106111c157fe5b6020026020010151866001885103815181106111d957fe5b6020026020010151348560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a150505050565b60015486516001600160a01b0390911690879060009061125157fe5b60200260200101516001600160a01b0316146112a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b34156112b0576112b0611a5f565b600186511180156112c15750600034115b156113015760006112d387863061163e565b90506112ff600360009054906101000a90046001600160a01b0316828960018b510381518110610eb357fe5b505b6110848660018851038151811061131457fe5b602002602001015186858585611ae8565b84156113545761135461133661163a565b60035489516001600160a01b039091169088908b90600090610d2757fe5b600187511180156113655750600085115b156113a557600061137788863061163e565b90506113a3600360009054906101000a90046001600160a01b0316828a60018c510381518110610eb357fe5b505b6113c9876001895103815181106113b857fe5b602002602001015187858585611ae8565b50505050505050565b3360009081526005602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b6000546001600160a01b03163314611453576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114c8576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6002546001600160a01b031681565b6003546001600160a01b031681565b3360009081526004602052604090205460ff16611567576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21038363ab3b4b760511b604482015290519081900360640190fd5b6001600160a01b038116600090815260056020908152604080832033845290915290205460ff166115dd576040805162461bcd60e51b815260206004820152601b60248201527a149bdd5d195c8e881c1b1d59da5b881b9bdd08185c1c1c9bdd9959602a1b604482015290519081900360640190fd5b50565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610b31908590611ce3565b3390565b60008351600214156116855761167e8460008151811061165a57fe5b60200260200101518560018151811061166f57fe5b60200260200101518585611d94565b9050611777565b83516003141561172b5760006116c6856000815181106116a157fe5b6020026020010151866001815181106116b657fe5b6020026020010151600030611d94565b90506116ef600360009054906101000a90046001600160a01b03168287600181518110610eb357fe5b611723856001815181106116ff57fe5b60200260200101518660028151811061171457fe5b60200260200101518686611d94565b915050611777565b6040805162461bcd60e51b815260206004820152601c60248201527b0a4deeae8cae47440d2dcecc2d8d2c840bee0c2e8d05cd8cadccee8d60231b604482015290519081900360640190fd5b9392505050565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156117cb57600080fd5b505af11580156117df573d6000803e3d6000fd5b506117f7925050506001600160a01b03821683611f92565b5050565b600083156118c157600354604080516340d3096b60e11b81526001600160a01b038a811660048301529151859392909216916381a612d691602480820192602092909190829003018186803b15801561185357600080fd5b505afa158015611867573d6000803e3d6000fd5b505050506040513d602081101561187d57600080fd5b505110156118bc5760405162461bcd60e51b81526004018080602001828103825260238152602001806123156023913960400191505060405180910390fd5b61197a565b60035460408051637092736960e11b81526001600160a01b038a8116600483015291518593929092169163e124e6d291602480820192602092909190829003018186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d602081101561193b57600080fd5b5051111561197a5760405162461bcd60e51b81526004018080602001828103825260248152602001806123826024913960400191505060405180910390fd5b6003546001600160a01b03166382a0849061199361163a565b604080516001600160e01b031960e085901b1681526001600160a01b039283166004820152828d166024820152828c166044820152606481018b9052608481018a905288151560a482015291871660c48301525160e48083019260209291908290030181600087803b158015610c5457600080fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a5a908490611ce3565b505050565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b5050600354600154611ae694506001600160a01b03908116935016905034611a08565b565b8115611bac5760035460408051637092736960e11b81526001600160a01b03878116600483015291518493929092169163e124e6d291602480820192602092909190829003018186803b158015611b3e57600080fd5b505afa158015611b52573d6000803e3d6000fd5b505050506040513d6020811015611b6857600080fd5b50511115611ba75760405162461bcd60e51b81526004018080602001828103825260248152602001806123826024913960400191505060405180910390fd5b611c65565b600354604080516340d3096b60e11b81526001600160a01b0387811660048301529151849392909216916381a612d691602480820192602092909190829003018186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d6020811015611c2657600080fd5b50511015611c655760405162461bcd60e51b81526004018080602001828103825260238152602001806123156023913960400191505060405180910390fd5b6003546001600160a01b03166348d91abf611c7e61163a565b604080516001600160e01b031960e085901b1681526001600160a01b039283166004820152828a16602482015291881660448301526064820187905285151560848301525160a480830192600092919082900301818387803b158015610bad57600080fd5b6060611d38826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120779092919063ffffffff16565b805190915015611a5a57808060200190516020811015611d5757600080fd5b5051611a5a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612358602a913960400191505060405180910390fd5b60025460009081906001600160a01b0386811691161415611e39576003546040805163817bb85760e01b81526001600160a01b03898116600483015286811660248301529151919092169163817bb8579160448083019260209291908290030181600087803b158015611e0657600080fd5b505af1158015611e1a573d6000803e3d6000fd5b505050506040513d6020811015611e3057600080fd5b50519050611f34565b6002546001600160a01b0387811691161415611ea65760035460408051630711e61960e41b81526001600160a01b03888116600483015286811660248301529151919092169163711e61909160448083019260209291908290030181600087803b158015611e0657600080fd5b60035460408051634998b10960e11b81526001600160a01b038981166004830152888116602483015286811660448301529151919092169163933162129160648083019260209291908290030181600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d6020811015611f2f57600080fd5b505190505b83811015611f89576040805162461bcd60e51b815260206004820152601e60248201527f526f757465723a20696e73756666696369656e7420616d6f756e744f75740000604482015290519081900360640190fd5b95945050505050565b80471015611fe7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612032576040519150601f19603f3d011682016040523d82523d6000602084013e612037565b606091505b5050905080611a5a5760405162461bcd60e51b815260040180806020018281038252603a8152602001806122b5603a913960400191505060405180910390fd5b6060612086848460008561208e565b949350505050565b6060824710156120cf5760405162461bcd60e51b81526004018080602001828103825260268152602001806122ef6026913960400191505060405180910390fd5b6120d8856121ea565b612129576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106121685780518252601f199092019160209182019101612149565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146121ca576040519150601f19603f3d011682016040523d82523d6000602084013e6121cf565b606091505b50915091506121df8282866121f0565b979650505050505050565b3b151590565b606083156121ff575081611777565b82511561220f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612259578181015183820152602001612241565b50505050905090810190601f1680156122865780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe526f757465723a20696e76616c6964205f706174680000000000000000000000416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526f757465723a206d61726b207072696365206c6f776572207468616e206c696d6974cd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526f757465723a206d61726b20707269636520686967686572207468616e206c696d6974a26469706673582212208dfc0deff7fd2c4b6e91f89d320e6d73a4cff4e5952dc4f45ce9a5f50084cae964736f6c634300060c00330000000000000000000000009c761b1666225601abd68f009d11cd3cae13748c000000000000000000000000b20fe6632d2dd2e6a028236cb4f95ed21b5c9c4a000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode
0x60806040526004361061011f5760003560e01c806312d43a51146101835780631b827878146101b45780631f1dd176146101fd5780632662166b1461024e5780632d4ba6a7146102c15780633039e37f1461038357806338c74dd9146104635780633fc8cef314610496578063430ed37c146104ab5780634b12e6431461050a5780635fc8500e146105515780636023e9661461063157806390205d8c146106f357806390b64ad314610752578063956f285e1461078b578063a4d95b64146107c6578063abe68eaa146107f9578063b32755de146108a8578063b7ddc9921461096b578063cedd437514610a41578063cfad57a214610a74578063d8867fc814610aa7578063f5b91b7b14610ada578063fbfa77cf14610aef5761017e565b3661017e576001546001600160a01b0316331461017c576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561018f57600080fd5b50610198610b04565b604080516001600160a01b039092168252519081900360200190f35b3480156101c057600080fd5b5061017c600480360360808110156101d757600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135610b13565b34801561020957600080fd5b5061017c600480360360a081101561022057600080fd5b506001600160a01b038135811691602081013582169160408201351690606081013590608001351515610b37565b34801561025a57600080fd5b506102af600480360360e081101561027157600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101359160808201359160a081013515159160c09091013516610bcc565b60408051918252519081900360200190f35b3480156102cd57600080fd5b5061017c600480360360808110156102e457600080fd5b810190602081018135600160201b8111156102fe57600080fd5b82018360208201111561031057600080fd5b803590602001918460208302840111600160201b8311171561033157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013590604001356001600160a01b0316610c8c565b34801561038f57600080fd5b5061017c60048036036101008110156103a757600080fd5b810190602081018135600160201b8111156103c157600080fd5b8201836020820111156103d357600080fd5b803590602001918460208302840111600160201b831117156103f457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505081356001600160a01b0390811693506020830135926040810135925060608101351515916080820135169060a08101359060c00135610df3565b34801561046f57600080fd5b5061017c6004803603602081101561048657600080fd5b50356001600160a01b0316610ef8565b3480156104a257600080fd5b50610198610f29565b3480156104b757600080fd5b5061017c600480360360e08110156104ce57600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c00135610f38565b34801561051657600080fd5b5061053d6004803603602081101561052d57600080fd5b50356001600160a01b0316610f5f565b604080519115158252519081900360200190f35b34801561055d57600080fd5b5061017c600480360361010081101561057557600080fd5b810190602081018135600160201b81111561058f57600080fd5b8201836020820111156105a157600080fd5b803590602001918460208302840111600160201b831117156105c257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550505081356001600160a01b0390811693506020830135926040810135925060608101351515916080820135169060a08101359060c00135610f74565b34801561063d57600080fd5b5061017c6004803603608081101561065457600080fd5b810190602081018135600160201b81111561066e57600080fd5b82018360208201111561068057600080fd5b803590602001918460208302840111600160201b831117156106a157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602081013590604001356001600160a01b0316610fba565b3480156106ff57600080fd5b5061017c600480360360e081101561071657600080fd5b506001600160a01b0381358116916020810135821691604082013591606081013591608082013515159160a08101359091169060c00135610ff1565b34801561075e57600080fd5b5061017c6004803603604081101561077557600080fd5b506001600160a01b038135169060200135611000565b34801561079757600080fd5b5061053d600480360360408110156107ae57600080fd5b506001600160a01b038135811691602001351661108c565b3480156107d257600080fd5b5061017c600480360360208110156107e957600080fd5b50356001600160a01b03166110ac565b61017c6004803603606081101561080f57600080fd5b810190602081018135600160201b81111561082957600080fd5b82018360208201111561083b57600080fd5b803590602001918460208302840111600160201b8311171561085c57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955050823593505050602001356001600160a01b0316611120565b61017c600480360360c08110156108be57600080fd5b810190602081018135600160201b8111156108d857600080fd5b8201836020820111156108ea57600080fd5b803590602001918460208302840111600160201b8311171561090b57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b0383351693505050602081013590604081013590606081013515159060800135611235565b34801561097757600080fd5b5061017c600480360360e081101561098e57600080fd5b810190602081018135600160201b8111156109a857600080fd5b8201836020820111156109ba57600080fd5b803590602001918460208302840111600160201b831117156109db57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550506001600160a01b0383351693505050602081013590604081013590606081013590608081013515159060a00135611325565b348015610a4d57600080fd5b5061017c60048036036020811015610a6457600080fd5b50356001600160a01b03166113d2565b348015610a8057600080fd5b5061017c60048036036020811015610a9757600080fd5b50356001600160a01b0316611400565b348015610ab357600080fd5b5061017c60048036036020811015610aca57600080fd5b50356001600160a01b0316611475565b348015610ae657600080fd5b506101986114ec565b348015610afb57600080fd5b506101986114fb565b6000546001600160a01b031681565b610b1c8361150a565b610b316001600160a01b0385168484846115e0565b50505050565b610b408561150a565b600354604080516348d91abf60e01b81526001600160a01b03888116600483015287811660248301528681166044830152606482018690528415156084830152915191909216916348d91abf9160a480830192600092919082900301818387803b158015610bad57600080fd5b505af1158015610bc1573d6000803e3d6000fd5b505050505050505050565b6000610bd78861150a565b6003546040805163082a084960e41b81526001600160a01b038b811660048301528a811660248301528981166044830152606482018990526084820188905286151560a483015285811660c4830152915191909216916382a084909160e48083019260209291908290030181600087803b158015610c5457600080fd5b505af1158015610c68573d6000803e3d6000fd5b505050506040513d6020811015610c7e57600080fd5b505198975050505050505050565b60015484516001600160a01b039091169085906000198101908110610cad57fe5b60200260200101516001600160a01b031614610cfe576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b610d48610d0961163a565b60035486516001600160a01b039091169086908890600090610d2757fe5b60200260200101516001600160a01b03166115e0909392919063ffffffff16565b6000610d5585843061163e565b9050610d61818361177e565b6000805160206123388339815191523386600081518110610d7e57fe5b602002602001015187600189510381518110610d9657fe5b6020026020010151878560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a15050505050565b60015488516001600160a01b039091169089906000198101908110610e1457fe5b60200260200101516001600160a01b031614610e65576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b6000610e8a89600081518110610e7757fe5b60200260200101518989898930896117fb565b9050610ed3600360009054906101000a90046001600160a01b0316828b600081518110610eb357fe5b60200260200101516001600160a01b0316611a089092919063ffffffff16565b6000610ee08a843061163e565b9050610eec818661177e565b50505050505050505050565b3360009081526005602090815260408083206001600160a01b0394909416835292905220805460ff19166001179055565b6001546001600160a01b031681565b6000610f49888888888830886117fb565b9050610f55818461177e565b5050505050505050565b60046020526000908152604090205460ff1681565b6000610f8689600081518110610e7757fe5b9050610faf600360009054906101000a90046001600160a01b0316828b600081518110610eb357fe5b610eec89838661163e565b610fc5610d0961163a565b6000610fd285848461163e565b90506000805160206123388339815191523386600081518110610d7e57fe5b610f55878787878787876117fb565b61102261100b61163a565b6003546001600160a01b03858116929116846115e0565b60035460408051635f7bc11960e01b81526001600160a01b03858116600483015291519190921691635f7bc11991602480830192600092919082900301818387803b15801561107057600080fd5b505af1158015611084573d6000803e3d6000fd5b505050505050565b600560209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b031633146110ff576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19169055565b60015483516001600160a01b0390911690849060009061113c57fe5b60200260200101516001600160a01b03161461118d576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b611195611a5f565b60006111a284848461163e565b905060008051602061233883398151915233856000815181106111c157fe5b6020026020010151866001885103815181106111d957fe5b6020026020010151348560405180866001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020018281526020019550505050505060405180910390a150505050565b60015486516001600160a01b0390911690879060009061125157fe5b60200260200101516001600160a01b0316146112a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612295833981519152604482015290519081900360640190fd5b34156112b0576112b0611a5f565b600186511180156112c15750600034115b156113015760006112d387863061163e565b90506112ff600360009054906101000a90046001600160a01b0316828960018b510381518110610eb357fe5b505b6110848660018851038151811061131457fe5b602002602001015186858585611ae8565b84156113545761135461133661163a565b60035489516001600160a01b039091169088908b90600090610d2757fe5b600187511180156113655750600085115b156113a557600061137788863061163e565b90506113a3600360009054906101000a90046001600160a01b0316828a60018c510381518110610eb357fe5b505b6113c9876001895103815181106113b857fe5b602002602001015187858585611ae8565b50505050505050565b3360009081526005602090815260408083206001600160a01b0394909416835292905220805460ff19169055565b6000546001600160a01b03163314611453576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146114c8576040805162461bcd60e51b81526020600482015260116024820152702937baba32b91d103337b93134b23232b760791b604482015290519081900360640190fd5b6001600160a01b03166000908152600460205260409020805460ff19166001179055565b6002546001600160a01b031681565b6003546001600160a01b031681565b3360009081526004602052604090205460ff16611567576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21038363ab3b4b760511b604482015290519081900360640190fd5b6001600160a01b038116600090815260056020908152604080832033845290915290205460ff166115dd576040805162461bcd60e51b815260206004820152601b60248201527a149bdd5d195c8e881c1b1d59da5b881b9bdd08185c1c1c9bdd9959602a1b604482015290519081900360640190fd5b50565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610b31908590611ce3565b3390565b60008351600214156116855761167e8460008151811061165a57fe5b60200260200101518560018151811061166f57fe5b60200260200101518585611d94565b9050611777565b83516003141561172b5760006116c6856000815181106116a157fe5b6020026020010151866001815181106116b657fe5b6020026020010151600030611d94565b90506116ef600360009054906101000a90046001600160a01b03168287600181518110610eb357fe5b611723856001815181106116ff57fe5b60200260200101518660028151811061171457fe5b60200260200101518686611d94565b915050611777565b6040805162461bcd60e51b815260206004820152601c60248201527b0a4deeae8cae47440d2dcecc2d8d2c840bee0c2e8d05cd8cadccee8d60231b604482015290519081900360640190fd5b9392505050565b60015460408051632e1a7d4d60e01b81526004810185905290516001600160a01b0390921691632e1a7d4d9160248082019260009290919082900301818387803b1580156117cb57600080fd5b505af11580156117df573d6000803e3d6000fd5b506117f7925050506001600160a01b03821683611f92565b5050565b600083156118c157600354604080516340d3096b60e11b81526001600160a01b038a811660048301529151859392909216916381a612d691602480820192602092909190829003018186803b15801561185357600080fd5b505afa158015611867573d6000803e3d6000fd5b505050506040513d602081101561187d57600080fd5b505110156118bc5760405162461bcd60e51b81526004018080602001828103825260238152602001806123156023913960400191505060405180910390fd5b61197a565b60035460408051637092736960e11b81526001600160a01b038a8116600483015291518593929092169163e124e6d291602480820192602092909190829003018186803b15801561191157600080fd5b505afa158015611925573d6000803e3d6000fd5b505050506040513d602081101561193b57600080fd5b5051111561197a5760405162461bcd60e51b81526004018080602001828103825260248152602001806123826024913960400191505060405180910390fd5b6003546001600160a01b03166382a0849061199361163a565b604080516001600160e01b031960e085901b1681526001600160a01b039283166004820152828d166024820152828c166044820152606481018b9052608481018a905288151560a482015291871660c48301525160e48083019260209291908290030181600087803b158015610c5457600080fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611a5a908490611ce3565b505050565b600160009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611aaf57600080fd5b505af1158015611ac3573d6000803e3d6000fd5b5050600354600154611ae694506001600160a01b03908116935016905034611a08565b565b8115611bac5760035460408051637092736960e11b81526001600160a01b03878116600483015291518493929092169163e124e6d291602480820192602092909190829003018186803b158015611b3e57600080fd5b505afa158015611b52573d6000803e3d6000fd5b505050506040513d6020811015611b6857600080fd5b50511115611ba75760405162461bcd60e51b81526004018080602001828103825260248152602001806123826024913960400191505060405180910390fd5b611c65565b600354604080516340d3096b60e11b81526001600160a01b0387811660048301529151849392909216916381a612d691602480820192602092909190829003018186803b158015611bfc57600080fd5b505afa158015611c10573d6000803e3d6000fd5b505050506040513d6020811015611c2657600080fd5b50511015611c655760405162461bcd60e51b81526004018080602001828103825260238152602001806123156023913960400191505060405180910390fd5b6003546001600160a01b03166348d91abf611c7e61163a565b604080516001600160e01b031960e085901b1681526001600160a01b039283166004820152828a16602482015291881660448301526064820187905285151560848301525160a480830192600092919082900301818387803b158015610bad57600080fd5b6060611d38826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166120779092919063ffffffff16565b805190915015611a5a57808060200190516020811015611d5757600080fd5b5051611a5a5760405162461bcd60e51b815260040180806020018281038252602a815260200180612358602a913960400191505060405180910390fd5b60025460009081906001600160a01b0386811691161415611e39576003546040805163817bb85760e01b81526001600160a01b03898116600483015286811660248301529151919092169163817bb8579160448083019260209291908290030181600087803b158015611e0657600080fd5b505af1158015611e1a573d6000803e3d6000fd5b505050506040513d6020811015611e3057600080fd5b50519050611f34565b6002546001600160a01b0387811691161415611ea65760035460408051630711e61960e41b81526001600160a01b03888116600483015286811660248301529151919092169163711e61909160448083019260209291908290030181600087803b158015611e0657600080fd5b60035460408051634998b10960e11b81526001600160a01b038981166004830152888116602483015286811660448301529151919092169163933162129160648083019260209291908290030181600087803b158015611f0557600080fd5b505af1158015611f19573d6000803e3d6000fd5b505050506040513d6020811015611f2f57600080fd5b505190505b83811015611f89576040805162461bcd60e51b815260206004820152601e60248201527f526f757465723a20696e73756666696369656e7420616d6f756e744f75740000604482015290519081900360640190fd5b95945050505050565b80471015611fe7576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114612032576040519150601f19603f3d011682016040523d82523d6000602084013e612037565b606091505b5050905080611a5a5760405162461bcd60e51b815260040180806020018281038252603a8152602001806122b5603a913960400191505060405180910390fd5b6060612086848460008561208e565b949350505050565b6060824710156120cf5760405162461bcd60e51b81526004018080602001828103825260268152602001806122ef6026913960400191505060405180910390fd5b6120d8856121ea565b612129576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106121685780518252601f199092019160209182019101612149565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146121ca576040519150601f19603f3d011682016040523d82523d6000602084013e6121cf565b606091505b50915091506121df8282866121f0565b979650505050505050565b3b151590565b606083156121ff575081611777565b82511561220f5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612259578181015183820152602001612241565b50505050905090810190601f1680156122865780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe526f757465723a20696e76616c6964205f706174680000000000000000000000416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526f757465723a206d61726b207072696365206c6f776572207468616e206c696d6974cd3829a3813dc3cdd188fd3d01dcf3268c16be2fdd2dd21d0665418816e460625361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526f757465723a206d61726b20707269636520686967686572207468616e206c696d6974a26469706673582212208dfc0deff7fd2c4b6e91f89d320e6d73a4cff4e5952dc4f45ce9a5f50084cae964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009c761b1666225601abd68f009d11cd3cae13748c000000000000000000000000b20fe6632d2dd2e6a028236cb4f95ed21b5c9c4a000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
-----Decoded View---------------
Arg [0] : _vault (address): 0x9c761b1666225601ABD68f009D11CD3caE13748c
Arg [1] : _usdg (address): 0xb20fE6632D2dD2E6A028236cB4f95Ed21b5C9C4a
Arg [2] : _weth (address): 0xAcc15dC74880C9944775448304B263D191c6077F
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c761b1666225601abd68f009d11cd3cae13748c
Arg [1] : 000000000000000000000000b20fe6632d2dd2e6a028236cb4f95ed21b5c9c4a
Arg [2] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f
Deployed Bytecode Sourcemap
30241:9732:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31096:4;;-1:-1:-1;;;;;31096:4:0;31082:10;:18;31074:53;;;;;-1:-1:-1;;;31074:53:0;;;;;;;;;;;;-1:-1:-1;;;31074:53:0;;;;;;;;;;;;;;;30241:9732;;;;;30383:18;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;30383:18:0;;;;;;;;;;;;;;31682:228;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31682:228:0;;;;;;;;;;;;;;;;;;;;;;:::i;31918:296::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31918:296:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32222:395::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32222:395:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;33542:482;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33542:482:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33542:482:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33542:482:0;;-1:-1:-1;;33542:482:0;;;-1:-1:-1;;;33542:482:0;;;;;;;;-1:-1:-1;;;;;33542:482:0;;:::i;36398:594::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36398:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36398:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36398:594:0;;-1:-1:-1;;;36398:594:0;;-1:-1:-1;;;;;36398:594:0;;;;-1:-1:-1;36398:594:0;;;;;;;;;;-1:-1:-1;36398:594:0;;;;;;;;;;;;;;;;;;;;;;:::i;31446:111::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31446:111:0;-1:-1:-1;;;;;31446:111:0;;:::i;30436:19::-;;;;;;;;;;;;;:::i;35562:385::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35562:385:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;30517:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30517:40:0;-1:-1:-1;;;;;30517:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;35955:435;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35955:435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35955:435:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35955:435:0;;-1:-1:-1;;;35955:435:0;;-1:-1:-1;;;;;35955:435:0;;;;-1:-1:-1;35955:435:0;;;;;;;;;;-1:-1:-1;35955:435:0;;;;;;;;;;;;;;;;;;;;;;:::i;32829:342::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32829:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;32829:342:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32829:342:0;;-1:-1:-1;;32829:342:0;;;-1:-1:-1;;;32829:342:0;;;;;;;;-1:-1:-1;;;;;32829:342:0;;:::i;35252:302::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35252:302:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;32625:196::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;32625:196:0;;;;;;;;:::i;30564:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30564:69:0;;;;;;;;;;:::i;31339:99::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31339:99:0;-1:-1:-1;;;;;31339:99:0;;:::i;33179:355::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33179:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33179:355:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33179:355:0;;-1:-1:-1;;33179:355:0;;;-1:-1:-1;;;33179:355:0;;;-1:-1:-1;;;;;33179:355:0;;:::i;34636:608::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34636:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34636:608:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34636:608:0;;-1:-1:-1;;;;;;;34636:608:0;;;;-1:-1:-1;;;34636:608:0;;;;;;;;;;;;;;;;;;;;;:::i;34032:596::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34032:596:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34032:596:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34032:596:0;;-1:-1:-1;;;;;;;34032:596:0;;;;-1:-1:-1;;;34032:596:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;31565:109::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31565:109:0;-1:-1:-1;;;;;31565:109:0;;:::i;31143:76::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31143:76:0;-1:-1:-1;;;;;31143:76:0;;:::i;31227:104::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31227:104:0;-1:-1:-1;;;;;31227:104:0;;:::i;30462:19::-;;;;;;;;;;;;;:::i;30488:20::-;;;;;;;;;;;;;:::i;30383:18::-;;;-1:-1:-1;;;;;30383:18:0;;:::o;31682:228::-;31805:25;31821:8;31805:15;:25::i;:::-;31841:61;-1:-1:-1;;;;;31841:31:0;;31873:8;31883:9;31894:7;31841:31;:61::i;:::-;31682:228;;;;:::o;31918:296::-;32078:25;32094:8;32078:15;:25::i;:::-;32121:5;;32114:92;;;-1:-1:-1;;;32114:92:0;;-1:-1:-1;;;;;32114:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32121:5;;;;;32114:30;;:92;;;;;32121:5;;32114:92;;;;;;;32121:5;;32114:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31918:296;;;;;:::o;32222:395::-;32425:7;32445:25;32461:8;32445:15;:25::i;:::-;32495:5;;32488:121;;;-1:-1:-1;;;32488:121:0;;-1:-1:-1;;;;;32488:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32495:5;;;;;32488:30;;:121;;;;;;;;;;;;;;32495:5;;32488:121;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32488:121:0;;32222:395;-1:-1:-1;;;;;;;;32222:395:0:o;33542:482::-;33709:4;;33688:12;;-1:-1:-1;;;;;33709:4:0;;;;33682:5;;-1:-1:-1;;33688:16:0;;;33682:23;;;;;;;;;;;;-1:-1:-1;;;;;33682:31:0;;33674:65;;;;;-1:-1:-1;;;33674:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33674:65:0;;;;;;;;;;;;;;;33750:62;33784:9;:7;:9::i;:::-;33795:5;;33757:8;;-1:-1:-1;;;;;33795:5:0;;;;33802:9;;33757:5;;33795;;33757:8;;;;;;;;;;-1:-1:-1;;;;;33750:33:0;;;:62;;;;;;:::i;:::-;33823:17;33843:36;33849:5;33856:7;33873:4;33843:5;:36::i;:::-;33823:56;;33890:37;33906:9;33917;33890:15;:37::i;:::-;-1:-1:-1;;;;;;;;;;;33948:10:0;33960:5;33966:1;33960:8;;;;;;;;;;;;;;33970:5;33991:1;33976:5;:12;:16;33970:23;;;;;;;;;;;;;;33995:9;34006;33943:73;;;;-1:-1:-1;;;;;33943:73:0;;;;;;-1:-1:-1;;;;;33943:73:0;;;;;;-1:-1:-1;;;;;33943:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33542:482;;;;;:::o;36398:594::-;36654:4;;36633:12;;-1:-1:-1;;;;;36654:4:0;;;;36627:5;;-1:-1:-1;;36633:16:0;;;36627:23;;;;;;;;;;;;-1:-1:-1;;;;;36627:31:0;;36619:65;;;;;-1:-1:-1;;;36619:65:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36619:65:0;;;;;;;;;;;;;;;36695:14;36712:102;36730:5;36736:1;36730:8;;;;;;;;;;;;;;36740:11;36753:16;36771:10;36783:7;36800:4;36807:6;36712:17;:102::i;:::-;36695:119;;36825:44;36855:5;;;;;;;;;-1:-1:-1;;;;;36855:5:0;36862:6;36832:5;36838:1;36832:8;;;;;;;;;;;;;;-1:-1:-1;;;;;36825:29:0;;;:44;;;;;:::i;:::-;36880:17;36900:36;36906:5;36913:7;36930:4;36900:5;:36::i;:::-;36880:56;;36947:37;36963:9;36974;36947:15;:37::i;:::-;36398:594;;;;;;;;;;:::o;31446:111::-;31522:10;31506:27;;;;:15;:27;;;;;;;;-1:-1:-1;;;;;31506:36:0;;;;;;;;;;:43;;-1:-1:-1;;31506:43:0;31545:4;31506:43;;;31446:111::o;30436:19::-;;;-1:-1:-1;;;;;30436:19:0;;:::o;35562:385::-;35761:17;35781:110;35799:16;35817:11;35830:16;35848:10;35860:7;35877:4;35884:6;35781:17;:110::i;:::-;35761:130;;35902:37;35918:9;35929;35902:15;:37::i;:::-;35562:385;;;;;;;;:::o;30517:40::-;;;;;;;;;;;;;;;:::o;35955:435::-;36165:14;36182:102;36200:5;36206:1;36200:8;;;;;;;36182:102;36165:119;;36295:44;36325:5;;;;;;;;;-1:-1:-1;;;;;36325:5:0;36332:6;36302:5;36308:1;36302:8;;;;;;;36295:44;36350:32;36356:5;36363:7;36372:9;36350:5;:32::i;32829:342::-;32949:62;32983:9;:7;:9::i;32949:62::-;33022:17;33042:32;33048:5;33055:7;33064:9;33042:5;:32::i;:::-;33022:52;;-1:-1:-1;;;;;;;;;;;33095:10:0;33107:5;33113:1;33107:8;;;;;;;35252:302;35440:106;35458:16;35476:11;35489:16;35507:10;35519:7;35528:9;35539:6;35440:17;:106::i;32625:196::-;32705:58;32737:9;:7;:9::i;:::-;32748:5;;-1:-1:-1;;;;;32705:31:0;;;;:58;32748:5;32755:7;32705:31;:58::i;:::-;32781:5;;32774:39;;;-1:-1:-1;;;32774:39:0;;-1:-1:-1;;;;;32774:39:0;;;;;;;;;32781:5;;;;;32774:31;;:39;;;;;32781:5;;32774:39;;;;;;;32781:5;;32774:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32625:196;;:::o;30564:69::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31339:99::-;30802:3;;-1:-1:-1;;;;;30802:3:0;30788:10;:17;30780:47;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31406:16:0::1;31425:5;31406:16:::0;;;:7:::1;:16;::::0;;;;:24;;-1:-1:-1;;31406:24:0::1;::::0;;31339:99::o;33179:355::-;33312:4;;33300:8;;-1:-1:-1;;;;;33312:4:0;;;;33300:5;;33312:4;;33300:8;;;;;;;;;;-1:-1:-1;;;;;33300:16:0;;33292:50;;;;;-1:-1:-1;;;33292:50:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33292:50:0;;;;;;;;;;;;;;;33353:21;:19;:21::i;:::-;33385:17;33405:32;33411:5;33418:7;33427:9;33405:5;:32::i;:::-;33385:52;;-1:-1:-1;;;;;;;;;;;33458:10:0;33470:5;33476:1;33470:8;;;;;;;;;;;;;;33480:5;33501:1;33486:5;:12;:16;33480:23;;;;;;;;;;;;;;33505:9;33516;33453:73;;;;-1:-1:-1;;;;;33453:73:0;;;;;;-1:-1:-1;;;;;33453:73:0;;;;;;-1:-1:-1;;;;;33453:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33179:355;;;;:::o;34636:608::-;34825:4;;34813:8;;-1:-1:-1;;;;;34825:4:0;;;;34813:5;;34825:4;;34813:8;;;;;;;;;;-1:-1:-1;;;;;34813:16:0;;34805:50;;;;;-1:-1:-1;;;34805:50:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;34805:50:0;;;;;;;;;;;;;;;34870:9;:13;34866:67;;34900:21;:19;:21::i;:::-;34962:1;34947:5;:12;:16;:33;;;;;34979:1;34967:9;:13;34947:33;34943:199;;;34997:17;35017:36;35023:5;35030:7;35047:4;35017:5;:36::i;:::-;34997:56;;35068:62;35113:5;;;;;;;;;-1:-1:-1;;;;;35113:5:0;35120:9;35075:5;35096:1;35081:5;:12;:16;35075:23;;;;;;;35068:62;34943:199;;35152:84;35170:5;35191:1;35176:5;:12;:16;35170:23;;;;;;;;;;;;;;35195:11;35208:10;35220:7;35229:6;35152:17;:84::i;34032:596::-;34213:13;;34209:108;;34243:62;34277:9;:7;:9::i;:::-;34288:5;;34250:8;;-1:-1:-1;;;;;34288:5:0;;;;34295:9;;34250:5;;34288;;34250:8;;;34243:62;34346:1;34331:5;:12;:16;:33;;;;;34363:1;34351:9;:13;34331:33;34327:199;;;34381:17;34401:36;34407:5;34414:7;34431:4;34401:5;:36::i;:::-;34381:56;;34452:62;34497:5;;;;;;;;;-1:-1:-1;;;;;34497:5:0;34504:9;34459:5;34480:1;34465:5;:12;:16;34459:23;;;;;;;34452:62;34327:199;;34536:84;34554:5;34575:1;34560:5;:12;:16;34554:23;;;;;;;;;;;;;;34579:11;34592:10;34604:7;34613:6;34536:17;:84::i;:::-;34032:596;;;;;;;:::o;31565:109::-;31638:10;31661:5;31622:27;;;:15;:27;;;;;;;;-1:-1:-1;;;;;31622:36:0;;;;;;;;;;:44;;-1:-1:-1;;31622:44:0;;;31565:109::o;31143:76::-;30802:3;;-1:-1:-1;;;;;30802:3:0;30788:10;:17;30780:47;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;;;;31201:3:::1;:10:::0;;-1:-1:-1;;;;;;31201:10:0::1;-1:-1:-1::0;;;;;31201:10:0;;;::::1;::::0;;;::::1;::::0;;31143:76::o;31227:104::-;30802:3;;-1:-1:-1;;;;;30802:3:0;30788:10;:17;30780:47;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;-1:-1:-1;;;30780:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;31300:16:0::1;;::::0;;;:7:::1;:16;::::0;;;;:23;;-1:-1:-1;;31300:23:0::1;31319:4;31300:23;::::0;;31227:104::o;30462:19::-;;;-1:-1:-1;;;;;30462:19:0;;:::o;30488:20::-;;;-1:-1:-1;;;;;30488:20:0;;:::o;39753:217::-;39836:10;39828:19;;;;:7;:19;;;;;;;;39820:54;;;;;-1:-1:-1;;;39820:54:0;;;;;;;;;;;;-1:-1:-1;;;39820:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39893:25:0;;;;;;:15;:25;;;;;;;;39919:10;39893:37;;;;;;;;;;39885:77;;;;;-1:-1:-1;;;39885:77:0;;;;;;;;;;;;-1:-1:-1;;;39885:77:0;;;;;;;;;;;;;;;39753:217;:::o;27270:205::-;27398:68;;;-1:-1:-1;;;;;27398:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27398:68:0;-1:-1:-1;;;27398:68:0;;;27371:96;;27391:5;;27371:19;:96::i;39659:86::-;39727:10;39659:86;:::o;38499:533::-;38591:7;38615:5;:12;38631:1;38615:17;38611:107;;;38656:50;38667:5;38673:1;38667:8;;;;;;;;;;;;;;38677:5;38683:1;38677:8;;;;;;;;;;;;;;38687:7;38696:9;38656:10;:50::i;:::-;38649:57;;;;38611:107;38732:5;:12;38748:1;38732:17;38728:246;;;38766:14;38783:48;38794:5;38800:1;38794:8;;;;;;;;;;;;;;38804:5;38810:1;38804:8;;;;;;;;;;;;;;38814:1;38825:4;38783:10;:48::i;:::-;38766:65;;38846:44;38876:5;;;;;;;;;-1:-1:-1;;;;;38876:5:0;38883:6;38853:5;38859:1;38853:8;;;;;;;38846:44;38912:50;38923:5;38929:1;38923:8;;;;;;;;;;;;;;38933:5;38939:1;38933:8;;;;;;;;;;;;;;38943:7;38952:9;38912:10;:50::i;:::-;38905:57;;;;;38728:246;38986:38;;;-1:-1:-1;;;38986:38:0;;;;;;;;;;;;-1:-1:-1;;;38986:38:0;;;;;;;;;;;;;;38499:533;;;;;;:::o;38318:173::-;38415:4;;38409:32;;;-1:-1:-1;;;38409:32:0;;;;;;;;;;-1:-1:-1;;;;;38415:4:0;;;;38409:20;;:32;;;;;38415:4;;38409:32;;;;;;;;38415:4;;38409:32;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38452:31:0;;-1:-1:-1;;;;;;;;38452:19:0;;38472:10;38452:19;:31::i;:::-;38318:173;;:::o;37530:621::-;37716:7;37740;37736:266;;;37779:5;;37772:38;;;-1:-1:-1;;;37772:38:0;;-1:-1:-1;;;;;37772:38:0;;;;;;;;;37814:6;;37779:5;;;;;37772:25;;:38;;;;;;;;;;;;;;;37779:5;37772:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37772:38:0;:48;;37764:96;;;;-1:-1:-1;;;37764:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37736:266;;;37908:5;;37901:38;;;-1:-1:-1;;;37901:38:0;;-1:-1:-1;;;;;37901:38:0;;;;;;;;;37943:6;;37908:5;;;;;37901:25;;:38;;;;;;;;;;;;;;;37908:5;37901:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37901:38:0;:48;;37893:97;;;;-1:-1:-1;;;37893:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38028:5;;-1:-1:-1;;;;;38028:5:0;38021:30;38052:9;:7;:9::i;:::-;38021:122;;;-1:-1:-1;;;;;;38021:122:0;;;;;;;-1:-1:-1;;;;;38021:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38021:122:0;;;;;;;;;;;27085:177;27195:58;;;-1:-1:-1;;;;;27195:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27195:58:0;-1:-1:-1;;;27195:58:0;;;27168:86;;27188:5;;27168:19;:86::i;:::-;27085:177;;;:::o;38159:151::-;38215:4;;;;;;;;;-1:-1:-1;;;;;38215:4:0;-1:-1:-1;;;;;38209:19:0;;38236:9;38209:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38285:5:0;;;38266:4;38259:43;;-1:-1:-1;;;;;;38266:4:0;;;;-1:-1:-1;38285:5:0;;-1:-1:-1;38292:9:0;38259:25;:43::i;:::-;38159:151::o;37000:522::-;37147:7;37143:266;;;37186:5;;37179:38;;;-1:-1:-1;;;37179:38:0;;-1:-1:-1;;;;;37179:38:0;;;;;;;;;37221:6;;37186:5;;;;;37179:25;;:38;;;;;;;;;;;;;;;37186:5;37179:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37179:38:0;:48;;37171:97;;;;-1:-1:-1;;;37171:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37143:266;;;37316:5;;37309:38;;;-1:-1:-1;;;37309:38:0;;-1:-1:-1;;;;;37309:38:0;;;;;;;;;37351:6;;37316:5;;;;;37309:25;;:38;;;;;;;;;;;;;;;37316:5;37309:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37309:38:0;:48;;37301:96;;;;-1:-1:-1;;;37301:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37428:5;;-1:-1:-1;;;;;37428:5:0;37421:30;37452:9;:7;:9::i;:::-;37421:93;;;-1:-1:-1;;;;;;37421:93:0;;;;;;;-1:-1:-1;;;;;37421:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37421:93:0;;;;;;;-1:-1:-1;37421:93:0;;;;;;;;;;;29390:761;29814:23;29840:69;29868:4;29840:69;;;;;;;;;;;;;;;;;29848:5;-1:-1:-1;;;;;29840:27:0;;;:69;;;;;:::i;:::-;29924:17;;29814:95;;-1:-1:-1;29924:21:0;29920:224;;30066:10;30055:30;;;;;;;;;;;;;;;-1:-1:-1;30055:30:0;30047:85;;;;-1:-1:-1;;;30047:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39040:611;39217:4;;39150:7;;;;-1:-1:-1;;;;;39204:17:0;;;39217:4;;39204:17;39200:341;;;39268:5;;39261:42;;;-1:-1:-1;;;39261:42:0;;-1:-1:-1;;;;;39261:42:0;;;;;;;;;;;;;;;;39268:5;;;;;39261:21;;:42;;;;;;;;;;;;;;39268:5;;39261:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39261:42:0;;-1:-1:-1;39200:341:0;;;39337:4;;-1:-1:-1;;;;;39325:16:0;;;39337:4;;39325:16;39321:220;;;39389:5;;39382:44;;;-1:-1:-1;;;39382:44:0;;-1:-1:-1;;;;;39382:44:0;;;;;;;;;;;;;;;;39389:5;;;;;39382:22;;:44;;;;;;;;;;;;;;39389:5;;39382:44;;;;;;;;;;39321:220;39486:5;;39479:50;;;-1:-1:-1;;;39479:50:0;;-1:-1:-1;;;;;39479:50:0;;;;;;;;;;;;;;;;;;;;;;;39486:5;;;;;39479:18;;:50;;;;;;;;;;;;;;39486:5;;39479:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39479:50:0;;-1:-1:-1;39321:220:0;39574:7;39561:9;:20;;39553:63;;;;;-1:-1:-1;;;39553:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39634:9;39040:611;-1:-1:-1;;;;;39040:611:0:o;12361:397::-;12476:6;12451:21;:31;;12443:73;;;;;-1:-1:-1;;;12443:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12626:35;;12608:12;;-1:-1:-1;;;;;12626:14:0;;;12649:6;;12608:12;12626:35;12608:12;12626:35;12649:6;12626:14;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12607:54;;;12680:7;12672:78;;;;-1:-1:-1;;;12672:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13922:195;14025:12;14057:52;14079:6;14087:4;14093:1;14096:12;14057:21;:52::i;:::-;14050:59;13922:195;-1:-1:-1;;;;13922:195:0:o;14974:530::-;15101:12;15159:5;15134:21;:30;;15126:81;;;;-1:-1:-1;;;15126:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15226:18;15237:6;15226:10;:18::i;:::-;15218:60;;;;;-1:-1:-1;;;15218:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15352:12;15366:23;15393:6;-1:-1:-1;;;;;15393:11:0;15413:5;15421:4;15393:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15393:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15351:75;;;;15444:52;15462:7;15471:10;15483:12;15444:17;:52::i;:::-;15437:59;14974:530;-1:-1:-1;;;;;;;14974:530:0:o;11004:422::-;11371:20;11410:8;;;11004:422::o;17514:742::-;17629:12;17658:7;17654:595;;;-1:-1:-1;17689:10:0;17682:17;;17654:595;17803:17;;:21;17799:439;;18066:10;18060:17;18127:15;18114:10;18110:2;18106:19;18099:44;18014:148;18209:12;18202:20;;-1:-1:-1;;;18202:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://8dfc0deff7fd2c4b6e91f89d320e6d73a4cff4e5952dc4f45ce9a5f50084cae9
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.