Overview
ETH Balance
1.0313 ETH
Eth Value
$2,546.67 (@ $2,469.38/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 71 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Decrease | 13703810 | 1049 days ago | IN | 0.01 ETH | 0.02863431 | ||||
Decrease | 13429645 | 1092 days ago | IN | 0.01 ETH | 0.00911023 | ||||
Reduced Coinage | 13429636 | 1092 days ago | IN | 0.01 ETH | 0.01153234 | ||||
Decrease | 13307383 | 1111 days ago | IN | 0.01 ETH | 0.00904807 | ||||
Reduced Coinage | 13307373 | 1111 days ago | IN | 0.01 ETH | 0.009507 | ||||
Decrease | 13145491 | 1136 days ago | IN | 0.01 ETH | 0.01426513 | ||||
Reduced Coinage | 13145354 | 1136 days ago | IN | 0.01 ETH | 0.01610529 | ||||
Decrease | 13145275 | 1136 days ago | IN | 0.01 ETH | 0.01475617 | ||||
Reduced Coinage | 13145266 | 1136 days ago | IN | 0.01 ETH | 0.01834341 | ||||
Decrease | 13035619 | 1153 days ago | IN | 0.01 ETH | 0.00720757 | ||||
Reduced Coinage | 13035596 | 1153 days ago | IN | 0.01 ETH | 0.00747597 | ||||
Decrease | 13009183 | 1158 days ago | IN | 0.01 ETH | 0.00596779 | ||||
Reduced Coinage | 13009180 | 1158 days ago | IN | 0.01 ETH | 0.00863817 | ||||
Decrease | 13009150 | 1158 days ago | IN | 0.01 ETH | 0.00785889 | ||||
Reduced Coinage | 13009148 | 1158 days ago | IN | 0.01 ETH | 0.00989653 | ||||
Decrease | 13008560 | 1158 days ago | IN | 0.01 ETH | 0.01112891 | ||||
Reduced Coinage | 13008525 | 1158 days ago | IN | 0.01 ETH | 0.01297572 | ||||
Set Flag | 13008455 | 1158 days ago | IN | 0 ETH | 0.00222139 | ||||
Set Flag | 12950155 | 1167 days ago | IN | 0 ETH | 0.00054583 | ||||
Coin | 12943492 | 1168 days ago | IN | 0.01 ETH | 0.00603184 | ||||
Coin | 12924499 | 1171 days ago | IN | 0.01 ETH | 0.01183995 | ||||
Coin | 12924489 | 1171 days ago | IN | 0.01 ETH | 0.01218274 | ||||
Coin | 12921415 | 1171 days ago | IN | 0.01 ETH | 0.00904518 | ||||
Coin | 12921199 | 1171 days ago | IN | 0.01 ETH | 0.00775436 | ||||
Coin | 12921033 | 1171 days ago | IN | 0.01 ETH | 0.00780915 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
13703810 | 1049 days ago | 0.01 ETH | ||||
13429645 | 1092 days ago | 0.01 ETH | ||||
13429636 | 1092 days ago | 0.01 ETH | ||||
13307383 | 1111 days ago | 0.01 ETH | ||||
13307373 | 1111 days ago | 0.01 ETH | ||||
13145491 | 1136 days ago | 0.01 ETH | ||||
13145354 | 1136 days ago | 0.01 ETH | ||||
13145275 | 1136 days ago | 0.01 ETH | ||||
13145266 | 1136 days ago | 0.01 ETH | ||||
13035619 | 1153 days ago | 0.01 ETH | ||||
13035596 | 1153 days ago | 0.01 ETH | ||||
13009183 | 1158 days ago | 0.01 ETH | ||||
13009180 | 1158 days ago | 0.01 ETH | ||||
13009150 | 1158 days ago | 0.01 ETH | ||||
13009148 | 1158 days ago | 0.01 ETH | ||||
13008560 | 1158 days ago | 0.01 ETH | ||||
13008525 | 1158 days ago | 0.01 ETH | ||||
12943492 | 1168 days ago | 0.01 ETH | ||||
12924499 | 1171 days ago | 0.01 ETH | ||||
12924489 | 1171 days ago | 0.01 ETH | ||||
12921415 | 1171 days ago | 0.01 ETH | ||||
12921199 | 1171 days ago | 0.01 ETH | ||||
12921033 | 1171 days ago | 0.01 ETH | ||||
12721339 | 1203 days ago | 0.01 ETH | ||||
12689666 | 1207 days ago | 0.01 ETH |
Loading...
Loading
Contract Name:
MortgagePool
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-05-07 */ // File: lib/ReentrancyGuard.sol // SPDX-License-Identifier: GPL-3.0-or-later pragma solidity ^0.6.12; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () public { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: iface/IPriceController.sol pragma solidity ^0.6.12; interface IPriceController { function getPriceForPToken(address token, address uToken, address payback) external payable returns (uint256 tokenPrice, uint256 pTokenPrice); } // File: iface/IInsurancePool.sol pragma solidity ^0.6.12; interface IInsurancePool { function setPTokenToIns(address pToken, address ins) external; function destroyPToken(address pToken, uint256 amount, address token) external; function eliminate(address pToken, address token) external; function setLatestTime(address token) external; } // File: iface/IERC20.sol pragma solidity ^0.6.12; interface IERC20 { function decimals() external view returns (uint8); function name() external view returns (string memory); function symbol() external view returns (string memory); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: lib/Address.sol pragma solidity 0.6.12; library Address { function isContract(address account) internal view returns (bool) { bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value:amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File: lib/SafeERC20.sol pragma solidity 0.6.12; library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(ERC20 token, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal { callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(ERC20 token, address spender, uint256 value) internal { require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function callOptionalReturn(ERC20 token, bytes memory data) private { require(address(token).isContract(), "SafeERC20: call to non-contract"); (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } interface ERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: lib/TransferHelper.sol pragma solidity ^0.6.12; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } } // File: iface/IPTokenFactory.sol pragma solidity ^0.6.12; interface IPTokenFactory { function getGovernance() external view returns(address); function getPTokenOperator(address contractAddress) external view returns(bool); function getPTokenAuthenticity(address pToken) external view returns(bool); } // File: iface/IParasset.sol pragma solidity ^0.6.12; interface IParasset { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function destroy(uint256 amount, address account) external; function issuance(uint256 amount, address account) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: lib/SafeMath.sol pragma solidity ^0.6.12; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } function div(uint x, uint y) internal pure returns (uint z) { require(y > 0, "ds-math-div-zero"); z = x / y; // assert(a == b * c + a % b); // There is no case in which this doesn't hold } } // File: PToken.sol pragma solidity ^0.6.12; contract PToken is IParasset { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowed; uint256 public _totalSupply = 0; string public name = ""; string public symbol = ""; uint8 public decimals = 18; IPTokenFactory pTokenFactory; constructor (string memory _name, string memory _symbol) public { name = _name; symbol = _symbol; pTokenFactory = IPTokenFactory(address(msg.sender)); } //---------modifier--------- modifier onlyGovernance() { require(address(msg.sender) == pTokenFactory.getGovernance(), "Log:PToken:!governance"); _; } modifier onlyPool() { require(pTokenFactory.getPTokenOperator(address(msg.sender)), "Log:PToken:!Pool"); _; } //---------view--------- // Query factory contract address function getPTokenFactory() public view returns(address) { return address(pTokenFactory); } /// @notice The view of totalSupply /// @return The total supply of ntoken function totalSupply() override public view returns (uint256) { return _totalSupply; } /// @dev The view of balances /// @param owner The address of an account /// @return The balance of the account function balanceOf(address owner) override public view returns (uint256) { return _balances[owner]; } function allowance(address owner, address spender) override public view returns (uint256) { return _allowed[owner][spender]; } //---------transaction--------- function changeFactory(address factory) public onlyGovernance { pTokenFactory = IPTokenFactory(address(factory)); } function rename(string memory _name, string memory _symbol) public onlyGovernance { name = _name; symbol = _symbol; } function transfer(address to, uint256 value) override public returns (bool) { _transfer(msg.sender, to, value); return true; } function approve(address spender, uint256 value) override public returns (bool) { require(spender != address(0)); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } function transferFrom(address from, address to, uint256 value) override public returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value); _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { require(spender != address(0)); _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue); emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { require(spender != address(0)); _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue); emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } function _transfer(address from, address to, uint256 value) internal { _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } function destroy(uint256 amount, address account) override external onlyPool{ require(_balances[account] >= amount, "Log:PToken:!destroy"); _balances[account] = _balances[account].sub(amount); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0x0), amount); } function issuance(uint256 amount, address account) override external onlyPool{ _balances[account] = _balances[account].add(amount); _totalSupply = _totalSupply.add(amount); emit Transfer(address(0x0), account, amount); } } // File: MortgagePool.sol pragma solidity ^0.6.12; pragma experimental ABIEncoderV2; contract MortgagePool is ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for ERC20; // Governance address address public governance; // Underlying asset address => PToken address mapping(address=>address) public underlyingToPToken; // PToken address => Underlying asset address mapping(address=>address) public pTokenToUnderlying; // PToken address => Mortgage asset address => Bool mapping(address=>mapping(address=>bool)) mortgageAllow; // PToken address => Mortgage asset address => User address => Debt data mapping(address=>mapping(address=>mapping(address=>PersonalLedger))) ledger; // PToken address => Mortgage asset address => Users who have created debt positions(address) mapping(address=>mapping(address=>address[])) ledgerArray; // Mortgage asset address => Maximum mortgage rate mapping(address=>uint256) maxRate; // Mortgage asset address => Liquidation line mapping(address=>uint256) liquidationLine; // PriceController contract IPriceController quary; // Insurance pool contract IInsurancePool insurancePool; // PToken creation factory contract IPTokenFactory pTokenFactory; // Market base interest rate uint256 r0 = 0.025 ether; // Amount of blocks produced in a year uint256 oneYear = 2400000; // Status uint8 public flag; // = 0: pause // = 1: active // = 2: out only struct PersonalLedger { uint256 mortgageAssets; // Amount of mortgaged assets uint256 parassetAssets; // Amount of debt(Ptoken,Stability fee not included) uint256 blockHeight; // The block height of the last operation uint256 rate; // Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation) bool created; // Is it created } event FeeValue(address pToken, uint256 value); /// @dev Initialization method /// @param factoryAddress PToken creation factory contract constructor (address factoryAddress) public { pTokenFactory = IPTokenFactory(factoryAddress); governance = pTokenFactory.getGovernance(); flag = 0; } //---------modifier--------- modifier onlyGovernance() { require(msg.sender == governance, "Log:MortgagePool:!gov"); _; } modifier whenActive() { require(flag == 1, "Log:MortgagePool:!active"); _; } modifier outOnly() { require(flag != 0, "Log:MortgagePool:!0"); _; } //---------view--------- /// @dev Calculate the stability fee /// @param parassetAssets Amount of debt(Ptoken,Stability fee not included) /// @param blockHeight The block height of the last operation /// @param rate Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation) /// @param nowRate Current mortgage rate (not including stability fee) /// @return fee function getFee(uint256 parassetAssets, uint256 blockHeight, uint256 rate, uint256 nowRate) public view returns(uint256) { uint256 topOne = parassetAssets.mul(r0).mul(block.number.sub(blockHeight)); uint256 ratePlus = rate.add(nowRate); uint256 topTwo = parassetAssets.mul(r0).mul(block.number.sub(blockHeight)).mul(uint256(3).mul(ratePlus)); uint256 bottom = oneYear.mul(1 ether); return topOne.div(bottom).add(topTwo.div(bottom.mul(1 ether).mul(2))); } /// @dev Calculate the mortgage rate /// @param mortgageAssets Amount of mortgaged assets /// @param parassetAssets Amount of debt /// @param tokenPrice Mortgage asset price(1 ETH = ? token) /// @param pTokenPrice PToken price(1 ETH = ? pToken) /// @return mortgage rate function getMortgageRate(uint256 mortgageAssets, uint256 parassetAssets, uint256 tokenPrice, uint256 pTokenPrice) public pure returns(uint256) { if (mortgageAssets == 0 || pTokenPrice == 0) { return 0; } return parassetAssets.mul(tokenPrice).mul(1 ether).div(pTokenPrice.mul(mortgageAssets)); } /// @dev Get real-time data of the current debt warehouse /// @param mortgageToken Mortgage asset address /// @param pToken PToken address /// @param tokenPrice Mortgage asset price(1 ETH = ? token) /// @param uTokenPrice Underlying asset price(1 ETH = ? Underlying asset) /// @param maxRateNum Maximum mortgage rate /// @param owner Debt owner /// @return fee Stability fee /// @return mortgageRate Real-time mortgage rate(Including stability fee) /// @return maxSubM The maximum amount of mortgage assets can be reduced /// @return maxAddP Maximum number of coins that can be added function getInfoRealTime(address mortgageToken, address pToken, uint256 tokenPrice, uint256 uTokenPrice, uint256 maxRateNum, uint256 owner) public view returns(uint256 fee, uint256 mortgageRate, uint256 maxSubM, uint256 maxAddP) { PersonalLedger memory pLedger = ledger[pToken][mortgageToken][address(owner)]; if (pLedger.mortgageAssets == 0 && pLedger.parassetAssets == 0) { return (0,0,0,0); } uint256 pTokenPrice = getDecimalConversion(pTokenToUnderlying[pToken], uTokenPrice, pToken); uint256 tokenPriceAmount = tokenPrice; fee = getFee(pLedger.parassetAssets, pLedger.blockHeight, pLedger.rate, getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets, tokenPriceAmount, pTokenPrice)); mortgageRate = getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets.add(fee), tokenPriceAmount, pTokenPrice); uint256 maxRateEther = maxRateNum.mul(0.01 ether); if (mortgageRate >= maxRateEther) { maxSubM = 0; maxAddP = 0; } else { maxSubM = pLedger.mortgageAssets.sub(pLedger.parassetAssets.mul(tokenPriceAmount).mul(1 ether).div(maxRateEther.mul(pTokenPrice))); maxAddP = pLedger.mortgageAssets.mul(pTokenPrice).mul(maxRateEther).div(uint256(1 ether).mul(tokenPriceAmount)).sub(pLedger.parassetAssets); } } /// @dev Uniform accuracy /// @param inputToken Initial token /// @param inputTokenAmount Amount of token /// @param outputToken Converted token /// @return stability Amount of outputToken function getDecimalConversion(address inputToken, uint256 inputTokenAmount, address outputToken) public view returns(uint256) { uint256 inputTokenDec = 18; uint256 outputTokenDec = 18; if (inputToken != address(0x0)) { inputTokenDec = IERC20(inputToken).decimals(); } if (outputToken != address(0x0)) { outputTokenDec = IERC20(outputToken).decimals(); } return inputTokenAmount.mul(10**outputTokenDec).div(10**inputTokenDec); } /// @dev View debt warehouse data /// @param pToken pToken address /// @param mortgageToken mortgage asset address /// @param owner debt owner /// @return mortgageAssets amount of mortgaged assets /// @return parassetAssets amount of debt(Ptoken,Stability fee not included) /// @return blockHeight the block height of the last operation /// @return rate Mortgage rate(Initial mortgage rate,Mortgage rate after the last operation) /// @return created is it created function getLedger(address pToken, address mortgageToken, address owner) public view returns(uint256 mortgageAssets, uint256 parassetAssets, uint256 blockHeight, uint256 rate, bool created) { PersonalLedger memory pLedger = ledger[pToken][mortgageToken][address(owner)]; return (pLedger.mortgageAssets, pLedger.parassetAssets, pLedger.blockHeight, pLedger.rate, pLedger.created); } /// @dev View governance address /// @return governance address function getGovernance() external view returns(address) { return governance; } /// @dev View insurance pool address /// @return insurance pool address function getInsurancePool() external view returns(address) { return address(insurancePool); } /// @dev View the market base interest rate /// @return market base interest rate function getR0() external view returns(uint256) { return r0; } /// @dev View the amount of blocks produced in a year /// @return amount of blocks produced in a year function getOneYear() external view returns(uint256) { return oneYear; } /// @dev View the maximum mortgage rate /// @param mortgageToken Mortgage asset address /// @return maximum mortgage rate function getMaxRate(address mortgageToken) external view returns(uint256) { return maxRate[mortgageToken]; } /// @dev View the liquidation line /// @param mortgageToken Mortgage asset address /// @return liquidation line function getLiquidationLine(address mortgageToken) external view returns(uint256) { return liquidationLine[mortgageToken]; } /// @dev View the priceController contract address /// @return priceController contract address function getPriceController() external view returns(address) { return address(quary); } /// @dev View the ptoken address according to the underlying asset /// @param uToken Underlying asset address /// @return ptoken address function getUnderlyingToPToken(address uToken) external view returns(address) { return underlyingToPToken[uToken]; } /// @dev View the underlying asset according to the ptoken address /// @param pToken ptoken address /// @return underlying asset function getPTokenToUnderlying(address pToken) external view returns(address) { return pTokenToUnderlying[pToken]; } /// @dev View the debt array length /// @param pToken ptoken address /// @param mortgageToken mortgage asset address /// @return debt array length function getLedgerArrayNum(address pToken, address mortgageToken) external view returns(uint256) { return ledgerArray[pToken][mortgageToken].length; } /// @dev View the debt owner /// @param pToken ptoken address /// @param mortgageToken mortgage asset address /// @param index array subscript /// @return debt owner function getLedgerAddress(address pToken, address mortgageToken, uint256 index) external view returns(address) { return ledgerArray[pToken][mortgageToken][index]; } //---------governance---------- /// @dev Set contract status /// @param num 0: pause, 1: active, 2: out only function setFlag(uint8 num) public onlyGovernance { flag = num; } /// @dev Allow asset mortgage to generate ptoken /// @param pToken ptoken address /// @param mortgageToken mortgage asset address /// @param allow allow mortgage function setMortgageAllow(address pToken, address mortgageToken, bool allow) public onlyGovernance { mortgageAllow[pToken][mortgageToken] = allow; } /// @dev Set insurance pool contract /// @param add insurance pool contract function setInsurancePool(address add) public onlyGovernance { insurancePool = IInsurancePool(add); } /// @dev Set market base interest rate /// @param num market base interest rate(num = ? * 1 ether) function setR0(uint256 num) public onlyGovernance { r0 = num; } /// @dev Set the amount of blocks produced in a year /// @param num amount of blocks produced in a year function setOneYear(uint256 num) public onlyGovernance { oneYear = num; } /// @dev Set liquidation line /// @param mortgageToken mortgage asset address /// @param num liquidation line(num = ? * 100) function setLiquidationLine(address mortgageToken, uint256 num) public onlyGovernance { liquidationLine[mortgageToken] = num.mul(0.01 ether); } /// @dev Set the maximum mortgage rate /// @param mortgageToken mortgage asset address /// @param num maximum mortgage rate(num = ? * 100) function setMaxRate(address mortgageToken, uint256 num) public onlyGovernance { maxRate[mortgageToken] = num.mul(0.01 ether); } /// @dev Set priceController contract address /// @param add priceController contract address function setPriceController(address add) public onlyGovernance { quary = IPriceController(add); } /// @dev Set the underlying asset and ptoken mapping and /// Set the latest redemption time of ptoken insurance /// @param uToken underlying asset address /// @param pToken ptoken address function setInfo(address uToken, address pToken) public onlyGovernance { require(underlyingToPToken[uToken] == address(0x0), "Log:MortgagePool:underlyingToPToken"); require(address(insurancePool) != address(0x0), "Log:MortgagePool:0x0"); underlyingToPToken[uToken] = address(pToken); pTokenToUnderlying[address(pToken)] = uToken; insurancePool.setLatestTime(uToken); } //---------transaction--------- /// @dev Set governance address function setGovernance() public { governance = pTokenFactory.getGovernance(); require(governance != address(0x0), "Log:MortgagePool:0x0"); } /// @dev Mortgage asset casting ptoken /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param amount amount of mortgaged assets /// @param rate custom mortgage rate function coin(address mortgageToken, address pToken, uint256 amount, uint256 rate) public payable whenActive nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); require(rate > 0 && rate <= maxRate[mortgageToken], "Log:MortgagePool:rate!=0"); require(amount > 0, "Log:MortgagePool:amount!=0"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)]; uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; // Get the price and transfer to the mortgage token uint256 tokenPrice; uint256 pTokenPrice; if (mortgageToken != address(0x0)) { ERC20(mortgageToken).safeTransferFrom(address(msg.sender), address(this), amount); (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value); } else { require(msg.value >= amount, "Log:MortgagePool:!msg.value"); (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], uint256(msg.value).sub(amount)); } // Calculate the stability fee uint256 blockHeight = pLedger.blockHeight; uint256 fee = 0; if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) { fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice)); // The stability fee is transferred to the insurance pool ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee); // Eliminate negative accounts insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]); emit FeeValue(pToken, fee); } // Additional ptoken issuance uint256 pTokenAmount = amount.mul(pTokenPrice).mul(rate).div(tokenPrice.mul(100)); PToken(pToken).issuance(pTokenAmount, address(msg.sender)); // Update debt information pLedger.mortgageAssets = mortgageAssets.add(amount); pLedger.parassetAssets = parassetAssets.add(pTokenAmount); pLedger.blockHeight = block.number; pLedger.rate = getMortgageRate(pLedger.mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice); // Tag created if (pLedger.created == false) { ledgerArray[pToken][mortgageToken].push(address(msg.sender)); pLedger.created = true; } } /// @dev Increase mortgage assets /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param amount amount of mortgaged assets function supplement(address mortgageToken, address pToken, uint256 amount) public payable outOnly nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); require(amount > 0, "Log:MortgagePool:!amount"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)]; uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; require(pLedger.created, "Log:MortgagePool:!created"); // Get the price and transfer to the mortgage token uint256 tokenPrice; uint256 pTokenPrice; if (mortgageToken != address(0x0)) { ERC20(mortgageToken).safeTransferFrom(address(msg.sender), address(this), amount); (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value); } else { require(msg.value >= amount, "Log:MortgagePool:!msg.value"); (tokenPrice, pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], uint256(msg.value).sub(amount)); } // Calculate the stability fee uint256 blockHeight = pLedger.blockHeight; uint256 fee = 0; if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) { fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice)); // The stability fee is transferred to the insurance pool ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee); // Eliminate negative accounts insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]); emit FeeValue(pToken, fee); } // Update debt information pLedger.mortgageAssets = mortgageAssets.add(amount); pLedger.blockHeight = block.number; pLedger.rate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice); } /// @dev Reduce mortgage assets /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param amount amount of mortgaged assets function decrease(address mortgageToken, address pToken, uint256 amount) public payable outOnly nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)]; uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; require(amount > 0 && amount <= mortgageAssets, "Log:MortgagePool:!amount"); require(pLedger.created, "Log:MortgagePool:!created"); // Get the price (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value); // Calculate the stability fee uint256 blockHeight = pLedger.blockHeight; uint256 fee = 0; if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) { fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice)); // The stability fee is transferred to the insurance pool ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee); // Eliminate negative accounts insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]); emit FeeValue(pToken, fee); } // Update debt information pLedger.mortgageAssets = mortgageAssets.sub(amount); pLedger.blockHeight = block.number; pLedger.rate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice); // The debt warehouse mortgage rate cannot be greater than the maximum mortgage rate require(pLedger.rate <= maxRate[mortgageToken], "Log:MortgagePool:!maxRate"); // Transfer out mortgage assets if (mortgageToken != address(0x0)) { ERC20(mortgageToken).safeTransfer(address(msg.sender), amount); } else { TransferHelper.safeTransferETH(address(msg.sender), amount); } } /// @dev Increase debt (increase coinage) /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param amount amount of debt function increaseCoinage(address mortgageToken, address pToken, uint256 amount) public payable whenActive nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); require(amount > 0, "Log:MortgagePool:!amount"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)]; uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; require(pLedger.created, "Log:MortgagePool:!created"); // Get the price (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, pTokenToUnderlying[pToken], msg.value); // Calculate the stability fee uint256 blockHeight = pLedger.blockHeight; uint256 fee = 0; if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) { fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice)); // The stability fee is transferred to the insurance pool ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), fee); // Eliminate negative accounts insurancePool.eliminate(pToken, pTokenToUnderlying[pToken]); emit FeeValue(pToken, fee); } // Update debt information pLedger.parassetAssets = parassetAssets.add(amount); pLedger.blockHeight = block.number; pLedger.rate = getMortgageRate(mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice); // The debt warehouse mortgage rate cannot be greater than the maximum mortgage rate require(pLedger.rate <= maxRate[mortgageToken], "Log:MortgagePool:!maxRate"); // Additional ptoken issuance PToken(pToken).issuance(amount, address(msg.sender)); } /// @dev Reduce debt (increase coinage) /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param amount amount of debt function reducedCoinage(address mortgageToken, address pToken, uint256 amount) public payable outOnly nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][address(msg.sender)]; uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; address uToken = pTokenToUnderlying[pToken]; require(amount > 0 && amount <= parassetAssets, "Log:MortgagePool:!amount"); require(pLedger.created, "Log:MortgagePool:!created"); // Get the price (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, uToken, msg.value); // Calculate the stability fee uint256 blockHeight = pLedger.blockHeight; uint256 fee = 0; if (parassetAssets > 0 && block.number > blockHeight && blockHeight != 0) { fee = getFee(parassetAssets, blockHeight, pLedger.rate, getMortgageRate(mortgageAssets, parassetAssets, tokenPrice, pTokenPrice)); // The stability fee is transferred to the insurance pool ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), amount.add(fee)); // Eliminate negative accounts insurancePool.eliminate(pToken, uToken); emit FeeValue(pToken, fee); } // Update debt information pLedger.parassetAssets = parassetAssets.sub(amount); pLedger.blockHeight = block.number; pLedger.rate = getMortgageRate(mortgageAssets, pLedger.parassetAssets, tokenPrice, pTokenPrice); // Destroy ptoken insurancePool.destroyPToken(pToken, amount, uToken); } /// @dev Liquidation of debt /// @param mortgageToken mortgage asset address /// @param pToken ptoken address /// @param account debt owner address /// @param amount amount of mortgaged assets function liquidation(address mortgageToken, address pToken, address account, uint256 amount) public payable outOnly nonReentrant { require(mortgageAllow[pToken][mortgageToken], "Log:MortgagePool:!mortgageAllow"); PersonalLedger storage pLedger = ledger[pToken][mortgageToken][account]; require(pLedger.created, "Log:MortgagePool:!created"); uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; require(amount > 0 && amount <= mortgageAssets, "Log:MortgagePool:!amount"); // Get the price address uToken = pTokenToUnderlying[pToken]; (uint256 tokenPrice, uint256 pTokenPrice) = getPriceForPToken(mortgageToken, uToken, msg.value); // Judging the liquidation line checkLine(pLedger, tokenPrice, pTokenPrice, mortgageToken); // Calculate the amount of ptoken uint256 pTokenAmount = amount.mul(pTokenPrice).mul(90).div(tokenPrice.mul(100)); // Transfer to ptoken ERC20(pToken).safeTransferFrom(address(msg.sender), address(insurancePool), pTokenAmount); // Eliminate negative accounts insurancePool.eliminate(pToken, uToken); // Calculate the debt for destruction uint256 offset = parassetAssets.mul(amount).div(mortgageAssets); // Destroy ptoken insurancePool.destroyPToken(pToken, offset, uToken); // Update debt information pLedger.mortgageAssets = mortgageAssets.sub(amount); pLedger.parassetAssets = parassetAssets.sub(offset); // MortgageAssets liquidation, mortgage rate and block number are not updated if (pLedger.mortgageAssets == 0) { pLedger.parassetAssets = 0; pLedger.blockHeight = 0; pLedger.rate = 0; } // Transfer out mortgage asset if (mortgageToken != address(0x0)) { ERC20(mortgageToken).safeTransfer(address(msg.sender), amount); } else { TransferHelper.safeTransferETH(address(msg.sender), amount); } } /// @dev Check the liquidation line /// @param pLedger debt warehouse ledger /// @param tokenPrice Mortgage asset price(1 ETH = ? token) /// @param pTokenPrice PToken price(1 ETH = ? pToken) /// @param mortgageToken mortgage asset address function checkLine(PersonalLedger memory pLedger, uint256 tokenPrice, uint256 pTokenPrice, address mortgageToken) private view { uint256 parassetAssets = pLedger.parassetAssets; uint256 mortgageAssets = pLedger.mortgageAssets; // The current mortgage rate cannot exceed the liquidation line uint256 mortgageRate = getMortgageRate(pLedger.mortgageAssets, parassetAssets, tokenPrice, pTokenPrice); uint256 fee = 0; if (parassetAssets > 0 && block.number > pLedger.blockHeight && pLedger.blockHeight != 0) { fee = getFee(parassetAssets, pLedger.blockHeight, pLedger.rate, mortgageRate); } require(getMortgageRate(mortgageAssets, parassetAssets.add(fee), tokenPrice, pTokenPrice) > liquidationLine[mortgageToken], "Log:MortgagePool:!liquidationLine"); } /// @dev Get price /// @param mortgageToken mortgage asset address /// @param uToken underlying asset address /// @param priceValue price fee /// @return tokenPrice Mortgage asset price(1 ETH = ? token) /// @return pTokenPrice PToken price(1 ETH = ? pToken) function getPriceForPToken(address mortgageToken, address uToken, uint256 priceValue) private returns (uint256 tokenPrice, uint256 pTokenPrice) { (tokenPrice, pTokenPrice) = quary.getPriceForPToken{value:priceValue}(mortgageToken, uToken, msg.sender); } // function takeOutERC20(address token, uint256 amount, address to) public onlyGovernance { // ERC20(token).safeTransfer(address(to), amount); // } // function takeOutETH(uint256 amount, address to) public onlyGovernance { // TransferHelper.safeTransferETH(address(to), amount); // } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"factoryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"FeeValue","type":"event"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"}],"name":"coin","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"decrease","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"flag","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"inputToken","type":"address"},{"internalType":"uint256","name":"inputTokenAmount","type":"uint256"},{"internalType":"address","name":"outputToken","type":"address"}],"name":"getDecimalConversion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"uint256","name":"nowRate","type":"uint256"}],"name":"getFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"uTokenPrice","type":"uint256"},{"internalType":"uint256","name":"maxRateNum","type":"uint256"},{"internalType":"uint256","name":"owner","type":"uint256"}],"name":"getInfoRealTime","outputs":[{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"uint256","name":"mortgageRate","type":"uint256"},{"internalType":"uint256","name":"maxSubM","type":"uint256"},{"internalType":"uint256","name":"maxAddP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInsurancePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"getLedger","outputs":[{"internalType":"uint256","name":"mortgageAssets","type":"uint256"},{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"blockHeight","type":"uint256"},{"internalType":"uint256","name":"rate","type":"uint256"},{"internalType":"bool","name":"created","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getLedgerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getLedgerArrayNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getLiquidationLine","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"}],"name":"getMaxRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mortgageAssets","type":"uint256"},{"internalType":"uint256","name":"parassetAssets","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"internalType":"uint256","name":"pTokenPrice","type":"uint256"}],"name":"getMortgageRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getOneYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"}],"name":"getPTokenToUnderlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getR0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uToken","type":"address"}],"name":"getUnderlyingToPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"increaseCoinage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"liquidation","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pTokenToUnderlying","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reducedCoinage","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"num","type":"uint8"}],"name":"setFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"uToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"}],"name":"setInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"setInsurancePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setLiquidationLine","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setMaxRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pToken","type":"address"},{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"bool","name":"allow","type":"bool"}],"name":"setMortgageAllow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setOneYear","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"add","type":"address"}],"name":"setPriceController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"}],"name":"setR0","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"mortgageToken","type":"address"},{"internalType":"address","name":"pToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"supplement","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"underlyingToPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526658d15e17628000600c5562249f00600d553480156200002357600080fd5b50604051620032e8380380620032e8833981016040819052620000469162000114565b6001600055600b80546001600160a01b0319166001600160a01b0383811691909117918290556040805163289b3c0d60e01b81529051929091169163289b3c0d91600480820192602092909190829003018186803b158015620000a857600080fd5b505afa158015620000bd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000e3919062000114565b600180546001600160a01b0319166001600160a01b039290921691909117905550600e805460ff1916905562000144565b60006020828403121562000126578081fd5b81516001600160a01b03811681146200013d578182fd5b9392505050565b61319480620001546000396000f3fe60806040526004361061020f5760003560e01c806388ac317711610118578063b1ef1e44116100a0578063d0d5665b1161006f578063d0d5665b146105b7578063f1a4252e146105cc578063f9081591146105e1578063fb606f9214610601578063fd7948d4146106215761020f565b8063b1ef1e441461054f578063bf8e30b814610562578063c7aea00114610582578063cafab788146105a25761020f565b806394a39b6d116100e757806394a39b6d1461049f5780639b773d96146104cf578063a30f5313146104ef578063a94c487e1461050f578063a99c53b31461052f5761020f565b806388ac31771461042a578063890eba681461044a5780638f957d1d1461046c578063930aa4161461048c5761020f565b80633f8498201161019b5780636c074fe61161016a5780636c074fe6146103975780637120a88b146103b75780637326ad08146103d757806373ddaef4146103ea5780637ff4d02f1461040a5761020f565b80633f8498201461032d57806350777e5e1461034d578063566847291461036d5780635aa6e675146103825761020f565b806322a94595116101e257806322a94595146102a3578063289b3c0d146102b65780632932e191146102cb5780633ce4c3b6146102f85780633cf045a4146103185761020f565b806308d32a721461021457806308ff8ea61461024e57806312e20d03146102635780631effb30d14610276575b600080fd5b34801561022057600080fd5b5061023461022f36600461282f565b610641565b6040516102459594939291906130d6565b60405180910390f35b61026161025c366004612908565b6106cf565b005b610261610271366004612879565b6109bf565b34801561028257600080fd5b50610296610291366004612908565b610cfd565b6040516102459190612b3f565b6102616102b1366004612948565b610d4d565b3480156102c257600080fd5b50610296611147565b3480156102d757600080fd5b506102eb6102e63660046127b8565b611156565b604051610245919061309b565b34801561030457600080fd5b506102eb6103133660046127f7565b611171565b34801561032457600080fd5b5061029661119e565b34801561033957600080fd5b506102616103483660046127b8565b6111ad565b34801561035957600080fd5b50610261610368366004612a62565b6111f9565b34801561037957600080fd5b506102eb611228565b34801561038e57600080fd5b5061029661122e565b3480156103a357600080fd5b506102966103b23660046127b8565b61123d565b3480156103c357600080fd5b506102616103d2366004612ace565b611258565b6102616103e5366004612908565b611298565b3480156103f657600080fd5b506102eb610405366004612a9d565b61159f565b34801561041657600080fd5b506102eb610425366004612a9d565b61165e565b34801561043657600080fd5b50610261610445366004612a62565b6116a4565b34801561045657600080fd5b5061045f6116d3565b60405161024591906130fb565b34801561047857600080fd5b506102966104873660046127b8565b6116dc565b61026161049a366004612908565b6116fa565b3480156104ab57600080fd5b506104bf6104ba36600461298d565b6119c9565b60405161024594939291906130bb565b3480156104db57600080fd5b506102616104ea3660046129e5565b611b93565b3480156104fb57600080fd5b5061026161050a3660046129e5565b611bee565b34801561051b57600080fd5b5061026161052a3660046127b8565b611c49565b34801561053b57600080fd5b506102eb61054a3660046127b8565b611c95565b61026161055d366004612908565b611cb0565b34801561056e57600080fd5b5061029661057d3660046127b8565b611f8c565b34801561058e57600080fd5b5061026161059d3660046128c9565b611faa565b3480156105ae57600080fd5b5061026161200e565b3480156105c357600080fd5b506102966120d1565b3480156105d857600080fd5b506102eb6120e0565b3480156105ed57600080fd5b506102eb6105fc366004612a10565b6120e6565b34801561060d57600080fd5b5061026161061c3660046127f7565b61221e565b34801561062d57600080fd5b5061029661063c3660046127b8565b61234d565b6000806000806000610651612787565b505050506001600160a01b03948516600090815260056020908152604080832096881683529581528582209490961681529285525050819020815160a08101835281548082526001830154948201859052600283015493820184905260038301546060830181905260049093015460ff161515608090920182905294565b600e5460ff166106fa5760405162461bcd60e51b81526004016106f19061306e565b60405180910390fd5b6002600054141561071d5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166107675760405162461bcd60e51b81526004016106f190612f3c565b600081116107875760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166107df5760405162461bcd60e51b81526004016106f190612e61565b6000806001600160a01b03881615610837576108066001600160a01b038916333089612368565b6001600160a01b0380881660009081526003602052604090205461082d918a9116346123c6565b909250905061088d565b853410156108575760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808816600090815260036020526040902054610887918a9116610882348a61245e565b6123c6565b90925090505b6002850154600085158015906108a257508143115b80156108ad57508115155b15610987576108c886838960030154610405898b8a8a61165e565b600a549091506108e7906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f9261092d928e92911690600401612b53565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b5050505060008051602061313f833981519152898260405161097e929190612bb4565b60405180910390a15b6109918589612481565b8088554360028901556109a69087868661165e565b6003909701969096555050600160005550505050505050565b600e5460ff166109e15760405162461bcd60e51b81526004016106f19061306e565b60026000541415610a045760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610a4e5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808416600090815260056020908152604080832088851684528252808320938616835292905220600481015460ff16610aa15760405162461bcd60e51b81526004016106f190612e61565b600181015481548315801590610ab75750808411155b610ad35760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038087166000908152600360205260408120549091169080610afd8a84346123c6565b6040805160a0810182528954815260018a0154602082015260028a01549181019190915260038901546060820152600489015460ff16151560808201529193509150610b4b9083838d6124a4565b6000610b76610b5b84606461254f565b610b70605a610b6a8c8761254f565b9061254f565b90612586565b600a54909150610b95906001600160a01b038c81169133911684612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f90610bc7908d908890600401612b53565b600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506000610c1286610b708b8a61254f90919063ffffffff16565b600a5460405162d1253d60e31b81529192506001600160a01b03169063068929e890610c46908e9085908a90600401612bcd565b600060405180830381600087803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b50505050610c8b898761245e90919063ffffffff16565b8855610c97878261245e565b60018901558754610cb8576000600189018190556002890181905560038901555b6001600160a01b038c1615610ce057610cdb6001600160a01b038d16338b6125b8565b610cea565b610cea338a6125dc565b5050600160005550505050505050505050565b6001600160a01b0380841660009081526006602090815260408083209386168352929052908120805483908110610d3057fe5b6000918252602090912001546001600160a01b0316949350505050565b600e5460ff16600114610d725760405162461bcd60e51b81526004016106f190612c84565b60026000541415610d955760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610ddf5760405162461bcd60e51b81526004016106f190612f3c565b600081118015610e0757506001600160a01b0384166000908152600760205260409020548111155b610e235760405162461bcd60e51b81526004016106f190612dfb565b60008211610e435760405162461bcd60e51b81526004016106f190612e98565b6001600160a01b0380841660009081526005602090815260408083209388168084529382528083203384529091528120600181015481549193909290819015610ecc57610e9b6001600160a01b038a1633308a612368565b6001600160a01b03808916600090815260036020526040902054610ec2918b9116346123c6565b9092509050610f1d565b86341015610eec5760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808916600090815260036020526040902054610f17918b9116610882348b61245e565b90925090505b600285015460008515801590610f3257508143115b8015610f3d57508115155b1561101757610f5886838960030154610405898b8a8a61165e565b600a54909150610f77906001600160a01b038c81169133911684612368565b600a546001600160a01b038b811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92610fbd928f92911690600401612b53565b600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a8260405161100e929190612bb4565b60405180910390a15b600061103561102786606461254f565b610b708b610b6a8e8961254f565b6040516313b1db0b60e31b81529091506001600160a01b038c1690639d8ed8589061106690849033906004016130a4565b600060405180830381600087803b15801561108057600080fd5b505af1158015611094573d6000803e3d6000fd5b505050506110ab8a8761248190919063ffffffff16565b88556110b78782612481565b600189018190554360028a015588546110d191878761165e565b6003890155600488015460ff16610cea575050506001600160a01b0397881660009081526006602090815260408083209b909a168252998a52978820805460018181018355918a5299892090990180546001600160a01b031916331790555050506004909101805460ff19168617905550505055565b6001546001600160a01b031690565b6001600160a01b031660009081526008602052604090205490565b6001600160a01b038083166000908152600660209081526040808320938516835292905220545b92915050565b6009546001600160a01b031690565b6001546001600160a01b031633146111d75760405162461bcd60e51b81526004016106f190612e32565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112235760405162461bcd60e51b81526004016106f190612e32565b600c55565b600c5490565b6001546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146112825760405162461bcd60e51b81526004016106f190612e32565b600e805460ff191660ff92909216919091179055565b600e5460ff166001146112bd5760405162461bcd60e51b81526004016106f190612c84565b600260005414156112e05760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff1661132a5760405162461bcd60e51b81526004016106f190612f3c565b6000811161134a5760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166113a25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b03808616600090815260036020526040812054909182916113cd918a9116346123c6565b60028701549193509150600085158015906113e757508143115b80156113f257508115155b156114cc5761140d86838960030154610405898b8a8a61165e565b600a5490915061142c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611472928e92911690600401612b53565b600060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b5050505060008051602061313f83398151915289826040516114c3929190612bb4565b60405180910390a15b6114d68689612481565b600188018190554360028901556114f0908690868661165e565b600388018190556001600160a01b038b16600090815260076020526040902054101561152e5760405162461bcd60e51b81526004016106f190612d83565b6040516313b1db0b60e31b81526001600160a01b038a1690639d8ed8589061155c908b9033906004016130a4565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b50506001600055505050505050505050505050565b6000806115bd6115af438761245e565b600c54610b6a90899061254f565b905060006115cb8585612481565b905060006115f86115dd60038461254f565b610b6a6115ea438b61245e565b600c54610b6a908d9061254f565b90506000611619670de0b6b3a7640000600d5461254f90919063ffffffff16565b905061164f61163f6116386002610b6a85670de0b6b3a764000061254f565b8490612586565b6116498684612586565b90612481565b9450505050505b949350505050565b600084158061166b575081155b1561167857506000611656565b61169b611685838761254f565b610b70670de0b6b3a7640000610b6a888861254f565b95945050505050565b6001546001600160a01b031633146116ce5760405162461bcd60e51b81526004016106f190612e32565b600d55565b600e5460ff1681565b6001600160a01b039081166000908152600360205260409020541690565b600e5460ff1661171c5760405162461bcd60e51b81526004016106f19061306e565b6002600054141561173f5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166117895760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808316600081815260056020908152604080832088861684528252808320338452825280832060018101548154958552600390935292205491939092911684158015906117de5750828511155b6117fa5760405162461bcd60e51b81526004016106f190612c1f565b600484015460ff1661181e5760405162461bcd60e51b81526004016106f190612e61565b60008061182c8984346123c6565b600288015491935091506000861580159061184657508143115b801561185157508115155b156119295761186c87838a600301546104058a8c8a8a61165e565b600a5490915061189d9033906001600160a01b031661188b8c85612481565b6001600160a01b038e16929190612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f906118cf908d908990600401612b53565b600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a82604051611920929190612bb4565b60405180910390a15b611933878a61245e565b600189018190554360028a015561194d908790868661165e565b6003890155600a5460405162d1253d60e31b81526001600160a01b039091169063068929e890611985908d908d908a90600401612bcd565b600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600160005550505050505050505050505050565b6000806000806119d7612787565b506001600160a01b03808a1660009081526005602090815260408083208e851684528252808320938916835292815290829020825160a0810184528154808252600183015493820193909352600282015493810193909352600381015460608401526004015460ff1615156080830152158015611a5657506020810151155b15611a6f57600080600080945094509450945050611b86565b6001600160a01b03808b166000908152600360205260408120549091611a9791168a8d6120e6565b60208301516040840151606085015185519394508d93611ac0939291906104059084878961165e565b83516020850151919850611adf91611ad8908a612481565b838561165e565b95506000611af48a662386f26fc1000061254f565b9050808710611b0a576000955060009450611b81565b611b45611b3d611b1a838661254f565b610b70670de0b6b3a7640000610b6a878a6020015161254f90919063ffffffff16565b85519061245e565b6020850151909650611b7e90611b78611b66670de0b6b3a76400008661254f565b8751610b70908690610b6a908a61254f565b9061245e565b94505b505050505b9650965096509692505050565b6001546001600160a01b03163314611bbd5760405162461bcd60e51b81526004016106f190612e32565b611bce81662386f26fc1000061254f565b6001600160a01b0390921660009081526007602052604090209190915550565b6001546001600160a01b03163314611c185760405162461bcd60e51b81526004016106f190612e32565b611c2981662386f26fc1000061254f565b6001600160a01b0390921660009081526008602052604090209190915550565b6001546001600160a01b03163314611c735760405162461bcd60e51b81526004016106f190612e32565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526007602052604090205490565b600e5460ff16611cd25760405162461bcd60e51b81526004016106f19061306e565b60026000541415611cf55760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff16611d3f5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b0380831660009081526005602090815260408083209387168352928152828220338352905220600181015481548315801590611d825750808411155b611d9e5760405162461bcd60e51b81526004016106f190612c1f565b600483015460ff16611dc25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b0380861660009081526003602052604081205490918291611ded918a9116346123c6565b6002870154919350915060008515801590611e0757508143115b8015611e1257508115155b15611eec57611e2d86838960030154610405898b8a8a61165e565b600a54909150611e4c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611e92928e92911690600401612b53565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b5050505060008051602061313f8339815191528982604051611ee3929190612bb4565b60405180910390a15b611ef6858961245e565b808855436002890155611f0b9087868661165e565b600388018190556001600160a01b038b166000908152600760205260409020541015611f495760405162461bcd60e51b81526004016106f190612d83565b6001600160a01b038a1615611f7157611f6c6001600160a01b038b16338a6125b8565b611f7b565b611f7b33896125dc565b505060016000555050505050505050565b6001600160a01b039081166000908152600260205260409020541690565b6001546001600160a01b03163314611fd45760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b03928316600090815260046020908152604080832094909516825292909252919020805460ff1916911515919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b031663289b3c0d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906127db565b600180546001600160a01b0319166001600160a01b039283161790819055166120cf5760405162461bcd60e51b81526004016106f190612ce9565b565b600a546001600160a01b031690565b600d5490565b60006012806001600160a01b0386161561217157856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213357600080fd5b505afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190612aea565b60ff1691505b6001600160a01b038416156121f757836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190612aea565b60ff1690505b61221482600a0a610b7083600a0a8861254f90919063ffffffff16565b9695505050505050565b6001546001600160a01b031633146122485760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b0382811660009081526002602052604090205416156122805760405162461bcd60e51b81526004016106f190612fbd565b600a546001600160a01b03166122a85760405162461bcd60e51b81526004016106f190612ce9565b6001600160a01b03808316600081815260026020908152604080832080548688166001600160a01b031991821681179092559084526003909252918290208054909116909217909155600a5490516377e8a1bd60e11b815291169063efd1437a90612317908590600401612b3f565b600060405180830381600087803b15801561233157600080fd5b505af1158015612345573d6000803e3d6000fd5b505050505050565b6002602052600090815260409020546001600160a01b031681565b6123c0846323b872dd60e01b85858560405160240161238993929190612b90565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b50505050565b600954604051630da33aa960e01b815260009182916001600160a01b0390911690630da33aa990859061240190899089903390600401612b6d565b60408051808303818588803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124529190612a7a565b90969095509350505050565b808203828111156111985760405162461bcd60e51b81526004016106f190612bf0565b808201828110156111985760405162461bcd60e51b81526004016106f190612cbb565b6020840151845160006124b98284888861165e565b9050600080841180156124cf5750876040015143115b80156124de5750604088015115155b156124fa576124f78489604001518a606001518561159f565b90505b6001600160a01b038516600090815260086020526040902054612528846125218785612481565b8a8a61165e565b116125455760405162461bcd60e51b81526004016106f190612dba565b5050505050505050565b600081158061256a5750508082028282828161256757fe5b04145b6111985760405162461bcd60e51b81526004016106f190612c56565b60008082116125a75760405162461bcd60e51b81526004016106f190612ecf565b8183816125b057fe5b049392505050565b6125d78363a9059cbb60e01b8484604051602401612389929190612bb4565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516126069190612b06565b60006040518083038185875af1925050503d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b50509050806125d75760405162461bcd60e51b81526004016106f190612ef9565b61267b826001600160a01b031661274e565b6126975760405162461bcd60e51b81526004016106f190613037565b60006060836001600160a01b0316836040516126b39190612b06565b6000604051808303816000865af19150503d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b5091509150816127175760405162461bcd60e51b81526004016106f190612d17565b8051156123c057808060200190518101906127329190612a46565b6123c05760405162461bcd60e51b81526004016106f190612f73565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611656575050151592915050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000602082840312156127c9578081fd5b81356127d481613109565b9392505050565b6000602082840312156127ec578081fd5b81516127d481613109565b60008060408385031215612809578081fd5b823561281481613109565b9150602083013561282481613109565b809150509250929050565b600080600060608486031215612843578081fd5b833561284e81613109565b9250602084013561285e81613109565b9150604084013561286e81613109565b809150509250925092565b6000806000806080858703121561288e578081fd5b843561289981613109565b935060208501356128a981613109565b925060408501356128b981613109565b9396929550929360600135925050565b6000806000606084860312156128dd578283fd5b83356128e881613109565b925060208401356128f881613109565b9150604084013561286e81613121565b60008060006060848603121561291c578283fd5b833561292781613109565b9250602084013561293781613109565b929592945050506040919091013590565b6000806000806080858703121561295d578384fd5b843561296881613109565b9350602085013561297881613109565b93969395505050506040820135916060013590565b60008060008060008060c087890312156129a5578182fd5b86356129b081613109565b955060208701356129c081613109565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080604083850312156129f7578182fd5b8235612a0281613109565b946020939093013593505050565b600080600060608486031215612a24578283fd5b8335612a2f81613109565b925060208401359150604084013561286e81613109565b600060208284031215612a57578081fd5b81516127d481613121565b600060208284031215612a73578081fd5b5035919050565b60008060408385031215612a8c578182fd5b505080516020909101519092909150565b60008060008060808587031215612ab2578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612adf578081fd5b81356127d48161312f565b600060208284031215612afb578081fd5b81516127d48161312f565b60008251815b81811015612b265760208186018101518583015201612b0c565b81811115612b345782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a21616d6f756e740000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a216163746976650000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526014908201527304c6f673a4d6f727467616765506f6f6c3a3078360641b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252601b908201527f4c6f673a4d6f727467616765506f6f6c3a216d73672e76616c75650000000000604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216d61785261746500000000000000604082015260600190565b60208082526021908201527f4c6f673a4d6f727467616765506f6f6c3a216c69717569646174696f6e4c696e6040820152606560f81b606082015260800190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a72617465213d300000000000000000604082015260600190565b6020808252601590820152742637b39d26b7b93a33b0b3b2a837b7b61d10b3b7bb60591b604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216372656174656400000000000000604082015260600190565b6020808252601a908201527f4c6f673a4d6f727467616765506f6f6c3a616d6f756e74213d30000000000000604082015260600190565b60208082526010908201526f64732d6d6174682d6469762d7a65726f60801b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252601f908201527f4c6f673a4d6f727467616765506f6f6c3a216d6f727467616765416c6c6f7700604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f4c6f673a4d6f727467616765506f6f6c3a756e6465726c79696e67546f50546f60408201526235b2b760e91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b60208082526013908201527204c6f673a4d6f727467616765506f6f6c3a213606c1b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b93845260208401929092526040830152606082015260800190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60ff91909116815260200190565b6001600160a01b038116811461311e57600080fd5b50565b801515811461311e57600080fd5b60ff8116811461311e57600080fdfe4377f33be9a604d55b08975df4d8840dc93be5d56bfa558d0f6ba5638e26a21fa264697066735822122018e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c148364736f6c634300060c0033000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b
Deployed Bytecode
0x60806040526004361061020f5760003560e01c806388ac317711610118578063b1ef1e44116100a0578063d0d5665b1161006f578063d0d5665b146105b7578063f1a4252e146105cc578063f9081591146105e1578063fb606f9214610601578063fd7948d4146106215761020f565b8063b1ef1e441461054f578063bf8e30b814610562578063c7aea00114610582578063cafab788146105a25761020f565b806394a39b6d116100e757806394a39b6d1461049f5780639b773d96146104cf578063a30f5313146104ef578063a94c487e1461050f578063a99c53b31461052f5761020f565b806388ac31771461042a578063890eba681461044a5780638f957d1d1461046c578063930aa4161461048c5761020f565b80633f8498201161019b5780636c074fe61161016a5780636c074fe6146103975780637120a88b146103b75780637326ad08146103d757806373ddaef4146103ea5780637ff4d02f1461040a5761020f565b80633f8498201461032d57806350777e5e1461034d578063566847291461036d5780635aa6e675146103825761020f565b806322a94595116101e257806322a94595146102a3578063289b3c0d146102b65780632932e191146102cb5780633ce4c3b6146102f85780633cf045a4146103185761020f565b806308d32a721461021457806308ff8ea61461024e57806312e20d03146102635780631effb30d14610276575b600080fd5b34801561022057600080fd5b5061023461022f36600461282f565b610641565b6040516102459594939291906130d6565b60405180910390f35b61026161025c366004612908565b6106cf565b005b610261610271366004612879565b6109bf565b34801561028257600080fd5b50610296610291366004612908565b610cfd565b6040516102459190612b3f565b6102616102b1366004612948565b610d4d565b3480156102c257600080fd5b50610296611147565b3480156102d757600080fd5b506102eb6102e63660046127b8565b611156565b604051610245919061309b565b34801561030457600080fd5b506102eb6103133660046127f7565b611171565b34801561032457600080fd5b5061029661119e565b34801561033957600080fd5b506102616103483660046127b8565b6111ad565b34801561035957600080fd5b50610261610368366004612a62565b6111f9565b34801561037957600080fd5b506102eb611228565b34801561038e57600080fd5b5061029661122e565b3480156103a357600080fd5b506102966103b23660046127b8565b61123d565b3480156103c357600080fd5b506102616103d2366004612ace565b611258565b6102616103e5366004612908565b611298565b3480156103f657600080fd5b506102eb610405366004612a9d565b61159f565b34801561041657600080fd5b506102eb610425366004612a9d565b61165e565b34801561043657600080fd5b50610261610445366004612a62565b6116a4565b34801561045657600080fd5b5061045f6116d3565b60405161024591906130fb565b34801561047857600080fd5b506102966104873660046127b8565b6116dc565b61026161049a366004612908565b6116fa565b3480156104ab57600080fd5b506104bf6104ba36600461298d565b6119c9565b60405161024594939291906130bb565b3480156104db57600080fd5b506102616104ea3660046129e5565b611b93565b3480156104fb57600080fd5b5061026161050a3660046129e5565b611bee565b34801561051b57600080fd5b5061026161052a3660046127b8565b611c49565b34801561053b57600080fd5b506102eb61054a3660046127b8565b611c95565b61026161055d366004612908565b611cb0565b34801561056e57600080fd5b5061029661057d3660046127b8565b611f8c565b34801561058e57600080fd5b5061026161059d3660046128c9565b611faa565b3480156105ae57600080fd5b5061026161200e565b3480156105c357600080fd5b506102966120d1565b3480156105d857600080fd5b506102eb6120e0565b3480156105ed57600080fd5b506102eb6105fc366004612a10565b6120e6565b34801561060d57600080fd5b5061026161061c3660046127f7565b61221e565b34801561062d57600080fd5b5061029661063c3660046127b8565b61234d565b6000806000806000610651612787565b505050506001600160a01b03948516600090815260056020908152604080832096881683529581528582209490961681529285525050819020815160a08101835281548082526001830154948201859052600283015493820184905260038301546060830181905260049093015460ff161515608090920182905294565b600e5460ff166106fa5760405162461bcd60e51b81526004016106f19061306e565b60405180910390fd5b6002600054141561071d5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166107675760405162461bcd60e51b81526004016106f190612f3c565b600081116107875760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166107df5760405162461bcd60e51b81526004016106f190612e61565b6000806001600160a01b03881615610837576108066001600160a01b038916333089612368565b6001600160a01b0380881660009081526003602052604090205461082d918a9116346123c6565b909250905061088d565b853410156108575760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808816600090815260036020526040902054610887918a9116610882348a61245e565b6123c6565b90925090505b6002850154600085158015906108a257508143115b80156108ad57508115155b15610987576108c886838960030154610405898b8a8a61165e565b600a549091506108e7906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f9261092d928e92911690600401612b53565b600060405180830381600087803b15801561094757600080fd5b505af115801561095b573d6000803e3d6000fd5b5050505060008051602061313f833981519152898260405161097e929190612bb4565b60405180910390a15b6109918589612481565b8088554360028901556109a69087868661165e565b6003909701969096555050600160005550505050505050565b600e5460ff166109e15760405162461bcd60e51b81526004016106f19061306e565b60026000541415610a045760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610a4e5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808416600090815260056020908152604080832088851684528252808320938616835292905220600481015460ff16610aa15760405162461bcd60e51b81526004016106f190612e61565b600181015481548315801590610ab75750808411155b610ad35760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038087166000908152600360205260408120549091169080610afd8a84346123c6565b6040805160a0810182528954815260018a0154602082015260028a01549181019190915260038901546060820152600489015460ff16151560808201529193509150610b4b9083838d6124a4565b6000610b76610b5b84606461254f565b610b70605a610b6a8c8761254f565b9061254f565b90612586565b600a54909150610b95906001600160a01b038c81169133911684612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f90610bc7908d908890600401612b53565b600060405180830381600087803b158015610be157600080fd5b505af1158015610bf5573d6000803e3d6000fd5b505050506000610c1286610b708b8a61254f90919063ffffffff16565b600a5460405162d1253d60e31b81529192506001600160a01b03169063068929e890610c46908e9085908a90600401612bcd565b600060405180830381600087803b158015610c6057600080fd5b505af1158015610c74573d6000803e3d6000fd5b50505050610c8b898761245e90919063ffffffff16565b8855610c97878261245e565b60018901558754610cb8576000600189018190556002890181905560038901555b6001600160a01b038c1615610ce057610cdb6001600160a01b038d16338b6125b8565b610cea565b610cea338a6125dc565b5050600160005550505050505050505050565b6001600160a01b0380841660009081526006602090815260408083209386168352929052908120805483908110610d3057fe5b6000918252602090912001546001600160a01b0316949350505050565b600e5460ff16600114610d725760405162461bcd60e51b81526004016106f190612c84565b60026000541415610d955760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038085168252600460209081526040808420928816845291905290205460ff16610ddf5760405162461bcd60e51b81526004016106f190612f3c565b600081118015610e0757506001600160a01b0384166000908152600760205260409020548111155b610e235760405162461bcd60e51b81526004016106f190612dfb565b60008211610e435760405162461bcd60e51b81526004016106f190612e98565b6001600160a01b0380841660009081526005602090815260408083209388168084529382528083203384529091528120600181015481549193909290819015610ecc57610e9b6001600160a01b038a1633308a612368565b6001600160a01b03808916600090815260036020526040902054610ec2918b9116346123c6565b9092509050610f1d565b86341015610eec5760405162461bcd60e51b81526004016106f190612d4c565b6001600160a01b03808916600090815260036020526040902054610f17918b9116610882348b61245e565b90925090505b600285015460008515801590610f3257508143115b8015610f3d57508115155b1561101757610f5886838960030154610405898b8a8a61165e565b600a54909150610f77906001600160a01b038c81169133911684612368565b600a546001600160a01b038b811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92610fbd928f92911690600401612b53565b600060405180830381600087803b158015610fd757600080fd5b505af1158015610feb573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a8260405161100e929190612bb4565b60405180910390a15b600061103561102786606461254f565b610b708b610b6a8e8961254f565b6040516313b1db0b60e31b81529091506001600160a01b038c1690639d8ed8589061106690849033906004016130a4565b600060405180830381600087803b15801561108057600080fd5b505af1158015611094573d6000803e3d6000fd5b505050506110ab8a8761248190919063ffffffff16565b88556110b78782612481565b600189018190554360028a015588546110d191878761165e565b6003890155600488015460ff16610cea575050506001600160a01b0397881660009081526006602090815260408083209b909a168252998a52978820805460018181018355918a5299892090990180546001600160a01b031916331790555050506004909101805460ff19168617905550505055565b6001546001600160a01b031690565b6001600160a01b031660009081526008602052604090205490565b6001600160a01b038083166000908152600660209081526040808320938516835292905220545b92915050565b6009546001600160a01b031690565b6001546001600160a01b031633146111d75760405162461bcd60e51b81526004016106f190612e32565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031633146112235760405162461bcd60e51b81526004016106f190612e32565b600c55565b600c5490565b6001546001600160a01b031681565b6003602052600090815260409020546001600160a01b031681565b6001546001600160a01b031633146112825760405162461bcd60e51b81526004016106f190612e32565b600e805460ff191660ff92909216919091179055565b600e5460ff166001146112bd5760405162461bcd60e51b81526004016106f190612c84565b600260005414156112e05760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff1661132a5760405162461bcd60e51b81526004016106f190612f3c565b6000811161134a5760405162461bcd60e51b81526004016106f190612c1f565b6001600160a01b038083166000908152600560209081526040808320938716835292815282822033835290522060018101548154600483015460ff166113a25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b03808616600090815260036020526040812054909182916113cd918a9116346123c6565b60028701549193509150600085158015906113e757508143115b80156113f257508115155b156114cc5761140d86838960030154610405898b8a8a61165e565b600a5490915061142c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611472928e92911690600401612b53565b600060405180830381600087803b15801561148c57600080fd5b505af11580156114a0573d6000803e3d6000fd5b5050505060008051602061313f83398151915289826040516114c3929190612bb4565b60405180910390a15b6114d68689612481565b600188018190554360028901556114f0908690868661165e565b600388018190556001600160a01b038b16600090815260076020526040902054101561152e5760405162461bcd60e51b81526004016106f190612d83565b6040516313b1db0b60e31b81526001600160a01b038a1690639d8ed8589061155c908b9033906004016130a4565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b50506001600055505050505050505050505050565b6000806115bd6115af438761245e565b600c54610b6a90899061254f565b905060006115cb8585612481565b905060006115f86115dd60038461254f565b610b6a6115ea438b61245e565b600c54610b6a908d9061254f565b90506000611619670de0b6b3a7640000600d5461254f90919063ffffffff16565b905061164f61163f6116386002610b6a85670de0b6b3a764000061254f565b8490612586565b6116498684612586565b90612481565b9450505050505b949350505050565b600084158061166b575081155b1561167857506000611656565b61169b611685838761254f565b610b70670de0b6b3a7640000610b6a888861254f565b95945050505050565b6001546001600160a01b031633146116ce5760405162461bcd60e51b81526004016106f190612e32565b600d55565b600e5460ff1681565b6001600160a01b039081166000908152600360205260409020541690565b600e5460ff1661171c5760405162461bcd60e51b81526004016106f19061306e565b6002600054141561173f5760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff166117895760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b03808316600081815260056020908152604080832088861684528252808320338452825280832060018101548154958552600390935292205491939092911684158015906117de5750828511155b6117fa5760405162461bcd60e51b81526004016106f190612c1f565b600484015460ff1661181e5760405162461bcd60e51b81526004016106f190612e61565b60008061182c8984346123c6565b600288015491935091506000861580159061184657508143115b801561185157508115155b156119295761186c87838a600301546104058a8c8a8a61165e565b600a5490915061189d9033906001600160a01b031661188b8c85612481565b6001600160a01b038e16929190612368565b600a54604051632a90b48f60e01b81526001600160a01b0390911690632a90b48f906118cf908d908990600401612b53565b600060405180830381600087803b1580156118e957600080fd5b505af11580156118fd573d6000803e3d6000fd5b5050505060008051602061313f8339815191528a82604051611920929190612bb4565b60405180910390a15b611933878a61245e565b600189018190554360028a015561194d908790868661165e565b6003890155600a5460405162d1253d60e31b81526001600160a01b039091169063068929e890611985908d908d908a90600401612bcd565b600060405180830381600087803b15801561199f57600080fd5b505af11580156119b3573d6000803e3d6000fd5b5050600160005550505050505050505050505050565b6000806000806119d7612787565b506001600160a01b03808a1660009081526005602090815260408083208e851684528252808320938916835292815290829020825160a0810184528154808252600183015493820193909352600282015493810193909352600381015460608401526004015460ff1615156080830152158015611a5657506020810151155b15611a6f57600080600080945094509450945050611b86565b6001600160a01b03808b166000908152600360205260408120549091611a9791168a8d6120e6565b60208301516040840151606085015185519394508d93611ac0939291906104059084878961165e565b83516020850151919850611adf91611ad8908a612481565b838561165e565b95506000611af48a662386f26fc1000061254f565b9050808710611b0a576000955060009450611b81565b611b45611b3d611b1a838661254f565b610b70670de0b6b3a7640000610b6a878a6020015161254f90919063ffffffff16565b85519061245e565b6020850151909650611b7e90611b78611b66670de0b6b3a76400008661254f565b8751610b70908690610b6a908a61254f565b9061245e565b94505b505050505b9650965096509692505050565b6001546001600160a01b03163314611bbd5760405162461bcd60e51b81526004016106f190612e32565b611bce81662386f26fc1000061254f565b6001600160a01b0390921660009081526007602052604090209190915550565b6001546001600160a01b03163314611c185760405162461bcd60e51b81526004016106f190612e32565b611c2981662386f26fc1000061254f565b6001600160a01b0390921660009081526008602052604090209190915550565b6001546001600160a01b03163314611c735760405162461bcd60e51b81526004016106f190612e32565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b031660009081526007602052604090205490565b600e5460ff16611cd25760405162461bcd60e51b81526004016106f19061306e565b60026000541415611cf55760405162461bcd60e51b81526004016106f190613000565b600260009081556001600160a01b038084168252600460209081526040808420928716845291905290205460ff16611d3f5760405162461bcd60e51b81526004016106f190612f3c565b6001600160a01b0380831660009081526005602090815260408083209387168352928152828220338352905220600181015481548315801590611d825750808411155b611d9e5760405162461bcd60e51b81526004016106f190612c1f565b600483015460ff16611dc25760405162461bcd60e51b81526004016106f190612e61565b6001600160a01b0380861660009081526003602052604081205490918291611ded918a9116346123c6565b6002870154919350915060008515801590611e0757508143115b8015611e1257508115155b15611eec57611e2d86838960030154610405898b8a8a61165e565b600a54909150611e4c906001600160a01b038b81169133911684612368565b600a546001600160a01b038a811660009081526003602052604090819020549051632a90b48f60e01b815292821692632a90b48f92611e92928e92911690600401612b53565b600060405180830381600087803b158015611eac57600080fd5b505af1158015611ec0573d6000803e3d6000fd5b5050505060008051602061313f8339815191528982604051611ee3929190612bb4565b60405180910390a15b611ef6858961245e565b808855436002890155611f0b9087868661165e565b600388018190556001600160a01b038b166000908152600760205260409020541015611f495760405162461bcd60e51b81526004016106f190612d83565b6001600160a01b038a1615611f7157611f6c6001600160a01b038b16338a6125b8565b611f7b565b611f7b33896125dc565b505060016000555050505050505050565b6001600160a01b039081166000908152600260205260409020541690565b6001546001600160a01b03163314611fd45760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b03928316600090815260046020908152604080832094909516825292909252919020805460ff1916911515919091179055565b600b60009054906101000a90046001600160a01b03166001600160a01b031663289b3c0d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561205c57600080fd5b505afa158015612070573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061209491906127db565b600180546001600160a01b0319166001600160a01b039283161790819055166120cf5760405162461bcd60e51b81526004016106f190612ce9565b565b600a546001600160a01b031690565b600d5490565b60006012806001600160a01b0386161561217157856001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213357600080fd5b505afa158015612147573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216b9190612aea565b60ff1691505b6001600160a01b038416156121f757836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156121b957600080fd5b505afa1580156121cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121f19190612aea565b60ff1690505b61221482600a0a610b7083600a0a8861254f90919063ffffffff16565b9695505050505050565b6001546001600160a01b031633146122485760405162461bcd60e51b81526004016106f190612e32565b6001600160a01b0382811660009081526002602052604090205416156122805760405162461bcd60e51b81526004016106f190612fbd565b600a546001600160a01b03166122a85760405162461bcd60e51b81526004016106f190612ce9565b6001600160a01b03808316600081815260026020908152604080832080548688166001600160a01b031991821681179092559084526003909252918290208054909116909217909155600a5490516377e8a1bd60e11b815291169063efd1437a90612317908590600401612b3f565b600060405180830381600087803b15801561233157600080fd5b505af1158015612345573d6000803e3d6000fd5b505050505050565b6002602052600090815260409020546001600160a01b031681565b6123c0846323b872dd60e01b85858560405160240161238993929190612b90565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612669565b50505050565b600954604051630da33aa960e01b815260009182916001600160a01b0390911690630da33aa990859061240190899089903390600401612b6d565b60408051808303818588803b15801561241957600080fd5b505af115801561242d573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906124529190612a7a565b90969095509350505050565b808203828111156111985760405162461bcd60e51b81526004016106f190612bf0565b808201828110156111985760405162461bcd60e51b81526004016106f190612cbb565b6020840151845160006124b98284888861165e565b9050600080841180156124cf5750876040015143115b80156124de5750604088015115155b156124fa576124f78489604001518a606001518561159f565b90505b6001600160a01b038516600090815260086020526040902054612528846125218785612481565b8a8a61165e565b116125455760405162461bcd60e51b81526004016106f190612dba565b5050505050505050565b600081158061256a5750508082028282828161256757fe5b04145b6111985760405162461bcd60e51b81526004016106f190612c56565b60008082116125a75760405162461bcd60e51b81526004016106f190612ecf565b8183816125b057fe5b049392505050565b6125d78363a9059cbb60e01b8484604051602401612389929190612bb4565b505050565b604080516000808252602082019092526001600160a01b0384169083906040516126069190612b06565b60006040518083038185875af1925050503d8060008114612643576040519150601f19603f3d011682016040523d82523d6000602084013e612648565b606091505b50509050806125d75760405162461bcd60e51b81526004016106f190612ef9565b61267b826001600160a01b031661274e565b6126975760405162461bcd60e51b81526004016106f190613037565b60006060836001600160a01b0316836040516126b39190612b06565b6000604051808303816000865af19150503d80600081146126f0576040519150601f19603f3d011682016040523d82523d6000602084013e6126f5565b606091505b5091509150816127175760405162461bcd60e51b81526004016106f190612d17565b8051156123c057808060200190518101906127329190612a46565b6123c05760405162461bcd60e51b81526004016106f190612f73565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590611656575050151592915050565b6040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000602082840312156127c9578081fd5b81356127d481613109565b9392505050565b6000602082840312156127ec578081fd5b81516127d481613109565b60008060408385031215612809578081fd5b823561281481613109565b9150602083013561282481613109565b809150509250929050565b600080600060608486031215612843578081fd5b833561284e81613109565b9250602084013561285e81613109565b9150604084013561286e81613109565b809150509250925092565b6000806000806080858703121561288e578081fd5b843561289981613109565b935060208501356128a981613109565b925060408501356128b981613109565b9396929550929360600135925050565b6000806000606084860312156128dd578283fd5b83356128e881613109565b925060208401356128f881613109565b9150604084013561286e81613121565b60008060006060848603121561291c578283fd5b833561292781613109565b9250602084013561293781613109565b929592945050506040919091013590565b6000806000806080858703121561295d578384fd5b843561296881613109565b9350602085013561297881613109565b93969395505050506040820135916060013590565b60008060008060008060c087890312156129a5578182fd5b86356129b081613109565b955060208701356129c081613109565b95989597505050506040840135936060810135936080820135935060a0909101359150565b600080604083850312156129f7578182fd5b8235612a0281613109565b946020939093013593505050565b600080600060608486031215612a24578283fd5b8335612a2f81613109565b925060208401359150604084013561286e81613109565b600060208284031215612a57578081fd5b81516127d481613121565b600060208284031215612a73578081fd5b5035919050565b60008060408385031215612a8c578182fd5b505080516020909101519092909150565b60008060008060808587031215612ab2578182fd5b5050823594602084013594506040840135936060013592509050565b600060208284031215612adf578081fd5b81356127d48161312f565b600060208284031215612afb578081fd5b81516127d48161312f565b60008251815b81811015612b265760208186018101518583015201612b0c565b81811115612b345782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b60208082526015908201527464732d6d6174682d7375622d756e646572666c6f7760581b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a21616d6f756e740000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604082015260600190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a216163746976650000000000000000604082015260600190565b60208082526014908201527364732d6d6174682d6164642d6f766572666c6f7760601b604082015260600190565b60208082526014908201527304c6f673a4d6f727467616765506f6f6c3a3078360641b604082015260600190565b6020808252818101527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604082015260600190565b6020808252601b908201527f4c6f673a4d6f727467616765506f6f6c3a216d73672e76616c75650000000000604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216d61785261746500000000000000604082015260600190565b60208082526021908201527f4c6f673a4d6f727467616765506f6f6c3a216c69717569646174696f6e4c696e6040820152606560f81b606082015260800190565b60208082526018908201527f4c6f673a4d6f727467616765506f6f6c3a72617465213d300000000000000000604082015260600190565b6020808252601590820152742637b39d26b7b93a33b0b3b2a837b7b61d10b3b7bb60591b604082015260600190565b60208082526019908201527f4c6f673a4d6f727467616765506f6f6c3a216372656174656400000000000000604082015260600190565b6020808252601a908201527f4c6f673a4d6f727467616765506f6f6c3a616d6f756e74213d30000000000000604082015260600190565b60208082526010908201526f64732d6d6174682d6469762d7a65726f60801b604082015260600190565b60208082526023908201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960408201526213115160ea1b606082015260800190565b6020808252601f908201527f4c6f673a4d6f727467616765506f6f6c3a216d6f727467616765416c6c6f7700604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f4c6f673a4d6f727467616765506f6f6c3a756e6465726c79696e67546f50546f60408201526235b2b760e91b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601f908201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604082015260600190565b60208082526013908201527204c6f673a4d6f727467616765506f6f6c3a213606c1b604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b93845260208401929092526040830152606082015260800190565b9485526020850193909352604084019190915260608301521515608082015260a00190565b60ff91909116815260200190565b6001600160a01b038116811461311e57600080fd5b50565b801515811461311e57600080fd5b60ff8116811461311e57600080fdfe4377f33be9a604d55b08975df4d8840dc93be5d56bfa558d0f6ba5638e26a21fa264697066735822122018e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c148364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b
-----Decoded View---------------
Arg [0] : factoryAddress (address): 0xbe612b724B77038bC40A4E4A88335A93A9aA445B
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000be612b724b77038bc40a4e4a88335a93a9aa445b
Deployed Bytecode Sourcemap
15660:30928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23692:670;;;;;;;;;;-1:-1:-1;23692:670:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;33344:2127;;;;;;:::i;:::-;;:::i;:::-;;42197:2171;;;;;;:::i;:::-;;:::i;27004:242::-;;;;;;;;;;-1:-1:-1;27004:242:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30504:2648::-;;;;;;:::i;:::-;;:::i;24444:92::-;;;;;;;;;;;;;:::i;25508:138::-;;;;;;;;;;-1:-1:-1;25508:138:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26608:197::-;;;;;;;;;;-1:-1:-1;26608:197:0;;;;;:::i;:::-;;:::i;25760:101::-;;;;;;;;;;;;;:::i;29249:111::-;;;;;;;;;;-1:-1:-1;29249:111:0;;;;;:::i;:::-;;:::i;28192:74::-;;;;;;;;;;-1:-1:-1;28192:74:0;;;;;:::i;:::-;;:::i;24833:73::-;;;;;;;;;;;;;:::i;15793:25::-;;;;;;;;;;;;;:::i;15973:51::-;;;;;;;;;;-1:-1:-1;15973:51:0;;;;;:::i;:::-;;:::i;27380:79::-;;;;;;;;;;-1:-1:-1;27380:79:0;;;;;:::i;:::-;;:::i;37959:1989::-;;;;;;:::i;:::-;;:::i;18727:556::-;;;;;;;;;;-1:-1:-1;18727:556:0;;;;;:::i;:::-;;:::i;19592:419::-;;;;;;;;;;-1:-1:-1;19592:419:0;;;;;:::i;:::-;;:::i;28388:84::-;;;;;;;;;;-1:-1:-1;28388:84:0;;;;;:::i;:::-;;:::i;17010:17::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26303:130::-;;;;;;;;;;-1:-1:-1;26303:130:0;;;;;:::i;:::-;;:::i;40130:1841::-;;;;;;:::i;:::-;;:::i;20658:1735::-;;;;;;;;;;-1:-1:-1;20658:1735:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;28973:164::-;;;;;;;;;;-1:-1:-1;28973:164:0;;;;;:::i;:::-;;:::i;28620:191::-;;;;;;;;;;-1:-1:-1;28620:191:0;;;;;:::i;:::-;;:::i;27960:115::-;;;;;;;;;;-1:-1:-1;27960:115:0;;;;;:::i;:::-;;:::i;25254:119::-;;;;;;;;;;-1:-1:-1;25254:119:0;;;;;:::i;:::-;;:::i;35657:2118::-;;;;;;:::i;:::-;;:::i;26021:130::-;;;;;;;;;;-1:-1:-1;26021:130:0;;;;;:::i;:::-;;:::i;27649:217::-;;;;;;;;;;-1:-1:-1;27649:217:0;;;;;:::i;:::-;;:::i;30106:163::-;;;;;;;;;;;;;:::i;24626:107::-;;;;;;;;;;;;;:::i;25026:83::-;;;;;;;;;;;;;:::i;22619:556::-;;;;;;;;;;-1:-1:-1;22619:556:0;;;;;:::i;:::-;;:::i;29581:441::-;;;;;;;;;;-1:-1:-1;29581:441:0;;;;;:::i;:::-;;:::i;15870:51::-;;;;;;;;;;-1:-1:-1;15870:51:0;;;;;:::i;:::-;;:::i;23692:670::-;23831:22;23909;23987:19;24067:12;24140;24162:29;;:::i;:::-;-1:-1:-1;;;;;;;;;24194:14:0;;;;;;;:6;:14;;;;;;;;:29;;;;;;;;;;;:45;;;;;;;;;-1:-1:-1;;24194:45:0;;;24162:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23692:670::o;33344:2127::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;;;;;;;;;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;33525:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;33517:80;;;;-1:-1:-1::0;;;33517:80:0::2;;;;;;;:::i;:::-;33625:1;33616:6;:10;33608:47;;;;-1:-1:-1::0;;;33608:47:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33696:14:0;;::::2;33663:30;33696:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;33734:10:::2;33696:50:::0;;;;;33782:22:::2;::::0;::::2;::::0;33840;;33881:15:::2;::::0;::::2;::::0;::::2;;33873:53;;;;-1:-1:-1::0;;;33873:53:0::2;;;;;;;:::i;:::-;33997:18;::::0;-1:-1:-1;;;;;34060:29:0;::::2;::::0;34056:484:::2;;34106:81;-1:-1:-1::0;;;;;34106:37:0;::::2;34152:10;34173:4;34180:6:::0;34106:37:::2;:81::i;:::-;-1:-1:-1::0;;;;;34263:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;34230:71:::2;::::0;34248:13;;34263:26:::2;34291:9;34230:17;:71::i;:::-;34202:99:::0;;-1:-1:-1;34202:99:0;-1:-1:-1;34056:484:0::2;;;34355:6;34342:9;:19;;34334:59;;;;-1:-1:-1::0;;;34334:59:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;34469:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;34436:92:::2;::::0;34454:13;;34469:26:::2;34497:30;34505:9;34520:6:::0;34497:22:::2;:30::i;:::-;34436:17;:92::i;:::-;34408:120:::0;;-1:-1:-1;34408:120:0;-1:-1:-1;34056:484:0::2;34614:19;::::0;::::2;::::0;34592::::2;34671:18:::0;;;;;:48:::2;;;34708:11;34693:12;:26;34671:48;:68;;;;-1:-1:-1::0;34723:16:0;;::::2;34671:68;34667:552;;;34762:123;34769:14;34785:11;34798:7;:12;;;34812:72;34828:14;34844;34860:10;34872:11;34812:15;:72::i;34762:123::-;35031:13;::::0;34756:129;;-1:-1:-1;34971:80:0::2;::::0;-1:-1:-1;;;;;34971:30:0;;::::2;::::0;35010:10:::2;::::0;35031:13:::2;34756:129:::0;34971:30:::2;:80::i;:::-;35110:13;::::0;-1:-1:-1;;;;;35142:26:0;;::::2;35110:13;35142:26:::0;;;:18:::2;:26;::::0;;;;;;;35110:59;;-1:-1:-1;;;35110:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;35134:6;;35142:26;::::2;::::0;35110:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;35198:6:0::2;35206:3;35189:21;;;;;;;:::i;:::-;;;;;;;;34667:552;35289:26;:14:::0;35308:6;35289:18:::2;:26::i;:::-;35264:51:::0;;;35345:12:::2;35323:19;::::0;::::2;:34:::0;35383:80:::2;::::0;35423:14;35439:10;35451:11;35383:15:::2;:80::i;:::-;35368:12;::::0;;::::2;:95:::0;;;;-1:-1:-1;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;33344:2127:0:o;42197:2171::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;42423:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;42415:80;;;;-1:-1:-1::0;;;42415:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42536:14:0;;::::2;42503:30;42536:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;:38;;::::2;::::0;;;;;;42593:15:::2;::::0;::::2;::::0;::::2;;42585:53;;;;-1:-1:-1::0;;;42585:53:0::2;;;;;;;:::i;:::-;42674:22;::::0;::::2;::::0;42732;;42773:10;;;;;:38:::2;;;42797:14;42787:6;:24;;42773:38;42765:75;;;;-1:-1:-1::0;;;42765:75:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;42893:26:0;;::::2;42876:14;42893:26:::0;;;:18:::2;:26;::::0;;;;;;;::::2;::::0;42876:14;42971:51:::2;42989:13:::0;42893:26;43012:9:::2;42971:17;:51::i;:::-;43084:58;::::0;;::::2;::::0;::::2;::::0;;;;;;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;::::2;::::0;;;;;::::2;::::0;::::2;::::0;::::2;;;;::::0;;;;42927:95;;-1:-1:-1;42927:95:0;-1:-1:-1;43084:58:0::2;::::0;42927:95;;43128:13;43084:9:::2;:58::i;:::-;43198:20;43221:56;43257:19;:10:::0;43272:3:::2;43257:14;:19::i;:::-;43221:31;43249:2;43221:23;:6:::0;43232:11;43221:10:::2;:23::i;:::-;:27:::0;::::2;:31::i;:::-;:35:::0;::::2;:56::i;:::-;43373:13;::::0;43198:79;;-1:-1:-1;43313:89:0::2;::::0;-1:-1:-1;;;;;43313:30:0;;::::2;::::0;43352:10:::2;::::0;43373:13:::2;43198:79:::0;43313:30:::2;:89::i;:::-;43452:13;::::0;:39:::2;::::0;-1:-1:-1;;;43452:39:0;;-1:-1:-1;;;;;43452:13:0;;::::2;::::0;:23:::2;::::0;:39:::2;::::0;43476:6;;43484;;43452:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43551:14;43568:46;43599:14;43568:26;43587:6;43568:14;:18;;:26;;;;:::i;:46::-;43651:13;::::0;:51:::2;::::0;-1:-1:-1;;;43651:51:0;;43551:63;;-1:-1:-1;;;;;;43651:13:0::2;::::0;:27:::2;::::0;:51:::2;::::0;43679:6;;43551:63;;43695:6;;43651:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;43770:26;43789:6;43770:14;:18;;:26;;;;:::i;:::-;43745:51:::0;;43832:26:::2;:14:::0;43851:6;43832:18:::2;:26::i;:::-;43807:22;::::0;::::2;:51:::0;43960:22;;43956:155:::2;;44029:1;44004:22;::::0;::::2;:26:::0;;;44045:19:::2;::::0;::::2;:23:::0;;;44083:12:::2;::::0;::::2;:16:::0;43956:155:::2;-1:-1:-1::0;;;;;44161:29:0;::::2;::::0;44157:204:::2;;44201:62;-1:-1:-1::0;;;;;44201:33:0;::::2;44243:10;44256:6:::0;44201:33:::2;:62::i;:::-;44157:204;;;44293:59;44332:10;44345:6;44293:30;:59::i;:::-;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;42197:2171:0:o;27004:242::-;-1:-1:-1;;;;;27197:19:0;;;27170:7;27197:19;;;:11;:19;;;;;;;;:34;;;;;;;;;;;:41;;27232:5;;27197:41;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27197:41:0;;27004:242;-1:-1:-1;;;;27004:242:0:o;30504:2648::-;18146:4;;;;;:9;18138:46;;;;-1:-1:-1;;;18138:46:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;30704:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;30696:80;;;;-1:-1:-1::0;;;30696:80:0::2;;;;;;;:::i;:::-;30802:1;30795:4;:8;:42;;;;-1:-1:-1::0;;;;;;30815:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;30807:30;::::2;;30795:42;30787:79;;;;-1:-1:-1::0;;;30787:79:0::2;;;;;;;:::i;:::-;30894:1;30885:6;:10;30877:49;;;;-1:-1:-1::0;;;30877:49:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30967:14:0;;::::2;30934:30;30967:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;;31005:10:::2;30967:50:::0;;;;;;;31053:22:::2;::::0;::::2;::::0;31111;;30967:50;;31053:22;;30934:30;;;31267:29;31263:484:::2;;31313:81;-1:-1:-1::0;;;;;31313:37:0;::::2;31359:10;31380:4;31387:6:::0;31313:37:::2;:81::i;:::-;-1:-1:-1::0;;;;;31470:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;31437:71:::2;::::0;31455:13;;31470:26:::2;31498:9;31437:17;:71::i;:::-;31409:99:::0;;-1:-1:-1;31409:99:0;-1:-1:-1;31263:484:0::2;;;31562:6;31549:9;:19;;31541:59;;;;-1:-1:-1::0;;;31541:59:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;31676:26:0;;::::2;;::::0;;;:18:::2;:26;::::0;;;;;31643:92:::2;::::0;31661:13;;31676:26:::2;31704:30;31712:9;31727:6:::0;31704:22:::2;:30::i;31643:92::-;31615:120:::0;;-1:-1:-1;31615:120:0;-1:-1:-1;31263:484:0::2;31821:19;::::0;::::2;::::0;31799::::2;31878:18:::0;;;;;:48:::2;;;31915:11;31900:12;:26;31878:48;:68;;;;-1:-1:-1::0;31930:16:0;;::::2;31878:68;31874:552;;;31969:123;31976:14;31992:11;32005:7;:12;;;32019:72;32035:14;32051;32067:10;32079:11;32019:15;:72::i;31969:123::-;32238:13;::::0;31963:129;;-1:-1:-1;32178:80:0::2;::::0;-1:-1:-1;;;;;32178:30:0;;::::2;::::0;32217:10:::2;::::0;32238:13:::2;31963:129:::0;32178:30:::2;:80::i;:::-;32317:13;::::0;-1:-1:-1;;;;;32349:26:0;;::::2;32317:13;32349:26:::0;;;:18:::2;:26;::::0;;;;;;;32317:59;;-1:-1:-1;;;32317:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;32341:6;;32349:26;::::2;::::0;32317:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;32405:6:0::2;32413:3;32396:21;;;;;;;:::i;:::-;;;;;;;;31874:552;32477:20;32500:58;32538:19;:10:::0;32553:3:::2;32538:14;:19::i;:::-;32500:33;32528:4:::0;32500:23:::2;:6:::0;32511:11;32500:10:::2;:23::i;:58::-;32569;::::0;-1:-1:-1;;;32569:58:0;;32477:81;;-1:-1:-1;;;;;;32569:23:0;::::2;::::0;::::2;::::0;:58:::2;::::0;32477:81;;32615:10:::2;::::0;32569:58:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32701:26;32720:6;32701:14;:18;;:26;;;;:::i;:::-;32676:51:::0;;32763:32:::2;:14:::0;32782:12;32763:18:::2;:32::i;:::-;32738:22;::::0;::::2;:57:::0;;;32828:12:::2;32806:19;::::0;::::2;:34:::0;32882:22;;32866:88:::2;::::0;32930:10;32942:11;32866:15:::2;:88::i;:::-;32851:12;::::0;::::2;:103:::0;32995:15:::2;::::0;::::2;::::0;::::2;;32991:154;;-1:-1:-1::0;;;;;;;;33036:19:0;;::::2;;::::0;;;:11:::2;:19;::::0;;;;;;;:34;;;::::2;::::0;;;;;;;;:60;;::::2;::::0;;::::2;::::0;;;;;;;;;;::::2;::::0;;-1:-1:-1;;;;;;33036:60:0::2;33084:10;33036:60;::::0;;-1:-1:-1;;;33111:15:0::2;::::0;;::::2;:22:::0;;-1:-1:-1;;33111:22:0::2;::::0;::::2;::::0;;-1:-1:-1;;;2679:22:0;30504:2648::o;24444:92::-;24518:10;;-1:-1:-1;;;;;24518:10:0;24444:92;:::o;25508:138::-;-1:-1:-1;;;;;25608:30:0;25581:7;25608:30;;;:15;:30;;;;;;;25508:138::o;26608:197::-;-1:-1:-1;;;;;26756:19:0;;;26729:7;26756:19;;;:11;:19;;;;;;;;:34;;;;;;;;;:41;26608:197;;;;;:::o;25760:101::-;25847:5;;-1:-1:-1;;;;;25847:5:0;25760:101;:::o;29249:111::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;29323:5:::1;:29:::0;;-1:-1:-1;;;;;;29323:29:0::1;-1:-1:-1::0;;;;;29323:29:0;;;::::1;::::0;;;::::1;::::0;;29249:111::o;28192:74::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28250:2:::1;:8:::0;28192:74::o;24833:73::-;24896:2;;24833:73;:::o;15793:25::-;;;-1:-1:-1;;;;;15793:25:0;;:::o;15973:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15973:51:0;;:::o;27380:79::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;27441:4:::1;:10:::0;;-1:-1:-1;;27441:10:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;27380:79::o;37959:1989::-;18146:4;;;;;:9;18138:46;;;;-1:-1:-1;;;18138:46:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;38159:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;38151:80;;;;-1:-1:-1::0;;;38151:80:0::2;;;;;;;:::i;:::-;38259:1;38250:6;:10;38242:47;;;;-1:-1:-1::0;;;38242:47:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38333:14:0;;::::2;38300:30;38333:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;38371:10:::2;38333:50:::0;;;;;38419:22:::2;::::0;::::2;::::0;38477;;38518:15:::2;::::0;::::2;::::0;::::2;;38510:53;;;;-1:-1:-1::0;;;38510:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;38679:26:0;;::::2;38603:18;38679:26:::0;;;:18:::2;:26;::::0;;;;;38603:18;;;;38646:71:::2;::::0;38664:13;;38679:26:::2;38707:9;38646:17;:71::i;:::-;38792:19;::::0;::::2;::::0;38602:115;;-1:-1:-1;38602:115:0;-1:-1:-1;38770:19:0::2;38852:18:::0;;;;;:48:::2;;;38889:11;38874:12;:26;38852:48;:68;;;;-1:-1:-1::0;38904:16:0;;::::2;38852:68;38848:555;;;38943:123;38950:14;38966:11;38979:7;:12;;;38993:72;39009:14;39025;39041:10;39053:11;38993:15;:72::i;38943:123::-;39212:13;::::0;38937:129;;-1:-1:-1;39152:80:0::2;::::0;-1:-1:-1;;;;;39152:30:0;;::::2;::::0;39191:10:::2;::::0;39212:13:::2;38937:129:::0;39152:30:::2;:80::i;:::-;39291:13;::::0;-1:-1:-1;;;;;39323:26:0;;::::2;39291:13;39323:26:::0;;;:18:::2;:26;::::0;;;;;;;39291:59;;-1:-1:-1;;;39291:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;39315:6;;39323:26;::::2;::::0;39291:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;39379:6:0::2;39387:3;39370:21;;;;;;;:::i;:::-;;;;;;;;38848:555;39476:26;:14:::0;39495:6;39476:18:::2;:26::i;:::-;39451:22;::::0;::::2;:51:::0;;;39535:12:::2;39513:19;::::0;::::2;:34:::0;39573:80:::2;::::0;39589:14;;39629:10;39641:11;39573:15:::2;:80::i;:::-;39558:12;::::0;::::2;:95:::0;;;-1:-1:-1;;;;;39784:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;-1:-1:-1;39768:38:0::2;39760:76;;;;-1:-1:-1::0;;;39760:76:0::2;;;;;;;:::i;:::-;39888:52;::::0;-1:-1:-1;;;39888:52:0;;-1:-1:-1;;;;;39888:23:0;::::2;::::0;::::2;::::0;:52:::2;::::0;39912:6;;39928:10:::2;::::0;39888:52:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;;;37959:1989:0:o;18727:556::-;18897:7;;18934:57;18961:29;:12;18978:11;18961:16;:29::i;:::-;18953:2;;18934:22;;:14;;:18;:22::i;:57::-;18917:74;-1:-1:-1;19002:16:0;19021:17;:4;19030:7;19021:8;:17::i;:::-;19002:36;-1:-1:-1;19049:14:0;19066:87;19128:24;19136:1;19002:36;19128:14;:24::i;:::-;19066:57;19093:29;:12;19110:11;19093:16;:29::i;:::-;19085:2;;19066:22;;:14;;:18;:22::i;:87::-;19049:104;;19161:14;19178:20;19190:7;19178;;:11;;:20;;;;:::i;:::-;19161:37;-1:-1:-1;19213:62:0;19236:38;19247:26;19271:1;19247:19;19161:37;19258:7;19247:10;:19::i;:26::-;19236:6;;:10;:38::i;:::-;19213:18;:6;19224;19213:10;:18::i;:::-;:22;;:62::i;:::-;19206:69;;;;;;18727:556;;;;;;;:::o;19592:419::-;19809:7;19833:19;;;:39;;-1:-1:-1;19856:16:0;;19833:39;19829:80;;;-1:-1:-1;19896:1:0;19889:8;;19829:80;19923;19971:31;:11;19987:14;19971:15;:31::i;:::-;19923:43;19958:7;19923:30;:14;19942:10;19923:18;:30::i;:80::-;19916:87;19592:419;-1:-1:-1;;;;;19592:419:0:o;28388:84::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28451:7:::1;:13:::0;28388:84::o;17010:17::-;;;;;;:::o;26303:130::-;-1:-1:-1;;;;;26399:26:0;;;26372:7;26399:26;;;:18;:26;;;;;;;;26303:130::o;40130:1841::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;40324:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;40316:80;;;;-1:-1:-1::0;;;40316:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40440:14:0;;::::2;40407:30;40440:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;40478:10:::2;40440:50:::0;;;;;;;40526:22:::2;::::0;::::2;::::0;40584;;40634:26;;;:18:::2;:26:::0;;;;;;40440:50;;40526:22;;40584;40634:26:::2;40679:10:::0;;;;;:38:::2;;;40703:14;40693:6;:24;;40679:38;40671:75;;;;-1:-1:-1::0;;;40671:75:0::2;;;;;;;:::i;:::-;40765:15;::::0;::::2;::::0;::::2;;40757:53;;;;-1:-1:-1::0;;;40757:53:0::2;;;;;;;:::i;:::-;40850:18;40870:19:::0;40893:51:::2;40911:13;40926:6;40934:9;40893:17;:51::i;:::-;41019:19;::::0;::::2;::::0;40849:95;;-1:-1:-1;40849:95:0;-1:-1:-1;40997:19:0::2;41079:18:::0;;;;;:48:::2;;;41116:11;41101:12;:26;41079:48;:68;;;;-1:-1:-1::0;41131:16:0;;::::2;41079:68;41075:547;;;41170:123;41177:14;41193:11;41206:7;:12;;;41220:72;41236:14;41252;41268:10;41280:11;41220:15;:72::i;41170:123::-;41439:13;::::0;41164:129;;-1:-1:-1;41379:92:0::2;::::0;41418:10:::2;::::0;-1:-1:-1;;;;;41439:13:0::2;41455:15;:6:::0;41164:129;41455:10:::2;:15::i;:::-;-1:-1:-1::0;;;;;41379:30:0;::::2;::::0;:92;;:30:::2;:92::i;:::-;41530:13;::::0;:39:::2;::::0;-1:-1:-1;;;41530:39:0;;-1:-1:-1;;;;;41530:13:0;;::::2;::::0;:23:::2;::::0;:39:::2;::::0;41554:6;;41562;;41530:39:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;41598:6:0::2;41606:3;41589:21;;;;;;;:::i;:::-;;;;;;;;41075:547;41695:26;:14:::0;41714:6;41695:18:::2;:26::i;:::-;41670:22;::::0;::::2;:51:::0;;;41754:12:::2;41732:19;::::0;::::2;:34:::0;41792:80:::2;::::0;41808:14;;41848:10;41860:11;41792:15:::2;:80::i;:::-;41777:12;::::0;::::2;:95:::0;41912:13:::2;::::0;:51:::2;::::0;-1:-1:-1;;;41912:51:0;;-1:-1:-1;;;;;41912:13:0;;::::2;::::0;:27:::2;::::0;:51:::2;::::0;41940:6;;41948;;41956;;41912:51:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;;;;;;40130:1841:0:o;20658:1735::-;20971:11;21050:20;21138:15;21221;21249:29;;:::i;:::-;-1:-1:-1;;;;;;21281:14:0;;;;;;;:6;:14;;;;;;;;:29;;;;;;;;;;:45;;;;;;;;;;;;21249:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21341:27;:58;;;;-1:-1:-1;21372:22:0;;;;:27;21341:58;21337:107;;;21424:1;21426;21428;21430;21416:16;;;;;;;;;;;21337:107;-1:-1:-1;;;;;21497:26:0;;;21454:19;21497:26;;;:18;:26;;;;;;21454:19;;21476:69;;21497:26;21525:11;21516:6;21476:20;:69::i;:::-;21617:22;;;;21641:19;;;;21662:12;;;;21692:22;;21454:91;;-1:-1:-1;21583:10:0;;21610:161;;21617:22;21641:19;21662:12;21676:94;;21617:22;21583:10;21454:91;21676:15;:94::i;21610:161::-;21813:22;;21837;;;;21604:167;;-1:-1:-1;21797:103:0;;21837:31;;21604:167;21837:26;:31::i;:::-;21870:16;21888:11;21797:15;:103::i;:::-;21782:118;-1:-1:-1;21911:20:0;21934:26;:10;21949;21934:14;:26::i;:::-;21911:49;;21991:12;21975;:28;21971:415;;22030:1;22020:11;;22056:1;22046:11;;21971:415;;;22100:120;22127:92;22189:29;:12;22206:11;22189:16;:29::i;:::-;22127:57;22176:7;22127:44;22154:16;22127:7;:22;;;:26;;:44;;;;:::i;:92::-;22100:22;;;:26;:120::i;:::-;22351:22;;;;22090:130;;-1:-1:-1;22245:129:0;;:101;22307:38;22315:7;22328:16;22307:20;:38::i;:::-;22245:22;;:57;;22289:12;;22245:39;;22272:11;22245:26;:39::i;:101::-;:105;;:129::i;:::-;22235:139;;21971:415;20658:1735;;;;;;;;;;;;;;;;:::o;28973:164::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;29110:19:::1;:3:::0;29118:10:::1;29110:7;:19::i;:::-;-1:-1:-1::0;;;;;29085:22:0;;::::1;;::::0;;;:7:::1;:22;::::0;;;;:44;;;;-1:-1:-1;28973:164:0:o;28620:191::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28784:19:::1;:3:::0;28792:10:::1;28784:7;:19::i;:::-;-1:-1:-1::0;;;;;28751:30:0;;::::1;;::::0;;;:15:::1;:30;::::0;;;;:52;;;;-1:-1:-1;28620:191:0:o;27960:115::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;28032:13:::1;:35:::0;;-1:-1:-1;;;;;;28032:35:0::1;-1:-1:-1::0;;;;;28032:35:0;;;::::1;::::0;;;::::1;::::0;;27960:115::o;25254:119::-;-1:-1:-1;;;;;25343:22:0;25319:7;25343:22;;;:7;:22;;;;;;;25254:119::o;35657:2118::-;18250:4;;;;18242:41;;;;-1:-1:-1;;;18242:41:0;;;;;;;:::i;:::-;1763:1:::1;2367:7;;:19;;2359:63;;;;-1:-1:-1::0;;;2359:63:0::1;;;;;;;:::i;:::-;1763:1;2500:7;:18:::0;;;-1:-1:-1;;;;;35832:21:0;;::::2;::::0;;:13:::2;:21;::::0;;;;;;;:36;;::::2;::::0;;;;;;;;::::2;;35824:80;;;;-1:-1:-1::0;;;35824:80:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35945:14:0;;::::2;35912:30;35945:14:::0;;;:6:::2;:14;::::0;;;;;;;:29;;::::2;::::0;;;;;;;;35983:10:::2;35945:50:::0;;;;;36031:22:::2;::::0;::::2;::::0;36089;;36130:10;;;;;:38:::2;;;36154:14;36144:6;:24;;36130:38;36122:75;;;;-1:-1:-1::0;;;36122:75:0::2;;;;;;;:::i;:::-;36216:15;::::0;::::2;::::0;::::2;;36208:53;;;;-1:-1:-1::0;;;36208:53:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36374:26:0;;::::2;36298:18;36374:26:::0;;;:18:::2;:26;::::0;;;;;36298:18;;;;36341:71:::2;::::0;36359:13;;36374:26:::2;36402:9;36341:17;:71::i;:::-;36487:19;::::0;::::2;::::0;36297:115;;-1:-1:-1;36297:115:0;-1:-1:-1;36465:19:0::2;36544:18:::0;;;;;:48:::2;;;36581:11;36566:12;:26;36544:48;:68;;;;-1:-1:-1::0;36596:16:0;;::::2;36544:68;36540:552;;;36635:123;36642:14;36658:11;36671:7;:12;;;36685:72;36701:14;36717;36733:10;36745:11;36685:15;:72::i;36635:123::-;36904:13;::::0;36629:129;;-1:-1:-1;36844:80:0::2;::::0;-1:-1:-1;;;;;36844:30:0;;::::2;::::0;36883:10:::2;::::0;36904:13:::2;36629:129:::0;36844:30:::2;:80::i;:::-;36983:13;::::0;-1:-1:-1;;;;;37015:26:0;;::::2;36983:13;37015:26:::0;;;:18:::2;:26;::::0;;;;;;;36983:59;;-1:-1:-1;;;36983:59:0;;:13;;::::2;::::0;:23:::2;::::0;:59:::2;::::0;37007:6;;37015:26;::::2;::::0;36983:59:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;37071:6:0::2;37079:3;37062:21;;;;;;;:::i;:::-;;;;;;;;36540:552;37162:26;:14:::0;37181:6;37162:18:::2;:26::i;:::-;37137:51:::0;;;37218:12:::2;37196:19;::::0;::::2;:34:::0;37256:80:::2;::::0;37296:14;37312:10;37324:11;37256:15:::2;:80::i;:::-;37241:12;::::0;::::2;:95:::0;;;-1:-1:-1;;;;;37464:22:0;::::2;;::::0;;;:7:::2;:22;::::0;;;;;-1:-1:-1;37448:38:0::2;37440:76;;;;-1:-1:-1::0;;;37440:76:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;37568:29:0;::::2;::::0;37564:204:::2;;37608:62;-1:-1:-1::0;;;;;37608:33:0;::::2;37650:10;37663:6:::0;37608:33:::2;:62::i;:::-;37564:204;;;37700:59;37739:10;37752:6;37700:30;:59::i;:::-;-1:-1:-1::0;;1719:1:0::1;2679:7;:22:::0;-1:-1:-1;;;;;;;;35657:2118:0:o;26021:130::-;-1:-1:-1;;;;;26117:26:0;;;26090:7;26117:26;;;:18;:26;;;;;;;;26021:130::o;27649:217::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27814:21:0;;::::1;;::::0;;;:13:::1;:21;::::0;;;;;;;:36;;;::::1;::::0;;;;;;;;;:44;;-1:-1:-1;;27814:44:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27649:217::o;30106:163::-;30162:13;;;;;;;;;-1:-1:-1;;;;;30162:13:0;-1:-1:-1;;;;;30162:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30149:10;:42;;-1:-1:-1;;;;;;30149:42:0;-1:-1:-1;;;;;30149:42:0;;;;;;;;30210:10;30202:59;;;;-1:-1:-1;;;30202:59:0;;;;;;;:::i;:::-;30106:163::o;24626:107::-;24711:13;;-1:-1:-1;;;;;24711:13:0;24626:107;:::o;25026:83::-;25094:7;;25026:83;:::o;22619:556::-;22802:7;22843:2;;-1:-1:-1;;;;;22892:26:0;;;22888:95;;22952:10;-1:-1:-1;;;;;22945:27:0;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22929:45;;;;22888:95;-1:-1:-1;;;;;22996:27:0;;;22992:98;;23058:11;-1:-1:-1;;;;;23051:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23034:47;;;;22992:98;23104:63;23153:13;23149:2;:17;23104:40;23129:14;23125:2;:18;23104:16;:20;;:40;;;;:::i;:63::-;23097:70;22619:556;-1:-1:-1;;;;;;22619:556:0:o;29581:441::-;18041:10;;-1:-1:-1;;;;;18041:10:0;18027;:24;18019:58;;;;-1:-1:-1;;;18019:58:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29694:26:0;;::::1;29732:3;29694:26:::0;;;:18:::1;:26;::::0;;;;;::::1;:42:::0;29686:90:::1;;;;-1:-1:-1::0;;;29686:90:0::1;;;;;;;:::i;:::-;29803:13;::::0;-1:-1:-1;;;;;29803:13:0::1;29787:71;;;;-1:-1:-1::0;;;29787:71:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29869:26:0;;::::1;;::::0;;;:18:::1;:26;::::0;;;;;;;:44;;;;::::1;-1:-1:-1::0;;;;;;29869:44:0;;::::1;::::0;::::1;::::0;;;29924:35;;;:18:::1;:35:::0;;;;;;;:44;;;;::::1;::::0;;::::1;::::0;;;29979:13:::1;::::0;:35;;-1:-1:-1;;;29979:35:0;;:13;::::1;::::0;:27:::1;::::0;:35:::1;::::0;29888:6;;29979:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29581:441:::0;;:::o;15870:51::-;;;;;;;;;;;;-1:-1:-1;;;;;15870:51:0;;:::o;5265:203::-;5365:95;5384:5;5414:27;;;5443:4;5449:2;5453:5;5391:68;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;5391:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;5391:68:0;-1:-1:-1;;;;;;5391:68:0;;;;;;;;;;5365:18;:95::i;:::-;5265:203;;;;:::o;45850:405::-;46168:5;;:76;;-1:-1:-1;;;46168:76:0;;46018:18;;;;-1:-1:-1;;;;;46168:5:0;;;;:23;;46198:10;;46168:76;;46210:13;;46225:6;;46233:10;;46168:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46140:104;;;;-1:-1:-1;45850:405:0;-1:-1:-1;;;;45850:405:0:o;10593:129::-;10677:5;;;10672:16;;;;10664:50;;;;-1:-1:-1;;;10664:50:0;;;;;;;:::i;10457:128::-;10541:5;;;10536:16;;;;10528:49;;;;-1:-1:-1;;;10528:49:0;;;;;;;:::i;44640:914::-;44878:22;;;;44936;;44853;45065:80;44936:22;44878;45121:10;45133:11;45065:15;:80::i;:::-;45042:103;;45156:11;45203:1;45186:14;:18;:56;;;;;45223:7;:19;;;45208:12;:34;45186:56;:84;;;;-1:-1:-1;45246:19:0;;;;:24;;45186:84;45182:194;;;45293:71;45300:14;45316:7;:19;;;45337:7;:12;;;45351;45293:6;:71::i;:::-;45287:77;;45182:194;-1:-1:-1;;;;;45478:30:0;;;;;;:15;:30;;;;;;45394:81;45410:14;45426:23;:14;45445:3;45426:18;:23::i;:::-;45451:10;45463:11;45394:15;:81::i;:::-;:114;45386:160;;;;-1:-1:-1;;;45386:160:0;;;;;;;:::i;:::-;44640:914;;;;;;;;:::o;10730:142::-;10782:6;10809;;;:30;;-1:-1:-1;;10824:5:0;;;10838:1;10833;10824:5;10833:1;10819:15;;;;;:20;10809:30;10801:63;;;;-1:-1:-1;;;10801:63:0;;;;;;;:::i;10880:220::-;10932:6;10963:1;10959;:5;10951:34;;;;-1:-1:-1;;;10951:34:0;;;;;;;:::i;:::-;11004:1;11000;:5;;;;;;;10880:220;-1:-1:-1;;;10880:220:0:o;5082:175::-;5164:85;5183:5;5213:23;;;5238:2;5242:5;5190:58;;;;;;;;;:::i;5164:85::-;5082:175;;;:::o;8891:195::-;8999:12;;;8961;8999;;;;;;;;;-1:-1:-1;;;;;8978:7:0;;;8992:5;;8978:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8960:52;;;9031:7;9023:55;;;;-1:-1:-1;;;9023:55:0;;;;;;;:::i;6412:448::-;6499:27;6507:5;-1:-1:-1;;;;;6499:25:0;;:27::i;:::-;6491:71;;;;-1:-1:-1;;;6491:71:0;;;;;;;:::i;:::-;6574:12;6588:23;6623:5;-1:-1:-1;;;;;6615:19:0;6635:4;6615:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6573:67;;;;6659:7;6651:52;;;;-1:-1:-1;;;6651:52:0;;;;;;;:::i;:::-;6718:17;;:21;6714:139;;6775:10;6764:30;;;;;;;;;;;;:::i;:::-;6756:85;;;;-1:-1:-1;;;6756:85:0;;;;;;;:::i;4291:317::-;4351:4;4517:20;;4417:66;4557:23;;;;;;:42;;-1:-1:-1;;4584:15:0;;;4549:51;-1:-1:-1;;4291:317:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1097:241::-;;1201:2;1189:9;1180:7;1176:23;1172:32;1169:2;;;-1:-1;;1207:12;1169:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1259:63;1163:175;-1:-1;;;1163:175::o;1345:263::-;;1460:2;1448:9;1439:7;1435:23;1431:32;1428:2;;;-1:-1;;1466:12;1428:2;226:6;220:13;238:33;265:5;238:33;:::i;1615:366::-;;;1736:2;1724:9;1715:7;1711:23;1707:32;1704:2;;;-1:-1;;1742:12;1704:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1794:63;-1:-1;1894:2;1933:22;;72:20;97:33;72:20;97:33;:::i;:::-;1902:63;;;;1698:283;;;;;:::o;1988:491::-;;;;2126:2;2114:9;2105:7;2101:23;2097:32;2094:2;;;-1:-1;;2132:12;2094:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2184:63;-1:-1;2284:2;2323:22;;72:20;97:33;72:20;97:33;:::i;:::-;2292:63;-1:-1;2392:2;2431:22;;72:20;97:33;72:20;97:33;:::i;:::-;2400:63;;;;2088:391;;;;;:::o;2486:617::-;;;;;2641:3;2629:9;2620:7;2616:23;2612:33;2609:2;;;-1:-1;;2648:12;2609:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2700:63;-1:-1;2800:2;2839:22;;72:20;97:33;72:20;97:33;:::i;:::-;2808:63;-1:-1;2908:2;2947:22;;72:20;97:33;72:20;97:33;:::i;:::-;2603:500;;;;-1:-1;2916:63;;3016:2;3055:22;616:20;;-1:-1;;2603:500::o;3110:485::-;;;;3245:2;3233:9;3224:7;3220:23;3216:32;3213:2;;;-1:-1;;3251:12;3213:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3303:63;-1:-1;3403:2;3442:22;;72:20;97:33;72:20;97:33;:::i;:::-;3411:63;-1:-1;3511:2;3547:22;;347:20;372:30;347:20;372:30;:::i;3602:491::-;;;;3740:2;3728:9;3719:7;3715:23;3711:32;3708:2;;;-1:-1;;3746:12;3708:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3798:63;-1:-1;3898:2;3937:22;;72:20;97:33;72:20;97:33;:::i;:::-;3702:391;;3906:63;;-1:-1;;;4006:2;4045:22;;;;616:20;;3702:391::o;4100:617::-;;;;;4255:3;4243:9;4234:7;4230:23;4226:33;4223:2;;;-1:-1;;4262:12;4223:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4314:63;-1:-1;4414:2;4453:22;;72:20;97:33;72:20;97:33;:::i;:::-;4217:500;;4422:63;;-1:-1;;;;4522:2;4561:22;;616:20;;4630:2;4669:22;616:20;;4217:500::o;4724:869::-;;;;;;;4913:3;4901:9;4892:7;4888:23;4884:33;4881:2;;;-1:-1;;4920:12;4881:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4972:63;-1:-1;5072:2;5111:22;;72:20;97:33;72:20;97:33;:::i;:::-;4875:718;;5080:63;;-1:-1;;;;5180:2;5219:22;;616:20;;5288:2;5327:22;;616:20;;5396:3;5436:22;;616:20;;-1:-1;5505:3;5545:22;;;616:20;;-1:-1;4875:718::o;5600:366::-;;;5721:2;5709:9;5700:7;5696:23;5692:32;5689:2;;;-1:-1;;5727:12;5689:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;5779:63;5879:2;5918:22;;;;616:20;;-1:-1;;;5683:283::o;5973:491::-;;;;6111:2;6099:9;6090:7;6086:23;6082:32;6079:2;;;-1:-1;;6117:12;6079:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6169:63;-1:-1;6269:2;6308:22;;616:20;;-1:-1;6377:2;6416:22;;72:20;97:33;72:20;97:33;:::i;6471:257::-;;6583:2;6571:9;6562:7;6558:23;6554:32;6551:2;;;-1:-1;;6589:12;6551:2;495:6;489:13;507:30;531:5;507:30;:::i;6735:241::-;;6839:2;6827:9;6818:7;6814:23;6810:32;6807:2;;;-1:-1;;6845:12;6807:2;-1:-1;616:20;;6801:175;-1:-1;6801:175::o;6983:399::-;;;7115:2;7103:9;7094:7;7090:23;7086:32;7083:2;;;-1:-1;;7121:12;7083:2;-1:-1;;764:13;;7284:2;7334:22;;;764:13;;;;;-1:-1;7077:305::o;7389:617::-;;;;;7544:3;7532:9;7523:7;7519:23;7515:33;7512:2;;;-1:-1;;7551:12;7512:2;-1:-1;;616:20;;;7703:2;7742:22;;616:20;;-1:-1;7811:2;7850:22;;616:20;;7919:2;7958:22;616:20;;-1:-1;7506:500;-1:-1;7506:500::o;8013:237::-;;8115:2;8103:9;8094:7;8090:23;8086:32;8083:2;;;-1:-1;;8121:12;8083:2;905:6;892:20;917:31;942:5;917:31;:::i;8257:259::-;;8370:2;8358:9;8349:7;8345:23;8341:32;8338:2;;;-1:-1;;8376:12;8338:2;1042:6;1036:13;1054:31;1079:5;1054:31;:::i;17028:271::-;;9063:5;30993:12;-1:-1;32296:101;32310:6;32307:1;32304:13;32296:101;;;9207:4;32377:11;;;;;32371:18;32358:11;;;32351:39;32325:10;32296:101;;;32412:6;32409:1;32406:13;32403:2;;;-1:-1;32468:6;32463:3;32459:16;32452:27;32403:2;-1:-1;9238:16;;;;;17162:137;-1:-1;;17162:137::o;17306:222::-;-1:-1;;;;;31611:54;;;;8743:37;;17433:2;17418:18;;17404:124::o;17535:333::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;17854:2;17839:18;;8743:37;17690:2;17675:18;;17661:207::o;17875:460::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;;18230:2;18215:18;;8743:37;31611:54;;;18321:2;18306:18;;8602:58;18066:2;18051:18;;18037:298::o;18342:444::-;-1:-1;;;;;31611:54;;;8743:37;;31611:54;;;;18689:2;18674:18;;8743:37;18772:2;18757:18;;16865:37;;;;18525:2;18510:18;;18496:290::o;18793:333::-;-1:-1;;;;;31611:54;;;;8743:37;;19112:2;19097:18;;16865:37;18948:2;18933:18;;18919:207::o;19133:444::-;-1:-1;;;;;31611:54;;;8743:37;;19480:2;19465:18;;16865:37;;;;31611:54;;;19563:2;19548:18;;8743:37;19316:2;19301:18;;19287:290::o;19584:416::-;19784:2;19798:47;;;9491:2;19769:18;;;31291:19;-1:-1;;;31331:14;;;9507:44;9570:12;;;19755:245::o;20007:416::-;20207:2;20221:47;;;9821:2;20192:18;;;31291:19;9857:26;31331:14;;;9837:47;9903:12;;;20178:245::o;20430:416::-;20630:2;20644:47;;;10154:2;20615:18;;;31291:19;-1:-1;;;31331:14;;;10170:43;10232:12;;;20601:245::o;20853:416::-;21053:2;21067:47;;;10483:2;21038:18;;;31291:19;10519:26;31331:14;;;10499:47;10565:12;;;21024:245::o;21276:416::-;21476:2;21490:47;;;10816:2;21461:18;;;31291:19;-1:-1;;;31331:14;;;10832:43;10894:12;;;21447:245::o;21699:416::-;21899:2;21913:47;;;11145:2;21884:18;;;31291:19;-1:-1;;;31331:14;;;11161:43;11223:12;;;21870:245::o;22122:416::-;22322:2;22336:47;;;22307:18;;;31291:19;11510:34;31331:14;;;11490:55;11564:12;;;22293:245::o;22545:416::-;22745:2;22759:47;;;11815:2;22730:18;;;31291:19;11851:29;31331:14;;;11831:50;11900:12;;;22716:245::o;22968:416::-;23168:2;23182:47;;;12151:2;23153:18;;;31291:19;12187:27;31331:14;;;12167:48;12234:12;;;23139:245::o;23391:416::-;23591:2;23605:47;;;12485:2;23576:18;;;31291:19;12521:34;31331:14;;;12501:55;-1:-1;;;12576:12;;;12569:25;12613:12;;;23562:245::o;23814:416::-;24014:2;24028:47;;;12864:2;23999:18;;;31291:19;12900:26;31331:14;;;12880:47;12946:12;;;23985:245::o;24237:416::-;24437:2;24451:47;;;13197:2;24422:18;;;31291:19;-1:-1;;;31331:14;;;13213:44;13276:12;;;24408:245::o;24660:416::-;24860:2;24874:47;;;13527:2;24845:18;;;31291:19;13563:27;31331:14;;;13543:48;13610:12;;;24831:245::o;25083:416::-;25283:2;25297:47;;;13861:2;25268:18;;;31291:19;13897:28;31331:14;;;13877:49;13945:12;;;25254:245::o;25506:416::-;25706:2;25720:47;;;14196:2;25691:18;;;31291:19;-1:-1;;;31331:14;;;14212:39;14270:12;;;25677:245::o;25929:416::-;26129:2;26143:47;;;14521:2;26114:18;;;31291:19;14557:34;31331:14;;;14537:55;-1:-1;;;14612:12;;;14605:27;14651:12;;;26100:245::o;26352:416::-;26552:2;26566:47;;;14902:2;26537:18;;;31291:19;14938:33;31331:14;;;14918:54;14991:12;;;26523:245::o;26775:416::-;26975:2;26989:47;;;15242:2;26960:18;;;31291:19;15278:34;31331:14;;;15258:55;-1:-1;;;15333:12;;;15326:34;15379:12;;;26946:245::o;27198:416::-;27398:2;27412:47;;;15630:2;27383:18;;;31291:19;15666:34;31331:14;;;15646:55;-1:-1;;;15721:12;;;15714:27;15760:12;;;27369:245::o;27621:416::-;27821:2;27835:47;;;16011:2;27806:18;;;31291:19;16047:33;31331:14;;;16027:54;16100:12;;;27792:245::o;28044:416::-;28244:2;28258:47;;;16351:2;28229:18;;;31291:19;16387:33;31331:14;;;16367:54;16440:12;;;28215:245::o;28467:416::-;28667:2;28681:47;;;16691:2;28652:18;;;31291:19;-1:-1;;;31331:14;;;16707:42;16768:12;;;28638:245::o;28890:222::-;16865:37;;;29017:2;29002:18;;28988:124::o;29119:333::-;16865:37;;;-1:-1;;;;;31611:54;29438:2;29423:18;;8743:37;29274:2;29259:18;;29245:207::o;29459:556::-;16865:37;;;29835:2;29820:18;;16865:37;;;;29918:2;29903:18;;16865:37;30001:2;29986:18;;16865:37;29670:3;29655:19;;29641:374::o;30022:656::-;16865:37;;;30420:2;30405:18;;16865:37;;;;30503:2;30488:18;;16865:37;;;;30586:2;30571:18;;16865:37;31523:13;31516:21;30663:3;30648:19;;8857:34;30255:3;30240:19;;30226:452::o;30685:214::-;31827:4;31816:16;;;;16981:35;;30808:2;30793:18;;30779:120::o;32500:117::-;-1:-1;;;;;31611:54;;32559:35;;32549:2;;32608:1;;32598:12;32549:2;32543:74;:::o;32624:111::-;32705:5;31523:13;31516:21;32683:5;32680:32;32670:2;;32726:1;;32716:12;32866:113;31827:4;32949:5;31816:16;32926:5;32923:33;32913:2;;32970:1;;32960:12
Swarm Source
ipfs://18e55ce54b4670fcf69af0b5559a45cc61b1e8922fb694a8c765d214006c1483
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $2,469.25 | 1.0313 | $2,546.53 |
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.