Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- Factory
- Optimization enabled
- true
- Compiler version
- v0.5.16+commit.9c3226ce
- Optimization runs
- 200
- EVM Version
- istanbul
- Verified at
- 2026-04-22T09:52:02.297507Z
Constructor Arguments
0000000000000000000000001bb4e4fc22b4e2470a05b60c2943f88b832cea100000000000000000000000001e6bf02f5bad0a8aa93df20955feff295d97f969000000000000000000000000b092e1bf50f518b3ebf7ed26a40015183ae36ac2000000000000000000000000b3f352c936ce9c29c40d8befae9caebbcc0b62520000000000000000000000001d90fdac4dd30c3ba38d53f52a884f6e75d0989e
Arg [0] (address) : 0x1bb4e4fc22b4e2470a05b60c2943f88b832cea10
Arg [1] (address) : 0x1e6bf02f5bad0a8aa93df20955feff295d97f969
Arg [2] (address) : 0xb092e1bf50f518b3ebf7ed26a40015183ae36ac2
Arg [3] (address) : 0xb3f352c936ce9c29c40d8befae9caebbcc0b6252
Arg [4] (address) : 0x1d90fdac4dd30c3ba38d53f52a884f6e75d0989e
contracts/Factory.sol
pragma solidity =0.5.16;
import "./interfaces/IFactory.sol";
import "./interfaces/IBDeployer.sol";
import "./interfaces/IBorrowable.sol";
import "./interfaces/ICDeployer.sol";
import "./interfaces/ICollateral.sol";
import "./interfaces/IERC20.sol";
import "./interfaces/IBaseV1Pair.sol";
import "./interfaces/ITarotSolidlyPriceOracleV2.sol";
contract Factory is IFactory {
address public admin;
address public pendingAdmin;
address public reservesAdmin;
address public reservesPendingAdmin;
address public reservesManager;
struct LendingPool {
bool initialized;
uint24 lendingPoolId;
address collateral;
address borrowable0;
address borrowable1;
}
mapping(address => LendingPool) public getLendingPool; // get by UniswapV2Pair
address[] public allLendingPools; // address of the UniswapV2Pair
function allLendingPoolsLength() external view returns (uint256) {
return allLendingPools.length;
}
IBDeployer public bDeployer;
ICDeployer public cDeployer;
ITarotSolidlyPriceOracleV2 public tarotPriceOracle;
event LendingPoolInitialized(
address indexed uniswapV2Pair,
address indexed token0,
address indexed token1,
address collateral,
address borrowable0,
address borrowable1,
uint256 lendingPoolId
);
event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);
event NewAdmin(address oldAdmin, address newAdmin);
event NewReservesPendingAdmin(
address oldReservesPendingAdmin,
address newReservesPendingAdmin
);
event NewReservesAdmin(address oldReservesAdmin, address newReservesAdmin);
event NewReservesManager(
address oldReservesManager,
address newReservesManager
);
constructor(
address _admin,
address _reservesAdmin,
IBDeployer _bDeployer,
ICDeployer _cDeployer,
ITarotSolidlyPriceOracleV2 _tarotPriceOracle
) public {
admin = _admin;
reservesAdmin = _reservesAdmin;
bDeployer = _bDeployer;
cDeployer = _cDeployer;
tarotPriceOracle = _tarotPriceOracle;
emit NewAdmin(address(0), _admin);
emit NewReservesAdmin(address(0), _reservesAdmin);
}
function _getTokens(address uniswapV2Pair)
private
view
returns (address token0, address token1)
{
token0 = IBaseV1Pair(uniswapV2Pair).token0();
token1 = IBaseV1Pair(uniswapV2Pair).token1();
}
function _createLendingPool(address uniswapV2Pair) private {
if (getLendingPool[uniswapV2Pair].lendingPoolId != 0) return;
allLendingPools.push(uniswapV2Pair);
getLendingPool[uniswapV2Pair] = LendingPool(
false,
uint24(allLendingPools.length),
address(0),
address(0),
address(0)
);
}
function createCollateral(address uniswapV2Pair)
external
returns (address collateral)
{
_getTokens(uniswapV2Pair);
require(
getLendingPool[uniswapV2Pair].collateral == address(0),
"Tarot: ALREADY_EXISTS"
);
collateral = cDeployer.deployCollateral(uniswapV2Pair);
ICollateral(collateral)._setFactory();
_createLendingPool(uniswapV2Pair);
getLendingPool[uniswapV2Pair].collateral = collateral;
}
function createBorrowable0(address uniswapV2Pair)
external
returns (address borrowable0)
{
_getTokens(uniswapV2Pair);
require(
getLendingPool[uniswapV2Pair].borrowable0 == address(0),
"Tarot: ALREADY_EXISTS"
);
borrowable0 = bDeployer.deployBorrowable(uniswapV2Pair, 0);
IBorrowable(borrowable0)._setFactory();
_createLendingPool(uniswapV2Pair);
getLendingPool[uniswapV2Pair].borrowable0 = borrowable0;
}
function createBorrowable1(address uniswapV2Pair)
external
returns (address borrowable1)
{
_getTokens(uniswapV2Pair);
require(
getLendingPool[uniswapV2Pair].borrowable1 == address(0),
"Tarot: ALREADY_EXISTS"
);
borrowable1 = bDeployer.deployBorrowable(uniswapV2Pair, 1);
IBorrowable(borrowable1)._setFactory();
_createLendingPool(uniswapV2Pair);
getLendingPool[uniswapV2Pair].borrowable1 = borrowable1;
}
function initializeLendingPool(address uniswapV2Pair) external {
require(IBaseV1Pair(uniswapV2Pair).stable(), "Tarot: STABLE");
(address token0, address token1) = _getTokens(uniswapV2Pair);
LendingPool memory lPool = getLendingPool[uniswapV2Pair];
require(!lPool.initialized, "Tarot: ALREADY_INITIALIZED");
require(
lPool.collateral != address(0),
"Tarot: COLLATERALIZABLE_NOT_CREATED"
);
require(
lPool.borrowable0 != address(0),
"Tarot: BORROWABLE0_NOT_CREATED"
);
require(
lPool.borrowable1 != address(0),
"Tarot: BORROWABLE1_NOT_CREATED"
);
tarotPriceOracle.getResult(uniswapV2Pair);
ICollateral(lPool.collateral)._initialize(
"Tarot Collateral",
"cTAROT",
uniswapV2Pair,
lPool.borrowable0,
lPool.borrowable1
);
IBorrowable(lPool.borrowable0)._initialize(
"Tarot Borrowable",
"bTAROT",
token0,
lPool.collateral
);
IBorrowable(lPool.borrowable1)._initialize(
"Tarot Borrowable",
"bTAROT",
token1,
lPool.collateral
);
getLendingPool[uniswapV2Pair].initialized = true;
emit LendingPoolInitialized(
uniswapV2Pair,
token0,
token1,
lPool.collateral,
lPool.borrowable0,
lPool.borrowable1,
lPool.lendingPoolId
);
}
function _setPendingAdmin(address newPendingAdmin) external {
require(msg.sender == admin, "Tarot: UNAUTHORIZED");
address oldPendingAdmin = pendingAdmin;
pendingAdmin = newPendingAdmin;
emit NewPendingAdmin(oldPendingAdmin, newPendingAdmin);
}
function _acceptAdmin() external {
require(msg.sender == pendingAdmin, "Tarot: UNAUTHORIZED");
address oldAdmin = admin;
address oldPendingAdmin = pendingAdmin;
admin = pendingAdmin;
pendingAdmin = address(0);
emit NewAdmin(oldAdmin, admin);
emit NewPendingAdmin(oldPendingAdmin, address(0));
}
function _setReservesPendingAdmin(address newReservesPendingAdmin)
external
{
require(msg.sender == reservesAdmin, "Tarot: UNAUTHORIZED");
address oldReservesPendingAdmin = reservesPendingAdmin;
reservesPendingAdmin = newReservesPendingAdmin;
emit NewReservesPendingAdmin(
oldReservesPendingAdmin,
newReservesPendingAdmin
);
}
function _acceptReservesAdmin() external {
require(msg.sender == reservesPendingAdmin, "Tarot: UNAUTHORIZED");
address oldReservesAdmin = reservesAdmin;
address oldReservesPendingAdmin = reservesPendingAdmin;
reservesAdmin = reservesPendingAdmin;
reservesPendingAdmin = address(0);
emit NewReservesAdmin(oldReservesAdmin, reservesAdmin);
emit NewReservesPendingAdmin(oldReservesPendingAdmin, address(0));
}
function _setReservesManager(address newReservesManager) external {
require(msg.sender == reservesAdmin, "Tarot: UNAUTHORIZED");
address oldReservesManager = reservesManager;
reservesManager = newReservesManager;
emit NewReservesManager(oldReservesManager, newReservesManager);
}
}
/
pragma solidity >=0.5;
interface ITarotSolidlyPriceOracleV2 {
function MIN_T() external pure returns (uint32);
function getResult(address pair) external returns (uint112 reserve0, uint112 reserve1, uint32 T);
}
/
pragma solidity >=0.5.0;
interface ICollateral {
/*** Tarot ERC20 ***/
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/*** Pool Token ***/
event Mint(
address indexed sender,
address indexed minter,
uint256 mintAmount,
uint256 mintTokens
);
event Redeem(
address indexed sender,
address indexed redeemer,
uint256 redeemAmount,
uint256 redeemTokens
);
event Sync(uint256 totalBalance);
function underlying() external view returns (address);
function factory() external view returns (address);
function totalBalance() external view returns (uint256);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function exchangeRate() external returns (uint256);
function mint(address minter) external returns (uint256 mintTokens);
function redeem(address redeemer) external returns (uint256 redeemAmount);
function skim(address to) external;
function sync() external;
function _setFactory() external;
/*** Collateral ***/
function borrowable0() external view returns (address);
function borrowable1() external view returns (address);
function tarotPriceOracle() external view returns (address);
function safetyMargin() external view returns (uint256);
function mTolerance() external view returns (uint256);
function liquidationIncentive() external view returns (uint256);
function liquidationFee() external view returns (uint256);
function liquidationPenalty() external view returns (uint256);
function getPrices() external returns (uint256 price0, uint256 price1);
function getReserves() external returns (uint112 reserve0, uint112 reserve1);
function tokensUnlocked(address from, uint256 value)
external
returns (bool);
function accountLiquidityAmounts(
address account,
uint256 amount0,
uint256 amount1
) external returns (uint256 liquidity, uint256 shortfall);
function accountLiquidity(address account)
external
returns (uint256 liquidity, uint256 shortfall);
function canBorrow(
address account,
address borrowable,
uint256 accountBorrows
) external returns (bool);
function seize(
address liquidator,
address borrower,
uint256 repayAmount
) external returns (uint256 seizeTokens);
function flashRedeem(
address redeemer,
uint256 redeemAmount,
bytes calldata data
) external;
/*** Collateral Setter ***/
event NewSafetyMargin(uint256 newSafetyMarginSqrt);
event NewLiquidationIncentive(uint256 newLiquidationIncentive);
event NewLiquidationFee(uint256 newLiquidationFee);
event NewMTolerance(uint256 mTolerance);
function M_TOLERANCE_MIN() external pure returns (uint256);
function M_TOLERANCE_MAX() external pure returns (uint256);
function SAFETY_MARGIN_MIN() external pure returns (uint256);
function SAFETY_MARGIN_MAX() external pure returns (uint256);
function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint256);
function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint256);
function LIQUIDATION_FEE_MAX() external pure returns (uint256);
function _initialize(
string calldata _name,
string calldata _symbol,
address _underlying,
address _borrowable0,
address _borrowable1
) external;
function _setSafetyMargin(uint256 newSafetyMargin) external;
function _setLiquidationIncentive(uint256 newLiquidationIncentive) external;
function _setLiquidationFee(uint256 newLiquidationFee) external;
function _setMTolerance(uint256 newMTolerance) external;
function isUnderlyingVaultToken() external view returns (bool);
}
/
pragma solidity >=0.5.0;
interface IBorrowable {
/*** Tarot ERC20 ***/
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 value) external returns (bool);
function transfer(address to, uint256 value) external returns (bool);
function transferFrom(
address from,
address to,
uint256 value
) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint256);
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
/*** Pool Token ***/
event Mint(
address indexed sender,
address indexed minter,
uint256 mintAmount,
uint256 mintTokens
);
event Redeem(
address indexed sender,
address indexed redeemer,
uint256 redeemAmount,
uint256 redeemTokens
);
event Sync(uint256 totalBalance);
function underlying() external view returns (address);
function factory() external view returns (address);
function totalBalance() external view returns (uint256);
function MINIMUM_LIQUIDITY() external pure returns (uint256);
function exchangeRate() external returns (uint256);
function mint(address minter) external returns (uint256 mintTokens);
function redeem(address redeemer) external returns (uint256 redeemAmount);
function skim(address to) external;
function sync() external;
function _setFactory() external;
/*** Borrowable ***/
event BorrowApproval(
address indexed owner,
address indexed spender,
uint256 value
);
event Borrow(
address indexed sender,
address indexed borrower,
address indexed receiver,
uint256 borrowAmount,
uint256 repayAmount,
uint256 accountBorrowsPrior,
uint256 accountBorrows,
uint256 totalBorrows
);
event Liquidate(
address indexed sender,
address indexed borrower,
address indexed liquidator,
uint256 seizeTokens,
uint256 repayAmount,
uint256 accountBorrowsPrior,
uint256 accountBorrows,
uint256 totalBorrows
);
function BORROW_FEE() external pure returns (uint256);
function collateral() external view returns (address);
function reserveFactor() external view returns (uint256);
function exchangeRateLast() external view returns (uint256);
function borrowIndex() external view returns (uint256);
function totalBorrows() external view returns (uint256);
function borrowAllowance(address owner, address spender)
external
view
returns (uint256);
function borrowBalance(address borrower) external view returns (uint256);
function borrowTracker() external view returns (address);
function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32);
function borrowApprove(address spender, uint256 value)
external
returns (bool);
function borrowPermit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function borrow(
address borrower,
address receiver,
uint256 borrowAmount,
bytes calldata data
) external;
function liquidate(address borrower, address liquidator)
external
returns (uint256 seizeTokens);
function trackBorrow(address borrower) external;
/*** Borrowable Interest Rate Model ***/
event AccrueInterest(
uint256 interestAccumulated,
uint256 borrowIndex,
uint256 totalBorrows
);
event CalculateKink(uint256 kinkRate);
event CalculateBorrowRate(uint256 borrowRate);
function KINK_BORROW_RATE_MAX() external pure returns (uint256);
function KINK_BORROW_RATE_MIN() external pure returns (uint256);
function KINK_MULTIPLIER() external pure returns (uint256);
function borrowRate() external view returns (uint256);
function kinkBorrowRate() external view returns (uint256);
function kinkUtilizationRateLower() external view returns (uint256);
function kinkUtilizationRateUpper() external view returns (uint256);
function adjustSpeed() external view returns (uint256);
function rateUpdateTimestamp() external view returns (uint32);
function accrualTimestamp() external view returns (uint32);
function accrueInterest() external;
/*** Borrowable Setter ***/
event NewReserveFactor(uint256 newReserveFactor);
event NewKinkUtilizationRates(uint256 newKinkUtilizationRateLower, uint256 newKinkUtilizationRateUpper);
event NewAdjustSpeed(uint256 newAdjustSpeed);
event NewBorrowTracker(address newBorrowTracker);
function RESERVE_FACTOR_MAX() external pure returns (uint256);
function KINK_UR_MIN() external pure returns (uint256);
function KINK_UR_MAX() external pure returns (uint256);
function ADJUST_SPEED_MIN() external pure returns (uint256);
function ADJUST_SPEED_MAX() external pure returns (uint256);
function _initialize(
string calldata _name,
string calldata _symbol,
address _underlying,
address _collateral
) external;
function _setReserveFactor(uint256 newReserveFactor) external;
function _setKinkUtilizationRates(uint256 newKinkUtilizationRateLower, uint256 newKinkUtilizationRateUpper) external;
function _setAdjustSpeed(uint256 newAdjustSpeed) external;
function _setBorrowTracker(address newBorrowTracker) external;
}
/
pragma solidity >=0.5.0;
interface IBaseV1Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function stable() external view returns (bool);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function token0() external view returns (address);
function token1() external view returns (address);
function tokens() external view returns (address, address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function observationLength() external view returns (uint);
function observations(uint) external view returns (
uint timestamp,
uint reserve0Cumulative,
uint reserve1Cumulative
);
function currentCumulativePrices() external view returns (
uint reserve0Cumulative,
uint reserve1Cumulative,
uint timestamp
);
function metadata() external view returns (uint, uint, uint, uint, bool, address, address);
}
/
pragma solidity >=0.5.0;
interface ICDeployer {
function deployCollateral(address uniswapV2Pair) external returns (address collateral);
}
/
pragma solidity >=0.5.0;
interface IBDeployer {
function deployBorrowable(address uniswapV2Pair, uint8 index) external returns (address borrowable);
}
/
pragma solidity >=0.5.0;
interface IFactory {
event LendingPoolInitialized(address indexed uniswapV2Pair, address indexed token0, address indexed token1,
address collateral, address borrowable0, address borrowable1, uint lendingPoolId);
event NewPendingAdmin(address oldPendingAdmin, address newPendingAdmin);
event NewAdmin(address oldAdmin, address newAdmin);
event NewReservesPendingAdmin(address oldReservesPendingAdmin, address newReservesPendingAdmin);
event NewReservesAdmin(address oldReservesAdmin, address newReservesAdmin);
event NewReservesManager(address oldReservesManager, address newReservesManager);
function admin() external view returns (address);
function pendingAdmin() external view returns (address);
function reservesAdmin() external view returns (address);
function reservesPendingAdmin() external view returns (address);
function reservesManager() external view returns (address);
function getLendingPool(address uniswapV2Pair) external view returns (
bool initialized,
uint24 lendingPoolId,
address collateral,
address borrowable0,
address borrowable1
);
function allLendingPools(uint) external view returns (address uniswapV2Pair);
function allLendingPoolsLength() external view returns (uint);
function bDeployer() external view returns (address);
function cDeployer() external view returns (address);
function tarotPriceOracle() external view returns (address);
function createCollateral(address uniswapV2Pair) external returns (address collateral);
function createBorrowable0(address uniswapV2Pair) external returns (address borrowable0);
function createBorrowable1(address uniswapV2Pair) external returns (address borrowable1);
function initializeLendingPool(address uniswapV2Pair) external;
function _setPendingAdmin(address newPendingAdmin) external;
function _acceptAdmin() external;
function _setReservesPendingAdmin(address newPendingAdmin) external;
function _acceptReservesAdmin() external;
function _setReservesManager(address newReservesManager) external;
}
/
pragma solidity >=0.5.0;
interface IERC20 {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"contracts/Factory.sol":"Factory"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","payable":false,"inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"address","name":"_reservesAdmin","internalType":"address"},{"type":"address","name":"_bDeployer","internalType":"contract IBDeployer"},{"type":"address","name":"_cDeployer","internalType":"contract ICDeployer"},{"type":"address","name":"_tarotPriceOracle","internalType":"contract ITarotSolidlyPriceOracleV2"}]},{"type":"event","name":"LendingPoolInitialized","inputs":[{"type":"address","name":"uniswapV2Pair","internalType":"address","indexed":true},{"type":"address","name":"token0","internalType":"address","indexed":true},{"type":"address","name":"token1","internalType":"address","indexed":true},{"type":"address","name":"collateral","internalType":"address","indexed":false},{"type":"address","name":"borrowable0","internalType":"address","indexed":false},{"type":"address","name":"borrowable1","internalType":"address","indexed":false},{"type":"uint256","name":"lendingPoolId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"oldAdmin","internalType":"address","indexed":false},{"type":"address","name":"newAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"oldPendingAdmin","internalType":"address","indexed":false},{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewReservesAdmin","inputs":[{"type":"address","name":"oldReservesAdmin","internalType":"address","indexed":false},{"type":"address","name":"newReservesAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewReservesManager","inputs":[{"type":"address","name":"oldReservesManager","internalType":"address","indexed":false},{"type":"address","name":"newReservesManager","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"NewReservesPendingAdmin","inputs":[{"type":"address","name":"oldReservesPendingAdmin","internalType":"address","indexed":false},{"type":"address","name":"newReservesPendingAdmin","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_acceptAdmin","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_acceptReservesAdmin","inputs":[],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_setPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_setReservesManager","inputs":[{"type":"address","name":"newReservesManager","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_setReservesPendingAdmin","inputs":[{"type":"address","name":"newReservesPendingAdmin","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"allLendingPools","inputs":[{"type":"uint256","name":"","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allLendingPoolsLength","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"contract IBDeployer"}],"name":"bDeployer","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"contract ICDeployer"}],"name":"cDeployer","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address","name":"borrowable0","internalType":"address"}],"name":"createBorrowable0","inputs":[{"type":"address","name":"uniswapV2Pair","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address","name":"borrowable1","internalType":"address"}],"name":"createBorrowable1","inputs":[{"type":"address","name":"uniswapV2Pair","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"address","name":"collateral","internalType":"address"}],"name":"createCollateral","inputs":[{"type":"address","name":"uniswapV2Pair","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"bool","name":"initialized","internalType":"bool"},{"type":"uint24","name":"lendingPoolId","internalType":"uint24"},{"type":"address","name":"collateral","internalType":"address"},{"type":"address","name":"borrowable0","internalType":"address"},{"type":"address","name":"borrowable1","internalType":"address"}],"name":"getLendingPool","inputs":[{"type":"address","name":"","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"initializeLendingPool","inputs":[{"type":"address","name":"uniswapV2Pair","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingAdmin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"reservesAdmin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"reservesManager","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"reservesPendingAdmin","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"contract ITarotSolidlyPriceOracleV2"}],"name":"tarotPriceOracle","inputs":[],"constant":true}]
Contract Creation Code
0x608060405234801561001057600080fd5b506040516116b83803806116b8833981810160405260a081101561003357600080fd5b5080516020808301516040808501516060860151608090960151600080546001600160a01b03199081166001600160a01b03808a169182178455600280548416828a16179055600780548416828816179055600880548416828d161790556009805490931690851617909155845191825295810195909552825195969395919490927ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc92918290030190a160408051600081526001600160a01b038616602082015281517fa328ba21363a99cbf330243928bb26a15acf20bf43166ef838e67ff5d84d4ae7929181900390910190a15050505050611582806101366000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80639e1348e3116100ad578063d407112711610071578063d4071127146102e8578063db5a269014610305578063e9c714f21461030d578063eb5ab75f14610315578063f851a4401461033b5761012c565b80639e1348e314610248578063b1ccc03e14610250578063b658ca7514610276578063b71d1a0c1461029c578063cbed6d71146102c25761012c565b806349a78838116100f457806349a78838146101ee578063714c0206146102145780637a4660d51461022e578063822d73b214610236578063998c077d1461023e5761012c565b80630572bf5f1461013157806323c6145d1461019457806326782247146101d6578063345ef941146101de57806334fb08a8146101e6575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b0316610343565b60408051951515865262ffffff90941660208601526001600160a01b03928316858501529082166060850152166080830152519081900360a00190f35b6101ba600480360360208110156101aa57600080fd5b50356001600160a01b031661038a565b604080516001600160a01b039092168252519081900360200190f35b6101ba610524565b6101ba610533565b6101ba610542565b6101ba6004803603602081101561020457600080fd5b50356001600160a01b0316610551565b61021c6106e5565b60408051918252519081900360200190f35b6101ba6106eb565b6101ba6106fa565b610246610709565b005b6101ba610811565b6102466004803603602081101561026657600080fd5b50356001600160a01b0316610820565b6102466004803603602081101561028c57600080fd5b50356001600160a01b03166108d8565b610246600480360360208110156102b257600080fd5b50356001600160a01b0316610ea1565b6101ba600480360360208110156102d857600080fd5b50356001600160a01b0316610f59565b6101ba600480360360208110156102fe57600080fd5b50356110eb565b6101ba611112565b610246611121565b6102466004803603602081101561032b57600080fd5b50356001600160a01b0316611229565b6101ba6112e1565b60056020526000908152604090208054600182015460029092015460ff82169262ffffff610100840416926001600160a01b03640100000000909104811692918116911685565b6000610395826112f0565b50506001600160a01b0382811660009081526005602052604090205464010000000090041615610404576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b60085460408051637924fedd60e01b81526001600160a01b03858116600483015291519190921691637924fedd9160248083019260209291908290030181600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050506040513d602081101561047d57600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b1580156104c457600080fd5b505af11580156104d8573d6000803e3d6000fd5b505050506104e5826113d0565b6001600160a01b039182166000908152600560205260409020805492821664010000000002640100000000600160c01b03199093169290921790915590565b6001546001600160a01b031681565b6004546001600160a01b031681565b6009546001600160a01b031681565b600061055c826112f0565b50506001600160a01b0382811660009081526005602052604090206001015416156105c6576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b600754604080516354bcd7ad60e01b81526001600160a01b03858116600483015260006024830181905292519316926354bcd7ad92604480840193602093929083900390910190829087803b15801561061e57600080fd5b505af1158015610632573d6000803e3d6000fd5b505050506040513d602081101561064857600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b15801561068f57600080fd5b505af11580156106a3573d6000803e3d6000fd5b505050506106b0826113d0565b6001600160a01b03918216600090815260056020526040902060010180546001600160a01b0319169282169290921790915590565b60065490565b6008546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b0316331461075e576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b60028054600380546001600160a01b038082166001600160a01b031980861682179687905590921690925560408051938316808552949092166020840152815190927fa328ba21363a99cbf330243928bb26a15acf20bf43166ef838e67ff5d84d4ae792908290030190a1604080516001600160a01b03831681526000602082015281517f01d5e27ed5584d16c62ba1a14cfde0783f979d4797a3fc41342aff17d8ef5b41929181900390910190a15050565b6003546001600160a01b031681565b6002546001600160a01b03163314610875576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f01d5e27ed5584d16c62ba1a14cfde0783f979d4797a3fc41342aff17d8ef5b41929181900390910190a15050565b806001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d602081101561093b57600080fd5b505161097e576040805162461bcd60e51b815260206004820152600d60248201526c5461726f743a20535441424c4560981b604482015290519081900360640190fd5b60008061098a836112f0565b915091506109966114fc565b506001600160a01b03808416600090815260056020908152604091829020825160a081018452815460ff8116158015835262ffffff61010083041694830194909452640100000000900485169381019390935260018101548416606084015260020154909216608082015290610a53576040805162461bcd60e51b815260206004820152601a60248201527f5461726f743a20414c52454144595f494e495449414c495a4544000000000000604482015290519081900360640190fd5b60408101516001600160a01b0316610a9c5760405162461bcd60e51b815260040180806020018281038252602381526020018061152b6023913960400191505060405180910390fd5b60608101516001600160a01b0316610afb576040805162461bcd60e51b815260206004820152601e60248201527f5461726f743a20424f52524f5741424c45305f4e4f545f435245415445440000604482015290519081900360640190fd5b60808101516001600160a01b0316610b5a576040805162461bcd60e51b815260206004820152601e60248201527f5461726f743a20424f52524f5741424c45315f4e4f545f435245415445440000604482015290519081900360640190fd5b6009546040805163022351bf60e51b81526001600160a01b0387811660048301529151919092169163446a37e09160248083019260609291908290030181600087803b158015610ba957600080fd5b505af1158015610bbd573d6000803e3d6000fd5b505050506040513d6060811015610bd357600080fd5b505060408181015160608301516080840151835163c548e3c560e01b81526001600160a01b0389811660448301529283166064820152908216608482015260a06004820152601060a48201526f15185c9bdd0810dbdb1b185d195c985b60821b60c482015260e06024820152600660e48201526518d5105493d560d21b610104820152925191169163c548e3c59161012480830192600092919082900301818387803b158015610c8257600080fd5b505af1158015610c96573d6000803e3d6000fd5b50505060608201516040808401518151636a030c1160e01b81526001600160a01b038881166044830152918216606482015260806004820152601060848201526f5461726f7420426f72726f7761626c6560801b60a482015260c06024820152600660c4820152651895105493d560d21b60e4820152915192169250636a030c119161010480830192600092919082900301818387803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506080818101516040808401518151636a030c1160e01b81526001600160a01b03878116604483015291821660648201526004810194909452601060848501526f5461726f7420426f72726f7761626c6560801b60a485015260c06024850152600660c4850152651895105493d560d21b60e48501529051911691636a030c119161010480830192600092919082900301818387803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b5050506001600160a01b03808616600081815260056020908152604091829020805460ff19166001179055858201516060808801516080808a01518a8601518751958a168652928916958501959095529387168386015262ffffff169082015291518785169550938816937f4c3ab495dc8ebd1b2f3232d7632e54411bc7e4d111475e7fbbd5547d9a28c4959281900390910190a450505050565b6000546001600160a01b03163314610ef6576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9929181900390910190a15050565b6000610f64826112f0565b50506001600160a01b038281166000908152600560205260409020600201541615610fce576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b600754604080516354bcd7ad60e01b81526001600160a01b03858116600483015260016024830152915191909216916354bcd7ad9160448083019260209291908290030181600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d602081101561104e57600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506110b6826113d0565b6001600160a01b03918216600090815260056020526040902060020180546001600160a01b0319169282169290921790915590565b600681815481106110f857fe5b6000918252602090912001546001600160a01b0316905081565b6007546001600160a01b031681565b6001546001600160a01b03163314611176576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b031980861682179687905590921690925560408051938316808552949092166020840152815190927ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc92908290030190a1604080516001600160a01b03831681526000602082015281517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9929181900390910190a15050565b6002546001600160a01b0316331461127e576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f324bacfad26225895fcf55780481bec4ce49013c92500fa1c25626ff43fbf661929181900390910190a15050565b6000546001600160a01b031681565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561132c57600080fd5b505afa158015611340573d6000803e3d6000fd5b505050506040513d602081101561135657600080fd5b50516040805163d21220a760e01b815290519193506001600160a01b0385169163d21220a791600480820192602092909190829003018186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d60208110156113c657600080fd5b5051919391925050565b6001600160a01b038116600090815260056020526040902054610100900462ffffff16156113fd576114f9565b60068054600181810183557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b038086166001600160a01b031992831681179093556040805160a0810182526000808252965462ffffff90811660208381019182528385018a8152606085018b8152608086018c8152998c526005909252949099209251835491519451861664010000000002640100000000600160c01b0319959093166101000263ffffff001991151560ff199093169290921716179290921691909117815594519385018054948216948316949094179093559051600290930180549390921692169190911790555b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe5461726f743a20434f4c4c41544552414c495a41424c455f4e4f545f43524541544544a265627a7a72315820e81859984e600a5321c605372831941a3c99e774148db86661dba8effe9b5e7964736f6c634300051000320000000000000000000000001bb4e4fc22b4e2470a05b60c2943f88b832cea100000000000000000000000001e6bf02f5bad0a8aa93df20955feff295d97f969000000000000000000000000b092e1bf50f518b3ebf7ed26a40015183ae36ac2000000000000000000000000b3f352c936ce9c29c40d8befae9caebbcc0b62520000000000000000000000001d90fdac4dd30c3ba38d53f52a884f6e75d0989e
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80639e1348e3116100ad578063d407112711610071578063d4071127146102e8578063db5a269014610305578063e9c714f21461030d578063eb5ab75f14610315578063f851a4401461033b5761012c565b80639e1348e314610248578063b1ccc03e14610250578063b658ca7514610276578063b71d1a0c1461029c578063cbed6d71146102c25761012c565b806349a78838116100f457806349a78838146101ee578063714c0206146102145780637a4660d51461022e578063822d73b214610236578063998c077d1461023e5761012c565b80630572bf5f1461013157806323c6145d1461019457806326782247146101d6578063345ef941146101de57806334fb08a8146101e6575b600080fd5b6101576004803603602081101561014757600080fd5b50356001600160a01b0316610343565b60408051951515865262ffffff90941660208601526001600160a01b03928316858501529082166060850152166080830152519081900360a00190f35b6101ba600480360360208110156101aa57600080fd5b50356001600160a01b031661038a565b604080516001600160a01b039092168252519081900360200190f35b6101ba610524565b6101ba610533565b6101ba610542565b6101ba6004803603602081101561020457600080fd5b50356001600160a01b0316610551565b61021c6106e5565b60408051918252519081900360200190f35b6101ba6106eb565b6101ba6106fa565b610246610709565b005b6101ba610811565b6102466004803603602081101561026657600080fd5b50356001600160a01b0316610820565b6102466004803603602081101561028c57600080fd5b50356001600160a01b03166108d8565b610246600480360360208110156102b257600080fd5b50356001600160a01b0316610ea1565b6101ba600480360360208110156102d857600080fd5b50356001600160a01b0316610f59565b6101ba600480360360208110156102fe57600080fd5b50356110eb565b6101ba611112565b610246611121565b6102466004803603602081101561032b57600080fd5b50356001600160a01b0316611229565b6101ba6112e1565b60056020526000908152604090208054600182015460029092015460ff82169262ffffff610100840416926001600160a01b03640100000000909104811692918116911685565b6000610395826112f0565b50506001600160a01b0382811660009081526005602052604090205464010000000090041615610404576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b60085460408051637924fedd60e01b81526001600160a01b03858116600483015291519190921691637924fedd9160248083019260209291908290030181600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b505050506040513d602081101561047d57600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b1580156104c457600080fd5b505af11580156104d8573d6000803e3d6000fd5b505050506104e5826113d0565b6001600160a01b039182166000908152600560205260409020805492821664010000000002640100000000600160c01b03199093169290921790915590565b6001546001600160a01b031681565b6004546001600160a01b031681565b6009546001600160a01b031681565b600061055c826112f0565b50506001600160a01b0382811660009081526005602052604090206001015416156105c6576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b600754604080516354bcd7ad60e01b81526001600160a01b03858116600483015260006024830181905292519316926354bcd7ad92604480840193602093929083900390910190829087803b15801561061e57600080fd5b505af1158015610632573d6000803e3d6000fd5b505050506040513d602081101561064857600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b15801561068f57600080fd5b505af11580156106a3573d6000803e3d6000fd5b505050506106b0826113d0565b6001600160a01b03918216600090815260056020526040902060010180546001600160a01b0319169282169290921790915590565b60065490565b6008546001600160a01b031681565b6002546001600160a01b031681565b6003546001600160a01b0316331461075e576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b60028054600380546001600160a01b038082166001600160a01b031980861682179687905590921690925560408051938316808552949092166020840152815190927fa328ba21363a99cbf330243928bb26a15acf20bf43166ef838e67ff5d84d4ae792908290030190a1604080516001600160a01b03831681526000602082015281517f01d5e27ed5584d16c62ba1a14cfde0783f979d4797a3fc41342aff17d8ef5b41929181900390910190a15050565b6003546001600160a01b031681565b6002546001600160a01b03163314610875576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600380546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f01d5e27ed5584d16c62ba1a14cfde0783f979d4797a3fc41342aff17d8ef5b41929181900390910190a15050565b806001600160a01b03166322be3de16040518163ffffffff1660e01b815260040160206040518083038186803b15801561091157600080fd5b505afa158015610925573d6000803e3d6000fd5b505050506040513d602081101561093b57600080fd5b505161097e576040805162461bcd60e51b815260206004820152600d60248201526c5461726f743a20535441424c4560981b604482015290519081900360640190fd5b60008061098a836112f0565b915091506109966114fc565b506001600160a01b03808416600090815260056020908152604091829020825160a081018452815460ff8116158015835262ffffff61010083041694830194909452640100000000900485169381019390935260018101548416606084015260020154909216608082015290610a53576040805162461bcd60e51b815260206004820152601a60248201527f5461726f743a20414c52454144595f494e495449414c495a4544000000000000604482015290519081900360640190fd5b60408101516001600160a01b0316610a9c5760405162461bcd60e51b815260040180806020018281038252602381526020018061152b6023913960400191505060405180910390fd5b60608101516001600160a01b0316610afb576040805162461bcd60e51b815260206004820152601e60248201527f5461726f743a20424f52524f5741424c45305f4e4f545f435245415445440000604482015290519081900360640190fd5b60808101516001600160a01b0316610b5a576040805162461bcd60e51b815260206004820152601e60248201527f5461726f743a20424f52524f5741424c45315f4e4f545f435245415445440000604482015290519081900360640190fd5b6009546040805163022351bf60e51b81526001600160a01b0387811660048301529151919092169163446a37e09160248083019260609291908290030181600087803b158015610ba957600080fd5b505af1158015610bbd573d6000803e3d6000fd5b505050506040513d6060811015610bd357600080fd5b505060408181015160608301516080840151835163c548e3c560e01b81526001600160a01b0389811660448301529283166064820152908216608482015260a06004820152601060a48201526f15185c9bdd0810dbdb1b185d195c985b60821b60c482015260e06024820152600660e48201526518d5105493d560d21b610104820152925191169163c548e3c59161012480830192600092919082900301818387803b158015610c8257600080fd5b505af1158015610c96573d6000803e3d6000fd5b50505060608201516040808401518151636a030c1160e01b81526001600160a01b038881166044830152918216606482015260806004820152601060848201526f5461726f7420426f72726f7761626c6560801b60a482015260c06024820152600660c4820152651895105493d560d21b60e4820152915192169250636a030c119161010480830192600092919082900301818387803b158015610d3957600080fd5b505af1158015610d4d573d6000803e3d6000fd5b505050506080818101516040808401518151636a030c1160e01b81526001600160a01b03878116604483015291821660648201526004810194909452601060848501526f5461726f7420426f72726f7761626c6560801b60a485015260c06024850152600660c4850152651895105493d560d21b60e48501529051911691636a030c119161010480830192600092919082900301818387803b158015610df257600080fd5b505af1158015610e06573d6000803e3d6000fd5b5050506001600160a01b03808616600081815260056020908152604091829020805460ff19166001179055858201516060808801516080808a01518a8601518751958a168652928916958501959095529387168386015262ffffff169082015291518785169550938816937f4c3ab495dc8ebd1b2f3232d7632e54411bc7e4d111475e7fbbd5547d9a28c4959281900390910190a450505050565b6000546001600160a01b03163314610ef6576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600180546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9929181900390910190a15050565b6000610f64826112f0565b50506001600160a01b038281166000908152600560205260409020600201541615610fce576040805162461bcd60e51b81526020600482015260156024820152745461726f743a20414c52454144595f45584953545360581b604482015290519081900360640190fd5b600754604080516354bcd7ad60e01b81526001600160a01b03858116600483015260016024830152915191909216916354bcd7ad9160448083019260209291908290030181600087803b15801561102457600080fd5b505af1158015611038573d6000803e3d6000fd5b505050506040513d602081101561104e57600080fd5b5051604080516312974c5b60e21b815290519192506001600160a01b03831691634a5d316c9160048082019260009290919082900301818387803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b505050506110b6826113d0565b6001600160a01b03918216600090815260056020526040902060020180546001600160a01b0319169282169290921790915590565b600681815481106110f857fe5b6000918252602090912001546001600160a01b0316905081565b6007546001600160a01b031681565b6001546001600160a01b03163314611176576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b60008054600180546001600160a01b038082166001600160a01b031980861682179687905590921690925560408051938316808552949092166020840152815190927ff9ffabca9c8276e99321725bcb43fb076a6c66a54b7f21c4e8146d8519b417dc92908290030190a1604080516001600160a01b03831681526000602082015281517fca4f2f25d0898edd99413412fb94012f9e54ec8142f9b093e7720646a95b16a9929181900390910190a15050565b6002546001600160a01b0316331461127e576040805162461bcd60e51b815260206004820152601360248201527215185c9bdd0e8815539055551213d492569151606a1b604482015290519081900360640190fd5b600480546001600160a01b038381166001600160a01b0319831681179093556040805191909216808252602082019390935281517f324bacfad26225895fcf55780481bec4ce49013c92500fa1c25626ff43fbf661929181900390910190a15050565b6000546001600160a01b031681565b600080826001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561132c57600080fd5b505afa158015611340573d6000803e3d6000fd5b505050506040513d602081101561135657600080fd5b50516040805163d21220a760e01b815290519193506001600160a01b0385169163d21220a791600480820192602092909190829003018186803b15801561139c57600080fd5b505afa1580156113b0573d6000803e3d6000fd5b505050506040513d60208110156113c657600080fd5b5051919391925050565b6001600160a01b038116600090815260056020526040902054610100900462ffffff16156113fd576114f9565b60068054600181810183557ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90910180546001600160a01b038086166001600160a01b031992831681179093556040805160a0810182526000808252965462ffffff90811660208381019182528385018a8152606085018b8152608086018c8152998c526005909252949099209251835491519451861664010000000002640100000000600160c01b0319959093166101000263ffffff001991151560ff199093169290921716179290921691909117815594519385018054948216948316949094179093559051600290930180549390921692169190911790555b50565b6040805160a0810182526000808252602082018190529181018290526060810182905260808101919091529056fe5461726f743a20434f4c4c41544552414c495a41424c455f4e4f545f43524541544544a265627a7a72315820e81859984e600a5321c605372831941a3c99e774148db86661dba8effe9b5e7964736f6c63430005100032