Source Code
Overview
S Balance
S Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create A Token | 31779001 | 248 days ago | IN | 0 S | 0.050362 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 31779001 | 248 days ago | Contract Creation | 0 S |
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x24935409...9A3603E39 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
AtvFactory
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import {Clones} from "./Clones.sol";
import {OwnableDelayModule} from "./OwnableDelayModule.sol";
import "./IAFi.sol";
import "./IPassiveRebal.sol";
/**
* @title AtvFactory.
* @notice Factory contract for creating/deploying new ATokens.
*/
contract AtvFactory is OwnableDelayModule {
address public aTokenImplementation;
address[] public aFiProducts;
mapping(address => bool) public isATokenPresent;
mapping(address => bool) public initilizeStatus;
mapping(address => bool) public initializeTokenStatus;
event TokenCreated(address indexed token, string name, string symbol);
event AddUnderlyingTokens(address indexed afiContract, address utoken);
/**
* @notice To initialize/deploy the AFiFactory contract.
* @param _aTokenImplementation Address of AFiBase contract.
*/
constructor(address _aTokenImplementation) {
//solhint-disable-next-line reason-string
require(_aTokenImplementation != address(0), "AF02");
aTokenImplementation = _aTokenImplementation;
}
/**
* @notice Returns afiProducts count.
* @return uint256 Length of aFiProducts array
*/
function afiProductsCount() external view returns (uint) {
return aFiProducts.length;
}
/**
* @notice To create new ATokens.
* @dev The params must be equal. Aarna engine address & underlying token address cannot be zero address.
* @param _name Name of AToken.
* @param _symbol Symbol of AToken.
* @param data encoded data.
* @param _teamWallets array of team wallets.
* @param _isActiveRebalanced i.e. active rebalance status of the afiContract.
* @param _aFiStorage address of AFiStorage contract
* @param _rebalContract address of AFiPassiveRebalStrategies contract
* @param _aFiManager address of AFiManager
* @return aTokenAddress returns address of created afi contract(aToken)
*/
function createAToken(
string memory _name,
string memory _symbol,
bytes memory data,
address[] memory _teamWallets,
bool _isActiveRebalanced,
IAFiStorage _aFiStorage,
IPassiveRebal _rebalContract,
address _aFiManager,
address[] memory _nonOverlappingITokens,
address parentVault
) external onlyOwner returns (address aTokenAddress) {
IAFi.PoolsData memory pooldata = abi.decode(data, (IAFi.PoolsData));
require(
pooldata._underlyingTokensProportion.length == pooldata._pendleMarketPalace.length &&
pooldata._pendleMarketPalace.length == pooldata._aaveToken.length &&
pooldata._aaveToken.length == pooldata._priceOracles.length,
"AF: Array lengths"
);
// Check if the sum of proportions is equal to 100%
uint256 totalProportion;
for (uint256 i = 0; i < pooldata._underlyingTokensProportion.length; i++) {
totalProportion += pooldata._underlyingTokensProportion[i];
}
require(totalProportion == 10000000, "AF01");
require(_aFiManager != address(0), "AF: zero addr");
require(address(_aFiStorage) != address(0), "AF: zero addr");
require(!checkForZeroAddress(_teamWallets), "AF: zero addr");
require(_teamWallets.length > 0, "AF: Array Length");
aTokenAddress = Clones.clone(aTokenImplementation);
isATokenPresent[aTokenAddress] = true;
aFiProducts.push(aTokenAddress);
IAFi(aTokenAddress).initialize(
msg.sender,
_name,
_symbol,
data,
_isActiveRebalanced,
_aFiStorage,
_nonOverlappingITokens,
parentVault
);
IAFi(aTokenAddress).initializeToken(
pooldata._depositStableCoin,
_teamWallets,
_rebalContract,
_aFiManager
);
emit TokenCreated(aTokenAddress, _name, _symbol);
}
function checkForZeroAddress(
address[] memory inputAddresses
) internal pure returns (bool containZeroAddr) {
uint len = inputAddresses.length;
for (uint i = 0; i < len; i++) {
if (inputAddresses[i] == address(0)) {
return true;
}
}
return false;
}
// The purpose of the function is to encode the pool data that follows the structure declared in IAFi.sol
function encodePoolData(
IAFi.PoolsData memory pooldata
) external pure returns (bytes memory) {
return (abi.encode(pooldata));
}
// The purpose of the function is to encode the pool data that follows the structure declared in IAFi.sol
function encodeUnderlyingData(
IAFi.UnderlyingData memory uData
) external pure returns (bytes memory) {
return (abi.encode(uData));
}
function getPricePerFullShare(
address afiContract,
address afiStorage
) public view returns (uint) {
uint _pool = 0;
uint256 _totalSupply = IERC20(afiContract).totalSupply();
_pool = IAFiStorage(afiStorage).calculatePoolInUsd(afiContract);
if (_totalSupply == 0) {
return 1000000;
}
return (_pool * (10000)) / (_totalSupply);
}
// The purpose of this function is to call initialize functions of AFiContract only once
function afiContractInitUpdate(address aFiContract, uint order) external {
require(msg.sender == aFiContract, "NA");
if (order == 1) {
require(!initilizeStatus[aFiContract], "AF00");
initilizeStatus[aFiContract] = true;
} else if (order == 2) {
require(!initializeTokenStatus[aFiContract], "AF00");
initializeTokenStatus[aFiContract] = true;
}
}
// Function returns the initialize status of an afi contract for all three initialize functions
function getAFiInitStatus(address aFiContract) external view returns (bool, bool) {
return (initilizeStatus[aFiContract], initializeTokenStatus[aFiContract]);
}
function getAFiTokenStatus(address _aFiContract) external view returns (bool) {
return isATokenPresent[_aFiContract];
}
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)
pragma solidity ^0.8.0;
/**
* @dev https://eips.ethereum.org/EIPS/eip-1167[EIP 1167] is a standard for
* deploying minimal proxy contracts, also known as "clones".
*
* > To simply and cheaply clone contract functionality in an immutable way, this standard specifies
* > a minimal bytecode implementation that delegates all calls to a known, fixed address.
*
* The library includes functions to deploy a proxy using either `create` (traditional deployment) or `create2`
* (salted deterministic deployment). It also includes functions to predict the addresses of clones deployed using the
* deterministic method.
*
* _Available since v3.4._
*/
library Clones {
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create opcode, which should never revert.
*/
function clone(address implementation) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create(0, 0x09, 0x37)
}
require(instance != address(0), "ERC1167: create failed");
}
/**
* @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`.
*
* This function uses the create2 opcode and a `salt` to deterministically deploy
* the clone. Using the same `implementation` and `salt` multiple time will revert, since
* the clones cannot be deployed twice at the same address.
*/
function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) {
/// @solidity memory-safe-assembly
assembly {
// Cleans the upper 96 bits of the `implementation` word, then packs the first 3 bytes
// of the `implementation` address with the bytecode before the address.
mstore(0x00, or(shr(0xe8, shl(0x60, implementation)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
// Packs the remaining 17 bytes of `implementation` with the bytecode after the address.
mstore(0x20, or(shl(0x78, implementation), 0x5af43d82803e903d91602b57fd5bf3))
instance := create2(0, 0x09, 0x37, salt)
}
require(instance != address(0), "ERC1167: create2 failed");
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(
address implementation,
bytes32 salt,
address deployer
) internal pure returns (address predicted) {
/// @solidity memory-safe-assembly
assembly {
let ptr := mload(0x40)
mstore(add(ptr, 0x38), deployer)
mstore(add(ptr, 0x24), 0x5af43d82803e903d91602b57fd5bf3ff)
mstore(add(ptr, 0x14), implementation)
mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73)
mstore(add(ptr, 0x58), salt)
mstore(add(ptr, 0x78), keccak256(add(ptr, 0x0c), 0x37))
predicted := keccak256(add(ptr, 0x43), 0x55)
}
}
/**
* @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}.
*/
function predictDeterministicAddress(address implementation, bytes32 salt)
internal
view
returns (address predicted)
{
return predictDeterministicAddress(implementation, salt, address(this));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
import {IERC20Extended as IERC20} from "./IERC20Extended.sol";
import "./IAFiStorage.sol";
import "./IPassiveRebal.sol";
/**
* @title PassiveRebal.
* @notice Interface of the Passive Rebalance contract.
*/
interface PassiveRebal {
function applyRebalForProportions(
address _aFiContract,
address _aFiManager,
address _aFiStorage,
address[] memory _tokens,
uint256 strategy
) external view returns (uint[] memory proportions, uint256);
function getPauseStatus() external returns (bool);
function getRebalStrategyNumber(address aFiContract) external returns (uint);
function getPauseDepositController(address afiContract) external view returns (address);
}
interface IAFiOracle {
function uniswapV3Oracle(
address afiContract,
address _tokenIn,
address _tokenOut,
uint _amountIn,
uint _maxTime,
address middleToken,
uint256 minimumReturnAmount
) external returns (bytes memory swapParams);
}
interface IAFiManager {
function updateUTokenProportion(
address aFiContract,
address aFiStorage
) external returns (uint256[] memory);
function inputTokenUSD(
IAFi aFiContract,
uint256 cSwapCounter,
IAFiStorage _aFiStorage
) external view returns (uint256 totalPreDepositInUSD);
function rebalanceController() external view returns(address);
function pauseQueueWithdrawUnstaking(address afiContract,bool status) external;
function isQueueWithdrawUnstakingPaused(address afiContract) external view returns(bool);
function getUTokenProportion(
address aFiContract,
address _aFiStorage
)
external
view
returns (uint256[] memory underlyingTokenProportions, uint256 totalProp);
}
/**
* @title IAFi.
* @notice Interface of the AToken.
*/
interface IAFi {
struct UnderlyingData {
address[] _underlyingTokens; //uTokens
address[] _underlyingUniPoolToken; //uToken - MiddleToken
}
struct PoolsData {
address[] _depositStableCoin;
address[] _depositCoinOracle;
bytes underlyingData;
address[] _pendleMarketPalace;
address[] _aaveToken;
address[] _priceOracles;
uint[] _underlyingTokensProportion;
address[] compoundV3Comet;
uint _typeOfProduct;
}
struct SwapParameters {
address afiContract;
address oToken;
uint256 cSwapFee;
uint256 cSwapCounter;
address[] depositTokens;
uint256[] minimumReturnAmount;
uint256[] iMinimumReturnAmount; // minimum amount out expcted after swaps For deposit tokens
address[] underlyingTokens;
uint256[] newProviders;
uint _deadline;
uint256 lpOut;
}
struct AaveRewardData {
address[] rewardTokens; // Tokens to be claimed
address[] underlyingTokens;
bytes32[][] proofs; // Merkle proofs for each claim
uint256[] rewardTokenAmount;
uint256[] minReturnAmounts; // Minimum return amounts for swaps to oToken
bytes[] swapData; // Optional: Swap data (e.g., Uniswap V3 paths) for each reward token
}
struct SwapDataStructure {
bytes[] firstIterationUnderlyingSwap;
bytes[] secondIterationUnderlyingSwap;
bytes[] firstIterationCumulativeSwap;
bytes[] secondIterationCumulativeSwap;
}
struct SwapDescription {
IERC20 srcToken;
IERC20 dstToken;
address payable srcReceiver;
address payable dstReceiver;
uint256 amount;
uint256 minReturnAmount;
uint256 flags;
}
/**
* @notice Function to initialize the data, owner and afi token related data.
* @dev the function should be called once only by factory
* @param newOwner indicates the owner of the created afi product.
* @param _name indicates the name of the afi Token
* @param _symbol indicates symbol of the the afi Token.
* @param data indicates the encoded data that follows the PoolsData struct format.
* @param _isActiveRebalanced indicates the active rebalance status of the afi contract.
* @param _aFiStorage indicates the afi storage contract address.
*/
function initialize(
address newOwner,
string memory _name,
string memory _symbol,
bytes memory data,
bool _isActiveRebalanced,
IAFiStorage _aFiStorage,
address[] memory _commonInputTokens,
address parentVault
) external;
/**
* @notice Function to initialize accepted tokens in deposit and withdraw functions.
* @dev the function should be called once only by factory
* @param iToken indicates the array of the accepted token addressess.
*/
function initializeToken(
address[] memory iToken,
address[] memory _teamWallets,
IPassiveRebal _rebalContract,
address _aFiManager
) external;
function getcSwapCounter() external view returns(uint256);
/**
* @notice Returns the array of underlying tokens.
* @return uTokensArray Array of underlying tokens.
*/
function getUTokens() external view returns (address[] memory uTokensArray);
function swapfromSelectiveDex(
address from,
address to,
uint amount,
uint deadline,
address midTok,
uint minimumReturnAmount,
bytes calldata _oneInchSwapData
) external returns (uint256 _amountOut);
/**
* @notice Returns the paused status of the contract.
*/
function isPaused() external view returns (bool, bool);
function getProportions()
external
view
returns (uint[] memory, uint[] memory);
/**
* @notice Updates the pool data during Active Rebalance.
* @param data that follows PoolsData format indicates the data of the token being rebalanced in Active Rebalance.
*/
function updatePoolData(bytes memory data) external;
function sendProfitOrFeeToManager(
address wallet,
uint profitShare,
address oToken
) external;
function _supplyAave(address tok, uint amount) external;
function _withdrawAave(address tok, uint amount) external;
function getTVLandRebalContractandType()
external
view
returns (uint256, address, uint256);
function getInputToken() external view returns (address[] memory, address[] memory);
function swap(
address inputToken,
address uTok,
uint256 amountAsPerProportion,
uint _deadline,
address middleToken,
uint256 minimumReturnAmount,
bytes calldata swapData
) external returns (uint256 returnAmount);
function updateDp(
uint256[] memory _defaultProportion,
uint256[] memory _uTokensProportion
) external;
function updateuTokAndProp(
address[] memory _uTokens
) external;
function underlyingTokensStaking() external;
function depositUserNav(address user) external view returns (uint256);
function setUnstakeData(uint256 totalQueuedShares) external returns (address[] memory, address[] memory, uint256, uint256);
function isOTokenWhitelisted(address oToken) external view returns (bool);
function validateWithdraw(address user, address oToken, uint256 _shares) external;
function updateLockedTokens(
address user,
uint256 amount,
bool lock,
bool queue,
bool unqueue,
uint256 newNAV
) external;
function updateTVL() external;
function updateInputTokens(address[] memory _inputTokens) external;
function reinitializeHappened(bool status) external;
function pauseUnpauseDeposit(bool status) external;
function getNonWithdrawableShares(address user, uint256 csCounterValue) external view returns(uint256);
function getReinitializeStatus() external view returns (bool vaultReInitialized);
function updateCp(uint256[] memory newCp) external;
function executeRouterCall(address tokenIn,
uint256 amountIn,
bytes calldata callData) external payable returns (uint256 lpOut);
function claimMerkleRewards(
address afiContract,
address rewardTokens,
uint256 rewardAmounts,
bytes32[] calldata proofs
) external returns (bool success);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.0;
/**
* @title IAFiStorage.
* @notice Interface of the AFiStorage.
*/
interface IIEarnManager {
function recommend(
address _token,
address afiBase,
address afiStorage
) external view returns (string memory choice, uint capr, uint aapr, uint dapr);
}
interface IAFiStorage {
/**
* @notice Struct representing investor details.
* @param isPresent Boolean indicating whether an investor exists.
* @param uTokenBalance Investor underlying token balance.
* @param investedAmount Amount of StableCoin invested in the underlying token
*/
struct Investor {
bool isPresent;
uint depositNAV;
uint redemptionNAV;
}
struct RedemptionParams {
address baseContract;
uint r;
address oToken;
uint256 cSwapCounter;
address[] uTokens;
address[] iTokens;
uint256 deadline;
uint256[] minimumReturnAmount;
uint256 _pool;
uint256 tSupply;
uint256 depositNAV;
uint256 minAmountOut;
}
/**
* @notice Struct representing TeamWallet details.
* @param isPresent Boolean indicating whether a wallet exists.
* @param isActive Boolean indicating whether a wallet is active.
* @param walletAddress Wallet address.
*/
struct TeamWallet {
bool isPresent;
bool isActive;
address walletAddress;
}
/**
* @notice Struct representing Rebalance details.
* @param scenario Scenario can be either of 0, 1 or 2.
* @param rebalancedUToken Address of the underlying token that is rebalanced.
* @param rebalancedToUTokens Array of addresses of underlying tokens to which the uToken has been rebalanced.
*/
struct RebalanceDetails {
uint8 scenario;
address rebalancedUToken;
address[] rebalancedToUTokens;
}
/**
* @param walletAddress Address of the wallet.
* @param isActive Boolean indicating wallet active status.
*/
event TeamWalletActive(address indexed walletAddress, bool isActive);
/**
* @param walletAddress Address of the wallet.
* @param isActive Boolean indicating wallet active status.
*/
event TeamWalletAdd(address indexed walletAddress, bool isActive);
/**
* @notice Returns the team wallet details.
* @param aFiContract Address of the AFi contract.
* @param _wallet Wallet address
* @return isPresent Boolean indicating the present status of the wallet.
* @return isActive Boolean indicating whether to set the wallet to either active/inactive.
*/
function getTeamWalletDetails(
address aFiContract,
address _wallet
) external view returns (bool isPresent, bool isActive);
function handleRedemption(
RedemptionParams memory params,
uint _shares,
uint swapMethod,
bytes[] calldata swapData,
bytes calldata pendleWithdrawData
) external returns (uint256 redemptionFromContract);
/**
* @notice To add a new team wallet.
* @param aFiContract Address of the AFi contract.
* @param _wallet Wallet address that has to be added in the `teamWallets` array.
* @param isActive Boolean indicating whether to set the wallet to either active/inactive.
* @param isPresent Boolean indicating the present status of the wallet.
*/
function addTeamWallet(
address aFiContract,
address _wallet,
bool isActive,
bool isPresent
) external;
/**
* @notice Returns the team wallets for an AFi.
* @param aFiContract Address of the AFi contract.
* @return _teamWallets Array of teamWallets.
*/
function getTeamWalletsOfAFi(
address aFiContract
) external view returns (address[] memory _teamWallets);
/**
* @notice Sets the address for team wallets.
* @param aFiContract Address of the AFi contract.
* @param _teamWallets Array of addresses for the team wallets.
*/
function setTeamWallets(address aFiContract, address[] memory _teamWallets) external;
/**
* @notice Sets the status for the AFi in the storage contract.
* @param aFiContract Address of the AFi contract.
* @param active status for afiContracts.
*/
function setAFiActive(address aFiContract, bool active) external;
/**
* @notice Sets Active Rebalance status of an AFi.
* @param aFiContract Address of the AFi contract.
* @param status indicating active rebalance status of the AFi contract.
*/
function setActiveRebalancedStatus(address aFiContract, bool status) external;
/**
* @notice gets Active Rebalance status of an AFi.
* @param aFiContract Address of the AFi contract.
* @return _isActiveRebalanced bool indicating active rebalance status of the AFi contract.
*/
function isAFiActiveRebalanced(
address aFiContract
) external view returns (bool _isActiveRebalanced);
function getTotalActiveWallets(address aFiContract) external view returns (uint);
function calcPoolValue(
address tok,
address afiContract
) external view returns (uint);
function calculateBalanceOfUnderlying(
address tok,
address afiContract
) external view returns (uint);
function calculatePoolInUsd(address afiContract) external view returns (uint);
function afiSync(
address afiContract,
address tok,
address aaveTok,
address _pendleMarketPalace
) external;
function getPriceInUSD(
address tok
) external view returns (uint256, uint256);
function validateAndGetDecimals(address tok) external view returns (uint256);
function getStakedStatus(
address aFiContract,
address uToken
) external view returns (bool);
function rearrange(
address aFiContract,
address[] memory underlyingTokens,
uint256[] memory newProviders,
bytes calldata pendleData
) external returns(uint256);
function swapForOtherProduct(
address afiContract,
uint r,
address oToken,
uint deadline,
uint[] memory minimumReturnAmount,
address[] memory uToken,
bytes calldata pendleWithdrawData
) external returns (uint256);
function _withdrawAll(address afiContract, address tok, bytes calldata pendleWithdrawData) external returns(bool);
function getAFiOracle() external view returns(address);
function calculateRedemptionFromContract(
address afiContract,
address tok,
uint256 r
) external view returns (uint256, bool, uint256, uint256, uint256);
function tvlRead(
address tok,
address afiContract
) external view returns (uint, uint256);
function getPreSwapDepositsTokens(
address aFiContract,
uint256 _cSwapCounter,
address stableToken
) external view returns (uint256);
function setPreDepositedInputToken(uint256 _cSwapCounter, uint256 _amount,address _oToken) external;
function setPreDepositedInputTokenInRebalance(
address aficontract,
uint256 _cSwapCounter,
uint256 _amount,
address _oToken
) external;
function convertInUSDAndTok(
address tok,
uint256 amt,
bool usd
) external view returns (uint256);
function calculateShares(
address afiContract,
uint256 amount,
uint256 prevPool,
uint256 _totalSupply,
address iToken,
uint256 currentDepositNAV,
uint256 prevBalance
) external view returns (uint256 shares, uint256 newDepositNAV);
function deletePreDepositedInputToken(
address aFiContract,
address oToken,
uint256 currentCounter
)external;
function doSwapForThewhiteListRemoval(
address tok,
uint256 _cSwapCounter,
address swapToken,
uint256 deadline,
uint256 minAmountOut,
bytes calldata swapData
) external;
function setPreDepositedInputTokenInReInitialize(
address aficontract,
uint256 _cSwapCounter,
uint256 _amount,
address _oToken
) external;
function getPendleStakeStatus(address atvContract, address token) external view returns (bool);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `from` to `to` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;
import "./IERC20.sol";
interface IERC20Extended is IERC20 {
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;
interface IPassiveRebal {
// Enum for supported DEXs
enum DexChoice {
UNISWAP_V3,
ONE_INCH,
NONE
}
function applyRebalForProportions(
address _aFiContract,
address _aFiManager,
address _aFiStorage,
address[] memory _tokens,
uint256 strategy
) external view returns (uint[] memory proportions, uint256 totalProp);
function getPauseStatus() external returns (bool);
function getRebalStrategyNumber(address aFiContract) external view returns (uint);
function uniswapV3Oracle(
address afiContract,
address _tokenIn,
address _tokenOut,
uint _amountIn,
uint _maxTime,
address middleToken,
uint256 minimumReturnAmount
) external returns (bytes memory swapParams);
function getMidToken(address tok) external view returns (address);
function upDateInputTokPool(address[] memory iToken, bytes memory uniData) external;
function getPriceOracle(address tok) external view returns (address);
function updateOracleData(
address _uToken,
address _oracleAddress
) external;
function removeToken(
address[] memory _nonOverlappingITokens,
address token
) external pure returns (address[] memory);
function initUniStructure(
address[] memory inputTokens,
bytes memory _poolData
) external;
function getDexType(address tokenIn, address tokenOut) external view returns (DexChoice);
function getPauseDepositController(address afiContract) external view returns (address);
function getStalePriceDelay(address uToken) external view returns (uint256);
function isSwapMethodPaused(address afiContract,uint swapMethod) external view returns (bool);
function getMinimumAmountOut(
address _tokenIn,
uint256 _amountIn,
address _tokenOut,
address _uniPool
) external view returns (uint256 amountOut);
function updateMidToken(address[] memory tok, address[] memory midTok) external;
function getPreSwapDepositLimit() external view returns (uint256);
function validateAndApplyRebalanceStrategy(
address afiContract,
address[] memory uTokens,
uint256 toSwap,
uint256 cSwapCounter
) external returns ( uint256 );
function getNormalizedLpToAssetRate(address market) external view returns (uint256);
}
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "./Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (access/Ownable2Step.sol)
pragma solidity ^0.8.0;
import "./Ownable.sol";
/**
* @dev Contract module which provides access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership} and {acceptOwnership}.
*
* This module is used through inheritance. It will make available all functions
* from parent (Ownable).
*/
abstract contract Ownable2Step is Ownable {
address internal _pendingOwner;
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner);
/**
* @dev Returns the address of the pending owner.
*/
function pendingOwner() public view virtual returns (address) {
return _pendingOwner;
}
// /**
// * @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
// * Can only be called by the current owner.
// */
// function transferOwnership(address newOwner) public virtual override onlyOwner {
// _pendingOwner = newOwner;
// emit OwnershipTransferStarted(owner(), newOwner);
// }
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`) and deletes any pending owner.
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual override {
delete _pendingOwner;
super._transferOwnership(newOwner);
}
/**
* @dev The new owner accepts the ownership transfer.
*/
function acceptOwnership() external {
address sender = _msgSender();
require(pendingOwner() == sender, "Ownable2Step: caller is not the new owner");
_transferOwnership(sender);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import {Ownable2Step} from "./Ownable2Step.sol";
contract OwnableDelayModule is Ownable2Step {
address internal delayModule;
constructor() {
delayModule = msg.sender;
}
function isDelayModule() internal view {
require(msg.sender == delayModule, "NA");
}
function setDelayModule(address _delayModule) external {
isDelayModule();
require(_delayModule != address(0), "ODZ");
delayModule = _delayModule;
}
function getDelayModule() external view returns (address) {
return delayModule;
}
/**
* @dev Starts the ownership transfer of the contract to a new account. Replaces the pending transfer if there is one.
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public override {
isDelayModule();
_pendingOwner = newOwner;
emit OwnershipTransferStarted(owner(), newOwner);
}
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_aTokenImplementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"afiContract","type":"address"},{"indexed":false,"internalType":"address","name":"utoken","type":"address"}],"name":"AddUnderlyingTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"}],"name":"TokenCreated","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"aFiProducts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"aTokenImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"aFiContract","type":"address"},{"internalType":"uint256","name":"order","type":"uint256"}],"name":"afiContractInitUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"afiProductsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"address[]","name":"_teamWallets","type":"address[]"},{"internalType":"bool","name":"_isActiveRebalanced","type":"bool"},{"internalType":"contract IAFiStorage","name":"_aFiStorage","type":"address"},{"internalType":"contract IPassiveRebal","name":"_rebalContract","type":"address"},{"internalType":"address","name":"_aFiManager","type":"address"},{"internalType":"address[]","name":"_nonOverlappingITokens","type":"address[]"},{"internalType":"address","name":"parentVault","type":"address"}],"name":"createAToken","outputs":[{"internalType":"address","name":"aTokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"_depositStableCoin","type":"address[]"},{"internalType":"address[]","name":"_depositCoinOracle","type":"address[]"},{"internalType":"bytes","name":"underlyingData","type":"bytes"},{"internalType":"address[]","name":"_pendleMarketPalace","type":"address[]"},{"internalType":"address[]","name":"_aaveToken","type":"address[]"},{"internalType":"address[]","name":"_priceOracles","type":"address[]"},{"internalType":"uint256[]","name":"_underlyingTokensProportion","type":"uint256[]"},{"internalType":"address[]","name":"compoundV3Comet","type":"address[]"},{"internalType":"uint256","name":"_typeOfProduct","type":"uint256"}],"internalType":"struct IAFi.PoolsData","name":"pooldata","type":"tuple"}],"name":"encodePoolData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"address[]","name":"_underlyingTokens","type":"address[]"},{"internalType":"address[]","name":"_underlyingUniPoolToken","type":"address[]"}],"internalType":"struct IAFi.UnderlyingData","name":"uData","type":"tuple"}],"name":"encodeUnderlyingData","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"aFiContract","type":"address"}],"name":"getAFiInitStatus","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_aFiContract","type":"address"}],"name":"getAFiTokenStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDelayModule","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"afiContract","type":"address"},{"internalType":"address","name":"afiStorage","type":"address"}],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initializeTokenStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"initilizeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isATokenPresent","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delayModule","type":"address"}],"name":"setDelayModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x608060405234801561000f575f5ffd5b50604051611acf380380611acf83398101604081905261002e91610121565b610037336100b6565b600280546001600160a01b031916331790556001600160a01b0381166100915760405162461bcd60e51b81526004016100889060208082526004908201526320a3181960e11b604082015260600190565b60405180910390fd5b600380546001600160a01b0319166001600160a01b039290921691909117905561014e565b600180546001600160a01b03191690556100cf816100d2565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f60208284031215610131575f5ffd5b81516001600160a01b0381168114610147575f5ffd5b9392505050565b6119748061015b5f395ff3fe608060405234801561000f575f5ffd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063d7f587031161006e578063d7f58703146102b3578063da444b23146102c4578063e30c3978146102d7578063e62d05c5146102e8578063f2fde38b1461033b575f5ffd5b80638da5cb5b146102485780639eb6bfe114610258578063b9d0a27f1461026b578063c4aa09d31461027e578063d0ba3e2714610291575f5ffd5b8063715018a6116100ef578063715018a6146101ec57806371bf7aca146101f657806372db07db1461021857806379ba50971461023857806389a32a5014610240575f5ffd5b806337cdc22e1461012b5780633d1f5caa146101625780634771f16c146101835780634a0c11fb146101ae578063534657e8146101d9575b5f5ffd5b61014d610139366004610cee565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610175610170366004610d10565b61034e565b604051908152602001610159565b61014d610191366004610cee565b6001600160a01b03165f9081526005602052604090205460ff1690565b6003546101c1906001600160a01b031681565b6040516001600160a01b039091168152602001610159565b6101c16101e7366004610d47565b610458565b6101f4610480565b005b61014d610204366004610cee565b60056020525f908152604090205460ff1681565b61022b610226366004610f30565b610493565b60405161015991906110fc565b6101f46104bc565b600454610175565b5f546001600160a01b03166101c1565b61022b61026636600461110e565b61053b565b6101f46102793660046111bf565b61054e565b6101f461028c366004610cee565b61068a565b61014d61029f366004610cee565b60066020525f908152604090205460ff1681565b6002546001600160a01b03166101c1565b6101c16102d23660046111f8565b6106f0565b6001546001600160a01b03166101c1565b6103246102f6366004610cee565b6001600160a01b03165f9081526006602090815260408083205460079092529091205460ff91821692911690565b604080519215158352901515602083015201610159565b6101f4610349366004610cee565b610a6d565b5f5f5f90505f846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610390573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b49190611329565b604051634aaad50560e11b81526001600160a01b03878116600483015291925090851690639555aa0a90602401602060405180830381865afa1580156103fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104209190611329565b9150805f0361043657620f424092505050610452565b8061044383612710611354565b61044d919061136b565b925050505b92915050565b60048181548110610467575f80fd5b5f918252602090912001546001600160a01b0316905081565b610488610add565b6104915f610b36565b565b6060816040516020016104a691906113fd565b6040516020818303038152906040529050919050565b60015433906001600160a01b0316811461052f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61053881610b36565b50565b6060816040516020016104a69190611505565b336001600160a01b0383161461058b5760405162461bcd60e51b81526020600482015260026024820152614e4160f01b6044820152606401610526565b8060010361060a576001600160a01b0382165f9081526006602052604090205460ff16156105e45760405162461bcd60e51b8152600401610526906020808252600490820152630414630360e41b604082015260600190565b6001600160a01b0382165f908152600660205260409020805460ff191660011790555050565b80600203610686576001600160a01b0382165f9081526007602052604090205460ff16156106635760405162461bcd60e51b8152600401610526906020808252600490820152630414630360e41b604082015260600190565b6001600160a01b0382165f908152600760205260409020805460ff191660011790555b5050565b610692610b4f565b6001600160a01b0381166106ce5760405162461bcd60e51b815260206004820152600360248201526227a22d60e91b6044820152606401610526565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106f9610add565b5f8980602001905181019061070e9190611649565b90508060600151518160c00151511480156107325750806080015151816060015151145b801561074757508060a0015151816080015151145b6107875760405162461bcd60e51b815260206004820152601160248201527041463a204172726179206c656e6774687360781b6044820152606401610526565b5f805b8260c00151518110156107ca578260c0015181815181106107ad576107ad6117e7565b6020026020010151826107c091906117fb565b915060010161078a565b508062989680146108065760405162461bcd60e51b8152600401610526906020808252600490820152634146303160e01b604082015260600190565b6001600160a01b03861661082c5760405162461bcd60e51b81526004016105269061180e565b6001600160a01b0388166108525760405162461bcd60e51b81526004016105269061180e565b61085b8a610b8e565b156108785760405162461bcd60e51b81526004016105269061180e565b5f8a51116108bb5760405162461bcd60e51b815260206004820152601060248201526f0828c744082e4e4c2f24098cadccee8d60831b6044820152606401610526565b6003546108d0906001600160a01b0316610be9565b9250600160055f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550600483908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001600160a01b0316632f9ba725338f8f8f8e8e8c8c6040518963ffffffff1660e01b815260040161098d989796959493929190611835565b5f604051808303815f87803b1580156109a4575f5ffd5b505af11580156109b6573d5f5f3e3d5ffd5b5050835160405163d291168b60e01b81526001600160a01b038716935063d291168b92506109ed91908e908c908c906004016118c8565b5f604051808303815f87803b158015610a04575f5ffd5b505af1158015610a16573d5f5f3e3d5ffd5b50505050826001600160a01b03167fffc04f682c7b287e4b552dacd4b833d7c33dc0549cd6da84388408e4830c05628e8e604051610a55929190611911565b60405180910390a250509a9950505050505050505050565b610a75610b4f565b600180546001600160a01b0383166001600160a01b03199091168117909155610aa55f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610526565b600180546001600160a01b031916905561053881610c80565b6002546001600160a01b031633146104915760405162461bcd60e51b81526020600482015260026024820152614e4160f01b6044820152606401610526565b80515f90815b81811015610be0575f6001600160a01b0316848281518110610bb857610bb86117e7565b60200260200101516001600160a01b031603610bd8575060019392505050565b600101610b94565b505f9392505050565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c175f526e5af43d82803e903d91602b57fd5bf38260781b17602052603760095ff090506001600160a01b038116610c7b5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610526565b919050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610538575f5ffd5b8035610c7b81610ccf565b5f60208284031215610cfe575f5ffd5b8135610d0981610ccf565b9392505050565b5f5f60408385031215610d21575f5ffd5b8235610d2c81610ccf565b91506020830135610d3c81610ccf565b809150509250929050565b5f60208284031215610d57575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715610d9557610d95610d5e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610dc357610dc3610d5e565b604052919050565b5f6001600160401b03821115610de357610de3610d5e565b5060051b60200190565b5f82601f830112610dfc575f5ffd5b8135610e0f610e0a82610dcb565b610d9b565b8082825260208201915060208360051b860101925085831115610e30575f5ffd5b602085015b83811015610e56578035610e4881610ccf565b835260209283019201610e35565b5095945050505050565b5f6001600160401b03821115610e7857610e78610d5e565b50601f01601f191660200190565b5f82601f830112610e95575f5ffd5b8135602083015f610ea8610e0a84610e60565b9050828152858383011115610ebb575f5ffd5b828260208301375f92810160200192909252509392505050565b5f82601f830112610ee4575f5ffd5b8135610ef2610e0a82610dcb565b8082825260208201915060208360051b860101925085831115610f13575f5ffd5b602085015b83811015610e56578035835260209283019201610f18565b5f60208284031215610f40575f5ffd5b81356001600160401b03811115610f55575f5ffd5b82016101208185031215610f67575f5ffd5b610f6f610d72565b81356001600160401b03811115610f84575f5ffd5b610f9086828501610ded565b82525060208201356001600160401b03811115610fab575f5ffd5b610fb786828501610ded565b60208301525060408201356001600160401b03811115610fd5575f5ffd5b610fe186828501610e86565b60408301525060608201356001600160401b03811115610fff575f5ffd5b61100b86828501610ded565b60608301525060808201356001600160401b03811115611029575f5ffd5b61103586828501610ded565b60808301525060a08201356001600160401b03811115611053575f5ffd5b61105f86828501610ded565b60a08301525060c08201356001600160401b0381111561107d575f5ffd5b61108986828501610ed5565b60c08301525060e08201356001600160401b038111156110a7575f5ffd5b6110b386828501610ded565b60e08301525061010091820135918101919091529392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d0960208301846110ce565b5f6020828403121561111e575f5ffd5b81356001600160401b03811115611133575f5ffd5b820160408185031215611144575f5ffd5b604080519081016001600160401b038111828210171561116657611166610d5e565b60405281356001600160401b0381111561117e575f5ffd5b61118a86828501610ded565b82525060208201356001600160401b038111156111a5575f5ffd5b6111b186828501610ded565b602083015250949350505050565b5f5f604083850312156111d0575f5ffd5b82356111db81610ccf565b946020939093013593505050565b80358015158114610c7b575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d031215611212575f5ffd5b8a356001600160401b03811115611227575f5ffd5b6112338d828e01610e86565b9a505060208b01356001600160401b0381111561124e575f5ffd5b61125a8d828e01610e86565b99505060408b01356001600160401b03811115611275575f5ffd5b6112818d828e01610e86565b98505060608b01356001600160401b0381111561129c575f5ffd5b6112a88d828e01610ded565b9750506112b760808c016111e9565b95506112c560a08c01610ce3565b94506112d360c08c01610ce3565b93506112e160e08c01610ce3565b92506101008b01356001600160401b038111156112fc575f5ffd5b6113088d828e01610ded565b9250506113186101208c01610ce3565b90509295989b9194979a5092959850565b5f60208284031215611339575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761045257610452611340565b5f8261138557634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b828110156113c35781516001600160a01b031686526020958601959091019060010161139c565b5093949350505050565b5f8151808452602084019350602083015f5b828110156113c35781518652602095860195909101906001016113df565b602081525f8251610120602084015261141a61014084018261138a565b90506020840151601f19848303016040850152611437828261138a565b9150506040840151601f1984830301606085015261145582826110ce565b9150506060840151601f19848303016080850152611473828261138a565b9150506080840151601f198483030160a0850152611491828261138a565b91505060a0840151601f198483030160c08501526114af828261138a565b91505060c0840151601f198483030160e08501526114cd82826113cd565b91505060e0840151601f19848303016101008501526114ec828261138a565b9150506101008401516101208401528091505092915050565b602081525f825160406020840152611520606084018261138a565b90506020840151601f1984830301604085015261044d828261138a565b5f82601f83011261154c575f5ffd5b815161155a610e0a82610dcb565b8082825260208201915060208360051b86010192508583111561157b575f5ffd5b602085015b83811015610e5657805161159381610ccf565b835260209283019201611580565b5f82601f8301126115b0575f5ffd5b81516115be610e0a82610e60565b8181528460208386010111156115d2575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f82601f8301126115fd575f5ffd5b815161160b610e0a82610dcb565b8082825260208201915060208360051b86010192508583111561162c575f5ffd5b602085015b83811015610e56578051835260209283019201611631565b5f60208284031215611659575f5ffd5b81516001600160401b0381111561166e575f5ffd5b82016101208185031215611680575f5ffd5b611688610d72565b81516001600160401b0381111561169d575f5ffd5b6116a98682850161153d565b82525060208201516001600160401b038111156116c4575f5ffd5b6116d08682850161153d565b60208301525060408201516001600160401b038111156116ee575f5ffd5b6116fa868285016115a1565b60408301525060608201516001600160401b03811115611718575f5ffd5b6117248682850161153d565b60608301525060808201516001600160401b03811115611742575f5ffd5b61174e8682850161153d565b60808301525060a08201516001600160401b0381111561176c575f5ffd5b6117788682850161153d565b60a08301525060c08201516001600160401b03811115611796575f5ffd5b6117a2868285016115ee565b60c08301525060e08201516001600160401b038111156117c0575f5ffd5b6117cc8682850161153d565b60e08301525061010091820151918101919091529392505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045257610452611340565b6020808252600d908201526c20a31d103d32b9379030b2323960991b604082015260600190565b6001600160a01b0389168152610100602082018190525f906118599083018a6110ce565b828103604084015261186b818a6110ce565b9050828103606084015261187f81896110ce565b87151560808501526001600160a01b03871660a085015283810360c085015290506118aa818661138a565b91505060018060a01b03831660e08301529998505050505050505050565b608081525f6118da608083018761138a565b82810360208401526118ec818761138a565b6001600160a01b03958616604085015293909416606090920191909152509392505050565b604081525f61192360408301856110ce565b828103602084015261193581856110ce565b9594505050505056fea2646970667358221220c9ee1a000fff27a6bb4d3492b0ba51918650170d7a8464b0fcae69a19a63622a64736f6c634300081e00330000000000000000000000000955b91424208c699d85cda85644736143b68dc4
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610127575f3560e01c80638da5cb5b116100a9578063d7f587031161006e578063d7f58703146102b3578063da444b23146102c4578063e30c3978146102d7578063e62d05c5146102e8578063f2fde38b1461033b575f5ffd5b80638da5cb5b146102485780639eb6bfe114610258578063b9d0a27f1461026b578063c4aa09d31461027e578063d0ba3e2714610291575f5ffd5b8063715018a6116100ef578063715018a6146101ec57806371bf7aca146101f657806372db07db1461021857806379ba50971461023857806389a32a5014610240575f5ffd5b806337cdc22e1461012b5780633d1f5caa146101625780634771f16c146101835780634a0c11fb146101ae578063534657e8146101d9575b5f5ffd5b61014d610139366004610cee565b60076020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b610175610170366004610d10565b61034e565b604051908152602001610159565b61014d610191366004610cee565b6001600160a01b03165f9081526005602052604090205460ff1690565b6003546101c1906001600160a01b031681565b6040516001600160a01b039091168152602001610159565b6101c16101e7366004610d47565b610458565b6101f4610480565b005b61014d610204366004610cee565b60056020525f908152604090205460ff1681565b61022b610226366004610f30565b610493565b60405161015991906110fc565b6101f46104bc565b600454610175565b5f546001600160a01b03166101c1565b61022b61026636600461110e565b61053b565b6101f46102793660046111bf565b61054e565b6101f461028c366004610cee565b61068a565b61014d61029f366004610cee565b60066020525f908152604090205460ff1681565b6002546001600160a01b03166101c1565b6101c16102d23660046111f8565b6106f0565b6001546001600160a01b03166101c1565b6103246102f6366004610cee565b6001600160a01b03165f9081526006602090815260408083205460079092529091205460ff91821692911690565b604080519215158352901515602083015201610159565b6101f4610349366004610cee565b610a6d565b5f5f5f90505f846001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610390573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b49190611329565b604051634aaad50560e11b81526001600160a01b03878116600483015291925090851690639555aa0a90602401602060405180830381865afa1580156103fc573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104209190611329565b9150805f0361043657620f424092505050610452565b8061044383612710611354565b61044d919061136b565b925050505b92915050565b60048181548110610467575f80fd5b5f918252602090912001546001600160a01b0316905081565b610488610add565b6104915f610b36565b565b6060816040516020016104a691906113fd565b6040516020818303038152906040529050919050565b60015433906001600160a01b0316811461052f5760405162461bcd60e51b815260206004820152602960248201527f4f776e61626c6532537465703a2063616c6c6572206973206e6f7420746865206044820152683732bb9037bbb732b960b91b60648201526084015b60405180910390fd5b61053881610b36565b50565b6060816040516020016104a69190611505565b336001600160a01b0383161461058b5760405162461bcd60e51b81526020600482015260026024820152614e4160f01b6044820152606401610526565b8060010361060a576001600160a01b0382165f9081526006602052604090205460ff16156105e45760405162461bcd60e51b8152600401610526906020808252600490820152630414630360e41b604082015260600190565b6001600160a01b0382165f908152600660205260409020805460ff191660011790555050565b80600203610686576001600160a01b0382165f9081526007602052604090205460ff16156106635760405162461bcd60e51b8152600401610526906020808252600490820152630414630360e41b604082015260600190565b6001600160a01b0382165f908152600760205260409020805460ff191660011790555b5050565b610692610b4f565b6001600160a01b0381166106ce5760405162461bcd60e51b815260206004820152600360248201526227a22d60e91b6044820152606401610526565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b5f6106f9610add565b5f8980602001905181019061070e9190611649565b90508060600151518160c00151511480156107325750806080015151816060015151145b801561074757508060a0015151816080015151145b6107875760405162461bcd60e51b815260206004820152601160248201527041463a204172726179206c656e6774687360781b6044820152606401610526565b5f805b8260c00151518110156107ca578260c0015181815181106107ad576107ad6117e7565b6020026020010151826107c091906117fb565b915060010161078a565b508062989680146108065760405162461bcd60e51b8152600401610526906020808252600490820152634146303160e01b604082015260600190565b6001600160a01b03861661082c5760405162461bcd60e51b81526004016105269061180e565b6001600160a01b0388166108525760405162461bcd60e51b81526004016105269061180e565b61085b8a610b8e565b156108785760405162461bcd60e51b81526004016105269061180e565b5f8a51116108bb5760405162461bcd60e51b815260206004820152601060248201526f0828c744082e4e4c2f24098cadccee8d60831b6044820152606401610526565b6003546108d0906001600160a01b0316610be9565b9250600160055f856001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff021916908315150217905550600483908060018154018082558091505060019003905f5260205f20015f9091909190916101000a8154816001600160a01b0302191690836001600160a01b03160217905550826001600160a01b0316632f9ba725338f8f8f8e8e8c8c6040518963ffffffff1660e01b815260040161098d989796959493929190611835565b5f604051808303815f87803b1580156109a4575f5ffd5b505af11580156109b6573d5f5f3e3d5ffd5b5050835160405163d291168b60e01b81526001600160a01b038716935063d291168b92506109ed91908e908c908c906004016118c8565b5f604051808303815f87803b158015610a04575f5ffd5b505af1158015610a16573d5f5f3e3d5ffd5b50505050826001600160a01b03167fffc04f682c7b287e4b552dacd4b833d7c33dc0549cd6da84388408e4830c05628e8e604051610a55929190611911565b60405180910390a250509a9950505050505050505050565b610a75610b4f565b600180546001600160a01b0383166001600160a01b03199091168117909155610aa55f546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b5f546001600160a01b031633146104915760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610526565b600180546001600160a01b031916905561053881610c80565b6002546001600160a01b031633146104915760405162461bcd60e51b81526020600482015260026024820152614e4160f01b6044820152606401610526565b80515f90815b81811015610be0575f6001600160a01b0316848281518110610bb857610bb86117e7565b60200260200101516001600160a01b031603610bd8575060019392505050565b600101610b94565b505f9392505050565b5f763d602d80600a3d3981f3363d3d373d3d3d363d730000008260601b60e81c175f526e5af43d82803e903d91602b57fd5bf38260781b17602052603760095ff090506001600160a01b038116610c7b5760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b6044820152606401610526565b919050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0381168114610538575f5ffd5b8035610c7b81610ccf565b5f60208284031215610cfe575f5ffd5b8135610d0981610ccf565b9392505050565b5f5f60408385031215610d21575f5ffd5b8235610d2c81610ccf565b91506020830135610d3c81610ccf565b809150509250929050565b5f60208284031215610d57575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405161012081016001600160401b0381118282101715610d9557610d95610d5e565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610dc357610dc3610d5e565b604052919050565b5f6001600160401b03821115610de357610de3610d5e565b5060051b60200190565b5f82601f830112610dfc575f5ffd5b8135610e0f610e0a82610dcb565b610d9b565b8082825260208201915060208360051b860101925085831115610e30575f5ffd5b602085015b83811015610e56578035610e4881610ccf565b835260209283019201610e35565b5095945050505050565b5f6001600160401b03821115610e7857610e78610d5e565b50601f01601f191660200190565b5f82601f830112610e95575f5ffd5b8135602083015f610ea8610e0a84610e60565b9050828152858383011115610ebb575f5ffd5b828260208301375f92810160200192909252509392505050565b5f82601f830112610ee4575f5ffd5b8135610ef2610e0a82610dcb565b8082825260208201915060208360051b860101925085831115610f13575f5ffd5b602085015b83811015610e56578035835260209283019201610f18565b5f60208284031215610f40575f5ffd5b81356001600160401b03811115610f55575f5ffd5b82016101208185031215610f67575f5ffd5b610f6f610d72565b81356001600160401b03811115610f84575f5ffd5b610f9086828501610ded565b82525060208201356001600160401b03811115610fab575f5ffd5b610fb786828501610ded565b60208301525060408201356001600160401b03811115610fd5575f5ffd5b610fe186828501610e86565b60408301525060608201356001600160401b03811115610fff575f5ffd5b61100b86828501610ded565b60608301525060808201356001600160401b03811115611029575f5ffd5b61103586828501610ded565b60808301525060a08201356001600160401b03811115611053575f5ffd5b61105f86828501610ded565b60a08301525060c08201356001600160401b0381111561107d575f5ffd5b61108986828501610ed5565b60c08301525060e08201356001600160401b038111156110a7575f5ffd5b6110b386828501610ded565b60e08301525061010091820135918101919091529392505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610d0960208301846110ce565b5f6020828403121561111e575f5ffd5b81356001600160401b03811115611133575f5ffd5b820160408185031215611144575f5ffd5b604080519081016001600160401b038111828210171561116657611166610d5e565b60405281356001600160401b0381111561117e575f5ffd5b61118a86828501610ded565b82525060208201356001600160401b038111156111a5575f5ffd5b6111b186828501610ded565b602083015250949350505050565b5f5f604083850312156111d0575f5ffd5b82356111db81610ccf565b946020939093013593505050565b80358015158114610c7b575f5ffd5b5f5f5f5f5f5f5f5f5f5f6101408b8d031215611212575f5ffd5b8a356001600160401b03811115611227575f5ffd5b6112338d828e01610e86565b9a505060208b01356001600160401b0381111561124e575f5ffd5b61125a8d828e01610e86565b99505060408b01356001600160401b03811115611275575f5ffd5b6112818d828e01610e86565b98505060608b01356001600160401b0381111561129c575f5ffd5b6112a88d828e01610ded565b9750506112b760808c016111e9565b95506112c560a08c01610ce3565b94506112d360c08c01610ce3565b93506112e160e08c01610ce3565b92506101008b01356001600160401b038111156112fc575f5ffd5b6113088d828e01610ded565b9250506113186101208c01610ce3565b90509295989b9194979a5092959850565b5f60208284031215611339575f5ffd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761045257610452611340565b5f8261138557634e487b7160e01b5f52601260045260245ffd5b500490565b5f8151808452602084019350602083015f5b828110156113c35781516001600160a01b031686526020958601959091019060010161139c565b5093949350505050565b5f8151808452602084019350602083015f5b828110156113c35781518652602095860195909101906001016113df565b602081525f8251610120602084015261141a61014084018261138a565b90506020840151601f19848303016040850152611437828261138a565b9150506040840151601f1984830301606085015261145582826110ce565b9150506060840151601f19848303016080850152611473828261138a565b9150506080840151601f198483030160a0850152611491828261138a565b91505060a0840151601f198483030160c08501526114af828261138a565b91505060c0840151601f198483030160e08501526114cd82826113cd565b91505060e0840151601f19848303016101008501526114ec828261138a565b9150506101008401516101208401528091505092915050565b602081525f825160406020840152611520606084018261138a565b90506020840151601f1984830301604085015261044d828261138a565b5f82601f83011261154c575f5ffd5b815161155a610e0a82610dcb565b8082825260208201915060208360051b86010192508583111561157b575f5ffd5b602085015b83811015610e5657805161159381610ccf565b835260209283019201611580565b5f82601f8301126115b0575f5ffd5b81516115be610e0a82610e60565b8181528460208386010111156115d2575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f82601f8301126115fd575f5ffd5b815161160b610e0a82610dcb565b8082825260208201915060208360051b86010192508583111561162c575f5ffd5b602085015b83811015610e56578051835260209283019201611631565b5f60208284031215611659575f5ffd5b81516001600160401b0381111561166e575f5ffd5b82016101208185031215611680575f5ffd5b611688610d72565b81516001600160401b0381111561169d575f5ffd5b6116a98682850161153d565b82525060208201516001600160401b038111156116c4575f5ffd5b6116d08682850161153d565b60208301525060408201516001600160401b038111156116ee575f5ffd5b6116fa868285016115a1565b60408301525060608201516001600160401b03811115611718575f5ffd5b6117248682850161153d565b60608301525060808201516001600160401b03811115611742575f5ffd5b61174e8682850161153d565b60808301525060a08201516001600160401b0381111561176c575f5ffd5b6117788682850161153d565b60a08301525060c08201516001600160401b03811115611796575f5ffd5b6117a2868285016115ee565b60c08301525060e08201516001600160401b038111156117c0575f5ffd5b6117cc8682850161153d565b60e08301525061010091820151918101919091529392505050565b634e487b7160e01b5f52603260045260245ffd5b8082018082111561045257610452611340565b6020808252600d908201526c20a31d103d32b9379030b2323960991b604082015260600190565b6001600160a01b0389168152610100602082018190525f906118599083018a6110ce565b828103604084015261186b818a6110ce565b9050828103606084015261187f81896110ce565b87151560808501526001600160a01b03871660a085015283810360c085015290506118aa818661138a565b91505060018060a01b03831660e08301529998505050505050505050565b608081525f6118da608083018761138a565b82810360208401526118ec818761138a565b6001600160a01b03958616604085015293909416606090920191909152509392505050565b604081525f61192360408301856110ce565b828103602084015261193581856110ce565b9594505050505056fea2646970667358221220c9ee1a000fff27a6bb4d3492b0ba51918650170d7a8464b0fcae69a19a63622a64736f6c634300081e0033
Deployed Bytecode Sourcemap
318:5619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;546:53;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;706:14:11;;699:22;681:41;;669:2;654:18;546:53:0;;;;;;;;4651:383;;;;;;:::i;:::-;;:::i;:::-;;;1272:25:11;;;1260:2;1245:18;4651:383:0;1126:177:11;5807:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;5899:29:0;5879:4;5899:29;;;:15;:29;;;;;;;;;5807:127;365:35;;;;;-1:-1:-1;;;;;365:35:0;;;;;;-1:-1:-1;;;;;1472:32:11;;;1454:51;;1442:2;1427:18;365:35:0;1308:203:11;405:28:0;;;;;;:::i;:::-;;:::i;1884:103:8:-;;;:::i;:::-;;442:47:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4235:145;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1810:210:9:-;;;:::i;1212:95:0:-;1283:11;:18;1212:95;;1236:87:8;1282:7;1309:6;-1:-1:-1;;;;;1309:6:8;1236:87;;4495:150:0;;;;;;:::i;:::-;;:::i;5132:396::-;;;;;;:::i;:::-;;:::i;349:165:10:-;;;;;;:::i;:::-;;:::i;494:47:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;520:89:10;592:11;;-1:-1:-1;;;;;592:11:10;520:89;;1963:1848:0;;;;;;:::i;:::-;;:::i;874:101:9:-;954:13;;-1:-1:-1;;;;;954:13:9;874:101;;5633:168:0;;;;;;:::i;:::-;-1:-1:-1;;;;;5730:28:0;5703:4;5730:28;;;:15;:28;;;;;;;;;5760:21;:34;;;;;;;5730:28;;;;;5760:34;;;5633:168;;;;;10831:14:11;;10824:22;10806:41;;10890:14;;10883:22;10878:2;10863:18;;10856:50;10779:18;5633:168:0;10644:268:11;798:175:10;;;;;;:::i;:::-;;:::i;4651:383:0:-;4758:4;4771:10;4784:1;4771:14;;4792:20;4822:11;-1:-1:-1;;;;;4815:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4863:55;;-1:-1:-1;;;4863:55:0;;-1:-1:-1;;;;;1472:32:11;;;4863:55:0;;;1454:51:11;4792:56:0;;-1:-1:-1;4863:42:0;;;;;;1427:18:11;;4863:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4855:63;;4931:12;4947:1;4931:17;4927:54;;4966:7;4959:14;;;;;;4927:54;5015:12;4995:15;:5;5004;4995:15;:::i;:::-;4994:34;;;;:::i;:::-;4987:41;;;;4651:383;;;;;:::o;405:28::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;405:28:0;;-1:-1:-1;405:28:0;:::o;1884:103:8:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;4235:145:0:-;4324:12;4364:8;4353:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;4345:29;;4235:145;;;:::o;1810:210:9:-;954:13;;736:10:2;;-1:-1:-1;;;;;954:13:9;1905:24;;1897:78;;;;-1:-1:-1;;;1897:78:9;;14614:2:11;1897:78:9;;;14596:21:11;14653:2;14633:18;;;14626:30;14692:34;14672:18;;;14665:62;-1:-1:-1;;;14743:18:11;;;14736:39;14792:19;;1897:78:9;;;;;;;;;1986:26;2005:6;1986:18;:26::i;:::-;1846:174;1810:210::o;4495:150:0:-;4592:12;4632:5;4621:17;;;;;;;;:::i;5132:396::-;5220:10;-1:-1:-1;;;;;5220:25:0;;;5212:40;;;;-1:-1:-1;;;5212:40:0;;15594:2:11;5212:40:0;;;15576:21:11;15633:1;15613:18;;;15606:29;-1:-1:-1;;;15651:18:11;;;15644:32;15693:18;;5212:40:0;15392:325:11;5212:40:0;5263:5;5272:1;5263:10;5259:264;;-1:-1:-1;;;;;5293:28:0;;;;;;:15;:28;;;;;;;;5292:29;5284:46;;;;-1:-1:-1;;;5284:46:0;;;;;;15924:2:11;15906:21;;;15963:1;15943:18;;;15936:29;-1:-1:-1;;;15996:2:11;15981:18;;15974:34;16040:2;16025:18;;15722:327;5284:46:0;-1:-1:-1;;;;;5339:28:0;;;;;;:15;:28;;;;;:35;;-1:-1:-1;;5339:35:0;5370:4;5339:35;;;5132:396;;:::o;5259:264::-;5392:5;5401:1;5392:10;5388:135;;-1:-1:-1;;;;;5422:34:0;;;;;;:21;:34;;;;;;;;5421:35;5413:52;;;;-1:-1:-1;;;5413:52:0;;;;;;15924:2:11;15906:21;;;15963:1;15943:18;;;15936:29;-1:-1:-1;;;15996:2:11;15981:18;;15974:34;16040:2;16025:18;;15722:327;5413:52:0;-1:-1:-1;;;;;5474:34:0;;;;;;:21;:34;;;;;:41;;-1:-1:-1;;5474:41:0;5511:4;5474:41;;;5388:135;5132:396;;:::o;349:165:10:-;411:15;:13;:15::i;:::-;-1:-1:-1;;;;;441:26:10;;433:42;;;;-1:-1:-1;;;433:42:10;;16256:2:11;433:42:10;;;16238:21:11;16295:1;16275:18;;;16268:29;-1:-1:-1;;;16313:18:11;;;16306:33;16356:18;;433:42:10;16054:326:11;433:42:10;482:11;:26;;-1:-1:-1;;;;;;482:26:10;-1:-1:-1;;;;;482:26:10;;;;;;;;;;349:165::o;1963:1848:0:-;2326:21;1122:13:8;:11;:13::i;:::-;2356:30:0::1;2400:4;2389:34;;;;;;;;;;;;:::i;:::-;2356:67;;2493:8;:28;;;:35;2446:8;:36;;;:43;:82;:160;;;;;2580:8;:19;;;:26;2541:8;:28;;;:35;:65;2446:160;:232;;;;;2649:8;:22;;;:29;2619:8;:19;;;:26;:59;2446:232;2430:283;;;::::0;-1:-1:-1;;;2430:283:0;;20706:2:11;2430:283:0::1;::::0;::::1;20688:21:11::0;20745:2;20725:18;;;20718:30;-1:-1:-1;;;20764:18:11;;;20757:47;20821:18;;2430:283:0::1;20504:341:11::0;2430:283:0::1;2777:23;::::0;2807:149:::1;2831:8;:36;;;:43;2827:1;:47;2807:149;;;2909:8;:36;;;2946:1;2909:39;;;;;;;;:::i;:::-;;;;;;;2890:58;;;;;:::i;:::-;::::0;-1:-1:-1;2876:3:0::1;;2807:149;;;;2970:15;2989:8;2970:27;2962:44;;;;-1:-1:-1::0;;;2962:44:0::1;;;;;;21314:2:11::0;21296:21;;;21353:1;21333:18;;;21326:29;-1:-1:-1;;;21386:2:11;21371:18;;21364:34;21430:2;21415:18;;21112:327;2962:44:0::1;-1:-1:-1::0;;;;;3021:25:0;::::1;3013:51;;;;-1:-1:-1::0;;;3013:51:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3079:34:0;::::1;3071:60;;;;-1:-1:-1::0;;;3071:60:0::1;;;;;;;:::i;:::-;3147:33;3167:12;3147:19;:33::i;:::-;3146:34;3138:60;;;;-1:-1:-1::0;;;3138:60:0::1;;;;;;;:::i;:::-;3235:1;3213:12;:19;:23;3205:52;;;::::0;-1:-1:-1;;;3205:52:0;;21988:2:11;3205:52:0::1;::::0;::::1;21970:21:11::0;22027:2;22007:18;;;22000:30;-1:-1:-1;;;22046:18:11;;;22039:46;22102:18;;3205:52:0::1;21786:340:11::0;3205:52:0::1;3293:20;::::0;3280:34:::1;::::0;-1:-1:-1;;;;;3293:20:0::1;3280:12;:34::i;:::-;3264:50;;3354:4;3321:15;:30;3337:13;-1:-1:-1::0;;;;;3321:30:0::1;-1:-1:-1::0;;;;;3321:30:0::1;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;3365:11;3382:13;3365:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;3365:31:0::1;;;;;-1:-1:-1::0;;;;;3365:31:0::1;;;;;;3408:13;-1:-1:-1::0;;;;;3403:30:0::1;;3442:10;3461:5;3475:7;3491:4;3504:19;3532:11;3552:22;3583:11;3403:198;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;3652:27:0;;3608:142:::1;::::0;-1:-1:-1;;;3608:142:0;;-1:-1:-1;;;;;3608:35:0;::::1;::::0;-1:-1:-1;3608:35:0::1;::::0;-1:-1:-1;3608:142:0::1;::::0;3652:27;3688:12;;3709:14;;3732:11;;3608:142:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3775:13;-1:-1:-1::0;;;;;3762:43:0::1;;3790:5;3797:7;3762:43;;;;;;;:::i;:::-;;;;;;;;2349:1462;;1963:1848:::0;;;;;;;;;;;;:::o;798:175:10:-;866:15;:13;:15::i;:::-;888:13;:24;;-1:-1:-1;;;;;888:24:10;;-1:-1:-1;;;;;;888:24:10;;;;;;;;949:7;1282::8;1309:6;-1:-1:-1;;;;;1309:6:8;;1236:87;949:7:10;-1:-1:-1;;;;;924:43:10;;;;;;;;;;;798:175;:::o;1401:132:8:-;1282:7;1309:6;-1:-1:-1;;;;;1309:6:8;736:10:2;1465:23:8;1457:68;;;;-1:-1:-1;;;1457:68:8;;24555:2:11;1457:68:8;;;24537:21:11;;;24574:18;;;24567:30;24633:34;24613:18;;;24606:62;24685:18;;1457:68:8;24353:356:11;1569:156:9;1659:13;1652:20;;-1:-1:-1;;;;;;1652:20:9;;;1683:34;1708:8;1683:24;:34::i;251:92:10:-;319:11;;-1:-1:-1;;;;;319:11:10;305:10;:25;297:40;;;;-1:-1:-1;;;297:40:10;;15594:2:11;297:40:10;;;15576:21:11;15633:1;15613:18;;;15606:29;-1:-1:-1;;;15651:18:11;;;15644:32;15693:18;;297:40:10;15392:325:11;3817:303:0;3952:21;;3912:20;;;3980:116;4001:3;3997:1;:7;3980:116;;;4053:1;-1:-1:-1;;;;;4024:31:0;:14;4039:1;4024:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4024:31:0;;4020:69;;-1:-1:-1;4075:4:0;;3817:303;-1:-1:-1;;;3817:303:0:o;4020:69::-;4006:3;;3980:116;;;-1:-1:-1;4109:5:0;;3817:303;-1:-1:-1;;;3817:303:0:o;996:770:1:-;1053:16;1390:48;1372:14;1366:4;1362:25;1356:4;1352:36;1349:90;1343:4;1336:104;1599:32;1582:14;1576:4;1572:25;1569:63;1563:4;1556:77;1675:4;1669;1666:1;1659:21;1647:33;-1:-1:-1;;;;;;1709:22:1;;1701:57;;;;-1:-1:-1;;;1701:57:1;;24916:2:11;1701:57:1;;;24898:21:11;24955:2;24935:18;;;24928:30;-1:-1:-1;;;24974:18:11;;;24967:52;25036:18;;1701:57:1;24714:346:11;1701:57:1;996:770;;;:::o;2503:191:8:-;2577:16;2596:6;;-1:-1:-1;;;;;2613:17:8;;;-1:-1:-1;;;;;;2613:17:8;;;;;;2646:40;;2596:6;;;;;;;2646:40;;2577:16;2646:40;2566:128;2503:191;:::o;14:131:11:-;-1:-1:-1;;;;;89:31:11;;79:42;;69:70;;135:1;132;125:12;150:134;218:20;;247:31;218:20;247:31;:::i;289:247::-;348:6;401:2;389:9;380:7;376:23;372:32;369:52;;;417:1;414;407:12;369:52;456:9;443:23;475:31;500:5;475:31;:::i;:::-;525:5;289:247;-1:-1:-1;;;289:247:11:o;733:388::-;801:6;809;862:2;850:9;841:7;837:23;833:32;830:52;;;878:1;875;868:12;830:52;917:9;904:23;936:31;961:5;936:31;:::i;:::-;986:5;-1:-1:-1;1043:2:11;1028:18;;1015:32;1056:33;1015:32;1056:33;:::i;:::-;1108:7;1098:17;;;733:388;;;;;:::o;1516:226::-;1575:6;1628:2;1616:9;1607:7;1603:23;1599:32;1596:52;;;1644:1;1641;1634:12;1596:52;-1:-1:-1;1689:23:11;;1516:226;-1:-1:-1;1516:226:11:o;1747:127::-;1808:10;1803:3;1799:20;1796:1;1789:31;1839:4;1836:1;1829:15;1863:4;1860:1;1853:15;1879:255;1951:2;1945:9;1993:6;1981:19;;-1:-1:-1;;;;;2015:34:11;;2051:22;;;2012:62;2009:88;;;2077:18;;:::i;:::-;2113:2;2106:22;1879:255;:::o;2139:275::-;2210:2;2204:9;2275:2;2256:13;;-1:-1:-1;;2252:27:11;2240:40;;-1:-1:-1;;;;;2295:34:11;;2331:22;;;2292:62;2289:88;;;2357:18;;:::i;:::-;2393:2;2386:22;2139:275;;-1:-1:-1;2139:275:11:o;2419:183::-;2479:4;-1:-1:-1;;;;;2504:6:11;2501:30;2498:56;;;2534:18;;:::i;:::-;-1:-1:-1;2579:1:11;2575:14;2591:4;2571:25;;2419:183::o;2607:744::-;2661:5;2714:3;2707:4;2699:6;2695:17;2691:27;2681:55;;2732:1;2729;2722:12;2681:55;2772:6;2759:20;2799:64;2815:47;2855:6;2815:47;:::i;:::-;2799:64;:::i;:::-;2887:3;2911:6;2906:3;2899:19;2943:4;2938:3;2934:14;2927:21;;3004:4;2994:6;2991:1;2987:14;2979:6;2975:27;2971:38;2957:52;;3032:3;3024:6;3021:15;3018:35;;;3049:1;3046;3039:12;3018:35;3085:4;3077:6;3073:17;3099:221;3115:6;3110:3;3107:15;3099:221;;;3197:3;3184:17;3214:31;3239:5;3214:31;:::i;:::-;3258:18;;3305:4;3296:14;;;;3132;3099:221;;;-1:-1:-1;3338:7:11;2607:744;-1:-1:-1;;;;;2607:744:11:o;3356:186::-;3404:4;-1:-1:-1;;;;;3429:6:11;3426:30;3423:56;;;3459:18;;:::i;:::-;-1:-1:-1;3525:2:11;3504:15;-1:-1:-1;;3500:29:11;3531:4;3496:40;;3356:186::o;3547:516::-;3589:5;3642:3;3635:4;3627:6;3623:17;3619:27;3609:55;;3660:1;3657;3650:12;3609:55;3700:6;3687:20;3739:4;3731:6;3727:17;3768:1;3789:52;3805:35;3833:6;3805:35;:::i;3789:52::-;3778:63;;3866:6;3857:7;3850:23;3906:3;3897:6;3892:3;3888:16;3885:25;3882:45;;;3923:1;3920;3913:12;3882:45;3974:6;3969:3;3962:4;3953:7;3949:18;3936:45;4030:1;4001:20;;;4023:4;3997:31;3990:42;;;;-1:-1:-1;4005:7:11;3547:516;-1:-1:-1;;;3547:516:11:o;4068:723::-;4122:5;4175:3;4168:4;4160:6;4156:17;4152:27;4142:55;;4193:1;4190;4183:12;4142:55;4233:6;4220:20;4260:64;4276:47;4316:6;4276:47;:::i;4260:64::-;4348:3;4372:6;4367:3;4360:19;4404:4;4399:3;4395:14;4388:21;;4465:4;4455:6;4452:1;4448:14;4440:6;4436:27;4432:38;4418:52;;4493:3;4485:6;4482:15;4479:35;;;4510:1;4507;4500:12;4479:35;4546:4;4538:6;4534:17;4560:200;4576:6;4571:3;4568:15;4560:200;;;4668:17;;4698:18;;4745:4;4736:14;;;;4593;4560:200;;4796:2126;4881:6;4934:2;4922:9;4913:7;4909:23;4905:32;4902:52;;;4950:1;4947;4940:12;4902:52;4990:9;4977:23;-1:-1:-1;;;;;5015:6:11;5012:30;5009:50;;;5055:1;5052;5045:12;5009:50;5078:22;;5134:6;5116:16;;;5112:29;5109:49;;;5154:1;5151;5144:12;5109:49;5180:22;;:::i;:::-;5240:2;5227:16;-1:-1:-1;;;;;5258:8:11;5255:32;5252:52;;;5300:1;5297;5290:12;5252:52;5327:56;5375:7;5364:8;5360:2;5356:17;5327:56;:::i;:::-;5320:5;5313:71;;5430:2;5426;5422:11;5409:25;-1:-1:-1;;;;;5449:8:11;5446:32;5443:52;;;5491:1;5488;5481:12;5443:52;5527:56;5575:7;5564:8;5560:2;5556:17;5527:56;:::i;:::-;5522:2;5515:5;5511:14;5504:80;;5630:2;5626;5622:11;5609:25;-1:-1:-1;;;;;5649:8:11;5646:32;5643:52;;;5691:1;5688;5681:12;5643:52;5727:44;5763:7;5752:8;5748:2;5744:17;5727:44;:::i;:::-;5722:2;5715:5;5711:14;5704:68;;5818:2;5814;5810:11;5797:25;-1:-1:-1;;;;;5837:8:11;5834:32;5831:52;;;5879:1;5876;5869:12;5831:52;5915:56;5963:7;5952:8;5948:2;5944:17;5915:56;:::i;:::-;5910:2;5903:5;5899:14;5892:80;;6018:3;6014:2;6010:12;5997:26;-1:-1:-1;;;;;6038:8:11;6035:32;6032:52;;;6080:1;6077;6070:12;6032:52;6117:56;6165:7;6154:8;6150:2;6146:17;6117:56;:::i;:::-;6111:3;6104:5;6100:15;6093:81;;6220:3;6216:2;6212:12;6199:26;-1:-1:-1;;;;;6240:8:11;6237:32;6234:52;;;6282:1;6279;6272:12;6234:52;6319:56;6367:7;6356:8;6352:2;6348:17;6319:56;:::i;:::-;6313:3;6306:5;6302:15;6295:81;;6422:3;6418:2;6414:12;6401:26;-1:-1:-1;;;;;6442:8:11;6439:32;6436:52;;;6484:1;6481;6474:12;6436:52;6521:56;6569:7;6558:8;6554:2;6550:17;6521:56;:::i;:::-;6515:3;6508:5;6504:15;6497:81;;6624:3;6620:2;6616:12;6603:26;-1:-1:-1;;;;;6644:8:11;6641:32;6638:52;;;6686:1;6683;6676:12;6638:52;6723:56;6771:7;6760:8;6756:2;6752:17;6723:56;:::i;:::-;6717:3;6706:15;;6699:81;-1:-1:-1;6846:3:11;6838:12;;;6825:26;6867:15;;;6860:32;;;;6710:5;4796:2126;-1:-1:-1;;;4796:2126:11:o;6927:288::-;6968:3;7006:5;7000:12;7033:6;7028:3;7021:19;7089:6;7082:4;7075:5;7071:16;7064:4;7059:3;7055:14;7049:47;7141:1;7134:4;7125:6;7120:3;7116:16;7112:27;7105:38;7204:4;7197:2;7193:7;7188:2;7180:6;7176:15;7172:29;7167:3;7163:39;7159:50;7152:57;;;6927:288;;;;:::o;7220:217::-;7367:2;7356:9;7349:21;7330:4;7387:44;7427:2;7416:9;7412:18;7404:6;7387:44;:::i;7442:1008::-;7532:6;7585:2;7573:9;7564:7;7560:23;7556:32;7553:52;;;7601:1;7598;7591:12;7553:52;7641:9;7628:23;-1:-1:-1;;;;;7666:6:11;7663:30;7660:50;;;7706:1;7703;7696:12;7660:50;7729:22;;7785:4;7767:16;;;7763:27;7760:47;;;7803:1;7800;7793:12;7760:47;7856:4;7850:11;;;7888:17;;-1:-1:-1;;;;;7920:34:11;;7956:22;;;7917:62;7914:88;;;7982:18;;:::i;:::-;8018:4;8011:24;8060:16;;-1:-1:-1;;;;;8088:32:11;;8085:52;;;8133:1;8130;8123:12;8085:52;8161:56;8209:7;8198:8;8194:2;8190:17;8161:56;:::i;:::-;8153:6;8146:72;;8264:2;8260;8256:11;8243:25;-1:-1:-1;;;;;8283:8:11;8280:32;8277:52;;;8325:1;8322;8315:12;8277:52;8362:56;8410:7;8399:8;8395:2;8391:17;8362:56;:::i;:::-;8357:2;8345:15;;8338:81;-1:-1:-1;8349:6:11;7442:1008;-1:-1:-1;;;;7442:1008:11:o;8455:367::-;8523:6;8531;8584:2;8572:9;8563:7;8559:23;8555:32;8552:52;;;8600:1;8597;8590:12;8552:52;8639:9;8626:23;8658:31;8683:5;8658:31;:::i;:::-;8708:5;8786:2;8771:18;;;;8758:32;;-1:-1:-1;;;8455:367:11:o;8827:160::-;8892:20;;8948:13;;8941:21;8931:32;;8921:60;;8977:1;8974;8967:12;8992:1647;9250:6;9258;9266;9274;9282;9290;9298;9306;9314;9322;9375:3;9363:9;9354:7;9350:23;9346:33;9343:53;;;9392:1;9389;9382:12;9343:53;9432:9;9419:23;-1:-1:-1;;;;;9457:6:11;9454:30;9451:50;;;9497:1;9494;9487:12;9451:50;9520:49;9561:7;9552:6;9541:9;9537:22;9520:49;:::i;:::-;9510:59;;;9622:2;9611:9;9607:18;9594:32;-1:-1:-1;;;;;9641:8:11;9638:32;9635:52;;;9683:1;9680;9673:12;9635:52;9706:51;9749:7;9738:8;9727:9;9723:24;9706:51;:::i;:::-;9696:61;;;9810:2;9799:9;9795:18;9782:32;-1:-1:-1;;;;;9829:8:11;9826:32;9823:52;;;9871:1;9868;9861:12;9823:52;9894:51;9937:7;9926:8;9915:9;9911:24;9894:51;:::i;:::-;9884:61;;;9998:2;9987:9;9983:18;9970:32;-1:-1:-1;;;;;10017:8:11;10014:32;10011:52;;;10059:1;10056;10049:12;10011:52;10082:63;10137:7;10126:8;10115:9;10111:24;10082:63;:::i;:::-;10072:73;;;10164:36;10195:3;10184:9;10180:19;10164:36;:::i;:::-;10154:46;;10219:39;10253:3;10242:9;10238:19;10219:39;:::i;:::-;10209:49;;10277:39;10311:3;10300:9;10296:19;10277:39;:::i;:::-;10267:49;;10335:39;10369:3;10358:9;10354:19;10335:39;:::i;:::-;10325:49;;10427:3;10416:9;10412:19;10399:33;-1:-1:-1;;;;;10447:8:11;10444:32;10441:52;;;10489:1;10486;10479:12;10441:52;10512:63;10567:7;10556:8;10545:9;10541:24;10512:63;:::i;:::-;10502:73;;;10594:39;10628:3;10617:9;10613:19;10594:39;:::i;:::-;10584:49;;8992:1647;;;;;;;;;;;;;:::o;10917:230::-;10987:6;11040:2;11028:9;11019:7;11015:23;11011:32;11008:52;;;11056:1;11053;11046:12;11008:52;-1:-1:-1;11101:16:11;;10917:230;-1:-1:-1;10917:230:11:o;11152:127::-;11213:10;11208:3;11204:20;11201:1;11194:31;11244:4;11241:1;11234:15;11268:4;11265:1;11258:15;11284:168;11357:9;;;11388;;11405:15;;;11399:22;;11385:37;11375:71;;11426:18;;:::i;11457:217::-;11497:1;11523;11513:132;;11567:10;11562:3;11558:20;11555:1;11548:31;11602:4;11599:1;11592:15;11630:4;11627:1;11620:15;11513:132;-1:-1:-1;11659:9:11;;11457:217::o;11679:446::-;11732:3;11770:5;11764:12;11797:6;11792:3;11785:19;11829:4;11824:3;11820:14;11813:21;;11868:4;11861:5;11857:16;11891:1;11901:199;11915:6;11912:1;11909:13;11901:199;;;11980:13;;-1:-1:-1;;;;;11976:39:11;11964:52;;12045:4;12036:14;;;;12073:17;;;;12012:1;11930:9;11901:199;;;-1:-1:-1;12116:3:11;;11679:446;-1:-1:-1;;;;11679:446:11:o;12130:420::-;12183:3;12221:5;12215:12;12248:6;12243:3;12236:19;12280:4;12275:3;12271:14;12264:21;;12319:4;12312:5;12308:16;12342:1;12352:173;12366:6;12363:1;12360:13;12352:173;;;12427:13;;12415:26;;12470:4;12461:14;;;;12498:17;;;;12388:1;12381:9;12352:173;;12555:1852;12736:2;12725:9;12718:21;12699:4;12774:6;12768:13;12817:6;12812:2;12801:9;12797:18;12790:34;12847:63;12905:3;12894:9;12890:19;12876:12;12847:63;:::i;:::-;12833:77;;12959:2;12951:6;12947:15;12941:22;13031:2;13027:7;13015:9;13007:6;13003:22;12999:36;12994:2;12983:9;12979:18;12972:64;13059:52;13104:6;13088:14;13059:52;:::i;:::-;13045:66;;;13160:2;13152:6;13148:15;13142:22;13232:2;13228:7;13216:9;13208:6;13204:22;13200:36;13195:2;13184:9;13180:18;13173:64;13260:40;13293:6;13277:14;13260:40;:::i;:::-;13246:54;;;13349:2;13341:6;13337:15;13331:22;13422:2;13418:7;13406:9;13398:6;13394:22;13390:36;13384:3;13373:9;13369:19;13362:65;13450:52;13495:6;13479:14;13450:52;:::i;:::-;13436:66;;;13551:3;13543:6;13539:16;13533:23;13625:2;13621:7;13609:9;13601:6;13597:22;13593:36;13587:3;13576:9;13572:19;13565:65;13653:52;13698:6;13682:14;13653:52;:::i;:::-;13639:66;;;13754:3;13746:6;13742:16;13736:23;13828:2;13824:7;13812:9;13804:6;13800:22;13796:36;13790:3;13779:9;13775:19;13768:65;13856:52;13901:6;13885:14;13856:52;:::i;:::-;13842:66;;;13957:3;13949:6;13945:16;13939:23;14031:2;14027:7;14015:9;14007:6;14003:22;13999:36;13993:3;13982:9;13978:19;13971:65;14059:52;14104:6;14088:14;14059:52;:::i;:::-;14045:66;;;14160:3;14152:6;14148:16;14142:23;14234:2;14230:7;14218:9;14210:6;14206:22;14202:36;14196:3;14185:9;14181:19;14174:65;14262:52;14307:6;14291:14;14262:52;:::i;:::-;14248:66;;;14372:3;14364:6;14360:16;14354:23;14345:6;14334:9;14330:22;14323:55;14395:6;14387:14;;;12555:1852;;;;:::o;14822:565::-;15013:2;15002:9;14995:21;14976:4;15051:6;15045:13;15094:4;15089:2;15078:9;15074:18;15067:32;15122:62;15180:2;15169:9;15165:18;15151:12;15122:62;:::i;:::-;15108:76;;15233:2;15225:6;15221:15;15215:22;15307:2;15303:7;15291:9;15283:6;15279:22;15275:36;15268:4;15257:9;15253:20;15246:66;15329:52;15374:6;15358:14;15329:52;:::i;16385:741::-;16450:5;16503:3;16496:4;16488:6;16484:17;16480:27;16470:55;;16521:1;16518;16511:12;16470:55;16554:6;16548:13;16581:64;16597:47;16637:6;16597:47;:::i;16581:64::-;16669:3;16693:6;16688:3;16681:19;16725:4;16720:3;16716:14;16709:21;;16786:4;16776:6;16773:1;16769:14;16761:6;16757:27;16753:38;16739:52;;16814:3;16806:6;16803:15;16800:35;;;16831:1;16828;16821:12;16800:35;16867:4;16859:6;16855:17;16881:214;16897:6;16892:3;16889:15;16881:214;;;16972:3;16966:10;16989:31;17014:5;16989:31;:::i;:::-;17033:18;;17080:4;17071:14;;;;16914;16881:214;;17131:483;17184:5;17237:3;17230:4;17222:6;17218:17;17214:27;17204:55;;17255:1;17252;17245:12;17204:55;17288:6;17282:13;17319:52;17335:35;17363:6;17335:35;:::i;17319:52::-;17396:6;17387:7;17380:23;17450:3;17443:4;17434:6;17426;17422:19;17418:30;17415:39;17412:59;;;17467:1;17464;17457:12;17412:59;17525:6;17518:4;17510:6;17506:17;17499:4;17490:7;17486:18;17480:52;17581:1;17552:20;;;17574:4;17548:31;17541:42;;;;17556:7;17131:483;-1:-1:-1;;;17131:483:11:o;17619:720::-;17684:5;17737:3;17730:4;17722:6;17718:17;17714:27;17704:55;;17755:1;17752;17745:12;17704:55;17788:6;17782:13;17815:64;17831:47;17871:6;17831:47;:::i;17815:64::-;17903:3;17927:6;17922:3;17915:19;17959:4;17954:3;17950:14;17943:21;;18020:4;18010:6;18007:1;18003:14;17995:6;17991:27;17987:38;17973:52;;18048:3;18040:6;18037:15;18034:35;;;18065:1;18062;18055:12;18034:35;18101:4;18093:6;18089:17;18115:193;18131:6;18126:3;18123:15;18115:193;;;18223:10;;18246:18;;18293:4;18284:14;;;;18148;18115:193;;18344:2155;18440:6;18493:2;18481:9;18472:7;18468:23;18464:32;18461:52;;;18509:1;18506;18499:12;18461:52;18542:9;18536:16;-1:-1:-1;;;;;18567:6:11;18564:30;18561:50;;;18607:1;18604;18597:12;18561:50;18630:22;;18686:6;18668:16;;;18664:29;18661:49;;;18706:1;18703;18696:12;18661:49;18732:22;;:::i;:::-;18785:2;18779:9;-1:-1:-1;;;;;18803:8:11;18800:32;18797:52;;;18845:1;18842;18835:12;18797:52;18872:67;18931:7;18920:8;18916:2;18912:17;18872:67;:::i;:::-;18865:5;18858:82;;18979:2;18975;18971:11;18965:18;-1:-1:-1;;;;;18998:8:11;18995:32;18992:52;;;19040:1;19037;19030:12;18992:52;19076:67;19135:7;19124:8;19120:2;19116:17;19076:67;:::i;:::-;19071:2;19064:5;19060:14;19053:91;;19183:2;19179;19175:11;19169:18;-1:-1:-1;;;;;19202:8:11;19199:32;19196:52;;;19244:1;19241;19234:12;19196:52;19280:55;19327:7;19316:8;19312:2;19308:17;19280:55;:::i;:::-;19275:2;19268:5;19264:14;19257:79;;19375:2;19371;19367:11;19361:18;-1:-1:-1;;;;;19394:8:11;19391:32;19388:52;;;19436:1;19433;19426:12;19388:52;19472:67;19531:7;19520:8;19516:2;19512:17;19472:67;:::i;:::-;19467:2;19460:5;19456:14;19449:91;;19579:3;19575:2;19571:12;19565:19;-1:-1:-1;;;;;19599:8:11;19596:32;19593:52;;;19641:1;19638;19631:12;19593:52;19678:67;19737:7;19726:8;19722:2;19718:17;19678:67;:::i;:::-;19672:3;19665:5;19661:15;19654:92;;19785:3;19781:2;19777:12;19771:19;-1:-1:-1;;;;;19805:8:11;19802:32;19799:52;;;19847:1;19844;19837:12;19799:52;19884:67;19943:7;19932:8;19928:2;19924:17;19884:67;:::i;:::-;19878:3;19871:5;19867:15;19860:92;;19991:3;19987:2;19983:12;19977:19;-1:-1:-1;;;;;20011:8:11;20008:32;20005:52;;;20053:1;20050;20043:12;20005:52;20090:67;20149:7;20138:8;20134:2;20130:17;20090:67;:::i;:::-;20084:3;20077:5;20073:15;20066:92;;20197:3;20193:2;20189:12;20183:19;-1:-1:-1;;;;;20217:8:11;20214:32;20211:52;;;20259:1;20256;20249:12;20211:52;20296:67;20355:7;20344:8;20340:2;20336:17;20296:67;:::i;:::-;20290:3;20279:15;;20272:92;-1:-1:-1;20423:3:11;20415:12;;;20409:19;20444:15;;;20437:32;;;;20283:5;18344:2155;-1:-1:-1;;;18344:2155:11:o;20850:127::-;20911:10;20906:3;20902:20;20899:1;20892:31;20942:4;20939:1;20932:15;20966:4;20963:1;20956:15;20982:125;21047:9;;;21068:10;;;21065:36;;;21081:18;;:::i;21444:337::-;21646:2;21628:21;;;21685:2;21665:18;;;21658:30;-1:-1:-1;;;21719:2:11;21704:18;;21697:43;21772:2;21757:18;;21444:337::o;22131:1143::-;-1:-1:-1;;;;;22578:32:11;;22560:51;;22647:3;22642:2;22627:18;;22620:31;;;-1:-1:-1;;22674:45:11;;22699:19;;22691:6;22674:45;:::i;:::-;22767:9;22759:6;22755:22;22750:2;22739:9;22735:18;22728:50;22801:32;22826:6;22818;22801:32;:::i;:::-;22787:46;;22881:9;22873:6;22869:22;22864:2;22853:9;22849:18;22842:50;22915:32;22940:6;22932;22915:32;:::i;:::-;22991:14;;22984:22;22978:3;22963:19;;22956:51;-1:-1:-1;;;;;23044:32:11;;23064:3;23023:19;;23016:61;23114:22;;;23108:3;23093:19;;23086:51;22901:46;-1:-1:-1;23154:44:11;22901:46;23183:6;23154:44;:::i;:::-;23146:52;;;23264:1;23260;23255:3;23251:11;23247:19;23239:6;23235:32;23229:3;23218:9;23214:19;23207:61;22131:1143;;;;;;;;;;;:::o;23279:683::-;23614:3;23603:9;23596:22;23577:4;23641:57;23693:3;23682:9;23678:19;23670:6;23641:57;:::i;:::-;23746:9;23738:6;23734:22;23729:2;23718:9;23714:18;23707:50;23774:44;23811:6;23803;23774:44;:::i;:::-;-1:-1:-1;;;;;23854:32:11;;;23849:2;23834:18;;23827:60;23923:32;;;;23918:2;23903:18;;;23896:60;;;;-1:-1:-1;23766:52:11;23279:683;-1:-1:-1;;;23279:683:11:o;23967:381::-;24164:2;24153:9;24146:21;24127:4;24190:44;24230:2;24219:9;24215:18;24207:6;24190:44;:::i;:::-;24282:9;24274:6;24270:22;24265:2;24254:9;24250:18;24243:50;24310:32;24335:6;24327;24310:32;:::i;:::-;24302:40;23967:381;-1:-1:-1;;;;;23967:381:11:o
Swarm Source
ipfs://c9ee1a000fff27a6bb4d3492b0ba51918650170d7a8464b0fcae69a19a63622a
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$18.54
Net Worth in S
Token Allocations
USDC
100.00%
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ARB | 100.00% | $0.999858 | 18.5435 | $18.54 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.