More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 105 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Eth | 21380030 | 44 days ago | IN | 0 ETH | 0.00362408 | ||||
Withdraw Eth | 21170734 | 73 days ago | IN | 0 ETH | 0.0039427 | ||||
Withdraw Eth | 21170727 | 73 days ago | IN | 0 ETH | 0.00400972 | ||||
Withdraw Eth | 21163501 | 74 days ago | IN | 0 ETH | 0.00201608 | ||||
Withdraw Eth | 21084841 | 85 days ago | IN | 0 ETH | 0.00132626 | ||||
Withdraw Eth | 20861902 | 116 days ago | IN | 0 ETH | 0.0011792 | ||||
Withdraw Eth | 20642215 | 147 days ago | IN | 0 ETH | 0.00088234 | ||||
Deposit Eth | 20493654 | 168 days ago | IN | 2.6 ETH | 0.00134808 | ||||
Withdraw Eth | 20434166 | 176 days ago | IN | 0 ETH | 0.00201975 | ||||
Deposit Eth | 20429055 | 177 days ago | IN | 0.001 ETH | 0.00229095 | ||||
Deposit Eth | 20427978 | 177 days ago | IN | 0.001 ETH | 0.0039952 | ||||
Deposit Eth | 20340138 | 189 days ago | IN | 0.1 ETH | 0.00170406 | ||||
Withdraw Eth | 20311847 | 193 days ago | IN | 0 ETH | 0.00049575 | ||||
Withdraw Eth | 20219383 | 206 days ago | IN | 0 ETH | 0.00103585 | ||||
Withdraw Eth | 20188967 | 210 days ago | IN | 0 ETH | 0.00051983 | ||||
Withdraw Eth | 20168910 | 213 days ago | IN | 0 ETH | 0.00103248 | ||||
Deposit Eth | 20132321 | 218 days ago | IN | 0.364 ETH | 0.00192865 | ||||
Withdraw Eth | 20126783 | 219 days ago | IN | 0 ETH | 0.00107105 | ||||
Deposit Eth | 19978414 | 240 days ago | IN | 0.0455 ETH | 0.00219148 | ||||
Withdraw Eth | 19926609 | 247 days ago | IN | 0 ETH | 0.00262986 | ||||
Deposit Eth | 19924667 | 247 days ago | IN | 0.1 ETH | 0.00199126 | ||||
Withdraw Eth | 19882744 | 253 days ago | IN | 0 ETH | 0.00100045 | ||||
Withdraw Eth | 19867843 | 255 days ago | IN | 0 ETH | 0.00081637 | ||||
Withdraw Eth | 19867838 | 255 days ago | IN | 0 ETH | 0.00076741 | ||||
Withdraw Eth | 19867832 | 255 days ago | IN | 0 ETH | 0.00079909 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
21658229 | 5 days ago | 7.3 ETH | ||||
21658229 | 5 days ago | 7.3 ETH | ||||
21657736 | 5 days ago | 1.264405 ETH | ||||
21657736 | 5 days ago | 1.264405 ETH | ||||
21649376 | 6 days ago | 9.12303176 ETH | ||||
21649376 | 6 days ago | 9.12303176 ETH | ||||
21647513 | 7 days ago | 0.01650022 ETH | ||||
21647513 | 7 days ago | 0.01650022 ETH | ||||
21647512 | 7 days ago | 0.06412343 ETH | ||||
21647512 | 7 days ago | 0.06412343 ETH | ||||
21647510 | 7 days ago | 0.06412343 ETH | ||||
21647510 | 7 days ago | 0.06412343 ETH | ||||
21647508 | 7 days ago | 0.51198165 ETH | ||||
21647508 | 7 days ago | 0.51198165 ETH | ||||
21603127 | 13 days ago | 14.9747 ETH | ||||
21603127 | 13 days ago | 14.9747 ETH | ||||
21598710 | 13 days ago | 3.44244 ETH | ||||
21598710 | 13 days ago | 3.44244 ETH | ||||
21525316 | 24 days ago | 1.51504702 ETH | ||||
21525316 | 24 days ago | 1.51504702 ETH | ||||
21508516 | 26 days ago | 2.1375 ETH | ||||
21508516 | 26 days ago | 2.1375 ETH | ||||
21489343 | 29 days ago | 0.144915 ETH | ||||
21489343 | 29 days ago | 0.144915 ETH | ||||
21472642 | 31 days ago | 0.500466 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xa5DF70A7...CfdE5EA10 The constructor portion of the code might be different and could alter the actual behaviour of the contract
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
[{"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"}]}]
Deployed Bytecode
0x6003361161000c576122b7565b60003560e01c63439370b1811861007d5760043610613f5a57337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336102c052346102e05260406102c0a260035460405234606052610069613e86565b3461014052306101605261007b6129a6565b005b6312d8f916811861020f5760643610613f5a576004358060a01c613f5a5761048052346104a0526104a05161011257601e6104c0527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b602435604435808201828110613f5a57905090506104a051181561019657601e6104c0527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336104c052602435604435808201828110613f5a57905090506104e05260406104c0a26003546040526104a0516060526101f0613e86565b6104805161038052306103a052604060246103c03761020d6139db565b005b63243ee75d81186103765760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a5780358061050052602082018035610520525050503461054052602435604435808201828110613f5a57905090506105405118156102ec57601e610560527f7265637620616d6f756e74206e6f74206d61746368207061727469616c7300006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336105605261054051610580526040610560a260035460405261054051606052610336613e86565b6104c05161038052306103a052604060246103c0376104e0516104005260843561042052610500518061044052610520516104605250610374613bf5565b005b63172b8500811861039e5760043610613f5a5734613f5a57602061039a60c06126dd565b60c0f35b632b90f8da81186103cb5760043610613f5a5734613f5a57602060006040526103c760e06127bc565b60e0f35b63ef595e5981186103f95760243610613f5a5734613f5a5760206004356040526103f560e06127bc565b60e0f35b633a89ced181186104865760243610613f5a576004358060a01c613f5a5760405234613f5a5760a060035463e2ae93fb60605260405160805260a060606024607c845afa61044c573d600060003e3d6000fd5b60a03d10613f5a57606051610120526080516101405260a0516101605260c0516101805260e0518060011c613f5a576101a0526101209050f35b63a153e70881186105625760243610613f5a576004358060a01c613f5a5760405234613f5a57600654635fd05249606052602060606004607c845afa6104d1573d600060003e3d6000fd5b60203d10613f5a576060518060011c613f5a5760a05260a09050516104fe57600060c052602060c0610560565b60045463ebdef1d360a05260405160c052604060a0602460bc845afa610529573d600060003e3d6000fd5b60403d10613f5a5760a09050805160605260208101516080525042606051101561055b57600060a052602060a0610560565b602060805bf35b63b5ed298a81186107715760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156105ef57601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161065357601c6060527f5f6164647265737320697420746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600054186106bb5760206060527f70726f706f736564206f776e6572206164647220697320746865206f776e657260805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001541861072357601f6060527f70726f706f736564206f776e65722061646472206973207468652073616d650060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516001556040516000547fb4c8aadbed5e1d6c2b41b85b2a233853a33c3f9284159abad98bf7d24d5a6f746000546060526040516080526020613f6c60003960005160a05260606060a3005b634e71e0c881186108435760043610613f5a5734613f5a576001543318156107f057601e6040527f6d73672e73656e646572206973206e6f74207468652070726f706f736564000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001546000547fd5b903f8ba0e47f8a7bfe27b5098230bd3900b46d8b430e37480be7096ca7f6d6000546040526001546060526020613f6c60003960005160805260606040a36001546000556000600155005b63521dafde81186109e65760243610613f5a5734613f5a576000543318156108c257601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b612710600435111561092b57601d6040527f6361706974616c2065666620657863656564732031303030302062707300000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600954600435186109935760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517fb491624c5a1516b49b90734511615a87e4ded5220ea4f9dffbc445e1e729feb06009546040526004356060526020613f6c60003960005160805260606040a2600435600955005b6302df8fb28118610b925760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610a7357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610ad757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60075460405118610b3f5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f1ea3347149c73008cd0d341805c3c18b7038965560c1190774d3c4de398390bb6007546060526040516080526020613f6c60003960005160a05260606060a2604051600755005b6302888a2b8118610d355760243610613f5a5734613f5a57600054331815610c1157601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6127106004351115610c7a57601c6040527f666565732073686172652065786365656473203130303030206270730000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b60085460043518610ce25760156040527f6e65772076616c7565206973207468652073616d65000000000000000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6020613f6c6000396000517f7890aed53fbf779ec76f35fb1fc7e05b091dd1fed9b766e73fcabe4f45c5010d6008546040526004356060526020613f6c60003960005160805260606040a2600435600855005b632305fe468118610f465760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610dc257601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051610e2657601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b610e8b57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60025460405118610ef35760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517f0524dd63c4e156d7c3f5cc18e87c0474a724ea2d75c277bab3dc95390ba5e4d16002546060526040516080526020613f6c60003960005160a05260606060a2604051600255005b63dfe5cf4e81186111575760243610613f5a576004358060a01c613f5a5760405234613f5a57600054331815610fd357601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161103757601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b61109c57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600554604051186111045760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fd5cf3817f09a159f02f30e9ca8842239c472b01ce4ee28c5bd3dae53f1ed71b96005546060526040516080526020613f6c60003960005160a05260606060a2604051600555005b637eefa48781186113685760243610613f5a576004358060a01c613f5a5760405234613f5a576000543318156111e457601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161124857601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040513b6112ad57601a6060527f5f61646472657373206973206e6f74206120636f6e747261637400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600654604051186113155760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6020613f6c6000396000517fc9dff19604a1a239924a95245890bf12b12dec6ce9529c14a187ffae033d63b06006546060526040516080526020613f6c60003960005160a05260606060a2604051600655005b63d2013c9281186114aa5760243610613f5a576004358060011c613f5a5760405234613f5a576000543318156113f557601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d541861145d5760156060527f6e65772076616c7565206973207468652073616d65000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b604051600d556020613f6c6000396000517fc216c05736611219062f8c847b62cd125972df155448dab8f40dbe52478c667f6040516060526020613f6c60003960005160805260406060a2005b6329975b4381186116cc5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561153757601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b60405161159b57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546115ff5760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e6040516020526000526040600020541561167257601e6060527f6164647265737320697320616c72656164792077686974656c6973746564000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6001600e6040516020526000526040600020556020613f6c6000396000517f9a314065097149d1b802249c3157f5702a763e7debf83186e71de8961465c3416040516060526020613f6c60003960005160805260406060a2005b63530cd5ab81186118ed5760243610613f5a576004358060a01c613f5a5760405234613f5a5760005433181561175957601b6060527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6040516117bd57601c6060527f5f6164647265737320697320746865207a65726f20616464726573730000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600d546118215760156060527f77686974656c6973742069732064697361626c6564000000000000000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b600e60405160205260005260406000205461189357601a6060527f61646472657373206973206e6f742077686974656c697374656400000000000060805260605060605180608001601f826000031636823750506308c379a06020526020604052601f19601f6060510116604401603cfd5b6000600e6040516020526000526040600020556020613f6c6000396000517fc409716545a0317597926477653ff23c349850a362ee8114c355e9f031cadb176040516060526020613f6c60003960005160805260406060a2005b6308ef62178118611aaf5760243610613f5a576004358060011c613f5a576101405234613f5a5760005433181561198457601b610160527f6d73672e73656e646572206973206e6f7420746865206f776e657200000000006101805261016050610160518061018001601f826000031636823750506308c379a061012052602061014052601f19601f61016051011660440161013cfd5b61014051600a55610140516119e0576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26000610160526020613f6c600039600051610180526040610160a25b610140516119ef576000611a12565b600c54611a0f57600060a052611a06610160612582565b61016051611a12565b60005b15611a64576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610180526020613f6c6000396000516101a0526040610180a25b6020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f261014051610160526020613f6c600039600051610180526040610160a2005b630fcc0c288118611c6b5760043610613f5a5734613f5a57600054331815611b2e57601b6040527f6d73672e73656e646572206973206e6f7420746865206f776e6572000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b600b5415611b9357601a6040527f706f6f6c20697320616c7265616479206465707265636174656400000000000060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b6001600b556000600a556000600c556020613f6c6000396000517ff1f3fb69901207764e1ded1276f81ef0e7d27d4c937f4290a397554a78b942f260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006040526020613f6c60003960005160605260406040a26020613f6c6000396000517fdd10c817d080a89ad8dd5d6c365f18b6eed6b4c4c66bd37933429277d3ae3da76020613f6c60003960005160405260206040a2005b63b6b55f258118611d225760243610613f5a5734613f5a5733604052600354606052600435608052611c9e6102c0612357565b6102c051611d0c5760186102e0527f6e6f7420656e6f7567682066756e647320616c6c6f7765640000000000000000610300526102e0506102e0518061030001601f826000031636823750506308c379a06102a05260206102c052601f19601f6102e05101166044016102bcfd5b600435610140523361016052611d206129a6565b005b632e1a7d4d8118611d505760243610613f5a5734613f5a57600435610140523361016052611d4e612e57565b005b63c311d0498118611d905760243610613f5a5734613f5a57600435610140523061016052611d7c612e57565b33604052600435606052611d8e613dfc565b005b636f64234e8118611dd85760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052610260516101605260243561018052611dd6613279565b005b638396b88a8118611e325760443610613f5a576004358060a01c613f5a576102605234613f5a576102605161014052306101605260243561018052611e1b613279565b61026051604052602435606052611e30613dfc565b005b6315e7c65a8118611f185760643610613f5a576004358060a01c613f5a576104805234613f5a5761048051604052600354606052602435604435808201828110613f5a5790509050608052611e886104a0612357565b6104a051611ef65760166104c0527f696e73756666696369656e74206c6971756964697479000000000000000000006104e0526104c0506104c051806104e001601f826000031636823750506308c379a06104805260206104a052601f19601f6104c051011660440161049cfd5b6104805161038052610480516103a052604060246103c037611f166139db565b005b63d484551181186120515760e43610613f5a576004358060a01c613f5a576104c0526064358060011c613f5a576104e05260a435600401601e813511613f5a57803580610500526020820180356105205250505034613f5a576104c051604052600354606052602435604435808201828110613f5a5790509050608052611fa0610540612357565b6105405161200e576016610560527f696e73756666696369656e74206c6971756964697479000000000000000000006105805261056050610560518061058001601f826000031636823750506308c379a061052052602061054052601f19601f61056051011660440161053cfd5b6104c051610380526104c0516103a052604060246103c0376104e051610400526084356104205261050051806104405261052051610460525061204f613bf5565b005b638da5cb5b81186120755760043610613f5a5734613f5a5760005460405260206040f35b63d153b60c81186120995760043610613f5a5734613f5a5760015460405260206040f35b6399c91fc481186120bd5760043610613f5a5734613f5a5760025460405260206040f35b63a6def0a081186120e15760043610613f5a5734613f5a5760035460405260206040f35b632c57b1fb81186121055760043610613f5a5734613f5a5760045460405260206040f35b63856e848881186121315760043610613f5a5734613f5a576020613f6c60003960005160405260206040f35b638f00990681186121555760043610613f5a5734613f5a5760055460405260206040f35b63bfe767ea81186121795760043610613f5a5734613f5a5760065460405260206040f35b6306d6e63f811861219d5760043610613f5a5734613f5a5760075460405260206040f35b63afda13e981186121c15760043610613f5a5734613f5a5760085460405260206040f35b63af3f081c81186121e55760043610613f5a5734613f5a5760095460405260206040f35b63df868ed381186122095760043610613f5a5734613f5a57600a5460405260206040f35b63e76977e8811861222d5760043610613f5a5734613f5a57600b5460405260206040f35b63ab8f5b3c81186122515760043610613f5a5734613f5a57600c5460405260206040f35b6351fb012d81186122755760043610613f5a5734613f5a57600d5460405260206040f35b6306c933d881186122b55760243610613f5a576004358060a01c613f5a5760405234613f5a57600e60405160205260005260406000205460605260206060f35b505b6020613f6c60003960005133181561232657601f6040527f6d73672e73656e646572206973206e6f7420746865205745544820616464720060605260405060405180606001601f826000031636823750506308c379a06000526020602052601f19601f6040510116604401601cfd5b337f45fdc265dc29885b9a485766b03e70978440d38c7c328ee0a14fa40c76c6af54336040523460605260406040a2005b6020613f6c60003960005163dd62ed3e60c05260405160e05260605161010052602060c0604460dc845afa612391573d600060003e3d6000fd5b60203d10613f5a5760c090505160a05260a0516080511115815250565b604051606051808201828110613f5a57905090506123d057600081525061240e565b608051606051612710810281612710820418613f5a579050604051606051808201828110613f5a57905090508015613f5a5780820490509050108152505b565b600354634fe0bd1e60e052602060e0600460fc845afa612435573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808201828110613f5a579050905060c052600354630c042367610100526020610100600461011c845afa61247e573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e0516060526009546080526124ac6101006123ae565b61010051815250565b600354634fe0bd1e610100526020610100600461011c845afa6124dd573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060c051808201828110613f5a579050905060e052600354630c042367610120526020610120600461013c845afa612538573d600060003e3d6000fd5b60203d10613f5a5761012090505160a051808203828111613f5a57905090506101005260e051604052610100516060526009546080526125796101206123ae565b61012051815250565b600354634fe0bd1e60e052602060e0600460fc845afa6125a7573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa6125f0573d600060003e3d6000fd5b60203d10613f5a5761010090505160e05260c05160405260e05160605260095460805261261e6101006123ae565b61010051815250565b600354634fe0bd1e60e052602060e0600460fc845afa61264c573d600060003e3d6000fd5b60203d10613f5a5760e090505160a051808203828111613f5a579050905060c052600354630c042367610100526020610100600461011c845afa612695573d600060003e3d6000fd5b60203d10613f5a5761010090505160a051808201828110613f5a579050905060e05260c05160405260e0516060526009546080526126d46101006123ae565b61010051815250565b600354634fe0bd1e606052602060606004607c845afa612702573d600060003e3d6000fd5b60203d10613f5a576060905051604052600354630c042367608052602060806004609c845afa612737573d600060003e3d6000fd5b60203d10613f5a576080905051606052604051606051808201828110613f5a579050905060095480612710036127108111613f5a579050808202811583838304141715613f5a57905090506127108104905060805260405160805111156127a25760008152506127ba565b604051608051808203828111613f5a57905090508152505b565b600354634fe0bd1e608052602060806004609c845afa6127e1573d600060003e3d6000fd5b60203d10613f5a576080905051606052600354630c04236760a052602060a0600460bc845afa612816573d600060003e3d6000fd5b60203d10613f5a5760a0905051608052606051608051808201828110613f5a5790509050604051808201828110613f5a5790509050600954808202811583838304141715613f5a5790509050612710810490508152505661287c573d600060003e3d6000fd5b60403d10613f5a57608090505160605242606051116128da57426006546337f5c136608052602060806004609c845afa6128bb573d600060003e3d6000fd5b60203d10613f5a576080905051808201828110613f5a57905090506060525b606051815250565b60045463ebdef1d360c0523360e052604060c0602460dc845afa61290b573d600060003e3d6000fd5b60403d10613f5a5760c090508051608052602081015160a0525042608051111561295757608051815260a051606051808201828110613f5a57905090506020820152506129a4566129a4565b426006546337f5c13660c052602060c0600460dc845afa61297d573d600060003e3d6000fd5b60203d10613f5a5760c0905051808201828110613f5a579050905081526060516020820152505b565b600b5415612a1457601c610180527f706f6f6c20697320646570726563617465642c207769746864726177000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600a54612a8157601c610180527f706f6f6c206973206e6f7420616374697665207269676874206e6f77000000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b61014051612aef57601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60065463a1cdb11a6101a052336101c052610140516101e05230610200526003546102205261014051604052612b266101806127bc565b610180516102405260206101a060a46101bc845afa612b4a573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761026052610260905051612bd2576018610280527f6d617820706f6f6c2073686172652073757270617373656400000000000000006102a0526102805061028051806102a001601f826000031636823750506308c379a061024052602061026052601f19601f61028051011660440161025cfd5b600d54612be0576000612bf1565b600e33602052600052604060002054155b15612c5c57601d610180527f6d73672e73656e646572206973206e6f742077686974656c69737465640000006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b600c54612c7e576101405160a052612c75610180612410565b61018051612c81565b60005b15612cd3576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260016101a0526020613f6c6000396000516101c05260406101a0a25b604036610180373360405261014051606052612cf06101c06128e2565b6101c080516101805260208101516101a05250600354638340f5496101c052336101e0526101605161020052610140516102205260206101c060646101dc6000855af1612d42573d600060003e3d6000fd5b60203d10613f5a576101c0518060011c613f5a5761024052610240905051612dca576016610260527f6572726f72206372656174696e67206465706f736974000000000000000000006102805261026050610260518061028001601f826000031636823750506308c379a061022052602061024052601f19601f61026051011660440161023cfd5b60045463daa77c396101c052336101e0526101a051610200526101805161022052803b15613f5a5760006101c060646101dc6000855af1612e10573d600060003e3d6000fd5b50337f364bb76a44233df8584c690de6da7810626a5e77192f3ebc942c35bcb1add24f336101c052610140516101e0526020613f6c6000396000516102005260606101c0a2565b61014051612ec557601f610180527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101a0526101805061018051806101a001601f826000031636823750506308c379a061014052602061016052601f19601f61018051011660440161015cfd5b60035463679a613c6101a052336101c05260206101a060246101bc845afa612ef2573d600060003e3d6000fd5b60203d10613f5a576101a09050516101805261014051610180511015612f7857601e6101a0527f5f616d6f756e74206d6f7265207468616e20776974686472617761626c6500006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600654632381cbd46101a052336101c0526101805161014051808203828111613f5a57905090506101e0526004546102005260206101a060646101bc845afa612fc6573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a576102205261022090505161304e57601b610240527f77697468647261772077697468696e206c6f636b20706572696f6400000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b61014051600354634fe0bd1e6101a05260206101a060046101bc845afa61307a573d600060003e3d6000fd5b60203d10613f5a576101a090505110156130f45760206101e0527f617661696c61626c652066756e6473206c657373207468616e20616d6f756e74610200526101e0506101e0518061020001601f826000031636823750506308c379a06101a05260206101c052601f19601f6101e05101166044016101bcfd5b600c5461310257600061311a565b6101405160a0526131146101a0612582565b6101a051155b1561316c576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b60035463d9caed126101a052336101c052610160516101e052610140516102005260206101a060646101bc6000855af16131ab573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a5761022052610220905051613233576017610240527f6572726f72207769746864726177696e672066756e64730000000000000000006102605261024050610240518061026001601f826000031636823750506308c379a061020052602061022052601f19601f61024051011660440161021cfd5b337ff695acaf5d7d7346d00d5877a9b12de569a2d4957907b6dac09986f9070ddefd336101a052610140516101c0526020613f6c6000396000516101e05260606101a0a2565b600b54156132e75760126101a0527f706f6f6c206973206465707265636174656400000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600a546133545760106101a0527f706f6f6c20697320696e616374697665000000000000000000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b600c546133c15760176101a0527f6d6178206361706974616c2065666620726561636865640000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6002543318156134315760206101a0527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101405161349f5760176101a0527f5f746f20697320746865207a65726f20616464726573730000000000000000006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6101805161350d57601f6101a0527f5f616d6f756e742068617320746f20626520686967686572207468616e2030006101c0526101a0506101a051806101c001601f826000031636823750506308c379a061016052602061018052601f19601f6101a051011660440161017cfd5b6135186101a06126dd565b6101a05161018051111561358c5760166101c0527f696e73756666696369656e74206c6971756964697479000000000000000000006101e0526101c0506101c051806101e001601f826000031636823750506308c379a06101805260206101a052601f19601f6101c051011660440161019cfd5b600c5461359a5760006135b2565b6101805160a0526135ac6101a0612627565b6101a051155b15613604576000600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd260006101c0526020613f6c6000396000516101e05260406101c0a25b600354636f64234e6101a052610160516101c052610180516101e05260206101a060446101bc6000855af161363e573d600060003e3d6000fd5b60203d10613f5a576101a0518060011c613f5a57610200526102009050516136c657601d610220527f6572726f722073656e64696e672066756e647320696e204c50436f72650000006102405261022050610220518061024001601f826000031636823750506308c379a06101e052602061020052601f19601f6102205101166044016101fcfd5b610140517fef265aa5ba98d1c64ea9531227080a274c7f2e0adbfb9a36869e5dc6abcab581610140516101a052610180516101c0526020613f6c6000396000516101e05260606101a0a2565b600c5461373b576101a05160a0526101c05160c0526137326102606124b5565b6102605161373e565b60005b15613790576001600c556020613f6c6000396000517f9136d07d94f43079b2383d0eba9b902ae8e9daaf38292d3d4645fc53d650ecd26001610280526020613f6c6000396000516102a0526040610280a25b60035463286ed8f06102605261018051610280526101a0516102a0526101c0516102c052610200516102e0526020610260608461027c6000855af16137da573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576103005261030090505161386257601f610320527f6572726f7220726563656976696e672066756e647320696e204c50436f7265006103405261032050610320518061034001601f826000031636823750506308c379a06102e052602061030052601f19601f6103205101166044016102fcfd5b6101e05115613934576003546397f5e6fc6102605261018051610280526007546102a0526101e0516102c0526020610260606461027c6000855af16138ac573d600060003e3d6000fd5b60203d10613f5a57610260518060011c613f5a576102e0526102e0905051613934576020610300527f6572726f72207472616e7366657272696e672070726f746f636f6c20666565736103205261030050610300518061032001601f826000031636823750506308c379a06102c05260206102e052601f19601f6103005101166044016102dcfd5b610160517f4e4b33f1df73b91c2a0524eadc8bf09d5f9d41c52697eac2dd50b5848cf2807b60e061016051610260526101a051610280526101c0516102a0526101e0516102c052610200516102e0526020613f6c6000396000516103005280610320528061026001610220518082526020820161024051815250508051806020830101601f82600003163682375050601f19601f82516020010116905081019050610260a2565b600254331815613a4b576020610400527f6d73672e73656e646572206973206e6f7420746865206c6f616e7320616464726104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b61038051613ab957601d610400527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103c0516103e051808201828110613f5a5790509050613b3957601e610400527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104205261040050610400518061042001601f826000031636823750506308c379a06103c05260206103e052601f19601f6104005101166044016103dcfd5b6103e051600854808202811583838304141715613f5a579050905061271081049050610400526103e05161040051808203828111613f5a57905090506104205261038051610160526103a051610180526103c0516101a052610420516101c052610400516101e0526103c051610200526004610440527f6c6f616e00000000000000000000000000000000000000000000000000000000610460526104408051806102205260208201805161024052505050613bf3613712565b565b600554331815613c6557601d610480527f6d73672e73656e646572206973206e6f742074686520424e20616464720000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b61038051613cd357601d610480527f5f626f72726f77657220697320746865207a65726f20616464726573730000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6103c0516103e051808201828110613f5a5790509050613d5357601e610480527f616d6f756e742073686f756c6420626520686967686572207468616e203000006104a0526104805061048051806104a001601f826000031636823750506308c379a061044052602061046052601f19601f61048051011660440161045cfd5b6040366104803761040051613d6f576103e0516104a052613db0565b6103e051600854808202811583838304141715613f5a579050905061271081049050610480526103e05161048051808203828111613f5a57905090506104a0525b61038051610160526103a051610180526103c0516101a0526104a0516101c052610480516101e0526104205161020052610440518061022052610460516102405250613dfa613712565b565b6020613f6c600039600051632e1a7d4d60805260605160a052803b15613f5a57600060806024609c6000855af1613e38573d600060003e3d6000fd5b5060006000600060006060516040516000f115613f5a576040517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc960405160805260605160a05260406080a2565b6020613f6c60003960005163d0e30db0608052803b15613f5a57600060806004609c606051855af1613ebd573d600060003e3d6000fd5b506020613f6c6000396000517fd52bd61f7c422d441e024604f4517878fd3305d6acf0fe37baef23ed21af6bc96020613f6c60003960005160805260605160a05260406080a26020613f6c60003960005163095ea7b360805260405160a05260605160c052602060806044609c6000855af1613f3e573d600060003e3d6000fd5b60203d10613f5a576080518060011c613f5a5760e05260e05050565b600080fda165767970657283000307000b000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.