Feature Tip: Add private address tag to any address under My Name Tag !
Latest 25 from a total of 431 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 23508131 | 140 days ago | IN | 0 ETH | 0.00085777 | ||||
| Compute | 23134266 | 192 days ago | IN | 0 ETH | 0.01112975 | ||||
| Withdraw | 22458432 | 287 days ago | IN | 0 ETH | 0.01054697 | ||||
| Withdraw | 20905106 | 503 days ago | IN | 0 ETH | 0.01154212 | ||||
| Withdraw | 20706843 | 531 days ago | IN | 0 ETH | 0.00747792 | ||||
| Deposit | 20650206 | 539 days ago | IN | 0 ETH | 0.00483796 | ||||
| Withdraw | 19501163 | 700 days ago | IN | 0 ETH | 0.04157935 | ||||
| Withdraw | 19489513 | 701 days ago | IN | 0 ETH | 0.05891095 | ||||
| Withdraw | 19055166 | 762 days ago | IN | 0 ETH | 0.00612188 | ||||
| Withdraw | 19028733 | 766 days ago | IN | 0 ETH | 0.03688261 | ||||
| Withdraw | 18958568 | 776 days ago | IN | 0 ETH | 0.00396135 | ||||
| Deposit | 18958565 | 776 days ago | IN | 0 ETH | 0.0090697 | ||||
| Withdraw | 18943234 | 778 days ago | IN | 0 ETH | 0.00792759 | ||||
| Withdraw | 18920743 | 781 days ago | IN | 0 ETH | 0.00307312 | ||||
| Set Investment P... | 18920725 | 781 days ago | IN | 0 ETH | 0.00102291 | ||||
| Compute | 18920680 | 781 days ago | IN | 0 ETH | 0.0707824 | ||||
| Withdraw | 18733180 | 807 days ago | IN | 0 ETH | 0.01035264 | ||||
| Change Apr | 18723408 | 809 days ago | IN | 0 ETH | 0.05285331 | ||||
| Deposit | 18639040 | 821 days ago | IN | 0 ETH | 0.01053638 | ||||
| Lock Capital | 18615199 | 824 days ago | IN | 0 ETH | 0.01174526 | ||||
| Set Investment P... | 18615188 | 824 days ago | IN | 0 ETH | 0.00097996 | ||||
| Set Investment P... | 18615070 | 824 days ago | IN | 0 ETH | 0.00108297 | ||||
| Set Flat Withdra... | 18615061 | 824 days ago | IN | 0 ETH | 0.00108036 | ||||
| Set Flat Withdra... | 18615039 | 824 days ago | IN | 0 ETH | 0.00100814 | ||||
| Withdraw | 18590296 | 827 days ago | IN | 0 ETH | 0.0025336 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Vault
Compiler Version
v0.8.3+commit.8d00100c
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2022-08-23
*/
// SPDX-License-Identifier: MIT
pragma solidity 0.8.3;
/**
* @title Represents an ownable resource.
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address previousOwner, address newOwner);
/**
* Constructor
* @param addr The owner of the smart contract
*/
constructor (address addr) {
require(addr != address(0), "non-zero address required");
require(addr != address(1), "ecrecover address not allowed");
owner = addr;
emit OwnershipTransferred(address(0), addr);
}
/**
* @notice This modifier indicates that the function can only be called by the owner.
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner == msg.sender, "Only owner requirement");
_;
}
/**
* @notice Transfers ownership to the address specified.
* @param addr Specifies the address of the new owner.
* @dev Throws if called by any account other than the owner.
*/
function transferOwnership (address addr) public virtual onlyOwner {
require(addr != address(0), "non-zero address required");
emit OwnershipTransferred(owner, addr);
owner = addr;
}
}
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
interface IERC20 {
/**
* Transfer token for a specified address
* @param to The address to transfer to.
* @param value The amount to be transferred.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* Transfer tokens from one address to another.
* Note that while this function emits an Approval event, this is not required as per the specification,
* and other compliant implementations may not emit the event.
* @param from address The address which you want to send tokens from
* @param to address The address which you want to transfer to
* @param value uint256 the amount of tokens to be transferred
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
/**
* Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
* 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
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* Returns the total number of tokens in existence.
*/
function totalSupply() external view returns (uint256);
function decimals() external view returns (uint8);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
/**
* Gets the balance of the address specified.
* @param addr The address to query the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address addr) external view returns (uint256);
/**
* Function to check the amount of tokens that an owner allowed to a spender.
* @param owner address The address which owns the funds.
* @param spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* This event is triggered when a given amount of tokens is sent to an address.
* @param from The address of the sender
* @param to The address of the receiver
* @param value The amount transferred
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* This event is triggered when a given address is approved to spend a specific amount of tokens
* on behalf of the sender.
* @param owner The owner of the token
* @param spender The spender
* @param value The amount to transfer
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @title Represents an ERC-20
*/
contract ERC20 is IERC20 {
// Basic ERC-20 data
string private _name;
string private _symbol;
uint8 private _decimals;
uint256 internal _totalSupply;
// The balance of each owner
mapping(address => uint256) internal _balances;
// The allowance set by each owner
mapping(address => mapping(address => uint256)) private _allowances;
/**
* @notice Constructor
* @param tokenName The name of the token
* @param tokenSymbol The symbol of the token
* @param tokenDecimals The decimals of the token
* @param initialSupply The initial supply
*/
constructor (string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply) {
_name = tokenName;
_symbol = tokenSymbol;
_decimals = tokenDecimals;
_totalSupply = initialSupply;
}
/**
* @notice Transfers a given amount tokens to the address specified.
* @param from The address of the sender.
* @param to The address to transfer to.
* @param value The amount to be transferred.
* @return Returns true in case of success.
*/
function _executeErc20Transfer (address from, address to, uint256 value) private returns (bool) {
// Checks
require(to != address(0), "non-zero address required");
require(from != address(0), "non-zero sender required");
require(value > 0, "Amount cannot be zero");
require(_balances[from] >= value, "Amount exceeds sender balance");
// State changes
_balances[from] = _balances[from] - value;
_balances[to] = _balances[to] + value;
// Emit the event per ERC-20
emit Transfer(from, to, value);
return true;
}
/**
* @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
* @dev 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
* @param ownerAddr The address of the owner.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return Returns true in case of success.
*/
function _approveSpender(address ownerAddr, address spender, uint256 value) private returns (bool) {
require(spender != address(0), "non-zero spender required");
require(ownerAddr != address(0), "non-zero owner required");
// State changes
_allowances[ownerAddr][spender] = value;
// Emit the event
emit Approval(ownerAddr, spender, value);
return true;
}
/**
* @notice Transfers a given amount tokens to the address specified.
* @param to The address to transfer to.
* @param value The amount to be transferred.
* @return Returns true in case of success.
*/
function transfer(address to, uint256 value) public override returns (bool) {
require (_executeErc20Transfer(msg.sender, to, value), "Failed to execute ERC20 transfer");
return true;
}
/**
* @notice Transfer tokens from one address to another.
* @dev Note that while this function emits an Approval event, this is not required as per the specification,
* and other compliant implementations may not emit the event.
* @param from address The address which you want to send tokens from
* @param to address The address which you want to transfer to
* @param value uint256 the amount of tokens to be transferred
* @return Returns true in case of success.
*/
function transferFrom(address from, address to, uint256 value) public override returns (bool) {
uint256 currentAllowance = _allowances[from][msg.sender];
require(currentAllowance >= value, "Amount exceeds allowance");
require (_executeErc20Transfer(from, to, value), "Failed to execute transferFrom");
require(_approveSpender(from, msg.sender, currentAllowance - value), "ERC20: Approval failed");
return true;
}
/**
* @notice Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
* @dev 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
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return Returns true in case of success.
*/
function approve(address spender, uint256 value) public override returns (bool) {
require(_approveSpender(msg.sender, spender, value), "ERC20: Approval failed");
return true;
}
/**
* Gets the total supply of tokens
*/
function totalSupply() public view override returns (uint256) {
return _totalSupply;
}
/**
* @notice Gets the name of the token.
*/
function name() public view override returns (string memory) {
return _name;
}
/**
* @notice Gets the symbol of the token.
*/
function symbol() public view override returns (string memory) {
return _symbol;
}
/**
* @notice Gets the decimals of the token.
*/
function decimals() public view override returns (uint8) {
return _decimals;
}
/**
* Gets the balance of the address specified.
* @param addr The address to query the balance of.
* @return An uint256 representing the amount owned by the passed address.
*/
function balanceOf(address addr) public view override returns (uint256) {
return _balances[addr];
}
/**
* Function to check the amount of tokens that an owner allowed to a spender.
* @param owner address The address which owns the funds.
* @param spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
function allowance(address owner, address spender) public view override returns (uint256) {
return _allowances[owner][spender];
}
}
/**
* @notice Represents an ERC20 that can be minted and/or burnt by multiple parties.
*/
contract Mintable is ERC20, Ownable {
/**
* @notice The maximum circulating supply of tokens
*/
uint256 public maxSupply;
// Keeps track of the authorized minters
mapping (address => bool) internal _authorizedMinters;
// Keeps track of the authorized burners
mapping (address => bool) internal _authorizedBurners;
// ---------------------------------------
// Events
// ---------------------------------------
/**
* This event is triggered whenever an address is added as a valid minter.
* @param addr The address that became a valid minter
*/
event OnMinterGranted(address addr);
/**
* This event is triggered when a minter is revoked.
* @param addr The address that was revoked
*/
event OnMinterRevoked(address addr);
/**
* This event is triggered whenever an address is added as a valid burner.
* @param addr The address that became a valid burner
*/
event OnBurnerGranted(address addr);
/**
* This event is triggered when a burner is revoked.
* @param addr The address that was revoked
*/
event OnBurnerRevoked(address addr);
/**
* This event is triggered when the maximum limit for minting tokens is updated.
* @param prevValue The previous limit
* @param newValue The new limit
*/
event OnMaxSupplyChanged(uint256 prevValue, uint256 newValue);
// ---------------------------------------
// Constructor
// ---------------------------------------
/**
* @notice Constructor
* @param newOwner The contract owner
* @param tokenName The name of the token
* @param tokenSymbol The symbol of the token
* @param tokenDecimals The decimals of the token
* @param initialSupply The initial supply
*/
constructor (address newOwner, string memory tokenName, string memory tokenSymbol, uint8 tokenDecimals, uint256 initialSupply)
ERC20(tokenName, tokenSymbol, tokenDecimals, initialSupply)
Ownable(newOwner) { // solhint-disable-line no-empty-blocks
}
/**
* @notice Throws if the sender is not a valid minter
*/
modifier onlyMinter() {
require(_authorizedMinters[msg.sender], "Unauthorized minter");
_;
}
/**
* @notice Throws if the sender is not a valid burner
*/
modifier onlyBurner() {
require(_authorizedBurners[msg.sender], "Unauthorized burner");
_;
}
/**
* @notice Grants the right to issue new tokens to the address specified.
* @dev This function can be called by the owner only.
* @param addr The destination address
*/
function grantMinter (address addr) public onlyOwner {
require(!_authorizedMinters[addr], "Address authorized already");
_authorizedMinters[addr] = true;
emit OnMinterGranted(addr);
}
/**
* @notice Revokes the right to issue new tokens from the address specified.
* @dev This function can be called by the owner only.
* @param addr The destination address
*/
function revokeMinter (address addr) public onlyOwner {
require(_authorizedMinters[addr], "Address was never authorized");
_authorizedMinters[addr] = false;
emit OnMinterRevoked(addr);
}
/**
* @notice Grants the right to burn tokens to the address specified.
* @dev This function can be called by the owner only.
* @param addr The destination address
*/
function grantBurner (address addr) public onlyOwner {
require(!_authorizedBurners[addr], "Address authorized already");
_authorizedBurners[addr] = true;
emit OnBurnerGranted(addr);
}
/**
* @notice Revokes the right to burn tokens from the address specified.
* @dev This function can be called by the owner only.
* @param addr The destination address
*/
function revokeBurner (address addr) public onlyOwner {
require(_authorizedBurners[addr], "Address was never authorized");
_authorizedBurners[addr] = false;
emit OnBurnerRevoked(addr);
}
/**
* @notice Updates the maximum limit for minting tokens.
* @param newValue The new limit
*/
function changeMaxSupply (uint256 newValue) public onlyOwner {
require(newValue == 0 || newValue > _totalSupply, "Invalid max supply");
emit OnMaxSupplyChanged(maxSupply, newValue);
maxSupply = newValue;
}
/**
* @notice Issues a given number of tokens to the address specified.
* @dev This function throws if the sender is not a whitelisted minter.
* @param addr The destination address
* @param amount The number of tokens
*/
function mint (address addr, uint256 amount) public onlyMinter {
require(addr != address(0) && addr != address(this), "Invalid address");
require(amount > 0, "Invalid amount");
require(canMint(amount), "Max token supply exceeded");
_totalSupply += amount;
_balances[addr] += amount;
emit Transfer(address(0), addr, amount);
}
/**
* @notice Burns a given number of tokens from the address specified.
* @dev This function throws if the sender is not a whitelisted minter. In this context, minters and burners have the same privileges.
* @param addr The destination address
* @param amount The number of tokens
*/
function burn (address addr, uint256 amount) public onlyBurner {
require(addr != address(0) && addr != address(this), "Invalid address");
require(amount > 0, "Invalid amount");
require(_totalSupply > 0, "No token supply");
uint256 accountBalance = _balances[addr];
require(accountBalance >= amount, "Burn amount exceeds balance");
_balances[addr] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(addr, address(0), amount);
}
/**
* @notice Indicates if we can issue/mint the number of tokens specified.
* @param amount The number of tokens to issue/mint
*/
function canMint (uint256 amount) public view returns (bool) {
return (maxSupply == 0) || (_totalSupply + amount <= maxSupply);
}
}
/**
* @title Represents a controllable resource.
*/
contract Controllable is Ownable {
address public controllerAddress;
event OnControllerChanged (address prevAddress, address newAddress);
/**
* @notice Constructor
* @param ownerAddr The owner of the smart contract
* @param controllerAddr The address of the controller
*/
constructor (address ownerAddr, address controllerAddr) Ownable (ownerAddr) {
require(controllerAddr != address(0), "Controller address required");
require(controllerAddr != ownerAddr, "Owner cannot be the Controller");
controllerAddress = controllerAddr;
}
/**
* @notice Throws if the sender is not the controller
*/
modifier onlyController() {
require(msg.sender == controllerAddress, "Unauthorized controller");
_;
}
/**
* @notice Makes sure the sender is either the owner of the contract or the controller
*/
modifier onlyOwnerOrController() {
require(msg.sender == controllerAddress || msg.sender == owner, "Only owner or controller");
_;
}
/**
* @notice Sets the controller
* @dev This function can be called by the owner only
* @param controllerAddr The address of the controller
*/
function setController (address controllerAddr) public onlyOwner {
// Checks
require(controllerAddr != address(0), "Controller address required");
require(controllerAddr != owner, "Owner cannot be the Controller");
require(controllerAddr != controllerAddress, "Controller already set");
emit OnControllerChanged(controllerAddress, controllerAddr);
// State changes
controllerAddress = controllerAddr;
}
/**
* @notice Transfers ownership to the address specified.
* @param addr Specifies the address of the new owner.
* @dev Throws if called by any account other than the owner.
*/
function transferOwnership (address addr) public override onlyOwner {
require(addr != controllerAddress, "Cannot transfer to controller");
super.transferOwnership(addr);
}
}
/**
* @title Represents a receipt token. The token is fully compliant with the ERC20 interface.
* @dev The token can be minted or burnt by whitelisted addresses only. Only the owner is allowed to enable/disable addresses.
*/
contract ReceiptToken is Mintable {
/**
* @notice Constructor.
* @param newOwner The owner of the smart contract.
*/
constructor (address newOwner, uint256 initialMaxSupply) Mintable(newOwner, "Fractal Protocol Vault Token", "USDF", 6, 0) {
maxSupply = initialMaxSupply;
}
}
/**
* @notice This library provides stateless, general purpose functions.
*/
library Utils {
// The code hash of any EOA
bytes32 constant internal EOA_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
/**
* @notice Indicates if the address specified represents a smart contract.
* @dev Notice that this method returns TRUE if the address is a contract under construction
* @param addr The address to evaluate
* @return Returns true if the address represents a smart contract
*/
function isContract (address addr) internal view returns (bool) {
bytes32 eoaHash = EOA_HASH;
bytes32 codeHash;
// solhint-disable-next-line no-inline-assembly
assembly { codeHash := extcodehash(addr) }
return (codeHash != eoaHash && codeHash != 0x0);
}
/**
* @notice Gets the code hash of the address specified
* @param addr The address to evaluate
* @return Returns a hash
*/
function getCodeHash (address addr) internal view returns (bytes32) {
bytes32 codeHash;
// solhint-disable-next-line no-inline-assembly
assembly { codeHash := extcodehash(addr) }
return codeHash;
}
}
library DateUtils {
// The number of seconds per day
uint256 internal constant SECONDS_PER_DAY = 24 * 60 * 60;
// The number of seconds per hour
uint256 internal constant SECONDS_PER_HOUR = 60 * 60;
// The number of seconds per minute
uint256 internal constant SECONDS_PER_MINUTE = 60;
// The offset from 01/01/1970
int256 internal constant OFFSET19700101 = 2440588;
/**
* @notice Gets the year of the timestamp specified.
* @param timestamp The timestamp
* @return year The year
*/
function getYear (uint256 timestamp) internal pure returns (uint256 year) {
(year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
}
/**
* @notice Gets the timestamp of the date specified.
* @param year The year
* @param month The month
* @param day The day
* @param hour The hour
* @param minute The minute
* @param second The seconds
* @return timestamp The timestamp
*/
function timestampFromDateTime(uint256 year, uint256 month, uint256 day, uint256 hour, uint256 minute, uint256 second) internal pure returns (uint256 timestamp) {
timestamp = _daysFromDate(year, month, day) * SECONDS_PER_DAY + hour * SECONDS_PER_HOUR + minute * SECONDS_PER_MINUTE + second;
}
/**
* @notice Gets the number of days elapsed between the two timestamps specified.
* @param fromTimestamp The source date
* @param toTimestamp The target date
* @return Returns the difference, in days
*/
function diffDays (uint256 fromTimestamp, uint256 toTimestamp) internal pure returns (uint256) {
require(fromTimestamp <= toTimestamp, "Invalid order for timestamps");
return (toTimestamp - fromTimestamp) / SECONDS_PER_DAY;
}
/**
* @notice Calculate year/month/day from the number of days since 1970/01/01 using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and adding the offset 2440588 so that 1970/01/01 is day 0
* @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol
* @param _days The year
* @return year The year
* @return month The month
* @return day The day
*/
function _daysToDate (uint256 _days) internal pure returns (uint256 year, uint256 month, uint256 day) {
int256 __days = int256(_days);
int256 x = __days + 68569 + OFFSET19700101;
int256 n = 4 * x / 146097;
x = x - (146097 * n + 3) / 4;
int256 _year = 4000 * (x + 1) / 1461001;
x = x - 1461 * _year / 4 + 31;
int256 _month = 80 * x / 2447;
int256 _day = x - 2447 * _month / 80;
x = _month / 11;
_month = _month + 2 - 12 * x;
_year = 100 * (n - 49) + _year + x;
year = uint256(_year);
month = uint256(_month);
day = uint256(_day);
}
/**
* @notice Calculates the number of days from 1970/01/01 to year/month/day using the date conversion algorithm from http://aa.usno.navy.mil/faq/docs/JD_Formula.php and subtracting the offset 2440588 so that 1970/01/01 is day 0
* @dev Taken from https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary/blob/master/contracts/BokkyPooBahsDateTimeLibrary.sol
* @param year The year
* @param month The month
* @param day The day
* @return _days Returns the number of days
*/
function _daysFromDate (uint256 year, uint256 month, uint256 day) internal pure returns (uint256 _days) {
require(year >= 1970, "Error");
int _year = int(year);
int _month = int(month);
int _day = int(day);
int __days = _day
- 32075
+ 1461 * (_year + 4800 + (_month - 14) / 12) / 4
+ 367 * (_month - 2 - (_month - 14) / 12 * 12) / 12
- 3 * ((_year + 4900 + (_month - 14) / 12) / 100) / 4
- OFFSET19700101;
_days = uint256(__days);
}
function isLeapYear(uint timestamp) internal pure returns (bool leapYear) {
(uint year,,) = _daysToDate(timestamp / SECONDS_PER_DAY);
leapYear = _isLeapYear(year);
}
function _isLeapYear (uint256 year) internal pure returns (bool leapYear) {
leapYear = ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
}
interface IDeployable {
function deployCapital (uint256 deploymentAmount, bytes32 foreignNetwork) external;
function claim (uint256 dailyInterestAmount) external;
}
/**
* @title Represents a vault.
*/
contract Vault is Controllable {
// The decimal multiplier of the receipt token
uint256 private constant USDF_DECIMAL_MULTIPLIER = uint256(10) ** uint256(6);
// Represents a record
struct Record {
uint256 apr;
uint256 tokenPrice;
uint256 totalDeposited;
uint256 dailyInterest;
}
/**
* @notice The timestamp that defines the start of the current year, per contract deployment.
* @dev This is the unix epoch of January 1st since the contract deployment.
*/
uint256 public startOfYearTimestamp;
/**
* @notice The current period. It is the zero-based day of the year, ranging from [0..364]
* @dev Day zero represents January 1st (first day of the year) whereas day 364 represents December 31st (last day of the day)
*/
uint256 public currentPeriod;
/**
* @notice The minimum amount you can deposit in the vault.
*/
uint256 public minDepositAmount;
/**
* @notice The flat fee to apply to vault withdrawals.
*/
uint256 public flatFeePercent;
// The decimals multiplier of the underlying ERC20
uint256 immutable private _decimalsMultiplier;
/**
* @notice The percentage of capital that needs to be invested. It ranges from [1..99]
* @dev The investment percent is set to 90% by default
*/
uint8 public investmentPercent = 90;
// The reentrancy guard for deposits
uint8 private _reentrancyMutexForDeposits;
// The reentrancy guard for withdrawals
uint8 private _reentrancyMutexForWithdrawals;
/**
* @notice The address of the yield reserve
*/
address public yieldReserveAddress;
/**
* @notice The address that collects the applicable fees
*/
address public feesAddress;
/**
* @notice The interface of the underlying token
*/
IERC20 public immutable underlyingTokenInterface;
// The receipt token. This is immutable so it cannot be altered after deployment.
ReceiptToken private immutable _receiptToken;
// The snapshots history
mapping (uint256 => Record) private _records;
// ---------------------------------------
// Events
// ---------------------------------------
/**
* @notice This event is fired when the vault receives a deposit.
* @param tokenAddress Specifies the token address
* @param fromAddress Specifies the address of the sender
* @param depositAmount Specifies the deposit amount in USDC or the ERC20 handled by this contract
* @param receiptTokensAmount Specifies the amount of receipt tokens issued to the user
*/
event OnVaultDeposit (address tokenAddress, address fromAddress, uint256 depositAmount, uint256 receiptTokensAmount);
/**
* @notice This event is fired when a user withdraws funds from the vault.
* @param tokenAddress Specifies the token address
* @param toAddress Specifies the address of the recipient
* @param erc20Amount Specifies the amount in USDC or the ERC20 handled by this contract
* @param receiptTokensAmount Specifies the amount of receipt tokens withdrawn by the user
* @param fee Specifies the withdrawal fee
*/
event OnVaultWithdrawal (address tokenAddress, address toAddress, uint256 erc20Amount, uint256 receiptTokensAmount, uint256 fee);
event OnTokenPriceChanged (uint256 prevTokenPrice, uint256 newTokenPrice);
event OnFlatWithdrawalFeeChanged (uint256 prevValue, uint256 newValue);
event OnYieldReserveAddressChanged (address prevAddress, address newAddress);
event OnFeesAddressChanged (address prevAddress, address newAddress);
event OnInvestmentPercentChanged (uint8 prevValue, uint8 newValue);
event OnCapitalLocked (uint256 amountLocked);
event OnInterestClaimed (uint256 interestAmount);
event OnAprChanged (uint256 prevApr, uint256 newApr);
event OnEmergencyWithdraw (uint256 withdrawalAmount);
// ---------------------------------------
// Constructor
// ---------------------------------------
constructor (
address ownerAddr,
address controllerAddr,
ReceiptToken receiptTokenInterface,
IERC20 eip20Interface,
uint256 initialApr,
uint256 initialTokenPrice,
uint256 initialMinDepositAmount,
uint256 flatFeePerc,
address feesAddr)
Controllable (ownerAddr, controllerAddr) {
// Checks
require(initialMinDepositAmount > 0, "Invalid min deposit amount");
require(feesAddr != address(0), "Invalid address for fees");
// State changes
underlyingTokenInterface = eip20Interface;
_receiptToken = receiptTokenInterface;
minDepositAmount = initialMinDepositAmount;
_decimalsMultiplier = uint256(10) ** uint256(eip20Interface.decimals());
uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time
// Get the current year
uint256 currentYear = DateUtils.getYear(currentTimestamp);
// Set the timestamp of January 1st of the current year (the year starts at this unix epoch)
startOfYearTimestamp = DateUtils.timestampFromDateTime(currentYear, 1, 1, 0, 0, 0);
// Create the first record
currentPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp);
// The APR must be expressed with 2 decimal places. Example: 5% = 500 whereas 5.75% = 575
_records[currentPeriod] = Record(initialApr, initialTokenPrice, 0, 0);
flatFeePercent = flatFeePerc;
feesAddress = feesAddr;
}
// ---------------------------------------
// Modifiers
// ---------------------------------------
/**
* @notice Throws if there is a deposit in progress
*/
modifier ifNotReentrantDeposit() {
require(_reentrancyMutexForDeposits == 0, "Reentrant deposit rejected");
_;
}
/**
* @notice Throws if there is a withdrawal in progress
*/
modifier ifNotReentrantWithdrawal() {
require(_reentrancyMutexForWithdrawals == 0, "Reentrant withdrawal rejected");
_;
}
// ---------------------------------------
// Functions
// ---------------------------------------
/**
* @notice Sets the address of the yield reserve
* @dev This function can be called by the owner or the controller.
* @param addr The address of the yield reserve
*/
function setYieldReserveAddress (address addr) public onlyOwnerOrController {
require(addr != address(0) && addr != address(this), "Invalid address");
require(Utils.isContract(addr), "The address must be a contract");
emit OnYieldReserveAddressChanged(yieldReserveAddress, addr);
yieldReserveAddress = addr;
}
/**
* @notice Sets the minimum amount for deposits.
* @dev This function can be called by the owner or the controller.
* @param minAmount The minimum deposit amount
*/
function setMinDepositAmount (uint256 minAmount) public onlyOwnerOrController {
// Checks
require(minAmount > 0, "Invalid minimum deposit amount");
// State changes
minDepositAmount = minAmount;
}
/**
* @notice Sets a new flat fee for withdrawals.
* @dev The new fee is allowed to be zero (aka: no fees).
* @param newFeeWithMultiplier The new fee, which is expressed per decimals precision of the underlying token (say USDC for example)
*/
function setFlatWithdrawalFee (uint256 newFeeWithMultiplier) public onlyOwnerOrController {
// Example for USDC (6 decimal places):
// Say the fee is: 0.03%
// Thus the fee amount is: 0.03 * _decimalsMultiplier = 30000 = 0.03 * (10 to the power of 6)
emit OnFlatWithdrawalFeeChanged(flatFeePercent, newFeeWithMultiplier);
flatFeePercent = newFeeWithMultiplier;
}
/**
* @notice Sets the address for collecting fees.
* @param addr The address
*/
function setFeeAddress (address addr) public onlyOwnerOrController {
require(addr != address(0) && addr != feesAddress, "Invalid address for fees");
emit OnFeesAddressChanged(feesAddress, addr);
feesAddress = addr;
}
/**
* @notice Sets the total amount deposited in the Vault
* @dev This function can be called during a migration only. It is guaranteed to fail otherwise.
* @param newAmount The total amount deposited in the old Vault
*/
function setTotalDepositedAmount (uint256 newAmount) public onlyOwner {
require(newAmount > 0, "Non-zero amount required");
uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
require(currentBalance == 0, "Deposits already available");
// State changes
_records[currentPeriod].totalDeposited = newAmount;
}
/**
* @notice Deposits funds in the vault. The caller gets the respective amount of receipt tokens in exchange for their deposit.
* @dev The number of receipt tokens is calculated based on the current token price.
* @param depositAmount Specifies the deposit amount
*/
function deposit (uint256 depositAmount) public ifNotReentrantDeposit {
// Make sure the deposit amount falls within the expected range
require(depositAmount >= minDepositAmount, "Minimum deposit amount not met");
// Wake up the reentrancy guard
_reentrancyMutexForDeposits = 1;
// Refresh the current timelime, if needed
compute();
// Make sure the sender can cover the deposit (aka: has enough USDC/ERC20 on their wallet)
require(underlyingTokenInterface.balanceOf(msg.sender) >= depositAmount, "Insufficient funds");
// Make sure the user approved this contract to spend the amount specified
require(underlyingTokenInterface.allowance(msg.sender, address(this)) >= depositAmount, "Insufficient allowance");
// Determine how many tokens can be issued/minted to the destination address
uint256 numberOfReceiptTokens = depositAmount * USDF_DECIMAL_MULTIPLIER / _records[currentPeriod].tokenPrice;
// Make sure we can issue the number of tokens specified, per limits
require(_receiptToken.canMint(numberOfReceiptTokens), "Token supply limit exceeded");
_records[currentPeriod].totalDeposited += depositAmount;
// Get the current balance of this contract in USDC (or whatever the ERC20 is, which defined at deployment time)
uint256 balanceBeforeTransfer = underlyingTokenInterface.balanceOf(address(this));
// Make sure the ERC20 transfer succeeded
require(underlyingTokenInterface.transferFrom(msg.sender, address(this), depositAmount), "Token transfer failed");
// The new balance of this contract, after the transfer
uint256 newBalance = underlyingTokenInterface.balanceOf(address(this));
// At the very least, the new balance should be the previous balance + the deposit.
require(newBalance == balanceBeforeTransfer + depositAmount, "Balance verification failed");
// Issue/mint the respective number of tokens. Users get a receipt token in exchange for their deposit in USDC/ERC20.
_receiptToken.mint(msg.sender, numberOfReceiptTokens);
// Emit a new "deposit" event
emit OnVaultDeposit(address(underlyingTokenInterface), msg.sender, depositAmount, numberOfReceiptTokens);
// Reset the reentrancy guard
_reentrancyMutexForDeposits = 0;
}
/**
* @notice Withdraws a specific amount of tokens from the Vault.
* @param receiptTokenAmount The number of tokens to withdraw from the vault
*/
function withdraw (uint256 receiptTokenAmount) public ifNotReentrantWithdrawal {
// Checks
require(receiptTokenAmount > 0, "Invalid withdrawal amount");
// Wake up the reentrancy guard
_reentrancyMutexForWithdrawals = 1;
// Refresh the current timelime, if needed
compute();
// Make sure the sender has enough receipt tokens to burn
require(_receiptToken.balanceOf(msg.sender) >= receiptTokenAmount, "Insufficient balance of tokens");
// The amount of USDC you get in exchange, at the current token price
uint256 withdrawalAmount = toErc20Amount(receiptTokenAmount);
require(withdrawalAmount <= _records[currentPeriod].totalDeposited, "Invalid withdrawal amount");
uint256 maxWithdrawalAmount = _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);
require(withdrawalAmount <= maxWithdrawalAmount, "Max withdrawal amount exceeded");
uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
require(currentBalance >= withdrawalAmount, "Insufficient funds in the buffer");
// Notice that the fee is applied in the underlying currency instead of receipt tokens.
// The amount applicable to the fee
uint256 feeAmount = (flatFeePercent > 0) ? withdrawalAmount * flatFeePercent / uint256(100) / _decimalsMultiplier : 0;
require(feeAmount < withdrawalAmount, "Invalid fee");
// The amount to send to the destination address (recipient), after applying the fee
uint256 withdrawalAmountAfterFees = withdrawalAmount - feeAmount;
// Update the record per amount withdrawn, with no applicable fees.
// A common mistake would be update the metric below with fees included. DONT DO THAT.
_records[currentPeriod].totalDeposited -= withdrawalAmount;
// Burn the number of receipt tokens specified
_receiptToken.burn(msg.sender, receiptTokenAmount);
// Transfer the respective amount of underlying tokens to the sender (after applying the fee)
require(underlyingTokenInterface.transfer(msg.sender, withdrawalAmountAfterFees), "Token transfer failed");
if (feeAmount > 0) {
// Transfer the applicable fee, if any
require(underlyingTokenInterface.transfer(feesAddress, feeAmount), "Fee transfer failed");
}
// Emit a new "withdrawal" event
emit OnVaultWithdrawal(address(underlyingTokenInterface), msg.sender, withdrawalAmount, receiptTokenAmount, feeAmount);
// Reset the reentrancy guard
_reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
}
/**
* @notice Runs an emergency withdrawal. Sends the whole balance to the address specified.
* @dev This function can be called by the owner only.
* @param destinationAddr The destination address
*/
function emergencyWithdraw (address destinationAddr) public onlyOwner ifNotReentrantWithdrawal {
require(destinationAddr != address(0) && destinationAddr != address(this), "Invalid address");
// Wake up the reentrancy guard
_reentrancyMutexForWithdrawals = 1;
uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
require(currentBalance > 0, "The vault has no funds");
// Transfer all funds to the address specified
require(underlyingTokenInterface.transfer(destinationAddr, currentBalance), "Token transfer failed");
emit OnEmergencyWithdraw(currentBalance);
// Reset the reentrancy guard
_reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
}
/**
* @notice Updates the APR
* @dev The APR must be expressed with 2 decimal places. Example: 5% = 500 whereas 5.75% = 575
* @param newApr The new APR, expressed with 2 decimal places.
*/
function changeApr (uint256 newApr) public onlyOwner {
require(newApr > 0, "Invalid APR");
compute();
emit OnAprChanged(_records[currentPeriod].apr, newApr);
_records[currentPeriod].apr = newApr;
}
/**
* @notice Sets the token price, arbitrarily.
* @param newTokenPrice The new price of the receipt token
*/
function setTokenPrice (uint256 newTokenPrice) public onlyOwner {
require(newTokenPrice > 0, "Invalid token price");
compute();
emit OnTokenPriceChanged(_records[currentPeriod].tokenPrice, newTokenPrice);
_records[currentPeriod].tokenPrice = newTokenPrice;
}
/**
* @notice Sets the investment percent.
* @param newPercent The new investment percent
*/
function setInvestmentPercent (uint8 newPercent) public onlyOwnerOrController {
require(newPercent > 0 && newPercent < 100, "Invalid investment percent");
emit OnInvestmentPercentChanged(investmentPercent, newPercent);
investmentPercent = newPercent;
}
/**
* @notice Computes the metrics (token price, daily interest) for the current day of year
*/
function compute () public {
uint256 currentTimestamp = block.timestamp; // solhint-disable-line not-rely-on-time
uint256 newPeriod = DateUtils.diffDays(startOfYearTimestamp, currentTimestamp);
if (newPeriod <= currentPeriod) return;
uint256 x = 0;
for (uint256 i = currentPeriod + 1; i <= newPeriod; i++) {
x++;
_records[i].apr = _records[i - 1].apr;
_records[i].totalDeposited = _records[i - 1].totalDeposited;
uint256 diff = _records[i - 1].apr * USDF_DECIMAL_MULTIPLIER * uint256(100) / uint256(36500);
_records[i].tokenPrice = _records[i - 1].tokenPrice + (diff / uint256(10000));
_records[i].dailyInterest = _records[i - 1].totalDeposited * uint256(_records[i - 1].apr) / uint256(3650000);
if (x >= 30) break;
}
currentPeriod += x;
}
/**
* @notice Moves the deployable capital from the vault to the yield reserve.
* @dev This function should fail if it would cause the vault to be left with <10% of deposited amount
*/
function lockCapital () public onlyOwnerOrController ifNotReentrantWithdrawal {
// Wake up the reentrancy guard
_reentrancyMutexForWithdrawals = 1;
compute();
// Get the maximum amount of capital that can be deployed at this point in time
uint256 maxDeployableAmount = getDeployableCapital();
require(maxDeployableAmount > 0, "No capital to deploy");
require(underlyingTokenInterface.transfer(yieldReserveAddress, maxDeployableAmount), "Transfer failed");
emit OnCapitalLocked(maxDeployableAmount);
// Reset the reentrancy guard
_reentrancyMutexForWithdrawals = 0; // solhint-disable-line reentrancy
}
/**
* @notice Claims the daily interest promised per APR.
*/
function claimDailyInterest () public onlyOwnerOrController {
compute();
// Get the daily interest that need to be claimed at this point in time
uint256 dailyInterestAmount = getDailyInterest();
uint256 balanceBefore = underlyingTokenInterface.balanceOf(address(this));
IDeployable(yieldReserveAddress).claim(dailyInterestAmount);
uint256 balanceAfter = underlyingTokenInterface.balanceOf(address(this));
require(balanceAfter >= balanceBefore + dailyInterestAmount, "Balance verification failed");
emit OnInterestClaimed(dailyInterestAmount);
}
/**
* @notice Gets the period of the current unix epoch.
* @dev The period is the zero-based day of the current year. It is the number of days that elapsed since January 1st of the current year.
* @return Returns a number between [0..364]
*/
function getPeriodOfCurrentEpoch () public view returns (uint256) {
return DateUtils.diffDays(startOfYearTimestamp, block.timestamp); // solhint-disable-line not-rely-on-time
}
function getSnapshot (uint256 i) public view returns (uint256 apr, uint256 tokenPrice, uint256 totalDeposited, uint256 dailyInterest) {
apr = _records[i].apr;
tokenPrice = _records[i].tokenPrice;
totalDeposited = _records[i].totalDeposited;
dailyInterest = _records[i].dailyInterest;
}
/**
* @notice Gets the total amount deposited in the vault.
* @dev This value increases when people deposits funds in the vault. Likewise, it decreases when people withdraw from the vault.
* @return The total amount deposited in the vault.
*/
function getTotalDeposited () public view returns (uint256) {
return _records[currentPeriod].totalDeposited;
}
/**
* @notice Gets the daily interest
* @return The daily interest
*/
function getDailyInterest () public view returns (uint256) {
return _records[currentPeriod].dailyInterest;
}
/**
* @notice Gets the current token price
* @return The price of the token
*/
function getTokenPrice () public view returns (uint256) {
return _records[currentPeriod].tokenPrice;
}
/**
* @notice Gets the maximum amount of USDC/ERC20 you can withdraw from the vault
* @return The maximum withdrawal amount
*/
function getMaxWithdrawalAmount () public view returns (uint256) {
return _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);
}
/**
* @notice Gets the amount of capital that can be deployed.
* @dev This is the amount of capital that will be moved from the Vault to the Yield Reserve.
* @return The amount of deployable capital
*/
function getDeployableCapital () public view returns (uint256) {
// X% of the total deposits should remain in the vault. This is the target vault balance.
//
// For example:
// ------------
// If the total deposits are 800k USDC and the investment percent is set to 90%
// then the vault should keep the remaining 10% as a buffer for withdrawals.
// In this example the vault should keep 80k USDC, which is the 10% of 800k USDC.
uint256 shouldRemainInVault = _records[currentPeriod].totalDeposited * (uint256(100) - uint256(investmentPercent)) / uint256(100);
// The current balance at the Vault
uint256 currentBalance = underlyingTokenInterface.balanceOf(address(this));
// Return the amount of deployable capital
return (currentBalance > shouldRemainInVault) ? currentBalance - shouldRemainInVault : 0;
}
/**
* @notice Returns the amount of USDC you would get by burning the number of receipt tokens specified, at the current price.
* @return The amount of USDC you get in exchange, at the current token price
*/
function toErc20Amount (uint256 receiptTokenAmount) public view returns (uint256) {
return receiptTokenAmount * _records[currentPeriod].tokenPrice / USDF_DECIMAL_MULTIPLIER;
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"ownerAddr","type":"address"},{"internalType":"address","name":"controllerAddr","type":"address"},{"internalType":"contract ReceiptToken","name":"receiptTokenInterface","type":"address"},{"internalType":"contract IERC20","name":"eip20Interface","type":"address"},{"internalType":"uint256","name":"initialApr","type":"uint256"},{"internalType":"uint256","name":"initialTokenPrice","type":"uint256"},{"internalType":"uint256","name":"initialMinDepositAmount","type":"uint256"},{"internalType":"uint256","name":"flatFeePerc","type":"uint256"},{"internalType":"address","name":"feesAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevApr","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newApr","type":"uint256"}],"name":"OnAprChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountLocked","type":"uint256"}],"name":"OnCapitalLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnControllerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalAmount","type":"uint256"}],"name":"OnEmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnFeesAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"OnFlatWithdrawalFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"interestAmount","type":"uint256"}],"name":"OnInterestClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"prevValue","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newValue","type":"uint8"}],"name":"OnInvestmentPercentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevTokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"OnTokenPriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"fromAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"}],"name":"OnVaultDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"address","name":"toAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"erc20Amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"receiptTokensAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"OnVaultWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"prevAddress","type":"address"},{"indexed":false,"internalType":"address","name":"newAddress","type":"address"}],"name":"OnYieldReserveAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"uint256","name":"newApr","type":"uint256"}],"name":"changeApr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimDailyInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controllerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destinationAddr","type":"address"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feesAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flatFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDailyInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDeployableCapital","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxWithdrawalAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriodOfCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"i","type":"uint256"}],"name":"getSnapshot","outputs":[{"internalType":"uint256","name":"apr","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"dailyInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investmentPercent","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockCapital","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minDepositAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"controllerAddr","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeeWithMultiplier","type":"uint256"}],"name":"setFlatWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newPercent","type":"uint8"}],"name":"setInvestmentPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"}],"name":"setMinDepositAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTokenPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"setTotalDepositedAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setYieldReserveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startOfYearTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"toErc20Amount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"underlyingTokenInterface","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"receiptTokenAmount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldReserveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60e06040526006805460ff1916605a1790553480156200001e57600080fd5b5060405162003e9138038062003e918339810160408190526200004191620008ad565b8888816001600160a01b038116620000a05760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f20616464726573732072657175697265640000000000000060448201526064015b60405180910390fd5b6001600160a01b03811660011415620000fc5760405162461bcd60e51b815260206004820152601d60248201527f65637265636f7665722061646472657373206e6f7420616c6c6f776564000000604482015260640162000097565b600080546001600160a01b0319166001600160a01b03831690811782556040805192835260208301919091527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1506001600160a01b038116620001ac5760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c657220616464726573732072657175697265640000000000604482015260640162000097565b816001600160a01b0316816001600160a01b03161415620002105760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c65720000604482015260640162000097565b600180546001600160a01b0319166001600160a01b03929092169190911790555082620002805760405162461bcd60e51b815260206004820152601a60248201527f496e76616c6964206d696e206465706f73697420616d6f756e74000000000000604482015260640162000097565b6001600160a01b038116620002d85760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f7220666565730000000000000000604482015260640162000097565b6001600160601b0319606087811b821660a05288901b1660c05260048381556040805163313ce56760e01b815290516001600160a01b0389169263313ce56792808201926020929091829003018186803b1580156200033657600080fd5b505afa1580156200034b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000371919062000954565b620003819060ff16600a62000a71565b6080524260006200039e8262000460602090811b620027aa17901c565b9050620003be8160018060008060006200048460201b620027ca1760201c565b600281905550620003dd60025483620004ee60201b620028261760201c565b600381815560408051608081018252998a526020808b01998a5260008b830181815260608d0182815295825260089092529190912099518a55975160018a015596516002890155519690950195909555600591909155600780546001600160a01b0319166001600160a01b039092169190911790555062000cae95505050505050565b60006200047b62000475620151808462000a0d565b62000565565b50909392505050565b60008162000494603c8562000be8565b620004a2610e108762000be8565b62015180620004b38b8b8b62000711565b620004bf919062000be8565b620004cb9190620009be565b620004d79190620009be565b620004e39190620009be565b979650505050505050565b600081831115620005425760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d707300000000604482015260640162000097565b6201518062000552848462000c4f565b6200055e919062000a0d565b9392505050565b60008080838162253d8c6200057e8362010bd962000977565b6200058a919062000977565b9050600062023ab16200059f83600462000b59565b620005ab9190620009d9565b90506004620005be8262023ab162000b59565b620005cb90600362000977565b620005d79190620009d9565b620005e3908362000c0a565b9150600062164b09620005f884600162000977565b6200060690610fa062000b59565b620006129190620009d9565b9050600462000624826105b562000b59565b620006309190620009d9565b6200063c908462000c0a565b6200064990601f62000977565b9250600061098f6200065d85605062000b59565b620006699190620009d9565b9050600060506200067d8361098f62000b59565b620006899190620009d9565b62000695908662000c0a565b9050620006a4600b83620009d9565b9450620006b385600c62000b59565b620006c083600262000977565b620006cc919062000c0a565b91508483620006dd60318762000c0a565b620006ea90606462000b59565b620006f6919062000977565b62000702919062000977565b9a919950975095505050505050565b60006107b28410156200074f5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b604482015260640162000097565b838383600062253d8c60046064600c6200076b600e8862000c0a565b620007779190620009d9565b620007858861132462000977565b62000791919062000977565b6200079d9190620009d9565b620007aa90600362000b59565b620007b69190620009d9565b600c80620007c6600e8862000c0a565b620007d29190620009d9565b620007df90600c62000b59565b620007ec60028862000c0a565b620007f8919062000c0a565b620008069061016f62000b59565b620008129190620009d9565b6004600c62000823600e8962000c0a565b6200082f9190620009d9565b6200083d896112c062000977565b62000849919062000977565b62000857906105b562000b59565b620008639190620009d9565b62000871617d4b8762000c0a565b6200087d919062000977565b62000889919062000977565b62000895919062000c0a565b620008a1919062000c0a565b98975050505050505050565b60008060008060008060008060006101208a8c031215620008cc578485fd5b8951620008d98162000c95565b60208b0151909950620008ec8162000c95565b60408b0151909850620008ff8162000c95565b60608b0151909750620009128162000c95565b8096505060808a0151945060a08a0151935060c08a0151925060e08a015191506101008a0151620009438162000c95565b809150509295985092959850929598565b60006020828403121562000966578081fd5b815160ff811681146200055e578182fd5b600080821280156001600160ff1b03849003851316156200099c576200099c62000c69565b600160ff1b8390038412811615620009b857620009b862000c69565b50500190565b60008219821115620009d457620009d462000c69565b500190565b600082620009eb57620009eb62000c7f565b600160ff1b82146000198414161562000a085762000a0862000c69565b500590565b60008262000a1f5762000a1f62000c7f565b500490565b80825b600180861162000a38575062000a68565b81870482111562000a4d5762000a4d62000c69565b8086161562000a5b57918102915b9490941c93800262000a27565b94509492505050565b60006200055e600019848460008262000a8d575060016200055e565b8162000a9c575060006200055e565b816001811462000ab5576002811462000ac05762000af4565b60019150506200055e565b60ff84111562000ad45762000ad462000c69565b6001841b91508482111562000aed5762000aed62000c69565b506200055e565b5060208310610133831016604e8410600b841016171562000b2c575081810a8381111562000b265762000b2662000c69565b6200055e565b62000b3b848484600162000a24565b80860482111562000b505762000b5062000c69565b02949350505050565b60006001600160ff1b038184138284138082168684048611161562000b825762000b8262000c69565b600160ff1b8487128281168783058912161562000ba35762000ba362000c69565b85871292508782058712848416161562000bc15762000bc162000c69565b8785058712818416161562000bda5762000bda62000c69565b505050929093029392505050565b600081600019048311821515161562000c055762000c0562000c69565b500290565b60008083128015600160ff1b85018412161562000c2b5762000c2b62000c69565b6001600160ff1b038401831381161562000c495762000c4962000c69565b50500390565b60008282101562000c645762000c6462000c69565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b6001600160a01b038116811462000cab57600080fd5b50565b60805160a05160601c60c05160601c61312162000d7060003960008181610b2501528181610ecd01528181612037015261239d0152600081816102bd01528181610536015281816108f001528181610d0c01528181610f4b0152818161101c015281816110ea015281816114e5015281816115d001528181611c7c01528181611e3e01528181611f2001528181612146015281816121ed015281816122a50152818161240d01528181612509015261260001526000610df401526131216000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80636a61e5fc1161011a57806392eefe9b116100ad578063b68ef5591161007c578063b68ef55914610481578063b6b55f251461049b578063bced9117146104ae578063f2fde38b146104b6578063f36932b7146104c957610206565b806392eefe9b146104405780639c256eef146104535780639ce7f67014610466578063addf8f211461046e57610206565b80638da5cb5b116100e95780638da5cb5b146103f4578063919cfa211461040757806391dd75e71461041a578063922f21231461042d57610206565b80636a61e5fc146103655780636ff1c9bc1461037857806376f10ad01461038b5780638705fcd4146103e157610206565b806331cbd1481161019d5780634b24ea471161016c5780634b24ea47146103095780634b94f50e1461031c5780635798ef311461033657806357e0bf9414610349578063645006ca1461035c57610206565b806331cbd148146102b85780633a621d37146102df57806342c9b1d9146102e75780634378f0ec146102f057610206565b8063292bbd32116101d9578063292bbd32146102585780632a40eb721461028a5780632a80cda3146102925780632e1a7d4d146102a557610206565b80630301310b1461020b578063060406181461022f57806308b4a994146102465780631a43c3381461024e575b600080fd5b6006546102189060ff1681565b60405160ff90911681526020015b60405180910390f35b61023860035481565b604051908152602001610226565b6102386104d2565b6102566105d1565b005b60065461027290630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102566107e2565b6102566102a0366004612cdf565b6109ec565b6102566102b3366004612cdf565b610a80565b6102727f000000000000000000000000000000000000000000000000000000000000000081565b610238611167565b61023860025481565b6003805460009081526008602052604090200154610238565b600154610272906001600160a01b031681565b600354600090815260086020526040902060010154610238565b610256610344366004612c98565b61117a565b610238610357366004612cdf565b6112e7565b61023860045481565b610256610373366004612cdf565b611324565b610256610386366004612c98565b611402565b6103c1610399366004612cdf565b6000908152600860205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610226565b6102566103ef366004612c98565b6116ab565b600054610272906001600160a01b031681565b610256610415366004612cdf565b6117c5565b600754610272906001600160a01b031681565b61025661043b366004612cdf565b611845565b61025661044e366004612c98565b611915565b610256610461366004612d0f565b611ab3565b610238611bab565b61025661047c366004612cdf565b611bea565b600354600090815260086020526040902060020154610238565b6102566104a9366004612cdf565b611d66565b610256612483565b6102566104c4366004612c98565b612716565b61023860055481565b60065460009081906064906104ea9060ff168261308d565b600354600090815260086020526040902060020154610509919061302f565b6105139190612e84565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612cf7565b90508181116105c05760006105ca565b6105ca828261308d565b9250505090565b600042905060006105e460025483612826565b905060035481116105f65750506107e0565b60008060035460016106089190612e3e565b90505b8281116107c4578161061c816130a4565b925060089050600061062f60018461308d565b815260208082019290925260409081016000908120548482526008938490529181209190915561066060018461308d565b81526020019081526020016000206002015460086000838152602001908152602001600020600201819055506000618e9460646006600a6106a19190612ede565b600860006106b060018861308d565b8152602001908152602001600020600001546106cc919061302f565b6106d6919061302f565b6106e09190612e84565b90506106ee61271082612e84565b600860006106fd60018661308d565b8152602001908152602001600020600101546107199190612e3e565b60086000848152602001908152602001600020600101819055506237b1d060086000600185610748919061308d565b8152602001908152602001600020600001546008600060018661076b919061308d565b815260200190815260200160002060020154610787919061302f565b6107919190612e84565b600083815260086020526040902060030155601e83106107b157506107c4565b50806107bc816130a4565b91505061060b565b5080600360008282546107d79190612e3e565b90915550505050505b565b6001546001600160a01b031633148061080557506000546001600160a01b031633145b61082a5760405162461bcd60e51b815260040161082190612dc6565b60405180910390fd5b60065462010000900460ff16156108535760405162461bcd60e51b815260040161082190612d30565b6006805462ff000019166201000017905561086c6105d1565b60006108766104d2565b9050600081116108bf5760405162461bcd60e51b81526020600482015260146024820152734e6f206361706974616c20746f206465706c6f7960601b6044820152606401610821565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c9190612cbf565b6109aa5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610821565b6040518181527fa0c74edaedd64a934c208860c6fabae3e8a26c05dea32da0d43af5c0d6eff2559060200160405180910390a1506006805462ff000019169055565b6001546001600160a01b0316331480610a0f57506000546001600160a01b031633145b610a2b5760405162461bcd60e51b815260040161082190612dc6565b60008111610a7b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e7400006044820152606401610821565b600455565b60065462010000900460ff1615610aa95760405162461bcd60e51b815260040161082190612d30565b60008111610af55760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b6006805462ff0000191662010000179055610b0e6105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610b6f57600080fd5b505afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190612cf7565b1015610bf55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e7300006044820152606401610821565b6000610c00826112e7565b600354600090815260086020526040902060020154909150811115610c635760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b600654600090606490610c799060ff168261308d565b600354600090815260086020526040902060020154610c98919061302f565b610ca29190612e84565b905080821115610cf45760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e7420657863656564656400006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612cf7565b905082811015610de05760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e20746865206275666665726044820152606401610821565b60008060055411610df2576000610e37565b7f0000000000000000000000000000000000000000000000000000000000000000606460055486610e23919061302f565b610e2d9190612e84565b610e379190612e84565b9050838110610e765760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610821565b6000610e82828661308d565b9050846008600060035481526020019081526020016000206002016000828254610eac919061308d565b9091555050604051632770a7eb60e21b8152336004820152602481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316925063a9059cbb9150604401602060405180830381600087803b158015610f9957600080fd5b505af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612cbf565b610fed5760405162461bcd60e51b815260040161082190612d67565b81156110dc5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb90604401602060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190612cbf565b6110dc5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610821565b604080516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016815233602082015290810186905260608101879052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff00001916905550505050565b600061117560025442612826565b905090565b6001546001600160a01b031633148061119d57506000546001600160a01b031633145b6111b95760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b038116158015906111da57506001600160a01b0381163014155b6112185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b61122181612897565b61126d5760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e747261637400006044820152606401610821565b600654604080516001600160a01b0363010000009093048316815291831660208301527f0aebc9026561f275e982d855dff9cf49033009d9f31ba8acc0b619ce6b5b2e4b910160405180910390a1600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60006112f56006600a612ede565b600354600090815260086020526040902060010154611314908461302f565b61131e9190612e84565b92915050565b6000546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082190612d96565b600081116113945760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b6044820152606401610821565b61139c6105d1565b6003546000908152600860209081526040918290206001015482519081529081018390527f1107a79eab721b565f7d6a0bd7847e7021dd0f721c65eadc1d6c35eb08dbc0ed910160405180910390a1600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161082190612d96565b60065462010000900460ff16156114555760405162461bcd60e51b815260040161082190612d30565b6001600160a01b0381161580159061147657506001600160a01b0381163014155b6114b45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612cf7565b9050600081116115aa5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b6044820152606401610821565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561161457600080fd5b505af1158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190612cbf565b6116685760405162461bcd60e51b815260040161082190612d67565b6040518181527f55abaad61a326c0cc8618401ad343a21179b6f621dc9247617973a61b0d81d1e9060200160405180910390a150506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f72206665657300000000000000006044820152606401610821565b600754604080516001600160a01b03928316815291831660208301527f3b4be58da14251f504968b7257dff9b9c1ecb07ac50130d7a4bf5533acf20d23910160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117e857506000546001600160a01b031633145b6118045760405162461bcd60e51b815260040161082190612dc6565b60055460408051918252602082018390527f120fd6c83629ae96124876a9b5b025e47fb83d42972ca449a5a3405dbccfb986910160405180910390a1600555565b6000546001600160a01b0316331461186f5760405162461bcd60e51b815260040161082190612d96565b600081116118ad5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b6044820152606401610821565b6118b56105d1565b6003546000908152600860209081526040918290205482519081529081018390527fc827555e5522aeda7e894c1d924063a0e0cb6e782418a59fcd72c6c23cbac06b910160405180910390a1600354600090815260086020526040902055565b6000546001600160a01b0316331461193f5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166119955760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c6572206164647265737320726571756972656400000000006044820152606401610821565b6000546001600160a01b03828116911614156119f35760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c657200006044820152606401610821565b6001546001600160a01b0382811691161415611a4a5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b6044820152606401610821565b600154604080516001600160a01b03928316815291831660208301527f3df96927933b869a51e4444ecd13bc819f0a1396ef6b6c3af44369afcb3e05b1910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331480611ad657506000546001600160a01b031633145b611af25760405162461bcd60e51b815260040161082190612dc6565b60008160ff16118015611b08575060648160ff16105b611b545760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e740000000000006044820152606401610821565b6006546040805160ff928316815291831660208301527ff6a34f02b83ccdde55c05d6d6e72262bae32f03d30abd8168b5a10f367967696910160405180910390a16006805460ff191660ff92909216919091179055565b600654600090606490611bc19060ff168261308d565b600354600090815260086020526040902060020154611be0919061302f565b6111759190612e84565b6000546001600160a01b03163314611c145760405162461bcd60e51b815260040161082190612d96565b60008111611c645760405162461bcd60e51b815260206004820152601860248201527f4e6f6e2d7a65726f20616d6f756e7420726571756972656400000000000000006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612cf7565b90508015611d4e5760405162461bcd60e51b815260206004820152601a60248201527f4465706f7369747320616c726561647920617661696c61626c650000000000006044820152606401610821565b50600354600090815260086020526040902060020155565b600654610100900460ff1615611dbe5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a65637465640000000000006044820152606401610821565b600454811015611e105760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d657400006044820152606401610821565b6006805461ff001916610100179055611e276105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec09190612cf7565b1015611f035760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610821565b604051636eb1769f60e11b815233600482015230602482015281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa29190612cf7565b1015611fe95760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610821565b60035460009081526008602052604081206001015461200a6006600a612ede565b612014908461302f565b61201e9190612e84565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635dd871a39060240160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190612cbf565b6121055760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d697420657863656564656400000000006044820152606401610821565b60035460009081526008602052604081206002018054849290612129908490612e3e565b90915550506040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190612cf7565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561223957600080fd5b505af115801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190612cbf565b61228d5760405162461bcd60e51b815260040161082190612d67565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b1580156122ef57600080fd5b505afa158015612303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123279190612cf7565b90506123338483612e3e565b81146123815760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b5050604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152336020820152908101879052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff00191690555050565b6001546001600160a01b03163314806124a657506000546001600160a01b031633145b6124c25760405162461bcd60e51b815260040161082190612dc6565b6124ca6105d1565b60006124e6600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319060240160206040518083038186803b15801561254b57600080fd5b505afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125839190612cf7565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b1580156125d157600080fd5b505af11580156125e5573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a082319060240160206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126839190612cf7565b905061268f8383612e3e565b8110156126de5760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040518381527f652ad68d3e623a25d824203054acc050881d6da7ad6deb10e684f1aa1ca719aa9060200160405180910390a1505050565b6000546001600160a01b031633146127405760405162461bcd60e51b815260040161082190612d96565b6001546001600160a01b038281169116141561279e5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f20636f6e74726f6c6c65720000006044820152606401610821565b6127a7816128d3565b50565b60006127c16127bc6201518084612e84565b6129bc565b50909392505050565b6000816127d8603c8561302f565b6127e4610e108761302f565b620151806127f38b8b8b612b30565b6127fd919061302f565b6128079190612e3e565b6128119190612e3e565b61281b9190612e3e565b979650505050505050565b6000818311156128785760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d7073000000006044820152606401610821565b62015180612886848461308d565b6128909190612e84565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f8082148015906128cb57508015155b949350505050565b6000546001600160a01b031633146128fd5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f2061646472657373207265717569726564000000000000006044820152606401610821565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008080838162253d8c6129d38362010bd9612dfd565b6129dd9190612dfd565b9050600062023ab16129f0836004612fac565b6129fa9190612e56565b90506004612a0b8262023ab1612fac565b612a16906003612dfd565b612a209190612e56565b612a2a908361304e565b9150600062164b09612a3d846001612dfd565b612a4990610fa0612fac565b612a539190612e56565b90506004612a63826105b5612fac565b612a6d9190612e56565b612a77908461304e565b612a8290601f612dfd565b9250600061098f612a94856050612fac565b612a9e9190612e56565b905060006050612ab08361098f612fac565b612aba9190612e56565b612ac4908661304e565b9050612ad1600b83612e56565b9450612ade85600c612fac565b612ae9836002612dfd565b612af3919061304e565b91508483612b0260318761304e565b612b0d906064612fac565b612b179190612dfd565b612b219190612dfd565b9a919950975095505050505050565b60006107b2841015612b6c5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b6044820152606401610821565b838383600062253d8c60046064600c612b86600e8861304e565b612b909190612e56565b612b9c88611324612dfd565b612ba69190612dfd565b612bb09190612e56565b612bbb906003612fac565b612bc59190612e56565b600c80612bd3600e8861304e565b612bdd9190612e56565b612be890600c612fac565b612bf360028861304e565b612bfd919061304e565b612c099061016f612fac565b612c139190612e56565b6004600c612c22600e8961304e565b612c2c9190612e56565b612c38896112c0612dfd565b612c429190612dfd565b612c4e906105b5612fac565b612c589190612e56565b612c64617d4b8761304e565b612c6e9190612dfd565b612c789190612dfd565b612c82919061304e565b612c8c919061304e565b98975050505050505050565b600060208284031215612ca9578081fd5b81356001600160a01b0381168114612890578182fd5b600060208284031215612cd0578081fd5b81518015158114612890578182fd5b600060208284031215612cf0578081fd5b5035919050565b600060208284031215612d08578081fd5b5051919050565b600060208284031215612d20578081fd5b813560ff81168114612890578182fd5b6020808252601d908201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604082015260600190565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612e1f57612e1f6130bf565b600160ff1b8390038412811615612e3857612e386130bf565b50500190565b60008219821115612e5157612e516130bf565b500190565b600082612e6557612e656130d5565b600160ff1b821460001984141615612e7f57612e7f6130bf565b500590565b600082612e9357612e936130d5565b500490565b80825b6001808611612eaa5750612ed5565b818704821115612ebc57612ebc6130bf565b80861615612ec957918102915b9490941c938002612e9b565b94509492505050565b60006128906000198484600082612ef757506001612890565b81612f0457506000612890565b8160018114612f1a5760028114612f2457612f51565b6001915050612890565b60ff841115612f3557612f356130bf565b6001841b915084821115612f4b57612f4b6130bf565b50612890565b5060208310610133831016604e8410600b8410161715612f84575081810a83811115612f7f57612f7f6130bf565b612890565b612f918484846001612e98565b808604821115612fa357612fa36130bf565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612fd257612fd26130bf565b600160ff1b84871282811687830589121615612ff057612ff06130bf565b85871292508782058712848416161561300b5761300b6130bf565b87850587128184161615613021576130216130bf565b505050929093029392505050565b6000816000190483118215151615613049576130496130bf565b500290565b60008083128015600160ff1b85018412161561306c5761306c6130bf565b6001600160ff1b0384018313811615613087576130876130bf565b50500390565b60008282101561309f5761309f6130bf565b500390565b60006000198214156130b8576130b86130bf565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea264697066735822122057c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e64736f6c63430008030033000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed680000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff4487200000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000fc61f00000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c80636a61e5fc1161011a57806392eefe9b116100ad578063b68ef5591161007c578063b68ef55914610481578063b6b55f251461049b578063bced9117146104ae578063f2fde38b146104b6578063f36932b7146104c957610206565b806392eefe9b146104405780639c256eef146104535780639ce7f67014610466578063addf8f211461046e57610206565b80638da5cb5b116100e95780638da5cb5b146103f4578063919cfa211461040757806391dd75e71461041a578063922f21231461042d57610206565b80636a61e5fc146103655780636ff1c9bc1461037857806376f10ad01461038b5780638705fcd4146103e157610206565b806331cbd1481161019d5780634b24ea471161016c5780634b24ea47146103095780634b94f50e1461031c5780635798ef311461033657806357e0bf9414610349578063645006ca1461035c57610206565b806331cbd148146102b85780633a621d37146102df57806342c9b1d9146102e75780634378f0ec146102f057610206565b8063292bbd32116101d9578063292bbd32146102585780632a40eb721461028a5780632a80cda3146102925780632e1a7d4d146102a557610206565b80630301310b1461020b578063060406181461022f57806308b4a994146102465780631a43c3381461024e575b600080fd5b6006546102189060ff1681565b60405160ff90911681526020015b60405180910390f35b61023860035481565b604051908152602001610226565b6102386104d2565b6102566105d1565b005b60065461027290630100000090046001600160a01b031681565b6040516001600160a01b039091168152602001610226565b6102566107e2565b6102566102a0366004612cdf565b6109ec565b6102566102b3366004612cdf565b610a80565b6102727f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b610238611167565b61023860025481565b6003805460009081526008602052604090200154610238565b600154610272906001600160a01b031681565b600354600090815260086020526040902060010154610238565b610256610344366004612c98565b61117a565b610238610357366004612cdf565b6112e7565b61023860045481565b610256610373366004612cdf565b611324565b610256610386366004612c98565b611402565b6103c1610399366004612cdf565b6000908152600860205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610226565b6102566103ef366004612c98565b6116ab565b600054610272906001600160a01b031681565b610256610415366004612cdf565b6117c5565b600754610272906001600160a01b031681565b61025661043b366004612cdf565b611845565b61025661044e366004612c98565b611915565b610256610461366004612d0f565b611ab3565b610238611bab565b61025661047c366004612cdf565b611bea565b600354600090815260086020526040902060020154610238565b6102566104a9366004612cdf565b611d66565b610256612483565b6102566104c4366004612c98565b612716565b61023860055481565b60065460009081906064906104ea9060ff168261308d565b600354600090815260086020526040902060020154610509919061302f565b6105139190612e84565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561057857600080fd5b505afa15801561058c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b09190612cf7565b90508181116105c05760006105ca565b6105ca828261308d565b9250505090565b600042905060006105e460025483612826565b905060035481116105f65750506107e0565b60008060035460016106089190612e3e565b90505b8281116107c4578161061c816130a4565b925060089050600061062f60018461308d565b815260208082019290925260409081016000908120548482526008938490529181209190915561066060018461308d565b81526020019081526020016000206002015460086000838152602001908152602001600020600201819055506000618e9460646006600a6106a19190612ede565b600860006106b060018861308d565b8152602001908152602001600020600001546106cc919061302f565b6106d6919061302f565b6106e09190612e84565b90506106ee61271082612e84565b600860006106fd60018661308d565b8152602001908152602001600020600101546107199190612e3e565b60086000848152602001908152602001600020600101819055506237b1d060086000600185610748919061308d565b8152602001908152602001600020600001546008600060018661076b919061308d565b815260200190815260200160002060020154610787919061302f565b6107919190612e84565b600083815260086020526040902060030155601e83106107b157506107c4565b50806107bc816130a4565b91505061060b565b5080600360008282546107d79190612e3e565b90915550505050505b565b6001546001600160a01b031633148061080557506000546001600160a01b031633145b61082a5760405162461bcd60e51b815260040161082190612dc6565b60405180910390fd5b60065462010000900460ff16156108535760405162461bcd60e51b815260040161082190612d30565b6006805462ff000019166201000017905561086c6105d1565b60006108766104d2565b9050600081116108bf5760405162461bcd60e51b81526020600482015260146024820152734e6f206361706974616c20746f206465706c6f7960601b6044820152606401610821565b60065460405163a9059cbb60e01b815263010000009091046001600160a01b039081166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b15801561093457600080fd5b505af1158015610948573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096c9190612cbf565b6109aa5760405162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b6044820152606401610821565b6040518181527fa0c74edaedd64a934c208860c6fabae3e8a26c05dea32da0d43af5c0d6eff2559060200160405180910390a1506006805462ff000019169055565b6001546001600160a01b0316331480610a0f57506000546001600160a01b031633145b610a2b5760405162461bcd60e51b815260040161082190612dc6565b60008111610a7b5760405162461bcd60e51b815260206004820152601e60248201527f496e76616c6964206d696e696d756d206465706f73697420616d6f756e7400006044820152606401610821565b600455565b60065462010000900460ff1615610aa95760405162461bcd60e51b815260040161082190612d30565b60008111610af55760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b6006805462ff0000191662010000179055610b0e6105d1565b6040516370a0823160e01b815233600482015281907f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b0316906370a082319060240160206040518083038186803b158015610b6f57600080fd5b505afa158015610b83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba79190612cf7565b1015610bf55760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e742062616c616e6365206f6620746f6b656e7300006044820152606401610821565b6000610c00826112e7565b600354600090815260086020526040902060020154909150811115610c635760405162461bcd60e51b8152602060048201526019602482015278125b9d985b1a59081dda5d1a191c985dd85b08185b5bdd5b9d603a1b6044820152606401610821565b600654600090606490610c799060ff168261308d565b600354600090815260086020526040902060020154610c98919061302f565b610ca29190612e84565b905080821115610cf45760405162461bcd60e51b815260206004820152601e60248201527f4d6178207769746864726177616c20616d6f756e7420657863656564656400006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015610d5657600080fd5b505afa158015610d6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8e9190612cf7565b905082811015610de05760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e742066756e647320696e20746865206275666665726044820152606401610821565b60008060055411610df2576000610e37565b7f00000000000000000000000000000000000000000000000000000000000f4240606460055486610e23919061302f565b610e2d9190612e84565b610e379190612e84565b9050838110610e765760405162461bcd60e51b815260206004820152600b60248201526a496e76616c69642066656560a81b6044820152606401610821565b6000610e82828661308d565b9050846008600060035481526020019081526020016000206002016000828254610eac919061308d565b9091555050604051632770a7eb60e21b8152336004820152602481018790527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b031690639dc29fac90604401600060405180830381600087803b158015610f1957600080fd5b505af1158015610f2d573d6000803e3d6000fd5b505060405163a9059cbb60e01b8152336004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316925063a9059cbb9150604401602060405180830381600087803b158015610f9957600080fd5b505af1158015610fad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd19190612cbf565b610fed5760405162461bcd60e51b815260040161082190612d67565b81156110dc5760075460405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb90604401602060405180830381600087803b15801561106257600080fd5b505af1158015611076573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109a9190612cbf565b6110dc5760405162461bcd60e51b8152602060048201526013602482015272119959481d1c985b9cd9995c8819985a5b1959606a1b6044820152606401610821565b604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816815233602082015290810186905260608101879052608081018390527f297b983b359127be0bb37e151a4fec683bc9012dd4d0ac96db47cfc17019c1e49060a00160405180910390a150506006805462ff00001916905550505050565b600061117560025442612826565b905090565b6001546001600160a01b031633148061119d57506000546001600160a01b031633145b6111b95760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b038116158015906111da57506001600160a01b0381163014155b6112185760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b61122181612897565b61126d5760405162461bcd60e51b815260206004820152601e60248201527f5468652061646472657373206d757374206265206120636f6e747261637400006044820152606401610821565b600654604080516001600160a01b0363010000009093048316815291831660208301527f0aebc9026561f275e982d855dff9cf49033009d9f31ba8acc0b619ce6b5b2e4b910160405180910390a1600680546001600160a01b039092166301000000026301000000600160b81b0319909216919091179055565b60006112f56006600a612ede565b600354600090815260086020526040902060010154611314908461302f565b61131e9190612e84565b92915050565b6000546001600160a01b0316331461134e5760405162461bcd60e51b815260040161082190612d96565b600081116113945760405162461bcd60e51b8152602060048201526013602482015272496e76616c696420746f6b656e20707269636560681b6044820152606401610821565b61139c6105d1565b6003546000908152600860209081526040918290206001015482519081529081018390527f1107a79eab721b565f7d6a0bd7847e7021dd0f721c65eadc1d6c35eb08dbc0ed910160405180910390a1600354600090815260086020526040902060010155565b6000546001600160a01b0316331461142c5760405162461bcd60e51b815260040161082190612d96565b60065462010000900460ff16156114555760405162461bcd60e51b815260040161082190612d30565b6001600160a01b0381161580159061147657506001600160a01b0381163014155b6114b45760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610821565b6006805462ff00001916620100001790556040516370a0823160e01b81523060048201526000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561152757600080fd5b505afa15801561153b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155f9190612cf7565b9050600081116115aa5760405162461bcd60e51b8152602060048201526016602482015275546865207661756c7420686173206e6f2066756e647360501b6044820152606401610821565b60405163a9059cbb60e01b81526001600160a01b038381166004830152602482018390527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169063a9059cbb90604401602060405180830381600087803b15801561161457600080fd5b505af1158015611628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164c9190612cbf565b6116685760405162461bcd60e51b815260040161082190612d67565b6040518181527f55abaad61a326c0cc8618401ad343a21179b6f621dc9247617973a61b0d81d1e9060200160405180910390a150506006805462ff000019169055565b6001546001600160a01b03163314806116ce57506000546001600160a01b031633145b6116ea5760405162461bcd60e51b815260040161082190612dc6565b6001600160a01b0381161580159061171057506007546001600160a01b03828116911614155b61175c5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964206164647265737320666f72206665657300000000000000006044820152606401610821565b600754604080516001600160a01b03928316815291831660208301527f3b4be58da14251f504968b7257dff9b9c1ecb07ac50130d7a4bf5533acf20d23910160405180910390a1600780546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b03163314806117e857506000546001600160a01b031633145b6118045760405162461bcd60e51b815260040161082190612dc6565b60055460408051918252602082018390527f120fd6c83629ae96124876a9b5b025e47fb83d42972ca449a5a3405dbccfb986910160405180910390a1600555565b6000546001600160a01b0316331461186f5760405162461bcd60e51b815260040161082190612d96565b600081116118ad5760405162461bcd60e51b815260206004820152600b60248201526a24b73b30b634b21020a82960a91b6044820152606401610821565b6118b56105d1565b6003546000908152600860209081526040918290205482519081529081018390527fc827555e5522aeda7e894c1d924063a0e0cb6e782418a59fcd72c6c23cbac06b910160405180910390a1600354600090815260086020526040902055565b6000546001600160a01b0316331461193f5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166119955760405162461bcd60e51b815260206004820152601b60248201527f436f6e74726f6c6c6572206164647265737320726571756972656400000000006044820152606401610821565b6000546001600160a01b03828116911614156119f35760405162461bcd60e51b815260206004820152601e60248201527f4f776e65722063616e6e6f742062652074686520436f6e74726f6c6c657200006044820152606401610821565b6001546001600160a01b0382811691161415611a4a5760405162461bcd60e51b815260206004820152601660248201527510dbdb9d1c9bdb1b195c88185b1c9958591e481cd95d60521b6044820152606401610821565b600154604080516001600160a01b03928316815291831660208301527f3df96927933b869a51e4444ecd13bc819f0a1396ef6b6c3af44369afcb3e05b1910160405180910390a1600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b0316331480611ad657506000546001600160a01b031633145b611af25760405162461bcd60e51b815260040161082190612dc6565b60008160ff16118015611b08575060648160ff16105b611b545760405162461bcd60e51b815260206004820152601a60248201527f496e76616c696420696e766573746d656e742070657263656e740000000000006044820152606401610821565b6006546040805160ff928316815291831660208301527ff6a34f02b83ccdde55c05d6d6e72262bae32f03d30abd8168b5a10f367967696910160405180910390a16006805460ff191660ff92909216919091179055565b600654600090606490611bc19060ff168261308d565b600354600090815260086020526040902060020154611be0919061302f565b6111759190612e84565b6000546001600160a01b03163314611c145760405162461bcd60e51b815260040161082190612d96565b60008111611c645760405162461bcd60e51b815260206004820152601860248201527f4e6f6e2d7a65726f20616d6f756e7420726571756972656400000000000000006044820152606401610821565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611cc657600080fd5b505afa158015611cda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfe9190612cf7565b90508015611d4e5760405162461bcd60e51b815260206004820152601a60248201527f4465706f7369747320616c726561647920617661696c61626c650000000000006044820152606401610821565b50600354600090815260086020526040902060020155565b600654610100900460ff1615611dbe5760405162461bcd60e51b815260206004820152601a60248201527f5265656e7472616e74206465706f7369742072656a65637465640000000000006044820152606401610821565b600454811015611e105760405162461bcd60e51b815260206004820152601e60248201527f4d696e696d756d206465706f73697420616d6f756e74206e6f74206d657400006044820152606401610821565b6006805461ff001916610100179055611e276105d1565b6040516370a0823160e01b815233600482015281907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b158015611e8857600080fd5b505afa158015611e9c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec09190612cf7565b1015611f035760405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e742066756e647360701b6044820152606401610821565b604051636eb1769f60e11b815233600482015230602482015281907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03169063dd62ed3e9060440160206040518083038186803b158015611f6a57600080fd5b505afa158015611f7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fa29190612cf7565b1015611fe95760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b6044820152606401610821565b60035460009081526008602052604081206001015461200a6006600a612ede565b612014908461302f565b61201e9190612e84565b604051635dd871a360e01b8152600481018290529091507f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b031690635dd871a39060240160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120b99190612cbf565b6121055760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e20737570706c79206c696d697420657863656564656400000000006044820152606401610821565b60035460009081526008602052604081206002018054849290612129908490612e3e565b90915550506040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b15801561219057600080fd5b505afa1580156121a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121c89190612cf7565b6040516323b872dd60e01b8152336004820152306024820152604481018590529091507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906323b872dd90606401602060405180830381600087803b15801561223957600080fd5b505af115801561224d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122719190612cbf565b61228d5760405162461bcd60e51b815260040161082190612d67565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a082319060240160206040518083038186803b1580156122ef57600080fd5b505afa158015612303573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123279190612cf7565b90506123338483612e3e565b81146123815760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040516340c10f1960e01b8152336004820152602481018490527f00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa6001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156123e957600080fd5b505af11580156123fd573d6000803e3d6000fd5b5050604080516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48168152336020820152908101879052606081018690527f6c6941772efad791f0e8f0ff7e3e76b52034604c1427fc1bbda4dbd3d2570fc69250608001905060405180910390a150506006805461ff00191690555050565b6001546001600160a01b03163314806124a657506000546001600160a01b031633145b6124c25760405162461bcd60e51b815260040161082190612dc6565b6124ca6105d1565b60006124e6600380546000908152600860205260409020015490565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a082319060240160206040518083038186803b15801561254b57600080fd5b505afa15801561255f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125839190612cf7565b60065460405163379607f560e01b815260048101859052919250630100000090046001600160a01b03169063379607f590602401600060405180830381600087803b1580156125d157600080fd5b505af11580156125e5573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031691506370a082319060240160206040518083038186803b15801561264b57600080fd5b505afa15801561265f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126839190612cf7565b905061268f8383612e3e565b8110156126de5760405162461bcd60e51b815260206004820152601b60248201527f42616c616e636520766572696669636174696f6e206661696c656400000000006044820152606401610821565b6040518381527f652ad68d3e623a25d824203054acc050881d6da7ad6deb10e684f1aa1ca719aa9060200160405180910390a1505050565b6000546001600160a01b031633146127405760405162461bcd60e51b815260040161082190612d96565b6001546001600160a01b038281169116141561279e5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74207472616e7366657220746f20636f6e74726f6c6c65720000006044820152606401610821565b6127a7816128d3565b50565b60006127c16127bc6201518084612e84565b6129bc565b50909392505050565b6000816127d8603c8561302f565b6127e4610e108761302f565b620151806127f38b8b8b612b30565b6127fd919061302f565b6128079190612e3e565b6128119190612e3e565b61281b9190612e3e565b979650505050505050565b6000818311156128785760405162461bcd60e51b815260206004820152601c60248201527f496e76616c6964206f7264657220666f722074696d657374616d7073000000006044820152606401610821565b62015180612886848461308d565b6128909190612e84565b9392505050565b60007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470823f8082148015906128cb57508015155b949350505050565b6000546001600160a01b031633146128fd5760405162461bcd60e51b815260040161082190612d96565b6001600160a01b0381166129535760405162461bcd60e51b815260206004820152601960248201527f6e6f6e2d7a65726f2061646472657373207265717569726564000000000000006044820152606401610821565b600054604080516001600160a01b03928316815291831660208301527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008080838162253d8c6129d38362010bd9612dfd565b6129dd9190612dfd565b9050600062023ab16129f0836004612fac565b6129fa9190612e56565b90506004612a0b8262023ab1612fac565b612a16906003612dfd565b612a209190612e56565b612a2a908361304e565b9150600062164b09612a3d846001612dfd565b612a4990610fa0612fac565b612a539190612e56565b90506004612a63826105b5612fac565b612a6d9190612e56565b612a77908461304e565b612a8290601f612dfd565b9250600061098f612a94856050612fac565b612a9e9190612e56565b905060006050612ab08361098f612fac565b612aba9190612e56565b612ac4908661304e565b9050612ad1600b83612e56565b9450612ade85600c612fac565b612ae9836002612dfd565b612af3919061304e565b91508483612b0260318761304e565b612b0d906064612fac565b612b179190612dfd565b612b219190612dfd565b9a919950975095505050505050565b60006107b2841015612b6c5760405162461bcd60e51b815260206004820152600560248201526422b93937b960d91b6044820152606401610821565b838383600062253d8c60046064600c612b86600e8861304e565b612b909190612e56565b612b9c88611324612dfd565b612ba69190612dfd565b612bb09190612e56565b612bbb906003612fac565b612bc59190612e56565b600c80612bd3600e8861304e565b612bdd9190612e56565b612be890600c612fac565b612bf360028861304e565b612bfd919061304e565b612c099061016f612fac565b612c139190612e56565b6004600c612c22600e8961304e565b612c2c9190612e56565b612c38896112c0612dfd565b612c429190612dfd565b612c4e906105b5612fac565b612c589190612e56565b612c64617d4b8761304e565b612c6e9190612dfd565b612c789190612dfd565b612c82919061304e565b612c8c919061304e565b98975050505050505050565b600060208284031215612ca9578081fd5b81356001600160a01b0381168114612890578182fd5b600060208284031215612cd0578081fd5b81518015158114612890578182fd5b600060208284031215612cf0578081fd5b5035919050565b600060208284031215612d08578081fd5b5051919050565b600060208284031215612d20578081fd5b813560ff81168114612890578182fd5b6020808252601d908201527f5265656e7472616e74207769746864726177616c2072656a6563746564000000604082015260600190565b602080825260159082015274151bdad95b881d1c985b9cd9995c8819985a5b1959605a1b604082015260600190565b60208082526016908201527513db9b1e481bdddb995c881c995c5d5a5c995b595b9d60521b604082015260600190565b60208082526018908201527f4f6e6c79206f776e6572206f7220636f6e74726f6c6c65720000000000000000604082015260600190565b600080821280156001600160ff1b0384900385131615612e1f57612e1f6130bf565b600160ff1b8390038412811615612e3857612e386130bf565b50500190565b60008219821115612e5157612e516130bf565b500190565b600082612e6557612e656130d5565b600160ff1b821460001984141615612e7f57612e7f6130bf565b500590565b600082612e9357612e936130d5565b500490565b80825b6001808611612eaa5750612ed5565b818704821115612ebc57612ebc6130bf565b80861615612ec957918102915b9490941c938002612e9b565b94509492505050565b60006128906000198484600082612ef757506001612890565b81612f0457506000612890565b8160018114612f1a5760028114612f2457612f51565b6001915050612890565b60ff841115612f3557612f356130bf565b6001841b915084821115612f4b57612f4b6130bf565b50612890565b5060208310610133831016604e8410600b8410161715612f84575081810a83811115612f7f57612f7f6130bf565b612890565b612f918484846001612e98565b808604821115612fa357612fa36130bf565b02949350505050565b60006001600160ff1b0381841382841380821686840486111615612fd257612fd26130bf565b600160ff1b84871282811687830589121615612ff057612ff06130bf565b85871292508782058712848416161561300b5761300b6130bf565b87850587128184161615613021576130216130bf565b505050929093029392505050565b6000816000190483118215151615613049576130496130bf565b500290565b60008083128015600160ff1b85018412161561306c5761306c6130bf565b6001600160ff1b0384018313811615613087576130876130bf565b50500390565b60008282101561309f5761309f6130bf565b500390565b60006000198214156130b8576130b86130bf565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea264697066735822122057c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e64736f6c63430008030033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed680000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff4487200000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000fc61f00000000000000000000000000000000000000000000000000000000000186a000000000000000000000000000000000000000000000000000000000000186a0000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47
-----Decoded View---------------
Arg [0] : ownerAddr (address): 0xc692d583567cdA0fDE14Cd3D6136c2623202Ed68
Arg [1] : controllerAddr (address): 0x2D75aae9d4209b423DB0Cddba8649e1c9Ff44872
Arg [2] : receiptTokenInterface (address): 0x51acB1ea45c1EC2512ae4202B9076C13016dc8aA
Arg [3] : eip20Interface (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [4] : initialApr (uint256): 800
Arg [5] : initialTokenPrice (uint256): 1033759
Arg [6] : initialMinDepositAmount (uint256): 100000
Arg [7] : flatFeePerc (uint256): 100000
Arg [8] : feesAddr (address): 0xd8c48C19413727aCB62e051acE11DAf31a754C47
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 000000000000000000000000c692d583567cda0fde14cd3d6136c2623202ed68
Arg [1] : 0000000000000000000000002d75aae9d4209b423db0cddba8649e1c9ff44872
Arg [2] : 00000000000000000000000051acb1ea45c1ec2512ae4202b9076c13016dc8aa
Arg [3] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000320
Arg [5] : 00000000000000000000000000000000000000000000000000000000000fc61f
Arg [6] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [7] : 00000000000000000000000000000000000000000000000000000000000186a0
Arg [8] : 000000000000000000000000d8c48c19413727acb62e051ace11daf31a754c47
Deployed Bytecode Sourcemap
26693:23439:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28088:35;;;;;;;;;;;;17027:4:1;17015:17;;;16997:36;;16985:2;16970:18;28088:35:0;;;;;;;;27531:28;;;;;;;;;16170:25:1;;;16158:2;16143:18;27531:28:0;16125:76:1;48778:923:0;;;:::i;43988:908::-;;;:::i;:::-;;28389:34;;;;;;;;-1:-1:-1;;;;;28389:34:0;;;;;;-1:-1:-1;;;;;1479:32:1;;;1461:51;;1449:2;1434:18;28389:34:0;1416:102:1;45112:704:0;;;:::i;33890:239::-;;;;;;:::i;:::-;;:::i;38745:2774::-;;;;;;:::i;:::-;;:::i;28619:48::-;;;;;46814:190;;;:::i;27241:35::-;;;;;;47843:122;47929:13;;;47893:7;47920:23;;;:8;:23;;;;;:37;;47843:122;;18065:32;;;;;-1:-1:-1;;;;;18065:32:0;;;48075:116;48158:13;;48122:7;48149:23;;;:8;:23;;;;;:34;;;48075:116;;33333:352;;;;;;:::i;:::-;;:::i;49940:189::-;;;;;;:::i;:::-;;:::i;27651:31::-;;;;;;43154:303;;;;;;:::i;:::-;;:::i;41756:789::-;;;;;;:::i;:::-;;:::i;47012:326::-;;;;;;:::i;:::-;47066:11;47163;;;:8;:11;;;;;:15;;47202:22;;;;47252:26;;;;47305:25;;;;;47163:15;;47202:22;;47252:26;47305:25;47012:326;;;;;16690:25:1;;;16746:2;16731:18;;16724:34;;;;16774:18;;;16767:34;16832:2;16817:18;;16810:34;16677:3;16662:19;47012:326:0;16644:206:1;34935:250:0;;;;;;:::i;:::-;;:::i;136:20::-;;;;;-1:-1:-1;;;;;136:20:0;;;34409:414;;;;;;:::i;:::-;;:::i;28512:26::-;;;;;-1:-1:-1;;;;;28512:26:0;;;42771:242;;;;;;:::i;:::-;;:::i;19297:474::-;;;;;;:::i;:::-;;:::i;43581:286::-;;;;;;:::i;:::-;;:::i;48349:190::-;;;:::i;35443:384::-;;;;;;:::i;:::-;;:::i;47618:124::-;47705:13;;47669:7;47696:23;;;:8;:23;;;;;:38;;;47618:124;;36133:2434;;;;;;:::i;:::-;;:::i;45902:633::-;;;:::i;19986:194::-;;;;;;:::i;:::-;;:::i;27769:29::-;;;;;;48778:923;49374:17;;48832:7;;;;49404:3;;49351:41;;49374:17;;49404:3;49351:41;:::i;:::-;49318:13;;49309:23;;;;:8;:23;;;;;:38;;;:84;;;;:::i;:::-;:99;;;;:::i;:::-;49491:49;;-1:-1:-1;;;49491:49:0;;49534:4;49491:49;;;1461:51:1;49279:129:0;;-1:-1:-1;49466:22:0;;-1:-1:-1;;;;;49491:24:0;:34;;;;1434:18:1;;49491:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49466:74;;49630:19;49613:14;:36;49612:81;;49692:1;49612:81;;;49653:36;49670:19;49653:14;:36;:::i;:::-;49605:88;;;;48778:923;:::o;43988:908::-;44026:24;44053:15;44026:42;;44122:17;44142:58;44161:20;;44183:16;44142:18;:58::i;:::-;44122:78;;44228:13;;44215:9;:26;44211:39;;44243:7;;;;44211:39;44262:9;44293;44305:13;;44321:1;44305:17;;;;:::i;:::-;44293:29;;44288:570;44329:9;44324:1;:14;44288:570;;44360:3;;;;:::i;:::-;;-1:-1:-1;44396:8:0;;-1:-1:-1;44396:15:0;44405:5;44409:1;44405;:5;:::i;:::-;44396:15;;;;;;;;;;;;;;-1:-1:-1;44396:15:0;;;:19;44378:11;;;:8;:11;;;;;;;:37;;;;44468:5;44472:1;44387;44468:5;:::i;:::-;44459:15;;;;;;;;;;;:30;;;44430:8;:11;44439:1;44430:11;;;;;;;;;;;:26;;:59;;;;44506:12;44592:5;44577:3;26857:1;26842:2;26834:25;;;;:::i;:::-;44521:8;:15;44530:5;44534:1;44530;:5;:::i;:::-;44521:15;;;;;;;;;;;:19;;;:45;;;;:::i;:::-;:60;;;;:::i;:::-;:77;;;;:::i;:::-;44506:92;-1:-1:-1;44668:21:0;44683:5;44506:92;44668:21;:::i;:::-;44638:8;:15;44647:5;44651:1;44647;:5;:::i;:::-;44638:15;;;;;;;;;;;:26;;;:52;;;;:::i;:::-;44613:8;:11;44622:1;44613:11;;;;;;;;;;;:22;;:77;;;;44805:7;44774:8;:15;44787:1;44783;:5;;;;:::i;:::-;44774:15;;;;;;;;;;;:19;;;44733:8;:15;44746:1;44742;:5;;;;:::i;:::-;44733:15;;;;;;;;;;;:30;;;:61;;;;:::i;:::-;:80;;;;:::i;:::-;44705:11;;;;:8;:11;;;;;:25;;:108;44837:2;44832:7;;44828:18;;44841:5;;;44828:18;-1:-1:-1;44340:3:0;;;;:::i;:::-;;;;44288:570;;;;44887:1;44870:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;43988:908:0;:::o;45112:704::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;;;;;;;;;32924:30:::1;::::0;;;::::1;;;:35:::0;32916:77:::1;;;;-1:-1:-1::0;;;32916:77:0::1;;;;;;;:::i;:::-;45242:30:::2;:34:::0;;-1:-1:-1;;45242:34:0::2;::::0;::::2;::::0;;45289:9:::2;:7;:9::i;:::-;45400:27;45430:22;:20;:22::i;:::-;45400:52;;45493:1;45471:19;:23;45463:56;;;::::0;-1:-1:-1;;;45463:56:0;;12018:2:1;45463:56:0::2;::::0;::::2;12000:21:1::0;12057:2;12037:18;;;12030:30;-1:-1:-1;;;12076:18:1;;;12069:50;12136:18;;45463:56:0::2;11990:170:1::0;45463:56:0::2;45574:19;::::0;45540:75:::2;::::0;-1:-1:-1;;;45540:75:0;;45574:19;;;::::2;-1:-1:-1::0;;;;;45574:19:0;;::::2;45540:75;::::0;::::2;3362:51:1::0;3429:18;;;3422:34;;;45540:24:0::2;:33;::::0;::::2;::::0;3335:18:1;;45540:75:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45532:103;;;::::0;-1:-1:-1;;;45532:103:0;;4942:2:1;45532:103:0::2;::::0;::::2;4924:21:1::0;4981:2;4961:18;;;4954:30;-1:-1:-1;;;5000:18:1;;;4993:45;5055:18;;45532:103:0::2;4914:165:1::0;45532:103:0::2;45651:36;::::0;16170:25:1;;;45651:36:0::2;::::0;16158:2:1;16143:18;45651:36:0::2;;;;;;;-1:-1:-1::0;45739:30:0::2;:34:::0;;-1:-1:-1;;45739:34:0::2;::::0;;45112:704::o;33890:239::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;34018:1:::1;34006:9;:13;33998:56;;;::::0;-1:-1:-1;;;33998:56:0;;8114:2:1;33998:56:0::1;::::0;::::1;8096:21:1::0;8153:2;8133:18;;;8126:30;8192:32;8172:18;;;8165:60;8242:18;;33998:56:0::1;8086:180:1::0;33998:56:0::1;34093:16;:28:::0;33890:239::o;38745:2774::-;32924:30;;;;;;;:35;32916:77;;;;-1:-1:-1;;;32916:77:0;;;;;;;:::i;:::-;38883:1:::1;38862:18;:22;38854:60;;;::::0;-1:-1:-1;;;38854:60:0;;3891:2:1;38854:60:0::1;::::0;::::1;3873:21:1::0;3930:2;3910:18;;;3903:30;-1:-1:-1;;;3949:18:1;;;3942:55;4014:18;;38854:60:0::1;3863:175:1::0;38854:60:0::1;38968:30;:34:::0;;-1:-1:-1;;38968:34:0::1;::::0;::::1;::::0;;39067:9:::1;:7;:9::i;:::-;39164:35;::::0;-1:-1:-1;;;39164:35:0;;39188:10:::1;39164:35;::::0;::::1;1461:51:1::0;39203:18:0;;39164:13:::1;-1:-1:-1::0;;;;;39164:23:0::1;::::0;::::1;::::0;1434:18:1;;39164:35:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;39156:100;;;::::0;-1:-1:-1;;;39156:100:0;;9181:2:1;39156:100:0::1;::::0;::::1;9163:21:1::0;9220:2;9200:18;;;9193:30;9259:32;9239:18;;;9232:60;9309:18;;39156:100:0::1;9153:180:1::0;39156:100:0::1;39348:24;39375:33;39389:18;39375:13;:33::i;:::-;39456:13;::::0;39447:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;::::0;39348:60;;-1:-1:-1;39427:58:0;::::1;;39419:96;;;::::0;-1:-1:-1;;;39419:96:0;;3891:2:1;39419:96:0::1;::::0;::::1;3873:21:1::0;3930:2;3910:18;;;3903:30;-1:-1:-1;;;3949:18:1;;;3942:55;4014:18;;39419:96:0::1;3863:175:1::0;39419:96:0::1;39623:17;::::0;39528:27:::1;::::0;39653:3:::1;::::0;39600:41:::1;::::0;39623:17:::1;;39653:3:::0;39600:41:::1;:::i;:::-;39567:13;::::0;39558:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;::::0;:84:::1;::::0;;::::1;:::i;:::-;:99;;;;:::i;:::-;39528:129;;39696:19;39676:16;:39;;39668:82;;;::::0;-1:-1:-1;;;39668:82:0;;14134:2:1;39668:82:0::1;::::0;::::1;14116:21:1::0;14173:2;14153:18;;;14146:30;14212:32;14192:18;;;14185:60;14262:18;;39668:82:0::1;14106:180:1::0;39668:82:0::1;39788:49;::::0;-1:-1:-1;;;39788:49:0;;39831:4:::1;39788:49;::::0;::::1;1461:51:1::0;39763:22:0::1;::::0;39788:24:::1;-1:-1:-1::0;;;;;39788:34:0::1;::::0;::::1;::::0;1434:18:1;;39788:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39763:74;;39874:16;39856:14;:34;;39848:79;;;::::0;-1:-1:-1;;;39848:79:0;;8820:2:1;39848:79:0::1;::::0;::::1;8802:21:1::0;;;8839:18;;;8832:30;8898:34;8878:18;;;8871:62;8950:18;;39848:79:0::1;8792:182:1::0;39848:79:0::1;40082:17;40120:1:::0;40103:14:::1;;:18;40102:97;;40198:1;40102:97;;;40176:19;40169:3;40144:14;;40125:16;:33;;;;:::i;:::-;:48;;;;:::i;:::-;:70;;;;:::i;:::-;40082:117;;40230:16;40218:9;:28;40210:52;;;::::0;-1:-1:-1;;;40210:52:0;;10962:2:1;40210:52:0::1;::::0;::::1;10944:21:1::0;11001:2;10981:18;;;10974:30;-1:-1:-1;;;11020:18:1;;;11013:41;11071:18;;40210:52:0::1;10934:161:1::0;40210:52:0::1;40369:33;40405:28;40424:9:::0;40405:16;:28:::1;:::i;:::-;40369:64;;40661:16;40619:8;:23;40628:13;;40619:23;;;;;;;;;;;:38;;;:58;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40746:50:0::1;::::0;-1:-1:-1;;;40746:50:0;;40765:10:::1;40746:50;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;40746:13:0::1;-1:-1:-1::0;;;;;40746:18:0::1;::::0;::::1;::::0;3335::1;;40746:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;40920:72:0::1;::::0;-1:-1:-1;;;40920:72:0;;40954:10:::1;40920:72;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;40920:24:0::1;-1:-1:-1::0;;;;;40920:33:0::1;::::0;-1:-1:-1;40920:33:0::1;::::0;-1:-1:-1;3335:18:1;;40920:72:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40912:106;;;;-1:-1:-1::0;;;40912:106:0::1;;;;;;;:::i;:::-;41035:13:::0;;41031:187:::1;;41159:11;::::0;41125:57:::1;::::0;-1:-1:-1;;;41125:57:0;;-1:-1:-1;;;;;41159:11:0;;::::1;41125:57;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;41125:24:0::1;:33:::0;;::::1;::::0;::::1;::::0;3335:18:1;;41125:57:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41117:89;;;::::0;-1:-1:-1;;;41117:89:0;;6705:2:1;41117:89:0::1;::::0;::::1;6687:21:1::0;6744:2;6724:18;;;6717:30;-1:-1:-1;;;6763:18:1;;;6756:49;6822:18;;41117:89:0::1;6677:169:1::0;41117:89:0::1;41277:113;::::0;;-1:-1:-1;;;;;41303:24:0::1;2979:15:1::0;2961:34;;41330:10:0::1;3026:2:1::0;3011:18;;3004:43;3063:18;;;3056:34;;;3121:2;3106:18;;3099:34;;;3164:3;3149:19;;3142:35;;;41277:113:0::1;::::0;2910:3:1;2895:19;41277:113:0::1;;;;;;;-1:-1:-1::0;;41442:30:0::1;:34:::0;;-1:-1:-1;;41442:34:0::1;::::0;;-1:-1:-1;;;;38745:2774:0:o;46814:190::-;46871:7;46898:57;46917:20;;46939:15;46898:18;:57::i;:::-;46891:64;;46814:190;:::o;33333:352::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33428:18:0;::::1;::::0;;::::1;::::0;:43:::1;;-1:-1:-1::0;;;;;;33450:21:0;::::1;33466:4;33450:21;;33428:43;33420:71;;;::::0;-1:-1:-1;;;33420:71:0;;4598:2:1;33420:71:0::1;::::0;::::1;4580:21:1::0;4637:2;4617:18;;;4610:30;-1:-1:-1;;;4656:18:1;;;4649:45;4711:18;;33420:71:0::1;4570:165:1::0;33420:71:0::1;33510:22;33527:4;33510:16;:22::i;:::-;33502:65;;;::::0;-1:-1:-1;;;33502:65:0;;11302:2:1;33502:65:0::1;::::0;::::1;11284:21:1::0;11341:2;11321:18;;;11314:30;11380:32;11360:18;;;11353:60;11430:18;;33502:65:0::1;11274:180:1::0;33502:65:0::1;33614:19;::::0;33585:55:::1;::::0;;-1:-1:-1;;;;;33614:19:0;;;::::1;::::0;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;33585:55:0::1;::::0;1670:18:1;33585:55:0::1;;;;;;;33651:19;:26:::0;;-1:-1:-1;;;;;33651:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;33651:26:0;;::::1;::::0;;;::::1;::::0;;33333:352::o;49940:189::-;50013:7;26834:25;26857:1;26842:2;26834:25;:::i;:::-;50070:13;;50061:23;;;;:8;:23;;;;;:34;;;50040:55;;:18;:55;:::i;:::-;:81;;;;:::i;:::-;50033:88;49940:189;-1:-1:-1;;49940:189:0:o;43154:303::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;43253:1:::1;43237:13;:17;43229:49;;;::::0;-1:-1:-1;;;43229:49:0;;14493:2:1;43229:49:0::1;::::0;::::1;14475:21:1::0;14532:2;14512:18;;;14505:30;-1:-1:-1;;;14551:18:1;;;14544:49;14610:18;;43229:49:0::1;14465:169:1::0;43229:49:0::1;43291:9;:7;:9::i;:::-;43347:13;::::0;43338:23:::1;::::0;;;:8:::1;:23;::::0;;;;;;;;:34:::1;;::::0;43318:70;;16380:25:1;;;16421:18;;;16414:34;;;43318:70:0::1;::::0;16353:18:1;43318:70:0::1;;;;;;;43408:13;::::0;43399:23:::1;::::0;;;:8:::1;:23;::::0;;;;:34:::1;;:50:::0;43154:303::o;41756:789::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;32924:30:::1;::::0;;;::::1;;;:35:::0;32916:77:::1;;;;-1:-1:-1::0;;;32916:77:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;41870:29:0;::::2;::::0;;::::2;::::0;:65:::2;;-1:-1:-1::0;;;;;;41903:32:0;::::2;41930:4;41903:32;;41870:65;41862:93;;;::::0;-1:-1:-1;;;41862:93:0;;4598:2:1;41862:93:0::2;::::0;::::2;4580:21:1::0;4637:2;4617:18;;;4610:30;-1:-1:-1;;;4656:18:1;;;4649:45;4711:18;;41862:93:0::2;4570:165:1::0;41862:93:0::2;42009:30;:34:::0;;-1:-1:-1;;42009:34:0::2;::::0;::::2;::::0;;42081:49:::2;::::0;-1:-1:-1;;;42081:49:0;;42124:4:::2;42081:49;::::0;::::2;1461:51:1::0;-1:-1:-1;;;;;;;42081:24:0::2;:34;::::0;::::2;::::0;1434:18:1;;42081:49:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42056:74;;42166:1;42149:14;:18;42141:53;;;::::0;-1:-1:-1;;;42141:53:0;;7763:2:1;42141:53:0::2;::::0;::::2;7745:21:1::0;7802:2;7782:18;;;7775:30;-1:-1:-1;;;7821:18:1;;;7814:52;7883:18;;42141:53:0::2;7735:172:1::0;42141:53:0::2;42271:66;::::0;-1:-1:-1;;;42271:66:0;;-1:-1:-1;;;;;3380:32:1;;;42271:66:0::2;::::0;::::2;3362:51:1::0;3429:18;;;3422:34;;;42271:24:0::2;:33;::::0;::::2;::::0;3335:18:1;;42271:66:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42263:100;;;;-1:-1:-1::0;;;42263:100:0::2;;;;;;;:::i;:::-;42381:35;::::0;16170:25:1;;;42381:35:0::2;::::0;16158:2:1;16143:18;42381:35:0::2;;;;;;;-1:-1:-1::0;;42468:30:0::2;:34:::0;;-1:-1:-1;;42468:34:0::2;::::0;;41756:789::o;34935:250::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35021:18:0;::::1;::::0;;::::1;::::0;:41:::1;;-1:-1:-1::0;35051:11:0::1;::::0;-1:-1:-1;;;;;35043:19:0;;::::1;35051:11:::0;::::1;35043:19;;35021:41;35013:78;;;::::0;-1:-1:-1;;;35013:78:0;;5637:2:1;35013:78:0::1;::::0;::::1;5619:21:1::0;5676:2;5656:18;;;5649:30;5715:26;5695:18;;;5688:54;5759:18;;35013:78:0::1;5609:174:1::0;35013:78:0::1;35130:11;::::0;35109:39:::1;::::0;;-1:-1:-1;;;;;35130:11:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;35109:39:0::1;::::0;1670:18:1;35109:39:0::1;;;;;;;35159:11;:18:::0;;-1:-1:-1;;;;;;35159:18:0::1;-1:-1:-1::0;;;;;35159:18:0;;;::::1;::::0;;;::::1;::::0;;34935:250::o;34409:414::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;34728:14:::1;::::0;34701:64:::1;::::0;;16380:25:1;;;16436:2;16421:18;;16414:34;;;34701:64:0::1;::::0;16353:18:1;34701:64:0::1;;;;;;;34778:14;:37:::0;34409:414::o;42771:242::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;42852:1:::1;42843:6;:10;42835:34;;;::::0;-1:-1:-1;;;42835:34:0;;15886:2:1;42835:34:0::1;::::0;::::1;15868:21:1::0;15925:2;15905:18;;;15898:30;-1:-1:-1;;;15944:18:1;;;15937:41;15995:18;;42835:34:0::1;15858:161:1::0;42835:34:0::1;42882:9;:7;:9::i;:::-;42931:13;::::0;42922:23:::1;::::0;;;:8:::1;:23;::::0;;;;;;;;:27;42909:49;;16380:25:1;;;16421:18;;;16414:34;;;42909:49:0::1;::::0;16353:18:1;42909:49:0::1;;;;;;;42978:13;::::0;42969:23:::1;::::0;;;:8:::1;:23;::::0;;;;:36;42771:242::o;19297:474::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19400:28:0;::::1;19392:68;;;::::0;-1:-1:-1;;;19392:68:0;;5990:2:1;19392:68:0::1;::::0;::::1;5972:21:1::0;6029:2;6009:18;;;6002:30;6068:29;6048:18;;;6041:57;6115:18;;19392:68:0::1;5962:177:1::0;19392:68:0::1;19497:5;::::0;-1:-1:-1;;;;;19479:23:0;;::::1;19497:5:::0;::::1;19479:23;;19471:66;;;::::0;-1:-1:-1;;;19471:66:0;;15174:2:1;19471:66:0::1;::::0;::::1;15156:21:1::0;15213:2;15193:18;;;15186:30;15252:32;15232:18;;;15225:60;15302:18;;19471:66:0::1;15146:180:1::0;19471:66:0::1;19574:17;::::0;-1:-1:-1;;;;;19556:35:0;;::::1;19574:17:::0;::::1;19556:35;;19548:70;;;::::0;-1:-1:-1;;;19548:70:0;;12718:2:1;19548:70:0::1;::::0;::::1;12700:21:1::0;12757:2;12737:18;;;12730:30;-1:-1:-1;;;12776:18:1;;;12769:52;12838:18;;19548:70:0::1;12690:172:1::0;19548:70:0::1;19656:17;::::0;19636:54:::1;::::0;;-1:-1:-1;;;;;19656:17:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;19636:54:0::1;::::0;1670:18:1;19636:54:0::1;;;;;;;19729:17;:34:::0;;-1:-1:-1;;;;;;19729:34:0::1;-1:-1:-1::0;;;;;19729:34:0;;;::::1;::::0;;;::::1;::::0;;19297:474::o;43581:286::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;43691:1:::1;43678:10;:14;;;:34;;;;;43709:3;43696:10;:16;;;43678:34;43670:73;;;::::0;-1:-1:-1;;;43670:73:0;;13423:2:1;43670:73:0::1;::::0;::::1;13405:21:1::0;13462:2;13442:18;;;13435:30;13501:28;13481:18;;;13474:56;13547:18;;43670:73:0::1;13395:176:1::0;43670:73:0::1;43788:17;::::0;43761:57:::1;::::0;;43788:17:::1;::::0;;::::1;17210:36:1::0;;17282:17;;;17277:2;17262:18;;17255:45;43761:57:0::1;::::0;17183:18:1;43761:57:0::1;;;;;;;43829:17;:30:::0;;-1:-1:-1;;43829:30:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43581:286::o;48349:190::-;48497:17;;48405:7;;48527:3;;48474:41;;48497:17;;48527:3;48474:41;:::i;:::-;48441:13;;48432:23;;;;:8;:23;;;;;:38;;;:84;;;;:::i;:::-;:99;;;;:::i;35443:384::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;35544:1:::1;35532:9;:13;35524:50;;;::::0;-1:-1:-1;;;35524:50:0;;4245:2:1;35524:50:0::1;::::0;::::1;4227:21:1::0;4284:2;4264:18;;;4257:30;4323:26;4303:18;;;4296:54;4367:18;;35524:50:0::1;4217:174:1::0;35524:50:0::1;35612:49;::::0;-1:-1:-1;;;35612:49:0;;35655:4:::1;35612:49;::::0;::::1;1461:51:1::0;35587:22:0::1;::::0;35612:24:::1;-1:-1:-1::0;;;;;35612:34:0::1;::::0;::::1;::::0;1434:18:1;;35612:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35587:74:::0;-1:-1:-1;35680:19:0;;35672:58:::1;;;::::0;-1:-1:-1;;;35672:58:0;;7053:2:1;35672:58:0::1;::::0;::::1;7035:21:1::0;7092:2;7072:18;;;7065:30;7131:28;7111:18;;;7104:56;7177:18;;35672:58:0::1;7025:176:1::0;35672:58:0::1;-1:-1:-1::0;35778:13:0::1;::::0;35769:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;:50:::0;35443:384::o;36133:2434::-;32700:27;;;;;;;:32;32692:71;;;;-1:-1:-1;;;32692:71:0;;7408:2:1;32692:71:0;;;7390:21:1;7447:2;7427:18;;;7420:30;7486:28;7466:18;;;7459:56;7532:18;;32692:71:0;7380:176:1;32692:71:0;36312:16:::1;;36295:13;:33;;36287:76;;;::::0;-1:-1:-1;;;36287:76:0;;6346:2:1;36287:76:0::1;::::0;::::1;6328:21:1::0;6385:2;6365:18;;;6358:30;6424:32;6404:18;;;6397:60;6474:18;;36287:76:0::1;6318:180:1::0;36287:76:0::1;36417:27;:31:::0;;-1:-1:-1;;36417:31:0::1;;;::::0;;36513:9:::1;:7;:9::i;:::-;36643:46;::::0;-1:-1:-1;;;36643:46:0;;36678:10:::1;36643:46;::::0;::::1;1461:51:1::0;36693:13:0;;36643:24:::1;-1:-1:-1::0;;;;;36643:34:0::1;::::0;::::1;::::0;1434:18:1;;36643:46:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;36635:94;;;::::0;-1:-1:-1;;;36635:94:0;;8473:2:1;36635:94:0::1;::::0;::::1;8455:21:1::0;8512:2;8492:18;;;8485:30;-1:-1:-1;;;8531:18:1;;;8524:48;8589:18;;36635:94:0::1;8445:168:1::0;36635:94:0::1;36834:61;::::0;-1:-1:-1;;;36834:61:0;;36869:10:::1;36834:61;::::0;::::1;1735:34:1::0;36889:4:0::1;1785:18:1::0;;;1778:43;36899:13:0;;36834:24:::1;-1:-1:-1::0;;;;;36834:34:0::1;::::0;::::1;::::0;1670:18:1;;36834:61:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:78;;36826:113;;;::::0;-1:-1:-1;;;36826:113:0;;5286:2:1;36826:113:0::1;::::0;::::1;5268:21:1::0;5325:2;5305:18;;;5298:30;-1:-1:-1;;;5344:18:1;;;5337:52;5406:18;;36826:113:0::1;5258:172:1::0;36826:113:0::1;37121:13;::::0;37038:29:::1;37112:23:::0;;;:8:::1;:23;::::0;;;;:34:::1;;::::0;26834:25:::1;26857:1;26842:2;26834:25;:::i;:::-;37070:39;::::0;:13;:39:::1;:::i;:::-;:76;;;;:::i;:::-;37245:44;::::0;-1:-1:-1;;;37245:44:0;;::::1;::::0;::::1;16170:25:1::0;;;37038:108:0;;-1:-1:-1;37245:13:0::1;-1:-1:-1::0;;;;;37245:21:0::1;::::0;::::1;::::0;16143:18:1;;37245:44:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37237:84;;;::::0;-1:-1:-1;;;37237:84:0;;13778:2:1;37237:84:0::1;::::0;::::1;13760:21:1::0;13817:2;13797:18;;;13790:30;13856:29;13836:18;;;13829:57;13903:18;;37237:84:0::1;13750:177:1::0;37237:84:0::1;37343:13;::::0;37334:23:::1;::::0;;;:8:::1;:23;::::0;;;;:38:::1;;:55:::0;;37376:13;;37334:23;:55:::1;::::0;37376:13;;37334:55:::1;:::i;:::-;::::0;;;-1:-1:-1;;37556:49:0::1;::::0;-1:-1:-1;;;37556:49:0;;37599:4:::1;37556:49;::::0;::::1;1461:51:1::0;37524:29:0::1;::::0;37556:24:::1;-1:-1:-1::0;;;;;37556:34:0::1;::::0;::::1;::::0;1434:18:1;;37556:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37677:79;::::0;-1:-1:-1;;;37677:79:0;;37715:10:::1;37677:79;::::0;::::1;2072:34:1::0;37735:4:0::1;2122:18:1::0;;;2115:43;2174:18;;;2167:34;;;37524:81:0;;-1:-1:-1;37677:24:0::1;-1:-1:-1::0;;;;;37677:37:0::1;::::0;::::1;::::0;2007:18:1;;37677:79:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37669:113;;;;-1:-1:-1::0;;;37669:113:0::1;;;;;;;:::i;:::-;37881:49;::::0;-1:-1:-1;;;37881:49:0;;37924:4:::1;37881:49;::::0;::::1;1461:51:1::0;37860:18:0::1;::::0;37881:24:::1;-1:-1:-1::0;;;;;37881:34:0::1;::::0;::::1;::::0;1434:18:1;;37881:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37860:70:::0;-1:-1:-1;38058:37:0::1;38082:13:::0;38058:21;:37:::1;:::i;:::-;38044:10;:51;38036:91;;;::::0;-1:-1:-1;;;38036:91:0;;10606:2:1;38036:91:0::1;::::0;::::1;10588:21:1::0;10645:2;10625:18;;;10618:30;10684:29;10664:18;;;10657:57;10731:18;;38036:91:0::1;10578:177:1::0;38036:91:0::1;38267:53;::::0;-1:-1:-1;;;38267:53:0;;38286:10:::1;38267:53;::::0;::::1;3362:51:1::0;3429:18;;;3422:34;;;38267:13:0::1;-1:-1:-1::0;;;;;38267:18:0::1;::::0;::::1;::::0;3335::1;;38267:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;38377:99:0::1;::::0;;-1:-1:-1;;;;;38400:24:0::1;2499:15:1::0;2481:34;;38427:10:0::1;2546:2:1::0;2531:18;;2524:43;2583:18;;;2576:34;;;2641:2;2626:18;;2619:34;;;38377:99:0::1;::::0;-1:-1:-1;2430:3:1;2415:19;;-1:-1:-1;38377:99:0::1;;;;;;;-1:-1:-1::0;;38528:27:0::1;:31:::0;;-1:-1:-1;;38528:31:0::1;::::0;;-1:-1:-1;;36133:2434:0:o;45902:633::-;19027:17;;-1:-1:-1;;;;;19027:17:0;19013:10;:31;;:54;;-1:-1:-1;19062:5:0;;-1:-1:-1;;;;;19062:5:0;19048:10;:19;19013:54;19005:91;;;;-1:-1:-1;;;19005:91:0;;;;;;;:::i;:::-;45973:9:::1;:7;:9::i;:::-;46076:27;46106:18;47929:13:::0;;;47893:7;47920:23;;;:8;:23;;;;;:37;;47843:122;;46106:18:::1;46161:49;::::0;-1:-1:-1;;;46161:49:0;;46204:4:::1;46161:49;::::0;::::1;1461:51:1::0;46076:48:0;;-1:-1:-1;46137:21:0::1;::::0;-1:-1:-1;;;;;46161:24:0::1;:34;::::0;::::1;::::0;1434:18:1;;46161:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46235:19;::::0;46223:59:::1;::::0;-1:-1:-1;;;46223:59:0;;::::1;::::0;::::1;16170:25:1::0;;;46137:73:0;;-1:-1:-1;46235:19:0;;::::1;-1:-1:-1::0;;;;;46235:19:0::1;::::0;46223:38:::1;::::0;16143:18:1;;46223:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;46318:49:0::1;::::0;-1:-1:-1;;;46318:49:0;;46361:4:::1;46318:49;::::0;::::1;1461:51:1::0;46295:20:0::1;::::0;-1:-1:-1;46318:24:0::1;-1:-1:-1::0;;;;;46318:34:0::1;::::0;-1:-1:-1;46318:34:0::1;::::0;1434:18:1;;46318:49:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46295:72:::0;-1:-1:-1;46404:35:0::1;46420:19:::0;46404:13;:35:::1;:::i;:::-;46388:12;:51;;46380:91;;;::::0;-1:-1:-1;;;46380:91:0;;10606:2:1;46380:91:0::1;::::0;::::1;10588:21:1::0;10645:2;10625:18;;;10618:30;10684:29;10664:18;;;10657:57;10731:18;;46380:91:0::1;10578:177:1::0;46380:91:0::1;46489:38;::::0;16170:25:1;;;46489:38:0::1;::::0;16158:2:1;16143:18;46489:38:0::1;;;;;;;19107:1;;;45902:633::o:0;19986:194::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;20081:17:::1;::::0;-1:-1:-1;;;;;20073:25:0;;::::1;20081:17:::0;::::1;20073:25;;20065:67;;;::::0;-1:-1:-1;;;20065:67:0;;9898:2:1;20065:67:0::1;::::0;::::1;9880:21:1::0;9937:2;9917:18;;;9910:30;9976:31;9956:18;;;9949:59;10025:18;;20065:67:0::1;9870:179:1::0;20065:67:0::1;20143:29;20167:4;20143:23;:29::i;:::-;19986:194:::0;:::o;22584:144::-;22644:12;22680:40;22692:27;22126:12;22692:9;:27;:::i;:::-;22680:11;:40::i;:::-;-1:-1:-1;22669:51:0;;22584:144;-1:-1:-1;;;22584:144:0:o;23035:306::-;23177:17;23327:6;23297:27;22335:2;23297:6;:27;:::i;:::-;23271:23;22231:7;23271:4;:23;:::i;:::-;22126:12;23219:31;23233:4;23239:5;23246:3;23219:13;:31::i;:::-;:49;;;;:::i;:::-;:75;;;;:::i;:::-;:105;;;;:::i;:::-;:114;;;;:::i;:::-;23207:126;23035:306;-1:-1:-1;;;;;;;23035:306:0:o;23589:248::-;23675:7;23720:11;23703:13;:28;;23695:69;;;;-1:-1:-1;;;23695:69:0;;11661:2:1;23695:69:0;;;11643:21:1;11700:2;11680:18;;;11673:30;11739;11719:18;;;11712:58;11787:18;;23695:69:0;11633:178:1;23695:69:0;22126:12;23783:27;23797:13;23783:11;:27;:::i;:::-;23782:47;;;;:::i;:::-;23775:54;23589:248;-1:-1:-1;;;23589:248:0:o;21300:309::-;21358:4;20913:66;21523:17;;21562:19;;;;;;:38;;-1:-1:-1;21585:15:0;;;21562:38;21554:47;21300:309;-1:-1:-1;;;;21300:309:0:o;1086:214::-;805:5;;-1:-1:-1;;;;;805:5:0;814:10;805:19;797:54;;;;-1:-1:-1;;;797:54:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;1172:18:0;::::1;1164:56;;;::::0;-1:-1:-1;;;1164:56:0;;13069:2:1;1164:56:0::1;::::0;::::1;13051:21:1::0;13108:2;13088:18;;;13081:30;13147:27;13127:18;;;13120:55;13192:18;;1164:56:0::1;13041:175:1::0;1164:56:0::1;1257:5;::::0;1236:33:::1;::::0;;-1:-1:-1;;;;;1257:5:0;;::::1;1735:34:1::0;;1805:15;;;1800:2;1785:18;;1778:43;1236:33:0::1;::::0;1670:18:1;1236:33:0::1;;;;;;;1280:5;:12:::0;;-1:-1:-1;;;;;;1280:12:0::1;-1:-1:-1::0;;;;;1280:12:0;;;::::1;::::0;;;::::1;::::0;;1086:214::o;24349:665::-;24409:12;;;24485:5;24409:12;22423:7;24515:14;24485:5;24524;24515:14;:::i;:::-;:31;;;;:::i;:::-;24504:42;-1:-1:-1;24557:8:0;24576:6;24568:5;24504:42;24568:1;:5;:::i;:::-;:14;;;;:::i;:::-;24557:25;-1:-1:-1;24620:1:0;24602:10;24557:25;24602:6;:10;:::i;:::-;:14;;24615:1;24602:14;:::i;:::-;24601:20;;;;:::i;:::-;24597:24;;:1;:24;:::i;:::-;24593:28;-1:-1:-1;24632:12:0;24664:7;24655:5;24593:28;24659:1;24655:5;:::i;:::-;24647:14;;:4;:14;:::i;:::-;:24;;;;:::i;:::-;24632:39;-1:-1:-1;24705:1:0;24690:12;24632:39;24690:4;:12;:::i;:::-;:16;;;;:::i;:::-;24686:20;;:1;:20;:::i;:::-;:25;;24709:2;24686:25;:::i;:::-;24682:29;-1:-1:-1;24722:13:0;24747:4;24738:6;24682:29;24738:2;:6;:::i;:::-;:13;;;;:::i;:::-;24722:29;-1:-1:-1;24762:11:0;24796:2;24780:13;24722:29;24780:4;:13;:::i;:::-;:18;;;;:::i;:::-;24776:22;;:1;:22;:::i;:::-;24762:36;-1:-1:-1;24813:11:0;24822:2;24813:6;:11;:::i;:::-;24809:15;-1:-1:-1;24857:6:0;24809:15;24857:2;:6;:::i;:::-;24844:10;:6;24853:1;24844:10;:::i;:::-;:19;;;;:::i;:::-;24835:28;-1:-1:-1;24907:1:0;24899:5;24889:6;24893:2;24889:1;:6;:::i;:::-;24882:14;;:3;:14;:::i;:::-;:22;;;;:::i;:::-;:26;;;;:::i;:::-;24874:34;24969:6;;-1:-1:-1;25001:4:0;-1:-1:-1;24349:665:0;-1:-1:-1;;;;;;24349:665:0:o;25545:550::-;25634:13;25676:4;25668;:12;;25660:30;;;;-1:-1:-1;;;25660:30:0;;14841:2:1;25660:30:0;;;14823:21:1;14880:1;14860:18;;;14853:29;-1:-1:-1;;;14898:18:1;;;14891:35;14943:18;;25660:30:0;14813:154:1;25660:30:0;25717:4;25750:5;25782:3;25701:9;22423:7;26022:1;26015:3;26009:2;25994:11;26003:2;25750:5;25994:11;:::i;:::-;25993:18;;;;:::i;:::-;25978:12;:5;25986:4;25978:12;:::i;:::-;:33;;;;:::i;:::-;25977:41;;;;:::i;:::-;25972:47;;:1;:47;:::i;:::-;:51;;;;:::i;:::-;25956:2;;25930:11;25939:2;25930:6;:11;:::i;:::-;25929:18;;;;:::i;:::-;:23;;25950:2;25929:23;:::i;:::-;25916:10;25925:1;25916:6;:10;:::i;:::-;:36;;;;:::i;:::-;25909:44;;:3;:44;:::i;:::-;:49;;;;:::i;:::-;25894:1;25888:2;25873:11;25882:2;25873:6;:11;:::i;:::-;25872:18;;;;:::i;:::-;25857:12;:5;25865:4;25857:12;:::i;:::-;:33;;;;:::i;:::-;25849:42;;:4;:42;:::i;:::-;:46;;;;:::i;:::-;25812:23;25830:5;25812:4;:23;:::i;:::-;:83;;;;:::i;:::-;:146;;;;:::i;:::-;:211;;;;:::i;:::-;:239;;;;:::i;:::-;25799:252;25545:550;-1:-1:-1;;;;;;;;25545:550:0:o;14:306:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;178:23;;-1:-1:-1;;;;;230:31:1;;220:42;;210:2;;281:6;273;266:22;325:297;;445:2;433:9;424:7;420:23;416:32;413:2;;;466:6;458;451:22;413:2;503:9;497:16;556:5;549:13;542:21;535:5;532:32;522:2;;583:6;575;568:22;627:190;;739:2;727:9;718:7;714:23;710:32;707:2;;;760:6;752;745:22;707:2;-1:-1:-1;788:23:1;;697:120;-1:-1:-1;697:120:1:o;822:194::-;;945:2;933:9;924:7;920:23;916:32;913:2;;;966:6;958;951:22;913:2;-1:-1:-1;994:16:1;;903:113;-1:-1:-1;903:113:1:o;1021:289::-;;1131:2;1119:9;1110:7;1106:23;1102:32;1099:2;;;1152:6;1144;1137:22;1099:2;1196:9;1183:23;1246:4;1239:5;1235:16;1228:5;1225:27;1215:2;;1271:6;1263;1256:22;9338:353;9540:2;9522:21;;;9579:2;9559:18;;;9552:30;9618:31;9613:2;9598:18;;9591:59;9682:2;9667:18;;9512:179::o;10054:345::-;10256:2;10238:21;;;10295:2;10275:18;;;10268:30;-1:-1:-1;;;10329:2:1;10314:18;;10307:51;10390:2;10375:18;;10228:171::o;12165:346::-;12367:2;12349:21;;;12406:2;12386:18;;;12379:30;-1:-1:-1;;;12440:2:1;12425:18;;12418:52;12502:2;12487:18;;12339:172::o;15331:348::-;15533:2;15515:21;;;15572:2;15552:18;;;15545:30;15611:26;15606:2;15591:18;;15584:54;15670:2;15655:18;;15505:174::o;17311:267::-;;17378:11;;;17405:10;;-1:-1:-1;;;;;17424:27:1;;;17417:35;;17401:52;17398:2;;;17456:18;;:::i;:::-;-1:-1:-1;;;17503:19:1;;;17496:27;;17488:36;;17485:2;;;17527:18;;:::i;:::-;-1:-1:-1;;17563:9:1;;17358:220::o;17583:128::-;;17654:1;17650:6;17647:1;17644:13;17641:2;;;17660:18;;:::i;:::-;-1:-1:-1;17696:9:1;;17631:80::o;17716:193::-;;17781:1;17771:2;;17786:18;;:::i;:::-;-1:-1:-1;;;17822:18:1;;-1:-1:-1;;17842:13:1;;17818:38;17815:2;;;17859:18;;:::i;:::-;-1:-1:-1;17893:10:1;;17761:148::o;17914:120::-;;17980:1;17970:2;;17985:18;;:::i;:::-;-1:-1:-1;18019:9:1;;17960:74::o;18039:453::-;18135:6;18158:5;18172:314;18221:1;18258:2;18248:8;18245:16;18235:2;;18265:5;;;18235:2;18306:4;18301:3;18297:14;18291:4;18288:24;18285:2;;;18315:18;;:::i;:::-;18365:2;18355:8;18351:17;18348:2;;;18380:16;;;;18348:2;18459:17;;;;;18419:15;;18172:314;;;18116:376;;;;;;;:::o;18497:139::-;;18586:44;-1:-1:-1;;18613:8:1;18607:4;18641:922;18725:8;18715:2;;-1:-1:-1;18766:1:1;18780:5;;18715:2;18814:4;18804:2;;-1:-1:-1;18851:1:1;18865:5;;18804:2;18896:4;18914:1;18909:59;;;;18982:1;18977:183;;;;18889:271;;18909:59;18939:1;18930:10;;18953:5;;;18977:183;19014:3;19004:8;19001:17;18998:2;;;19021:18;;:::i;:::-;19077:1;19067:8;19063:16;19054:25;;19105:3;19098:5;19095:14;19092:2;;;19112:18;;:::i;:::-;19145:5;;;18889:271;;19244:2;19234:8;19231:16;19225:3;19219:4;19216:13;19212:36;19206:2;19196:8;19193:16;19188:2;19182:4;19179:12;19175:35;19172:77;19169:2;;;-1:-1:-1;19281:19:1;;;19316:14;;;19313:2;;;19333:18;;:::i;:::-;19366:5;;19169:2;19413:42;19451:3;19441:8;19435:4;19432:1;19413:42;:::i;:::-;19488:6;19483:3;19479:16;19470:7;19467:29;19464:2;;;19499:18;;:::i;:::-;19537:20;;18705:858;-1:-1:-1;;;;18705:858:1:o;19568:577::-;;-1:-1:-1;;;;;19677:15:1;;;19711;;;19742:11;;;19761:10;;;19755:17;;19738:35;19735:2;;;19776:18;;:::i;:::-;-1:-1:-1;;;19845:15:1;;;19876:11;;;19896;;;19889:19;;19872:37;19869:2;;;19912:18;;:::i;:::-;19958:7;19955:1;19951:15;19941:25;;20011:1;20007:2;20002:11;19999:1;19995:19;19990:2;19986;19982:11;19978:37;19975:2;;;20018:18;;:::i;:::-;20083:1;20079:2;20074:11;20071:1;20067:19;20062:2;20058;20054:11;20050:37;20047:2;;;20090:18;;:::i;:::-;-1:-1:-1;;;20130:9:1;;;;;19619:526;-1:-1:-1;;;19619:526:1:o;20150:168::-;;20256:1;20252;20248:6;20244:14;20241:1;20238:21;20233:1;20226:9;20219:17;20215:45;20212:2;;;20263:18;;:::i;:::-;-1:-1:-1;20303:9:1;;20202:116::o;20323:270::-;;20391:12;;;20419:10;;-1:-1:-1;;;20438:19:1;;20431:27;;20415:44;20412:2;;;20462:18;;:::i;:::-;-1:-1:-1;;;;;20509:27:1;;20502:35;;20494:44;;20491:2;;;20541:18;;:::i;:::-;-1:-1:-1;;20578:9:1;;20371:222::o;20598:125::-;;20666:1;20663;20660:8;20657:2;;;20671:18;;:::i;:::-;-1:-1:-1;20708:9:1;;20647:76::o;20728:135::-;;-1:-1:-1;;20788:17:1;;20785:2;;;20808:18;;:::i;:::-;-1:-1:-1;20855:1:1;20844:13;;20775:88::o;20868:127::-;20929:10;20924:3;20920:20;20917:1;20910:31;20960:4;20957:1;20950:15;20984:4;20981:1;20974:15;21000:127;21061:10;21056:3;21052:20;21049:1;21042:31;21092:4;21089:1;21082:15;21116:4;21113:1;21106:15
Swarm Source
ipfs://57c1b6672852aab9f02860448a7ed09656af11e2888ff8ec3790d9f5cfdc394e
Loading...
Loading
Loading...
Loading
Net Worth in USD
$3,502.21
Net Worth in ETH
1.771877
Token Allocations
USDC
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $1 | 3,502.2087 | $3,502.21 |
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.