Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 12 from a total of 12 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy | 4720455 | 90 days ago | IN | 0 S | 0.1830671 | ||||
Deploy | 4718498 | 90 days ago | IN | 0 S | 0.1830671 | ||||
Deploy | 4292605 | 93 days ago | IN | 0 S | 0.3663455 | ||||
Deploy | 4292531 | 93 days ago | IN | 0 S | 0.4240611 | ||||
Deploy | 4273768 | 93 days ago | IN | 0 S | 0.3663293 | ||||
Deploy | 4238816 | 93 days ago | IN | 0 S | 0.4307095 | ||||
Deploy | 4197507 | 94 days ago | IN | 0 S | 0.3666479 | ||||
Deploy | 4196103 | 94 days ago | IN | 0 S | 0.3666479 | ||||
Deploy | 4069046 | 95 days ago | IN | 0 S | 0.11863678 | ||||
Deploy | 3128599 | 101 days ago | IN | 0 S | 0.01833239 | ||||
Deploy | 3023184 | 102 days ago | IN | 0 S | 0.01833227 | ||||
Deploy | 2857048 | 103 days ago | IN | 0 S | 0.02135193 |
Latest 24 internal transactions
Parent Transaction Hash | Block | Age | From | To | Amount | |
---|---|---|---|---|---|---|
4720455 | 90 days ago | 0 S | ||||
4720455 | 90 days ago | 0 S | ||||
4718498 | 90 days ago | 0 S | ||||
4718498 | 90 days ago | 0 S | ||||
4292605 | 93 days ago | 0 S | ||||
4292605 | 93 days ago | 0 S | ||||
4292531 | 93 days ago | 0 S | ||||
4292531 | 93 days ago | 0 S | ||||
4273768 | 93 days ago | 0 S | ||||
4273768 | 93 days ago | 0 S | ||||
4238816 | 93 days ago | 0 S | ||||
4238816 | 93 days ago | 0 S | ||||
4197507 | 94 days ago | 0 S | ||||
4197507 | 94 days ago | 0 S | ||||
4196103 | 94 days ago | 0 S | ||||
4196103 | 94 days ago | 0 S | ||||
4069046 | 95 days ago | 0 S | ||||
4069046 | 95 days ago | 0 S | ||||
3128599 | 101 days ago | 0 S | ||||
3128599 | 101 days ago | 0 S | ||||
3023184 | 102 days ago | 0 S | ||||
3023184 | 102 days ago | 0 S | ||||
2857048 | 103 days ago | 0 S | ||||
2857048 | 103 days ago | 0 S |
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.
Contract Source Code Verified (Exact Match)
Contract Name:
SiloDeployer
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity 0.8.28;import {Clones} from "openzeppelin5/proxy/Clones.sol";import {ISiloConfig} from "silo-core/contracts/interfaces/ISiloConfig.sol";import {ISiloFactory} from "silo-core/contracts/interfaces/ISiloFactory.sol";import {IInterestRateModelV2} from "silo-core/contracts/interfaces/IInterestRateModelV2.sol";import {IInterestRateModelV2Factory} from "silo-core/contracts/interfaces/IInterestRateModelV2Factory.sol";import {IHookReceiver} from "silo-core/contracts/interfaces/IHookReceiver.sol";import {ISiloDeployer} from "silo-core/contracts/interfaces/ISiloDeployer.sol";import {SiloConfig} from "silo-core/contracts/SiloConfig.sol";import {CloneDeterministic} from "silo-core/contracts/lib/CloneDeterministic.sol";import {Views} from "silo-core/contracts/lib/Views.sol";/// @notice Silo Deployercontract SiloDeployer is ISiloDeployer {// solhint-disable var-name-mixedcaseIInterestRateModelV2Factory public immutable IRM_CONFIG_FACTORY;ISiloFactory public immutable SILO_FACTORY;address public immutable SILO_IMPL;address public immutable SHARE_PROTECTED_COLLATERAL_TOKEN_IMPL;address public immutable SHARE_DEBT_TOKEN_IMPL;// solhint-enable var-name-mixedcaseconstructor(
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (proxy/Clones.sol)pragma solidity ^0.8.20;import {Errors} from "../utils/Errors.sol";/*** @dev https://eips.ethereum.org/EIPS/eip-1167[ERC-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.*/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) {return clone(implementation, 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {ISilo} from "./ISilo.sol";import {ICrossReentrancyGuard} from "./ICrossReentrancyGuard.sol";interface ISiloConfig is ICrossReentrancyGuard {struct InitData {/// @notice Can be address zero if deployer fees are not to be collected. If deployer address is zero then/// deployer fee must be zero as well. Deployer will be minted an NFT that gives the right to claim deployer/// fees. NFT can be transferred with the right to claim.address deployer;/// @notice Address of the hook receiver called on every before/after action on Silo. Hook contract also/// implements liquidation logic and veSilo gauge connection.address hookReceiver;/// @notice Deployer's fee in 18 decimals points. Deployer will earn this fee based on the interest earned/// by the Silo. Max deployer fee is set by the DAO. At deployment it is 15%.uint256 deployerFee;/// @notice DAO's fee in 18 decimals points. DAO will earn this fee based on the interest earned/// by the Silo. Acceptable fee range fee is set by the DAO. Default at deployment is 5% - 50%.uint256 daoFee;/// @notice Address of the first token
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IERC721} from "openzeppelin5/interfaces/IERC721.sol";import {ISiloConfig} from "./ISiloConfig.sol";interface ISiloFactory is IERC721 {struct Range {uint128 min;uint128 max;}/// @notice Emitted on the creation of a Silo./// @param implementation Address of the Silo implementation./// @param token0 Address of the first Silo token./// @param token1 Address of the second Silo token./// @param silo0 Address of the first Silo./// @param silo1 Address of the second Silo./// @param siloConfig Address of the SiloConfig.event NewSilo(address indexed implementation,address indexed token0,address indexed token1,address silo0,address silo1,address siloConfig
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IInterestRateModelV2Config} from "./IInterestRateModelV2Config.sol";interface IInterestRateModelV2 {struct Config {// uopt ∈ (0, 1) – optimal utilization;int256 uopt;// ucrit ∈ (uopt, 1) – threshold of large utilization;int256 ucrit;// ulow ∈ (0, uopt) – threshold of low utilizationint256 ulow;// ki > 0 – integrator gainint256 ki;// kcrit > 0 – proportional gain for large utilizationint256 kcrit;// klow ≥ 0 – proportional gain for low utilizationint256 klow;// klin ≥ 0 – coefficient of the lower linear boundint256 klin;// beta ≥ 0 - a scaling factorint256 beta;// ri ≥ 0 – initial value of the integratorint112 ri;// Tcrit ≥ 0 - initial value of the time during which the utilization exceeds the critical value
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IInterestRateModelV2} from "./IInterestRateModelV2.sol";interface IInterestRateModelV2Factory {/// @dev config hash and IRM should be easily accessible directly from oracle contractevent NewInterestRateModelV2(bytes32 indexed configHash, IInterestRateModelV2 indexed irm);/// @dev verifies config and creates IRM config contract/// @notice it can be used in separate tx eg config can be prepared before it will be used for Silo creation/// @param _config IRM configuration/// @return configHash the hashed config used as a key for IRM contract/// @return irm deployed (or existing one, depends on the config) contract addressfunction create(IInterestRateModelV2.Config calldata _config)externalreturns (bytes32 configHash, IInterestRateModelV2 irm);/// @dev DP is 18 decimal points used for integer calculations// solhint-disable-next-line func-name-mixedcasefunction DP() external view returns (uint256);/// @dev verifies if config has correct values for a model, throws on invalid `_config`/// @param _config config that will ve verifiedfunction verifyConfig(IInterestRateModelV2.Config calldata _config) external view;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {ISiloConfig} from "./ISiloConfig.sol";interface IHookReceiver {struct HookConfig {uint24 hooksBefore;uint24 hooksAfter;}event HookConfigured(address silo, uint24 hooksBefore, uint24 hooksAfter);/// @notice Initialize a hook receiver/// @param _siloConfig Silo configuration with all the details about the silo/// @param _data Data to initialize the hook receiver (if needed)function initialize(ISiloConfig _siloConfig, bytes calldata _data) external;/// @notice state of Silo before action, can be also without interest, if you need them, call silo.accrueInterest()function beforeAction(address _silo, uint256 _action, bytes calldata _input) external;function afterAction(address _silo, uint256 _action, bytes calldata _inputAndOutput) external;/// @notice return hooksBefore and hooksAfter configurationfunction hookReceiverConfig(address _silo) external view returns (uint24 hooksBefore, uint24 hooksAfter);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.8.0;import {IInterestRateModelV2} from "./IInterestRateModelV2.sol";import {ISiloConfig} from "./ISiloConfig.sol";/// @notice Silo Deployerinterface ISiloDeployer {/// @dev Details of the oracle creation transactionstruct OracleCreationTxData {address deployed; // if oracle is already deployed, this will be the address to useaddress factory; // oracle factory (chainlinkV3, uniswapV3, etc)bytes txInput; // fn input `abi.encodeCall(fn, params...)`}/// @dev Hook receiver to be cloned and initialized during the Silo creationstruct ClonableHookReceiver {address implementation;bytes initializationData;}/// @dev Oracles to be create during the Silo creation./// If an oracle for the provided config is already created an oracle factory will return its address.struct Oracles {OracleCreationTxData solvencyOracle0;OracleCreationTxData maxLtvOracle0;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity 0.8.28;import {IERC20} from "openzeppelin5/token/ERC20/IERC20.sol";import {ISilo} from "./interfaces/ISilo.sol";import {ISiloConfig} from "./interfaces/ISiloConfig.sol";import {CrossReentrancyGuard} from "./utils/CrossReentrancyGuard.sol";import {Hook} from "./lib/Hook.sol";/// @notice SiloConfig stores full configuration of Silo in immutable manner/// @dev Immutable contract is more expensive to deploy than minimal proxy however it provides nearly 10x cheaper/// data access using immutable variables.contract SiloConfig is ISiloConfig, CrossReentrancyGuard {using Hook for uint256;uint256 public immutable SILO_ID;uint256 internal immutable _DAO_FEE;uint256 internal immutable _DEPLOYER_FEE;address internal immutable _HOOK_RECEIVER;// TOKEN #0address internal immutable _SILO0;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity 0.8.28;import {Clones} from "openzeppelin5/proxy/Clones.sol";/// @title Deterministic clones library for the silo market deployment./// @dev This library is used to deploy deterministic clones of:/// Silo (SILO_0, SILO_1)/// ShareProtectedCollateralToken (SHARE_PROTECTED_COLLATERAL_TOKEN_0, SHARE_PROTECTED_COLLATERAL_TOKEN_1)/// ShareDebtToken (SHARE_DEBT_TOKEN_0, SHARE_DEBT_TOKEN_1)library CloneDeterministic {/// @dev Deterministic salt for Silo0bytes32 private constant _SILO_0 = keccak256("create2.salt.Silo0");/// @dev Deterministic salt for ShareProtectedCollateralToken Silo0bytes32 private constant _SHARE_PROTECTED_COLLATERAL_TOKEN_0 = keccak256("create2.salt.ShareProtectedCollateralToken0");/// @dev Deterministic salt for ShareDebtToken Silo0bytes32 private constant _SHARE_DEBT_TOKEN_0 = keccak256("create2.salt.ShareDebtToken0");/// @dev Deterministic salt for Silo1bytes32 private constant _SILO_1 = keccak256("create2.salt.Silo1");/// @dev Deterministic salt for ShareProtectedCollateralToken Silo1bytes32 private constant _SHARE_PROTECTED_COLLATERAL_TOKEN_1 = keccak256("create2.salt.ShareProtectedCollateralToken1");/// @dev Deterministic salt for ShareDebtToken Silo1
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {IERC20} from "openzeppelin5/token/ERC20/IERC20.sol";import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {ISilo} from "../interfaces/ISilo.sol";import {ISiloOracle} from "../interfaces/ISiloOracle.sol";import {IShareToken} from "../interfaces/IShareToken.sol";import {ISiloFactory} from "../interfaces/ISiloFactory.sol";import {SiloERC4626Lib} from "./SiloERC4626Lib.sol";import {SiloSolvencyLib} from "./SiloSolvencyLib.sol";import {SiloLendingLib} from "./SiloLendingLib.sol";import {SiloStdLib} from "./SiloStdLib.sol";import {SiloMathLib} from "./SiloMathLib.sol";import {Rounding} from "./Rounding.sol";import {ShareTokenLib} from "./ShareTokenLib.sol";import {SiloStorageLib} from "./SiloStorageLib.sol";// solhint-disable orderinglibrary Views {uint256 internal constant _100_PERCENT = 1e18;bytes32 internal constant _FLASHLOAN_CALLBACK = keccak256("ERC3156FlashBorrower.onFlashLoan");
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;/*** @dev Collection of common custom errors used in multiple contracts** IMPORTANT: Backwards compatibility is not guaranteed in future versions of the library.* It is recommended to avoid relying on the error API for critical functionality.*/library Errors {/*** @dev The ETH balance of the account is not enough to perform the operation.*/error InsufficientBalance(uint256 balance, uint256 needed);/*** @dev A call to an address target failed. The target may have reverted.*/error FailedCall();/*** @dev The deployment failed.*/error FailedDeployment();}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IERC4626, IERC20, IERC20Metadata} from "openzeppelin5/interfaces/IERC4626.sol";import {IERC3156FlashLender} from "./IERC3156FlashLender.sol";import {ISiloConfig} from "./ISiloConfig.sol";import {ISiloFactory} from "./ISiloFactory.sol";import {IHookReceiver} from "./IHookReceiver.sol";// solhint-disable orderinginterface ISilo is IERC20, IERC4626, IERC3156FlashLender {/// @dev Interest accrual happens on each deposit/withdraw/borrow/repay. View methods work on storage that might be/// outdate. Some calculations require accrued interest to return current state of Silo. This struct is used/// to make a decision inside functions if interest should be accrued in memory to work on updated values.enum AccrueInterestInMemory {No,Yes}/// @dev Silo has two separate oracles for solvency and maxLtv calculations. MaxLtv oracle is optional. Solvency/// oracle can also be optional if asset is used as denominator in Silo config. For example, in ETH/USDC Silo/// one could setup only solvency oracle for ETH that returns price in USDC. Then USDC does not need an oracle/// because it's used as denominator for ETH and it's "price" can be assume as 1.enum OracleType {
123456789101112131415161718// SPDX-License-Identifier: MITpragma solidity >=0.5.0;interface ICrossReentrancyGuard {error CrossReentrantCall();error CrossReentrancyNotActive();/// @notice only silo method for cross Silo reentrancyfunction turnOnReentrancyProtection() external;/// @notice only silo method for cross Silo reentrancyfunction turnOffReentrancyProtection() external;/// @notice view method for checking cross Silo reentrancy flag/// @return entered true if the reentrancy guard is currently set to "entered", which indicates there is a/// `nonReentrant` function in the call stack.function reentrancyGuardEntered() external view returns (bool entered);}
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC721.sol)pragma solidity ^0.8.20;import {IERC721} from "../token/ERC721/IERC721.sol";
123456789// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IInterestRateModelV2} from "./IInterestRateModelV2.sol";interface IInterestRateModelV2Config {/// @return config returns immutable IRM configuration that is present in contractfunction getConfig() external view returns (IInterestRateModelV2.Config memory config);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-20 standard as defined in the ERC.*/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 value of tokens in existence.*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity 0.8.28;import {ICrossReentrancyGuard} from "../interfaces/ICrossReentrancyGuard.sol";abstract contract CrossReentrancyGuard is ICrossReentrancyGuard {uint256 private constant _NOT_ENTERED = 0;uint256 private constant _ENTERED = 1;uint256 private transient _crossReentrantStatus;/// @inheritdoc ICrossReentrancyGuardfunction turnOnReentrancyProtection() external virtual {_onlySiloOrTokenOrHookReceiver();require(_crossReentrantStatus != _ENTERED, CrossReentrantCall());_crossReentrantStatus = _ENTERED;}/// @inheritdoc ICrossReentrancyGuardfunction turnOffReentrancyProtection() external virtual {_onlySiloOrTokenOrHookReceiver();// Leaving it unprotected may lead to a bug in the reentrancy protection system,// as it can be used in the function without activating the protection before deactivating it.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity ^0.8.28;import {ISilo} from "../interfaces/ISilo.sol";// solhint-disable private-vars-leading-underscorelibrary Hook {/// @notice The data structure for the deposit hook/// @param assets The amount of assets deposited/// @param shares The amount of shares deposited/// @param receiver The receiver of the depositstruct BeforeDepositInput {uint256 assets;uint256 shares;address receiver;}/// @notice The data structure for the deposit hook/// @param assets The amount of assets deposited/// @param shares The amount of shares deposited/// @param receiver The receiver of the deposit/// @param receivedAssets The exact amount of assets being deposited/// @param mintedShares The exact amount of shares being mintedstruct AfterDepositInput {uint256 assets;uint256 shares;
12345678910111213141516171819// SPDX-License-Identifier: MITpragma solidity >=0.5.0;interface ISiloOracle {/// @notice Hook function to call before `quote` function reads price/// @dev This hook function can be used to change state right before the price is read. For example it can be used/// for curve read only reentrancy protection. In majority of implementations this will be an empty function./// WARNING: reverts are propagated to Silo so if `beforeQuote` reverts, Silo reverts as well./// @param _baseToken Address of priced tokenfunction beforeQuote(address _baseToken) external;/// @return quoteAmount Returns quote price for _baseAmount of _baseToken/// @param _baseAmount Amount of priced token/// @param _baseToken Address of priced tokenfunction quote(uint256 _baseAmount, address _baseToken) external view returns (uint256 quoteAmount);/// @return address of token in which quote (price) is denominatedfunction quoteToken() external view returns (address);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IERC20Metadata} from "openzeppelin5/token/ERC20/extensions/IERC20Metadata.sol";import {ISiloConfig} from "./ISiloConfig.sol";import {ISilo} from "./ISilo.sol";interface IShareToken is IERC20Metadata {struct HookSetup {/// @param this is the same as in siloConfigaddress hookReceiver;/// @param hooks bitmapuint24 hooksBefore;/// @param hooks bitmapuint24 hooksAfter;/// @param tokenType must be one of this hooks values: COLLATERAL_TOKEN, PROTECTED_TOKEN, DEBT_TOKENuint24 tokenType;}struct ShareTokenStorage {/// @notice Silo address for which tokens was deployedISilo silo;/// @dev cached silo config addressISiloConfig siloConfig;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {SafeERC20} from "openzeppelin5/token/ERC20/utils/SafeERC20.sol";import {IERC20} from "openzeppelin5/token/ERC20/IERC20.sol";import {Math} from "openzeppelin5/utils/math/Math.sol";import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {ISilo} from "../interfaces/ISilo.sol";import {IShareToken} from "../interfaces/IShareToken.sol";import {SiloSolvencyLib} from "./SiloSolvencyLib.sol";import {SiloMathLib} from "./SiloMathLib.sol";import {SiloStdLib} from "./SiloStdLib.sol";import {SiloLendingLib} from "./SiloLendingLib.sol";import {Rounding} from "./Rounding.sol";import {Hook} from "./Hook.sol";import {ShareTokenLib} from "./ShareTokenLib.sol";import {SiloStorageLib} from "./SiloStorageLib.sol";// solhint-disable function-max-lineslibrary SiloERC4626Lib {using SafeERC20 for IERC20;using Math for uint256;uint256 internal constant _PRECISION_DECIMALS = 1e18;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {Math} from "openzeppelin5/utils/math/Math.sol";import {ISiloOracle} from "../interfaces/ISiloOracle.sol";import {SiloStdLib, ISiloConfig, IShareToken, ISilo} from "./SiloStdLib.sol";import {SiloMathLib} from "./SiloMathLib.sol";import {Rounding} from "./Rounding.sol";library SiloSolvencyLib {using Math for uint256;struct LtvData {ISiloOracle collateralOracle;ISiloOracle debtOracle;uint256 borrowerProtectedAssets;uint256 borrowerCollateralAssets;uint256 borrowerDebtAssets;}uint256 internal constant _PRECISION_DECIMALS = 1e18;uint256 internal constant _INFINITY = type(uint256).max;/// @notice Determines if a borrower is solvent based on the Loan-to-Value (LTV) ratio/// @param _collateralConfig Configuration data for the collateral
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {SafeERC20} from "openzeppelin5/token/ERC20/utils/SafeERC20.sol";import {IERC20} from "openzeppelin5/token/ERC20/IERC20.sol";import {Math} from "openzeppelin5/utils/math/Math.sol";import {ISiloOracle} from "../interfaces/ISiloOracle.sol";import {ISilo} from "../interfaces/ISilo.sol";import {IShareToken} from "../interfaces/IShareToken.sol";import {IInterestRateModel} from "../interfaces/IInterestRateModel.sol";import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {SiloSolvencyLib} from "./SiloSolvencyLib.sol";import {SiloStdLib} from "./SiloStdLib.sol";import {SiloMathLib} from "./SiloMathLib.sol";import {Rounding} from "./Rounding.sol";import {ShareTokenLib} from "./ShareTokenLib.sol";import {SiloStorageLib} from "./SiloStorageLib.sol";library SiloLendingLib {using SafeERC20 for IERC20;using Math for uint256;uint256 internal constant _PRECISION_DECIMALS = 1e18;/// @notice Allows repaying borrowed assets either partially or in full
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {SafeERC20} from "openzeppelin5/token/ERC20/utils/SafeERC20.sol";import {IERC20} from "openzeppelin5/token/ERC20/IERC20.sol";import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {ISilo} from "../interfaces/ISilo.sol";import {IInterestRateModel} from "../interfaces/IInterestRateModel.sol";import {IShareToken} from "../interfaces/IShareToken.sol";import {SiloMathLib} from "./SiloMathLib.sol";library SiloStdLib {using SafeERC20 for IERC20;uint256 internal constant _PRECISION_DECIMALS = 1e18;/// @notice Returns flash fee amount/// @param _config address of config contract for Silo/// @param _token for which fee is calculated/// @param _amount for which fee is calculated/// @return fee flash fee amountfunction flashFee(ISiloConfig _config, address _token, uint256 _amount) internal view returns (uint256 fee) {if (_amount == 0) return 0;// all user set fees are in 18 decimals points
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {Math} from "openzeppelin5/utils/math/Math.sol";import {Rounding} from "../lib/Rounding.sol";import {ISilo} from "../interfaces/ISilo.sol";library SiloMathLib {using Math for uint256;uint256 internal constant _PRECISION_DECIMALS = 1e18;uint256 internal constant _DECIMALS_OFFSET = 3;/// @dev this is constant version of openzeppelin5/contracts/token/ERC20/extensions/ERC4626._decimalsOffsetuint256 internal constant _DECIMALS_OFFSET_POW = 10 ** _DECIMALS_OFFSET;/// @notice Returns available liquidity to be borrowed/// @dev Accrued interest is entirely added to `debtAssets` but only part of it is added to `collateralAssets`. The/// difference is DAO's and deployer's cut. That means DAO's and deployer's cut is not considered a borrowable/// liquidity.function liquidity(uint256 _collateralAssets, uint256 _debtAssets) internal pure returns (uint256 liquidAssets) {unchecked {// we checked the underflowliquidAssets = _debtAssets > _collateralAssets ? 0 : _collateralAssets - _debtAssets;}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: GPL-2.0-or-laterpragma solidity ^0.8.28;import {Math} from "openzeppelin5/utils/math/Math.sol";// solhint-disable private-vars-leading-underscorelibrary Rounding {Math.Rounding internal constant UP = (Math.Rounding.Ceil);Math.Rounding internal constant DOWN = (Math.Rounding.Floor);Math.Rounding internal constant DEBT_TO_ASSETS = (Math.Rounding.Ceil);// COLLATERAL_TO_ASSETS is used to calculate borrower collateral (so we want to round down)Math.Rounding internal constant COLLATERAL_TO_ASSETS = (Math.Rounding.Floor);// why DEPOSIT_TO_ASSETS is Up if COLLATERAL_TO_ASSETS is Down?// DEPOSIT_TO_ASSETS is used for preview deposit and deposit, based on provided shares we want to pull "more" tokens// so we rounding up, "token flow" is in different direction than for COLLATERAL_TO_ASSETS, that's why// different rounding policyMath.Rounding internal constant DEPOSIT_TO_ASSETS = (Math.Rounding.Ceil);Math.Rounding internal constant DEPOSIT_TO_SHARES = (Math.Rounding.Floor);Math.Rounding internal constant BORROW_TO_ASSETS = (Math.Rounding.Floor);Math.Rounding internal constant BORROW_TO_SHARES = (Math.Rounding.Ceil);Math.Rounding internal constant MAX_BORROW_TO_ASSETS = (Math.Rounding.Floor);Math.Rounding internal constant MAX_BORROW_TO_SHARES = (Math.Rounding.Floor);Math.Rounding internal constant MAX_BORROW_VALUE = (Math.Rounding.Floor);Math.Rounding internal constant REPAY_TO_ASSETS = (Math.Rounding.Ceil);Math.Rounding internal constant REPAY_TO_SHARES = (Math.Rounding.Floor);Math.Rounding internal constant MAX_REPAY_TO_ASSETS = (Math.Rounding.Ceil);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.0;import {Strings} from "openzeppelin5/utils/Strings.sol";import {ISilo} from "../interfaces/ISilo.sol";import {IShareToken} from "../interfaces/IShareToken.sol";import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {TokenHelper} from "../lib/TokenHelper.sol";import {CallBeforeQuoteLib} from "../lib/CallBeforeQuoteLib.sol";import {Hook} from "../lib/Hook.sol";// solhint-disable orderinglibrary ShareTokenLib {using Hook for uint24;using CallBeforeQuoteLib for ISiloConfig.ConfigData;// keccak256(abi.encode(uint256(keccak256("silo.storage.ShareToken")) - 1)) & ~bytes32(uint256(0xff))bytes32 private constant _STORAGE_LOCATION = 0x01b0b3f9d6e360167e522fa2b18ba597ad7b2b35841fec7e1ca4dbb0adea1200;function getShareTokenStorage() internal pure returns (IShareToken.ShareTokenStorage storage $) {// solhint-disable-next-line no-inline-assemblyassembly {$.slot := _STORAGE_LOCATION
12345678910111213141516// SPDX-License-Identifier: BUSL-1.1pragma solidity 0.8.28;import {ISilo} from "silo-core/contracts/interfaces/ISilo.sol";library SiloStorageLib {// keccak256(abi.encode(uint256(keccak256("silo.storage.SiloVault")) - 1)) & ~bytes32(uint256(0xff));bytes32 private constant _STORAGE_LOCATION = 0xd7513ffe3a01a9f6606089d1b67011bca35bec018ac0faa914e1c529408f8300;function getSiloStorage() internal pure returns (ISilo.SiloStorage storage $) {// solhint-disable-next-line no-inline-assemblyassembly {$.slot := _STORAGE_LOCATION}}}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4626.sol)pragma solidity ^0.8.20;import {IERC20} from "../token/ERC20/IERC20.sol";import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol";/*** @dev Interface of the ERC-4626 "Tokenized Vault Standard", as defined in* https://eips.ethereum.org/EIPS/eip-4626[ERC-4626].*/interface IERC4626 is IERC20, IERC20Metadata {event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares);event Withdraw(address indexed sender,address indexed receiver,address indexed owner,uint256 assets,uint256 shares);/*** @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing.*
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;import {IERC3156FlashBorrower} from "./IERC3156FlashBorrower.sol";/// @notice https://eips.ethereum.org/EIPS/eip-3156interface IERC3156FlashLender {/// @notice Protected deposits are not available for a flash loan./// During the execution of the flashloan, Silo methods are not taking into consideration the fact,/// that some (or all) tokens were transferred as flashloan, therefore some methods can return invalid state/// eg. maxWithdraw can return amount that are not available to withdraw during flashlon./// @dev Initiate a flash loan./// @param _receiver The receiver of the tokens in the loan, and the receiver of the callback./// @param _token The loan currency./// @param _amount The amount of tokens lent./// @param _data Arbitrary data structure, intended to contain user-defined parameters.function flashLoan(IERC3156FlashBorrower _receiver, address _token, uint256 _amount, bytes calldata _data)externalreturns (bool);/// @dev The amount of currency available to be lent./// @param _token The loan currency./// @return The amount of `token` that can be borrowed.function maxFlashLoan(address _token) external view returns (uint256);/// @dev The fee to be charged for a given loan.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC721/IERC721.sol)pragma solidity ^0.8.20;import {IERC165} from "../../utils/introspection/IERC165.sol";/*** @dev Required interface of an ERC-721 compliant contract.*/interface IERC721 is IERC165 {/*** @dev Emitted when `tokenId` token is transferred from `from` to `to`.*/event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.*/event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);/*** @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.*/event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";/*** @dev Interface for the optional metadata functions from the ERC-20 standard.*/interface IERC20Metadata is IERC20 {/*** @dev Returns the name of the token.*/function name() external view returns (string memory);/*** @dev Returns the symbol of the token.*/function symbol() external view returns (string memory);/*** @dev Returns the decimals places of the token.*/function decimals() external view returns (uint8);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "../IERC20.sol";import {IERC1363} from "../../../interfaces/IERC1363.sol";import {Address} from "../../../utils/Address.sol";/*** @title SafeERC20* @dev Wrappers around ERC-20 operations that throw on failure (when the token* contract returns false). Tokens that return no value (and instead revert or* throw on failure) are also supported, non-reverting calls are assumed to be* successful.* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.*/library SafeERC20 {using Address for address;/*** @dev An operation with an ERC-20 token failed.*/error SafeERC20FailedOperation(address token);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol)pragma solidity ^0.8.20;import {Panic} from "../Panic.sol";import {SafeCast} from "./SafeCast.sol";/*** @dev Standard math utilities missing in the Solidity language.*/library Math {enum Rounding {Floor, // Toward negative infinityCeil, // Toward positive infinityTrunc, // Toward zeroExpand // Away from zero}/*** @dev Returns the addition of two unsigned integers, with an success flag (no overflow).*/function tryAdd(uint256 a, uint256 b) internal pure returns (bool success, uint256 result) {unchecked {uint256 c = a + b;if (c < a) return (false, 0);
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity >=0.5.0;interface IInterestRateModel {event InterestRateModelError();/// @dev Sets config address for all Silos that will use this model/// @param _irmConfig address of IRM config contractfunction initialize(address _irmConfig) external;/// @dev get compound interest rate and update model storage for current block.timestamp/// @param _collateralAssets total silo collateral assets/// @param _debtAssets total silo debt assets/// @param _interestRateTimestamp last IRM timestamp/// @return rcomp compounded interest rate from last update until now (1e18 == 100%)function getCompoundInterestRateAndUpdate(uint256 _collateralAssets,uint256 _debtAssets,uint256 _interestRateTimestamp)externalreturns (uint256 rcomp);/// @dev get compound interest rate/// @param _silo address of Silo for which interest rate should be calculated/// @param _blockTimestamp current block timestamp
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Strings.sol)pragma solidity ^0.8.20;import {Math} from "./math/Math.sol";import {SignedMath} from "./math/SignedMath.sol";/*** @dev String operations.*/library Strings {bytes16 private constant HEX_DIGITS = "0123456789abcdef";uint8 private constant ADDRESS_LENGTH = 20;/*** @dev The `value` string doesn't fit in the specified `length`.*/error StringsInsufficientHexLength(uint256 value, uint256 length);/*** @dev Converts a `uint256` to its ASCII `string` decimal representation.*/function toString(uint256 value) internal pure returns (string memory) {unchecked {uint256 length = Math.log10(value) + 1;
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {IERC20Metadata} from "openzeppelin5/token/ERC20/extensions/IERC20Metadata.sol";import {IsContract} from "./IsContract.sol";library TokenHelper {uint256 private constant _BYTES32_SIZE = 32;error TokenIsNotAContract();function assertAndGetDecimals(address _token) internal view returns (uint256) {(bool hasMetadata, bytes memory data) =_tokenMetadataCall(_token, abi.encodeCall(IERC20Metadata.decimals, ()));// decimals() is optional in the ERC20 standard, so if metadata is not accessible// we assume there are no decimals and use 0.if (!hasMetadata) {return 0;}return abi.decode(data, (uint8));}/// @dev Returns the symbol for the provided ERC20 token.
1234567891011121314151617181920212223// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.28;import {ISiloConfig} from "../interfaces/ISiloConfig.sol";import {ISiloOracle} from "../interfaces/ISiloOracle.sol";library CallBeforeQuoteLib {/// @dev Call `beforeQuote` on the `solvencyOracle` oracle/// @param _config Silo config datafunction callSolvencyOracleBeforeQuote(ISiloConfig.ConfigData memory _config) internal {if (_config.callBeforeQuote && _config.solvencyOracle != address(0)) {ISiloOracle(_config.solvencyOracle).beforeQuote(_config.token);}}/// @dev Call `beforeQuote` on the `maxLtvOracle` oracle/// @param _config Silo config datafunction callMaxLtvOracleBeforeQuote(ISiloConfig.ConfigData memory _config) internal {if (_config.callBeforeQuote && _config.maxLtvOracle != address(0)) {ISiloOracle(_config.maxLtvOracle).beforeQuote(_config.token);}}}
123456789101112131415161718// SPDX-License-Identifier: MITpragma solidity >=0.5.0;interface IERC3156FlashBorrower {/// @notice During the execution of the flashloan, Silo methods are not taking into consideration the fact,/// that some (or all) tokens were transferred as flashloan, therefore some methods can return invalid state/// eg. maxWithdraw can return amount that are not available to withdraw during flashlon./// @dev Receive a flash loan./// @param _initiator The initiator of the loan./// @param _token The loan currency./// @param _amount The amount of tokens lent./// @param _fee The additional amount of tokens to repay./// @param _data Arbitrary data structure, intended to contain user-defined parameters./// @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan"function onFlashLoan(address _initiator, address _token, uint256 _amount, uint256 _fee, bytes calldata _data)externalreturns (bytes32);}
12345678910111213141516171819202122232425// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)pragma solidity ^0.8.20;/*** @dev Interface of the ERC-165 standard, as defined in the* https://eips.ethereum.org/EIPS/eip-165[ERC].** Implementers can declare support of contract interfaces, which can then be* queried by others ({ERC165Checker}).** For an implementation, see {ERC165}.*/interface IERC165 {/*** @dev Returns true if this contract implements the interface defined by* `interfaceId`. See the corresponding* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]* to learn more about how these ids are created.** This function call must use less than 30 000 gas.*/function supportsInterface(bytes4 interfaceId) external view returns (bool);}
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC1363.sol)pragma solidity ^0.8.20;import {IERC20} from "./IERC20.sol";import {IERC165} from "./IERC165.sol";/*** @title IERC1363* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].** Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.*/interface IERC1363 is IERC20, IERC165 {/** Note: the ERC-165 identifier for this interface is 0xb0202a11.* 0xb0202a11 ===* bytes4(keccak256('transferAndCall(address,uint256)')) ^* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^* bytes4(keccak256('approveAndCall(address,uint256)')) ^* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))*/
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)pragma solidity ^0.8.20;import {Errors} from "./Errors.sol";/*** @dev Collection of functions related to the address type*/library Address {/*** @dev There's no code at `target` (it is not a contract).*/error AddressEmptyCode(address target);/*** @dev Replacement for Solidity's `transfer`: sends `amount` wei to* `recipient`, forwarding all available gas and reverting on errors.** https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost* of certain opcodes, possibly making contracts go over the 2300 gas limit* imposed by `transfer`, making them unable to receive funds via* `transfer`. {sendValue} removes this limitation.** https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MITpragma solidity ^0.8.20;/*** @dev Helper library for emitting standardized panic codes.** ```solidity* contract Example {* using Panic for uint256;** // Use any of the declared internal constants* function foo() { Panic.GENERIC.panic(); }** // Alternatively* function foo() { Panic.panic(Panic.GENERIC); }* }* ```** Follows the list from https://github.com/ethereum/solidity/blob/v0.8.24/libsolutil/ErrorCodes.h[libsolutil].*/// slither-disable-next-line unused-statelibrary Panic {/// @dev generic / unspecified erroruint256 internal constant GENERIC = 0x00;/// @dev used by the assert() builtin
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SafeCast.sol)// This file was procedurally generated from scripts/generate/templates/SafeCast.js.pragma solidity ^0.8.20;/*** @dev Wrappers over Solidity's uintXX/intXX/bool casting operators with added overflow* checks.** Downcasting from uint256/int256 in Solidity does not revert on overflow. This can* easily result in undesired exploitation or bugs, since developers usually* assume that overflows raise errors. `SafeCast` restores this intuition by* reverting the transaction when such an operation overflows.** Using this library instead of the unchecked operations eliminates an entire* class of bugs, so it's recommended to use it always.*/library SafeCast {/*** @dev Value doesn't fit in an uint of `bits` size.*/error SafeCastOverflowedUintDowncast(uint8 bits, uint256 value);/*** @dev An int value doesn't fit in an uint of `bits` size.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (utils/math/SignedMath.sol)pragma solidity ^0.8.20;/*** @dev Standard signed math utilities missing in the Solidity language.*/library SignedMath {/*** @dev Returns the largest of two signed numbers.*/function max(int256 a, int256 b) internal pure returns (int256) {return a > b ? a : b;}/*** @dev Returns the smallest of two signed numbers.*/function min(int256 a, int256 b) internal pure returns (int256) {return a < b ? a : b;}/*** @dev Returns the average of two signed numbers without overflow.* The result is rounded towards zero.
1234567891011121314151617181920212223242526// SPDX-License-Identifier: BUSL-1.1pragma solidity ^0.8.24;library IsContract {/*** @dev Returns true if `account` is a contract.** [IMPORTANT]* ====* It is unsafe to assume that an address for which this function returns* false is an externally-owned account (EOA) and not a contract.** Among others, `isContract` will return false for the following* types of addresses:** - an externally-owned account* - a contract in construction* - an address where a contract will be created* - an address where a contract lived, but was destroyed** Furthermore, `isContract` will also return true if the target contract within* the same transaction is already scheduled for destruction by `SELFDESTRUCT`,* which only has an effect at the end of a transaction.* ====** [IMPORTANT]
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)pragma solidity ^0.8.20;import {IERC20} from "../token/ERC20/IERC20.sol";
123456// SPDX-License-Identifier: MIT// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol)pragma solidity ^0.8.20;import {IERC165} from "../utils/introspection/IERC165.sol";
1234567891011121314151617181920212223242526{"remappings": ["forge-std/=gitmodules/forge-std/src/","silo-foundry-utils/=gitmodules/silo-foundry-utils/contracts/","properties/=gitmodules/crytic/properties/contracts/","silo-core/=silo-core/","silo-oracles/=silo-oracles/","silo-vaults/=silo-vaults/","ve-silo/=ve-silo/","@openzeppelin/=gitmodules/openzeppelin-contracts-5/contracts/","morpho-blue/=gitmodules/morpho-blue/src/","openzeppelin5/=gitmodules/openzeppelin-contracts-5/contracts/","openzeppelin5-upgradeable/=gitmodules/openzeppelin-contracts-upgradeable-5/contracts/","chainlink/=gitmodules/chainlink/contracts/src/","chainlink-ccip/=gitmodules/chainlink-ccip/contracts/src/","uniswap/=gitmodules/uniswap/","@uniswap/v3-core/=gitmodules/uniswap/v3-core/","balancer-labs/v2-solidity-utils/=external/balancer-v2-monorepo/pkg/solidity-utils/contracts/","balancer-labs/v2-interfaces/=external/balancer-v2-monorepo/pkg/interfaces/contracts/","balancer-labs/v2-liquidity-mining/=external/balancer-v2-monorepo/pkg/liquidity-mining/contracts/","@balancer-labs/=node_modules/@balancer-labs/","@ensdomains/=node_modules/@ensdomains/","@openzeppelin/contracts-upgradeable/=gitmodules/openzeppelin-contracts-upgradeable-5/contracts/","@openzeppelin/contracts/=gitmodules/openzeppelin-contracts-5/contracts/","@solidity-parser/=node_modules/@solidity-parser/","ERC4626/=gitmodules/crytic/properties/lib/ERC4626/contracts/",
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IInterestRateModelV2Factory","name":"_irmConfigFactory","type":"address"},{"internalType":"contract ISiloFactory","name":"_siloFactory","type":"address"},{"internalType":"address","name":"_siloImpl","type":"address"},{"internalType":"address","name":"_shareProtectedCollateralTokenImpl","type":"address"},{"internalType":"address","name":"_shareDebtTokenImpl","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DaoMaxRangeExceeded","type":"error"},{"inputs":[],"name":"DaoMinRangeExceeded","type":"error"},{"inputs":[],"name":"EmptyToken0","type":"error"},{"inputs":[],"name":"EmptyToken1","type":"error"},{"inputs":[],"name":"FailedDeployment","type":"error"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"FailedToCreateAnOracle","type":"error"},{"inputs":[],"name":"HookReceiverMisconfigured","type":"error"},{"inputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidCallBeforeQuote","type":"error"},{"inputs":[],"name":"InvalidDeployer","type":"error"},{"inputs":[],"name":"InvalidIrm","type":"error"},{"inputs":[],"name":"InvalidLt","type":"error"},{"inputs":[],"name":"InvalidMaxLtv","type":"error"},{"inputs":[],"name":"InvalidQuoteToken","type":"error"},{"inputs":[],"name":"LiquidationTargetLtvTooHigh","type":"error"},{"inputs":[],"name":"MaxDeployerFeeExceeded","type":"error"},{"inputs":[],"name":"MaxFlashloanFeeExceeded","type":"error"},{"inputs":[],"name":"MaxLiquidationFeeExceeded","type":"error"},{"inputs":[],"name":"MissingHookReceiver","type":"error"},{"inputs":[],"name":"OracleMisconfiguration","type":"error"},{"inputs":[],"name":"SameAsset","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISiloConfig","name":"siloConfig","type":"address"}],"name":"SiloCreated","type":"event"},{"inputs":[],"name":"IRM_CONFIG_FACTORY","outputs":[{"internalType":"contract IInterestRateModelV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_DEBT_TOKEN_IMPL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_PROTECTED_COLLATERAL_TOKEN_IMPL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILO_FACTORY","outputs":[{"internalType":"contract ISiloFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SILO_IMPL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"address","name":"deployed","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"txInput","type":"bytes"}],"internalType":"struct ISiloDeployer.OracleCreationTxData","name":"solvencyOracle0","type":"tuple"},{"components":[{"internalType":"address","name":"deployed","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"txInput","type":"bytes"}],"internalType":"struct ISiloDeployer.OracleCreationTxData","name":"maxLtvOracle0","type":"tuple"},{"components":[{"internalType":"address","name":"deployed","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"txInput","type":"bytes"}],"internalType":"struct ISiloDeployer.OracleCreationTxData","name":"solvencyOracle1","type":"tuple"},{"components":[{"internalType":"address","name":"deployed","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bytes","name":"txInput","type":"bytes"}],"internalType":"struct ISiloDeployer.OracleCreationTxData","name":"maxLtvOracle1","type":"tuple"}],"internalType":"struct ISiloDeployer.Oracles","name":"_oracles","type":"tuple"},{"components":[{"internalType":"int256","name":"uopt","type":"int256"},{"internalType":"int256","name":"ucrit","type":"int256"},{"internalType":"int256","name":"ulow","type":"int256"},{"internalType":"int256","name":"ki","type":"int256"},{"internalType":"int256","name":"kcrit","type":"int256"},{"internalType":"int256","name":"klow","type":"int256"},{"internalType":"int256","name":"klin","type":"int256"},{"internalType":"int256","name":"beta","type":"int256"},{"internalType":"int112","name":"ri","type":"int112"},{"internalType":"int112","name":"Tcrit","type":"int112"}],"internalType":"struct IInterestRateModelV2.Config","name":"_irmConfigData0","type":"tuple"},{"components":[{"internalType":"int256","name":"uopt","type":"int256"},{"internalType":"int256","name":"ucrit","type":"int256"},{"internalType":"int256","name":"ulow","type":"int256"},{"internalType":"int256","name":"ki","type":"int256"},{"internalType":"int256","name":"kcrit","type":"int256"},{"internalType":"int256","name":"klow","type":"int256"},{"internalType":"int256","name":"klin","type":"int256"},{"internalType":"int256","name":"beta","type":"int256"},{"internalType":"int112","name":"ri","type":"int112"},{"internalType":"int112","name":"Tcrit","type":"int112"}],"internalType":"struct IInterestRateModelV2.Config","name":"_irmConfigData1","type":"tuple"},{"components":[{"internalType":"address","name":"implementation","type":"address"},{"internalType":"bytes","name":"initializationData","type":"bytes"}],"internalType":"struct ISiloDeployer.ClonableHookReceiver","name":"_clonableHookReceiver","type":"tuple"},{"components":[{"internalType":"address","name":"deployer","type":"address"},{"internalType":"address","name":"hookReceiver","type":"address"},{"internalType":"uint256","name":"deployerFee","type":"uint256"},{"internalType":"uint256","name":"daoFee","type":"uint256"},{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"solvencyOracle0","type":"address"},{"internalType":"address","name":"maxLtvOracle0","type":"address"},{"internalType":"address","name":"interestRateModel0","type":"address"},{"internalType":"uint256","name":"maxLtv0","type":"uint256"},{"internalType":"uint256","name":"lt0","type":"uint256"},{"internalType":"uint256","name":"liquidationTargetLtv0","type":"uint256"},{"internalType":"uint256","name":"liquidationFee0","type":"uint256"},{"internalType":"uint256","name":"flashloanFee0","type":"uint256"},{"internalType":"bool","name":"callBeforeQuote0","type":"bool"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"address","name":"solvencyOracle1","type":"address"},{"internalType":"address","name":"maxLtvOracle1","type":"address"},{"internalType":"address","name":"interestRateModel1","type":"address"},{"internalType":"uint256","name":"maxLtv1","type":"uint256"},{"internalType":"uint256","name":"lt1","type":"uint256"},{"internalType":"uint256","name":"liquidationTargetLtv1","type":"uint256"},{"internalType":"uint256","name":"liquidationFee1","type":"uint256"},{"internalType":"uint256","name":"flashloanFee1","type":"uint256"},{"internalType":"bool","name":"callBeforeQuote1","type":"bool"}],"internalType":"struct ISiloConfig.InitData","name":"_siloInitData","type":"tuple"}],"name":"deploy","outputs":[{"internalType":"contract ISiloConfig","name":"siloConfig","type":"address"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
610120604052348015610010575f5ffd5b5060405161503638038061503683398101604081905261002f9161006f565b6001600160a01b0394851660805292841660a05290831660c052821660e05216610100526100e0565b6001600160a01b038116811461006c575f5ffd5b50565b5f5f5f5f5f60a08688031215610083575f5ffd5b855161008e81610058565b602087015190955061009f81610058565b60408701519094506100b081610058565b60608701519093506100c181610058565b60808701519092506100d281610058565b809150509295509295909350565b60805160a05160c05160e05161010051614e7c6101ba5f395f818160d30152818161021d0152818161096901526109c201525f818160fa015281816101fb015281816108b7015261091001525f8181610121015281816101d9015281816107e9015261084201525f818160ac015281816101a801528181610547015281816105dd0152818161065c015281816106dc0152818161075c0152818161080b01528181610864015281816108d9015281816109320152818161098b01526109e401525f81816069015281816102db01526103550152614e7c5ff3fe608060405234801561000f575f5ffd5b5060043610610060575f3560e01c806328cdfde0146100645780635956617c146100a7578063654ec411146100ce578063c2bcfc51146100f5578063db35c4031461011c578063e1329d5514610143575b5f5ffd5b61008b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200160405180910390f35b61008b7f000000000000000000000000000000000000000000000000000000000000000081565b61008b7f000000000000000000000000000000000000000000000000000000000000000081565b61008b7f000000000000000000000000000000000000000000000000000000000000000081565b61008b7f000000000000000000000000000000000000000000000000000000000000000081565b61008b6101513660046117c2565b5f61015d8585846102c2565b61016f8261016a88611aa1565b610401565b610185826101806020860186611b61565b6104da565b61018e82610543565b604051630a8066a560e01b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630a8066a59061024590859085907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f000000000000000000000000000000000000000000000000000000000000000090600401611b83565b5f604051808303815f87803b15801561025c575f5ffd5b505af115801561026e573d5f5f3e3d5ffd5b5050505061027d828285610a57565b6040516001600160a01b03821681527f520b4351811464729581037d20341082d8883f518612cfb0d3c2f75c12b0c29d9060200160405180910390a195945050505050565b6040516379c682c160e01b81525f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906379c682c190610310908790600401611da3565b60408051808303815f875af115801561032b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034f9190611e34565b9150505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166379c682c1856040518263ffffffff1660e01b815260040161039f9190611da3565b60408051808303815f875af11580156103ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103de9190611e34565b6001600160a01b0393841660e08601529092166102209093019290925250505050565b60a08201516001600160a01b031661042357805161041e90610ae8565b610429565b8160a001515b6001600160a01b0390811660a084015260c083015116610455576104508160200151610ae8565b61045b565b8160c001515b6001600160a01b0390811660c08401526101e083015116610488576104838160400151610ae8565b61048f565b816101e001515b6001600160a01b039081166101e0840152610200830151166104bd576104b88160600151610ae8565b6104c4565b8161020001515b6001600160a01b03166102009092019190915250565b6001600160a01b03811615806104fb575060208201516001600160a01b0316155b610518576040516332c5e96160e01b815260040160405180910390fd5b6001600160a01b0381161561053f5761053081610bcc565b6001600160a01b031660208301525b5050565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166349f33f2e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c59190611e62565b90506105cf61162c565b6105d761162c565b6107df857f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e20d71706040518163ffffffff1660e01b81526004016040805180830381865afa158015610636573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065a9190611e8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a4c3e2726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106da9190611e62565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166363fcc73f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610736573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a9190611e62565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663eeb016f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107da9190611e62565b610bdd565b909250905061082f7f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610d9a565b6001600160a01b031660408301526108887f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610e0b565b6001600160a01b039081166040808401918252840151821660a0808601919091529051909116908201526108fd7f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610e19565b6001600160a01b031660808301526109567f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610e27565b6001600160a01b031660808201526109af7f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610e35565b6001600160a01b031660c0830152610a087f0000000000000000000000000000000000000000000000000000000000000000847f0000000000000000000000000000000000000000000000000000000000000000610e43565b6001600160a01b031660c0820152604051839083908390610a28906116b7565b610a3493929190612041565b604051809103905ff080158015610a4d573d5f5f3e3d5ffd5b5095945050505050565b5f610a656020830183611b61565b6001600160a01b031614610ae35782602001516001600160a01b031663d1f5789483838060200190610a979190612064565b6040518463ffffffff1660e01b8152600401610ab5939291906120ad565b5f604051808303815f87803b158015610acc575f5ffd5b505af1158015610ade573d5f5f3e3d5ffd5b505050505b505050565b80515f906001600160a01b031615610aff57505190565b60208201516001600160a01b038116610b1a57505f92915050565b5f5f826001600160a01b03168560400151604051610b3891906120ec565b5f604051808303815f865af19150503d805f8114610b71576040519150601f19603f3d011682016040523d82523d5f602084013e610b76565b606091505b5091509150818015610b89575080516020145b8390610bb957604051630557304160e31b81526001600160a01b0390911660048201526024015b60405180910390fd5b50610bc381612102565b95945050505050565b5f610bd7825f610e51565b92915050565b610be561162c565b610bed61162c565b610bfa8787878787610ee1565b5060208701516001600160a01b039081166101e084015260808801518116606084015260a0880151811660e084015260c08801511615610c3e578660c00151610c44565b8660a001515b6001600160a01b039081166101008085019190915260e0808a0151831661012080870191909152918a015161014080870191909152918a015161016080870191909152918a01516101808087019190915260408b01516020808801919091526060808d01518852938c01516101a080890191909152918c01516101c080890191909152918c0151151561020080890191909152908c015185166101e080880191909152918c01518516938601939093528a01518316908401528801511615610d1157866102000151610d18565b866101e001515b6001600160a01b039081166101008301526102208801511661012082015261024087015161014082015261026087015161016082015261028087015161018082015260408701516020820152606087015181526102a08701516101a08201526102c08701516101c08201526102e0909601511515610200870152959350505050565b5f610e0384610da8856113ab565b604051603881018690526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b949350505050565b5f610e0384610da885611405565b5f610e0384610da885611442565b5f610e0384610da88561147f565b5f610e0384610da8856114bc565b5f610e0384610da8856114f9565b5f81471015610e7c5760405163cf47918160e01b815247600482015260248101839052604401610bb0565b6e5af43d82803e903d91602b57fd5bf360205282601152763d602d80600a3d3981f3363d3d373d3d3d363d730000008360881c175f526037600983f090506001600160a01b038116610bd75760405163b06ebf3d60e01b815260040160405180910390fd5b60208501515f906001600160a01b0316610f0e5760405163d83793a160e01b815260040160405180910390fd5b60808601516001600160a01b0316610f3957604051636bb1aa5360e11b815260040160405180910390fd5b6101c08601516001600160a01b0316610f6557604051634eaf414f60e11b815260040160405180910390fd5b856101c001516001600160a01b031686608001516001600160a01b031603610fa05760405163534c524d60e11b815260040160405180910390fd5b610100860151151580610fb7575061024086015115155b610fd4576040516375fcbb8960e01b815260040160405180910390fd5b8561012001518661010001511115610fff576040516375fcbb8960e01b815260040160405180910390fd5b856102600151866102400151111561102a576040516375fcbb8960e01b815260040160405180910390fd5b8186610160015111156110505760405163f817842b60e01b815260040160405180910390fd5b81866102a0015111156110765760405163f817842b60e01b815260040160405180910390fd5b670de0b6b3a76400008661016001518761012001516110959190612125565b11156110b4576040516313fd16a560e11b815260040160405180910390fd5b670de0b6b3a7640000866102a001518761026001516110d39190612125565b11156110f2576040516313fd16a560e11b815260040160405180910390fd5b60c08601516001600160a01b03161580611118575060a08601516001600160a01b031615155b6111355760405163952268d360e01b815260040160405180910390fd5b856101a001511580611153575060a08601516001600160a01b031615155b611170576040516349cc353360e01b815260040160405180910390fd5b6102008601516001600160a01b0316158061119857506101e08601516001600160a01b031615155b6111b55760405163952268d360e01b815260040160405180910390fd5b856102e0015115806111d457506101e08601516001600160a01b031615155b6111f1576040516349cc353360e01b815260040160405180910390fd5b6111fa86611536565b60408601511580611214575085516001600160a01b031615155b6112315760405163043c669f60e01b815260040160405180910390fd5b838660400151111561125657604051632b01a30160e01b815260040160405180910390fd5b606086015185516001600160801b031611156112855760405163722a3f8560e01b815260040160405180910390fd5b84602001516001600160801b0316866060015111156112b757604051636adeb10960e11b815260040160405180910390fd5b8286610180015111156112dd5760405163923f853d60e01b815260040160405180910390fd5b82866102c0015111156113035760405163923f853d60e01b815260040160405180910390fd5b856101200151866101400151111561132e5760405163250a504d60e11b815260040160405180910390fd5b85610260015186610280015111156113595760405163250a504d60e11b815260040160405180910390fd5b60e08601516001600160a01b03161580159061138257506102208601516001600160a01b031615155b61139f57604051632e4e395f60e01b815260040160405180910390fd5b50600195945050505050565b5f817f1d056e62b182fd7d4dada6cf9079a3ba83adb009746718f4f8751cbe6b93da616040516020016113e8929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f817fccf028ea8322db4ac7e226915bfb048583cd927e584ca9a1865904fbc439f6636040516020016113e8929190918252602082015260400190565b5f817f4245b46a55891445529f9a01161a9f64cdec348f693a26b07e5f0aa22b486b7d6040516020016113e8929190918252602082015260400190565b5f817f700bad9da2e1385ef7139f09887b5c24cdbc6e2d1b8562842d95da2e68c340cd6040516020016113e8929190918252602082015260400190565b5f817fbe4a9bb64c254c9ac164216a73a2afa86df28fb3a0204a98a311293dcd5f35fc6040516020016113e8929190918252602082015260400190565b5f817ff36c517579d731f207a45998256dee21125b3bb93f46a3a5d2a4caff5251ca746040516020016113e8929190918252602082015260400190565b5f611545818360a00151611573565b9050611555818360c00151611573565b905061156681836101e00151611573565b9050610ae3818361020001515b5f6001600160a01b038216611589575081610bd7565b816001600160a01b031663217a4b706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e99190612144565b90506001600160a01b03831615610bd757806001600160a01b0316836001600160a01b031614610bd7576040516368ada7f160e11b815260040160405180910390fd5b60408051610220810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081019190915290565b612ce78061216083390190565b5f61014082840312156116d5575f5ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405161030081016001600160401b0381118282101715611712576117126116db565b60405290565b604051606081016001600160401b0381118282101715611712576117126116db565b604051608081016001600160401b0381118282101715611712576117126116db565b604051601f8201601f191681016001600160401b0381118282101715611784576117846116db565b604052919050565b6001600160a01b03811681146117a0575f5ffd5b50565b80356117ae8161178c565b919050565b803580151581146117ae575f5ffd5b5f5f5f5f5f8587036105c08112156117d8575f5ffd5b86356001600160401b038111156117ed575f5ffd5b87016080818a0312156117fe575f5ffd5b955061180d88602089016116c4565b945061181d8861016089016116c4565b93506102a08701356001600160401b03811115611838575f5ffd5b87016040818a031215611849575f5ffd5b92506103006102bf198201121561185e575f5ffd5b506118676116ef565b6118746102c088016117a3565b81526118836102e088016117a3565b6020820152610300870135604082015261032087013560608201526118ab61034088016117a3565b60808201526118bd61036088016117a3565b60a08201526118cf61038088016117a3565b60c08201526118e16103a088016117a3565b60e08201526103c08701356101008201526103e087013561012082015261040087013561014082015261042087013561016082015261044087013561018082015261192f61046088016117b3565b6101a082015261194261048088016117a3565b6101c08201526119556104a088016117a3565b6101e08201526119686104c088016117a3565b61020082015261197b6104e088016117a3565b6102208201526105008701356102408201526105208701356102608201526105408701356102808201526105608701356102a08201526105808701356102c08201526119ca6105a088016117b3565b6102e0820152809150509295509295909350565b5f606082840312156119ee575f5ffd5b6119f6611718565b90508135611a038161178c565b81526020820135611a138161178c565b602082015260408201356001600160401b03811115611a30575f5ffd5b8201601f81018413611a40575f5ffd5b80356001600160401b03811115611a5957611a596116db565b611a6c601f8201601f191660200161175c565b818152856020838501011115611a80575f5ffd5b816020840160208301375f6020838301015280604085015250505092915050565b5f60808236031215611ab1575f5ffd5b611ab961173a565b82356001600160401b03811115611ace575f5ffd5b611ada368286016119de565b82525060208301356001600160401b03811115611af5575f5ffd5b611b01368286016119de565b60208301525060408301356001600160401b03811115611b1f575f5ffd5b611b2b368286016119de565b60408301525060608301356001600160401b03811115611b49575f5ffd5b611b55368286016119de565b60608301525092915050565b5f60208284031215611b71575f5ffd5b8135611b7c8161178c565b9392505050565b85516001600160a01b0316815261038081016020870151611baf60208401826001600160a01b03169052565b5060408701516040830152606087015160608301526080870151611bde60808401826001600160a01b03169052565b5060a0870151611bf960a08401826001600160a01b03169052565b5060c0870151611c1460c08401826001600160a01b03169052565b5060e0870151611c2f60e08401826001600160a01b03169052565b506101008701516101008301526101208701516101208301526101408701516101408301526101608701516101608301526101808701516101808301526101a0870151611c816101a084018215159052565b506101c0870151611c9e6101c08401826001600160a01b03169052565b506101e0870151611cbb6101e08401826001600160a01b03169052565b50610200870151611cd86102008401826001600160a01b03169052565b50610220870151611cf56102208401826001600160a01b03169052565b506102408701516102408301526102608701516102608301526102808701516102808301526102a08701516102a08301526102c08701516102c08301526102e0870151611d476102e084018215159052565b506001600160a01b0386166103008301526001600160a01b0385166103208301526001600160a01b0384166103408301526001600160a01b0383166103608301529695505050505050565b8035600d81900b81146117ae575f5ffd5b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c0808301359082015260e080830135908201526101408101611dff6101008401611d92565b611e0f610100840182600d0b9052565b50611e1d6101208401611d92565b611e2d610120840182600d0b9052565b5092915050565b5f5f60408385031215611e45575f5ffd5b825191506020830151611e578161178c565b809150509250929050565b5f60208284031215611e72575f5ffd5b5051919050565b80516001600160801b03811681146117ae575f5ffd5b5f6040828403128015611ea0575f5ffd5b50604080519081016001600160401b0381118282101715611ec357611ec36116db565b604052611ecf83611e79565b8152611edd60208401611e79565b60208201529392505050565b80518252602081015160208301526040810151611f1160408401826001600160a01b03169052565b506060810151611f2c60608401826001600160a01b03169052565b506080810151611f4760808401826001600160a01b03169052565b5060a0810151611f6260a08401826001600160a01b03169052565b5060c0810151611f7d60c08401826001600160a01b03169052565b5060e0810151611f9860e08401826001600160a01b03169052565b50610100810151611fb56101008401826001600160a01b03169052565b50610120810151611fd26101208401826001600160a01b03169052565b506101408101516101408301526101608101516101608301526101808101516101808301526101a08101516101a08301526101c08101516101c08301526101e081015161202b6101e08401826001600160a01b03169052565b50610200810151610ae361020084018215159052565b83815261046081016120566020830185611ee9565b610e03610240830184611ee9565b5f5f8335601e19843603018112612079575f5ffd5b8301803591506001600160401b03821115612092575f5ffd5b6020019150368190038213156120a6575f5ffd5b9250929050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f82518060208501845e5f920191825250919050565b805160208083015191908110156116d5575f1960209190910360031b1b16919050565b80820180821115610bd757634e487b7160e01b5f52601160045260245ffd5b5f60208284031215612154575f5ffd5b8151611b7c8161178c56fe610480604052348015610010575f5ffd5b50604051612ce7380380612ce783398101604081905261002f916104c5565b608083905260208201518251670de0b6b3a76400009161004e91610502565b1061006c5760405163cd4e616760e01b815260040160405180910390fd5b815f015160a08181525050816020015160c08181525050816101e001516001600160a01b031660e0816001600160a01b03168152505081604001516001600160a01b0316610100816001600160a01b03168152505081606001516001600160a01b0316610120816001600160a01b03168152505081608001516001600160a01b0316610140816001600160a01b03168152505081604001516001600160a01b0316610160816001600160a01b0316815250508160c001516001600160a01b0316610180816001600160a01b0316815250508160e001516001600160a01b03166101a0816001600160a01b0316815250508161010001516001600160a01b03166101c0816001600160a01b0316815250508161012001516001600160a01b03166101e0816001600160a01b031681525050816101400151610200818152505081610160015161022081815250508161018001516102408181525050816101a001516102608181525050816101c00151610280818152505081610200015115156102a08115158152505080604001516001600160a01b03166102c0816001600160a01b03168152505080606001516001600160a01b03166102e0816001600160a01b03168152505080608001516001600160a01b0316610300816001600160a01b03168152505080604001516001600160a01b0316610320816001600160a01b0316815250508060c001516001600160a01b0316610340816001600160a01b0316815250508060e001516001600160a01b0316610360816001600160a01b0316815250508061010001516001600160a01b0316610380816001600160a01b0316815250508061012001516001600160a01b03166103a0816001600160a01b0316815250508061014001516103c081815250508061016001516103e081815250508061018001516104008181525050806101a001516104208181525050806101c001516104408181525050806102000151151561046081151581525050505050610527565b60405161022081016001600160401b038111828210171561037d57634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b0381168114610399575f5ffd5b919050565b80518015158114610399575f5ffd5b5f61022082840312156103be575f5ffd5b6103c661034e565b825181526020808401519082015290506103e260408301610383565b60408201526103f360608301610383565b606082015261040460808301610383565b608082015261041560a08301610383565b60a082015261042660c08301610383565b60c082015261043760e08301610383565b60e08201526104496101008301610383565b61010082015261045c6101208301610383565b6101208201526101408281015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526104a66101e08301610383565b6101e08201526104b9610200830161039e565b61020082015292915050565b5f5f5f61046084860312156104d8575f5ffd5b835192506104e985602086016103ad565b91506104f98561024086016103ad565b90509250925092565b8082018082111561052157634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516104605161239d61094a5f395f611ff801525f81816112a50152611fa301525f611f7d01525f611f5701525f611f3101525f611f0b01525f818161079e015281816110400152818161179e0152611edc01525f611ead01525f611e7e01525f818161042f015281816105d901528181610a0e01528181610bb001528181610e0f01528181611a000152611e4f01525f8181610b8d01528181610d5a015281816116f40152818161192c0152611e2001525f8181610b6a01528181610d1201528181611723015281816119960152611df101525f818161057c01528181610a3001528181610d3301528181610d7d015281816112c8015281816116c50152611dc201525f818161038f0152818161045f015281816105420152818161064b01528181610764015281816108b1015281816108d7015281816109d401528181610b3001528181610cc001528181610e81015281816110b40152818161126b0152818161133a015281816113d901528181611652015281816116960152818161180d0152818161188d0152611d9301525f611d0801525f81816112220152611cb301525f611c8d01525f611c6701525f611c4101525f611c1b01525f818161073e01528181610f600152818161161e0152611bec01525f611bbd01525f611b8e01525f818161049b015281816105ac0152818161098b01528181610b0a01528181610ddd01528181610e5a015281816119cb0152611b5f01525f8181610ae701528181610c7401528181611574015281816118f70152611b3001525f8181610ac401528181610c2d015281816115a3015281816119610152611b0101525f818161051c015281816109ad01528181610c4e01528181610c9501528181611245015281816115450152611ad201525f818161036e015281816103f3015281816104e2015281816106710152818161070401528181610877015281816109110152818161095101528181610a8a01528181610bdb01528181610ea701528181610fd4015281816111f6015281816112f90152818161138c015281816113b3015281816114d201528181611516015281816117db015281816118590152611aa301525f81816118c201528181611cd90152611fc901525f818161080301528181610fae0152818161108e015281816111cb015281816115f80152818161177801528181611a7d0152611d6d01525f81816107dd01528181610f8801528181611068015281816111aa015281816115d20152818161175201528181611a570152611d4701525f6101ce015261239d5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c806362402b04116100b4578063a135e0a011610079578063a135e0a014610308578063a5abc68a14610344578063aecc90cb1461036c578063d2c725e0146103b3578063e48a5f7b146103bd578063f6f8174f146103dd575f5ffd5b806362402b04146102ca57806372db6559146102d25780637d16b1f5146102e557806394c0527d146102ed5780639dd4133014610300575f5ffd5b8063255d70c811610105578063255d70c8146101fe5780632e6da205146102135780633c3eac121461023457806340c755e114610267578063483b24f01461027a5780634b82d63d146102b7575f5ffd5b8063038c0a5e1461014157806307439b49146101695780630b1d67c6146101945780631544a6db146101a7578063189e17e4146101c9575b5f5ffd5b61015461014f3660046120c2565b6103f0565b60405190151581526020015b60405180910390f35b61017c6101773660046120f3565b6104df565b6040516001600160a01b039091168152602001610160565b61017c6101a23660046120f3565b6105a5565b6101ba6101b53660046120c2565b610699565b60405161016093929190612264565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610160565b61021161020c3660046120f3565b610701565b005b6102266102213660046120f3565b610864565b6040516101609291906122d8565b6102476102423660046120f3565b61094d565b604080516001600160a01b03938416815292909116602083015201610160565b6102116102753660046120f3565b610a55565b61028d6102883660046120f3565b610a85565b604080516001600160a01b0394851681529284166020840152921691810191909152606001610160565b6102476102c53660046122f5565b610bd7565b610211610da4565b6102116102e03660046120c2565b610dd2565b610211610f49565b6102266102fb3660046120f3565b61110f565b610211611176565b61031b6103163660046120f3565b6111a8565b604080519485526020850193909352918301526001600160a01b03166060820152608001610160565b61017c6103523660046120f3565b5f602081905290815260409020546001600160a01b031681565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610247565b60015f5c14610154565b6103d06103cb3660046120f3565b6112ef565b604051610160919061232d565b6102116103eb3660046120f3565b611379565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361045d576104547f000000000000000000000000000000000000000000000000000000000000000083611426565b151590506104d9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036104c0576104547f000000000000000000000000000000000000000000000000000000000000000083611426565b6040516349d73a2760e01b815260040160405180910390fd5b92915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361054057507f0000000000000000000000000000000000000000000000000000000000000000919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c057507f0000000000000000000000000000000000000000000000000000000000000000919050565b919050565b5f5f6105d17f000000000000000000000000000000000000000000000000000000000000000084611426565b90505f6105fe7f000000000000000000000000000000000000000000000000000000000000000085611426565b905081158061060b575080155b6106285760405163fc6ba97d60e01b815260040160405180910390fd5b81158015610634575080155b1561064257505f9392505050565b815f0361066f577f0000000000000000000000000000000000000000000000000000000000000000610691565b7f00000000000000000000000000000000000000000000000000000000000000005b949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526106d9612021565b6106e1612021565b6106ea85611498565b92506106f58461110f565b93969095509293505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361076257507f00000000000000000000000000000000000000000000000000000000000000006107be565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c057507f00000000000000000000000000000000000000000000000000000000000000005b604051631b88d98560e21b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f00000000000000000000000000000000000000000000000000000000000000006044830152831690636e236614906064015f604051808303815f87803b15801561084a575f5ffd5b505af115801561085c573d5f5f3e3d5ffd5b505050505050565b61086c612021565b610874612021565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036108d557507f0000000000000000000000000000000000000000000000000000000000000000610931565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c057507f00000000000000000000000000000000000000000000000000000000000000005b61093a816112ef565b9250610945846112ef565b915050915091565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036109d257507f0000000000000000000000000000000000000000000000000000000000000000927f000000000000000000000000000000000000000000000000000000000000000092509050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036104c057507f0000000000000000000000000000000000000000000000000000000000000000927f000000000000000000000000000000000000000000000000000000000000000092509050565b610a5d6117d0565b6001600160a01b03165f90815260208190526040902080546001600160a01b03191633179055565b5f5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610b2e57507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000610bd0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c057507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9193909250565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610cbe576001836001811115610c2657610c2661233c565b14610c72577f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610cb5565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005b91509150610d9d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c0576001836001811115610d0b57610d0b61233c565b14610d57577f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610cb5565b507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9250929050565b610dac61184e565b5f5c610dcb5760405163f874d85960e01b815260040160405180910390fd5b5f80805d50565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e315750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e4e576040516336ed4fb960e01b815260040160405180910390fd5b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ea5577f0000000000000000000000000000000000000000000000000000000000000000610ec7565b7f00000000000000000000000000000000000000000000000000000000000000005b9050610ed381836103f0565b15610ef15760405163fc6ba97d60e01b815260040160405180910390fd5b6001600160a01b038281165f9081526020819052604090205416610f44576001600160a01b038084165f90815260208190526040808220548584168352912080546001600160a01b031916919092161790555b505050565b604051631b88d98560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f00000000000000000000000000000000000000000000000000000000000000001690636e236614906064015f604051808303815f87803b158015611015575f5ffd5b505af1158015611027573d5f5f3e3d5ffd5b5050604051631b88d98560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f0000000000000000000000000000000000000000000000000000000000000000169250636e23661491506064015f604051808303815f87803b1580156110f7575f5ffd5b505af1158015611109573d5f5f3e3d5ffd5b50505050565b611117612021565b61111f612021565b5f611129846105a5565b90506001600160a01b03811661113f5750915091565b6001600160a01b038085165f9081526020819052604090205416611162816112ef565b935061116d826112ef565b92505050915091565b61117e61184e565b60015f5c036111a05760405163e17fbf8960e01b815260040160405180910390fd5b6001805f5d50565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005f806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169086160361126957507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000006112e8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316036104c057507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9193509193565b6112f7612021565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611338576104d9611a41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c0576104d9611d31565b6113816117d0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d7577f00000000000000000000000000000000000000000000000000000000000000006113f9565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b039182165f90815260208190526040902080546001600160a01b03191691909216179055565b6040516370a0823160e01b81526001600160a01b0382811660048301525f91908416906370a0823190602401602060405180830381865afa15801561146d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114919190612350565b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611650576040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c0576040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061182f5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61184c576040516310528c6d60e11b815260040160405180910390fd5b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906118b05750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156118e55750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b801561191a5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b801561194f5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119845750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119b95750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119ee5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b8015611a235750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b1561184c5760405163329409fd60e01b815260040160405180910390fd5b611a49612021565b6040518061022001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000001515815250905090565b611d39612021565b6040518061022001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000001515815250905090565b60408051610220810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081019190915290565b80356001600160a01b03811681146105a0575f5ffd5b5f5f604083850312156120d3575f5ffd5b6120dc836120ac565b91506120ea602084016120ac565b90509250929050565b5f60208284031215612103575f5ffd5b611491826120ac565b8051825260208101516020830152604081015161213460408401826001600160a01b03169052565b50606081015161214f60608401826001600160a01b03169052565b50608081015161216a60808401826001600160a01b03169052565b5060a081015161218560a08401826001600160a01b03169052565b5060c08101516121a060c08401826001600160a01b03169052565b5060e08101516121bb60e08401826001600160a01b03169052565b506101008101516121d86101008401826001600160a01b03169052565b506101208101516121f56101208401826001600160a01b03169052565b506101408101516101408301526101608101516101608301526101808101516101808301526101a08101516101a08301526101c08101516101c08301526101e081015161224e6101e08401826001600160a01b03169052565b50610200810151610f4461020084018215159052565b83516001600160a01b0390811682526020808601518216908301526040808601518216908301526060808601518216908301526080808601519083015260a0858101519083015260c0808601519091169082015261052081016122ca60e083018561210c565b61069161030083018461210c565b61044081016122e7828561210c565b61149161022083018461210c565b5f5f60408385031215612306575f5ffd5b61230f836120ac565b9150602083013560028110612322575f5ffd5b809150509250929050565b61022081016104d9828461210c565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612360575f5ffd5b505191905056fea264697066735822122014146ecb6ae8b2bb46c0c40af5a56a85dfd6e840efa2de969da9ab24922c209064736f6c634300081c0033a26469706673582212205c3867d31a7d2fbe870dcded5c2aa5db1c6ff00d34577bfc939fb3fd67086f1264736f6c634300081c003300000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b717000000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d
Deployed Bytecode
0x608060405234801561000f575f5ffd5b5060043610610060575f3560e01c806328cdfde0146100645780635956617c146100a7578063654ec411146100ce578063c2bcfc51146100f5578063db35c4031461011c578063e1329d5514610143575b5f5ffd5b61008b7f00000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f81565b6040516001600160a01b03909116815260200160405180910390f35b61008b7f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b717081565b61008b7f00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d81565b61008b7f000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf81565b61008b7f00000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a2981565b61008b6101513660046117c2565b5f61015d8585846102c2565b61016f8261016a88611aa1565b610401565b610185826101806020860186611b61565b6104da565b61018e82610543565b604051630a8066a560e01b81529091506001600160a01b037f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71701690630a8066a59061024590859085907f00000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29907f000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf907f00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d90600401611b83565b5f604051808303815f87803b15801561025c575f5ffd5b505af115801561026e573d5f5f3e3d5ffd5b5050505061027d828285610a57565b6040516001600160a01b03821681527f520b4351811464729581037d20341082d8883f518612cfb0d3c2f75c12b0c29d9060200160405180910390a195945050505050565b6040516379c682c160e01b81525f906001600160a01b037f00000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f16906379c682c190610310908790600401611da3565b60408051808303815f875af115801561032b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061034f9190611e34565b9150505f7f00000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f6001600160a01b03166379c682c1856040518263ffffffff1660e01b815260040161039f9190611da3565b60408051808303815f875af11580156103ba573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103de9190611e34565b6001600160a01b0393841660e08601529092166102209093019290925250505050565b60a08201516001600160a01b031661042357805161041e90610ae8565b610429565b8160a001515b6001600160a01b0390811660a084015260c083015116610455576104508160200151610ae8565b61045b565b8160c001515b6001600160a01b0390811660c08401526101e083015116610488576104838160400151610ae8565b61048f565b816101e001515b6001600160a01b039081166101e0840152610200830151166104bd576104b88160600151610ae8565b6104c4565b8161020001515b6001600160a01b03166102009092019190915250565b6001600160a01b03811615806104fb575060208201516001600160a01b0316155b610518576040516332c5e96160e01b815260040160405180910390fd5b6001600160a01b0381161561053f5761053081610bcc565b6001600160a01b031660208301525b5050565b5f5f7f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71706001600160a01b03166349f33f2e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156105a1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c59190611e62565b90506105cf61162c565b6105d761162c565b6107df857f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71706001600160a01b031663e20d71706040518163ffffffff1660e01b81526004016040805180830381865afa158015610636573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061065a9190611e8f565b7f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71706001600160a01b031663a4c3e2726040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106da9190611e62565b7f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71706001600160a01b03166363fcc73f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610736573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061075a9190611e62565b7f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b71706001600160a01b031663eeb016f26040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107da9190611e62565b610bdd565b909250905061082f7f00000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610d9a565b6001600160a01b031660408301526108887f00000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610e0b565b6001600160a01b039081166040808401918252840151821660a0808601919091529051909116908201526108fd7f000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610e19565b6001600160a01b031660808301526109567f000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610e27565b6001600160a01b031660808201526109af7f00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610e35565b6001600160a01b031660c0830152610a087f00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d847f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170610e43565b6001600160a01b031660c0820152604051839083908390610a28906116b7565b610a3493929190612041565b604051809103905ff080158015610a4d573d5f5f3e3d5ffd5b5095945050505050565b5f610a656020830183611b61565b6001600160a01b031614610ae35782602001516001600160a01b031663d1f5789483838060200190610a979190612064565b6040518463ffffffff1660e01b8152600401610ab5939291906120ad565b5f604051808303815f87803b158015610acc575f5ffd5b505af1158015610ade573d5f5f3e3d5ffd5b505050505b505050565b80515f906001600160a01b031615610aff57505190565b60208201516001600160a01b038116610b1a57505f92915050565b5f5f826001600160a01b03168560400151604051610b3891906120ec565b5f604051808303815f865af19150503d805f8114610b71576040519150601f19603f3d011682016040523d82523d5f602084013e610b76565b606091505b5091509150818015610b89575080516020145b8390610bb957604051630557304160e31b81526001600160a01b0390911660048201526024015b60405180910390fd5b50610bc381612102565b95945050505050565b5f610bd7825f610e51565b92915050565b610be561162c565b610bed61162c565b610bfa8787878787610ee1565b5060208701516001600160a01b039081166101e084015260808801518116606084015260a0880151811660e084015260c08801511615610c3e578660c00151610c44565b8660a001515b6001600160a01b039081166101008085019190915260e0808a0151831661012080870191909152918a015161014080870191909152918a015161016080870191909152918a01516101808087019190915260408b01516020808801919091526060808d01518852938c01516101a080890191909152918c01516101c080890191909152918c0151151561020080890191909152908c015185166101e080880191909152918c01518516938601939093528a01518316908401528801511615610d1157866102000151610d18565b866101e001515b6001600160a01b039081166101008301526102208801511661012082015261024087015161014082015261026087015161016082015261028087015161018082015260408701516020820152606087015181526102a08701516101a08201526102c08701516101c08201526102e0909601511515610200870152959350505050565b5f610e0384610da8856113ab565b604051603881018690526f5af43d82803e903d91602b57fd5bf3ff60248201526014810192909252733d602d80600a3d3981f3363d3d373d3d3d363d73825260588201526037600c8201206078820152605560439091012090565b949350505050565b5f610e0384610da885611405565b5f610e0384610da885611442565b5f610e0384610da88561147f565b5f610e0384610da8856114bc565b5f610e0384610da8856114f9565b5f81471015610e7c5760405163cf47918160e01b815247600482015260248101839052604401610bb0565b6e5af43d82803e903d91602b57fd5bf360205282601152763d602d80600a3d3981f3363d3d373d3d3d363d730000008360881c175f526037600983f090506001600160a01b038116610bd75760405163b06ebf3d60e01b815260040160405180910390fd5b60208501515f906001600160a01b0316610f0e5760405163d83793a160e01b815260040160405180910390fd5b60808601516001600160a01b0316610f3957604051636bb1aa5360e11b815260040160405180910390fd5b6101c08601516001600160a01b0316610f6557604051634eaf414f60e11b815260040160405180910390fd5b856101c001516001600160a01b031686608001516001600160a01b031603610fa05760405163534c524d60e11b815260040160405180910390fd5b610100860151151580610fb7575061024086015115155b610fd4576040516375fcbb8960e01b815260040160405180910390fd5b8561012001518661010001511115610fff576040516375fcbb8960e01b815260040160405180910390fd5b856102600151866102400151111561102a576040516375fcbb8960e01b815260040160405180910390fd5b8186610160015111156110505760405163f817842b60e01b815260040160405180910390fd5b81866102a0015111156110765760405163f817842b60e01b815260040160405180910390fd5b670de0b6b3a76400008661016001518761012001516110959190612125565b11156110b4576040516313fd16a560e11b815260040160405180910390fd5b670de0b6b3a7640000866102a001518761026001516110d39190612125565b11156110f2576040516313fd16a560e11b815260040160405180910390fd5b60c08601516001600160a01b03161580611118575060a08601516001600160a01b031615155b6111355760405163952268d360e01b815260040160405180910390fd5b856101a001511580611153575060a08601516001600160a01b031615155b611170576040516349cc353360e01b815260040160405180910390fd5b6102008601516001600160a01b0316158061119857506101e08601516001600160a01b031615155b6111b55760405163952268d360e01b815260040160405180910390fd5b856102e0015115806111d457506101e08601516001600160a01b031615155b6111f1576040516349cc353360e01b815260040160405180910390fd5b6111fa86611536565b60408601511580611214575085516001600160a01b031615155b6112315760405163043c669f60e01b815260040160405180910390fd5b838660400151111561125657604051632b01a30160e01b815260040160405180910390fd5b606086015185516001600160801b031611156112855760405163722a3f8560e01b815260040160405180910390fd5b84602001516001600160801b0316866060015111156112b757604051636adeb10960e11b815260040160405180910390fd5b8286610180015111156112dd5760405163923f853d60e01b815260040160405180910390fd5b82866102c0015111156113035760405163923f853d60e01b815260040160405180910390fd5b856101200151866101400151111561132e5760405163250a504d60e11b815260040160405180910390fd5b85610260015186610280015111156113595760405163250a504d60e11b815260040160405180910390fd5b60e08601516001600160a01b03161580159061138257506102208601516001600160a01b031615155b61139f57604051632e4e395f60e01b815260040160405180910390fd5b50600195945050505050565b5f817f1d056e62b182fd7d4dada6cf9079a3ba83adb009746718f4f8751cbe6b93da616040516020016113e8929190918252602082015260400190565b604051602081830303815290604052805190602001209050919050565b5f817fccf028ea8322db4ac7e226915bfb048583cd927e584ca9a1865904fbc439f6636040516020016113e8929190918252602082015260400190565b5f817f4245b46a55891445529f9a01161a9f64cdec348f693a26b07e5f0aa22b486b7d6040516020016113e8929190918252602082015260400190565b5f817f700bad9da2e1385ef7139f09887b5c24cdbc6e2d1b8562842d95da2e68c340cd6040516020016113e8929190918252602082015260400190565b5f817fbe4a9bb64c254c9ac164216a73a2afa86df28fb3a0204a98a311293dcd5f35fc6040516020016113e8929190918252602082015260400190565b5f817ff36c517579d731f207a45998256dee21125b3bb93f46a3a5d2a4caff5251ca746040516020016113e8929190918252602082015260400190565b5f611545818360a00151611573565b9050611555818360c00151611573565b905061156681836101e00151611573565b9050610ae3818361020001515b5f6001600160a01b038216611589575081610bd7565b816001600160a01b031663217a4b706040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115c5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115e99190612144565b90506001600160a01b03831615610bd757806001600160a01b0316836001600160a01b031614610bd7576040516368ada7f160e11b815260040160405180910390fd5b60408051610220810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081019190915290565b612ce78061216083390190565b5f61014082840312156116d5575f5ffd5b50919050565b634e487b7160e01b5f52604160045260245ffd5b60405161030081016001600160401b0381118282101715611712576117126116db565b60405290565b604051606081016001600160401b0381118282101715611712576117126116db565b604051608081016001600160401b0381118282101715611712576117126116db565b604051601f8201601f191681016001600160401b0381118282101715611784576117846116db565b604052919050565b6001600160a01b03811681146117a0575f5ffd5b50565b80356117ae8161178c565b919050565b803580151581146117ae575f5ffd5b5f5f5f5f5f8587036105c08112156117d8575f5ffd5b86356001600160401b038111156117ed575f5ffd5b87016080818a0312156117fe575f5ffd5b955061180d88602089016116c4565b945061181d8861016089016116c4565b93506102a08701356001600160401b03811115611838575f5ffd5b87016040818a031215611849575f5ffd5b92506103006102bf198201121561185e575f5ffd5b506118676116ef565b6118746102c088016117a3565b81526118836102e088016117a3565b6020820152610300870135604082015261032087013560608201526118ab61034088016117a3565b60808201526118bd61036088016117a3565b60a08201526118cf61038088016117a3565b60c08201526118e16103a088016117a3565b60e08201526103c08701356101008201526103e087013561012082015261040087013561014082015261042087013561016082015261044087013561018082015261192f61046088016117b3565b6101a082015261194261048088016117a3565b6101c08201526119556104a088016117a3565b6101e08201526119686104c088016117a3565b61020082015261197b6104e088016117a3565b6102208201526105008701356102408201526105208701356102608201526105408701356102808201526105608701356102a08201526105808701356102c08201526119ca6105a088016117b3565b6102e0820152809150509295509295909350565b5f606082840312156119ee575f5ffd5b6119f6611718565b90508135611a038161178c565b81526020820135611a138161178c565b602082015260408201356001600160401b03811115611a30575f5ffd5b8201601f81018413611a40575f5ffd5b80356001600160401b03811115611a5957611a596116db565b611a6c601f8201601f191660200161175c565b818152856020838501011115611a80575f5ffd5b816020840160208301375f6020838301015280604085015250505092915050565b5f60808236031215611ab1575f5ffd5b611ab961173a565b82356001600160401b03811115611ace575f5ffd5b611ada368286016119de565b82525060208301356001600160401b03811115611af5575f5ffd5b611b01368286016119de565b60208301525060408301356001600160401b03811115611b1f575f5ffd5b611b2b368286016119de565b60408301525060608301356001600160401b03811115611b49575f5ffd5b611b55368286016119de565b60608301525092915050565b5f60208284031215611b71575f5ffd5b8135611b7c8161178c565b9392505050565b85516001600160a01b0316815261038081016020870151611baf60208401826001600160a01b03169052565b5060408701516040830152606087015160608301526080870151611bde60808401826001600160a01b03169052565b5060a0870151611bf960a08401826001600160a01b03169052565b5060c0870151611c1460c08401826001600160a01b03169052565b5060e0870151611c2f60e08401826001600160a01b03169052565b506101008701516101008301526101208701516101208301526101408701516101408301526101608701516101608301526101808701516101808301526101a0870151611c816101a084018215159052565b506101c0870151611c9e6101c08401826001600160a01b03169052565b506101e0870151611cbb6101e08401826001600160a01b03169052565b50610200870151611cd86102008401826001600160a01b03169052565b50610220870151611cf56102208401826001600160a01b03169052565b506102408701516102408301526102608701516102608301526102808701516102808301526102a08701516102a08301526102c08701516102c08301526102e0870151611d476102e084018215159052565b506001600160a01b0386166103008301526001600160a01b0385166103208301526001600160a01b0384166103408301526001600160a01b0383166103608301529695505050505050565b8035600d81900b81146117ae575f5ffd5b813581526020808301359082015260408083013590820152606080830135908201526080808301359082015260a0808301359082015260c0808301359082015260e080830135908201526101408101611dff6101008401611d92565b611e0f610100840182600d0b9052565b50611e1d6101208401611d92565b611e2d610120840182600d0b9052565b5092915050565b5f5f60408385031215611e45575f5ffd5b825191506020830151611e578161178c565b809150509250929050565b5f60208284031215611e72575f5ffd5b5051919050565b80516001600160801b03811681146117ae575f5ffd5b5f6040828403128015611ea0575f5ffd5b50604080519081016001600160401b0381118282101715611ec357611ec36116db565b604052611ecf83611e79565b8152611edd60208401611e79565b60208201529392505050565b80518252602081015160208301526040810151611f1160408401826001600160a01b03169052565b506060810151611f2c60608401826001600160a01b03169052565b506080810151611f4760808401826001600160a01b03169052565b5060a0810151611f6260a08401826001600160a01b03169052565b5060c0810151611f7d60c08401826001600160a01b03169052565b5060e0810151611f9860e08401826001600160a01b03169052565b50610100810151611fb56101008401826001600160a01b03169052565b50610120810151611fd26101208401826001600160a01b03169052565b506101408101516101408301526101608101516101608301526101808101516101808301526101a08101516101a08301526101c08101516101c08301526101e081015161202b6101e08401826001600160a01b03169052565b50610200810151610ae361020084018215159052565b83815261046081016120566020830185611ee9565b610e03610240830184611ee9565b5f5f8335601e19843603018112612079575f5ffd5b8301803591506001600160401b03821115612092575f5ffd5b6020019150368190038213156120a6575f5ffd5b9250929050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f82518060208501845e5f920191825250919050565b805160208083015191908110156116d5575f1960209190910360031b1b16919050565b80820180821115610bd757634e487b7160e01b5f52601160045260245ffd5b5f60208284031215612154575f5ffd5b8151611b7c8161178c56fe610480604052348015610010575f5ffd5b50604051612ce7380380612ce783398101604081905261002f916104c5565b608083905260208201518251670de0b6b3a76400009161004e91610502565b1061006c5760405163cd4e616760e01b815260040160405180910390fd5b815f015160a08181525050816020015160c08181525050816101e001516001600160a01b031660e0816001600160a01b03168152505081604001516001600160a01b0316610100816001600160a01b03168152505081606001516001600160a01b0316610120816001600160a01b03168152505081608001516001600160a01b0316610140816001600160a01b03168152505081604001516001600160a01b0316610160816001600160a01b0316815250508160c001516001600160a01b0316610180816001600160a01b0316815250508160e001516001600160a01b03166101a0816001600160a01b0316815250508161010001516001600160a01b03166101c0816001600160a01b0316815250508161012001516001600160a01b03166101e0816001600160a01b031681525050816101400151610200818152505081610160015161022081815250508161018001516102408181525050816101a001516102608181525050816101c00151610280818152505081610200015115156102a08115158152505080604001516001600160a01b03166102c0816001600160a01b03168152505080606001516001600160a01b03166102e0816001600160a01b03168152505080608001516001600160a01b0316610300816001600160a01b03168152505080604001516001600160a01b0316610320816001600160a01b0316815250508060c001516001600160a01b0316610340816001600160a01b0316815250508060e001516001600160a01b0316610360816001600160a01b0316815250508061010001516001600160a01b0316610380816001600160a01b0316815250508061012001516001600160a01b03166103a0816001600160a01b0316815250508061014001516103c081815250508061016001516103e081815250508061018001516104008181525050806101a001516104208181525050806101c001516104408181525050806102000151151561046081151581525050505050610527565b60405161022081016001600160401b038111828210171561037d57634e487b7160e01b5f52604160045260245ffd5b60405290565b80516001600160a01b0381168114610399575f5ffd5b919050565b80518015158114610399575f5ffd5b5f61022082840312156103be575f5ffd5b6103c661034e565b825181526020808401519082015290506103e260408301610383565b60408201526103f360608301610383565b606082015261040460808301610383565b608082015261041560a08301610383565b60a082015261042660c08301610383565b60c082015261043760e08301610383565b60e08201526104496101008301610383565b61010082015261045c6101208301610383565b6101208201526101408281015190820152610160808301519082015261018080830151908201526101a080830151908201526101c080830151908201526104a66101e08301610383565b6101e08201526104b9610200830161039e565b61020082015292915050565b5f5f5f61046084860312156104d8575f5ffd5b835192506104e985602086016103ad565b91506104f98561024086016103ad565b90509250925092565b8082018082111561052157634e487b7160e01b5f52601160045260245ffd5b92915050565b60805160a05160c05160e05161010051610120516101405161016051610180516101a0516101c0516101e05161020051610220516102405161026051610280516102a0516102c0516102e05161030051610320516103405161036051610380516103a0516103c0516103e0516104005161042051610440516104605161239d61094a5f395f611ff801525f81816112a50152611fa301525f611f7d01525f611f5701525f611f3101525f611f0b01525f818161079e015281816110400152818161179e0152611edc01525f611ead01525f611e7e01525f818161042f015281816105d901528181610a0e01528181610bb001528181610e0f01528181611a000152611e4f01525f8181610b8d01528181610d5a015281816116f40152818161192c0152611e2001525f8181610b6a01528181610d1201528181611723015281816119960152611df101525f818161057c01528181610a3001528181610d3301528181610d7d015281816112c8015281816116c50152611dc201525f818161038f0152818161045f015281816105420152818161064b01528181610764015281816108b1015281816108d7015281816109d401528181610b3001528181610cc001528181610e81015281816110b40152818161126b0152818161133a015281816113d901528181611652015281816116960152818161180d0152818161188d0152611d9301525f611d0801525f81816112220152611cb301525f611c8d01525f611c6701525f611c4101525f611c1b01525f818161073e01528181610f600152818161161e0152611bec01525f611bbd01525f611b8e01525f818161049b015281816105ac0152818161098b01528181610b0a01528181610ddd01528181610e5a015281816119cb0152611b5f01525f8181610ae701528181610c7401528181611574015281816118f70152611b3001525f8181610ac401528181610c2d015281816115a3015281816119610152611b0101525f818161051c015281816109ad01528181610c4e01528181610c9501528181611245015281816115450152611ad201525f818161036e015281816103f3015281816104e2015281816106710152818161070401528181610877015281816109110152818161095101528181610a8a01528181610bdb01528181610ea701528181610fd4015281816111f6015281816112f90152818161138c015281816113b3015281816114d201528181611516015281816117db015281816118590152611aa301525f81816118c201528181611cd90152611fc901525f818161080301528181610fae0152818161108e015281816111cb015281816115f80152818161177801528181611a7d0152611d6d01525f81816107dd01528181610f8801528181611068015281816111aa015281816115d20152818161175201528181611a570152611d4701525f6101ce015261239d5ff3fe608060405234801561000f575f5ffd5b506004361061013d575f3560e01c806362402b04116100b4578063a135e0a011610079578063a135e0a014610308578063a5abc68a14610344578063aecc90cb1461036c578063d2c725e0146103b3578063e48a5f7b146103bd578063f6f8174f146103dd575f5ffd5b806362402b04146102ca57806372db6559146102d25780637d16b1f5146102e557806394c0527d146102ed5780639dd4133014610300575f5ffd5b8063255d70c811610105578063255d70c8146101fe5780632e6da205146102135780633c3eac121461023457806340c755e114610267578063483b24f01461027a5780634b82d63d146102b7575f5ffd5b8063038c0a5e1461014157806307439b49146101695780630b1d67c6146101945780631544a6db146101a7578063189e17e4146101c9575b5f5ffd5b61015461014f3660046120c2565b6103f0565b60405190151581526020015b60405180910390f35b61017c6101773660046120f3565b6104df565b6040516001600160a01b039091168152602001610160565b61017c6101a23660046120f3565b6105a5565b6101ba6101b53660046120c2565b610699565b60405161016093929190612264565b6101f07f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610160565b61021161020c3660046120f3565b610701565b005b6102266102213660046120f3565b610864565b6040516101609291906122d8565b6102476102423660046120f3565b61094d565b604080516001600160a01b03938416815292909116602083015201610160565b6102116102753660046120f3565b610a55565b61028d6102883660046120f3565b610a85565b604080516001600160a01b0394851681529284166020840152921691810191909152606001610160565b6102476102c53660046122f5565b610bd7565b610211610da4565b6102116102e03660046120c2565b610dd2565b610211610f49565b6102266102fb3660046120f3565b61110f565b610211611176565b61031b6103163660046120f3565b6111a8565b604080519485526020850193909352918301526001600160a01b03166060820152608001610160565b61017c6103523660046120f3565b5f602081905290815260409020546001600160a01b031681565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610247565b60015f5c14610154565b6103d06103cb3660046120f3565b6112ef565b604051610160919061232d565b6102116103eb3660046120f3565b611379565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03160361045d576104547f000000000000000000000000000000000000000000000000000000000000000083611426565b151590506104d9565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036104c0576104547f000000000000000000000000000000000000000000000000000000000000000083611426565b6040516349d73a2760e01b815260040160405180910390fd5b92915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361054057507f0000000000000000000000000000000000000000000000000000000000000000919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c057507f0000000000000000000000000000000000000000000000000000000000000000919050565b919050565b5f5f6105d17f000000000000000000000000000000000000000000000000000000000000000084611426565b90505f6105fe7f000000000000000000000000000000000000000000000000000000000000000085611426565b905081158061060b575080155b6106285760405163fc6ba97d60e01b815260040160405180910390fd5b81158015610634575080155b1561064257505f9392505050565b815f0361066f577f0000000000000000000000000000000000000000000000000000000000000000610691565b7f00000000000000000000000000000000000000000000000000000000000000005b949350505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091526106d9612021565b6106e1612021565b6106ea85611498565b92506106f58461110f565b93969095509293505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361076257507f00000000000000000000000000000000000000000000000000000000000000006107be565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c057507f00000000000000000000000000000000000000000000000000000000000000005b604051631b88d98560e21b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f00000000000000000000000000000000000000000000000000000000000000006044830152831690636e236614906064015f604051808303815f87803b15801561084a575f5ffd5b505af115801561085c573d5f5f3e3d5ffd5b505050505050565b61086c612021565b610874612021565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036108d557507f0000000000000000000000000000000000000000000000000000000000000000610931565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c057507f00000000000000000000000000000000000000000000000000000000000000005b61093a816112ef565b9250610945846112ef565b915050915091565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036109d257507f0000000000000000000000000000000000000000000000000000000000000000927f000000000000000000000000000000000000000000000000000000000000000092509050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036104c057507f0000000000000000000000000000000000000000000000000000000000000000927f000000000000000000000000000000000000000000000000000000000000000092509050565b610a5d6117d0565b6001600160a01b03165f90815260208190526040902080546001600160a01b03191633179055565b5f5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610b2e57507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f0000000000000000000000000000000000000000000000000000000000000000610bd0565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c057507f000000000000000000000000000000000000000000000000000000000000000091507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9193909250565b5f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b031603610cbe576001836001811115610c2657610c2661233c565b14610c72577f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610cb5565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005b91509150610d9d565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316846001600160a01b0316036104c0576001836001811115610d0b57610d0b61233c565b14610d57577f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000610cb5565b507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9250929050565b610dac61184e565b5f5c610dcb5760405163f874d85960e01b815260040160405180910390fd5b5f80805d50565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610e315750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610e4e576040516336ed4fb960e01b815260040160405180910390fd5b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ea5577f0000000000000000000000000000000000000000000000000000000000000000610ec7565b7f00000000000000000000000000000000000000000000000000000000000000005b9050610ed381836103f0565b15610ef15760405163fc6ba97d60e01b815260040160405180910390fd5b6001600160a01b038281165f9081526020819052604090205416610f44576001600160a01b038084165f90815260208190526040808220548584168352912080546001600160a01b031916919092161790555b505050565b604051631b88d98560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f00000000000000000000000000000000000000000000000000000000000000001690636e236614906064015f604051808303815f87803b158015611015575f5ffd5b505af1158015611027573d5f5f3e3d5ffd5b5050604051631b88d98560e21b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000060248301527f000000000000000000000000000000000000000000000000000000000000000060448301527f0000000000000000000000000000000000000000000000000000000000000000169250636e23661491506064015f604051808303815f87803b1580156110f7575f5ffd5b505af1158015611109573d5f5f3e3d5ffd5b50505050565b611117612021565b61111f612021565b5f611129846105a5565b90506001600160a01b03811661113f5750915091565b6001600160a01b038085165f9081526020819052604090205416611162816112ef565b935061116d826112ef565b92505050915091565b61117e61184e565b60015f5c036111a05760405163e17fbf8960e01b815260040160405180910390fd5b6001805f5d50565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005f806001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169086160361126957507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000006112e8565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316036104c057507f000000000000000000000000000000000000000000000000000000000000000090507f00000000000000000000000000000000000000000000000000000000000000005b9193509193565b6112f7612021565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611338576104d9611a41565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c0576104d9611d31565b6113816117d0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113d7577f00000000000000000000000000000000000000000000000000000000000000006113f9565b7f00000000000000000000000000000000000000000000000000000000000000005b6001600160a01b039182165f90815260208190526040902080546001600160a01b03191691909216179055565b6040516370a0823160e01b81526001600160a01b0382811660048301525f91908416906370a0823190602401602060405180830381865afa15801561146d573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114919190612350565b9392505050565b6040805160e0810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c08101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b031603611650576040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152509050919050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316036104c0576040518060e001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152509050919050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148061182f5750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b61184c576040516310528c6d60e11b815260040160405180910390fd5b565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015906118b05750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156118e55750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b801561191a5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b801561194f5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119845750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119b95750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b80156119ee5750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b8015611a235750336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614155b1561184c5760405163329409fd60e01b815260040160405180910390fd5b611a49612021565b6040518061022001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000001515815250905090565b611d39612021565b6040518061022001604052807f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f000000000000000000000000000000000000000000000000000000000000000081526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000001515815250905090565b60408051610220810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e0810182905261020081019190915290565b80356001600160a01b03811681146105a0575f5ffd5b5f5f604083850312156120d3575f5ffd5b6120dc836120ac565b91506120ea602084016120ac565b90509250929050565b5f60208284031215612103575f5ffd5b611491826120ac565b8051825260208101516020830152604081015161213460408401826001600160a01b03169052565b50606081015161214f60608401826001600160a01b03169052565b50608081015161216a60808401826001600160a01b03169052565b5060a081015161218560a08401826001600160a01b03169052565b5060c08101516121a060c08401826001600160a01b03169052565b5060e08101516121bb60e08401826001600160a01b03169052565b506101008101516121d86101008401826001600160a01b03169052565b506101208101516121f56101208401826001600160a01b03169052565b506101408101516101408301526101608101516101608301526101808101516101808301526101a08101516101a08301526101c08101516101c08301526101e081015161224e6101e08401826001600160a01b03169052565b50610200810151610f4461020084018215159052565b83516001600160a01b0390811682526020808601518216908301526040808601518216908301526060808601518216908301526080808601519083015260a0858101519083015260c0808601519091169082015261052081016122ca60e083018561210c565b61069161030083018461210c565b61044081016122e7828561210c565b61149161022083018461210c565b5f5f60408385031215612306575f5ffd5b61230f836120ac565b9150602083013560028110612322575f5ffd5b809150509250929050565b61022081016104d9828461210c565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215612360575f5ffd5b505191905056fea264697066735822122014146ecb6ae8b2bb46c0c40af5a56a85dfd6e840efa2de969da9ab24922c209064736f6c634300081c0033a26469706673582212205c3867d31a7d2fbe870dcded5c2aa5db1c6ff00d34577bfc939fb3fd67086f1264736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b717000000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d
-----Decoded View---------------
Arg [0] : _irmConfigFactory (address): 0x45adB05683a27a71BF161825de3291aC2F9B6c3F
Arg [1] : _siloFactory (address): 0xa42001D6d2237d2c74108FE360403C4b796B7170
Arg [2] : _siloImpl (address): 0x85b0273b0B415F9e28B9ce820240F4aa097F2a29
Arg [3] : _shareProtectedCollateralTokenImpl (address): 0xb58B331b9cf46c597A34F9e198e8bB9ec5f17ADf
Arg [4] : _shareDebtTokenImpl (address): 0x74477D70453213Dc1484503dABCDb64f9146884d
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000045adb05683a27a71bf161825de3291ac2f9b6c3f
Arg [1] : 000000000000000000000000a42001d6d2237d2c74108fe360403c4b796b7170
Arg [2] : 00000000000000000000000085b0273b0b415f9e28b9ce820240f4aa097f2a29
Arg [3] : 000000000000000000000000b58b331b9cf46c597a34f9e198e8bb9ec5f17adf
Arg [4] : 00000000000000000000000074477d70453213dc1484503dabcdb64f9146884d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.