Overview
Max Total Supply
97,435.797827112431697599 eUSD
Holders
1,679 (0.00%)
Market
Price
$1.06 @ 0.000538 ETH
Onchain Market Cap
$103,476.82
Circulating Supply Market Cap
$640,777.00
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.000000000000000001 eUSDValue
$0.00 ( ~0 Eth) [0.0000%]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
Contract ABI
API[{"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.
Add Token to MetaMask (Web3)