ERC-20
Stablecoin
Overview
Max Total Supply
464,249.419253303638195252 eUSD
Holders
1,471 (0.00%)
Market
Price
$1.00 @ 0.000404 ETH (-0.08%)
Onchain Market Cap
$463,075.80
Circulating Supply Market Cap
$4,833,784.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.425360006788293198 eUSDValue
$0.42 ( ~0.000170049975552638 Eth) [0.0001%]Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Lybra
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import "./EUSD.sol"; import "./Governable.sol"; interface Ilido { function submit(address _referral) external payable returns (uint256 StETH); function withdraw(address _to) external returns (uint256 ETH); function balanceOf(address _account) external view returns (uint256); function transfer(address _recipient, uint256 _amount) external returns (bool); function transferFrom( address _sender, address _recipient, uint256 _amount ) external returns (bool); } interface LbrStakingPool { function notifyRewardAmount(uint256 amount) external; } interface esLBRMinter { function refreshReward(address user) external; } interface IPriceFeed { function fetchPrice() external returns (uint256); } contract Lybra is EUSD, Governable { uint256 public totalDepositedEther; uint256 public lastReportTime; uint256 public totalEUSDCirculation; uint256 year = 86400 * 365; uint256 public mintFeeApy = 150; uint256 public safeCollateralRate = 160 * 1e18; uint256 public immutable badCollateralRate = 150 * 1e18; uint256 public redemptionFee = 50; uint8 public keeperRate = 1; mapping(address => uint256) public depositedEther; mapping(address => uint256) borrowed; mapping(address => bool) redemptionProvider; uint256 public feeStored; Ilido lido = Ilido(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84); esLBRMinter public eslbrMinter; LbrStakingPool public serviceFeePool; event BorrowApyChanged(uint256 newApy); event SafeCollateralRateChanged(uint256 newRatio); event KeeperRateChanged(uint256 newSlippage); event RedemptionFeeChanged(uint256 newSlippage); event DepositEther( address sponsor, address indexed onBehalfOf, uint256 amount, uint256 timestamp ); event WithdrawEther( address sponsor, address indexed onBehalfOf, uint256 amount, uint256 timestamp ); event Mint( address sponsor, address indexed onBehalfOf, uint256 amount, uint256 timestamp ); event Burn( address sponsor, address indexed onBehalfOf, uint256 amount, uint256 timestamp ); event LiquidationRecord( address provider, address keeper, address indexed onBehalfOf, uint256 eusdamount, uint256 LiquidateEtherAmount, uint256 keeperReward, bool superLiquidation, uint256 timestamp ); event LSDistribution( uint256 stETHAdded, uint256 payoutEUSD, uint256 timestamp ); event RedemptionProvider(address user, bool status); event RigidRedemption( address indexed caller, address indexed provider, uint256 eusdAmount, uint256 etherAmount, uint256 timestamp ); event FeeDistribution( address indexed feeAddress, uint256 feeAmount, uint256 timestamp ); event ServiceFeePoolChanged(address pool, uint256 timestamp); event ESLBRMinterChanged(address pool, uint256 timestamp); constructor() { gov = msg.sender; } function setBorrowApy(uint256 newApy) external onlyGov { require(newApy <= 150, "Borrow APY cannot exceed 1.5%"); _saveReport(); mintFeeApy = newApy; emit BorrowApyChanged(newApy); } /** * @notice safeCollateralRate can be decided by DAO,starts at 160% */ function setSafeCollateralRate(uint256 newRatio) external onlyGov { require( newRatio >= 160 * 1e18, "Safe CollateralRate should more than 160%" ); safeCollateralRate = newRatio; emit SafeCollateralRateChanged(newRatio); } /** * @notice KeeperRate can be decided by DAO,1 means 1% of revenue */ function setKeeperRate(uint8 newRate) external onlyGov { require(newRate <= 5, "Max Keeper reward is 5%"); keeperRate = newRate; emit KeeperRateChanged(newRate); } /** * @notice DAO sets RedemptionFee, 100 means 1% */ function setRedemptionFee(uint8 newFee) external onlyGov { require(newFee <= 500, "Max Redemption Fee is 5%"); redemptionFee = newFee; emit RedemptionFeeChanged(newFee); } function setLbrStakingPool(address addr) external onlyGov { serviceFeePool = LbrStakingPool(addr); emit ServiceFeePoolChanged(addr, block.timestamp); } function setESLBRMinter(address addr) external onlyGov { eslbrMinter = esLBRMinter(addr); emit ESLBRMinterChanged(addr, block.timestamp); } /** * @notice User chooses to become a Redemption Provider */ function becomeRedemptionProvider(bool _bool) external { eslbrMinter.refreshReward(msg.sender); redemptionProvider[msg.sender] = _bool; emit RedemptionProvider(msg.sender, _bool); } /** * @notice Deposit ETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly * * Emits a `DepositEther` event. * * Requirements: * - `onBehalfOf` cannot be the zero address. * - `mintAmount` Send 0 if doesn't mint EUSD * - msg.value Must be higher than 0. * * @dev Record the deposited ETH in the ratio of 1:1 and convert it into stETH. */ function depositEtherToMint(address onBehalfOf, uint256 mintAmount) external payable { require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS"); require(msg.value >= 1 ether, "Deposit should not be less than 1 ETH."); //convert to steth uint256 sharesAmount = lido.submit{value: msg.value}(gov); require(sharesAmount > 0, "ZERO_DEPOSIT"); totalDepositedEther += msg.value; depositedEther[onBehalfOf] += msg.value; if (mintAmount > 0) { _mintEUSD(onBehalfOf, onBehalfOf, mintAmount); } emit DepositEther(msg.sender, onBehalfOf, msg.value, block.timestamp); } /** * @notice Deposit stETH on behalf of an address, update the interest distribution and deposit record the this address, can mint EUSD directly * Emits a `DepositEther` event. * * Requirements: * - `onBehalfOf` cannot be the zero address. * - `stETHamount` Must be higher than 0. * - `mintAmount` Send 0 if doesn't mint EUSD * @dev Record the deposited stETH in the ratio of 1:1. */ function depositStETHToMint( address onBehalfOf, uint256 stETHamount, uint256 mintAmount ) external { require(onBehalfOf != address(0), "DEPOSIT_TO_THE_ZERO_ADDRESS"); require(stETHamount >= 1 ether, "Deposit should not be less than 1 stETH."); lido.transferFrom(msg.sender, address(this), stETHamount); totalDepositedEther += stETHamount; depositedEther[onBehalfOf] += stETHamount; if (mintAmount > 0) { _mintEUSD(onBehalfOf, onBehalfOf, mintAmount); } emit DepositEther(msg.sender, onBehalfOf, stETHamount, block.timestamp); } /** * @notice Withdraw collateral assets to an address * Emits a `WithdrawEther` event. * * Requirements: * - `onBehalfOf` cannot be the zero address. * - `amount` Must be higher than 0. * * @dev Withdraw stETH. Check user’s collateral rate after withdrawal, should be higher than `safeCollateralRate` */ function withdraw(address onBehalfOf, uint256 amount) external { require(onBehalfOf != address(0), "WITHDRAW_TO_THE_ZERO_ADDRESS"); require(amount > 0, "ZERO_WITHDRAW"); require(depositedEther[msg.sender] >= amount, "Insufficient Balance"); totalDepositedEther -= amount; depositedEther[msg.sender] -= amount; lido.transfer(onBehalfOf, amount); if (borrowed[msg.sender] > 0) { _checkHealth(msg.sender); } emit WithdrawEther(msg.sender, onBehalfOf, amount, block.timestamp); } /** * @notice The mint amount number of EUSD is minted to the address * Emits a `Mint` event. * * Requirements: * - `onBehalfOf` cannot be the zero address. * - `amount` Must be higher than 0. Individual mint amount shouldn't surpass 10% when the circulation reaches 10_000_000 */ function mint(address onBehalfOf, uint256 amount) public { require(onBehalfOf != address(0), "MINT_TO_THE_ZERO_ADDRESS"); require(amount > 0, "ZERO_MINT"); _mintEUSD(msg.sender, onBehalfOf, amount); if ( (borrowed[msg.sender] * 100) / totalSupply() > 10 && totalSupply() > 10_000_000 * 1e18 ) revert("Mint Amount cannot be more than 10% of total circulation"); } /** * @notice Burn the amount of EUSD and payback the amount of minted EUSD * Emits a `Burn` event. * Requirements: * - `onBehalfOf` cannot be the zero address. * - `amount` Must be higher than 0. * @dev Calling the internal`_repay`function. */ function burn(address onBehalfOf, uint256 amount) external { require(onBehalfOf != address(0), "BURN_TO_THE_ZERO_ADDRESS"); _repay(msg.sender, onBehalfOf, amount); } /** * @notice When overallCollateralRate is above 150%, Keeper liquidates borrowers whose collateral rate is below badCollateralRate, using EUSD provided by Liquidation Provider. * * Requirements: * - onBehalfOf Collateral Rate should be below badCollateralRate * - etherAmount should be less than 50% of collateral * - provider should authorize Lybra to utilize EUSD * @dev After liquidation, borrower's debt is reduced by etherAmount * etherPrice, collateral is reduced by the etherAmount corresponding to 110% of the value. Keeper gets keeperRate / 110 of Liquidation Reward and Liquidator gets the remaining stETH. */ function liquidation( address provider, address onBehalfOf, uint256 etherAmount ) external { uint256 etherPrice = _etherPrice(); uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] * etherPrice * 100) / borrowed[onBehalfOf]; require( onBehalfOfCollateralRate < badCollateralRate, "Borrowers collateral rate should below badCollateralRate" ); require( etherAmount * 2 <= depositedEther[onBehalfOf], "a max of 50% collateral can be liquidated" ); uint256 eusdAmount = (etherAmount * etherPrice) / 1e18; require( allowance(provider, address(this)) >= eusdAmount, "provider should authorize to provide liquidation EUSD" ); _repay(provider, onBehalfOf, eusdAmount); uint256 reducedEther = (etherAmount * 11) / 10; totalDepositedEther -= reducedEther; depositedEther[onBehalfOf] -= reducedEther; uint256 reward2keeper; if (provider == msg.sender) { lido.transfer(msg.sender, reducedEther); } else { reward2keeper = (reducedEther * keeperRate) / 110; lido.transfer(provider, reducedEther - reward2keeper); lido.transfer(msg.sender, reward2keeper); } emit LiquidationRecord( provider, msg.sender, onBehalfOf, eusdAmount, reducedEther, reward2keeper, false, block.timestamp ); } /** * @notice When overallCollateralRate is below badCollateralRate, borrowers with collateralRate below 125% could be fully liquidated. * Emits a `LiquidationRecord` event. * * Requirements: * - Current overallCollateralRate should be below badCollateralRate * - `onBehalfOf`collateralRate should be below 125% * @dev After Liquidation, borrower's debt is reduced by etherAmount * etherPrice, deposit is reduced by etherAmount * borrower's collateralRate. Keeper gets a liquidation reward of `keeperRate / borrower's collateralRate */ function superLiquidation( address provider, address onBehalfOf, uint256 etherAmount ) external { uint256 etherPrice = _etherPrice(); require( (totalDepositedEther * etherPrice * 100) / totalSupply() < badCollateralRate, "overallCollateralRate should below 150%" ); uint256 onBehalfOfCollateralRate = (depositedEther[onBehalfOf] * etherPrice * 100) / borrowed[onBehalfOf]; require( onBehalfOfCollateralRate < 125 * 1e18, "borrowers collateralRate should below 125%" ); require( etherAmount <= depositedEther[onBehalfOf], "total of collateral can be liquidated at most" ); uint256 eusdAmount = (etherAmount * etherPrice) / 1e18; if (onBehalfOfCollateralRate >= 1e20) { eusdAmount = (eusdAmount * 1e20) / onBehalfOfCollateralRate; } require( allowance(provider, address(this)) >= eusdAmount, "provider should authorize to provide liquidation EUSD" ); _repay(provider, onBehalfOf, eusdAmount); totalDepositedEther -= etherAmount; depositedEther[onBehalfOf] -= etherAmount; uint256 reward2keeper; if ( msg.sender != provider && onBehalfOfCollateralRate >= 1e20 + keeperRate * 1e18 ) { reward2keeper = ((etherAmount * keeperRate) * 1e18) / onBehalfOfCollateralRate; lido.transfer(msg.sender, reward2keeper); } lido.transfer(provider, etherAmount - reward2keeper); emit LiquidationRecord( provider, msg.sender, onBehalfOf, eusdAmount, etherAmount, reward2keeper, true, block.timestamp ); } /** * @notice When stETH balance increases through LSD or other reasons, the excess income is sold for EUSD, allocated to EUSD holders through rebase mechanism. * Emits a `LSDistribution` event. * * *Requirements: * - stETH balance in the contract cannot be less than totalDepositedEther after exchange. * @dev Income is used to cover accumulated Service Fee first. */ function excessIncomeDistribution(uint256 payAmount) external { uint256 payoutEther = (payAmount * 1e18) / _etherPrice(); require( payoutEther <= lido.balanceOf(address(this)) - totalDepositedEther && payoutEther > 0, "Only LSD excess income can be exchanged" ); uint256 income = feeStored + _newFee(); if (payAmount > income) { _transfer(msg.sender, address(serviceFeePool), income); serviceFeePool.notifyRewardAmount(income); uint256 sharesAmount = getSharesByMintedEUSD(payAmount - income); if (sharesAmount == 0) { //EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1 sharesAmount = payAmount - income; } //Income is distributed to LBR staker. _burnShares(msg.sender, sharesAmount); feeStored = 0; emit FeeDistribution( address(serviceFeePool), income, block.timestamp ); } else { _transfer(msg.sender, address(serviceFeePool), payAmount); serviceFeePool.notifyRewardAmount(payAmount); feeStored = income - payAmount; emit FeeDistribution( address(serviceFeePool), payAmount, block.timestamp ); } lastReportTime = block.timestamp; lido.transfer(msg.sender, payoutEther); emit LSDistribution(payoutEther, payAmount, block.timestamp); } /** * @notice Choose a Redemption Provider, Rigid Redeem `eusdAmount` of EUSD and get 1:1 value of stETH * Emits a `RigidRedemption` event. * * *Requirements: * - `provider` must be a Redemption Provider * - `provider`debt must equal to or above`eusdAmount` * @dev Service Fee for rigidRedemption `redemptionFee` is set to 0.5% by default, can be revised by DAO. */ function rigidRedemption(address provider, uint256 eusdAmount) external { require( redemptionProvider[provider], "provider is not a RedemptionProvider" ); require( borrowed[provider] >= eusdAmount, "eusdAmount cannot surpass providers debt" ); uint256 etherPrice = _etherPrice(); uint256 providerCollateralRate = (depositedEther[provider] * etherPrice * 100) / borrowed[provider]; require( providerCollateralRate >= 100 * 1e18, "provider's collateral rate should more than 100%" ); _repay(msg.sender, provider, eusdAmount); uint256 etherAmount = (((eusdAmount * 1e18) / etherPrice) * (10000 - redemptionFee)) / 10000; depositedEther[provider] -= etherAmount; totalDepositedEther -= etherAmount; lido.transfer(msg.sender, etherAmount); emit RigidRedemption( msg.sender, provider, eusdAmount, etherAmount, block.timestamp ); } /** * @dev Refresh LBR reward before adding providers debt. Refresh Lybra generated service fee before adding totalEUSDCirculation. Check providers collateralRate cannot below `safeCollateralRate`after minting. */ function _mintEUSD( address _provider, address _onBehalfOf, uint256 _amount ) internal { uint256 sharesAmount = getSharesByMintedEUSD(_amount); if (sharesAmount == 0) { //EUSD totalSupply is 0: assume that shares correspond to EUSD 1-to-1 sharesAmount = _amount; } eslbrMinter.refreshReward(_provider); borrowed[_provider] += _amount; _mintShares(_onBehalfOf, sharesAmount); _saveReport(); totalEUSDCirculation += _amount; _checkHealth(_provider); emit Mint(msg.sender, _onBehalfOf, _amount, block.timestamp); } /** * @notice Burn _provideramount EUSD to payback minted EUSD for _onBehalfOf. * * @dev Refresh LBR reward before reducing providers debt. Refresh Lybra generated service fee before reducing totalEUSDCirculation. */ function _repay( address _provider, address _onBehalfOf, uint256 _amount ) internal { require( borrowed[_onBehalfOf] >= _amount, "Repaying Amount Surpasses Borrowing Amount" ); uint256 sharesAmount = getSharesByMintedEUSD(_amount); _burnShares(_provider, sharesAmount); eslbrMinter.refreshReward(_onBehalfOf); borrowed[_onBehalfOf] -= _amount; _saveReport(); totalEUSDCirculation -= _amount; emit Burn(_provider, _onBehalfOf, _amount, block.timestamp); } function _saveReport() internal { feeStored += _newFee(); lastReportTime = block.timestamp; } /** * @dev Get USD value of current collateral asset and minted EUSD through price oracle / Collateral asset USD value must higher than safe Collateral Rate. */ function _checkHealth(address user) internal { if ( ((depositedEther[user] * _etherPrice() * 100) / borrowed[user]) < safeCollateralRate ) revert("collateralRate is Below safeCollateralRate"); } /** * @dev Return USD value of current ETH through Liquity PriceFeed Contract. * https://etherscan.io/address/0x4c517D4e2C851CA76d7eC94B805269Df0f2201De#code */ function _etherPrice() internal returns (uint256) { return IPriceFeed(0x4c517D4e2C851CA76d7eC94B805269Df0f2201De).fetchPrice(); } function _newFee() internal view returns (uint256) { return (totalEUSDCirculation * mintFeeApy * (block.timestamp - lastReportTime)) / year / 10000; } /** * @dev total circulation of EUSD */ function _getTotalMintedEUSD() internal view override returns (uint256) { return totalEUSDCirculation; } function getBorrowedOf(address user) external view returns (uint256) { return borrowed[user]; } function isRedemptionProvider(address user) external view returns (bool) { return redemptionProvider[user]; } }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.17; contract Governable { address public gov; event GovernanceAuthorityTransfer(address newGov); modifier onlyGov() { require(msg.sender == gov, "Governable: forbidden"); _; } function setGov(address _gov) external onlyGov { gov = _gov; emit GovernanceAuthorityTransfer(_gov); } }
// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.17; import "./SafeMath.sol"; import "./IERC20.sol"; /** * @title Interest-bearing ERC20-like token for Lybra protocol. * * This contract is abstract. To make the contract deployable override the * `_getTotalMintedEUSD` function. `Lybra.sol` contract inherits EUSD and defines * the `_getTotalMintedEUSD` function. * * EUSD balances are dynamic and represent the holder's share in the total amount * of Ether controlled by the protocol. Account shares aren't normalized, so the * contract also stores the sum of all shares to calculate each account's token balance * which equals to: * * shares[account] * _getTotalMintedEUSD() / _getTotalShares() * * For example, assume that we have: * * _getTotalMintedEUSD() -> 1000 EUSD * sharesOf(user1) -> 100 * sharesOf(user2) -> 400 * * Therefore: * * balanceOf(user1) -> 2 tokens which corresponds 200 EUSD * balanceOf(user2) -> 8 tokens which corresponds 800 EUSD * * Since balances of all token holders change when the amount of total supplied EUSD * changes, this token cannot fully implement ERC20 standard: it only emits `Transfer` * events upon explicit transfer between holders. In contrast, when total amount of * pooled Ether increases, no `Transfer` events are generated: doing so would require * emitting an event for each token holder and thus running an unbounded loop. */ abstract contract EUSD is IERC20 { using SafeMath for uint256; uint256 private totalShares; /** * @dev EUSD balances are dynamic and are calculated based on the accounts' shares * and the total supply by the protocol. Account shares aren't * normalized, so the contract also stores the sum of all shares to calculate * each account's token balance which equals to: * * shares[account] * _getTotalMintedEUSD() / _getTotalShares() */ mapping(address => uint256) private shares; /** * @dev Allowances are nominated in tokens, not token shares. */ mapping(address => mapping(address => uint256)) private allowances; /** * @notice An executed shares transfer from `sender` to `recipient`. * * @dev emitted in pair with an ERC20-defined `Transfer` event. */ event TransferShares( address indexed from, address indexed to, uint256 sharesValue ); /** * @notice An executed `burnShares` request * * @dev Reports simultaneously burnt shares amount * and corresponding EUSD amount. * The EUSD amount is calculated twice: before and after the burning incurred rebase. * * @param account holder of the burnt shares * @param preRebaseTokenAmount amount of EUSD the burnt shares corresponded to before the burn * @param postRebaseTokenAmount amount of EUSD the burnt shares corresponded to after the burn * @param sharesAmount amount of burnt shares */ event SharesBurnt( address indexed account, uint256 preRebaseTokenAmount, uint256 postRebaseTokenAmount, uint256 sharesAmount ); /** * @return the name of the token. */ function name() public pure returns (string memory) { return "eUSD"; } /** * @return the symbol of the token, usually a shorter version of the * name. */ function symbol() public pure returns (string memory) { return "eUSD"; } /** * @return the number of decimals for getting user representation of a token amount. */ function decimals() public pure returns (uint8) { return 18; } /** * @return the amount of EUSD in existence. * * @dev Always equals to `_getTotalMintedEUSD()` since token amount * is pegged to the total amount of EUSD controlled by the protocol. */ function totalSupply() public view returns (uint256) { return _getTotalMintedEUSD(); } /** * @return the amount of tokens owned by the `_account`. * * @dev Balances are dynamic and equal the `_account`'s share in the amount of the * total Ether controlled by the protocol. See `sharesOf`. */ function balanceOf(address _account) public view returns (uint256) { return getMintedEUSDByShares(_sharesOf(_account)); } /** * @notice Moves `_amount` tokens from the caller's account to the `_recipient` account. * * @return a boolean value indicating whether the operation succeeded. * Emits a `Transfer` event. * Emits a `TransferShares` event. * * Requirements: * * - `_recipient` cannot be the zero address. * - the caller must have a balance of at least `_amount`. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function transfer( address _recipient, uint256 _amount ) public returns (bool) { _transfer(msg.sender, _recipient, _amount); return true; } /** * @return the remaining number of tokens that `_spender` is allowed to spend * on behalf of `_owner` through `transferFrom`. This is zero by default. * * @dev This value changes when `approve` or `transferFrom` is called. */ function allowance( address _owner, address _spender ) public view returns (uint256) { return allowances[_owner][_spender]; } /** * @notice Sets `_amount` as the allowance of `_spender` over the caller's tokens. * * @return a boolean value indicating whether the operation succeeded. * Emits an `Approval` event. * * Requirements: * * - `_spender` cannot be the zero address. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function approve(address _spender, uint256 _amount) public returns (bool) { _approve(msg.sender, _spender, _amount); return true; } /** * @notice Moves `_amount` tokens from `_sender` to `_recipient` using the * allowance mechanism. `_amount` is then deducted from the caller's * allowance. * * @return a boolean value indicating whether the operation succeeded. * * Emits a `Transfer` event. * Emits a `TransferShares` event. * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_sender` and `_recipient` cannot be the zero addresses. * - `_sender` must have a balance of at least `_amount`. * - the caller must have allowance for `_sender`'s tokens of at least `_amount`. * - the contract must not be paused. * * @dev The `_amount` argument is the amount of tokens, not shares. */ function transferFrom( address _sender, address _recipient, uint256 _amount ) public returns (bool) { uint256 currentAllowance = allowances[_sender][msg.sender]; require( currentAllowance >= _amount, "TRANSFER_AMOUNT_EXCEEDS_ALLOWANCE" ); _transfer(_sender, _recipient, _amount); _approve(_sender, msg.sender, currentAllowance.sub(_amount)); return true; } /** * @notice Atomically increases the allowance granted to `_spender` by the caller by `_addedValue`. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42 * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_spender` cannot be the the zero address. * - the contract must not be paused. */ function increaseAllowance( address _spender, uint256 _addedValue ) public returns (bool) { _approve( msg.sender, _spender, allowances[msg.sender][_spender].add(_addedValue) ); return true; } /** * @notice Atomically decreases the allowance granted to `_spender` by the caller by `_subtractedValue`. * * This is an alternative to `approve` that can be used as a mitigation for * problems described in: * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol#L42 * Emits an `Approval` event indicating the updated allowance. * * Requirements: * * - `_spender` cannot be the zero address. * - `_spender` must have allowance for the caller of at least `_subtractedValue`. * - the contract must not be paused. */ function decreaseAllowance( address _spender, uint256 _subtractedValue ) public returns (bool) { uint256 currentAllowance = allowances[msg.sender][_spender]; require( currentAllowance >= _subtractedValue, "DECREASED_ALLOWANCE_BELOW_ZERO" ); _approve(msg.sender, _spender, currentAllowance.sub(_subtractedValue)); return true; } /** * @return the total amount of shares in existence. * * @dev The sum of all accounts' shares can be an arbitrary number, therefore * it is necessary to store it in order to calculate each account's relative share. */ function getTotalShares() public view returns (uint256) { return _getTotalShares(); } /** * @return the amount of shares owned by `_account`. */ function sharesOf(address _account) public view returns (uint256) { return _sharesOf(_account); } /** * @return the amount of shares that corresponds to `_EUSDAmount` protocol-supplied EUSD. */ function getSharesByMintedEUSD( uint256 _EUSDAmount ) public view returns (uint256) { uint256 totalMintedEUSD = _getTotalMintedEUSD(); if (totalMintedEUSD == 0) { return 0; } else { return _EUSDAmount.mul(_getTotalShares()).div(totalMintedEUSD); } } /** * @return the amount of EUSD that corresponds to `_sharesAmount` token shares. */ function getMintedEUSDByShares( uint256 _sharesAmount ) public view returns (uint256) { uint256 totalSharesAmount = _getTotalShares(); if (totalShares == 0) { return 0; } else { return _sharesAmount.mul(_getTotalMintedEUSD()).div(totalSharesAmount); } } /** * @notice Moves `_sharesAmount` token shares from the caller's account to the `_recipient` account. * * @return amount of transferred tokens. * Emits a `TransferShares` event. * Emits a `Transfer` event. * * Requirements: * * - `_recipient` cannot be the zero address. * - the caller must have at least `_sharesAmount` shares. * - the contract must not be paused. * * @dev The `_sharesAmount` argument is the amount of shares, not tokens. */ function transferShares( address _recipient, uint256 _sharesAmount ) public returns (uint256) { _transferShares(msg.sender, _recipient, _sharesAmount); emit TransferShares(msg.sender, _recipient, _sharesAmount); uint256 tokensAmount = getMintedEUSDByShares(_sharesAmount); emit Transfer(msg.sender, _recipient, tokensAmount); return tokensAmount; } /** * @return the total amount of EUSD. * @dev This is used for calculating tokens from shares and vice versa. * @dev This function is required to be implemented in a derived contract. */ function _getTotalMintedEUSD() internal view virtual returns (uint256); /** * @notice Moves `_amount` tokens from `_sender` to `_recipient`. * Emits a `Transfer` event. * Emits a `TransferShares` event. */ function _transfer( address _sender, address _recipient, uint256 _amount ) internal { uint256 _sharesToTransfer = getSharesByMintedEUSD(_amount); _transferShares(_sender, _recipient, _sharesToTransfer); emit Transfer(_sender, _recipient, _amount); emit TransferShares(_sender, _recipient, _sharesToTransfer); } /** * @notice Sets `_amount` as the allowance of `_spender` over the `_owner` s tokens. * * Emits an `Approval` event. * * Requirements: * * - `_owner` cannot be the zero address. * - `_spender` cannot be the zero address. * - the contract must not be paused. */ function _approve( address _owner, address _spender, uint256 _amount ) internal { require(_owner != address(0), "APPROVE_FROM_ZERO_ADDRESS"); require(_spender != address(0), "APPROVE_TO_ZERO_ADDRESS"); allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } /** * @return the total amount of shares in existence. */ function _getTotalShares() internal view returns (uint256) { return totalShares; } /** * @return the amount of shares owned by `_account`. */ function _sharesOf(address _account) internal view returns (uint256) { return shares[_account]; } /** * @notice Moves `_sharesAmount` shares from `_sender` to `_recipient`. * * Requirements: * * - `_sender` cannot be the zero address. * - `_recipient` cannot be the zero address. * - `_sender` must hold at least `_sharesAmount` shares. * - the contract must not be paused. */ function _transferShares( address _sender, address _recipient, uint256 _sharesAmount ) internal { require(_sender != address(0), "TRANSFER_FROM_THE_ZERO_ADDRESS"); require(_recipient != address(0), "TRANSFER_TO_THE_ZERO_ADDRESS"); uint256 currentSenderShares = shares[_sender]; require( _sharesAmount <= currentSenderShares, "TRANSFER_AMOUNT_EXCEEDS_BALANCE" ); shares[_sender] = currentSenderShares.sub(_sharesAmount); shares[_recipient] = shares[_recipient].add(_sharesAmount); } /** * @notice Creates `_sharesAmount` shares and assigns them to `_recipient`, increasing the total amount of shares. * @dev This doesn't increase the token total supply. * * Requirements: * * - `_recipient` cannot be the zero address. * - the contract must not be paused. */ function _mintShares( address _recipient, uint256 _sharesAmount ) internal returns (uint256 newTotalShares) { require(_recipient != address(0), "MINT_TO_THE_ZERO_ADDRESS"); newTotalShares = _getTotalShares().add(_sharesAmount); totalShares = newTotalShares; shares[_recipient] = shares[_recipient].add(_sharesAmount); // Notice: we're not emitting a Transfer event from the zero address here since shares mint // works by taking the amount of tokens corresponding to the minted shares from all other // token holders, proportionally to their share. The total supply of the token doesn't change // as the result. This is equivalent to performing a send from each other token holder's // address to `address`, but we cannot reflect this as it would require sending an unbounded // number of events. } /** * @notice Destroys `_sharesAmount` shares from `_account`'s holdings, decreasing the total amount of shares. * @dev This doesn't decrease the token total supply. * * Requirements: * * - `_account` cannot be the zero address. * - `_account` must hold at least `_sharesAmount` shares. * - the contract must not be paused. */ function _burnShares( address _account, uint256 _sharesAmount ) internal returns (uint256 newTotalShares) { require(_account != address(0), "BURN_FROM_THE_ZERO_ADDRESS"); uint256 accountShares = shares[_account]; require(_sharesAmount <= accountShares, "BURN_AMOUNT_EXCEEDS_BALANCE"); uint256 preRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount); newTotalShares = _getTotalShares().sub(_sharesAmount); totalShares = newTotalShares; shares[_account] = accountShares.sub(_sharesAmount); uint256 postRebaseTokenAmount = getMintedEUSDByShares(_sharesAmount); emit SharesBurnt( _account, preRebaseTokenAmount, postRebaseTokenAmount, _sharesAmount ); // Notice: we're not emitting a Transfer event to the zero address here since shares burn // works by redistributing the amount of tokens corresponding to the burned shares between // all other token holders. The total supply of the token doesn't change as the result. // This is equivalent to performing a send from `address` to each other token holder address, // but we cannot reflect this as it would require sending an unbounded number of events. // We're emitting `SharesBurnt` event to provide an explicit rebase log record nonetheless. } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"BorrowApyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DepositEther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ESLBRMinterChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FeeDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newGov","type":"address"}],"name":"GovernanceAuthorityTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSlippage","type":"uint256"}],"name":"KeeperRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"stETHAdded","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"payoutEUSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LSDistribution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"address","name":"keeper","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"eusdamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LiquidateEtherAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"keeperReward","type":"uint256"},{"indexed":false,"internalType":"bool","name":"superLiquidation","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LiquidationRecord","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSlippage","type":"uint256"}],"name":"RedemptionFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"RedemptionProvider","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"provider","type":"address"},{"indexed":false,"internalType":"uint256","name":"eusdAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"etherAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"RigidRedemption","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"SafeCollateralRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ServiceFeePoolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"preRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postRebaseTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sharesAmount","type":"uint256"}],"name":"SharesBurnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"sharesValue","type":"uint256"}],"name":"TransferShares","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sponsor","type":"address"},{"indexed":true,"internalType":"address","name":"onBehalfOf","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"WithdrawEther","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"badCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_bool","type":"bool"}],"name":"becomeRedemptionProvider","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"depositEtherToMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"stETHamount","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"depositStETHToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eslbrMinter","outputs":[{"internalType":"contract esLBRMinter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"payAmount","type":"uint256"}],"name":"excessIncomeDistribution","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getBorrowedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"getMintedEUSDByShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_EUSDAmount","type":"uint256"}],"name":"getSharesByMintedEUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isRedemptionProvider","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeperRate","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastReportTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"etherAmount","type":"uint256"}],"name":"liquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFeeApy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"redemptionFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"uint256","name":"eusdAmount","type":"uint256"}],"name":"rigidRedemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeCollateralRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"serviceFeePool","outputs":[{"internalType":"contract LbrStakingPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newApy","type":"uint256"}],"name":"setBorrowApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setESLBRMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newRate","type":"uint8"}],"name":"setKeeperRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setLbrStakingPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newFee","type":"uint8"}],"name":"setRedemptionFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRatio","type":"uint256"}],"name":"setSafeCollateralRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"sharesOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"provider","type":"address"},{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"etherAmount","type":"uint256"}],"name":"superLiquidation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalDepositedEther","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEUSDCirculation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_sharesAmount","type":"uint256"}],"name":"transferShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"onBehalfOf","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526301e1338060075560966008556808ac7230489e800000600955680821ab0d44149800006080526032600a55600b805460ff19166001179055601080546001600160a01b03191673ae7ab96520de3a18e5e111b5eaab095312d7fe8417905534801561006f57600080fd5b50600380546001600160a01b031916331790556080516135c66100ab60003960008181610708015281816117dd015261202301526135c66000f3fe6080604052600436106102935760003560e01c80638a70a3c61161015a578063b85364e5116100c1578063dd62ed3e1161007a578063dd62ed3e146107f5578063e0115d0d14610815578063e914555e1461082b578063f3fef3a31461084b578063f5eb42dc1461086b578063fd55276a1461088b57600080fd5b8063b85364e514610740578063ba129df414610760578063baab9dab14610780578063c05ebc2c146107a0578063cfad57a2146107c0578063d5002f2e146107e057600080fd5b80639dc29fac116101135780639dc29fac146106765780639e48d6cc14610696578063a457c2d7146106b6578063a9059cbb146106d6578063ac0799dd146106f6578063b0df27fd1461072a57600080fd5b80638a70a3c6146105e05780638fcb4e5b1461060057806395d89b411461030357806396171e591461062057806399f009a2146106405780639b4d51f41461066057600080fd5b806340c10f19116101fe5780636cfa6a75116101b75780636cfa6a75146105215780636da6d8f11461054157806370a0823114610557578063733346e5146105775780637890444c1461058d57806378cf2cff146105c657600080fd5b806340c10f191461045e57806344ac84b01461047e578063458f58151461049e578063482ed2a2146104b45780634b3094f5146104e15780636bef22ee1461050157600080fd5b80631a7b9ef5116102505780631a7b9ef5146103b357806323b872dd146103d357806324bc1090146103f35780632d47194014610406578063313ce5671461041c578063395093511461043e57600080fd5b80630359d4cc1461029857806305ad8308146102ba57806306fdde0314610303578063095ea7b31461033657806312d43a511461036657806318160ddd1461039e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046131f6565b6108ab565b005b3480156102c657600080fd5b506102f06102d53660046131f6565b6001600160a01b03166000908152600d602052604090205490565b6040519081526020015b60405180910390f35b34801561030f57600080fd5b506040805180820182526004815263195554d160e21b602082015290516102fa9190613211565b34801561034257600080fd5b5061035661035136600461325f565b610936565b60405190151581526020016102fa565b34801561037257600080fd5b50600354610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156103aa57600080fd5b506102f061094d565b3480156103bf57600080fd5b506102b86103ce36600461325f565b61095d565b3480156103df57600080fd5b506103566103ee366004613289565b610c76565b6102b861040136600461325f565b610d1e565b34801561041257600080fd5b506102f060095481565b34801561042857600080fd5b5060125b60405160ff90911681526020016102fa565b34801561044a57600080fd5b5061035661045936600461325f565b610f34565b34801561046a57600080fd5b506102b861047936600461325f565b610f6a565b34801561048a57600080fd5b506102b86104993660046132c5565b6110c6565b3480156104aa57600080fd5b506102f0600a5481565b3480156104c057600080fd5b506102f06104cf3660046131f6565b600c6020526000908152604090205481565b3480156104ed57600080fd5b506102b86104fc3660046132e8565b61117e565b34801561050d57600080fd5b506102b861051c3660046132e8565b611248565b34801561052d57600080fd5b50601254610386906001600160a01b031681565b34801561054d57600080fd5b506102f060085481565b34801561056357600080fd5b506102f06105723660046131f6565b6115fe565b34801561058357600080fd5b506102f060065481565b34801561059957600080fd5b506103566105a83660046131f6565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105d257600080fd5b50600b5461042c9060ff1681565b3480156105ec57600080fd5b506102b86105fb3660046132e8565b611620565b34801561060c57600080fd5b506102f061061b36600461325f565b6116d8565b34801561062c57600080fd5b506102b861063b366004613289565b611786565b34801561064c57600080fd5b506102b861065b3660046131f6565b611ba2565b34801561066c57600080fd5b506102f060045481565b34801561068257600080fd5b506102b861069136600461325f565b611c19565b3480156106a257600080fd5b506102b86106b1366004613301565b611c7a565b3480156106c257600080fd5b506103566106d136600461325f565b611e47565b3480156106e257600080fd5b506103566106f136600461325f565b611ed4565b34801561070257600080fd5b506102f07f000000000000000000000000000000000000000000000000000000000000000081565b34801561073657600080fd5b506102f0600f5481565b34801561074c57600080fd5b506102f061075b3660046132e8565b611ee1565b34801561076c57600080fd5b506102b861077b3660046132c5565b611f24565b34801561078c57600080fd5b506102f061079b3660046132e8565b611fe4565b3480156107ac57600080fd5b506102b86107bb366004613289565b612015565b3480156107cc57600080fd5b506102b86107db3660046131f6565b61249d565b3480156107ec57600080fd5b506000546102f0565b34801561080157600080fd5b506102f0610810366004613334565b612515565b34801561082157600080fd5b506102f060055481565b34801561083757600080fd5b506102b8610846366004613375565b612540565b34801561085757600080fd5b506102b861086636600461325f565b6125f1565b34801561087757600080fd5b506102f06108863660046131f6565b6127f5565b34801561089757600080fd5b50601154610386906001600160a01b031681565b6003546001600160a01b031633146108de5760405162461bcd60e51b81526004016108d590613392565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0383161790556040517f78816b31283624f96a34a58e5f9cb743d63d7a325d42d4be00858daa99cf96199061092b90839042906133c1565b60405180910390a150565b6000610943338484612813565b5060015b92915050565b600061095860065490565b905090565b6001600160a01b0382166000908152600e602052604090205460ff166109d15760405162461bcd60e51b8152602060048201526024808201527f70726f7669646572206973206e6f74206120526564656d7074696f6e50726f7660448201526334b232b960e11b60648201526084016108d5565b6001600160a01b0382166000908152600d6020526040902054811115610a4a5760405162461bcd60e51b815260206004820152602860248201527f65757364416d6f756e742063616e6e6f7420737572706173732070726f766964604482015267195c9cc81919589d60c21b60648201526084016108d5565b6000610a54612920565b6001600160a01b0384166000908152600d6020908152604080832054600c9092528220549293509091610a889084906133f0565b610a939060646133f0565b610a9d9190613407565b905068056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152603060248201527f70726f7669646572277320636f6c6c61746572616c20726174652073686f756c60448201526f64206d6f7265207468616e203130302560801b60648201526084016108d5565b610b1c33858561299a565b6000612710600a54612710610b319190613429565b84610b4487670de0b6b3a76400006133f0565b610b4e9190613407565b610b5891906133f0565b610b629190613407565b6001600160a01b0386166000908152600c6020526040812080549293508392909190610b8f908490613429565b925050819055508060046000828254610ba89190613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610bdf90339085906004016133c1565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c22919061343c565b506040805185815260208101839052428183015290516001600160a01b0387169133917f1a7ab636ab77b4d93c0afba804a009a127e77def45e623e572144ca8f8a03ac59181900360600190a35050505050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cf45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016108d5565b610cff858585612b26565b610d138533610d0e8487612bde565b612813565b506001949350505050565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000341015610ddb5760405162461bcd60e51b815260206004820152602660248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015265189022aa241760d11b60648201526084016108d5565b60105460035460405163a1903eab60e01b81526001600160a01b039182166004820152600092919091169063a1903eab90349060240160206040518083038185885af1158015610e2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e549190613459565b905060008111610e955760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108d5565b3460046000828254610ea79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054349290610ed4908490613472565b90915550508115610eea57610eea838484612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89333442604051610f2793929190613485565b60405180910390a2505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610943918590610d0e9086612d00565b6001600160a01b038216610fbb5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b60008111610ff75760405162461bcd60e51b815260206004820152600960248201526816915493d7d352539560ba1b60448201526064016108d5565b611002338383612bea565b600a61100c61094d565b336000908152600d60205260409020546110279060646133f0565b6110319190613407565b11801561104f57506a084595161401484a00000061104d61094d565b115b156110c25760405162461bcd60e51b815260206004820152603860248201527f4d696e7420416d6f756e742063616e6e6f74206265206d6f7265207468616e2060448201527f313025206f6620746f74616c2063697263756c6174696f6e000000000000000060648201526084016108d5565b5050565b6003546001600160a01b031633146110f05760405162461bcd60e51b81526004016108d590613392565b6101f48160ff1611156111455760405162461bcd60e51b815260206004820152601860248201527f4d617820526564656d7074696f6e20466565206973203525000000000000000060448201526064016108d5565b60ff8116600a8190556040519081527f4dbf9634a3aaf3bc15ab627faeaac7c6b0a4754ead77206f1c11277356f2878f9060200161092b565b6003546001600160a01b031633146111a85760405162461bcd60e51b81526004016108d590613392565b6808ac7230489e8000008110156112135760405162461bcd60e51b815260206004820152602960248201527f5361666520436f6c6c61746572616c526174652073686f756c64206d6f7265206044820152687468616e203136302560b81b60648201526084016108d5565b60098190556040518181527f0447b351edf3bf02a602777192e1d189ac70324a0ca5502acd0d0918601eeb2e9060200161092b565b6000611252612920565b61126483670de0b6b3a76400006133f0565b61126e9190613407565b600480546010546040516370a0823160e01b81523093810193909352929350916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613459565b6112ec9190613429565b81111580156112fb5750600081115b6113575760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204c53442065786365737320696e636f6d652063616e20626520657860448201526618da185b99d95960ca1b60648201526084016108d5565b6000611361612d0c565b600f5461136e9190613472565b905080831115611473576012546113909033906001600160a01b031683612b26565b601254604051633c6b16ab60e01b8152600481018390526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b5050505060006113ff828561075b9190613429565b905080600003611416576114138285613429565b90505b6114203382612d50565b506000600f55601254604080518481524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a250611540565b60125461148b9033906001600160a01b031685612b26565b601254604051633c6b16ab60e01b8152600481018590526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050505082816114f59190613429565b600f55601254604080518581524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a25b4260055560105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157690339086906004016133c1565b6020604051808303816000875af1158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b9919061343c565b506040805183815260208101859052428183015290517fefa202e78b2ad7b96336e662b73d2b83b60668758a857269bd4d0962828329d19181900360600190a1505050565b6001600160a01b03811660009081526001602052604081205461094790611fe4565b6003546001600160a01b0316331461164a5760405162461bcd60e51b81526004016108d590613392565b609681111561169b5760405162461bcd60e51b815260206004820152601d60248201527f426f72726f77204150592063616e6e6f742065786365656420312e352500000060448201526064016108d5565b6116a3612ebf565b60088190556040518181527f3c62c9955fa46bea884e885afde8e7f674d06a027511ecb871d191869b8ab4819060200161092b565b60006116e5338484612ee3565b6040518281526001600160a01b0384169033907f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb9060200160405180910390a3600061173083611fe4565b9050836001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161177791815260200190565b60405180910390a39392505050565b6000611790612920565b6001600160a01b0384166000908152600d6020908152604080832054600c90925282205492935090916117c49084906133f0565b6117cf9060646133f0565b6117d99190613407565b90507f000000000000000000000000000000000000000000000000000000000000000081106118705760405162461bcd60e51b815260206004820152603860248201527f426f72726f7765727320636f6c6c61746572616c20726174652073686f756c6460448201527f2062656c6f7720626164436f6c6c61746572616c52617465000000000000000060648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020546118948460026133f0565b11156118f45760405162461bcd60e51b815260206004820152602960248201527f61206d6178206f662035302520636f6c6c61746572616c2063616e206265206c6044820152681a5c5d5a59185d195960ba1b60648201526084016108d5565b6000670de0b6b3a764000061190984866133f0565b6119139190613407565b9050806119208730612515565b101561193e5760405162461bcd60e51b81526004016108d5906134a6565b61194986868361299a565b6000600a61195886600b6133f0565b6119629190613407565b905080600460008282546119769190613429565b90915550506001600160a01b0386166000908152600c6020526040812080548392906119a3908490613429565b9091555060009050336001600160a01b03891603611a365760105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906119ed90339086906004016133c1565b6020604051808303816000875af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a30919061343c565b50611b4a565b600b54606e90611a499060ff16846133f0565b611a539190613407565b6010549091506001600160a01b031663a9059cbb89611a728486613429565b6040518363ffffffff1660e01b8152600401611a8f9291906133c1565b6020604051808303816000875af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad2919061343c565b5060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b0590339085906004016133c1565b6020604051808303816000875af1158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b48919061343c565b505b866001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad8933868686600042604051611b9097969594939291906134fb565b60405180910390a25050505050505050565b6003546001600160a01b03163314611bcc5760405162461bcd60e51b81526004016108d590613392565b601180546001600160a01b0319166001600160a01b0383161790556040517ffb30b10d69603a569e0dfcd8d074a070a51641dfbbe940536f216933cf6208889061092b90839042906133c1565b6001600160a01b038216611c6f5760405162461bcd60e51b815260206004820152601860248201527f4255524e5f544f5f5448455f5a45524f5f41444452455353000000000000000060448201526064016108d5565b6110c233838361299a565b6001600160a01b038316611cd05760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000821015611d395760405162461bcd60e51b815260206004820152602860248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015267189039ba22aa241760c11b60648201526084016108d5565b6010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db4919061343c565b508160046000828254611dc79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054849290611df4908490613472565b90915550508015611e0a57611e0a838483612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89338442604051610f2793929190613485565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611ebb5760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016108d5565b611eca3385610d0e8487612bde565b5060019392505050565b6000610943338484612b26565b600080611eed60065490565b905080600003611f005750600092915050565b611f1d81611f17611f1060005490565b8690613053565b9061305f565b9392505050565b6003546001600160a01b03163314611f4e5760405162461bcd60e51b81526004016108d590613392565b60058160ff161115611fa25760405162461bcd60e51b815260206004820152601760248201527f4d6178204b65657065722072657761726420697320352500000000000000000060448201526064016108d5565b600b805460ff191660ff83169081179091556040519081527f8e22963d45681714fade6b520d66ef5902422aac2bc9705573c0237d6a8f002a9060200161092b565b600080611ff060005490565b90506000546000036120055750600092915050565b611f1d81611f17611f1060065490565b600061201f612920565b90507f000000000000000000000000000000000000000000000000000000000000000061204a61094d565b8260045461205891906133f0565b6120639060646133f0565b61206d9190613407565b106120ca5760405162461bcd60e51b815260206004820152602760248201527f6f766572616c6c436f6c6c61746572616c526174652073686f756c642062656c6044820152666f77203135302560c81b60648201526084016108d5565b6001600160a01b0383166000908152600d6020908152604080832054600c9092528220546120f99084906133f0565b6121049060646133f0565b61210e9190613407565b90506806c6b935b8bbd40000811061217b5760405162461bcd60e51b815260206004820152602a60248201527f626f72726f7765727320636f6c6c61746572616c526174652073686f756c642060448201526962656c6f77203132352560b01b60648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020548311156121f95760405162461bcd60e51b815260206004820152602d60248201527f746f74616c206f6620636f6c6c61746572616c2063616e206265206c6971756960448201526c19185d195908185d081b5bdcdd609a1b60648201526084016108d5565b6000670de0b6b3a764000061220e84866133f0565b6122189190613407565b905068056bc75e2d63100000821061224b578161223e8268056bc75e2d631000006133f0565b6122489190613407565b90505b806122568730612515565b10156122745760405162461bcd60e51b81526004016108d5906134a6565b61227f86868361299a565b83600460008282546122919190613429565b90915550506001600160a01b0385166000908152600c6020526040812080548692906122be908490613429565b9091555060009050336001600160a01b0388161480159061231e5750600b546122f29060ff16670de0b6b3a764000061353b565b61230f9067ffffffffffffffff1668056bc75e2d63100000613567565b68ffffffffffffffffff168310155b156123c957600b5483906123359060ff16876133f0565b61234790670de0b6b3a76400006133f0565b6123519190613407565b60105460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061238490339085906004016133c1565b6020604051808303816000875af11580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c7919061343c565b505b6010546001600160a01b031663a9059cbb886123e58489613429565b6040518363ffffffff1660e01b81526004016124029291906133c1565b6020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612445919061343c565b50856001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad883385898660014260405161248c97969594939291906134fb565b60405180910390a250505050505050565b6003546001600160a01b031633146124c75760405162461bcd60e51b81526004016108d590613392565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f85314cee79a1d748bc922aee2e7514c754944bae54b9c5467dfd99629410fa9a9060200161092b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60115460405163fce67e0d60e01b81523360048201526001600160a01b039091169063fce67e0d90602401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050336000818152600e6020908152604091829020805460ff19168715159081179091558251938452908301527f3d9a02fcbaf508c27fa7c97d8e5795c8619e39299b3e8b7779fbe1f8d5de7970935001905061092b565b6001600160a01b0382166126475760405162461bcd60e51b815260206004820152601c60248201527f57495448445241575f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b600081116126875760405162461bcd60e51b815260206004820152600d60248201526c5a45524f5f574954484452415760981b60448201526064016108d5565b336000908152600c60205260409020548111156126dd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016108d5565b80600460008282546126ef9190613429565b9091555050336000908152600c602052604081208054839290612713908490613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061274a90859085906004016133c1565b6020604051808303816000875af1158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061343c565b50336000908152600d6020526040902054156127ac576127ac3361306b565b816001600160a01b03167f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db03383426040516127e993929190613485565b60405180910390a25050565b6001600160a01b038116600090815260016020526040812054610947565b6001600160a01b0383166128695760405162461bcd60e51b815260206004820152601960248201527f415050524f56455f46524f4d5f5a45524f5f414444524553530000000000000060448201526064016108d5565b6001600160a01b0382166128bf5760405162461bcd60e51b815260206004820152601760248201527f415050524f56455f544f5f5a45524f5f4144445245535300000000000000000060448201526064016108d5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000734c517d4e2c851ca76d7ec94b805269df0f2201de6001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612976573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109589190613459565b6001600160a01b0382166000908152600d6020526040902054811115612a155760405162461bcd60e51b815260206004820152602a60248201527f5265706179696e6720416d6f756e742053757270617373657320426f72726f776044820152691a5b99c8105b5bdd5b9d60b21b60648201526084016108d5565b6000612a2082611ee1565b9050612a2c8482612d50565b5060115460405163fce67e0d60e01b81526001600160a01b0385811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612a7457600080fd5b505af1158015612a88573d6000803e3d6000fd5b505050506001600160a01b0383166000908152600d602052604081208054849290612ab4908490613429565b90915550612ac29050612ebf565b8160066000828254612ad49190613429565b92505081905550826001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858442604051612b1893929190613485565b60405180910390a250505050565b6000612b3182611ee1565b9050612b3e848483612ee3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051612bd091815260200190565b60405180910390a350505050565b6000611f1d8284613429565b6000612bf582611ee1565b905080600003612c025750805b60115460405163fce67e0d60e01b81526001600160a01b0386811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612c4957600080fd5b505af1158015612c5d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600d602052604081208054849290612c89908490613472565b90915550612c999050838261312b565b50612ca2612ebf565b8160066000828254612cb49190613472565b90915550612cc390508461306b565b826001600160a01b03167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee338442604051612b1893929190613485565b6000611f1d8284613472565b600061271060075460055442612d229190613429565b600854600654612d3291906133f0565b612d3c91906133f0565b612d469190613407565b6109589190613407565b60006001600160a01b038316612da85760405162461bcd60e51b815260206004820152601a60248201527f4255524e5f46524f4d5f5448455f5a45524f5f4144445245535300000000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480831115612e115760405162461bcd60e51b815260206004820152601b60248201527f4255524e5f414d4f554e545f455843454544535f42414c414e4345000000000060448201526064016108d5565b6000612e1c84611fe4565b9050612e3184612e2b60005490565b90612bde565b60008190559250612e428285612bde565b6001600160a01b038616600090815260016020526040812091909155612e6785611fe4565b60408051848152602081018390529081018790529091506001600160a01b038716907f8b2a1e1ad5e0578c3dd82494156e985dade827a87c573b5c1c7716a32162ad649060600160405180910390a250505092915050565b612ec7612d0c565b600f6000828254612ed89190613472565b909155505042600555565b6001600160a01b038316612f395760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016108d5565b6001600160a01b038216612f8f5760405162461bcd60e51b815260206004820152601c60248201527f5452414e534645525f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480821115612ff85760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016108d5565b6130028183612bde565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546130319083612d00565b6001600160a01b03909316600090815260016020526040902092909255505050565b6000611f1d82846133f0565b6000611f1d8284613407565b6009546001600160a01b0382166000908152600d602052604090205461308f612920565b6001600160a01b0384166000908152600c60205260409020546130b291906133f0565b6130bd9060646133f0565b6130c79190613407565b10156131285760405162461bcd60e51b815260206004820152602a60248201527f636f6c6c61746572616c526174652069732042656c6f772073616665436f6c6c60448201526961746572616c5261746560b01b60648201526084016108d5565b50565b60006001600160a01b03831661317e5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b6131918261318b60005490565b90612d00565b60008181556001600160a01b0385168152600160205260409020549091506131b99083612d00565b6001600160a01b039093166000908152600160205260409020929092555090565b80356001600160a01b03811681146131f157600080fd5b919050565b60006020828403121561320857600080fd5b611f1d826131da565b600060208083528351808285015260005b8181101561323e57858101830151858201604001528201613222565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561327257600080fd5b61327b836131da565b946020939093013593505050565b60008060006060848603121561329e57600080fd5b6132a7846131da565b92506132b5602085016131da565b9150604084013590509250925092565b6000602082840312156132d757600080fd5b813560ff81168114611f1d57600080fd5b6000602082840312156132fa57600080fd5b5035919050565b60008060006060848603121561331657600080fd5b61331f846131da565b95602085013595506040909401359392505050565b6000806040838503121561334757600080fd5b613350836131da565b915061335e602084016131da565b90509250929050565b801515811461312857600080fd5b60006020828403121561338757600080fd5b8135611f1d81613367565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610947576109476133da565b60008261342457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610947576109476133da565b60006020828403121561344e57600080fd5b8151611f1d81613367565b60006020828403121561346b57600080fd5b5051919050565b80820180821115610947576109476133da565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082526035908201527f70726f76696465722073686f756c6420617574686f72697a6520746f2070726f6040820152741d9a5919481b1a5c5d5a59185d1a5bdb88115554d1605a1b606082015260800190565b6001600160a01b039788168152959096166020860152604085019390935260608401919091526080830152151560a082015260c081019190915260e00190565b67ffffffffffffffff81811683821602808216919082811461355f5761355f6133da565b505092915050565b68ffffffffffffffffff818116838216019080821115613589576135896133da565b509291505056fea2646970667358221220bc65e4a4fb18b1f5f97dcfbbea162a8c2708052c7e17cc41775af03291d08e0f64736f6c63430008110033
Deployed Bytecode
0x6080604052600436106102935760003560e01c80638a70a3c61161015a578063b85364e5116100c1578063dd62ed3e1161007a578063dd62ed3e146107f5578063e0115d0d14610815578063e914555e1461082b578063f3fef3a31461084b578063f5eb42dc1461086b578063fd55276a1461088b57600080fd5b8063b85364e514610740578063ba129df414610760578063baab9dab14610780578063c05ebc2c146107a0578063cfad57a2146107c0578063d5002f2e146107e057600080fd5b80639dc29fac116101135780639dc29fac146106765780639e48d6cc14610696578063a457c2d7146106b6578063a9059cbb146106d6578063ac0799dd146106f6578063b0df27fd1461072a57600080fd5b80638a70a3c6146105e05780638fcb4e5b1461060057806395d89b411461030357806396171e591461062057806399f009a2146106405780639b4d51f41461066057600080fd5b806340c10f19116101fe5780636cfa6a75116101b75780636cfa6a75146105215780636da6d8f11461054157806370a0823114610557578063733346e5146105775780637890444c1461058d57806378cf2cff146105c657600080fd5b806340c10f191461045e57806344ac84b01461047e578063458f58151461049e578063482ed2a2146104b45780634b3094f5146104e15780636bef22ee1461050157600080fd5b80631a7b9ef5116102505780631a7b9ef5146103b357806323b872dd146103d357806324bc1090146103f35780632d47194014610406578063313ce5671461041c578063395093511461043e57600080fd5b80630359d4cc1461029857806305ad8308146102ba57806306fdde0314610303578063095ea7b31461033657806312d43a511461036657806318160ddd1461039e575b600080fd5b3480156102a457600080fd5b506102b86102b33660046131f6565b6108ab565b005b3480156102c657600080fd5b506102f06102d53660046131f6565b6001600160a01b03166000908152600d602052604090205490565b6040519081526020015b60405180910390f35b34801561030f57600080fd5b506040805180820182526004815263195554d160e21b602082015290516102fa9190613211565b34801561034257600080fd5b5061035661035136600461325f565b610936565b60405190151581526020016102fa565b34801561037257600080fd5b50600354610386906001600160a01b031681565b6040516001600160a01b0390911681526020016102fa565b3480156103aa57600080fd5b506102f061094d565b3480156103bf57600080fd5b506102b86103ce36600461325f565b61095d565b3480156103df57600080fd5b506103566103ee366004613289565b610c76565b6102b861040136600461325f565b610d1e565b34801561041257600080fd5b506102f060095481565b34801561042857600080fd5b5060125b60405160ff90911681526020016102fa565b34801561044a57600080fd5b5061035661045936600461325f565b610f34565b34801561046a57600080fd5b506102b861047936600461325f565b610f6a565b34801561048a57600080fd5b506102b86104993660046132c5565b6110c6565b3480156104aa57600080fd5b506102f0600a5481565b3480156104c057600080fd5b506102f06104cf3660046131f6565b600c6020526000908152604090205481565b3480156104ed57600080fd5b506102b86104fc3660046132e8565b61117e565b34801561050d57600080fd5b506102b861051c3660046132e8565b611248565b34801561052d57600080fd5b50601254610386906001600160a01b031681565b34801561054d57600080fd5b506102f060085481565b34801561056357600080fd5b506102f06105723660046131f6565b6115fe565b34801561058357600080fd5b506102f060065481565b34801561059957600080fd5b506103566105a83660046131f6565b6001600160a01b03166000908152600e602052604090205460ff1690565b3480156105d257600080fd5b50600b5461042c9060ff1681565b3480156105ec57600080fd5b506102b86105fb3660046132e8565b611620565b34801561060c57600080fd5b506102f061061b36600461325f565b6116d8565b34801561062c57600080fd5b506102b861063b366004613289565b611786565b34801561064c57600080fd5b506102b861065b3660046131f6565b611ba2565b34801561066c57600080fd5b506102f060045481565b34801561068257600080fd5b506102b861069136600461325f565b611c19565b3480156106a257600080fd5b506102b86106b1366004613301565b611c7a565b3480156106c257600080fd5b506103566106d136600461325f565b611e47565b3480156106e257600080fd5b506103566106f136600461325f565b611ed4565b34801561070257600080fd5b506102f07f00000000000000000000000000000000000000000000000821ab0d441498000081565b34801561073657600080fd5b506102f0600f5481565b34801561074c57600080fd5b506102f061075b3660046132e8565b611ee1565b34801561076c57600080fd5b506102b861077b3660046132c5565b611f24565b34801561078c57600080fd5b506102f061079b3660046132e8565b611fe4565b3480156107ac57600080fd5b506102b86107bb366004613289565b612015565b3480156107cc57600080fd5b506102b86107db3660046131f6565b61249d565b3480156107ec57600080fd5b506000546102f0565b34801561080157600080fd5b506102f0610810366004613334565b612515565b34801561082157600080fd5b506102f060055481565b34801561083757600080fd5b506102b8610846366004613375565b612540565b34801561085757600080fd5b506102b861086636600461325f565b6125f1565b34801561087757600080fd5b506102f06108863660046131f6565b6127f5565b34801561089757600080fd5b50601154610386906001600160a01b031681565b6003546001600160a01b031633146108de5760405162461bcd60e51b81526004016108d590613392565b60405180910390fd5b601280546001600160a01b0319166001600160a01b0383161790556040517f78816b31283624f96a34a58e5f9cb743d63d7a325d42d4be00858daa99cf96199061092b90839042906133c1565b60405180910390a150565b6000610943338484612813565b5060015b92915050565b600061095860065490565b905090565b6001600160a01b0382166000908152600e602052604090205460ff166109d15760405162461bcd60e51b8152602060048201526024808201527f70726f7669646572206973206e6f74206120526564656d7074696f6e50726f7660448201526334b232b960e11b60648201526084016108d5565b6001600160a01b0382166000908152600d6020526040902054811115610a4a5760405162461bcd60e51b815260206004820152602860248201527f65757364416d6f756e742063616e6e6f7420737572706173732070726f766964604482015267195c9cc81919589d60c21b60648201526084016108d5565b6000610a54612920565b6001600160a01b0384166000908152600d6020908152604080832054600c9092528220549293509091610a889084906133f0565b610a939060646133f0565b610a9d9190613407565b905068056bc75e2d63100000811015610b115760405162461bcd60e51b815260206004820152603060248201527f70726f7669646572277320636f6c6c61746572616c20726174652073686f756c60448201526f64206d6f7265207468616e203130302560801b60648201526084016108d5565b610b1c33858561299a565b6000612710600a54612710610b319190613429565b84610b4487670de0b6b3a76400006133f0565b610b4e9190613407565b610b5891906133f0565b610b629190613407565b6001600160a01b0386166000908152600c6020526040812080549293508392909190610b8f908490613429565b925050819055508060046000828254610ba89190613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610bdf90339085906004016133c1565b6020604051808303816000875af1158015610bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c22919061343c565b506040805185815260208101839052428183015290516001600160a01b0387169133917f1a7ab636ab77b4d93c0afba804a009a127e77def45e623e572144ca8f8a03ac59181900360600190a35050505050565b6001600160a01b038316600090815260026020908152604080832033845290915281205482811015610cf45760405162461bcd60e51b815260206004820152602160248201527f5452414e534645525f414d4f554e545f455843454544535f414c4c4f57414e436044820152604560f81b60648201526084016108d5565b610cff858585612b26565b610d138533610d0e8487612bde565b612813565b506001949350505050565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000341015610ddb5760405162461bcd60e51b815260206004820152602660248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015265189022aa241760d11b60648201526084016108d5565b60105460035460405163a1903eab60e01b81526001600160a01b039182166004820152600092919091169063a1903eab90349060240160206040518083038185885af1158015610e2f573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610e549190613459565b905060008111610e955760405162461bcd60e51b815260206004820152600c60248201526b16915493d7d1115413d4d25560a21b60448201526064016108d5565b3460046000828254610ea79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054349290610ed4908490613472565b90915550508115610eea57610eea838484612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89333442604051610f2793929190613485565b60405180910390a2505050565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610943918590610d0e9086612d00565b6001600160a01b038216610fbb5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b60008111610ff75760405162461bcd60e51b815260206004820152600960248201526816915493d7d352539560ba1b60448201526064016108d5565b611002338383612bea565b600a61100c61094d565b336000908152600d60205260409020546110279060646133f0565b6110319190613407565b11801561104f57506a084595161401484a00000061104d61094d565b115b156110c25760405162461bcd60e51b815260206004820152603860248201527f4d696e7420416d6f756e742063616e6e6f74206265206d6f7265207468616e2060448201527f313025206f6620746f74616c2063697263756c6174696f6e000000000000000060648201526084016108d5565b5050565b6003546001600160a01b031633146110f05760405162461bcd60e51b81526004016108d590613392565b6101f48160ff1611156111455760405162461bcd60e51b815260206004820152601860248201527f4d617820526564656d7074696f6e20466565206973203525000000000000000060448201526064016108d5565b60ff8116600a8190556040519081527f4dbf9634a3aaf3bc15ab627faeaac7c6b0a4754ead77206f1c11277356f2878f9060200161092b565b6003546001600160a01b031633146111a85760405162461bcd60e51b81526004016108d590613392565b6808ac7230489e8000008110156112135760405162461bcd60e51b815260206004820152602960248201527f5361666520436f6c6c61746572616c526174652073686f756c64206d6f7265206044820152687468616e203136302560b81b60648201526084016108d5565b60098190556040518181527f0447b351edf3bf02a602777192e1d189ac70324a0ca5502acd0d0918601eeb2e9060200161092b565b6000611252612920565b61126483670de0b6b3a76400006133f0565b61126e9190613407565b600480546010546040516370a0823160e01b81523093810193909352929350916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112e29190613459565b6112ec9190613429565b81111580156112fb5750600081115b6113575760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204c53442065786365737320696e636f6d652063616e20626520657860448201526618da185b99d95960ca1b60648201526084016108d5565b6000611361612d0c565b600f5461136e9190613472565b905080831115611473576012546113909033906001600160a01b031683612b26565b601254604051633c6b16ab60e01b8152600481018390526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156113d657600080fd5b505af11580156113ea573d6000803e3d6000fd5b5050505060006113ff828561075b9190613429565b905080600003611416576114138285613429565b90505b6114203382612d50565b506000600f55601254604080518481524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a250611540565b60125461148b9033906001600160a01b031685612b26565b601254604051633c6b16ab60e01b8152600481018590526001600160a01b0390911690633c6b16ab90602401600060405180830381600087803b1580156114d157600080fd5b505af11580156114e5573d6000803e3d6000fd5b5050505082816114f59190613429565b600f55601254604080518581524260208201526001600160a01b03909216917fec0804e8e1decb589af9c4ba8ebfbacd3be98929d4d53457dfd186061f489f04910160405180910390a25b4260055560105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061157690339086906004016133c1565b6020604051808303816000875af1158015611595573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b9919061343c565b506040805183815260208101859052428183015290517fefa202e78b2ad7b96336e662b73d2b83b60668758a857269bd4d0962828329d19181900360600190a1505050565b6001600160a01b03811660009081526001602052604081205461094790611fe4565b6003546001600160a01b0316331461164a5760405162461bcd60e51b81526004016108d590613392565b609681111561169b5760405162461bcd60e51b815260206004820152601d60248201527f426f72726f77204150592063616e6e6f742065786365656420312e352500000060448201526064016108d5565b6116a3612ebf565b60088190556040518181527f3c62c9955fa46bea884e885afde8e7f674d06a027511ecb871d191869b8ab4819060200161092b565b60006116e5338484612ee3565b6040518281526001600160a01b0384169033907f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb9060200160405180910390a3600061173083611fe4565b9050836001600160a01b0316336001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161177791815260200190565b60405180910390a39392505050565b6000611790612920565b6001600160a01b0384166000908152600d6020908152604080832054600c90925282205492935090916117c49084906133f0565b6117cf9060646133f0565b6117d99190613407565b90507f00000000000000000000000000000000000000000000000821ab0d441498000081106118705760405162461bcd60e51b815260206004820152603860248201527f426f72726f7765727320636f6c6c61746572616c20726174652073686f756c6460448201527f2062656c6f7720626164436f6c6c61746572616c52617465000000000000000060648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020546118948460026133f0565b11156118f45760405162461bcd60e51b815260206004820152602960248201527f61206d6178206f662035302520636f6c6c61746572616c2063616e206265206c6044820152681a5c5d5a59185d195960ba1b60648201526084016108d5565b6000670de0b6b3a764000061190984866133f0565b6119139190613407565b9050806119208730612515565b101561193e5760405162461bcd60e51b81526004016108d5906134a6565b61194986868361299a565b6000600a61195886600b6133f0565b6119629190613407565b905080600460008282546119769190613429565b90915550506001600160a01b0386166000908152600c6020526040812080548392906119a3908490613429565b9091555060009050336001600160a01b03891603611a365760105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906119ed90339086906004016133c1565b6020604051808303816000875af1158015611a0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a30919061343c565b50611b4a565b600b54606e90611a499060ff16846133f0565b611a539190613407565b6010549091506001600160a01b031663a9059cbb89611a728486613429565b6040518363ffffffff1660e01b8152600401611a8f9291906133c1565b6020604051808303816000875af1158015611aae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad2919061343c565b5060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90611b0590339085906004016133c1565b6020604051808303816000875af1158015611b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b48919061343c565b505b866001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad8933868686600042604051611b9097969594939291906134fb565b60405180910390a25050505050505050565b6003546001600160a01b03163314611bcc5760405162461bcd60e51b81526004016108d590613392565b601180546001600160a01b0319166001600160a01b0383161790556040517ffb30b10d69603a569e0dfcd8d074a070a51641dfbbe940536f216933cf6208889061092b90839042906133c1565b6001600160a01b038216611c6f5760405162461bcd60e51b815260206004820152601860248201527f4255524e5f544f5f5448455f5a45524f5f41444452455353000000000000000060448201526064016108d5565b6110c233838361299a565b6001600160a01b038316611cd05760405162461bcd60e51b815260206004820152601b60248201527f4445504f5349545f544f5f5448455f5a45524f5f41444452455353000000000060448201526064016108d5565b670de0b6b3a7640000821015611d395760405162461bcd60e51b815260206004820152602860248201527f4465706f7369742073686f756c64206e6f74206265206c657373207468616e20604482015267189039ba22aa241760c11b60648201526084016108d5565b6010546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015611d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611db4919061343c565b508160046000828254611dc79190613472565b90915550506001600160a01b0383166000908152600c602052604081208054849290611df4908490613472565b90915550508015611e0a57611e0a838483612bea565b826001600160a01b03167f819557bb6c528588eb5c050cf4dd54b96956b6f93a5232c6b429d19e95fe8e89338442604051610f2793929190613485565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611ebb5760405162461bcd60e51b815260206004820152601e60248201527f4445435245415345445f414c4c4f57414e43455f42454c4f575f5a45524f000060448201526064016108d5565b611eca3385610d0e8487612bde565b5060019392505050565b6000610943338484612b26565b600080611eed60065490565b905080600003611f005750600092915050565b611f1d81611f17611f1060005490565b8690613053565b9061305f565b9392505050565b6003546001600160a01b03163314611f4e5760405162461bcd60e51b81526004016108d590613392565b60058160ff161115611fa25760405162461bcd60e51b815260206004820152601760248201527f4d6178204b65657065722072657761726420697320352500000000000000000060448201526064016108d5565b600b805460ff191660ff83169081179091556040519081527f8e22963d45681714fade6b520d66ef5902422aac2bc9705573c0237d6a8f002a9060200161092b565b600080611ff060005490565b90506000546000036120055750600092915050565b611f1d81611f17611f1060065490565b600061201f612920565b90507f00000000000000000000000000000000000000000000000821ab0d441498000061204a61094d565b8260045461205891906133f0565b6120639060646133f0565b61206d9190613407565b106120ca5760405162461bcd60e51b815260206004820152602760248201527f6f766572616c6c436f6c6c61746572616c526174652073686f756c642062656c6044820152666f77203135302560c81b60648201526084016108d5565b6001600160a01b0383166000908152600d6020908152604080832054600c9092528220546120f99084906133f0565b6121049060646133f0565b61210e9190613407565b90506806c6b935b8bbd40000811061217b5760405162461bcd60e51b815260206004820152602a60248201527f626f72726f7765727320636f6c6c61746572616c526174652073686f756c642060448201526962656c6f77203132352560b01b60648201526084016108d5565b6001600160a01b0384166000908152600c60205260409020548311156121f95760405162461bcd60e51b815260206004820152602d60248201527f746f74616c206f6620636f6c6c61746572616c2063616e206265206c6971756960448201526c19185d195908185d081b5bdcdd609a1b60648201526084016108d5565b6000670de0b6b3a764000061220e84866133f0565b6122189190613407565b905068056bc75e2d63100000821061224b578161223e8268056bc75e2d631000006133f0565b6122489190613407565b90505b806122568730612515565b10156122745760405162461bcd60e51b81526004016108d5906134a6565b61227f86868361299a565b83600460008282546122919190613429565b90915550506001600160a01b0385166000908152600c6020526040812080548692906122be908490613429565b9091555060009050336001600160a01b0388161480159061231e5750600b546122f29060ff16670de0b6b3a764000061353b565b61230f9067ffffffffffffffff1668056bc75e2d63100000613567565b68ffffffffffffffffff168310155b156123c957600b5483906123359060ff16876133f0565b61234790670de0b6b3a76400006133f0565b6123519190613407565b60105460405163a9059cbb60e01b81529192506001600160a01b03169063a9059cbb9061238490339085906004016133c1565b6020604051808303816000875af11580156123a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123c7919061343c565b505b6010546001600160a01b031663a9059cbb886123e58489613429565b6040518363ffffffff1660e01b81526004016124029291906133c1565b6020604051808303816000875af1158015612421573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612445919061343c565b50856001600160a01b03167fb59dc9737d55b75fc6ca7522e82d6161da5d7c8337b9ab990a5846f95b5ccdad883385898660014260405161248c97969594939291906134fb565b60405180910390a250505050505050565b6003546001600160a01b031633146124c75760405162461bcd60e51b81526004016108d590613392565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527f85314cee79a1d748bc922aee2e7514c754944bae54b9c5467dfd99629410fa9a9060200161092b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60115460405163fce67e0d60e01b81523360048201526001600160a01b039091169063fce67e0d90602401600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050336000818152600e6020908152604091829020805460ff19168715159081179091558251938452908301527f3d9a02fcbaf508c27fa7c97d8e5795c8619e39299b3e8b7779fbe1f8d5de7970935001905061092b565b6001600160a01b0382166126475760405162461bcd60e51b815260206004820152601c60248201527f57495448445241575f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b600081116126875760405162461bcd60e51b815260206004820152600d60248201526c5a45524f5f574954484452415760981b60448201526064016108d5565b336000908152600c60205260409020548111156126dd5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742042616c616e636560601b60448201526064016108d5565b80600460008282546126ef9190613429565b9091555050336000908152600c602052604081208054839290612713908490613429565b909155505060105460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061274a90859085906004016133c1565b6020604051808303816000875af1158015612769573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061278d919061343c565b50336000908152600d6020526040902054156127ac576127ac3361306b565b816001600160a01b03167f7af7d9e5b71152303ff7a5221e1a22febc3cf6407ea2a05f870d770097177db03383426040516127e993929190613485565b60405180910390a25050565b6001600160a01b038116600090815260016020526040812054610947565b6001600160a01b0383166128695760405162461bcd60e51b815260206004820152601960248201527f415050524f56455f46524f4d5f5a45524f5f414444524553530000000000000060448201526064016108d5565b6001600160a01b0382166128bf5760405162461bcd60e51b815260206004820152601760248201527f415050524f56455f544f5f5a45524f5f4144445245535300000000000000000060448201526064016108d5565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6000734c517d4e2c851ca76d7ec94b805269df0f2201de6001600160a01b0316630fdb11cf6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612976573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109589190613459565b6001600160a01b0382166000908152600d6020526040902054811115612a155760405162461bcd60e51b815260206004820152602a60248201527f5265706179696e6720416d6f756e742053757270617373657320426f72726f776044820152691a5b99c8105b5bdd5b9d60b21b60648201526084016108d5565b6000612a2082611ee1565b9050612a2c8482612d50565b5060115460405163fce67e0d60e01b81526001600160a01b0385811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612a7457600080fd5b505af1158015612a88573d6000803e3d6000fd5b505050506001600160a01b0383166000908152600d602052604081208054849290612ab4908490613429565b90915550612ac29050612ebf565b8160066000828254612ad49190613429565b92505081905550826001600160a01b03167f5d624aa9c148153ab3446c1b154f660ee7701e549fe9b62dab7171b1c80e6fa2858442604051612b1893929190613485565b60405180910390a250505050565b6000612b3182611ee1565b9050612b3e848483612ee3565b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051612b8391815260200190565b60405180910390a3826001600160a01b0316846001600160a01b03167f9d9c909296d9c674451c0c24f02cb64981eb3b727f99865939192f880a755dcb83604051612bd091815260200190565b60405180910390a350505050565b6000611f1d8284613429565b6000612bf582611ee1565b905080600003612c025750805b60115460405163fce67e0d60e01b81526001600160a01b0386811660048301529091169063fce67e0d90602401600060405180830381600087803b158015612c4957600080fd5b505af1158015612c5d573d6000803e3d6000fd5b505050506001600160a01b0384166000908152600d602052604081208054849290612c89908490613472565b90915550612c999050838261312b565b50612ca2612ebf565b8160066000828254612cb49190613472565b90915550612cc390508461306b565b826001600160a01b03167f2f00e3cdd69a77be7ed215ec7b2a36784dd158f921fca79ac29deffa353fe6ee338442604051612b1893929190613485565b6000611f1d8284613472565b600061271060075460055442612d229190613429565b600854600654612d3291906133f0565b612d3c91906133f0565b612d469190613407565b6109589190613407565b60006001600160a01b038316612da85760405162461bcd60e51b815260206004820152601a60248201527f4255524e5f46524f4d5f5448455f5a45524f5f4144445245535300000000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480831115612e115760405162461bcd60e51b815260206004820152601b60248201527f4255524e5f414d4f554e545f455843454544535f42414c414e4345000000000060448201526064016108d5565b6000612e1c84611fe4565b9050612e3184612e2b60005490565b90612bde565b60008190559250612e428285612bde565b6001600160a01b038616600090815260016020526040812091909155612e6785611fe4565b60408051848152602081018390529081018790529091506001600160a01b038716907f8b2a1e1ad5e0578c3dd82494156e985dade827a87c573b5c1c7716a32162ad649060600160405180910390a250505092915050565b612ec7612d0c565b600f6000828254612ed89190613472565b909155505042600555565b6001600160a01b038316612f395760405162461bcd60e51b815260206004820152601e60248201527f5452414e534645525f46524f4d5f5448455f5a45524f5f41444452455353000060448201526064016108d5565b6001600160a01b038216612f8f5760405162461bcd60e51b815260206004820152601c60248201527f5452414e534645525f544f5f5448455f5a45524f5f414444524553530000000060448201526064016108d5565b6001600160a01b03831660009081526001602052604090205480821115612ff85760405162461bcd60e51b815260206004820152601f60248201527f5452414e534645525f414d4f554e545f455843454544535f42414c414e43450060448201526064016108d5565b6130028183612bde565b6001600160a01b0380861660009081526001602052604080822093909355908516815220546130319083612d00565b6001600160a01b03909316600090815260016020526040902092909255505050565b6000611f1d82846133f0565b6000611f1d8284613407565b6009546001600160a01b0382166000908152600d602052604090205461308f612920565b6001600160a01b0384166000908152600c60205260409020546130b291906133f0565b6130bd9060646133f0565b6130c79190613407565b10156131285760405162461bcd60e51b815260206004820152602a60248201527f636f6c6c61746572616c526174652069732042656c6f772073616665436f6c6c60448201526961746572616c5261746560b01b60648201526084016108d5565b50565b60006001600160a01b03831661317e5760405162461bcd60e51b81526020600482015260186024820152774d494e545f544f5f5448455f5a45524f5f4144445245535360401b60448201526064016108d5565b6131918261318b60005490565b90612d00565b60008181556001600160a01b0385168152600160205260409020549091506131b99083612d00565b6001600160a01b039093166000908152600160205260409020929092555090565b80356001600160a01b03811681146131f157600080fd5b919050565b60006020828403121561320857600080fd5b611f1d826131da565b600060208083528351808285015260005b8181101561323e57858101830151858201604001528201613222565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561327257600080fd5b61327b836131da565b946020939093013593505050565b60008060006060848603121561329e57600080fd5b6132a7846131da565b92506132b5602085016131da565b9150604084013590509250925092565b6000602082840312156132d757600080fd5b813560ff81168114611f1d57600080fd5b6000602082840312156132fa57600080fd5b5035919050565b60008060006060848603121561331657600080fd5b61331f846131da565b95602085013595506040909401359392505050565b6000806040838503121561334757600080fd5b613350836131da565b915061335e602084016131da565b90509250929050565b801515811461312857600080fd5b60006020828403121561338757600080fd5b8135611f1d81613367565b60208082526015908201527423b7bb32b93730b136329d103337b93134b23232b760591b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610947576109476133da565b60008261342457634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115610947576109476133da565b60006020828403121561344e57600080fd5b8151611f1d81613367565b60006020828403121561346b57600080fd5b5051919050565b80820180821115610947576109476133da565b6001600160a01b039390931683526020830191909152604082015260600190565b60208082526035908201527f70726f76696465722073686f756c6420617574686f72697a6520746f2070726f6040820152741d9a5919481b1a5c5d5a59185d1a5bdb88115554d1605a1b606082015260800190565b6001600160a01b039788168152959096166020860152604085019390935260608401919091526080830152151560a082015260c081019190915260e00190565b67ffffffffffffffff81811683821602808216919082811461355f5761355f6133da565b505092915050565b68ffffffffffffffffff818116838216019080821115613589576135896133da565b509291505056fea2646970667358221220bc65e4a4fb18b1f5f97dcfbbea162a8c2708052c7e17cc41775af03291d08e0f64736f6c63430008110033
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.