More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 55 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 21773444 | 65 days ago | IN | 0 ETH | 0.00042257 | ||||
Deposit Eth | 21421645 | 114 days ago | IN | 3.6 ETH | 0.00140007 | ||||
Deposit Eth | 21344730 | 125 days ago | IN | 3 ETH | 0.00487701 | ||||
Propose Owner | 20500215 | 243 days ago | IN | 0 ETH | 0.00004925 | ||||
Set Liquidations... | 20500098 | 243 days ago | IN | 0 ETH | 0.00016878 | ||||
Claim Ownership | 20500054 | 243 days ago | IN | 0 ETH | 0.00002373 | ||||
Deposit Eth | 19860815 | 332 days ago | IN | 6 ETH | 0.00044995 | ||||
Deposit Eth | 19816323 | 338 days ago | IN | 11.4 ETH | 0.0009337 | ||||
Withdraw Eth | 19234128 | 420 days ago | IN | 0 ETH | 0.01239624 | ||||
Propose Owner | 19219903 | 422 days ago | IN | 0 ETH | 0.002261 | ||||
Set Liquidations... | 19219780 | 422 days ago | IN | 0 ETH | 0.00150164 | ||||
Claim Ownership | 19219713 | 422 days ago | IN | 0 ETH | 0.00187938 | ||||
Deposit Eth | 18983774 | 455 days ago | IN | 40.7 ETH | 0.0086581 | ||||
Propose Owner | 18980192 | 456 days ago | IN | 0 ETH | 0.00225315 | ||||
Add Whitelisted ... | 18979955 | 456 days ago | IN | 0 ETH | 0.00263514 | ||||
Set Loans Periph... | 18979950 | 456 days ago | IN | 0 ETH | 0.00169439 | ||||
Claim Ownership | 18979907 | 456 days ago | IN | 0 ETH | 0.00162615 | ||||
Deposit Eth | 18798202 | 481 days ago | IN | 15.2 ETH | 0.00760406 | ||||
Deposit Eth | 18719152 | 492 days ago | IN | 6.75 ETH | 0.00893103 | ||||
Deposit Eth | 18697358 | 495 days ago | IN | 6.25 ETH | 0.00480868 | ||||
Deposit Eth | 18565295 | 514 days ago | IN | 19 ETH | 0.0098798 | ||||
Deposit Eth | 18564753 | 514 days ago | IN | 25.5 ETH | 0.00739773 | ||||
Deposit Eth | 18533925 | 518 days ago | IN | 8.5 ETH | 0.00533153 | ||||
Deposit Eth | 18435752 | 532 days ago | IN | 7 ETH | 0.00396009 | ||||
Deposit Eth | 18278064 | 554 days ago | IN | 53.5 ETH | 0.00266644 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Deposit | 22242019 | 2 hrs ago | 3.79129367 ETH | ||||
Receive Funds Et... | 22242019 | 2 hrs ago | 3.79129367 ETH | ||||
Transfer | 21773444 | 65 days ago | 40 ETH | ||||
Transfer | 21773444 | 65 days ago | 40 ETH | ||||
Deposit | 21772909 | 65 days ago | 30.74100157 ETH | ||||
Receive Funds Et... | 21772909 | 65 days ago | 30.74100157 ETH | ||||
Transfer | 21477816 | 106 days ago | 7.5 ETH | ||||
Transfer | 21477816 | 106 days ago | 7.5 ETH | ||||
Deposit | 21477814 | 106 days ago | 8.625 ETH | ||||
Receive Funds Fr... | 21477814 | 106 days ago | 8.625 ETH | ||||
Transfer | 21477812 | 106 days ago | 7.5 ETH | ||||
Transfer | 21477812 | 106 days ago | 7.5 ETH | ||||
Deposit | 21477810 | 106 days ago | 8.625 ETH | ||||
Receive Funds Fr... | 21477810 | 106 days ago | 8.625 ETH | ||||
Transfer | 21477808 | 106 days ago | 7.7 ETH | ||||
Transfer | 21477808 | 106 days ago | 7.7 ETH | ||||
Deposit | 21477806 | 106 days ago | 8.855 ETH | ||||
Receive Funds Fr... | 21477806 | 106 days ago | 8.855 ETH | ||||
Transfer | 21477804 | 106 days ago | 9 ETH | ||||
Transfer | 21477804 | 106 days ago | 9 ETH | ||||
Deposit | 21477802 | 106 days ago | 10.325 ETH | ||||
Receive Funds Fr... | 21477802 | 106 days ago | 10.325 ETH | ||||
Transfer | 21477800 | 106 days ago | 13 ETH | ||||
Transfer | 21477800 | 106 days ago | 13 ETH | ||||
Deposit | 21477797 | 106 days ago | 14.825 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LendingPoolPeripheral
Compiler Version
vyper:0.3.7
Contract Source Code (Vyper language format)
# @version 0.3.7 """ @title LendingPoolPeripheral @author [Zharta](https://zharta.io/) @notice The lending pool contract implements the lending pool logic. Each instance works with a corresponding loans contract to implement an isolated lending market. @dev Uses a `LendingPoolCore` contract to store state """ # Interfaces from vyper.interfaces import ERC20 as IERC20 interface ILendingPoolCore: def funds(arg0: address) -> InvestorFunds: view def fundsAvailable() -> uint256: view def fundsInvested() -> uint256: view def computeWithdrawableAmount(_lender: address) -> uint256: view def deposit(_lender: address, _payer: address, _amount: uint256) -> bool: nonpayable def withdraw(_lender: address, _wallet: address, _amount: uint256) -> bool: nonpayable def sendFunds(_to: address, _amount: uint256) -> bool: nonpayable def receiveFunds(_borrower: address, _amount: uint256, _rewardsAmount: uint256, _investedAmount: uint256) -> bool: nonpayable def transferProtocolFees(_borrower: address, _protocolWallet: address, _amount: uint256) -> bool: nonpayable interface ILendingPoolLock: def investorLocks(arg0: address) -> InvestorLock: view def setInvestorLock(_lender: address, _amount: uint256, _lockPeriodEnd: uint256): nonpayable interface ILiquidityControls: def lockPeriodDuration() -> uint256: view def lockPeriodEnabled() -> bool: view def withinPoolShareLimit( _lender: address, _amount: uint256, _lpPeripheralContractAddress: address, _lpCoreContractAddress: address, _fundsInvestable: uint256 ) -> bool: view def outOfLockPeriod(_lender: address, _remainingAmount: uint256, _lpLockContractAddress: address) -> bool: view interface IWETH: def deposit(): payable def withdraw(_amount: uint256): nonpayable # Structs struct InvestorFunds: currentAmountDeposited: uint256 totalAmountDeposited: uint256 totalAmountWithdrawn: uint256 sharesBasisPoints: uint256 activeForRewards: bool struct InvestorLock: lockPeriodEnd: uint256 lockPeriodAmount: uint256 # Events event OwnerProposed: ownerIndexed: indexed(address) proposedOwnerIndexed: indexed(address) owner: address proposedOwner: address erc20TokenContract: address event OwnershipTransferred: ownerIndexed: indexed(address) proposedOwnerIndexed: indexed(address) owner: address proposedOwner: address erc20TokenContract: address event MaxCapitalEfficiencyChanged: erc20TokenContractIndexed: indexed(address) currentValue: uint256 newValue: uint256 erc20TokenContract: address event ProtocolWalletChanged: erc20TokenContractIndexed: indexed(address) currentValue: address newValue: address erc20TokenContract: address event ProtocolFeesShareChanged: erc20TokenContractIndexed: indexed(address) currentValue: uint256 newValue: uint256 erc20TokenContract: address event LoansPeripheralAddressSet: erc20TokenContractIndexed: indexed(address) currentValue: address newValue: address erc20TokenContract: address event LiquidationsPeripheralAddressSet: erc20TokenContractIndexed: indexed(address) currentValue: address newValue: address erc20TokenContract: address event LiquidityControlsAddressSet: erc20TokenContractIndexed: indexed(address) currentValue: address newValue: address erc20TokenContract: address event WhitelistStatusChanged: erc20TokenContractIndexed: indexed(address) value: bool erc20TokenContract: address event WhitelistAddressAdded: erc20TokenContractIndexed: indexed(address) value: address erc20TokenContract: address event WhitelistAddressRemoved: erc20TokenContractIndexed: indexed(address) value: address erc20TokenContract: address event ContractStatusChanged: erc20TokenContractIndexed: indexed(address) value: bool erc20TokenContract: address event InvestingStatusChanged: erc20TokenContractIndexed: indexed(address) value: bool erc20TokenContract: address event ContractDeprecated: erc20TokenContractIndexed: indexed(address) erc20TokenContract: address event Deposit: walletIndexed: indexed(address) wallet: address amount: uint256 erc20TokenContract: address event Withdrawal: walletIndexed: indexed(address) wallet: address amount: uint256 erc20TokenContract: address event FundsTransfer: walletIndexed: indexed(address) wallet: address amount: uint256 erc20TokenContract: address event FundsReceipt: walletIndexed: indexed(address) wallet: address amount: uint256 rewardsPool: uint256 rewardsProtocol: uint256 investedAmount: uint256 erc20TokenContract: address fundsOrigin: String[30] event PaymentSent: walletIndexed: indexed(address) wallet: address amount: uint256 event PaymentReceived: walletIndexed: indexed(address) wallet: address amount: uint256 # Global variables owner: public(address) proposedOwner: public(address) loansContract: public(address) lendingPoolCoreContract: public(address) lendingPoolLockContract: public(address) erc20TokenContract: public(immutable(address)) liquidationsPeripheralContract: public(address) liquidityControlsContract: public(address) protocolWallet: public(address) protocolFeesShare: public(uint256) # parts per 10000, e.g. 2.5% is represented by 250 parts per 10000 maxCapitalEfficienty: public(uint256) # parts per 10000, e.g. 2.5% is represented by 250 parts per 10000 isPoolActive: public(bool) isPoolDeprecated: public(bool) isPoolInvesting: public(bool) whitelistEnabled: public(bool) whitelistedAddresses: public(HashMap[address, bool]) ##### INTERNAL METHODS - VIEW ##### @view @internal def _fundsAreAllowed(_owner: address, _spender: address, _amount: uint256) -> bool: amountAllowed: uint256 = IERC20(erc20TokenContract).allowance(_owner, _spender) return _amount <= amountAllowed @pure @internal def _poolHasFundsToInvest(_fundsAvailable: uint256, _fundsInvested: uint256, _capitalEfficienty: uint256) -> bool: if _fundsAvailable + _fundsInvested == 0: return False return _fundsInvested * 10000 / (_fundsAvailable + _fundsInvested) < _capitalEfficienty @view @internal def _poolHasFundsToInvestAfterDeposit(_amount: uint256) -> bool: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() + _amount fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() return self._poolHasFundsToInvest(fundsAvailable, fundsInvested, self.maxCapitalEfficienty) @view @internal def _poolHasFundsToInvestAfterPayment(_amount: uint256, _rewards: uint256) -> bool: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() + _amount + _rewards fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() - _amount return self._poolHasFundsToInvest(fundsAvailable, fundsInvested, self.maxCapitalEfficienty) @view @internal def _poolHasFundsToInvestAfterWithdraw(_amount: uint256) -> bool: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() - _amount fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() return self._poolHasFundsToInvest(fundsAvailable, fundsInvested, self.maxCapitalEfficienty) @view @internal def _poolHasFundsToInvestAfterInvestment(_amount: uint256) -> bool: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() - _amount fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() + _amount return self._poolHasFundsToInvest(fundsAvailable, fundsInvested, self.maxCapitalEfficienty) @view @internal def _maxFundsInvestable() -> uint256: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() fundsBuffer: uint256 = (fundsAvailable + fundsInvested) * (10000 - self.maxCapitalEfficienty) / 10000 if fundsBuffer > fundsAvailable: return 0 return fundsAvailable - fundsBuffer @view @internal def _theoreticalMaxFundsInvestable(_amount: uint256) -> uint256: fundsAvailable: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() fundsInvested: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).fundsInvested() return (fundsAvailable + fundsInvested + _amount) * self.maxCapitalEfficienty / 10000 @view @internal def _computeLockPeriodEnd(_lender: address) -> uint256: lockPeriodEnd: uint256 = ILendingPoolLock(self.lendingPoolLockContract).investorLocks(_lender).lockPeriodEnd if lockPeriodEnd <= block.timestamp: lockPeriodEnd = block.timestamp + ILiquidityControls(self.liquidityControlsContract).lockPeriodDuration() return lockPeriodEnd @view @internal def _computeLockPeriod(_lender: address, _amount: uint256) -> (uint256, uint256): investorLock: InvestorLock = ILendingPoolLock(self.lendingPoolLockContract).investorLocks(msg.sender) if investorLock.lockPeriodEnd <= block.timestamp: return block.timestamp + ILiquidityControls(self.liquidityControlsContract).lockPeriodDuration(), _amount else: return investorLock.lockPeriodEnd, investorLock.lockPeriodAmount + _amount ##### INTERNAL METHODS - WRITE ##### @internal def _deposit(_amount: uint256, _payer: address): assert not self.isPoolDeprecated, "pool is deprecated, withdraw" assert self.isPoolActive, "pool is not active right now" assert _amount > 0, "_amount has to be higher than 0" assert ILiquidityControls(self.liquidityControlsContract).withinPoolShareLimit( msg.sender, _amount, self, self.lendingPoolCoreContract, self._theoreticalMaxFundsInvestable(_amount) ), "max pool share surpassed" if self.whitelistEnabled and not self.whitelistedAddresses[msg.sender]: raise "msg.sender is not whitelisted" if not self.isPoolInvesting and self._poolHasFundsToInvestAfterDeposit(_amount): self.isPoolInvesting = True log InvestingStatusChanged( erc20TokenContract, True, erc20TokenContract ) lockPeriodEnd: uint256 = 0 lockPeriodAmount: uint256 = 0 lockPeriodEnd, lockPeriodAmount = self._computeLockPeriod(msg.sender, _amount) if not ILendingPoolCore(self.lendingPoolCoreContract).deposit(msg.sender, _payer, _amount): raise "error creating deposit" ILendingPoolLock(self.lendingPoolLockContract).setInvestorLock(msg.sender, lockPeriodAmount, lockPeriodEnd) log Deposit(msg.sender, msg.sender, _amount, erc20TokenContract) @internal def _withdraw(_amount: uint256, _receiver: address): assert _amount > 0, "_amount has to be higher than 0" withdrawableAmount: uint256 = ILendingPoolCore(self.lendingPoolCoreContract).computeWithdrawableAmount(msg.sender) assert withdrawableAmount >= _amount, "_amount more than withdrawable" assert ILiquidityControls(self.liquidityControlsContract).outOfLockPeriod(msg.sender, withdrawableAmount - _amount, self.lendingPoolLockContract), "withdraw within lock period" assert ILendingPoolCore(self.lendingPoolCoreContract).fundsAvailable() >= _amount, "available funds less than amount" if self.isPoolInvesting and not self._poolHasFundsToInvestAfterWithdraw(_amount): self.isPoolInvesting = False log InvestingStatusChanged( erc20TokenContract, False, erc20TokenContract ) if not ILendingPoolCore(self.lendingPoolCoreContract).withdraw(msg.sender, _receiver, _amount): raise "error withdrawing funds" log Withdrawal(msg.sender, msg.sender, _amount, erc20TokenContract) @internal def _sendFunds(_to: address, _receiver: address, _amount: uint256): assert not self.isPoolDeprecated, "pool is deprecated" assert self.isPoolActive, "pool is inactive" assert self.isPoolInvesting, "max capital eff reached" assert msg.sender == self.loansContract, "msg.sender is not the loans addr" assert _to != empty(address), "_to is the zero address" assert _amount > 0, "_amount has to be higher than 0" assert _amount <= self._maxFundsInvestable(), "insufficient liquidity" if self.isPoolInvesting and not self._poolHasFundsToInvestAfterInvestment(_amount): self.isPoolInvesting = False log InvestingStatusChanged( erc20TokenContract, False, erc20TokenContract ) if not ILendingPoolCore(self.lendingPoolCoreContract).sendFunds(_receiver, _amount): raise "error sending funds in LPCore" log FundsTransfer(_to, _to, _amount, erc20TokenContract) @internal def _receiveFunds(_borrower: address, _payer: address, _amount: uint256, _rewardsAmount: uint256): assert msg.sender == self.loansContract, "msg.sender is not the loans addr" assert _borrower != empty(address), "_borrower is the zero address" assert _amount + _rewardsAmount > 0, "amount should be higher than 0" rewardsProtocol: uint256 = _rewardsAmount * self.protocolFeesShare / 10000 rewardsPool: uint256 = _rewardsAmount - rewardsProtocol self._transferReceivedFunds(_borrower, _payer, _amount, rewardsPool, rewardsProtocol, _amount, "loan") @internal def _transferReceivedFunds( _borrower: address, _payer: address, _amount: uint256, _rewardsPool: uint256, _rewardsProtocol: uint256, _investedAmount: uint256, _origin: String[30] ): if not self.isPoolInvesting and self._poolHasFundsToInvestAfterPayment(_amount, _rewardsPool): self.isPoolInvesting = True log InvestingStatusChanged( erc20TokenContract, True, erc20TokenContract ) if not ILendingPoolCore(self.lendingPoolCoreContract).receiveFunds(_payer, _amount, _rewardsPool, _investedAmount): raise "error receiving funds in LPCore" if _rewardsProtocol > 0: if not ILendingPoolCore(self.lendingPoolCoreContract).transferProtocolFees(_payer, self.protocolWallet, _rewardsProtocol): raise "error transferring protocol fees" log FundsReceipt( _borrower, _borrower, _amount, _rewardsPool, _rewardsProtocol, _investedAmount, erc20TokenContract, _origin ) @internal def _receiveFundsFromLiquidation( _borrower: address, _payer: address, _amount: uint256, _rewardsAmount: uint256, _distributeToProtocol: bool, _investedAmount: uint256, _origin: String[30] ): assert msg.sender == self.liquidationsPeripheralContract, "msg.sender is not the BN addr" assert _borrower != empty(address), "_borrower is the zero address" assert _amount + _rewardsAmount > 0, "amount should be higher than 0" rewardsProtocol: uint256 = 0 rewardsPool: uint256 = 0 if _distributeToProtocol: rewardsProtocol = _rewardsAmount * self.protocolFeesShare / 10000 rewardsPool = _rewardsAmount - rewardsProtocol else: rewardsPool = _rewardsAmount self._transferReceivedFunds(_borrower, _payer, _amount, rewardsPool, rewardsProtocol, _investedAmount, _origin) @internal def _unwrap_and_send(_to: address, _amount: uint256): IWETH(erc20TokenContract).withdraw(_amount) send(_to, _amount) log PaymentSent(_to, _to, _amount) @internal def _wrap_and_approve(_to: address, _amount: uint256): IWETH(erc20TokenContract).deposit(value=_amount) log PaymentSent(erc20TokenContract, erc20TokenContract, _amount) IERC20(erc20TokenContract).approve(_to, _amount) ##### EXTERNAL METHODS - VIEW ##### @view @external def maxFundsInvestable() -> uint256: return self._maxFundsInvestable() @view @external def theoreticalMaxFundsInvestable() -> uint256: return self._theoreticalMaxFundsInvestable(0) @view @external def theoreticalMaxFundsInvestableAfterDeposit(_amount: uint256) -> uint256: return self._theoreticalMaxFundsInvestable(_amount) @view @external def lenderFunds(_lender: address) -> InvestorFunds: return ILendingPoolCore(self.lendingPoolCoreContract).funds(_lender) @view @external def lockedAmount(_lender: address) -> uint256: if not ILiquidityControls(self.liquidityControlsContract).lockPeriodEnabled(): return 0 lockPeriod: InvestorLock = ILendingPoolLock(self.lendingPoolLockContract).investorLocks(_lender) if lockPeriod.lockPeriodEnd < block.timestamp: return 0 return lockPeriod.lockPeriodAmount ##### EXTERNAL METHODS - NON-VIEW ##### @external def __init__( _lendingPoolCoreContract: address, _lendingPoolLockContract: address, _erc20TokenContract: address, _protocolWallet: address, _protocolFeesShare: uint256, _maxCapitalEfficienty: uint256, _whitelistEnabled: bool ): assert _lendingPoolCoreContract != empty(address), "address is the zero address" assert _erc20TokenContract != empty(address), "address is the zero address" assert _protocolWallet != empty(address), "address is the zero address" assert _protocolFeesShare <= 10000, "fees share exceeds 10000 bps" assert _maxCapitalEfficienty <= 10000, "capital eff exceeds 10000 bps" self.owner = msg.sender self.lendingPoolCoreContract = _lendingPoolCoreContract self.lendingPoolLockContract = _lendingPoolLockContract erc20TokenContract = _erc20TokenContract self.protocolWallet = _protocolWallet self.protocolFeesShare = _protocolFeesShare self.maxCapitalEfficienty = _maxCapitalEfficienty self.isPoolActive = True if _whitelistEnabled: self.whitelistEnabled = _whitelistEnabled @external @payable def __default__(): assert msg.sender == erc20TokenContract, "msg.sender is not the WETH addr" log PaymentReceived(msg.sender, msg.sender, msg.value) @external def proposeOwner(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address it the zero address" assert self.owner != _address, "proposed owner addr is the owner" assert self.proposedOwner != _address, "proposed owner addr is the same" self.proposedOwner = _address log OwnerProposed( self.owner, _address, self.owner, _address, erc20TokenContract ) @external def claimOwnership(): assert msg.sender == self.proposedOwner, "msg.sender is not the proposed" log OwnershipTransferred( self.owner, self.proposedOwner, self.owner, self.proposedOwner, erc20TokenContract ) self.owner = self.proposedOwner self.proposedOwner = empty(address) @external def changeMaxCapitalEfficiency(_value: uint256): assert msg.sender == self.owner, "msg.sender is not the owner" assert _value <= 10000, "capital eff exceeds 10000 bps" assert _value != self.maxCapitalEfficienty, "new value is the same" log MaxCapitalEfficiencyChanged( erc20TokenContract, self.maxCapitalEfficienty, _value, erc20TokenContract ) self.maxCapitalEfficienty = _value @external def changeProtocolWallet(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert _address != self.protocolWallet, "new value is the same" log ProtocolWalletChanged( erc20TokenContract, self.protocolWallet, _address, erc20TokenContract ) self.protocolWallet = _address @external def changeProtocolFeesShare(_value: uint256): assert msg.sender == self.owner, "msg.sender is not the owner" assert _value <= 10000, "fees share exceeds 10000 bps" assert _value != self.protocolFeesShare, "new value is the same" log ProtocolFeesShareChanged( erc20TokenContract, self.protocolFeesShare, _value, erc20TokenContract ) self.protocolFeesShare = _value @external def setLoansPeripheralAddress(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert _address.is_contract, "_address is not a contract" assert _address != self.loansContract, "new value is the same" log LoansPeripheralAddressSet( erc20TokenContract, self.loansContract, _address, erc20TokenContract ) self.loansContract = _address @external def setLiquidationsPeripheralAddress(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert _address.is_contract, "_address is not a contract" assert _address != self.liquidationsPeripheralContract, "new value is the same" log LiquidationsPeripheralAddressSet( erc20TokenContract, self.liquidationsPeripheralContract, _address, erc20TokenContract ) self.liquidationsPeripheralContract = _address @external def setLiquidityControlsAddress(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert _address.is_contract, "_address is not a contract" assert _address != self.liquidityControlsContract, "new value is the same" log LiquidityControlsAddressSet( erc20TokenContract, self.liquidityControlsContract, _address, erc20TokenContract ) self.liquidityControlsContract = _address @external def changeWhitelistStatus(_flag: bool): assert msg.sender == self.owner, "msg.sender is not the owner" assert self.whitelistEnabled != _flag, "new value is the same" self.whitelistEnabled = _flag log WhitelistStatusChanged( erc20TokenContract, _flag, erc20TokenContract ) @external def addWhitelistedAddress(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert self.whitelistEnabled, "whitelist is disabled" assert not self.whitelistedAddresses[_address], "address is already whitelisted" self.whitelistedAddresses[_address] = True log WhitelistAddressAdded( erc20TokenContract, _address, erc20TokenContract ) @external def removeWhitelistedAddress(_address: address): assert msg.sender == self.owner, "msg.sender is not the owner" assert _address != empty(address), "_address is the zero address" assert self.whitelistEnabled, "whitelist is disabled" assert self.whitelistedAddresses[_address], "address is not whitelisted" self.whitelistedAddresses[_address] = False log WhitelistAddressRemoved( erc20TokenContract, _address, erc20TokenContract ) @external def changePoolStatus(_flag: bool): assert msg.sender == self.owner, "msg.sender is not the owner" self.isPoolActive = _flag if not _flag: self.isPoolInvesting = False log InvestingStatusChanged( erc20TokenContract, False, erc20TokenContract ) if _flag and not self.isPoolInvesting and self._poolHasFundsToInvestAfterWithdraw(0): self.isPoolInvesting = True log InvestingStatusChanged( erc20TokenContract, True, erc20TokenContract ) log ContractStatusChanged( erc20TokenContract, _flag, erc20TokenContract ) @external def deprecate(): assert msg.sender == self.owner, "msg.sender is not the owner" assert not self.isPoolDeprecated, "pool is already deprecated" self.isPoolDeprecated = True self.isPoolActive = False self.isPoolInvesting = False log ContractStatusChanged( erc20TokenContract, False, erc20TokenContract ) log InvestingStatusChanged( erc20TokenContract, False, erc20TokenContract ) log ContractDeprecated( erc20TokenContract, erc20TokenContract ) @external def deposit(_amount: uint256): """ @notice Deposits the given amount of the ERC20 in the lending pool @dev Logs the `Deposit` event @param _amount Value to deposit """ assert self._fundsAreAllowed(msg.sender, self.lendingPoolCoreContract, _amount), "not enough funds allowed" self._deposit(_amount, msg.sender) @external @payable def depositEth(): """ @notice Deposits the sent amount in the lending pool @dev Logs the `Deposit` event """ log PaymentReceived(msg.sender, msg.sender, msg.value) self._wrap_and_approve(self.lendingPoolCoreContract, msg.value) self._deposit(msg.value, self) @external def withdraw(_amount: uint256): """ @notice Withdrawals the given amount of ERC20 from the lending pool @dev Logs the `Withdrawal` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _amount Value to withdraw """ self._withdraw(_amount, msg.sender) @external def withdrawEth(_amount: uint256): """ @notice Withdrawals the given amount of ETH from the lending pool @dev Logs the `Withdrawal` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _amount Value to withdraw in wei """ self._withdraw(_amount, self) self._unwrap_and_send(msg.sender, _amount) @external def sendFunds(_to: address, _amount: uint256): """ @notice Sends funds in the pool ERC20 to a borrower as part of a loan creation @dev Logs the `FundsTransfer` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _to The wallet address to transfer the funds to @param _amount Value to transfer """ self._sendFunds(_to, _to, _amount) @external def sendFundsEth(_to: address, _amount: uint256): """ @notice Sends funds in ETH to a borrower as part of a loan creation @dev Logs the `FundsTransfer` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _to The wallet address to transfer the funds to @param _amount Value to transfer in wei """ self._sendFunds(_to, self, _amount) self._unwrap_and_send(_to, _amount) @payable @external def receiveFundsEth(_borrower: address, _amount: uint256, _rewardsAmount: uint256): """ @notice Receive funds in ETH from a borrower as part of a loan payment @dev Logs the `FundsReceipt` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _borrower The wallet address to receive the funds from @param _amount Value of the loans principal to receive in wei @param _rewardsAmount Value of the loans interest (including the protocol fee share) to receive in wei """ _received_amount: uint256 = msg.value assert _received_amount > 0, "amount should be higher than 0" assert _received_amount == _amount + _rewardsAmount, "recv amount not match partials" log PaymentReceived(msg.sender, msg.sender, _amount + _rewardsAmount) self._wrap_and_approve(self.lendingPoolCoreContract, _received_amount) self._receiveFunds(_borrower, self, _amount, _rewardsAmount) @external def receiveFunds(_borrower: address, _amount: uint256, _rewardsAmount: uint256): """ @notice Receive funds in the pool ERC20 from a borrower as part of a loan payment @dev Logs the `FundsReceipt` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _borrower The wallet address to receive the funds from @param _amount Value of the loans principal to receive @param _rewardsAmount Value of the loans interest (including the protocol fee share) to receive """ assert self._fundsAreAllowed(_borrower, self.lendingPoolCoreContract, _amount + _rewardsAmount), "insufficient liquidity" self._receiveFunds(_borrower, _borrower, _amount, _rewardsAmount) @external def receiveFundsFromLiquidation( _borrower: address, _amount: uint256, _rewardsAmount: uint256, _distributeToProtocol: bool, _investedAmount: uint256, _origin: String[30] ): """ @notice Receive funds from a liquidation in the pool ERC20 @dev Logs the `FundsReceipt` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _borrower The wallet address to receive the funds from @param _amount Value of the loans principal to receive @param _rewardsAmount Value of the rewards after liquidation (including the protocol fee share) to receive @param _distributeToProtocol Wether to distribute the protocol fees or not @param _origin Identification of the liquidation method """ assert self._fundsAreAllowed(_borrower, self.lendingPoolCoreContract, _amount + _rewardsAmount), "insufficient liquidity" self._receiveFundsFromLiquidation(_borrower, _borrower, _amount, _rewardsAmount, _distributeToProtocol, _investedAmount, _origin) @payable @external def receiveFundsFromLiquidationEth( _borrower: address, _amount: uint256, _rewardsAmount: uint256, _distributeToProtocol: bool, _investedAmount: uint256, _origin: String[30] ): """ @notice Receive funds from a liquidation in ETH @dev Logs the `FundsReceipt` and, if it changes the pools investing status, the `InvestingStatusChanged` events @param _borrower The wallet address to receive the funds from @param _amount Value of the loans principal to receive in wei @param _rewardsAmount Value of the rewards after liquidation (including the protocol fee share) to receive in wei @param _distributeToProtocol Wether to distribute the protocol fees or not @param _origin Identification of the liquidation method """ receivedAmount: uint256 = msg.value assert receivedAmount == _amount + _rewardsAmount, "recv amount not match partials" log PaymentReceived(msg.sender, msg.sender, receivedAmount) self._wrap_and_approve(self.lendingPoolCoreContract, receivedAmount) self._receiveFundsFromLiquidation(_borrower, self, _amount, _rewardsAmount, _distributeToProtocol, _investedAmount, _origin)
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"name":"OwnerProposed","inputs":[{"name":"ownerIndexed","type":"address","indexed":true},{"name":"proposedOwnerIndexed","type":"address","indexed":true},{"name":"owner","type":"address","indexed":false},{"name":"proposedOwner","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"OwnershipTransferred","inputs":[{"name":"ownerIndexed","type":"address","indexed":true},{"name":"proposedOwnerIndexed","type":"address","indexed":true},{"name":"owner","type":"address","indexed":false},{"name":"proposedOwner","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"MaxCapitalEfficiencyChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"uint256","indexed":false},{"name":"newValue","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ProtocolWalletChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"address","indexed":false},{"name":"newValue","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ProtocolFeesShareChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"uint256","indexed":false},{"name":"newValue","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"LoansPeripheralAddressSet","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"address","indexed":false},{"name":"newValue","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"LiquidationsPeripheralAddressSet","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"address","indexed":false},{"name":"newValue","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"LiquidityControlsAddressSet","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"currentValue","type":"address","indexed":false},{"name":"newValue","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"WhitelistStatusChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"value","type":"bool","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"WhitelistAddressAdded","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"value","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"WhitelistAddressRemoved","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"value","type":"address","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ContractStatusChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"value","type":"bool","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"InvestingStatusChanged","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"value","type":"bool","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"ContractDeprecated","inputs":[{"name":"erc20TokenContractIndexed","type":"address","indexed":true},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"Deposit","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"Withdrawal","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"FundsTransfer","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false}],"anonymous":false,"type":"event"},{"name":"FundsReceipt","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false},{"name":"rewardsPool","type":"uint256","indexed":false},{"name":"rewardsProtocol","type":"uint256","indexed":false},{"name":"investedAmount","type":"uint256","indexed":false},{"name":"erc20TokenContract","type":"address","indexed":false},{"name":"fundsOrigin","type":"string","indexed":false}],"anonymous":false,"type":"event"},{"name":"PaymentSent","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"name":"PaymentReceived","inputs":[{"name":"walletIndexed","type":"address","indexed":true},{"name":"wallet","type":"address","indexed":false},{"name":"amount","type":"uint256","indexed":false}],"anonymous":false,"type":"event"},{"stateMutability":"view","type":"function","name":"maxFundsInvestable","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"theoreticalMaxFundsInvestable","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"theoreticalMaxFundsInvestableAfterDeposit","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"lenderFunds","inputs":[{"name":"_lender","type":"address"}],"outputs":[{"name":"","type":"tuple","components":[{"name":"currentAmountDeposited","type":"uint256"},{"name":"totalAmountDeposited","type":"uint256"},{"name":"totalAmountWithdrawn","type":"uint256"},{"name":"sharesBasisPoints","type":"uint256"},{"name":"activeForRewards","type":"bool"}]}]},{"stateMutability":"view","type":"function","name":"lockedAmount","inputs":[{"name":"_lender","type":"address"}],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"nonpayable","type":"constructor","inputs":[{"name":"_lendingPoolCoreContract","type":"address"},{"name":"_lendingPoolLockContract","type":"address"},{"name":"_erc20TokenContract","type":"address"},{"name":"_protocolWallet","type":"address"},{"name":"_protocolFeesShare","type":"uint256"},{"name":"_maxCapitalEfficienty","type":"uint256"},{"name":"_whitelistEnabled","type":"bool"}],"outputs":[]},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"nonpayable","type":"function","name":"proposeOwner","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"claimOwnership","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"changeMaxCapitalEfficiency","inputs":[{"name":"_value","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"changeProtocolWallet","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"changeProtocolFeesShare","inputs":[{"name":"_value","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"setLoansPeripheralAddress","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"setLiquidationsPeripheralAddress","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"setLiquidityControlsAddress","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"changeWhitelistStatus","inputs":[{"name":"_flag","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"addWhitelistedAddress","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"removeWhitelistedAddress","inputs":[{"name":"_address","type":"address"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"changePoolStatus","inputs":[{"name":"_flag","type":"bool"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deprecate","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"deposit","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"depositEth","inputs":[],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdraw","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"withdrawEth","inputs":[{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"sendFunds","inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"sendFundsEth","inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"receiveFundsEth","inputs":[{"name":"_borrower","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_rewardsAmount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"receiveFunds","inputs":[{"name":"_borrower","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_rewardsAmount","type":"uint256"}],"outputs":[]},{"stateMutability":"nonpayable","type":"function","name":"receiveFundsFromLiquidation","inputs":[{"name":"_borrower","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_rewardsAmount","type":"uint256"},{"name":"_distributeToProtocol","type":"bool"},{"name":"_investedAmount","type":"uint256"},{"name":"_origin","type":"string"}],"outputs":[]},{"stateMutability":"payable","type":"function","name":"receiveFundsFromLiquidationEth","inputs":[{"name":"_borrower","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_rewardsAmount","type":"uint256"},{"name":"_distributeToProtocol","type":"bool"},{"name":"_investedAmount","type":"uint256"},{"name":"_origin","type":"string"}],"outputs":[]},{"stateMutability":"view","type":"function","name":"owner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"proposedOwner","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"loansContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"lendingPoolCoreContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"lendingPoolLockContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"erc20TokenContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"liquidationsPeripheralContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"liquidityControlsContract","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"protocolWallet","inputs":[],"outputs":[{"name":"","type":"address"}]},{"stateMutability":"view","type":"function","name":"protocolFeesShare","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"maxCapitalEfficienty","inputs":[],"outputs":[{"name":"","type":"uint256"}]},{"stateMutability":"view","type":"function","name":"isPoolActive","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"isPoolDeprecated","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"isPoolInvesting","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"whitelistEnabled","inputs":[],"outputs":[{"name":"","type":"bool"}]},{"stateMutability":"view","type":"function","name":"whitelistedAddresses","inputs":[{"name":"arg0","type":"address"}],"outputs":[{"name":"","type":"bool"}]}]
Contract Creation Code
602061425b6000396000518060a01c61425657604052602061427b6000396000518060a01c61425657606052602061429b6000396000518060a01c6142565760805260206142bb6000396000518060a01c6142565760a052602061431b6000396000518060011c6142565760c05234614256576040516100d857601b60e0527f6164647265737320697320746865207a65726f206164647265737300000000006101005260e05060e0518061010001601f826000031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b60805161013e57601b60e0527f6164647265737320697320746865207a65726f206164647265737300000000006101005260e05060e0518061010001601f826000031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b60a0516101a457601b60e0527f6164647265737320697320746865207a65726f206164647265737300000000006101005260e05060e0518061010001601f826000031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b61271060206142db600039600051111561021757601c60e0527f66656573207368617265206578636565647320313030303020627073000000006101005260e05060e0518061010001601f826000031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b61271060206142fb600039600051111561028a57601d60e0527f6361706974616c206566662065786365656473203130303030206270730000006101005260e05060e0518061010001601f826000031636823750506308c379a060a052602060c052601f19601f60e051011660440160bcfd5b33600055604051600355606051600455608051613f6c5260a05160075560206142db60003960005160085560206142fb6000396000516009556001600a5560c051156102d75760c051600d555b613f6c6102e961000039613f8c610000f36003361161000c576122b7565b60003560e01c63439370b1811861007d5760043610613f5a57337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336102c052346102e05260406102c0a260035460405234606052610069613e86565b3461014052306101605261007b6129a6565b005b6312d8f916811861020f5760643610613f5a576004358060a01c613f5a5761048052346104a0526104a05161011257601e6104c0527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b602435604435808201828110613f5a57905090506104a051181561019657601e6104c0527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336104c052602435604435808201828110613f5a57905090506104e05260406104c0a26003546040526104a0516060526101f0613e86565b6104805161038052306103a052604060246103c03761020d6139db565b005b63243ee75d81186103765760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a5780358061050052602082018035610520525050503461054052602435604435808201828110613f5a57905090506105405118156102ec57601e610560527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336105605261054051610580526040610560a260035460405261054051606052610336613e86565b6104c05161038052306103a052604060246103c0376104e0516104005260843561042052610500518061044052610520516104605250610374613bf5565b005b63172b8500811861039e5760043610613f5a5734613f5a57602061039a60c06126dd565b60c0f35b632b90f8da81186103cb5760043610613f5a5734613f5a57602060006040526103c760e06127bc565b60e0f35b63ef595e5981186103f95760243610613f5a5734613f5a5760206004356040526103f560e06127bc565b60e0f35b633a89ced181186104865760243610613f5a576004358060a01c613f5a5760405234613f5a5760a060035463e2ae93fb60605260405160805260a060606024607c845afa61044c573d600060003e3d6000fd5b60a03d10613f5a57606051610120526080516101405260a0516101605260c0516101805260e0518060011c613f5a576101a0526101209050f35b63a153e70881186105625760243610613f5a576004358060a01c613f5a5760405234613f5a57600654635fd05249606052602060606004607c845afa6104d1573d600060003e3d6000fd5b60203d10613f5a576060518060011c613f5a5760a05260a09050516104fe57600060c052602060c0610560565b60045463ebdef1d360a05260405160c052604060a0602460bc845afa610529573d600060003e3d6000fd5b60403d10613f5a5760a09050805160605260208101516080525042606051101561055b57600060a052602060a0610560565b602060805bf35b63b5ed298a81186107715760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156105ef57601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161065357601c6060527f5f6164647265737320697420746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600054186106bb5760206060527f70726f706f736564206f776e6572206164647220697320746865206f776e657260805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001541861072357601f6060527f70726f706f736564206f776e65722061646472206973207468652073616d650060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001556040516000547fb4c8aadbed5e1d6c2b41b85b2a233853a33c3f9284159abad98bf7d24d5a6f746000546060526040516080526020613f6c60003960005160a05260606060a3005b634e71e0c881186108435760043610613f5a5734613f5a576001543318156107f057601e6040527f6d73672e73656e646572206973206e6f74207468652070726f706f736564000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001546000547fd5b903f8ba0e47f8a7bfe27b5098230bd3900b46d8b430e37480be7096ca7f6d6000546040526001546060526020613f6c60003960005160805260606040a36001546000556000600155005b63521dafde81186109e65760243610613f5a5734613f5a576000543318156108c257601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b612710600435111561092b57601d6040527f6361706974616c2065666620657863656564732031303030302062707300000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600954600435186109935760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517fb491624c5a1516b49b90734511615a87e4ded5220ea4f9dffbc445e1e729feb06009546040526004356060526020613f6c60003960005160805260606040a2600435600955005b6302df8fb28118610b925760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610a7357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610ad757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60075460405118610b3f5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f1ea3347149c73008cd0d341805c3c18b7038965560c1190774d3c4de398390bb6007546060526040516080526020613f6c60003960005160a05260606060a2604051600755005b6302888a2b8118610d355760243610613f5a5734613f5a57600054331815610c1157601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6127106004351115610c7a57601c6040527f666565732073686172652065786365656473203130303030206270730000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b60085460043518610ce25760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517f7890aed53fbf779ec76f35fb1fc7e05b091dd1fed9b766e73fcabe4f45c5010d6008546040526004356060526020613f6c60003960005160805260606040a2600435600855005b632305fe468118610f465760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610dc257601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610e2657601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b610e8b57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60025460405118610ef35760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f0524dd63c4e156d7c3f5cc18e87c0474a724ea2d75c277bab3dc95390ba5e4d16002546060526040516080526020613f6c60003960005160a05260606060a2604051600255005b63dfe5cf4e81186111575760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610fd357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161103757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b61109c57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600554604051186111045760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fd5cf3817f09a159f02f30e9ca8842239c472b01ce4ee28c5bd3dae53f1ed71b96005546060526040516080526020613f6c60003960005160a05260606060a2604051600555005b637eefa48781186113685760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156111e457601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161124857601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b6112ad57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600654604051186113155760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fc9dff19604a1a239924a95245890bf12b12dec6ce9529c14a187ffae033d63b06006546060526040516080526020613f6c60003960005160a05260606060a2604051600655005b63d2013c9281186114aa5760243610613f5a576004358060011c613f5a5760405234613f5a576000543318156113f557601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d541861145d5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d556020613f6c6000396000517fc216c05736611219062f8c847b62cd125972df155448dab8f40dbe52478c667f6040516060526020613f6c60003960005160805260406060a2005b6329975b4381186116cc5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561153757601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161159b57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546115ff5760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e6040516020526000526040600020541561167257601e6060527f6164647265737320697320616c72656164792077686974656c6973746564000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6001600e6040516020526000526040600020556020613f6c6000396000517f9a314065097149d1b802249c3157f5702a763e7debf83186e71de8961465c3416040516060526020613f6c60003960005160805260406060a2005b63530cd5ab81186118ed5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561175957601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516117bd57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546118215760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e60405160205260005260406000205461189357601a6060527f61646472657373206973206e6f742077686974656c697374656400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6000600e6040516020526000526040600020556020613f6c6000396000517fc409716545a0317597926477653ff23c349850a362ee8114c355e9f031cadb176040516060526020613f6c60003960005160805260406060a2005b6308ef62178118611aaf5760243610613f5a576004358060011c613f5a576101405234613f5a5760005433181561198457601b610160527f6d73672e73656e646572206973206e6f7420746865206f776e657200000000006101805261016050610160518061018001601f826000031636823750506308c379a061012052602061014052601f19601f61016051011660440161013cfd5b61014051600a55610140516119e0576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26000610160526020613f6c600039600051610180526040610160a25b610140516119ef576000611a12565b600c54611a0f57600060a052611a06610160612582565b61016051611a12565b60005b15611a64576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610180526020613f6c6000396000516101a0526040610180a25b6020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f261014051610160526020613f6c600039600051610180526040610160a2005b630fcc0c288118611c6b5760043610613f5a5734613f5a57600054331815611b2e57601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600b5415611b9357601a6040527f706f6f6c20697320616c7265616479206465707265636174656400000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001600b556000600a556000600c556020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517fdd10c817d080a89ad8dd5d6c365f18b6eed6b4c4c66bd37933429277d3ae3da76020613f6c60003960005160405260206040a2005b63b6b55f258118611d225760243610613f5a5734613f5a5733604052600354606052600435608052611c9e6102c0612357565b6102c051611d0c5760186102e0527f6e6f7420656e6f7567682066756e647320616c6c6f7765640000000000000000610300526102e0506102e0518061030001601f826000031636823750506308c379a06102a05260206102c052601f19601f6102e05101166044016102bcfd5b600435610140523361016052611d206129a6565b005b632e1a7d4d8118611d505760243610613f5a5734613f5a57600435610140523361016052611d4e612e57565b005b63c311d0498118611d905760243610613f5a5734613f5a57600435610140523061016052611d7c612e57565b33604052600435606052611d8e613dfc565b005b636f64234e8118611dd85760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052610260516101605260243561018052611dd6613279565b005b638396b88a8118611e325760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052306101605260243561018052611e1b613279565b61026051604052602435606052611e30613dfc565b005b6315e7c65a8118611f185760643610613f5a576004358060a01c613f5a576104805234613f5a5761048051604052600354606052602435604435808201828110613f5a5790509050608052611e886104a0612357565b6104a051611ef65760166104c0527f696e73756666696369656e74206c6971756964697479000000000000000000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104805161038052610480516103a052604060246103c037611f166139db565b005b63d484551181186120515760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a57803580610500526020820180356105205250505034613f5a576104c051604052600354606052602435604435808201828110613f5a5790509050608052611fa0610540612357565b6105405161200e576016610560527f696e73756666696369656e74206c6971756964697479000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b6104c051610380526104c0516103a052604060246103c0376104e051610400526084356104205261050051806104405261052051610460525061204f613bf5565b005b638da5cb5b81186120755760043610613f5a5734613f5a5760005460405260206040f35b63d153b60c81186120995760043610613f5a5734613f5a5760015460405260206040f35b6399c91fc481186120bd5760043610613f5a5734613f5a5760025460405260206040f35b63a6def0a081186120e15760043610613f5a5734613f5a5760035460405260206040f35b632c57b1fb81186121055760043610613f5a5734613f5a5760045460405260206040f35b63856e848881186121315760043610613f5a5734613f5a576020613f6c60003960005160405260206040f35b638f00990681186121555760043610613f5a5734613f5a5760055460405260206040f35b63bfe767ea81186121795760043610613f5a5734613f5a5760065460405260206040f35b6306d6e63f811861219d5760043610613f5a5734613f5a5760075460405260206040f35b63afda13e981186121c15760043610613f5a5734613f5a5760085460405260206040f35b63af3f081c81186121e55760043610613f5a5734613f5a5760095460405260206040f35b63df868ed381186122095760043610613f5a5734613f5a57600a5460405260206040f35b63e76977e8811861222d5760043610613f5a5734613f5a57600b5460405260206040f35b63ab8f5b3c81186122515760043610613f5a5734613f5a57600c5460405260206040f35b6351fb012d81186122755760043610613f5a5734613f5a57600d5460405260206040f35b6306c933d881186122b55760243610613f5a576004358060a01c613f5a5760405234613f5a57600e60405160205260005260406000205460605260206060f35b505b6020613f6c60003960005133181561232657601f6040527f6d73672e73656e646572206973206e6f7420746865205745544820616464720060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336040523460605260406040a2005b6020613f6c60003960005163dd62ed3e60c05260405160e05260605161010052602060c0604460dc845afa612391573d600060003e3d6000fd5b60203d10613f5a5760c090505160a05260a0516080511115815250565b604051606051808201828110613f5a57905090506123d057600081525061240e565b608051606051612710810281612710820418613f5a579050604051606051808201828110613f5a57905090508015613f5a5780820490509050108152505b565b600354634fe0bd1e60e052602060e0600460fc845afa612435573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808201828110613f5a579050905060c052600354630c042367610100526020610100600461011c845afa61247e573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e0516060526009546080526124ac6101006123ae565b61010051815250565b600354634fe0bd1e610100526020610100600461011c845afa6124dd573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060c051808201828110613f5a579050905060e052600354630c042367610120526020610120600461013c845afa612538573d600060003e3d6000fd5b60203d10613f5a5761012090505160a051808203828111613f5a57905090506101005260e051604052610100516060526009546080526125796101206123ae565b61012051815250565b600354634fe0bd1e60e052602060e0600460fc845afa6125a7573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa6125f0573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e05160605260095460805261261e6101006123ae565b61010051815250565b600354634fe0bd1e60e052602060e0600460fc845afa61264c573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa612695573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060e05260c05160405260e0516060526009546080526126d46101006123ae565b61010051815250565b600354634fe0bd1e606052602060606004607c845afa612702573d600060003e3d6000fd5b60203d10613f5a576060905051604052600354630c042367608052602060806004609c845afa612737573d600060003e3d6000fd5b60203d10613f5a576080905051606052604051606051808201828110613f5a579050905060095480612710036127108111613f5a579050808202811583838304141715613f5a57905090506127108104905060805260405160805111156127a25760008152506127ba565b604051608051808203828111613f5a57905090508152505b565b600354634fe0bd1e608052602060806004609c845afa6127e1573d600060003e3d6000fd5b60203d10613f5a576080905051606052600354630c04236760a052602060a0600460bc845afa612816573d600060003e3d6000fd5b60203d10613f5a5760a0905051608052606051608051808201828110613f5a5790509050604051808201828110613f5a5790509050600954808202811583838304141715613f5a5790509050612710810490508152505661287c573d600060003e3d6000fd5b60403d10613f5a57608090505160605242606051116128da57426006546337f5c136608052602060806004609c845afa6128bb573d600060003e3d6000fd5b60203d10613f5a576080905051808201828110613f5a57905090506060525b606051815250565b60045463ebdef1d360c0523360e052604060c0602460dc845afa61290b573d600060003e3d6000fd5b60403d10613f5a5760c090508051608052602081015160a0525042608051111561295757608051815260a051606051808201828110613f5a57905090506020820152506129a4566129a4565b426006546337f5c13660c052602060c0600460dc845afa61297d573d600060003e3d6000fd5b60203d10613f5a5760c0905051808201828110613f5a579050905081526060516020820152505b565b600b5415612a1457601c610180527f706f6f6c20697320646570726563617465642c207769746864726177000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600a54612a8157601c610180527f706f6f6c206973206e6f7420616374697665207269676874206e6f77000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b61014051612aef57601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60065463a1cdb11a6101a052336101c052610140516101e05230610200526003546102205261014051604052612b266101806127bc565b610180516102405260206101a060a46101bc845afa612b4a573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761026052610260905051612bd2576018610280527f6d617820706f6f6c2073686172652073757270617373656400000000000000006102a0526102805061028051806102a001601f826000031636823750506308c379a061024052602061026052601f19601f61028051011660440161025cfd5b600d54612be0576000612bf1565b600e33602052600052604060002054155b15612c5c57601d610180527f6d73672e73656e646572206973206e6f742077686974656c69737465640000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600c54612c7e576101405160a052612c75610180612410565b61018051612c81565b60005b15612cd3576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260016101a0526020613f6c6000396000516101c05260406101a0a25b604036610180373360405261014051606052612cf06101c06128e2565b6101c080516101805260208101516101a05250600354638340f5496101c052336101e0526101605161020052610140516102205260206101c060646101dc6000855af1612d42573d600060003e3d6000fd5b60203d10613f5a576101c0518060011c613f5a5761024052610240905051612dca576016610260527f6572726f72206372656174696e67206465706f736974000000000000000000006102805261026050610260518061028001601f826000031636823750506308c379a061022052602061024052601f19601f61026051011660440161023cfd5b60045463daa77c396101c052336101e0526101a051610200526101805161022052803b15613f5a5760006101c060646101dc6000855af1612e10573d600060003e3d6000fd5b50337f364bb76a44233df8584c690de6da7810626a5e77192f3ebc942c35bcb1add24f336101c052610140516101e0526020613f6c6000396000516102005260606101c0a2565b61014051612ec557601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60035463679a613c6101a052336101c05260206101a060246101bc845afa612ef2573d600060003e3d6000fd5b60203d10613f5a576101a09050516101805261014051610180511015612f7857601e6101a0527f5f616d6f756e74206d6f7265207468616e20776974686472617761626c6500006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600654632381cbd46101a052336101c0526101805161014051808203828111613f5a57905090506101e0526004546102005260206101a060646101bc845afa612fc6573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a576102205261022090505161304e57601b610240527f77697468647261772077697468696e206c6f636b20706572696f6400000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b61014051600354634fe0bd1e6101a05260206101a060046101bc845afa61307a573d600060003e3d6000fd5b60203d10613f5a576101a090505110156130f45760206101e0527f617661696c61626c652066756e6473206c657373207468616e20616d6f756e74610200526101e0506101e0518061020001601f826000031636823750506308c379a06101a05260206101c052601f19601f6101e05101166044016101bcfd5b600c5461310257600061311a565b6101405160a0526131146101a0612582565b6101a051155b1561316c576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b60035463d9caed126101a052336101c052610160516101e052610140516102005260206101a060646101bc6000855af16131ab573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761022052610220905051613233576017610240527f6572726f72207769746864726177696e672066756e64730000000000000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b337ff695acaf5d7d7346d00d5877a9b12de569a2d4957907b6dac09986f9070ddefd336101a052610140516101c0526020613f6c6000396000516101e05260606101a0a2565b600b54156132e75760126101a0527f706f6f6c206973206465707265636174656400000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600a546133545760106101a0527f706f6f6c20697320696e616374697665000000000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600c546133c15760176101a0527f6d6178206361706974616c2065666620726561636865640000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6002543318156134315760206101a0527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101405161349f5760176101a0527f5f746f20697320746865207a65726f20616464726573730000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101805161350d57601f6101a0527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6135186101a06126dd565b6101a05161018051111561358c5760166101c0527f696e73756666696369656e74206c6971756964697479000000000000000000006101e0526101c0506101c051806101e001601f826000031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b600c5461359a5760006135b2565b6101805160a0526135ac6101a0612627565b6101a051155b15613604576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b600354636f64234e6101a052610160516101c052610180516101e05260206101a060446101bc6000855af161363e573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a57610200526102009050516136c657601d610220527f6572726f722073656e64696e672066756e647320696e204c50436f72650000006102405261022050610220518061024001601f826000031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b610140517fef265aa5ba98d1c64ea9531227080a274c7f2e0adbfb9a36869e5dc6abcab581610140516101a052610180516101c0526020613f6c6000396000516101e05260606101a0a2565b600c5461373b576101a05160a0526101c05160c0526137326102606124b5565b6102605161373e565b60005b15613790576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610280526020613f6c6000396000516102a0526040610280a25b60035463286ed8f06102605261018051610280526101a0516102a0526101c0516102c052610200516102e0526020610260608461027c6000855af16137da573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576103005261030090505161386257601f610320527f6572726f7220726563656976696e672066756e647320696e204c50436f7265006103405261032050610320518061034001601f826000031636823750506308c379a06102e052602061030052601f19601f6103205101166044016102fcfd5b6101e05115613934576003546397f5e6fc6102605261018051610280526007546102a0526101e0516102c0526020610260606461027c6000855af16138ac573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576102e0526102e0905051613934576020610300527f6572726f72207472616e7366657272696e672070726f746f636f6c20666565736103205261030050610300518061032001601f826000031636823750506308c379a06102c05260206102e052601f19601f6103005101166044016102dcfd5b610160517f4e4b33f1df73b91c2a0524eadc8bf09d5f9d41c52697eac2dd50b5848cf2807b60e061016051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526020613f6c6000396000516103005280610320528061026001610220518082526020820161024051815250508051806020830101601f82600003163682375050601f19601f82516020010116905081019050610260a2565b600254331815613a4b576020610400527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b61038051613ab957601d610400527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103c0516103e051808201828110613f5a5790509050613b3957601e610400527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103e051600854808202811583838304141715613f5a579050905061271081049050610400526103e05161040051808203828111613f5a57905090506104205261038051610160526103a051610180526103c0516101a052610420516101c052610400516101e0526103c051610200526004610440527f6c6f616e00000000000000000000000000000000000000000000000000000000610460526104408051806102205260208201805161024052505050613bf3613712565b565b600554331815613c6557601d610480527f6d73672e73656e646572206973206e6f742074686520424e20616464720000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b61038051613cd357601d610480527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6103c0516103e051808201828110613f5a5790509050613d5357601e610480527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6040366104803761040051613d6f576103e0516104a052613db0565b6103e051600854808202811583838304141715613f5a579050905061271081049050610480526103e05161048051808203828111613f5a57905090506104a0525b61038051610160526103a051610180526103c0516101a0526104a0516101c052610480516101e0526104205161020052610440518061022052610460516102405250613dfa613712565b565b6020613f6c600039600051632e1a7d4d60805260605160a052803b15613f5a57600060806024609c6000855af1613e38573d600060003e3d6000fd5b5060006000600060006060516040516000f115613f5a576040517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc960405160805260605160a05260406080a2565b6020613f6c60003960005163d0e30db0608052803b15613f5a57600060806004609c606051855af1613ebd573d600060003e3d6000fd5b506020613f6c6000396000517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc96020613f6c60003960005160805260605160a05260406080a26020613f6c60003960005163095ea7b360805260405160a05260605160c052602060806044609c6000855af1613f3e573d600060003e3d6000fd5b60203d10613f5a576080518060011c613f5a5760e05260e05050565b600080fda165767970657283000307000b005b600080fd000000000000000000000000d74d518c7cda386eed0ce93df709093032ec8bcb00000000000000000000000027990214fe29e0e760b1af812872afc99cac3328000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005723759d679662cf931d686f129e3296d954519000000000000000000000000000000000000000000000000000000000000009c40000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6003361161000c576122b7565b60003560e01c63439370b1811861007d5760043610613f5a57337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336102c052346102e05260406102c0a260035460405234606052610069613e86565b3461014052306101605261007b6129a6565b005b6312d8f916811861020f5760643610613f5a576004358060a01c613f5a5761048052346104a0526104a05161011257601e6104c0527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b602435604435808201828110613f5a57905090506104a051181561019657601e6104c0527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336104c052602435604435808201828110613f5a57905090506104e05260406104c0a26003546040526104a0516060526101f0613e86565b6104805161038052306103a052604060246103c03761020d6139db565b005b63243ee75d81186103765760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a5780358061050052602082018035610520525050503461054052602435604435808201828110613f5a57905090506105405118156102ec57601e610560527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336105605261054051610580526040610560a260035460405261054051606052610336613e86565b6104c05161038052306103a052604060246103c0376104e0516104005260843561042052610500518061044052610520516104605250610374613bf5565b005b63172b8500811861039e5760043610613f5a5734613f5a57602061039a60c06126dd565b60c0f35b632b90f8da81186103cb5760043610613f5a5734613f5a57602060006040526103c760e06127bc565b60e0f35b63ef595e5981186103f95760243610613f5a5734613f5a5760206004356040526103f560e06127bc565b60e0f35b633a89ced181186104865760243610613f5a576004358060a01c613f5a5760405234613f5a5760a060035463e2ae93fb60605260405160805260a060606024607c845afa61044c573d600060003e3d6000fd5b60a03d10613f5a57606051610120526080516101405260a0516101605260c0516101805260e0518060011c613f5a576101a0526101209050f35b63a153e70881186105625760243610613f5a576004358060a01c613f5a5760405234613f5a57600654635fd05249606052602060606004607c845afa6104d1573d600060003e3d6000fd5b60203d10613f5a576060518060011c613f5a5760a05260a09050516104fe57600060c052602060c0610560565b60045463ebdef1d360a05260405160c052604060a0602460bc845afa610529573d600060003e3d6000fd5b60403d10613f5a5760a09050805160605260208101516080525042606051101561055b57600060a052602060a0610560565b602060805bf35b63b5ed298a81186107715760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156105ef57601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161065357601c6060527f5f6164647265737320697420746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600054186106bb5760206060527f70726f706f736564206f776e6572206164647220697320746865206f776e657260805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001541861072357601f6060527f70726f706f736564206f776e65722061646472206973207468652073616d650060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001556040516000547fb4c8aadbed5e1d6c2b41b85b2a233853a33c3f9284159abad98bf7d24d5a6f746000546060526040516080526020613f6c60003960005160a05260606060a3005b634e71e0c881186108435760043610613f5a5734613f5a576001543318156107f057601e6040527f6d73672e73656e646572206973206e6f74207468652070726f706f736564000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001546000547fd5b903f8ba0e47f8a7bfe27b5098230bd3900b46d8b430e37480be7096ca7f6d6000546040526001546060526020613f6c60003960005160805260606040a36001546000556000600155005b63521dafde81186109e65760243610613f5a5734613f5a576000543318156108c257601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b612710600435111561092b57601d6040527f6361706974616c2065666620657863656564732031303030302062707300000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600954600435186109935760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517fb491624c5a1516b49b90734511615a87e4ded5220ea4f9dffbc445e1e729feb06009546040526004356060526020613f6c60003960005160805260606040a2600435600955005b6302df8fb28118610b925760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610a7357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610ad757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60075460405118610b3f5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f1ea3347149c73008cd0d341805c3c18b7038965560c1190774d3c4de398390bb6007546060526040516080526020613f6c60003960005160a05260606060a2604051600755005b6302888a2b8118610d355760243610613f5a5734613f5a57600054331815610c1157601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6127106004351115610c7a57601c6040527f666565732073686172652065786365656473203130303030206270730000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b60085460043518610ce25760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517f7890aed53fbf779ec76f35fb1fc7e05b091dd1fed9b766e73fcabe4f45c5010d6008546040526004356060526020613f6c60003960005160805260606040a2600435600855005b632305fe468118610f465760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610dc257601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610e2657601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b610e8b57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60025460405118610ef35760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f0524dd63c4e156d7c3f5cc18e87c0474a724ea2d75c277bab3dc95390ba5e4d16002546060526040516080526020613f6c60003960005160a05260606060a2604051600255005b63dfe5cf4e81186111575760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610fd357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161103757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b61109c57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600554604051186111045760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fd5cf3817f09a159f02f30e9ca8842239c472b01ce4ee28c5bd3dae53f1ed71b96005546060526040516080526020613f6c60003960005160a05260606060a2604051600555005b637eefa48781186113685760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156111e457601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161124857601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b6112ad57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600654604051186113155760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fc9dff19604a1a239924a95245890bf12b12dec6ce9529c14a187ffae033d63b06006546060526040516080526020613f6c60003960005160a05260606060a2604051600655005b63d2013c9281186114aa5760243610613f5a576004358060011c613f5a5760405234613f5a576000543318156113f557601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d541861145d5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d556020613f6c6000396000517fc216c05736611219062f8c847b62cd125972df155448dab8f40dbe52478c667f6040516060526020613f6c60003960005160805260406060a2005b6329975b4381186116cc5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561153757601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161159b57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546115ff5760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e6040516020526000526040600020541561167257601e6060527f6164647265737320697320616c72656164792077686974656c6973746564000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6001600e6040516020526000526040600020556020613f6c6000396000517f9a314065097149d1b802249c3157f5702a763e7debf83186e71de8961465c3416040516060526020613f6c60003960005160805260406060a2005b63530cd5ab81186118ed5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561175957601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516117bd57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546118215760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e60405160205260005260406000205461189357601a6060527f61646472657373206973206e6f742077686974656c697374656400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6000600e6040516020526000526040600020556020613f6c6000396000517fc409716545a0317597926477653ff23c349850a362ee8114c355e9f031cadb176040516060526020613f6c60003960005160805260406060a2005b6308ef62178118611aaf5760243610613f5a576004358060011c613f5a576101405234613f5a5760005433181561198457601b610160527f6d73672e73656e646572206973206e6f7420746865206f776e657200000000006101805261016050610160518061018001601f826000031636823750506308c379a061012052602061014052601f19601f61016051011660440161013cfd5b61014051600a55610140516119e0576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26000610160526020613f6c600039600051610180526040610160a25b610140516119ef576000611a12565b600c54611a0f57600060a052611a06610160612582565b61016051611a12565b60005b15611a64576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610180526020613f6c6000396000516101a0526040610180a25b6020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f261014051610160526020613f6c600039600051610180526040610160a2005b630fcc0c288118611c6b5760043610613f5a5734613f5a57600054331815611b2e57601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600b5415611b9357601a6040527f706f6f6c20697320616c7265616479206465707265636174656400000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001600b556000600a556000600c556020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517fdd10c817d080a89ad8dd5d6c365f18b6eed6b4c4c66bd37933429277d3ae3da76020613f6c60003960005160405260206040a2005b63b6b55f258118611d225760243610613f5a5734613f5a5733604052600354606052600435608052611c9e6102c0612357565b6102c051611d0c5760186102e0527f6e6f7420656e6f7567682066756e647320616c6c6f7765640000000000000000610300526102e0506102e0518061030001601f826000031636823750506308c379a06102a05260206102c052601f19601f6102e05101166044016102bcfd5b600435610140523361016052611d206129a6565b005b632e1a7d4d8118611d505760243610613f5a5734613f5a57600435610140523361016052611d4e612e57565b005b63c311d0498118611d905760243610613f5a5734613f5a57600435610140523061016052611d7c612e57565b33604052600435606052611d8e613dfc565b005b636f64234e8118611dd85760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052610260516101605260243561018052611dd6613279565b005b638396b88a8118611e325760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052306101605260243561018052611e1b613279565b61026051604052602435606052611e30613dfc565b005b6315e7c65a8118611f185760643610613f5a576004358060a01c613f5a576104805234613f5a5761048051604052600354606052602435604435808201828110613f5a5790509050608052611e886104a0612357565b6104a051611ef65760166104c0527f696e73756666696369656e74206c6971756964697479000000000000000000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104805161038052610480516103a052604060246103c037611f166139db565b005b63d484551181186120515760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a57803580610500526020820180356105205250505034613f5a576104c051604052600354606052602435604435808201828110613f5a5790509050608052611fa0610540612357565b6105405161200e576016610560527f696e73756666696369656e74206c6971756964697479000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b6104c051610380526104c0516103a052604060246103c0376104e051610400526084356104205261050051806104405261052051610460525061204f613bf5565b005b638da5cb5b81186120755760043610613f5a5734613f5a5760005460405260206040f35b63d153b60c81186120995760043610613f5a5734613f5a5760015460405260206040f35b6399c91fc481186120bd5760043610613f5a5734613f5a5760025460405260206040f35b63a6def0a081186120e15760043610613f5a5734613f5a5760035460405260206040f35b632c57b1fb81186121055760043610613f5a5734613f5a5760045460405260206040f35b63856e848881186121315760043610613f5a5734613f5a576020613f6c60003960005160405260206040f35b638f00990681186121555760043610613f5a5734613f5a5760055460405260206040f35b63bfe767ea81186121795760043610613f5a5734613f5a5760065460405260206040f35b6306d6e63f811861219d5760043610613f5a5734613f5a5760075460405260206040f35b63afda13e981186121c15760043610613f5a5734613f5a5760085460405260206040f35b63af3f081c81186121e55760043610613f5a5734613f5a5760095460405260206040f35b63df868ed381186122095760043610613f5a5734613f5a57600a5460405260206040f35b63e76977e8811861222d5760043610613f5a5734613f5a57600b5460405260206040f35b63ab8f5b3c81186122515760043610613f5a5734613f5a57600c5460405260206040f35b6351fb012d81186122755760043610613f5a5734613f5a57600d5460405260206040f35b6306c933d881186122b55760243610613f5a576004358060a01c613f5a5760405234613f5a57600e60405160205260005260406000205460605260206060f35b505b6020613f6c60003960005133181561232657601f6040527f6d73672e73656e646572206973206e6f7420746865205745544820616464720060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336040523460605260406040a2005b6020613f6c60003960005163dd62ed3e60c05260405160e05260605161010052602060c0604460dc845afa612391573d600060003e3d6000fd5b60203d10613f5a5760c090505160a05260a0516080511115815250565b604051606051808201828110613f5a57905090506123d057600081525061240e565b608051606051612710810281612710820418613f5a579050604051606051808201828110613f5a57905090508015613f5a5780820490509050108152505b565b600354634fe0bd1e60e052602060e0600460fc845afa612435573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808201828110613f5a579050905060c052600354630c042367610100526020610100600461011c845afa61247e573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e0516060526009546080526124ac6101006123ae565b61010051815250565b600354634fe0bd1e610100526020610100600461011c845afa6124dd573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060c051808201828110613f5a579050905060e052600354630c042367610120526020610120600461013c845afa612538573d600060003e3d6000fd5b60203d10613f5a5761012090505160a051808203828111613f5a57905090506101005260e051604052610100516060526009546080526125796101206123ae565b61012051815250565b600354634fe0bd1e60e052602060e0600460fc845afa6125a7573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa6125f0573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e05160605260095460805261261e6101006123ae565b61010051815250565b600354634fe0bd1e60e052602060e0600460fc845afa61264c573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa612695573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060e05260c05160405260e0516060526009546080526126d46101006123ae565b61010051815250565b600354634fe0bd1e606052602060606004607c845afa612702573d600060003e3d6000fd5b60203d10613f5a576060905051604052600354630c042367608052602060806004609c845afa612737573d600060003e3d6000fd5b60203d10613f5a576080905051606052604051606051808201828110613f5a579050905060095480612710036127108111613f5a579050808202811583838304141715613f5a57905090506127108104905060805260405160805111156127a25760008152506127ba565b604051608051808203828111613f5a57905090508152505b565b600354634fe0bd1e608052602060806004609c845afa6127e1573d600060003e3d6000fd5b60203d10613f5a576080905051606052600354630c04236760a052602060a0600460bc845afa612816573d600060003e3d6000fd5b60203d10613f5a5760a0905051608052606051608051808201828110613f5a5790509050604051808201828110613f5a5790509050600954808202811583838304141715613f5a5790509050612710810490508152505661287c573d600060003e3d6000fd5b60403d10613f5a57608090505160605242606051116128da57426006546337f5c136608052602060806004609c845afa6128bb573d600060003e3d6000fd5b60203d10613f5a576080905051808201828110613f5a57905090506060525b606051815250565b60045463ebdef1d360c0523360e052604060c0602460dc845afa61290b573d600060003e3d6000fd5b60403d10613f5a5760c090508051608052602081015160a0525042608051111561295757608051815260a051606051808201828110613f5a57905090506020820152506129a4566129a4565b426006546337f5c13660c052602060c0600460dc845afa61297d573d600060003e3d6000fd5b60203d10613f5a5760c0905051808201828110613f5a579050905081526060516020820152505b565b600b5415612a1457601c610180527f706f6f6c20697320646570726563617465642c207769746864726177000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600a54612a8157601c610180527f706f6f6c206973206e6f7420616374697665207269676874206e6f77000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b61014051612aef57601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60065463a1cdb11a6101a052336101c052610140516101e05230610200526003546102205261014051604052612b266101806127bc565b610180516102405260206101a060a46101bc845afa612b4a573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761026052610260905051612bd2576018610280527f6d617820706f6f6c2073686172652073757270617373656400000000000000006102a0526102805061028051806102a001601f826000031636823750506308c379a061024052602061026052601f19601f61028051011660440161025cfd5b600d54612be0576000612bf1565b600e33602052600052604060002054155b15612c5c57601d610180527f6d73672e73656e646572206973206e6f742077686974656c69737465640000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600c54612c7e576101405160a052612c75610180612410565b61018051612c81565b60005b15612cd3576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260016101a0526020613f6c6000396000516101c05260406101a0a25b604036610180373360405261014051606052612cf06101c06128e2565b6101c080516101805260208101516101a05250600354638340f5496101c052336101e0526101605161020052610140516102205260206101c060646101dc6000855af1612d42573d600060003e3d6000fd5b60203d10613f5a576101c0518060011c613f5a5761024052610240905051612dca576016610260527f6572726f72206372656174696e67206465706f736974000000000000000000006102805261026050610260518061028001601f826000031636823750506308c379a061022052602061024052601f19601f61026051011660440161023cfd5b60045463daa77c396101c052336101e0526101a051610200526101805161022052803b15613f5a5760006101c060646101dc6000855af1612e10573d600060003e3d6000fd5b50337f364bb76a44233df8584c690de6da7810626a5e77192f3ebc942c35bcb1add24f336101c052610140516101e0526020613f6c6000396000516102005260606101c0a2565b61014051612ec557601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60035463679a613c6101a052336101c05260206101a060246101bc845afa612ef2573d600060003e3d6000fd5b60203d10613f5a576101a09050516101805261014051610180511015612f7857601e6101a0527f5f616d6f756e74206d6f7265207468616e20776974686472617761626c6500006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600654632381cbd46101a052336101c0526101805161014051808203828111613f5a57905090506101e0526004546102005260206101a060646101bc845afa612fc6573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a576102205261022090505161304e57601b610240527f77697468647261772077697468696e206c6f636b20706572696f6400000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b61014051600354634fe0bd1e6101a05260206101a060046101bc845afa61307a573d600060003e3d6000fd5b60203d10613f5a576101a090505110156130f45760206101e0527f617661696c61626c652066756e6473206c657373207468616e20616d6f756e74610200526101e0506101e0518061020001601f826000031636823750506308c379a06101a05260206101c052601f19601f6101e05101166044016101bcfd5b600c5461310257600061311a565b6101405160a0526131146101a0612582565b6101a051155b1561316c576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b60035463d9caed126101a052336101c052610160516101e052610140516102005260206101a060646101bc6000855af16131ab573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761022052610220905051613233576017610240527f6572726f72207769746864726177696e672066756e64730000000000000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b337ff695acaf5d7d7346d00d5877a9b12de569a2d4957907b6dac09986f9070ddefd336101a052610140516101c0526020613f6c6000396000516101e05260606101a0a2565b600b54156132e75760126101a0527f706f6f6c206973206465707265636174656400000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600a546133545760106101a0527f706f6f6c20697320696e616374697665000000000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600c546133c15760176101a0527f6d6178206361706974616c2065666620726561636865640000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6002543318156134315760206101a0527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101405161349f5760176101a0527f5f746f20697320746865207a65726f20616464726573730000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101805161350d57601f6101a0527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6135186101a06126dd565b6101a05161018051111561358c5760166101c0527f696e73756666696369656e74206c6971756964697479000000000000000000006101e0526101c0506101c051806101e001601f826000031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b600c5461359a5760006135b2565b6101805160a0526135ac6101a0612627565b6101a051155b15613604576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b600354636f64234e6101a052610160516101c052610180516101e05260206101a060446101bc6000855af161363e573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a57610200526102009050516136c657601d610220527f6572726f722073656e64696e672066756e647320696e204c50436f72650000006102405261022050610220518061024001601f826000031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b610140517fef265aa5ba98d1c64ea9531227080a274c7f2e0adbfb9a36869e5dc6abcab581610140516101a052610180516101c0526020613f6c6000396000516101e05260606101a0a2565b600c5461373b576101a05160a0526101c05160c0526137326102606124b5565b6102605161373e565b60005b15613790576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610280526020613f6c6000396000516102a0526040610280a25b60035463286ed8f06102605261018051610280526101a0516102a0526101c0516102c052610200516102e0526020610260608461027c6000855af16137da573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576103005261030090505161386257601f610320527f6572726f7220726563656976696e672066756e647320696e204c50436f7265006103405261032050610320518061034001601f826000031636823750506308c379a06102e052602061030052601f19601f6103205101166044016102fcfd5b6101e05115613934576003546397f5e6fc6102605261018051610280526007546102a0526101e0516102c0526020610260606461027c6000855af16138ac573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576102e0526102e0905051613934576020610300527f6572726f72207472616e7366657272696e672070726f746f636f6c20666565736103205261030050610300518061032001601f826000031636823750506308c379a06102c05260206102e052601f19601f6103005101166044016102dcfd5b610160517f4e4b33f1df73b91c2a0524eadc8bf09d5f9d41c52697eac2dd50b5848cf2807b60e061016051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526020613f6c6000396000516103005280610320528061026001610220518082526020820161024051815250508051806020830101601f82600003163682375050601f19601f82516020010116905081019050610260a2565b600254331815613a4b576020610400527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b61038051613ab957601d610400527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103c0516103e051808201828110613f5a5790509050613b3957601e610400527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103e051600854808202811583838304141715613f5a579050905061271081049050610400526103e05161040051808203828111613f5a57905090506104205261038051610160526103a051610180526103c0516101a052610420516101c052610400516101e0526103c051610200526004610440527f6c6f616e00000000000000000000000000000000000000000000000000000000610460526104408051806102205260208201805161024052505050613bf3613712565b565b600554331815613c6557601d610480527f6d73672e73656e646572206973206e6f742074686520424e20616464720000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b61038051613cd357601d610480527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6103c0516103e051808201828110613f5a5790509050613d5357601e610480527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6040366104803761040051613d6f576103e0516104a052613db0565b6103e051600854808202811583838304141715613f5a579050905061271081049050610480526103e05161048051808203828111613f5a57905090506104a0525b61038051610160526103a051610180526103c0516101a0526104a0516101c052610480516101e0526104205161020052610440518061022052610460516102405250613dfa613712565b565b6020613f6c600039600051632e1a7d4d60805260605160a052803b15613f5a57600060806024609c6000855af1613e38573d600060003e3d6000fd5b5060006000600060006060516040516000f115613f5a576040517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc960405160805260605160a05260406080a2565b6020613f6c60003960005163d0e30db0608052803b15613f5a57600060806004609c606051855af1613ebd573d600060003e3d6000fd5b506020613f6c6000396000517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc96020613f6c60003960005160805260605160a05260406080a26020613f6c60003960005163095ea7b360805260405160a05260605160c052602060806044609c6000855af1613f3e573d600060003e3d6000fd5b60203d10613f5a576080518060011c613f5a5760e05260e05050565b600080fda165767970657283000307000b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000d74d518c7cda386eed0ce93df709093032ec8bcb00000000000000000000000027990214fe29e0e760b1af812872afc99cac3328000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000005723759d679662cf931d686f129e3296d954519000000000000000000000000000000000000000000000000000000000000009c40000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _lendingPoolCoreContract (address): 0xd74d518C7Cda386Eed0Ce93DF709093032eC8bcb
Arg [1] : _lendingPoolLockContract (address): 0x27990214fE29E0e760b1aF812872afc99CAc3328
Arg [2] : _erc20TokenContract (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [3] : _protocolWallet (address): 0x5723759D679662cf931d686f129E3296D9545190
Arg [4] : _protocolFeesShare (uint256): 2500
Arg [5] : _maxCapitalEfficienty (uint256): 8000
Arg [6] : _whitelistEnabled (bool): True
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000d74d518c7cda386eed0ce93df709093032ec8bcb
Arg [1] : 00000000000000000000000027990214fe29e0e760b1af812872afc99cac3328
Arg [2] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [3] : 0000000000000000000000005723759d679662cf931d686f129e3296d9545190
Arg [4] : 00000000000000000000000000000000000000000000000000000000000009c4
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001f40
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.