Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 169 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Rebalance | 12506893 | 1764 days ago | IN | 0 ETH | 0.01169308 | ||||
| Rebalance | 12505813 | 1765 days ago | IN | 0 ETH | 0.02674448 | ||||
| Rebalance | 12504780 | 1765 days ago | IN | 0 ETH | 0.01665551 | ||||
| Rebalance | 12504164 | 1765 days ago | IN | 0 ETH | 0.01968919 | ||||
| Rebalance | 12502610 | 1765 days ago | IN | 0 ETH | 0.02314934 | ||||
| Rebalance | 12501547 | 1765 days ago | IN | 0 ETH | 0.01387047 | ||||
| Rebalance | 12500684 | 1765 days ago | IN | 0 ETH | 0.0237472 | ||||
| Rebalance | 12500398 | 1765 days ago | IN | 0 ETH | 0.02945254 | ||||
| Rebalance | 12499355 | 1766 days ago | IN | 0 ETH | 0.02588409 | ||||
| Rebalance | 12498297 | 1766 days ago | IN | 0 ETH | 0.0202567 | ||||
| Rebalance | 12498163 | 1766 days ago | IN | 0 ETH | 0.02715364 | ||||
| Rebalance | 12497387 | 1766 days ago | IN | 0 ETH | 0.04874497 | ||||
| Rebalance | 12496379 | 1766 days ago | IN | 0 ETH | 0.01770345 | ||||
| Rebalance | 12495722 | 1766 days ago | IN | 0 ETH | 0.01000537 | ||||
| Rebalance | 12494811 | 1766 days ago | IN | 0 ETH | 0.01517964 | ||||
| Rebalance | 12494011 | 1766 days ago | IN | 0 ETH | 0.02506262 | ||||
| Rebalance | 12493193 | 1767 days ago | IN | 0 ETH | 0.02897386 | ||||
| Rebalance | 12492018 | 1767 days ago | IN | 0 ETH | 0.06334181 | ||||
| Rebalance | 12490805 | 1767 days ago | IN | 0 ETH | 0.06562131 | ||||
| Rebalance | 12488282 | 1767 days ago | IN | 0 ETH | 0.01311941 | ||||
| Rebalance | 12487563 | 1767 days ago | IN | 0 ETH | 0.01874779 | ||||
| Rebalance | 12485484 | 1768 days ago | IN | 0 ETH | 0.01710691 | ||||
| Rebalance | 12482795 | 1768 days ago | IN | 0 ETH | 0.01821485 | ||||
| Rebalance | 12481144 | 1768 days ago | IN | 0 ETH | 0.01904431 | ||||
| Rebalance | 12479510 | 1769 days ago | IN | 0 ETH | 0.03113124 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
VSPStrategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-04-13
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/math/SafeMath.sol
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
pragma solidity ^0.6.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);
}
// File: @openzeppelin/contracts/utils/Address.sol
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies in extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return _functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
return _functionCallWithValue(target, data, value, errorMessage);
}
function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
// File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol
pragma solidity ^0.6.0;
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using SafeMath for uint256;
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(IERC20 token, address spender, uint256 value) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
// solhint-disable-next-line max-line-length
require((value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).add(value);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) { // Return data is optional
// solhint-disable-next-line max-line-length
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
// File: @openzeppelin/contracts/GSN/Context.sol
pragma solidity ^0.6.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// File: contracts/Pausable.sol
pragma solidity 0.6.12;
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
*/
contract Pausable is Context {
event Paused(address account);
event Shutdown(address account);
event Unpaused(address account);
event Open(address account);
bool public paused;
bool public stopEverything;
modifier whenNotPaused() {
require(!paused, "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused, "Pausable: not paused");
_;
}
modifier whenNotShutdown() {
require(!stopEverything, "Pausable: shutdown");
_;
}
modifier whenShutdown() {
require(stopEverything, "Pausable: not shutdown");
_;
}
/// @dev Pause contract operations, if contract is not paused.
function _pause() internal virtual whenNotPaused {
paused = true;
emit Paused(_msgSender());
}
/// @dev Unpause contract operations, allow only if contract is paused and not shutdown.
function _unpause() internal virtual whenPaused whenNotShutdown {
paused = false;
emit Unpaused(_msgSender());
}
/// @dev Shutdown contract operations, if not already shutdown.
function _shutdown() internal virtual whenNotShutdown {
stopEverything = true;
paused = true;
emit Shutdown(_msgSender());
}
/// @dev Open contract operations, if contract is in shutdown state
function _open() internal virtual whenShutdown {
stopEverything = false;
emit Open(_msgSender());
}
}
// File: contracts/interfaces/vesper/IController.sol
pragma solidity 0.6.12;
interface IController {
function aaveReferralCode() external view returns (uint16);
function feeCollector(address) external view returns (address);
function founderFee() external view returns (uint256);
function founderVault() external view returns (address);
function interestFee(address) external view returns (uint256);
function isPool(address) external view returns (bool);
function pools() external view returns (address);
function strategy(address) external view returns (address);
function rebalanceFriction(address) external view returns (uint256);
function poolRewards(address) external view returns (address);
function treasuryPool() external view returns (address);
function uniswapRouter() external view returns (address);
function withdrawFee(address) external view returns (uint256);
}
// File: contracts/interfaces/uniswap/IUniswapV2Router01.sol
pragma solidity 0.6.12;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapExactTokensForETH(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint256[] memory amounts);
function swapETHForExactTokens(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
) external payable returns (uint256[] memory amounts);
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) external pure returns (uint256 amountB);
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountOut);
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) external pure returns (uint256 amountIn);
function getAmountsOut(uint256 amountIn, address[] calldata path)
external
view
returns (uint256[] memory amounts);
function getAmountsIn(uint256 amountOut, address[] calldata path)
external
view
returns (uint256[] memory amounts);
}
// File: contracts/interfaces/uniswap/IUniswapV2Router02.sol
pragma solidity 0.6.12;
interface IUniswapV2Router02 is IUniswapV2Router01 {
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}
// File: contracts/interfaces/vesper/IVesperPool.sol
pragma solidity 0.6.12;
interface IVesperPool is IERC20 {
function approveToken() external;
function deposit() external payable;
function deposit(uint256) external;
function multiTransfer(uint256[] memory) external returns (bool);
function permit(
address,
address,
uint256,
uint256,
uint8,
bytes32,
bytes32
) external;
function rebalance() external;
function resetApproval() external;
function sweepErc20(address) external;
function withdraw(uint256) external;
function withdrawETH(uint256) external;
function withdrawByStrategy(uint256) external;
function feeCollector() external view returns (address);
function getPricePerShare() external view returns (uint256);
function token() external view returns (address);
function tokensHere() external view returns (uint256);
function totalValue() external view returns (uint256);
function withdrawFee() external view returns (uint256);
}
// File: sol-address-list/contracts/interfaces/IAddressList.sol
pragma solidity ^0.6.6;
interface IAddressList {
event AddressUpdated(address indexed a, address indexed sender);
event AddressRemoved(address indexed a, address indexed sender);
function add(address a) external returns (bool);
function addValue(address a, uint256 v) external returns (bool);
function addMulti(address[] calldata addrs) external returns (uint256);
function addValueMulti(address[] calldata addrs, uint256[] calldata values) external returns (uint256);
function remove(address a) external returns (bool);
function removeMulti(address[] calldata addrs) external returns (uint256);
function get(address a) external view returns (uint256);
function contains(address a) external view returns (bool);
function at(uint256 index) external view returns (address, uint256);
function length() external view returns (uint256);
}
// File: sol-address-list/contracts/interfaces/IAddressListExt.sol
pragma solidity ^0.6.6;
interface IAddressListExt is IAddressList {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleMemberCount(bytes32 role) external view returns (uint256);
function getRoleMember(bytes32 role, uint256 index) external view returns (address);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
// File: sol-address-list/contracts/interfaces/IAddressListFactory.sol
pragma solidity ^0.6.6;
interface IAddressListFactory {
event ListCreated(address indexed _sender, address indexed _newList);
function ours(address a) external view returns (bool);
function listCount() external view returns (uint256);
function listAt(uint256 idx) external view returns (address);
function createList() external returns (address listaddr);
}
// File: contracts/strategies/VSPStrategy.sol
pragma solidity 0.6.12;
contract VSPStrategy is Pausable {
using SafeMath for uint256;
using SafeERC20 for IERC20;
uint256 public lastRebalanceBlock;
IController public immutable controller;
IVesperPool public immutable vvsp;
IAddressListExt public immutable keepers;
address internal constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
uint256 public nextPoolIdx;
address[] public pools;
uint256[] public liquidationLimit;
string public constant NAME = "Strategy-VSP";
string public constant VERSION = "2.0.2";
constructor(address _controller, address _vvsp) public {
vvsp = IVesperPool(_vvsp);
controller = IController(_controller);
IAddressListFactory factory =
IAddressListFactory(0xD57b41649f822C51a73C44Ba0B3da4A880aF0029);
IAddressListExt _keepers = IAddressListExt(factory.createList());
_keepers.grantRole(keccak256("LIST_ADMIN"), _controller);
keepers = _keepers;
}
modifier onlyKeeper() {
require(keepers.contains(_msgSender()), "caller-is-not-keeper");
_;
}
modifier onlyController() {
require(_msgSender() == address(controller), "Caller is not the controller");
_;
}
function pause() external onlyController {
_pause();
}
function unpause() external onlyController {
_unpause();
}
function updateLiquidationQueue(address[] calldata _pools, uint256[] calldata _limit)
external
onlyController
{
for (uint256 i = 0; i < _pools.length; i++) {
require(controller.isPool(_pools[i]), "Not a valid pool");
require(_limit[i] != 0, "Limit cannot be zero");
}
pools = _pools;
liquidationLimit = _limit;
nextPoolIdx = 0;
}
function isUpgradable() external view returns (bool) {
return IERC20(vvsp.token()).balanceOf(address(this)) == 0;
}
function pool() external view returns (address) {
return address(vvsp);
}
/**
withdraw Vtoken from vvsp => Deposit vpool => withdraw collateral => swap in uni for VSP => transfer vsp to vvsp pool
VETH => ETH => VSP
*/
function rebalance() external whenNotPaused onlyKeeper {
require(
block.number - lastRebalanceBlock >= controller.rebalanceFriction(address(vvsp)),
"Can not rebalance"
);
lastRebalanceBlock = block.number;
if (nextPoolIdx == pools.length) {
nextPoolIdx = 0;
}
IVesperPool _poolToken = IVesperPool(pools[nextPoolIdx]);
uint256 _balance = _poolToken.balanceOf(address(vvsp));
if (_balance != 0 && address(_poolToken) != address(vvsp)) {
if (_balance > liquidationLimit[nextPoolIdx]) {
_balance = liquidationLimit[nextPoolIdx];
}
_rebalanceEarned(_poolToken, _balance);
}
nextPoolIdx++;
}
/// @dev sweep given token to vsp pool
function sweepErc20(address _fromToken) external {
uint256 amount = IERC20(_fromToken).balanceOf(address(this));
IERC20(_fromToken).safeTransfer(address(vvsp), amount);
}
function _rebalanceEarned(IVesperPool _poolToken, uint256 _amt) internal {
IERC20(address(_poolToken)).safeTransferFrom(address(vvsp), address(this), _amt);
_poolToken.withdrawByStrategy(_amt);
IUniswapV2Router02 uniswapRouter = IUniswapV2Router02(controller.uniswapRouter());
IERC20 from = IERC20(_poolToken.token());
IERC20 vsp = IERC20(vvsp.token());
address[] memory path;
if (address(from) == WETH) {
path = new address[](2);
path[0] = address(from);
path[1] = address(vsp);
} else {
path = new address[](3);
path[0] = address(from);
path[1] = address(WETH);
path[2] = address(vsp);
}
uint256 amountOut =
uniswapRouter.getAmountsOut(from.balanceOf(address(this)), path)[path.length - 1];
if (amountOut != 0) {
from.safeApprove(address(uniswapRouter), 0);
from.safeApprove(address(uniswapRouter), from.balanceOf(address(this)));
uniswapRouter.swapExactTokensForTokens(
from.balanceOf(address(this)),
1,
path,
address(this),
now + 30
);
vsp.safeTransfer(address(vvsp), vsp.balanceOf(address(this)));
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_vvsp","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Open","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Shutdown","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"contract IController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isUpgradable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keepers","outputs":[{"internalType":"contract IAddressListExt","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRebalanceBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"liquidationLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextPoolIdx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"pools","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopEverything","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"}],"name":"sweepErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_pools","type":"address[]"},{"internalType":"uint256[]","name":"_limit","type":"uint256[]"}],"name":"updateLiquidationQueue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vvsp","outputs":[{"internalType":"contract IVesperPool","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60e06040523480156200001157600080fd5b5060405162002b6f38038062002b6f833981810160405260408110156200003757600080fd5b8101908080519060200190929190805190602001909291905050508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600073d57b41649f822c51a73c44ba0b3da4a880af0029905060008173ffffffffffffffffffffffffffffffffffffffff16630fab4d256040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156200012457600080fd5b505af115801562000139573d6000803e3d6000fd5b505050506040513d60208110156200015057600080fd5b810190808051906020019092919050505090508073ffffffffffffffffffffffffffffffffffffffff16632f2ff15d7f679f35d3aa86a98333c7fc7439a0bc12a13be742ae62a4c1cc3820782a2e11a6866040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b158015620001f557600080fd5b505af11580156200020a573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050505060805160601c60a05160601c60c05160601c6128a0620002cf60003980610b6552806110b752508061085652806109855280610cdc5280610e765280610f2a52806110db528061121d528061144452806116255280611e9b525080610559528061062f528061089d5280610ca05280610fe5528061126952806114fb52506128a06000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c8063810d36d9116100a2578063a3f4df7e11610071578063a3f4df7e14610381578063ac4afa3814610404578063d9fe3eae1461045c578063f77c4791146104a0578063ffa1ad74146104d457610116565b8063810d36d9146102f15780638456cb591461030f578063951dc22c14610319578063973a59c11461034d57610116565b80634938649a116100e95780634938649a146102695780635479d940146102895780635c975abb146102a95780637517f9b8146102c95780637d7c2a1c146102e757610116565b8063044a1ef71461011b57806316f0115b146101e95780631a7ec4a11461021d5780633f4ba83a1461025f575b600080fd5b6101e76004803603604081101561013157600080fd5b810190808035906020019064010000000081111561014e57600080fd5b82018360208201111561016057600080fd5b8035906020019184602083028401116401000000008311171561018257600080fd5b9091929391929390803590602001906401000000008111156101a357600080fd5b8201836020820111156101b557600080fd5b803590602001918460208302840111640100000000831117156101d757600080fd5b9091929391929390505050610557565b005b6101f1610852565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102496004803603602081101561023357600080fd5b810190808035906020019092919050505061087a565b6040518082815260200191505060405180910390f35b61026761089b565b005b61027161096d565b60405180821515815260200191505060405180910390f35b610291610980565b60405180821515815260200191505060405180910390f35b6102b1610acb565b60405180821515815260200191505060405180910390f35b6102d1610adc565b6040518082815260200191505060405180910390f35b6102ef610ae2565b005b6102f9610fdd565b6040518082815260200191505060405180910390f35b610317610fe3565b005b6103216110b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103556110d9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103896110fd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b8101908080359060200190929190505050611136565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61049e6004803603602081101561047257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611172565b005b6104a8611267565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dc61128b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166105966112c4565b73ffffffffffffffffffffffffffffffffffffffff161461061f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b60005b8484905081101561081f577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635b16ebb786868481811061067557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b8101908080519060200190929190505050610789576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420612076616c696420706f6f6c0000000000000000000000000000000081525060200191505060405180910390fd5b600083838381811061079757fe5b905060200201351415610812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4c696d69742063616e6e6f74206265207a65726f00000000000000000000000081525060200191505060405180910390fd5b8080600101915050610622565b508383600391906108319291906126c5565b50818160049190610843929190612765565b50600060028190555050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b6004818154811061088757fe5b906000526020600020016000915090505481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108da6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b61096b6112cc565b565b600060019054906101000a900460ff1681565b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e957600080fd5b505afa1580156109fd573d6000803e3d6000fd5b505050506040513d6020811015610a1357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d6020811015610ab457600080fd5b810190808051906020019092919050505014905090565b60008054906101000a900460ff1681565b60015481565b60008054906101000a900460ff1615610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16635dbe47e8610ba76112c4565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d6020811015610c1b57600080fd5b8101908080519060200190929190505050610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616c6c65722d69732d6e6f742d6b656570657200000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636a2b11767f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d4557600080fd5b505afa158015610d59573d6000803e3d6000fd5b505050506040513d6020811015610d6f57600080fd5b810190808051906020019092919050505060015443031015610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43616e206e6f7420726562616c616e636500000000000000000000000000000081525060200191505060405180910390fd5b436001819055506003805490506002541415610e185760006002819055505b6000600360025481548110610e2957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6020811015610f0957600080fd5b8101908080519060200190929190505050905060008114158015610f7957507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610fc757600460025481548110610f8d57fe5b9060005260206000200154811115610fbc57600460025481548110610fae57fe5b906000526020600020015490505b610fc6828261143f565b5b6002600081548092919060010191905055505050565b60025481565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166110226112c4565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b6110b3611f8c565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600c81526020017f53747261746567792d565350000000000000000000000000000000000000000081525081565b6003818154811061114357fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b810190808051906020019092919050505090506112637f0000000000000000000000000000000000000000000000000000000000000000828473ffffffffffffffffffffffffffffffffffffffff1661207d9092919063ffffffff16565b5050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060400160405280600581526020017f322e302e3200000000000000000000000000000000000000000000000000000081525081565b600033905090565b60008054906101000a900460ff1661134c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b600060019054906101000a900460ff16156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5061757361626c653a2073687574646f776e000000000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114126112c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61148c7f000000000000000000000000000000000000000000000000000000000000000030838573ffffffffffffffffffffffffffffffffffffffff1661211f909392919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff166397a5af55826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114df57600080fd5b505af11580156114f3573d6000803e3d6000fd5b5050505060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663735de9f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d602081101561158957600080fd5b8101908080519060200190929190505050905060008373ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b81019080805190602001909291905050509050606073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ef57600267ffffffffffffffff8111801561172857600080fd5b506040519080825280602002602001820160405280156117575781602001602082028036833780820191505090505b509050828160008151811061176857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816001815181106117b057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611926565b600367ffffffffffffffff8111801561180757600080fd5b506040519080825280602002602001820160405280156118365781602001602082028036833780820191505090505b509050828160008151811061184757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106118a357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816002815181106118eb57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b60008473ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ab57600080fd5b505afa1580156119bf573d6000803e3d6000fd5b505050506040513d60208110156119d557600080fd5b8101908080519060200190929190505050846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611a3f578082015181840152602081019050611a24565b50505050905001935050505060006040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611aa157600080fd5b8101908080516040519392919084640100000000821115611ac157600080fd5b83820191506020820185811115611ad757600080fd5b8251866020820283011164010000000082111715611af457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611b2b578082015181840152602081019050611b10565b50505050905001604052505050600183510381518110611b4757fe5b6020026020010151905060008114611f8357611b858560008673ffffffffffffffffffffffffffffffffffffffff166121e09092919063ffffffff16565b611c51858573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d6020811015611c1a57600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff166121e09092919063ffffffff16565b8473ffffffffffffffffffffffffffffffffffffffff166338ed17398573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b810190808051906020019092919050505060018530601e42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611d97578082015181840152602081019050611d7c565b505050509050019650505050505050600060405180830381600087803b158015611dc057600080fd5b505af1158015611dd4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611dfe57600080fd5b8101908080516040519392919084640100000000821115611e1e57600080fd5b83820191506020820185811115611e3457600080fd5b8251866020820283011164010000000082111715611e5157600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611e88578082015181840152602081019050611e6d565b5050505090500160405250505050611f827f00000000000000000000000000000000000000000000000000000000000000008473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b81019080805190602001909291905050508573ffffffffffffffffffffffffffffffffffffffff1661207d9092919063ffffffff16565b5b50505050505050565b60008054906101000a900460ff161561200d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120506112c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61211a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b505050565b6121da846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b50505050565b60008114806122ae575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050145b612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806128356036913960400191505060405180910390fd5b6123a08363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b505050565b6060612407826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124949092919063ffffffff16565b905060008151111561248f5780806020019051602081101561242857600080fd5b810190808051906020019092919050505061248e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061280b602a913960400191505060405180910390fd5b5b505050565b60606124a384846000856124ac565b90509392505050565b60606124b7856126b2565b612529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125795780518252602082019150602081019050602083039250612556565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146125db576040519150601f19603f3d011682016040523d82523d6000602084013e6125e0565b606091505b509150915081156125f55780925050506126aa565b6000815111156126085780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561266f578082015181840152602081019050612654565b50505050905090810190601f16801561269c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b828054828255906000526020600020908101928215612754579160200282015b8281111561275357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906126e5565b5b50905061276191906127b2565b5090565b8280548282559060005260206000209081019282156127a1579160200282015b828111156127a0578235825591602001919060010190612785565b5b5090506127ae91906127ed565b5090565b5b808211156127e957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016127b3565b5090565b5b808211156128065760008160009055506001016127ee565b509056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dd8de19f3d78954e84543dc45d0e258df3f2d126c2945d321ffe5fa219de398b64736f6c634300060c0033000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd0217000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c8063810d36d9116100a2578063a3f4df7e11610071578063a3f4df7e14610381578063ac4afa3814610404578063d9fe3eae1461045c578063f77c4791146104a0578063ffa1ad74146104d457610116565b8063810d36d9146102f15780638456cb591461030f578063951dc22c14610319578063973a59c11461034d57610116565b80634938649a116100e95780634938649a146102695780635479d940146102895780635c975abb146102a95780637517f9b8146102c95780637d7c2a1c146102e757610116565b8063044a1ef71461011b57806316f0115b146101e95780631a7ec4a11461021d5780633f4ba83a1461025f575b600080fd5b6101e76004803603604081101561013157600080fd5b810190808035906020019064010000000081111561014e57600080fd5b82018360208201111561016057600080fd5b8035906020019184602083028401116401000000008311171561018257600080fd5b9091929391929390803590602001906401000000008111156101a357600080fd5b8201836020820111156101b557600080fd5b803590602001918460208302840111640100000000831117156101d757600080fd5b9091929391929390505050610557565b005b6101f1610852565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102496004803603602081101561023357600080fd5b810190808035906020019092919050505061087a565b6040518082815260200191505060405180910390f35b61026761089b565b005b61027161096d565b60405180821515815260200191505060405180910390f35b610291610980565b60405180821515815260200191505060405180910390f35b6102b1610acb565b60405180821515815260200191505060405180910390f35b6102d1610adc565b6040518082815260200191505060405180910390f35b6102ef610ae2565b005b6102f9610fdd565b6040518082815260200191505060405180910390f35b610317610fe3565b005b6103216110b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103556110d9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103896110fd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103c95780820151818401526020810190506103ae565b50505050905090810190601f1680156103f65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104306004803603602081101561041a57600080fd5b8101908080359060200190929190505050611136565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61049e6004803603602081101561047257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611172565b005b6104a8611267565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dc61128b565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561051c578082015181840152602081019050610501565b50505050905090810190601f1680156105495780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b7f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff166105966112c4565b73ffffffffffffffffffffffffffffffffffffffff161461061f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b60005b8484905081101561081f577f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff16635b16ebb786868481811061067557fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff166040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156106dc57600080fd5b505afa1580156106f0573d6000803e3d6000fd5b505050506040513d602081101561070657600080fd5b8101908080519060200190929190505050610789576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4e6f7420612076616c696420706f6f6c0000000000000000000000000000000081525060200191505060405180910390fd5b600083838381811061079757fe5b905060200201351415610812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4c696d69742063616e6e6f74206265207a65726f00000000000000000000000081525060200191505060405180910390fd5b8080600101915050610622565b508383600391906108319291906126c5565b50818160049190610843929190612765565b50600060028190555050505050565b60007f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc905090565b6004818154811061088757fe5b906000526020600020016000915090505481565b7f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff166108da6112c4565b73ffffffffffffffffffffffffffffffffffffffff1614610963576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b61096b6112cc565b565b600060019054906101000a900460ff1681565b6000807f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc73ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109e957600080fd5b505afa1580156109fd573d6000803e3d6000fd5b505050506040513d6020811015610a1357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610a8a57600080fd5b505afa158015610a9e573d6000803e3d6000fd5b505050506040513d6020811015610ab457600080fd5b810190808051906020019092919050505014905090565b60008054906101000a900460ff1681565b60015481565b60008054906101000a900460ff1615610b63576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000ba9b1fbd199ad4bebc88073f8dc15a358a5301e973ffffffffffffffffffffffffffffffffffffffff16635dbe47e8610ba76112c4565b6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610bf157600080fd5b505afa158015610c05573d6000803e3d6000fd5b505050506040513d6020811015610c1b57600080fd5b8101908080519060200190929190505050610c9e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f63616c6c65722d69732d6e6f742d6b656570657200000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff16636a2b11767f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610d4557600080fd5b505afa158015610d59573d6000803e3d6000fd5b505050506040513d6020811015610d6f57600080fd5b810190808051906020019092919050505060015443031015610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f43616e206e6f7420726562616c616e636500000000000000000000000000000081525060200191505060405180910390fd5b436001819055506003805490506002541415610e185760006002819055505b6000600360025481548110610e2957fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008173ffffffffffffffffffffffffffffffffffffffff166370a082317f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610edf57600080fd5b505afa158015610ef3573d6000803e3d6000fd5b505050506040513d6020811015610f0957600080fd5b8101908080519060200190929190505050905060008114158015610f7957507f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b15610fc757600460025481548110610f8d57fe5b9060005260206000200154811115610fbc57600460025481548110610fae57fe5b906000526020600020015490505b610fc6828261143f565b5b6002600081548092919060010191905055505050565b60025481565b7f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff166110226112c4565b73ffffffffffffffffffffffffffffffffffffffff16146110ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f43616c6c6572206973206e6f742074686520636f6e74726f6c6c65720000000081525060200191505060405180910390fd5b6110b3611f8c565b565b7f000000000000000000000000ba9b1fbd199ad4bebc88073f8dc15a358a5301e981565b7f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc81565b6040518060400160405280600c81526020017f53747261746567792d565350000000000000000000000000000000000000000081525081565b6003818154811061114357fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156111db57600080fd5b505afa1580156111ef573d6000803e3d6000fd5b505050506040513d602081101561120557600080fd5b810190808051906020019092919050505090506112637f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc828473ffffffffffffffffffffffffffffffffffffffff1661207d9092919063ffffffff16565b5050565b7f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021781565b6040518060400160405280600581526020017f322e302e3200000000000000000000000000000000000000000000000000000081525081565b600033905090565b60008054906101000a900460ff1661134c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f5061757361626c653a206e6f742070617573656400000000000000000000000081525060200191505060405180910390fd5b600060019054906101000a900460ff16156113cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f5061757361626c653a2073687574646f776e000000000000000000000000000081525060200191505060405180910390fd5b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6114126112c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61148c7f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc30838573ffffffffffffffffffffffffffffffffffffffff1661211f909392919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff166397a5af55826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156114df57600080fd5b505af11580156114f3573d6000803e3d6000fd5b5050505060007f000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd021773ffffffffffffffffffffffffffffffffffffffff1663735de9f76040518163ffffffff1660e01b815260040160206040518083038186803b15801561155f57600080fd5b505afa158015611573573d6000803e3d6000fd5b505050506040513d602081101561158957600080fd5b8101908080519060200190929190505050905060008373ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115e457600080fd5b505afa1580156115f8573d6000803e3d6000fd5b505050506040513d602081101561160e57600080fd5b8101908080519060200190929190505050905060007f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc73ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561168957600080fd5b505afa15801561169d573d6000803e3d6000fd5b505050506040513d60208110156116b357600080fd5b81019080805190602001909291905050509050606073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156117ef57600267ffffffffffffffff8111801561172857600080fd5b506040519080825280602002602001820160405280156117575781602001602082028036833780820191505090505b509050828160008151811061176857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816001815181106117b057fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611926565b600367ffffffffffffffff8111801561180757600080fd5b506040519080825280602002602001820160405280156118365781602001602082028036833780820191505090505b509050828160008151811061184757fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2816001815181106118a357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081816002815181106118eb57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505b60008473ffffffffffffffffffffffffffffffffffffffff1663d06ca61f8573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156119ab57600080fd5b505afa1580156119bf573d6000803e3d6000fd5b505050506040513d60208110156119d557600080fd5b8101908080519060200190929190505050846040518363ffffffff1660e01b81526004018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b83811015611a3f578082015181840152602081019050611a24565b50505050905001935050505060006040518083038186803b158015611a6357600080fd5b505afa158015611a77573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611aa157600080fd5b8101908080516040519392919084640100000000821115611ac157600080fd5b83820191506020820185811115611ad757600080fd5b8251866020820283011164010000000082111715611af457600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611b2b578082015181840152602081019050611b10565b50505050905001604052505050600183510381518110611b4757fe5b6020026020010151905060008114611f8357611b858560008673ffffffffffffffffffffffffffffffffffffffff166121e09092919063ffffffff16565b611c51858573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bf057600080fd5b505afa158015611c04573d6000803e3d6000fd5b505050506040513d6020811015611c1a57600080fd5b81019080805190602001909291905050508673ffffffffffffffffffffffffffffffffffffffff166121e09092919063ffffffff16565b8473ffffffffffffffffffffffffffffffffffffffff166338ed17398573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b810190808051906020019092919050505060018530601e42016040518663ffffffff1660e01b815260040180868152602001858152602001806020018473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828103825285818151815260200191508051906020019060200280838360005b83811015611d97578082015181840152602081019050611d7c565b505050509050019650505050505050600060405180830381600087803b158015611dc057600080fd5b505af1158015611dd4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015611dfe57600080fd5b8101908080516040519392919084640100000000821115611e1e57600080fd5b83820191506020820185811115611e3457600080fd5b8251866020820283011164010000000082111715611e5157600080fd5b8083526020830192505050908051906020019060200280838360005b83811015611e88578082015181840152602081019050611e6d565b5050505090500160405250505050611f827f000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611f2157600080fd5b505afa158015611f35573d6000803e3d6000fd5b505050506040513d6020811015611f4b57600080fd5b81019080805190602001909291905050508573ffffffffffffffffffffffffffffffffffffffff1661207d9092919063ffffffff16565b5b50505050505050565b60008054906101000a900460ff161561200d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f5061757361626c653a207061757365640000000000000000000000000000000081525060200191505060405180910390fd5b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586120506112c4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b61211a8363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b505050565b6121da846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b50505050565b60008114806122ae575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b15801561227157600080fd5b505afa158015612285573d6000803e3d6000fd5b505050506040513d602081101561229b57600080fd5b8101908080519060200190929190505050145b612303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806128356036913960400191505060405180910390fd5b6123a08363095ea7b360e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506123a5565b505050565b6060612407826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166124949092919063ffffffff16565b905060008151111561248f5780806020019051602081101561242857600080fd5b810190808051906020019092919050505061248e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061280b602a913960400191505060405180910390fd5b5b505050565b60606124a384846000856124ac565b90509392505050565b60606124b7856126b2565b612529576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b602083106125795780518252602082019150602081019050602083039250612556565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d80600081146125db576040519150601f19603f3d011682016040523d82523d6000602084013e6125e0565b606091505b509150915081156125f55780925050506126aa565b6000815111156126085780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561266f578082015181840152602081019050612654565b50505050905090810190601f16801561269c5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b949350505050565b600080823b905060008111915050919050565b828054828255906000526020600020908101928215612754579160200282015b8281111561275357823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906126e5565b5b50905061276191906127b2565b5090565b8280548282559060005260206000209081019282156127a1579160200282015b828111156127a0578235825591602001919060010190612785565b5b5090506127ae91906127ed565b5090565b5b808211156127e957600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055506001016127b3565b5090565b5b808211156128065760008160009055506001016127ee565b509056fe5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220dd8de19f3d78954e84543dc45d0e258df3f2d126c2945d321ffe5fa219de398b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd0217000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc
-----Decoded View---------------
Arg [0] : _controller (address): 0xa4F1671d3Aee73C05b552d57f2d16d3cfcBd0217
Arg [1] : _vvsp (address): 0xbA4cFE5741b357FA371b506e5db0774aBFeCf8Fc
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000a4f1671d3aee73c05b552d57f2d16d3cfcbd0217
Arg [1] : 000000000000000000000000ba4cfe5741b357fa371b506e5db0774abfecf8fc
Deployed Bytecode Sourcemap
28225:4682:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29654:428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30227:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28650:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29574:72;;;:::i;:::-;;19408:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30090:129;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;19383:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28333:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30495:779;;;:::i;:::-;;28588:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29498:68;;;:::i;:::-;;28459:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28419:33;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28690:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28621:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31326:193;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28373:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28741:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29654:428;29426:10;29402:35;;:12;:10;:12::i;:::-;:35;;;29394:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29803:9:::1;29798:190;29822:6;;:13;;29818:1;:17;29798:190;;;29865:10;:17;;;29883:6;;29890:1;29883:9;;;;;;;;;;;;;;;29865:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;29857:57;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29950:1;29937:6;;29944:1;29937:9;;;;;;;;;;;;;:14;;29929:47;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29837:3;;;;;;;29798:190;;;;30006:6;;29998:5;:14;;;;;;;:::i;:::-;;30042:6;;30023:16;:25;;;;;;;:::i;:::-;;30073:1;30059:11;:15;;;;29654:428:::0;;;;:::o;30227:87::-;30266:7;30301:4;30286:20;;30227:87;:::o;28650:33::-;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29574:72::-;29426:10;29402:35;;:12;:10;:12::i;:::-;:35;;;29394:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29628:10:::1;:8;:10::i;:::-;29574:72::o:0;19408:26::-;;;;;;;;;;;;;:::o;30090:129::-;30137:4;30210:1;30168:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30161:30;;;30200:4;30161:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:50;30154:57;;30090:129;:::o;19383:18::-;;;;;;;;;;;;:::o;28333:33::-;;;;:::o;30495:779::-;19488:6;;;;;;;;;;19487:7;19479:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29274:7:::1;:16;;;29291:12;:10;:12::i;:::-;29274:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;29266:63;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30620:10:::2;:28;;;30657:4;30620:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;30598:18;;30583:12;:33;:80;;30561:147;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;30740:12;30719:18;:33;;;;30784:5;:12;;;;30769:11;;:27;30765:75;;;30827:1;30813:11;:15;;;;30765:75;30852:22;30889:5;30895:11;;30889:18;;;;;;;;;;;;;;;;;;;;;;;;;30852:56;;30919:16;30938:10;:20;;;30967:4;30938:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;30919:54;;31000:1;30988:8;:13;;:53;;;;;31036:4;31005:36;;31013:10;31005:36;;;;30988:53;30984:259;;;31073:16;31090:11;;31073:29;;;;;;;;;;;;;;;;31062:8;:40;31058:121;;;31134:16;31151:11;;31134:29;;;;;;;;;;;;;;;;31123:40;;31058:121;31193:38;31210:10;31222:8;31193:16;:38::i;:::-;30984:259;31253:11;;:13;;;;;;;;;;;;;29340:1;;30495:779::o:0;28588:26::-;;;;:::o;29498:68::-;29426:10;29402:35;;:12;:10;:12::i;:::-;:35;;;29394:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29550:8:::1;:6;:8::i;:::-;29498:68::o:0;28459:40::-;;;:::o;28419:33::-;;;:::o;28690:44::-;;;;;;;;;;;;;;;;;;;:::o;28621:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31326:193::-;31386:14;31410:10;31403:28;;;31440:4;31403:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31386:60;;31457:54;31497:4;31504:6;31464:10;31457:31;;;;:54;;;;;:::i;:::-;31326:193;;:::o;28373:39::-;;;:::o;28741:40::-;;;;;;;;;;;;;;;;;;;:::o;18623:106::-;18676:15;18711:10;18704:17;;18623:106;:::o;20152:135::-;19582:6;;;;;;;;;;19574:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19688:14:::1;;;;;;;;;;;19687:15;19679:46;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;20236:5:::2;20227:6:::0;::::2;:14;;;;;;;;;;;;;;;;;;20257:22;20266:12;:10;:12::i;:::-;20257:22;;;;;;;;;;;;;;;;;;;;20152:135::o:0;31527:1377::-;31611:80;31664:4;31679;31686;31626:10;31611:44;;;;:80;;;;;;:::i;:::-;31702:10;:29;;;31732:4;31702:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31748:32;31802:10;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31748:81;;31840:11;31861:10;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31840:40;;31891:10;31911:4;:10;;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31891:33;;31937:21;28539:42;31975:21;;31983:4;31975:21;;;31971:321;;;32034:1;32020:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32013:23;;32069:4;32051;32056:1;32051:7;;;;;;;;;;;;;:23;;;;;;;;;;;32107:3;32089:4;32094:1;32089:7;;;;;;;;;;;;;:22;;;;;;;;;;;31971:321;;;32165:1;32151:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32144:23;;32200:4;32182;32187:1;32182:7;;;;;;;;;;;;;:23;;;;;;;;;;;28539:42;32220:4;32225:1;32220:7;;;;;;;;;;;;;:23;;;;;;;;;;;32276:3;32258:4;32263:1;32258:7;;;;;;;;;;;;;:22;;;;;;;;;;;31971:321;32302:17;32335:13;:27;;;32363:4;:14;;;32386:4;32363:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32394:4;32335:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32414:1;32400:4;:11;:15;32335:81;;;;;;;;;;;;;;32302:114;;32444:1;32431:9;:14;32427:470;;32462:43;32487:13;32503:1;32462:4;:16;;;;:43;;;;;:::i;:::-;32520:71;32545:13;32561:4;:14;;;32584:4;32561:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32520:4;:16;;;;:71;;;;;:::i;:::-;32606:13;:38;;;32663:4;:14;;;32686:4;32663:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32711:1;32731:4;32762;32792:2;32786:3;:8;32606:203;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32824:61;32849:4;32856:3;:13;;;32878:4;32856:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32824:3;:16;;;;:61;;;;;:::i;:::-;32427:470;31527:1377;;;;;;;:::o;19933:117::-;19488:6;;;;;;;;;;19487:7;19479:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20002:4:::1;19993:6;::::0;:13:::1;;;;;;;;;;;;;;;;;;20022:20;20029:12;:10;:12::i;:::-;20022:20;;;;;;;;;;;;;;;;;;;;19933:117::o:0;14924:177::-;15007:86;15027:5;15057:23;;;15082:2;15086:5;15034:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15007:19;:86::i;:::-;14924:177;;;:::o;15109:205::-;15210:96;15230:5;15260:27;;;15289:4;15295:2;15299:5;15237:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15210:19;:96::i;:::-;15109:205;;;;:::o;15583:622::-;15962:1;15953:5;:10;15952:62;;;;16012:1;15969:5;:15;;;15993:4;16000:7;15969:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;15952:62;15944:152;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16107:90;16127:5;16157:22;;;16181:7;16190:5;16134:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16107:19;:90::i;:::-;15583:622;;;:::o;17229:761::-;17653:23;17679:69;17707:4;17679:69;;;;;;;;;;;;;;;;;17687:5;17679:27;;;;:69;;;;;:::i;:::-;17653:95;;17783:1;17763:10;:17;:21;17759:224;;;17905:10;17894:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17886:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17759:224;17229:761;;;:::o;11903:196::-;12006:12;12038:53;12061:6;12069:4;12075:1;12078:12;12038:22;:53::i;:::-;12031:60;;11903:196;;;;;:::o;13280:979::-;13410:12;13443:18;13454:6;13443:10;:18::i;:::-;13435:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13569:12;13583:23;13610:6;:11;;13630:8;13641:4;13610:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13568:78;;;;13661:7;13657:595;;;13692:10;13685:17;;;;;;13657:595;13826:1;13806:10;:17;:21;13802:439;;;14069:10;14063:17;14130:15;14117:10;14113:2;14109:19;14102:44;14017:148;14212:12;14205:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13280:979;;;;;;;:::o;8985:422::-;9045:4;9253:12;9364:7;9352:20;9344:28;;9398:1;9391:4;:8;9384:15;;;8985:422;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://dd8de19f3d78954e84543dc45d0e258df3f2d126c2945d321ffe5fa219de398b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.