Source Code
Latest 25 from a total of 402 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Approve | 11080349 | 244 days ago | OUT | 0 GLMR | 0 | ||||
| Approve | 11077096 | 244 days ago | OUT | 0 GLMR | 0 | ||||
| Approve | 11076871 | 244 days ago | OUT | 0 GLMR | 0 | ||||
| Withdraw | 8225694 | 447 days ago | IN | 0 GLMR | 0.05072 | ||||
| Withdraw | 8225691 | 447 days ago | IN | 0 GLMR | 0.105086 | ||||
| Withdraw | 8225678 | 447 days ago | IN | 0 GLMR | 0.105086 | ||||
| Withdraw | 8225672 | 447 days ago | IN | 0 GLMR | 0.04488 | ||||
| Transfer | 8225666 | 447 days ago | IN | 20 GLMR | 0.036962 | ||||
| Sweep | 8225631 | 447 days ago | IN | 0 GLMR | 0.262056 | ||||
| Transfer Ownersh... | 8225615 | 447 days ago | IN | 0 GLMR | 0.03869008 | ||||
| Zap In Token | 4383734 | 874 days ago | IN | 0 GLMR | 0.07050159 | ||||
| Zap In | 4374505 | 875 days ago | IN | 997.5 GLMR | 0.05774569 | ||||
| Withdraw | 4370077 | 876 days ago | IN | 0 GLMR | 0.02716008 | ||||
| Zap In | 4333954 | 881 days ago | IN | 5,890.00371857 GLMR | 0.06003607 | ||||
| Zap In | 4327931 | 882 days ago | IN | 40,762.75400361 GLMR | 0.06016603 | ||||
| Zap In Token | 4315001 | 884 days ago | IN | 0 GLMR | 0.05981173 | ||||
| Zap In Token | 4291679 | 887 days ago | IN | 0 GLMR | 0.06802897 | ||||
| Zap In | 4258024 | 892 days ago | IN | 3,770 GLMR | 0.06163711 | ||||
| Zap In | 4250318 | 893 days ago | IN | 1,650 GLMR | 0.06461049 | ||||
| Zap In | 4180273 | 902 days ago | IN | 30 GLMR | 0.06231885 | ||||
| Zap In | 4180134 | 903 days ago | IN | 400 GLMR | 0.06216753 | ||||
| Zap In Token | 4142131 | 908 days ago | IN | 0 GLMR | 0.03823317 | ||||
| Zap In | 4123409 | 910 days ago | IN | 10 GLMR | 0.03433817 | ||||
| Zap In | 4123315 | 910 days ago | IN | 50 GLMR | 0.03630992 | ||||
| Zap In Token | 4116691 | 911 days ago | IN | 0 GLMR | 0.03359321 |
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 8225631 | 447 days ago | 5,565.70885532 GLMR | ||||
| 8225631 | 447 days ago | 5,052.49193231 GLMR | ||||
| 4374505 | 875 days ago | 0.03171492 GLMR | ||||
| 4374505 | 875 days ago | 496.25625 GLMR | ||||
| 4374505 | 875 days ago | 496.25625 GLMR | ||||
| 4333954 | 881 days ago | 2,930.27684998 GLMR | ||||
| 4333954 | 881 days ago | 2,930.27684998 GLMR | ||||
| 4327931 | 882 days ago | 20,279.4701168 GLMR | ||||
| 4327931 | 882 days ago | 20,279.4701168 GLMR | ||||
| 4258024 | 892 days ago | 1,875.575 GLMR | ||||
| 4258024 | 892 days ago | 1,875.575 GLMR | ||||
| 4250318 | 893 days ago | 820.875 GLMR | ||||
| 4250318 | 893 days ago | 820.875 GLMR | ||||
| 4180273 | 902 days ago | 0.03618473 GLMR | ||||
| 4180273 | 902 days ago | 14.925 GLMR | ||||
| 4180273 | 902 days ago | 14.925 GLMR | ||||
| 4180134 | 903 days ago | 0.2969246 GLMR | ||||
| 4180134 | 903 days ago | 199 GLMR | ||||
| 4180134 | 903 days ago | 199 GLMR | ||||
| 4123409 | 910 days ago | 0.01121876 GLMR | ||||
| 4123409 | 910 days ago | 4.975 GLMR | ||||
| 4123409 | 910 days ago | 4.975 GLMR | ||||
| 4123315 | 910 days ago | 0.05924425 GLMR | ||||
| 4123315 | 910 days ago | 24.875 GLMR | ||||
| 4123315 | 910 days ago | 24.875 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Zap
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* Stellaswap
* MIT License; modified from TraderJoe from PancakeBunny
*
*/
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol";
import "../amm/interfaces/IStellaSwapV2Pair.sol";
import "../amm/interfaces/IStellaSwapV2Factory.sol";
import "../amm/interfaces/IStellaSwapV2Router02.sol";
import "../amm/interfaces/IWETH.sol";
contract Zap is OwnableUpgradeable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
/* ========== CONSTANT VARIABLES ========== */
address public STELLA;
address public constant USDC = 0x931715FEE2d06333043d11F658C8CE934aC61D0c;
address public constant WGLMR = 0xAcc15dC74880C9944775448304B263D191c6077F;
IStellaSwapV2Router02 private ROUTER;
IStellaSwapV2Factory stellaFactory = IStellaSwapV2Factory(0x68A384D826D3678f78BB9FB1533c7E9577dACc0E);
/* ========== STATE VARIABLES ========== */
mapping(address => bool) private notLP;
mapping(address => address) private routePairAddresses;
address[] public tokens;
uint256 public zapInFees; // divided by 10,000
uint256 public zapOutFees; // divided by 10,000
/* ========== INITIALIZER ========== */
function initialize(address _stella, address _router) external initializer {
__Ownable_init();
require(owner() != address(0), "ZapETH: owner must be set");
STELLA = _stella;
ROUTER = IStellaSwapV2Router02(_router);
setNotLP(WGLMR);
setNotLP(USDC);
setNotLP(STELLA);
zapInFees = 50;
zapOutFees = 25;
}
receive() external payable {}
/* ========== View Functions ========== */
function isLP(address _address) public view returns (bool) {
return !notLP[_address];
}
function routePair(address _address) external view returns (address) {
return routePairAddresses[_address];
}
/* ========== External Functions ========== */
function zapInToken(
address _from,
uint256 amount,
address _to
) external {
IERC20(_from).safeTransferFrom(msg.sender, address(this), amount);
_approveTokenIfNeeded(_from);
if (isLP(_to)) {
IStellaSwapV2Pair pair = IStellaSwapV2Pair(_to);
address token0 = pair.token0();
address token1 = pair.token1();
if (_from == token0 || _from == token1) {
uint256 toDeduct = amount.mul(zapInFees).div(10000); // charge 0.5% fees.
amount = amount.sub(toDeduct);
// swap half amount for other
address other = _from == token0 ? token1 : token0;
_approveTokenIfNeeded(other);
uint256 sellAmount = amount.div(2);
uint256 otherAmount = _swap(_from, sellAmount, other, address(this));
ROUTER.addLiquidity(
_from,
other,
amount.sub(sellAmount),
otherAmount,
0,
0,
msg.sender,
block.timestamp
);
}
}
}
function zapIn(address _to) external payable {
_swapGLMRToLP(_to, msg.value, msg.sender);
}
function zapOut(address _from, uint256 amount) external {
IERC20(_from).safeTransferFrom(msg.sender, address(this), amount);
_approveTokenIfNeeded(_from);
uint256 toDeduct = amount.mul(zapOutFees).div(10000); // charge 0.5% fees.
amount = amount.sub(toDeduct);
if (!isLP(_from)) {
_swapTokenForGLMR(_from, amount, msg.sender);
} else {
IStellaSwapV2Pair pair = IStellaSwapV2Pair(_from);
address tokenA = pair.token0();
address tokenB = pair.token1();
(address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA);
address realPair = stellaFactory.getPair(token0, token1);
require(address(_from) == realPair, "not real pair");
if (token0 == WGLMR || token1 == WGLMR) {
ROUTER.removeLiquidityETH(
token0 != WGLMR ? token0 : token1,
amount,
0,
0,
msg.sender,
block.timestamp
);
} else {
ROUTER.removeLiquidity(token0, token1, amount, 0, 0, msg.sender, block.timestamp);
}
}
}
/* ========== Private Functions ========== */
function _approveTokenIfNeeded(address token) private {
if (IERC20(token).allowance(address(this), address(ROUTER)) == 0) {
IERC20(token).safeApprove(address(ROUTER), type(uint128).max);
}
}
function _swapGLMRToLP(
address lp,
uint256 amount,
address receiver
) private {
uint256 toDeduct = amount.mul(zapInFees).div(10000); // charge 0.5% fees.
amount = amount.sub(toDeduct);
if (!isLP(lp)) {
_swapGLMRForToken(lp, amount, receiver);
} else {
// lp
IStellaSwapV2Pair pair = IStellaSwapV2Pair(lp);
address token0 = pair.token0();
address token1 = pair.token1();
if (token0 == WGLMR || token1 == WGLMR) {
address token = token0 == WGLMR ? token1 : token0;
uint256 swapValue = amount.div(2);
uint256 tokenAmount = _swapGLMRForToken(token, swapValue, address(this));
_approveTokenIfNeeded(token);
ROUTER.addLiquidityETH{value: amount.sub(swapValue)}(
token,
tokenAmount,
0,
0,
receiver,
block.timestamp
);
} else {
uint256 swapValue = amount.div(2);
uint256 token0Amount = _swapGLMRForToken(token0, swapValue, address(this));
uint256 token1Amount = _swapGLMRForToken(token1, amount.sub(swapValue), address(this));
_approveTokenIfNeeded(token0);
_approveTokenIfNeeded(token1);
ROUTER.addLiquidity(token0, token1, token0Amount, token1Amount, 0, 0, receiver, block.timestamp);
}
}
}
function _swapGLMRForToken(
address token,
uint256 value,
address receiver
) private returns (uint256) {
address[] memory path;
if (routePairAddresses[token] != address(0)) {
path = new address[](3);
path[0] = WGLMR;
path[1] = routePairAddresses[token];
path[2] = token;
} else {
path = new address[](2);
path[0] = WGLMR;
path[1] = token;
}
uint256[] memory amounts = ROUTER.swapExactETHForTokens{value: value}(0, path, receiver, block.timestamp);
return amounts[amounts.length - 1];
}
function _swapTokenForGLMR(
address token,
uint256 amount,
address receiver
) private returns (uint256) {
address[] memory path;
if (routePairAddresses[token] != address(0)) {
path = new address[](3);
path[0] = token;
path[1] = routePairAddresses[token];
path[2] = WGLMR;
} else {
path = new address[](2);
path[0] = token;
path[1] = WGLMR;
}
uint256[] memory amounts = ROUTER.swapExactTokensForETH(amount, 0, path, receiver, block.timestamp);
return amounts[amounts.length - 1];
}
function _swap(
address _from,
uint256 amount,
address _to,
address receiver
) private returns (uint256) {
address[] memory path;
path = new address[](2);
path[0] = _from;
path[1] = _to;
uint256[] memory amounts = ROUTER.swapExactTokensForTokens(amount, 0, path, receiver, block.timestamp);
return amounts[amounts.length - 1];
}
/* ========== RESTRICTED FUNCTIONS ========== */
function setRoutePairAddress(address asset, address route) external onlyOwner {
routePairAddresses[asset] = route;
}
function setNotLP(address token) public onlyOwner {
bool needPush = notLP[token] == false;
notLP[token] = true;
if (needPush) {
tokens.push(token);
}
}
function removeToken(uint256 i) external onlyOwner {
address token = tokens[i];
notLP[token] = false;
tokens[i] = tokens[tokens.length - 1];
tokens.pop();
}
function sweep() external onlyOwner {
for (uint256 i = 0; i < tokens.length; i++) {
address token = tokens[i];
if (token == address(0)) continue;
uint256 amount = IERC20(token).balanceOf(address(this));
if (amount > 0) {
if (token == WGLMR) {
IWETH(token).withdraw(amount);
} else {
_swapTokenForGLMR(token, amount, owner());
}
}
}
uint256 balance = address(this).balance;
if (balance > 0) {
payable(owner()).transfer(balance);
}
}
function withdraw(address token) external onlyOwner {
if (token == address(0)) {
payable(owner()).transfer(address(this).balance);
return;
}
IERC20(token).transfer(owner(), IERC20(token).balanceOf(address(this)));
}
function setZapInFees(uint256 _newZapInFees) public onlyOwner {
require(
0 <= _newZapInFees && _newZapInFees <= 200,
"Zap In Fees cannot be more than 2%"
);
zapInFees = _newZapInFees;
}
function setZapOutFees(uint256 _newZapOutFees) public onlyOwner {
require(
0 <= _newZapOutFees && _newZapOutFees <= 200,
"Zap Out Fees cannot be more than 2%"
);
zapOutFees = _newZapOutFees;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.
/**
* @dev Wrappers over Solidity's arithmetic operations.
*
* NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
* now has built in overflow checking.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
/**
* @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 a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator.
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* 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) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../../../utils/Address.sol";
/**
* @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 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'
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_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
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/ContextUpgradeable.sol";
import "../proxy/utils/Initializable.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal onlyInitializing {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal onlyInitializing {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
uint256[49] private __gap;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;
interface IStellaSwapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
function setSwapFee(uint32 _swapFee) external;
function setDevFee(uint32 _devFee) external;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;
interface IStellaSwapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function migrator() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
function setMigrator(address) external;
function setDevFee(address _pair, uint8 _devFee) external;
function setSwapFee(address _pair, uint32 _swapFee) external;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.2;
import './IStellaSwapV2Router01.sol';
interface IStellaSwapV2Router02 is IStellaSwapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;
interface IWETH {
function deposit() external payable;
function transfer(address to, uint value) external returns (bool);
function withdraw(uint) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @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;
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");
(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");
(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");
(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.4._
*/
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.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
import "../proxy/utils/Initializable.sol";
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract ContextUpgradeable is Initializable {
function __Context_init() internal onlyInitializing {
__Context_init_unchained();
}
function __Context_init_unchained() internal onlyInitializing {
}
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
uint256[50] private __gap;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)
pragma solidity ^0.8.0;
import "../../utils/AddressUpgradeable.sol";
/**
* @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed
* behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an
* external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer
* function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.
*
* TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as
* possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.
*
* CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure
* that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.
*
* [CAUTION]
* ====
* Avoid leaving a contract uninitialized.
*
* An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation
* contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the
* initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:
*
* [.hljs-theme-light.nopadding]
* ```
* /// @custom:oz-upgrades-unsafe-allow constructor
* constructor() initializer {}
* ```
* ====
*/
abstract contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private _initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private _initializing;
/**
* @dev Modifier to protect an initializer function from being invoked twice.
*/
modifier initializer() {
// If the contract is initializing we ignore whether _initialized is set in order to support multiple
// inheritance patterns, but we only do this in the context of a constructor, because in other contexts the
// contract may have been reentered.
require(_initializing ? _isConstructor() : !_initialized, "Initializable: contract is already initialized");
bool isTopLevelCall = !_initializing;
if (isTopLevelCall) {
_initializing = true;
_initialized = true;
}
_;
if (isTopLevelCall) {
_initializing = false;
}
}
/**
* @dev Modifier to protect an initialization function so that it can only be invoked by functions with the
* {initializer} modifier, directly or indirectly.
*/
modifier onlyInitializing() {
require(_initializing, "Initializable: contract is not initializing");
_;
}
function _isConstructor() private view returns (bool) {
return !AddressUpgradeable.isContract(address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library AddressUpgradeable {
/**
* @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;
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");
(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");
(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");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.6.2;
interface IStellaSwapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"STELLA","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WGLMR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_stella","type":"address"},{"internalType":"address","name":"_router","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isLP","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"routePair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"setNotLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"route","type":"address"}],"name":"setRoutePairAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newZapInFees","type":"uint256"}],"name":"setZapInFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newZapOutFees","type":"uint256"}],"name":"setZapOutFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"zapIn","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"zapInFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"zapInToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"zapOut","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zapOutFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60806040527368a384d826d3678f78bb9fb1533c7e9577dacc0e606760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034801561006557600080fd5b506145c2806100756000396000f3fe6080604052600436106101395760003560e01c806366280fdc116100ab5780638da5cb5b1161006f5780638da5cb5b146103e157806391d754c41461040c578063985c9d5614610437578063d9139f6314610474578063f2fde38b1461049d578063fe47068d146104c657610140565b806366280fdc1461030c5780636f1b606114610337578063715018a6146103625780637df0f7671461037957806389a30271146103b657610140565b806323a66e1c116100fd57806323a66e1c1461021457806335faa4161461023d57806336c5d72414610254578063485cc9551461027d5780634f64b2be146102a657806351cff8d9146102e357610140565b80630e8891af146101455780631085815b146101705780631c286c8a146101995780631c4009f9146101c25780631eff9adb146101eb57610140565b3661014057005b600080fd5b34801561015157600080fd5b5061015a6104e2565b60405161016791906133ca565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190613425565b6104e8565b005b3480156101a557600080fd5b506101c060048036038101906101bb91906134b0565b6105bf565b005b3480156101ce57600080fd5b506101e960048036038101906101e491906134f0565b6106bd565b005b3480156101f757600080fd5b50610212600480360381019061020d9190613543565b6109d8565b005b34801561022057600080fd5b5061023b60048036038101906102369190613425565b610b71565b005b34801561024957600080fd5b50610252610c48565b005b34801561026057600080fd5b5061027b60048036038101906102769190613425565b610f1b565b005b34801561028957600080fd5b506102a4600480360381019061029f91906134b0565b611129565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190613425565b611384565b6040516102da919061357f565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190613543565b6113c3565b005b34801561031857600080fd5b506103216115c9565b60405161032e91906133ca565b60405180910390f35b34801561034357600080fd5b5061034c6115cf565b604051610359919061357f565b60405180910390f35b34801561036e57600080fd5b506103776115f5565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613543565b61167d565b6040516103ad91906135b5565b60405180910390f35b3480156103c257600080fd5b506103cb6116d4565b6040516103d8919061357f565b60405180910390f35b3480156103ed57600080fd5b506103f66116ec565b604051610403919061357f565b60405180910390f35b34801561041857600080fd5b50610421611716565b60405161042e919061357f565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613543565b61172e565b60405161046b919061357f565b60405180910390f35b34801561048057600080fd5b5061049b600480360381019061049691906135d0565b611797565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613543565b611cb4565b005b6104e060048036038101906104db9190613543565b611dab565b005b606b5481565b6104f0611db9565b73ffffffffffffffffffffffffffffffffffffffff1661050e6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055b9061366d565b60405180910390fd5b80600011158015610576575060c88111155b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac906136ff565b60405180910390fd5b80606c8190555050565b6105c7611db9565b73ffffffffffffffffffffffffffffffffffffffff166105e56116ec565b73ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106329061366d565b60405180910390fd5b80606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6106ea3330848673ffffffffffffffffffffffffffffffffffffffff16611dc1909392919063ffffffff16565b6106f383611e4a565b6106fc8161167d565b156109d357600081905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107779190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ea9190613734565b90508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061085157508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b156109cf576000610881612710610873606b5489611f5290919063ffffffff16565b611f6890919063ffffffff16565b90506108968187611f7e90919063ffffffff16565b955060008373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146108d357836108d5565b825b90506108e081611e4a565b60006108f6600289611f6890919063ffffffff16565b905060006109068a838530611f94565b9050606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337008b8561095b868e611f7e90919063ffffffff16565b8560008033426040518963ffffffff1660e01b81526004016109849897969594939291906137a6565b6060604051808303816000875af11580156109a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c79190613839565b505050505050505b5050505b505050565b6109e0611db9565b73ffffffffffffffffffffffffffffffffffffffff166109fe6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b9061366d565b60405180910390fd5b6000801515606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151490506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015610b6d57606a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b610b79611db9565b73ffffffffffffffffffffffffffffffffffffffff16610b976116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be49061366d565b60405180910390fd5b80600011158015610bff575060c88111155b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906138fe565b60405180910390fd5b80606b8190555050565b610c50611db9565b73ffffffffffffffffffffffffffffffffffffffff16610c6e6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061366d565b60405180910390fd5b60005b606a80549050811015610eba576000606a8281548110610cea57610ce961391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d515750610ea7565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d8c919061357f565b602060405180830381865afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd919061394d565b90506000811115610ea45773acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e8f578173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610e5891906133ca565b600060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b50505050610ea3565b610ea18282610e9c6116ec565b612166565b505b5b50505b8080610eb2906139a9565b915050610cc7565b5060004790506000811115610f1857610ed16116ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f16573d6000803e3d6000fd5b505b50565b610f23611db9565b73ffffffffffffffffffffffffffffffffffffffff16610f416116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061366d565b60405180910390fd5b6000606a8281548110610fad57610fac61391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550606a6001606a8054905061104691906139f1565b815481106110575761105661391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606a83815481106110965761109561391e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a8054806110f0576110ef613a25565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050565b600060019054906101000a900460ff166111515760008054906101000a900460ff161561115a565b611159612590565b5b611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090613ac6565b60405180910390fd5b60008060019054906101000a900460ff1615905080156111e9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6111f16125a1565b600073ffffffffffffffffffffffffffffffffffffffff166112116116ec565b73ffffffffffffffffffffffffffffffffffffffff1603611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613b32565b60405180910390fd5b82606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061130673acc15dc74880c9944775448304b263d191c6077f6109d8565b61132373931715fee2d06333043d11f658c8ce934ac61d0c6109d8565b61134e606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166109d8565b6032606b819055506019606c81905550801561137f5760008060016101000a81548160ff0219169083151502179055505b505050565b606a818154811061139457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113cb611db9565b73ffffffffffffffffffffffffffffffffffffffff166113e96116ec565b73ffffffffffffffffffffffffffffffffffffffff161461143f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114369061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114c65761147b6116ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114c0573d6000803e3d6000fd5b506115c6565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114ea6116ec565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611523919061357f565b602060405180830381865afa158015611540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611564919061394d565b6040518363ffffffff1660e01b8152600401611581929190613b52565b6020604051808303816000875af11580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c49190613ba7565b505b50565b606c5481565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115fd611db9565b73ffffffffffffffffffffffffffffffffffffffff1661161b6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614611671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116689061366d565b60405180910390fd5b61167b6000612602565b565b6000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b73931715fee2d06333043d11f658c8ce934ac61d0c81565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73acc15dc74880c9944775448304b263d191c6077f81565b6000606960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6117c43330838573ffffffffffffffffffffffffffffffffffffffff16611dc1909392919063ffffffff16565b6117cd82611e4a565b60006117f86127106117ea606c5485611f5290919063ffffffff16565b611f6890919063ffffffff16565b905061180d8183611f7e90919063ffffffff16565b91506118188361167d565b61182d57611827838333612166565b50611caf565b600083905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a39190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613734565b90506000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611955578284611958565b83835b915091506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390584846040518363ffffffff1660e01b81526004016119bb929190613bd4565b602060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190613734565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613c49565b60405180910390fd5b73acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611af9575073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611bfb57606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302751cec73acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b895783611b8b565b845b8a60008033426040518763ffffffff1660e01b8152600401611bb296959493929190613c69565b60408051808303816000875af1158015611bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf49190613cca565b5050611ca8565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa2abde84848b60008033426040518863ffffffff1660e01b8152600401611c639796959493929190613d0a565b60408051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca59190613cca565b50505b5050505050505b505050565b611cbc611db9565b73ffffffffffffffffffffffffffffffffffffffff16611cda6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d279061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613deb565b60405180910390fd5b611da881612602565b50565b611db68134336126c8565b50565b600033905090565b611e44846323b872dd60e01b858585604051602401611de293929190613e0b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b07565b50505050565b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611ea9929190613bd4565b602060405180830381865afa158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea919061394d565b03611f4f57611f4e606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff80168373ffffffffffffffffffffffffffffffffffffffff16612bce9092919063ffffffff16565b5b50565b60008183611f609190613e42565b905092915050565b60008183611f769190613eb3565b905092915050565b60008183611f8c91906139f1565b905092915050565b60006060600267ffffffffffffffff811115611fb357611fb2613ee4565b5b604051908082528060200260200182016040528015611fe15781602001602082028036833780820191505090505b5090508581600081518110611ff957611ff861391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816001815181106120485761204761391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398760008588426040518663ffffffff1660e01b81526004016120e8959493929190613fd1565b6000604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121309190614155565b9050806001825161214191906139f1565b815181106121525761215161391e565b5b602002602001015192505050949350505050565b60006060600073ffffffffffffffffffffffffffffffffffffffff16606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123ae57600367ffffffffffffffff81111561221857612217613ee4565b5b6040519080825280602002602001820160405280156122465781602001602082028036833780820191505090505b509050848160008151811061225e5761225d61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061230c5761230b61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073acc15dc74880c9944775448304b263d191c6077f8160028151811061236f5761236e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506124ad565b600267ffffffffffffffff8111156123c9576123c8613ee4565b5b6040519080825280602002602001820160405280156123f75781602001602082028036833780820191505090505b509050848160008151811061240f5761240e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073acc15dc74880c9944775448304b263d191c6077f816001815181106124725761247161391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58660008588426040518663ffffffff1660e01b8152600401612513959493929190613fd1565b6000604051808303816000875af1158015612532573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061255b9190614155565b9050806001825161256c91906139f1565b8151811061257d5761257c61391e565b5b6020026020010151925050509392505050565b600061259b30612d1d565b15905090565b600060019054906101000a900460ff166125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614210565b60405180910390fd5b6125f8612d30565b612600612d81565b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126f36127106126e5606b5486611f5290919063ffffffff16565b611f6890919063ffffffff16565b90506127088184611f7e90919063ffffffff16565b92506127138461167d565b61272857612722848484612de2565b50612b01565b600084905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561277a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279e9190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128119190613734565b905073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806128a0575073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156129ef57600073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128f457826128f6565b815b9050600061290e600289611f6890919063ffffffff16565b9050600061291d838330612de2565b905061292883611e4a565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719612979848c611f7e90919063ffffffff16565b85846000808e426040518863ffffffff1660e01b81526004016129a196959493929190613c69565b60606040518083038185885af11580156129bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129e49190613839565b505050505050612afd565b6000612a05600288611f6890919063ffffffff16565b90506000612a14848330612de2565b90506000612a3584612a2f858c611f7e90919063ffffffff16565b30612de2565b9050612a4085611e4a565b612a4984611e4a565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700868685856000808f426040518963ffffffff1660e01b8152600401612ab39897969594939291906137a6565b6060604051808303816000875af1158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af69190613839565b5050505050505b5050505b50505050565b6000612b69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661320b9092919063ffffffff16565b9050600081511115612bc95780806020019051810190612b899190613ba7565b612bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf906142a2565b60405180910390fd5b5b505050565b6000811480612c58575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612c15929190613bd4565b602060405180830381865afa158015612c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c56919061394d565b145b612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e90614334565b60405180910390fd5b612d188363095ea7b360e01b8484604051602401612cb6929190613b52565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b07565b505050565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690614210565b60405180910390fd5b565b600060019054906101000a900460ff16612dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc790614210565b60405180910390fd5b612de0612ddb611db9565b612602565b565b60006060600073ffffffffffffffffffffffffffffffffffffffff16606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461302a57600367ffffffffffffffff811115612e9457612e93613ee4565b5b604051908082528060200260200182016040528015612ec25781602001602082028036833780820191505090505b50905073acc15dc74880c9944775448304b263d191c6077f81600081518110612eee57612eed61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612f9c57612f9b61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600281518110612feb57612fea61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613129565b600267ffffffffffffffff81111561304557613044613ee4565b5b6040519080825280602002602001820160405280156130735781602001602082028036833780820191505090505b50905073acc15dc74880c9944775448304b263d191c6077f8160008151811061309f5761309e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106130ee576130ed61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab58660008588426040518663ffffffff1660e01b815260040161318e9493929190614354565b60006040518083038185885af11580156131ac573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906131d69190614155565b905080600182516131e791906139f1565b815181106131f8576131f761391e565b5b6020026020010151925050509392505050565b606061321a8484600085613223565b90509392505050565b606082471015613268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325f90614412565b60405180910390fd5b61327185613337565b6132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a79061447e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132d9919061450f565b60006040518083038185875af1925050503d8060008114613316576040519150601f19603f3d011682016040523d82523d6000602084013e61331b565b606091505b509150915061332b82828661334a565b92505050949350505050565b600080823b905060008111915050919050565b6060831561335a578290506133aa565b60008351111561336d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a1919061456a565b60405180910390fd5b9392505050565b6000819050919050565b6133c4816133b1565b82525050565b60006020820190506133df60008301846133bb565b92915050565b6000604051905090565b600080fd5b600080fd5b613402816133b1565b811461340d57600080fd5b50565b60008135905061341f816133f9565b92915050565b60006020828403121561343b5761343a6133ef565b5b600061344984828501613410565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061347d82613452565b9050919050565b61348d81613472565b811461349857600080fd5b50565b6000813590506134aa81613484565b92915050565b600080604083850312156134c7576134c66133ef565b5b60006134d58582860161349b565b92505060206134e68582860161349b565b9150509250929050565b600080600060608486031215613509576135086133ef565b5b60006135178682870161349b565b935050602061352886828701613410565b92505060406135398682870161349b565b9150509250925092565b600060208284031215613559576135586133ef565b5b60006135678482850161349b565b91505092915050565b61357981613472565b82525050565b60006020820190506135946000830184613570565b92915050565b60008115159050919050565b6135af8161359a565b82525050565b60006020820190506135ca60008301846135a6565b92915050565b600080604083850312156135e7576135e66133ef565b5b60006135f58582860161349b565b925050602061360685828601613410565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613657602083613610565b915061366282613621565b602082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5a6170204f757420466565732063616e6e6f74206265206d6f7265207468616e60008201527f2032250000000000000000000000000000000000000000000000000000000000602082015250565b60006136e9602383613610565b91506136f48261368d565b604082019050919050565b60006020820190508181036000830152613718816136dc565b9050919050565b60008151905061372e81613484565b92915050565b60006020828403121561374a576137496133ef565b5b60006137588482850161371f565b91505092915050565b6000819050919050565b6000819050919050565b600061379061378b61378684613761565b61376b565b6133b1565b9050919050565b6137a081613775565b82525050565b6000610100820190506137bc600083018b613570565b6137c9602083018a613570565b6137d660408301896133bb565b6137e360608301886133bb565b6137f06080830187613797565b6137fd60a0830186613797565b61380a60c0830185613570565b61381760e08301846133bb565b9998505050505050505050565b600081519050613833816133f9565b92915050565b600080600060608486031215613852576138516133ef565b5b600061386086828701613824565b935050602061387186828701613824565b925050604061388286828701613824565b9150509250925092565b7f5a617020496e20466565732063616e6e6f74206265206d6f7265207468616e2060008201527f3225000000000000000000000000000000000000000000000000000000000000602082015250565b60006138e8602283613610565b91506138f38261388c565b604082019050919050565b60006020820190508181036000830152613917816138db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215613963576139626133ef565b5b600061397184828501613824565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139b4826133b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139e6576139e561397a565b5b600182019050919050565b60006139fc826133b1565b9150613a07836133b1565b9250828203905081811115613a1f57613a1e61397a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613ab0602e83613610565b9150613abb82613a54565b604082019050919050565b60006020820190508181036000830152613adf81613aa3565b9050919050565b7f5a61704554483a206f776e6572206d7573742062652073657400000000000000600082015250565b6000613b1c601983613610565b9150613b2782613ae6565b602082019050919050565b60006020820190508181036000830152613b4b81613b0f565b9050919050565b6000604082019050613b676000830185613570565b613b7460208301846133bb565b9392505050565b613b848161359a565b8114613b8f57600080fd5b50565b600081519050613ba181613b7b565b92915050565b600060208284031215613bbd57613bbc6133ef565b5b6000613bcb84828501613b92565b91505092915050565b6000604082019050613be96000830185613570565b613bf66020830184613570565b9392505050565b7f6e6f74207265616c207061697200000000000000000000000000000000000000600082015250565b6000613c33600d83613610565b9150613c3e82613bfd565b602082019050919050565b60006020820190508181036000830152613c6281613c26565b9050919050565b600060c082019050613c7e6000830189613570565b613c8b60208301886133bb565b613c986040830187613797565b613ca56060830186613797565b613cb26080830185613570565b613cbf60a08301846133bb565b979650505050505050565b60008060408385031215613ce157613ce06133ef565b5b6000613cef85828601613824565b9250506020613d0085828601613824565b9150509250929050565b600060e082019050613d1f600083018a613570565b613d2c6020830189613570565b613d3960408301886133bb565b613d466060830187613797565b613d536080830186613797565b613d6060a0830185613570565b613d6d60c08301846133bb565b98975050505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dd5602683613610565b9150613de082613d79565b604082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b6000606082019050613e206000830186613570565b613e2d6020830185613570565b613e3a60408301846133bb565b949350505050565b6000613e4d826133b1565b9150613e58836133b1565b9250828202613e66816133b1565b91508282048414831517613e7d57613e7c61397a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ebe826133b1565b9150613ec9836133b1565b925082613ed957613ed8613e84565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f4881613472565b82525050565b6000613f5a8383613f3f565b60208301905092915050565b6000602082019050919050565b6000613f7e82613f13565b613f888185613f1e565b9350613f9383613f2f565b8060005b83811015613fc4578151613fab8882613f4e565b9750613fb683613f66565b925050600181019050613f97565b5085935050505092915050565b600060a082019050613fe660008301886133bb565b613ff36020830187613797565b81810360408301526140058186613f73565b90506140146060830185613570565b61402160808301846133bb565b9695505050505050565b600080fd5b6000601f19601f8301169050919050565b61404a82614030565b810181811067ffffffffffffffff8211171561406957614068613ee4565b5b80604052505050565b600061407c6133e5565b90506140888282614041565b919050565b600067ffffffffffffffff8211156140a8576140a7613ee4565b5b602082029050602081019050919050565b600080fd5b60006140d16140cc8461408d565b614072565b905080838252602082019050602084028301858111156140f4576140f36140b9565b5b835b8181101561411d57806141098882613824565b8452602084019350506020810190506140f6565b5050509392505050565b600082601f83011261413c5761413b61402b565b5b815161414c8482602086016140be565b91505092915050565b60006020828403121561416b5761416a6133ef565b5b600082015167ffffffffffffffff811115614189576141886133f4565b5b61419584828501614127565b91505092915050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006141fa602b83613610565b91506142058261419e565b604082019050919050565b60006020820190508181036000830152614229816141ed565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061428c602a83613610565b915061429782614230565b604082019050919050565b600060208201905081810360008301526142bb8161427f565b9050919050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b600061431e603683613610565b9150614329826142c2565b604082019050919050565b6000602082019050818103600083015261434d81614311565b9050919050565b60006080820190506143696000830187613797565b818103602083015261437b8186613f73565b905061438a6040830185613570565b61439760608301846133bb565b95945050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143fc602683613610565b9150614407826143a0565b604082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614468601d83613610565b915061447382614432565b602082019050919050565b600060208201905081810360008301526144978161445b565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156144d25780820151818401526020810190506144b7565b60008484015250505050565b60006144e98261449e565b6144f381856144a9565b93506145038185602086016144b4565b80840191505092915050565b600061451b82846144de565b915081905092915050565b600081519050919050565b600061453c82614526565b6145468185613610565b93506145568185602086016144b4565b61455f81614030565b840191505092915050565b600060208201905081810360008301526145848184614531565b90509291505056fea26469706673582212205c0cade8cbe73a6e86b2a9466b2b51fa2fcb6818c96a74d45d8c0151a490c77864736f6c63430008110033
Deployed Bytecode
0x6080604052600436106101395760003560e01c806366280fdc116100ab5780638da5cb5b1161006f5780638da5cb5b146103e157806391d754c41461040c578063985c9d5614610437578063d9139f6314610474578063f2fde38b1461049d578063fe47068d146104c657610140565b806366280fdc1461030c5780636f1b606114610337578063715018a6146103625780637df0f7671461037957806389a30271146103b657610140565b806323a66e1c116100fd57806323a66e1c1461021457806335faa4161461023d57806336c5d72414610254578063485cc9551461027d5780634f64b2be146102a657806351cff8d9146102e357610140565b80630e8891af146101455780631085815b146101705780631c286c8a146101995780631c4009f9146101c25780631eff9adb146101eb57610140565b3661014057005b600080fd5b34801561015157600080fd5b5061015a6104e2565b60405161016791906133ca565b60405180910390f35b34801561017c57600080fd5b5061019760048036038101906101929190613425565b6104e8565b005b3480156101a557600080fd5b506101c060048036038101906101bb91906134b0565b6105bf565b005b3480156101ce57600080fd5b506101e960048036038101906101e491906134f0565b6106bd565b005b3480156101f757600080fd5b50610212600480360381019061020d9190613543565b6109d8565b005b34801561022057600080fd5b5061023b60048036038101906102369190613425565b610b71565b005b34801561024957600080fd5b50610252610c48565b005b34801561026057600080fd5b5061027b60048036038101906102769190613425565b610f1b565b005b34801561028957600080fd5b506102a4600480360381019061029f91906134b0565b611129565b005b3480156102b257600080fd5b506102cd60048036038101906102c89190613425565b611384565b6040516102da919061357f565b60405180910390f35b3480156102ef57600080fd5b5061030a60048036038101906103059190613543565b6113c3565b005b34801561031857600080fd5b506103216115c9565b60405161032e91906133ca565b60405180910390f35b34801561034357600080fd5b5061034c6115cf565b604051610359919061357f565b60405180910390f35b34801561036e57600080fd5b506103776115f5565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613543565b61167d565b6040516103ad91906135b5565b60405180910390f35b3480156103c257600080fd5b506103cb6116d4565b6040516103d8919061357f565b60405180910390f35b3480156103ed57600080fd5b506103f66116ec565b604051610403919061357f565b60405180910390f35b34801561041857600080fd5b50610421611716565b60405161042e919061357f565b60405180910390f35b34801561044357600080fd5b5061045e60048036038101906104599190613543565b61172e565b60405161046b919061357f565b60405180910390f35b34801561048057600080fd5b5061049b600480360381019061049691906135d0565b611797565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190613543565b611cb4565b005b6104e060048036038101906104db9190613543565b611dab565b005b606b5481565b6104f0611db9565b73ffffffffffffffffffffffffffffffffffffffff1661050e6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055b9061366d565b60405180910390fd5b80600011158015610576575060c88111155b6105b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ac906136ff565b60405180910390fd5b80606c8190555050565b6105c7611db9565b73ffffffffffffffffffffffffffffffffffffffff166105e56116ec565b73ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106329061366d565b60405180910390fd5b80606960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6106ea3330848673ffffffffffffffffffffffffffffffffffffffff16611dc1909392919063ffffffff16565b6106f383611e4a565b6106fc8161167d565b156109d357600081905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107779190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ea9190613734565b90508173ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16148061085157508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b156109cf576000610881612710610873606b5489611f5290919063ffffffff16565b611f6890919063ffffffff16565b90506108968187611f7e90919063ffffffff16565b955060008373ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146108d357836108d5565b825b90506108e081611e4a565b60006108f6600289611f6890919063ffffffff16565b905060006109068a838530611f94565b9050606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e337008b8561095b868e611f7e90919063ffffffff16565b8560008033426040518963ffffffff1660e01b81526004016109849897969594939291906137a6565b6060604051808303816000875af11580156109a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c79190613839565b505050505050505b5050505b505050565b6109e0611db9565b73ffffffffffffffffffffffffffffffffffffffff166109fe6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610a54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4b9061366d565b60405180910390fd5b6000801515606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151490506001606860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508015610b6d57606a829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b610b79611db9565b73ffffffffffffffffffffffffffffffffffffffff16610b976116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610bed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be49061366d565b60405180910390fd5b80600011158015610bff575060c88111155b610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c35906138fe565b60405180910390fd5b80606b8190555050565b610c50611db9565b73ffffffffffffffffffffffffffffffffffffffff16610c6e6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb9061366d565b60405180910390fd5b60005b606a80549050811015610eba576000606a8281548110610cea57610ce961391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d515750610ea7565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610d8c919061357f565b602060405180830381865afa158015610da9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcd919061394d565b90506000811115610ea45773acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e8f578173ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b8152600401610e5891906133ca565b600060405180830381600087803b158015610e7257600080fd5b505af1158015610e86573d6000803e3d6000fd5b50505050610ea3565b610ea18282610e9c6116ec565b612166565b505b5b50505b8080610eb2906139a9565b915050610cc7565b5060004790506000811115610f1857610ed16116ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f16573d6000803e3d6000fd5b505b50565b610f23611db9565b73ffffffffffffffffffffffffffffffffffffffff16610f416116ec565b73ffffffffffffffffffffffffffffffffffffffff1614610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061366d565b60405180910390fd5b6000606a8281548110610fad57610fac61391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550606a6001606a8054905061104691906139f1565b815481106110575761105661391e565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16606a83815481106110965761109561391e565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606a8054806110f0576110ef613a25565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590555050565b600060019054906101000a900460ff166111515760008054906101000a900460ff161561115a565b611159612590565b5b611199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119090613ac6565b60405180910390fd5b60008060019054906101000a900460ff1615905080156111e9576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6111f16125a1565b600073ffffffffffffffffffffffffffffffffffffffff166112116116ec565b73ffffffffffffffffffffffffffffffffffffffff1603611267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125e90613b32565b60405180910390fd5b82606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081606660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061130673acc15dc74880c9944775448304b263d191c6077f6109d8565b61132373931715fee2d06333043d11f658c8ce934ac61d0c6109d8565b61134e606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166109d8565b6032606b819055506019606c81905550801561137f5760008060016101000a81548160ff0219169083151502179055505b505050565b606a818154811061139457600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113cb611db9565b73ffffffffffffffffffffffffffffffffffffffff166113e96116ec565b73ffffffffffffffffffffffffffffffffffffffff161461143f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114369061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036114c65761147b6116ec565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156114c0573d6000803e3d6000fd5b506115c6565b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6114ea6116ec565b8373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611523919061357f565b602060405180830381865afa158015611540573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611564919061394d565b6040518363ffffffff1660e01b8152600401611581929190613b52565b6020604051808303816000875af11580156115a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115c49190613ba7565b505b50565b606c5481565b606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115fd611db9565b73ffffffffffffffffffffffffffffffffffffffff1661161b6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614611671576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116689061366d565b60405180910390fd5b61167b6000612602565b565b6000606860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16159050919050565b73931715fee2d06333043d11f658c8ce934ac61d0c81565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b73acc15dc74880c9944775448304b263d191c6077f81565b6000606960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6117c43330838573ffffffffffffffffffffffffffffffffffffffff16611dc1909392919063ffffffff16565b6117cd82611e4a565b60006117f86127106117ea606c5485611f5290919063ffffffff16565b611f6890919063ffffffff16565b905061180d8183611f7e90919063ffffffff16565b91506118188361167d565b61182d57611827838333612166565b50611caf565b600083905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561187f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118a39190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119169190613734565b90506000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610611955578284611958565b83835b915091506000606760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390584846040518363ffffffff1660e01b81526004016119bb929190613bd4565b602060405180830381865afa1580156119d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fc9190613734565b90508073ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390613c49565b60405180910390fd5b73acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611af9575073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611bfb57606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302751cec73acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611b895783611b8b565b845b8a60008033426040518763ffffffff1660e01b8152600401611bb296959493929190613c69565b60408051808303816000875af1158015611bd0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf49190613cca565b5050611ca8565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa2abde84848b60008033426040518863ffffffff1660e01b8152600401611c639796959493929190613d0a565b60408051808303816000875af1158015611c81573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca59190613cca565b50505b5050505050505b505050565b611cbc611db9565b73ffffffffffffffffffffffffffffffffffffffff16611cda6116ec565b73ffffffffffffffffffffffffffffffffffffffff1614611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d279061366d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9690613deb565b60405180910390fd5b611da881612602565b50565b611db68134336126c8565b50565b600033905090565b611e44846323b872dd60e01b858585604051602401611de293929190613e0b565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b07565b50505050565b60008173ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b8152600401611ea9929190613bd4565b602060405180830381865afa158015611ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eea919061394d565b03611f4f57611f4e606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff80168373ffffffffffffffffffffffffffffffffffffffff16612bce9092919063ffffffff16565b5b50565b60008183611f609190613e42565b905092915050565b60008183611f769190613eb3565b905092915050565b60008183611f8c91906139f1565b905092915050565b60006060600267ffffffffffffffff811115611fb357611fb2613ee4565b5b604051908082528060200260200182016040528015611fe15781602001602082028036833780820191505090505b5090508581600081518110611ff957611ff861391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816001815181106120485761204761391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166338ed17398760008588426040518663ffffffff1660e01b81526004016120e8959493929190613fd1565b6000604051808303816000875af1158015612107573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906121309190614155565b9050806001825161214191906139f1565b815181106121525761215161391e565b5b602002602001015192505050949350505050565b60006060600073ffffffffffffffffffffffffffffffffffffffff16606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146123ae57600367ffffffffffffffff81111561221857612217613ee4565b5b6040519080825280602002602001820160405280156122465781602001602082028036833780820191505090505b509050848160008151811061225e5761225d61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160018151811061230c5761230b61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073acc15dc74880c9944775448304b263d191c6077f8160028151811061236f5761236e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506124ad565b600267ffffffffffffffff8111156123c9576123c8613ee4565b5b6040519080825280602002602001820160405280156123f75781602001602082028036833780820191505090505b509050848160008151811061240f5761240e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073acc15dc74880c9944775448304b263d191c6077f816001815181106124725761247161391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166318cbafe58660008588426040518663ffffffff1660e01b8152600401612513959493929190613fd1565b6000604051808303816000875af1158015612532573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061255b9190614155565b9050806001825161256c91906139f1565b8151811061257d5761257c61391e565b5b6020026020010151925050509392505050565b600061259b30612d1d565b15905090565b600060019054906101000a900460ff166125f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e790614210565b60405180910390fd5b6125f8612d30565b612600612d81565b565b6000603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006126f36127106126e5606b5486611f5290919063ffffffff16565b611f6890919063ffffffff16565b90506127088184611f7e90919063ffffffff16565b92506127138461167d565b61272857612722848484612de2565b50612b01565b600084905060008173ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa15801561277a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279e9190613734565b905060008273ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128119190613734565b905073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806128a0575073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156129ef57600073acc15dc74880c9944775448304b263d191c6077f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128f457826128f6565b815b9050600061290e600289611f6890919063ffffffff16565b9050600061291d838330612de2565b905061292883611e4a565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d719612979848c611f7e90919063ffffffff16565b85846000808e426040518863ffffffff1660e01b81526004016129a196959493929190613c69565b60606040518083038185885af11580156129bf573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906129e49190613839565b505050505050612afd565b6000612a05600288611f6890919063ffffffff16565b90506000612a14848330612de2565b90506000612a3584612a2f858c611f7e90919063ffffffff16565b30612de2565b9050612a4085611e4a565b612a4984611e4a565b606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e8e33700868685856000808f426040518963ffffffff1660e01b8152600401612ab39897969594939291906137a6565b6060604051808303816000875af1158015612ad2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612af69190613839565b5050505050505b5050505b50505050565b6000612b69826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661320b9092919063ffffffff16565b9050600081511115612bc95780806020019051810190612b899190613ba7565b612bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf906142a2565b60405180910390fd5b5b505050565b6000811480612c58575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401612c15929190613bd4565b602060405180830381865afa158015612c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c56919061394d565b145b612c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8e90614334565b60405180910390fd5b612d188363095ea7b360e01b8484604051602401612cb6929190613b52565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612b07565b505050565b600080823b905060008111915050919050565b600060019054906101000a900460ff16612d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d7690614210565b60405180910390fd5b565b600060019054906101000a900460ff16612dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dc790614210565b60405180910390fd5b612de0612ddb611db9565b612602565b565b60006060600073ffffffffffffffffffffffffffffffffffffffff16606960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461302a57600367ffffffffffffffff811115612e9457612e93613ee4565b5b604051908082528060200260200182016040528015612ec25781602001602082028036833780820191505090505b50905073acc15dc74880c9944775448304b263d191c6077f81600081518110612eee57612eed61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050606960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110612f9c57612f9b61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508481600281518110612feb57612fea61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613129565b600267ffffffffffffffff81111561304557613044613ee4565b5b6040519080825280602002602001820160405280156130735781602001602082028036833780820191505090505b50905073acc15dc74880c9944775448304b263d191c6077f8160008151811061309f5761309e61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505084816001815181106130ee576130ed61391e565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b6000606660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637ff36ab58660008588426040518663ffffffff1660e01b815260040161318e9493929190614354565b60006040518083038185885af11580156131ac573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906131d69190614155565b905080600182516131e791906139f1565b815181106131f8576131f761391e565b5b6020026020010151925050509392505050565b606061321a8484600085613223565b90509392505050565b606082471015613268576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161325f90614412565b60405180910390fd5b61327185613337565b6132b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a79061447e565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516132d9919061450f565b60006040518083038185875af1925050503d8060008114613316576040519150601f19603f3d011682016040523d82523d6000602084013e61331b565b606091505b509150915061332b82828661334a565b92505050949350505050565b600080823b905060008111915050919050565b6060831561335a578290506133aa565b60008351111561336d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133a1919061456a565b60405180910390fd5b9392505050565b6000819050919050565b6133c4816133b1565b82525050565b60006020820190506133df60008301846133bb565b92915050565b6000604051905090565b600080fd5b600080fd5b613402816133b1565b811461340d57600080fd5b50565b60008135905061341f816133f9565b92915050565b60006020828403121561343b5761343a6133ef565b5b600061344984828501613410565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061347d82613452565b9050919050565b61348d81613472565b811461349857600080fd5b50565b6000813590506134aa81613484565b92915050565b600080604083850312156134c7576134c66133ef565b5b60006134d58582860161349b565b92505060206134e68582860161349b565b9150509250929050565b600080600060608486031215613509576135086133ef565b5b60006135178682870161349b565b935050602061352886828701613410565b92505060406135398682870161349b565b9150509250925092565b600060208284031215613559576135586133ef565b5b60006135678482850161349b565b91505092915050565b61357981613472565b82525050565b60006020820190506135946000830184613570565b92915050565b60008115159050919050565b6135af8161359a565b82525050565b60006020820190506135ca60008301846135a6565b92915050565b600080604083850312156135e7576135e66133ef565b5b60006135f58582860161349b565b925050602061360685828601613410565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613657602083613610565b915061366282613621565b602082019050919050565b600060208201905081810360008301526136868161364a565b9050919050565b7f5a6170204f757420466565732063616e6e6f74206265206d6f7265207468616e60008201527f2032250000000000000000000000000000000000000000000000000000000000602082015250565b60006136e9602383613610565b91506136f48261368d565b604082019050919050565b60006020820190508181036000830152613718816136dc565b9050919050565b60008151905061372e81613484565b92915050565b60006020828403121561374a576137496133ef565b5b60006137588482850161371f565b91505092915050565b6000819050919050565b6000819050919050565b600061379061378b61378684613761565b61376b565b6133b1565b9050919050565b6137a081613775565b82525050565b6000610100820190506137bc600083018b613570565b6137c9602083018a613570565b6137d660408301896133bb565b6137e360608301886133bb565b6137f06080830187613797565b6137fd60a0830186613797565b61380a60c0830185613570565b61381760e08301846133bb565b9998505050505050505050565b600081519050613833816133f9565b92915050565b600080600060608486031215613852576138516133ef565b5b600061386086828701613824565b935050602061387186828701613824565b925050604061388286828701613824565b9150509250925092565b7f5a617020496e20466565732063616e6e6f74206265206d6f7265207468616e2060008201527f3225000000000000000000000000000000000000000000000000000000000000602082015250565b60006138e8602283613610565b91506138f38261388c565b604082019050919050565b60006020820190508181036000830152613917816138db565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215613963576139626133ef565b5b600061397184828501613824565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139b4826133b1565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139e6576139e561397a565b5b600182019050919050565b60006139fc826133b1565b9150613a07836133b1565b9250828203905081811115613a1f57613a1e61397a565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160008201527f647920696e697469616c697a6564000000000000000000000000000000000000602082015250565b6000613ab0602e83613610565b9150613abb82613a54565b604082019050919050565b60006020820190508181036000830152613adf81613aa3565b9050919050565b7f5a61704554483a206f776e6572206d7573742062652073657400000000000000600082015250565b6000613b1c601983613610565b9150613b2782613ae6565b602082019050919050565b60006020820190508181036000830152613b4b81613b0f565b9050919050565b6000604082019050613b676000830185613570565b613b7460208301846133bb565b9392505050565b613b848161359a565b8114613b8f57600080fd5b50565b600081519050613ba181613b7b565b92915050565b600060208284031215613bbd57613bbc6133ef565b5b6000613bcb84828501613b92565b91505092915050565b6000604082019050613be96000830185613570565b613bf66020830184613570565b9392505050565b7f6e6f74207265616c207061697200000000000000000000000000000000000000600082015250565b6000613c33600d83613610565b9150613c3e82613bfd565b602082019050919050565b60006020820190508181036000830152613c6281613c26565b9050919050565b600060c082019050613c7e6000830189613570565b613c8b60208301886133bb565b613c986040830187613797565b613ca56060830186613797565b613cb26080830185613570565b613cbf60a08301846133bb565b979650505050505050565b60008060408385031215613ce157613ce06133ef565b5b6000613cef85828601613824565b9250506020613d0085828601613824565b9150509250929050565b600060e082019050613d1f600083018a613570565b613d2c6020830189613570565b613d3960408301886133bb565b613d466060830187613797565b613d536080830186613797565b613d6060a0830185613570565b613d6d60c08301846133bb565b98975050505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613dd5602683613610565b9150613de082613d79565b604082019050919050565b60006020820190508181036000830152613e0481613dc8565b9050919050565b6000606082019050613e206000830186613570565b613e2d6020830185613570565b613e3a60408301846133bb565b949350505050565b6000613e4d826133b1565b9150613e58836133b1565b9250828202613e66816133b1565b91508282048414831517613e7d57613e7c61397a565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ebe826133b1565b9150613ec9836133b1565b925082613ed957613ed8613e84565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613f4881613472565b82525050565b6000613f5a8383613f3f565b60208301905092915050565b6000602082019050919050565b6000613f7e82613f13565b613f888185613f1e565b9350613f9383613f2f565b8060005b83811015613fc4578151613fab8882613f4e565b9750613fb683613f66565b925050600181019050613f97565b5085935050505092915050565b600060a082019050613fe660008301886133bb565b613ff36020830187613797565b81810360408301526140058186613f73565b90506140146060830185613570565b61402160808301846133bb565b9695505050505050565b600080fd5b6000601f19601f8301169050919050565b61404a82614030565b810181811067ffffffffffffffff8211171561406957614068613ee4565b5b80604052505050565b600061407c6133e5565b90506140888282614041565b919050565b600067ffffffffffffffff8211156140a8576140a7613ee4565b5b602082029050602081019050919050565b600080fd5b60006140d16140cc8461408d565b614072565b905080838252602082019050602084028301858111156140f4576140f36140b9565b5b835b8181101561411d57806141098882613824565b8452602084019350506020810190506140f6565b5050509392505050565b600082601f83011261413c5761413b61402b565b5b815161414c8482602086016140be565b91505092915050565b60006020828403121561416b5761416a6133ef565b5b600082015167ffffffffffffffff811115614189576141886133f4565b5b61419584828501614127565b91505092915050565b7f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960008201527f6e697469616c697a696e67000000000000000000000000000000000000000000602082015250565b60006141fa602b83613610565b91506142058261419e565b604082019050919050565b60006020820190508181036000830152614229816141ed565b9050919050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061428c602a83613610565b915061429782614230565b604082019050919050565b600060208201905081810360008301526142bb8161427f565b9050919050565b7f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000602082015250565b600061431e603683613610565b9150614329826142c2565b604082019050919050565b6000602082019050818103600083015261434d81614311565b9050919050565b60006080820190506143696000830187613797565b818103602083015261437b8186613f73565b905061438a6040830185613570565b61439760608301846133bb565b95945050505050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b60006143fc602683613610565b9150614407826143a0565b604082019050919050565b6000602082019050818103600083015261442b816143ef565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000614468601d83613610565b915061447382614432565b602082019050919050565b600060208201905081810360008301526144978161445b565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156144d25780820151818401526020810190506144b7565b60008484015250505050565b60006144e98261449e565b6144f381856144a9565b93506145038185602086016144b4565b80840191505092915050565b600061451b82846144de565b915081905092915050565b600081519050919050565b600061453c82614526565b6145468185613610565b93506145568185602086016144b4565b61455f81614030565b840191505092915050565b600060208201905081810360008301526145848184614531565b90509291505056fea26469706673582212205c0cade8cbe73a6e86b2a9466b2b51fa2fcb6818c96a74d45d8c0151a490c77864736f6c63430008110033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.41
Net Worth in GLMR
Token Allocations
GLMR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| GLMR | 100.00% | $0.020658 | 20 | $0.413169 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.