Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- MyFi
- Optimization enabled
- true
- Compiler version
- v0.8.19+commit.7dd6d404
- Optimization runs
- 200
- EVM Version
- paris
- Verified at
- 2026-04-08T20:19:16.856891Z
contracts/AER/MYFI.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;
/**
* @title MyFi (MYFI)
* @notice Backed by eDAI 1:1. Minted by the ArtistTokenFactory on every stream.
* No maximum supply — MYFI supply grows with platform usage but is always
* fully backed by eDAI in the treasury. Any holder can redeem MYFI → eDAI
* at any time via redeemForEDAI().
*
* @dev Arbitrage starts disabled (0%). Enable when MYFI/eDAI PulseX LP is deep enough.
* Factory must be added as authorizedMinter: setMinter(factory, true)
*/
interface IERC20 {
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
}
interface IPulseXRouter {
function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external returns (uint[] memory amounts);
function getAmountsOut(uint amountIn, address[] memory path)
external view returns (uint[] memory amounts);
}
contract MyFi {
string public constant name = "MyFi";
string public constant symbol = "MYFI";
uint8 public constant decimals = 18;
// No MAX_SUPPLY — MYFI is always fully backed by eDAI.
// Supply grows with platform usage (streaming, graduations) and shrinks
// with redemptions. There is no inflation risk because every MYFI minted
// has exactly 1 eDAI deposited into the treasury backing it.
uint256 private _totalSupply;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
address public owner;
address public pendingOwner;
address public oracle;
address public constant EDAI = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
address public constant ROUTER = 0x165C3410fC91EF562C50559f7d2289fEbed552d9;
uint256 public baseBackingEDAI;
uint256 public arbitrageProfitEDAI;
mapping(address => uint256) public totalEarned;
mapping(address => uint256) public totalRedeemed;
mapping(address => bool) public authorizedMinters;
bool private _paused;
bool private _locked;
// Arbitrage settings — start conservative, tune as LP deepens
uint256 public arbitragePercent = 0; // Start at 0% — disable until LP is deep
uint256 public minSpreadBps = 200; // 2% minimum spread to arb
uint256 public maxSpreadBps = 1000; // 10% max (flash loan protection)
uint256 public maxArbitragePerTx = 100 * 1e18; // 100 eDAI max per tx — conservative start
uint256 public minArbitrageAmount = 5 * 1e18; // Only arb if >= 5 eDAI (gas efficiency)
uint256 public constant MIN_DEPOSIT = 1e12; // 0.000001 eDAI minimum (tiny streaming amounts)
uint256 public totalArbitrageProfits;
uint256 public totalArbitrageExecuted;
uint256 public totalArbitrageSkipped;
// ── Events ────────────────────────────────────────────────────────────────
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
event TaxDeposited(address indexed creator, uint256 edaiAmount, uint256 myfiMinted);
event ArbitrageExecuted(bool isSell, uint256 edaiAmount, uint256 myfiAmount, uint256 profit, uint256 newBacking);
event ArbitrageSkipped(string reason, uint256 edaiAmount);
event Redeemed(address indexed user, uint256 myfiAmount, uint256 edaiReceived);
event BackingUpdated(uint256 totalBacking, uint256 backingPerMyfi);
event Paused(address account);
event Unpaused(address account);
event OwnershipTransferInitiated(address indexed previousOwner, address indexed newOwner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
event ArbitrageSettingsUpdated(uint256 percent, uint256 minSpread, uint256 maxSpread, uint256 maxSize, uint256 minAmount);
// ── Modifiers ─────────────────────────────────────────────────────────────
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
modifier onlyOracle() {
require(msg.sender == oracle || authorizedMinters[msg.sender], "Not authorized");
_;
}
modifier whenNotPaused() {
require(!_paused, "Paused");
_;
}
modifier nonReentrant() {
require(!_locked, "Reentrant");
_locked = true;
_;
_locked = false;
}
constructor() {
owner = msg.sender;
}
// ─────────────────────────────────────────────────────────────────────────
// ERC20
// ─────────────────────────────────────────────────────────────────────────
function totalSupply() public view returns (uint256) { return _totalSupply; }
function balanceOf(address account) public view returns (uint256) { return _balances[account]; }
function transfer(address to, uint256 amount) public whenNotPaused returns (bool) {
_transfer(msg.sender, to, amount);
return true;
}
function allowance(address tokenOwner, address spender) public view returns (uint256) {
return _allowances[tokenOwner][spender];
}
function approve(address spender, uint256 amount) public returns (bool) {
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(address from, address to, uint256 amount) public whenNotPaused returns (bool) {
_spendAllowance(from, msg.sender, amount);
_transfer(from, to, amount);
return true;
}
// ─────────────────────────────────────────────────────────────────────────
// CORE — depositTax
// ─────────────────────────────────────────────────────────────────────────
/**
* @notice Called by ArtistTokenFactory on every stream event.
* Pulls eDAI from the factory (factory has pre-approved this contract),
* optionally runs arbitrage on a portion, then mints MYFI to `creator`.
*
* With arbitragePercent = 0 (default):
* All eDAI → baseBackingEDAI, MYFI minted 1:1 to creator.
*
* @param creator Recipient of newly minted MYFI (artist, user, jackpot, etc.)
* @param edaiAmount eDAI to pull from msg.sender (the factory)
* @return myfiMinted MYFI tokens minted to creator
* @return profitCaptured eDAI profit from arbitrage (0 if arb disabled)
*/
function depositTax(address creator, uint256 edaiAmount)
external
onlyOracle
whenNotPaused
nonReentrant
returns (uint256 myfiMinted, uint256 profitCaptured)
{
require(creator != address(0), "Invalid creator");
require(edaiAmount >= MIN_DEPOSIT, "Below minimum");
bool success = IERC20(EDAI).transferFrom(msg.sender, address(this), edaiAmount);
require(success, "eDAI transfer failed");
uint256 arbitrageEDAI = (edaiAmount * arbitragePercent) / 100;
uint256 creatorEDAI = edaiAmount - arbitrageEDAI;
// Cap arb to maxArbitragePerTx, excess goes to creator
if (arbitrageEDAI > maxArbitragePerTx) {
uint256 excess = arbitrageEDAI - maxArbitragePerTx;
arbitrageEDAI = maxArbitragePerTx;
creatorEDAI += excess;
}
if (arbitrageEDAI > 0 && arbitrageEDAI >= minArbitrageAmount) {
profitCaptured = _executeArbitrage(arbitrageEDAI);
} else if (arbitrageEDAI > 0) {
// Too small to arb — add directly to backing
baseBackingEDAI += arbitrageEDAI;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Amount too small", arbitrageEDAI);
}
myfiMinted = creatorEDAI;
baseBackingEDAI += creatorEDAI;
totalEarned[creator] += myfiMinted;
_mint(creator, myfiMinted);
emit TaxDeposited(creator, edaiAmount, myfiMinted);
emit BackingUpdated(getTotalBacking(), getBackingPerMyfi());
return (myfiMinted, profitCaptured);
}
// ─────────────────────────────────────────────────────────────────────────
// ARBITRAGE
// ─────────────────────────────────────────────────────────────────────────
function _executeArbitrage(uint256 edaiAmount) internal returns (uint256 profit) {
if (arbitragePercent == 0) {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Arbitrage disabled", edaiAmount);
return 0;
}
uint256 backingPerMyfi = getBackingPerMyfi();
uint256 dexPrice = _getDexPrice();
uint256 spreadBps;
if (dexPrice > backingPerMyfi) {
spreadBps = ((dexPrice - backingPerMyfi) * 10000) / backingPerMyfi;
if (spreadBps > maxSpreadBps) {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Spread too large (manipulation?)", edaiAmount);
return 0;
}
if (spreadBps >= minSpreadBps) {
profit = _sellArbitrage(edaiAmount, backingPerMyfi, dexPrice);
} else {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Spread too small", edaiAmount);
}
} else if (dexPrice < backingPerMyfi) {
spreadBps = ((backingPerMyfi - dexPrice) * 10000) / backingPerMyfi;
if (spreadBps > maxSpreadBps) {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Spread too large (manipulation?)", edaiAmount);
return 0;
}
if (spreadBps >= minSpreadBps) {
profit = _buyArbitrage(edaiAmount, backingPerMyfi, dexPrice);
} else {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Spread too small", edaiAmount);
}
} else {
baseBackingEDAI += edaiAmount;
totalArbitrageSkipped++;
emit ArbitrageSkipped("Prices equal", edaiAmount);
}
return profit;
}
function _sellArbitrage(uint256 edaiAmount, uint256 backingPerMyfi, uint256 dexPrice) internal returns (uint256 profit) {
uint256 myfiToMint = (edaiAmount * 1e18) / backingPerMyfi;
_mint(address(this), myfiToMint);
_approve(address(this), ROUTER, myfiToMint);
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = EDAI;
uint256 minOut = (myfiToMint * dexPrice * 98) / (1e18 * 100);
uint256[] memory amounts = IPulseXRouter(ROUTER).swapExactTokensForTokens(
myfiToMint, minOut, path, address(this), block.timestamp + 300
);
uint256 edaiReceived = amounts[1];
if (edaiReceived > edaiAmount) {
profit = edaiReceived - edaiAmount;
arbitrageProfitEDAI += profit;
totalArbitrageProfits += profit;
totalArbitrageExecuted++;
}
emit ArbitrageExecuted(true, edaiAmount, myfiToMint, profit, getBackingPerMyfi());
return profit;
}
function _buyArbitrage(uint256 edaiAmount, uint256 /* backingPerMyfi */, uint256 dexPrice) internal returns (uint256 profit) {
IERC20(EDAI).approve(ROUTER, edaiAmount);
address[] memory path = new address[](2);
path[0] = EDAI;
path[1] = address(this);
uint256 minMyfi = (edaiAmount * 1e18 * 98) / (dexPrice * 100);
uint256[] memory amounts = IPulseXRouter(ROUTER).swapExactTokensForTokens(
edaiAmount, minMyfi, path, address(this), block.timestamp + 300
);
uint256 myfiBought = amounts[1];
_burn(address(this), myfiBought);
totalArbitrageExecuted++;
emit ArbitrageExecuted(false, edaiAmount, myfiBought, 0, getBackingPerMyfi());
return 0;
}
// ─────────────────────────────────────────────────────────────────────────
// REDEMPTION
// ─────────────────────────────────────────────────────────────────────────
/**
* @notice Burn MYFI to receive eDAI from the treasury.
* Rate: backingPerMyfi eDAI per MYFI (always ≥ 1e18 as profits accumulate).
*/
function redeemForEDAI(uint256 myfiAmount) external whenNotPaused nonReentrant returns (uint256 edaiAmount) {
require(myfiAmount > 0, "Invalid amount");
require(_balances[msg.sender] >= myfiAmount, "Insufficient balance");
require(_totalSupply > 0, "No supply");
uint256 backingPerMyfi = getBackingPerMyfi();
edaiAmount = (myfiAmount * backingPerMyfi) / 1e18;
require(edaiAmount > 0, "Amount too small");
uint256 treasuryBalance = IERC20(EDAI).balanceOf(address(this));
require(treasuryBalance >= edaiAmount, "Insufficient treasury");
uint256 burnRatio = (myfiAmount * 1e18) / _totalSupply;
uint256 baseUsed = (baseBackingEDAI * burnRatio) / 1e18;
uint256 profitUsed = (arbitrageProfitEDAI * burnRatio) / 1e18;
baseBackingEDAI -= baseUsed;
arbitrageProfitEDAI -= profitUsed;
totalRedeemed[msg.sender] += myfiAmount;
_burn(msg.sender, myfiAmount);
bool success = IERC20(EDAI).transfer(msg.sender, edaiAmount);
require(success, "eDAI transfer failed");
emit Redeemed(msg.sender, myfiAmount, edaiAmount);
emit BackingUpdated(getTotalBacking(), getBackingPerMyfi());
return edaiAmount;
}
// ─────────────────────────────────────────────────────────────────────────
// VIEW
// ─────────────────────────────────────────────────────────────────────────
function getTotalBacking() public view returns (uint256) {
return baseBackingEDAI + arbitrageProfitEDAI;
}
function getBackingPerMyfi() public view returns (uint256) {
if (_totalSupply == 0) return 1e18;
return (getTotalBacking() * 1e18) / _totalSupply;
}
function getTreasuryBalance() external view returns (uint256) {
return IERC20(EDAI).balanceOf(address(this));
}
function estimateRedemption(uint256 myfiAmount) external view returns (uint256) {
if (_totalSupply == 0) return 0;
return (myfiAmount * getBackingPerMyfi()) / 1e18;
}
function getArbitrageStats() external view returns (
uint256 totalProfits,
uint256 totalExecuted,
uint256 totalSkipped,
uint256 currentBacking,
uint256 backingGrowthBps
) {
totalProfits = totalArbitrageProfits;
totalExecuted = totalArbitrageExecuted;
totalSkipped = totalArbitrageSkipped;
currentBacking = getBackingPerMyfi();
backingGrowthBps = currentBacking > 1e18
? ((currentBacking - 1e18) * 10000) / 1e18 : 0;
}
function paused() public view returns (bool) { return _paused; }
function _getDexPrice() internal view returns (uint256) {
address[] memory path = new address[](2);
path[0] = address(this);
path[1] = EDAI;
try IPulseXRouter(ROUTER).getAmountsOut(1e18, path) returns (uint[] memory amounts) {
return amounts[1];
} catch {
return getBackingPerMyfi();
}
}
// ─────────────────────────────────────────────────────────────────────────
// ADMIN
// ─────────────────────────────────────────────────────────────────────────
function setOracle(address _oracle) external onlyOwner {
require(_oracle != address(0), "Invalid");
oracle = _oracle;
}
/**
* @notice Authorize or deauthorize a minter (e.g. ArtistTokenFactory).
* ArtistTokenFactory must be added: setMinter(factoryAddress, true)
*/
function setMinter(address minter, bool authorized) external onlyOwner {
authorizedMinters[minter] = authorized;
}
function setArbitrageSettings(
uint256 _arbitragePercent,
uint256 _minSpreadBps,
uint256 _maxSpreadBps,
uint256 _maxArbitragePerTx,
uint256 _minArbitrageAmount
) external onlyOwner {
require(_arbitragePercent <= 50, "Max 50%");
require(_minSpreadBps >= 50, "Min 0.5%");
require(_maxSpreadBps <= 2000, "Max 20%");
require(_maxSpreadBps >= _minSpreadBps, "Max < min");
arbitragePercent = _arbitragePercent;
minSpreadBps = _minSpreadBps;
maxSpreadBps = _maxSpreadBps;
maxArbitragePerTx = _maxArbitragePerTx;
minArbitrageAmount = _minArbitrageAmount;
emit ArbitrageSettingsUpdated(
_arbitragePercent, _minSpreadBps, _maxSpreadBps,
_maxArbitragePerTx, _minArbitrageAmount
);
}
function pause() external onlyOwner {
_paused = true;
emit Paused(msg.sender);
}
function unpause() external onlyOwner {
_paused = false;
emit Unpaused(msg.sender);
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0), "Invalid");
pendingOwner = newOwner;
emit OwnershipTransferInitiated(owner, newOwner);
}
function acceptOwnership() external {
require(msg.sender == pendingOwner, "Not pending owner");
address oldOwner = owner;
owner = pendingOwner;
pendingOwner = address(0);
emit OwnershipTransferred(oldOwner, owner);
}
function emergencyWithdrawEDAI(uint256 amount) external onlyOwner {
require(_paused, "Must pause first");
bool success = IERC20(EDAI).transfer(owner, amount);
require(success, "Failed");
}
// ─────────────────────────────────────────────────────────────────────────
// INTERNAL
// ─────────────────────────────────────────────────────────────────────────
function _transfer(address from, address to, uint256 amount) internal {
require(from != address(0) && to != address(0), "Zero address");
require(_balances[from] >= amount, "Insufficient");
_balances[from] -= amount;
_balances[to] += amount;
emit Transfer(from, to, amount);
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "Zero address");
// No supply cap — MYFI is always fully backed by eDAI in the treasury
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "Zero address");
require(_balances[account] >= amount, "Insufficient");
_balances[account] -= amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(address tokenOwner, address spender, uint256 amount) internal {
require(tokenOwner != address(0) && spender != address(0), "Zero address");
_allowances[tokenOwner][spender] = amount;
emit Approval(tokenOwner, spender, amount);
}
function _spendAllowance(address tokenOwner, address spender, uint256 amount) internal {
uint256 currentAllowance = _allowances[tokenOwner][spender];
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "Insufficient allowance");
unchecked {
_allowances[tokenOwner][spender] = currentAllowance - amount;
}
}
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"paris","compilationTarget":{"contracts/AER/MYFI.sol":"MyFi"}}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageExecuted","inputs":[{"type":"bool","name":"isSell","internalType":"bool","indexed":false},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"myfiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"profit","internalType":"uint256","indexed":false},{"type":"uint256","name":"newBacking","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageSettingsUpdated","inputs":[{"type":"uint256","name":"percent","internalType":"uint256","indexed":false},{"type":"uint256","name":"minSpread","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxSpread","internalType":"uint256","indexed":false},{"type":"uint256","name":"maxSize","internalType":"uint256","indexed":false},{"type":"uint256","name":"minAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ArbitrageSkipped","inputs":[{"type":"string","name":"reason","internalType":"string","indexed":false},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"BackingUpdated","inputs":[{"type":"uint256","name":"totalBacking","internalType":"uint256","indexed":false},{"type":"uint256","name":"backingPerMyfi","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferInitiated","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Redeemed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"myfiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"edaiReceived","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"TaxDeposited","inputs":[{"type":"address","name":"creator","internalType":"address","indexed":true},{"type":"uint256","name":"edaiAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"myfiMinted","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Unpaused","inputs":[{"type":"address","name":"account","internalType":"address","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"EDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MIN_DEPOSIT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ROUTER","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"arbitragePercent","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"arbitrageProfitEDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"authorizedMinters","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"baseBackingEDAI","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"myfiMinted","internalType":"uint256"},{"type":"uint256","name":"profitCaptured","internalType":"uint256"}],"name":"depositTax","inputs":[{"type":"address","name":"creator","internalType":"address"},{"type":"uint256","name":"edaiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdrawEDAI","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"estimateRedemption","inputs":[{"type":"uint256","name":"myfiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalProfits","internalType":"uint256"},{"type":"uint256","name":"totalExecuted","internalType":"uint256"},{"type":"uint256","name":"totalSkipped","internalType":"uint256"},{"type":"uint256","name":"currentBacking","internalType":"uint256"},{"type":"uint256","name":"backingGrowthBps","internalType":"uint256"}],"name":"getArbitrageStats","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBackingPerMyfi","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTotalBacking","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getTreasuryBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxArbitragePerTx","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSpreadBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minArbitrageAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"minSpreadBps","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"oracle","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pause","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"edaiAmount","internalType":"uint256"}],"name":"redeemForEDAI","inputs":[{"type":"uint256","name":"myfiAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setArbitrageSettings","inputs":[{"type":"uint256","name":"_arbitragePercent","internalType":"uint256"},{"type":"uint256","name":"_minSpreadBps","internalType":"uint256"},{"type":"uint256","name":"_maxSpreadBps","internalType":"uint256"},{"type":"uint256","name":"_maxArbitragePerTx","internalType":"uint256"},{"type":"uint256","name":"_minArbitrageAmount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMinter","inputs":[{"type":"address","name":"minter","internalType":"address"},{"type":"bool","name":"authorized","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setOracle","inputs":[{"type":"address","name":"_oracle","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageExecuted","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageProfits","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalArbitrageSkipped","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalEarned","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalRedeemed","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpause","inputs":[]}]
Contract Creation Code
0x60806040526000600c5560c8600d556103e8600e5568056bc75e2d63100000600f55674563918244f4000060105534801561003957600080fd5b50600380546001600160a01b031916331790556129048061005b6000396000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80638456cb5911610151578063c0afe83b116100c3578063e2896cac11610087578063e2896cac146105c3578063e30c3978146105d6578063e4d89f06146105e9578063e8034acd146105f2578063ee3a408f146105fa578063f2fde38b1461060357600080fd5b8063c0afe83b1461054f578063c6189b5514610558578063cf456ae71461056b578063dd62ed3e1461057e578063e1e158a5146105b757600080fd5b80639b5655dc116101155780639b5655dc146104ec578063a595829b146104f4578063a9059cbb14610507578063aa2fe91b1461051a578063ab2cd9ba1461053d578063b19aedf71461054657600080fd5b80638456cb591461049257806384e816bb1461049a5780638bba1f08146104a35780638da5cb5b146104b657806395d89b41146104c957600080fd5b806332fe7b26116101ea57806370a08231116101ae57806370a082311461040057806376327a911461042957806379ba5097146104495780637aabea95146104515780637adbf9731461046c5780637dc0d1d01461047f57600080fd5b806332fe7b26146103685780633f4ba83a1461039b5780635c975abb146103a5578063649aca4a146103b057806366660731146103d057600080fd5b806319f041741161023c57806319f04174146102f95780631f0242dd146103015780631f47b5281461032957806323b872dd146103325780632405d0a014610345578063313ce5671461034e57600080fd5b8063056ee4701461027957806306fdde0314610295578063095ea7b3146102c557806309d91a52146102e857806318160ddd146102f1575b600080fd5b61028260125481565b6040519081526020015b60405180910390f35b6102b8604051806040016040528060048152602001634d79466960e01b81525081565b60405161028c91906123c7565b6102d86102d3366004612431565b610616565b604051901515815260200161028c565b610282600f5481565b600054610282565b61028261062d565b61031461030f366004612431565b610644565b6040805192835260208301919091520161028c565b61028260135481565b6102d861034036600461245b565b610a51565b610282600c5481565b610356601281565b60405160ff909116815260200161028c565b61038373165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b03909116815260200161028c565b6103a3610a97565b005b600b5460ff166102d8565b6102826103be366004612497565b60086020526000908152604090205481565b6103d8610b01565b604080519586526020860194909452928401919091526060830152608082015260a00161028c565b61028261040e366004612497565b6001600160a01b031660009081526001602052604090205490565b610282610437366004612497565b60096020526000908152604090205481565b6103a3610b5f565b61038373efd766ccb38eaf1dfd701853bfce31359239f30581565b6103a361047a366004612497565b610c0a565b600554610383906001600160a01b031681565b6103a3610c96565b61028260105481565b6102826104b13660046124b9565b610cfd565b600354610383906001600160a01b031681565b6102b8604051806040016040528060048152602001634d59464960e01b81525081565b610282610d35565b6102826105023660046124b9565b610dab565b6102d8610515366004612431565b61122a565b6102d8610528366004612497565b600a6020526000908152604090205460ff1681565b61028260075481565b610282600d5481565b610282600e5481565b6103a36105663660046124b9565b61125b565b6103a36105793660046124e3565b611392565b61028261058c36600461251a565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61028264e8d4a5100081565b6103a36105d136600461254d565b6113e7565b600454610383906001600160a01b031681565b61028260115481565b61028261156f565b61028260065481565b6103a3610611366004612497565b6115ae565b600061062333848461166a565b5060015b92915050565b600060075460065461063f919061259e565b905090565b60055460009081906001600160a01b03163314806106715750336000908152600a602052604090205460ff165b6106b35760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600b5460ff16156106d65760405162461bcd60e51b81526004016106aa906125b1565b600b54610100900460ff161561071a5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106aa565b600b805461ff0019166101001790556001600160a01b0384166107715760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b932b0ba37b960891b60448201526064016106aa565b64e8d4a510008310156107b65760405162461bcd60e51b815260206004820152600d60248201526c42656c6f77206d696e696d756d60981b60448201526064016106aa565b6040516323b872dd60e01b81523360048201523060248201526044810184905260009073efd766ccb38eaf1dfd701853bfce31359239f305906323b872dd906064016020604051808303816000875af1158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b91906125d1565b9050806108815760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106aa565b60006064600c548661089391906125ee565b61089d9190612605565b905060006108ab8287612627565b9050600f548211156108dc576000600f54836108c79190612627565b600f54935090506108d8818361259e565b9150505b6000821180156108ee57506010548210155b15610903576108fc82611708565b935061095b565b811561095b57816006600082825461091b919061259e565b9091555050601380549060006109308361263a565b91905055506000805160206128af833981519152826040516109529190612653565b60405180910390a15b8094508060066000828254610970919061259e565b90915550506001600160a01b0387166000908152600860205260408120805487929061099d90849061259e565b909155506109ad905087866119d1565b60408051878152602081018790526001600160a01b038916917fed4842fbe4d213991be858c677c34ed27f119a1cb2a288de215304757eee2025910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed610a1a61062d565b610a2261156f565b6040805192835260208301919091520160405180910390a1505050600b805461ff001916905590939092509050565b600b5460009060ff1615610a775760405162461bcd60e51b81526004016106aa906125b1565b610a82843384611a80565b610a8d848484611b29565b5060019392505050565b6003546001600160a01b03163314610ac15760405162461bcd60e51b81526004016106aa90612691565b600b805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b601154601254601354600080610b1561156f565b9150670de0b6b3a76400008211610b2d576000610b56565b670de0b6b3a7640000610b408184612627565b610b4c906127106125ee565b610b569190612605565b90509091929394565b6004546001600160a01b03163314610bad5760405162461bcd60e51b81526020600482015260116024820152702737ba103832b73234b7339037bbb732b960791b60448201526064016106aa565b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546001600160a01b03163314610c345760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b038116610c745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106aa565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b03163314610cc05760405162461bcd60e51b81526004016106aa90612691565b600b805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610af7565b60008054600003610d1057506000919050565b670de0b6b3a7640000610d2161156f565b610d2b90846125ee565b6106279190612605565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610d87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f91906126b4565b600b5460009060ff1615610dd15760405162461bcd60e51b81526004016106aa906125b1565b600b54610100900460ff1615610e155760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106aa565b600b805461ff00191661010017905581610e625760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106aa565b33600090815260016020526040902054821115610eb85760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106aa565b6000805411610ef55760405162461bcd60e51b81526020600482015260096024820152684e6f20737570706c7960b81b60448201526064016106aa565b6000610eff61156f565b9050670de0b6b3a7640000610f1482856125ee565b610f1e9190612605565b915060008211610f405760405162461bcd60e51b81526004016106aa906126cd565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb691906126b4565b9050828110156110005760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420747265617375727960581b60448201526064016106aa565b6000805461101686670de0b6b3a76400006125ee565b6110209190612605565b90506000670de0b6b3a76400008260065461103b91906125ee565b6110459190612605565b90506000670de0b6b3a76400008360075461106091906125ee565b61106a9190612605565b9050816006600082825461107e9190612627565b9250508190555080600760008282546110979190612627565b909155505033600090815260096020526040812080548992906110bb90849061259e565b909155506110cb90503388611c5d565b60405163a9059cbb60e01b81523360048201526024810187905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114a91906125d1565b9050806111905760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106aa565b604080518981526020810189905233917ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed6111f461062d565b6111fc61156f565b6040805192835260208301919091520160405180910390a1505050505050600b805461ff0019169055919050565b600b5460009060ff16156112505760405162461bcd60e51b81526004016106aa906125b1565b610623338484611b29565b6003546001600160a01b031633146112855760405162461bcd60e51b81526004016106aa90612691565b600b5460ff166112ca5760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081c185d5cd948199a5c9cdd60821b60448201526064016106aa565b60035460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135691906125d1565b90508061138e5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b60448201526064016106aa565b5050565b6003546001600160a01b031633146113bc5760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6003546001600160a01b031633146114115760405162461bcd60e51b81526004016106aa90612691565b603285111561144c5760405162461bcd60e51b81526020600482015260076024820152664d61782035302560c81b60448201526064016106aa565b60328410156114885760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b60448201526064016106aa565b6107d08311156114c45760405162461bcd60e51b81526020600482015260076024820152664d61782032302560c81b60448201526064016106aa565b838310156115005760405162461bcd60e51b815260206004820152600960248201526826b0bc101e1036b4b760b91b60448201526064016106aa565b600c859055600d849055600e839055600f8290556010819055604080518681526020810186905290810184905260608101839052608081018290527fd7eb6830d58fec1f7218ede3317273bc3ddc1292d5444175e5ed3e0f98716be89060a00160405180910390a15050505050565b600080546000036115875750670de0b6b3a764000090565b60005461159261062d565b6115a490670de0b6b3a76400006125ee565b61063f9190612605565b6003546001600160a01b031633146115d85760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b0381166116185760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106aa565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6001600160a01b0383161580159061168a57506001600160a01b03821615155b6116a65760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000600c54600003611791578160066000828254611726919061259e565b90915550506013805490600061173b8361263a565b90915550506040805181815260128183015271105c989a5d1c9859d948191a5cd8589b195960721b60608201526020810184905290516000805160206128af8339815191529181900360800190a1506000919050565b600061179b61156f565b905060006117a7611d5d565b90506000828211156118fe57826117be8184612627565b6117ca906127106125ee565b6117d49190612605565b9050600e5481111561186b5784600660008282546117f2919061259e565b9091555050601380549060006118078361263a565b90915550506040805181815260208183018190527f53707265616420746f6f206c6172676520286d616e6970756c6174696f6e3f296060830152810187905290516000805160206128af8339815191529181900360800190a1506000949350505050565b600d5481106118865761187f858484611ea9565b93506119c9565b8460066000828254611898919061259e565b9091555050601380549060006118ad8361263a565b9091555050604080518181526010818301526f14dc1c995859081d1bdbc81cdb585b1b60821b60608201526020810187905290516000805160206128af8339815191529181900360800190a16119c9565b8282101561195957826119118382612627565b61191d906127106125ee565b6119279190612605565b9050600e548111156119455784600660008282546117f2919061259e565b600d5481106118865761187f85848461212b565b846006600082825461196b919061259e565b9091555050601380549060006119808361263a565b909155505060408051818152600c818301526b141c9a58d95cc8195c5d585b60a21b60608201526020810187905290516000805160206128af8339815191529181900360800190a15b505050919050565b6001600160a01b0382166119f75760405162461bcd60e51b81526004016106aa906126fd565b80600080828254611a08919061259e565b90915550506001600160a01b03821660009081526001602052604081208054839290611a3590849061259e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038084166000908152600260209081526040808320938616835292905220546000198114611b235781811015611af85760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016106aa565b6001600160a01b03808516600090815260026020908152604080832093871683529290522082820390555b50505050565b6001600160a01b03831615801590611b4957506001600160a01b03821615155b611b655760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b038316600090815260016020526040902054811115611bbc5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106aa565b6001600160a01b03831660009081526001602052604081208054839290611be4908490612627565b90915550506001600160a01b03821660009081526001602052604081208054839290611c1190849061259e565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116fb91815260200190565b6001600160a01b038216611c835760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b038216600090815260016020526040902054811115611cda5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106aa565b6001600160a01b03821660009081526001602052604081208054839290611d02908490612627565b9250508190555080600080828254611d1a9190612627565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a74565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611d9657611d96612739565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611dde57611dde612739565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815273165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f90611e3790670de0b6b3a7640000908590600401612793565b600060405180830381865afa925050508015611e7557506040513d6000823e601f3d908101601f19168201604052611e7291908101906127b4565b60015b611e8757611e8161156f565b91505090565b80600181518110611e9a57611e9a612739565b60200260200101519250505090565b60008083611ebf86670de0b6b3a76400006125ee565b611ec99190612605565b9050611ed530826119d1565b611ef43073165c3410fc91ef562c50559f7d2289febed552d98361166a565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f2957611f29612739565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611f7157611f71612739565b6001600160a01b0390921660209283029190910190910152600068056bc75e2d63100000611f9f86856125ee565b611faa9060626125ee565b611fb49190612605565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed173985848630611fe24261012c61259e565b6040518663ffffffff1660e01b8152600401612002959493929190612872565b6000604051808303816000875af1158015612021573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261204991908101906127b4565b905060008160018151811061206057612060612739565b60200260200101519050888111156120c45761207c8982612627565b95508560076000828254612090919061259e565b9250508190555085601160008282546120a9919061259e565b9091555050601280549060006120be8361263a565b91905055505b7f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060018a87896120f261156f565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a150505050509392505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201526024810184905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063095ea7b3906044016020604051808303816000875af115801561219a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121be91906125d1565b5060408051600280825260608201835260009260208301908036833701905050905073efd766ccb38eaf1dfd701853bfce31359239f3058160008151811061220857612208612739565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061223c5761223c612739565b6001600160a01b039092166020928302919091019091015260006122618460646125ee565b61227387670de0b6b3a76400006125ee565b61227e9060626125ee565b6122889190612605565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed1739888486306122b64261012c61259e565b6040518663ffffffff1660e01b81526004016122d6959493929190612872565b6000604051808303816000875af11580156122f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261231d91908101906127b4565b905060008160018151811061233457612334612739565b602002602001015190506123483082611c5d565b601280549060006123588361263a565b91905055507f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060008983600061238c61156f565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a1506000979650505050505050565b600060208083528351808285015260005b818110156123f4578581018301518582016040015282016123d8565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461242c57600080fd5b919050565b6000806040838503121561244457600080fd5b61244d83612415565b946020939093013593505050565b60008060006060848603121561247057600080fd5b61247984612415565b925061248760208501612415565b9150604084013590509250925092565b6000602082840312156124a957600080fd5b6124b282612415565b9392505050565b6000602082840312156124cb57600080fd5b5035919050565b80151581146124e057600080fd5b50565b600080604083850312156124f657600080fd5b6124ff83612415565b9150602083013561250f816124d2565b809150509250929050565b6000806040838503121561252d57600080fd5b61253683612415565b915061254460208401612415565b90509250929050565b600080600080600060a0868803121561256557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062757610627612588565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156125e357600080fd5b81516124b2816124d2565b808202811582820484141761062757610627612588565b60008261262257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561062757610627612588565b60006001820161264c5761264c612588565b5060010190565b60408152600061268360408301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b905082602083015292915050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6000602082840312156126c657600080fd5b5051919050565b60208152600061062760208301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156127885781516001600160a01b031687529582019590820190600101612763565b509495945050505050565b8281526040602082015260006127ac604083018461274f565b949350505050565b600060208083850312156127c757600080fd5b825167ffffffffffffffff808211156127df57600080fd5b818501915085601f8301126127f357600080fd5b81518181111561280557612805612723565b8060051b604051601f19603f8301168101818110858211171561282a5761282a612723565b60405291825284820192508381018501918883111561284857600080fd5b938501935b828510156128665784518452938501939285019261284d565b98975050505050505050565b85815284602082015260a06040820152600061289160a083018661274f565b6001600160a01b039490941660608301525060800152939250505056fea87d5e72382e1279629de8ddc63dfdc32098c7e8812a592ab3053cd443194ff2a2646970667358221220483f58f4fd6b8355f43d1e6fd9cabef66bfe24aacb3b8f4db6ae268e502ee45464736f6c63430008130033
Deployed ByteCode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80638456cb5911610151578063c0afe83b116100c3578063e2896cac11610087578063e2896cac146105c3578063e30c3978146105d6578063e4d89f06146105e9578063e8034acd146105f2578063ee3a408f146105fa578063f2fde38b1461060357600080fd5b8063c0afe83b1461054f578063c6189b5514610558578063cf456ae71461056b578063dd62ed3e1461057e578063e1e158a5146105b757600080fd5b80639b5655dc116101155780639b5655dc146104ec578063a595829b146104f4578063a9059cbb14610507578063aa2fe91b1461051a578063ab2cd9ba1461053d578063b19aedf71461054657600080fd5b80638456cb591461049257806384e816bb1461049a5780638bba1f08146104a35780638da5cb5b146104b657806395d89b41146104c957600080fd5b806332fe7b26116101ea57806370a08231116101ae57806370a082311461040057806376327a911461042957806379ba5097146104495780637aabea95146104515780637adbf9731461046c5780637dc0d1d01461047f57600080fd5b806332fe7b26146103685780633f4ba83a1461039b5780635c975abb146103a5578063649aca4a146103b057806366660731146103d057600080fd5b806319f041741161023c57806319f04174146102f95780631f0242dd146103015780631f47b5281461032957806323b872dd146103325780632405d0a014610345578063313ce5671461034e57600080fd5b8063056ee4701461027957806306fdde0314610295578063095ea7b3146102c557806309d91a52146102e857806318160ddd146102f1575b600080fd5b61028260125481565b6040519081526020015b60405180910390f35b6102b8604051806040016040528060048152602001634d79466960e01b81525081565b60405161028c91906123c7565b6102d86102d3366004612431565b610616565b604051901515815260200161028c565b610282600f5481565b600054610282565b61028261062d565b61031461030f366004612431565b610644565b6040805192835260208301919091520161028c565b61028260135481565b6102d861034036600461245b565b610a51565b610282600c5481565b610356601281565b60405160ff909116815260200161028c565b61038373165c3410fc91ef562c50559f7d2289febed552d981565b6040516001600160a01b03909116815260200161028c565b6103a3610a97565b005b600b5460ff166102d8565b6102826103be366004612497565b60086020526000908152604090205481565b6103d8610b01565b604080519586526020860194909452928401919091526060830152608082015260a00161028c565b61028261040e366004612497565b6001600160a01b031660009081526001602052604090205490565b610282610437366004612497565b60096020526000908152604090205481565b6103a3610b5f565b61038373efd766ccb38eaf1dfd701853bfce31359239f30581565b6103a361047a366004612497565b610c0a565b600554610383906001600160a01b031681565b6103a3610c96565b61028260105481565b6102826104b13660046124b9565b610cfd565b600354610383906001600160a01b031681565b6102b8604051806040016040528060048152602001634d59464960e01b81525081565b610282610d35565b6102826105023660046124b9565b610dab565b6102d8610515366004612431565b61122a565b6102d8610528366004612497565b600a6020526000908152604090205460ff1681565b61028260075481565b610282600d5481565b610282600e5481565b6103a36105663660046124b9565b61125b565b6103a36105793660046124e3565b611392565b61028261058c36600461251a565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b61028264e8d4a5100081565b6103a36105d136600461254d565b6113e7565b600454610383906001600160a01b031681565b61028260115481565b61028261156f565b61028260065481565b6103a3610611366004612497565b6115ae565b600061062333848461166a565b5060015b92915050565b600060075460065461063f919061259e565b905090565b60055460009081906001600160a01b03163314806106715750336000908152600a602052604090205460ff165b6106b35760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064015b60405180910390fd5b600b5460ff16156106d65760405162461bcd60e51b81526004016106aa906125b1565b600b54610100900460ff161561071a5760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106aa565b600b805461ff0019166101001790556001600160a01b0384166107715760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21031b932b0ba37b960891b60448201526064016106aa565b64e8d4a510008310156107b65760405162461bcd60e51b815260206004820152600d60248201526c42656c6f77206d696e696d756d60981b60448201526064016106aa565b6040516323b872dd60e01b81523360048201523060248201526044810184905260009073efd766ccb38eaf1dfd701853bfce31359239f305906323b872dd906064016020604051808303816000875af1158015610817573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083b91906125d1565b9050806108815760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106aa565b60006064600c548661089391906125ee565b61089d9190612605565b905060006108ab8287612627565b9050600f548211156108dc576000600f54836108c79190612627565b600f54935090506108d8818361259e565b9150505b6000821180156108ee57506010548210155b15610903576108fc82611708565b935061095b565b811561095b57816006600082825461091b919061259e565b9091555050601380549060006109308361263a565b91905055506000805160206128af833981519152826040516109529190612653565b60405180910390a15b8094508060066000828254610970919061259e565b90915550506001600160a01b0387166000908152600860205260408120805487929061099d90849061259e565b909155506109ad905087866119d1565b60408051878152602081018790526001600160a01b038916917fed4842fbe4d213991be858c677c34ed27f119a1cb2a288de215304757eee2025910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed610a1a61062d565b610a2261156f565b6040805192835260208301919091520160405180910390a1505050600b805461ff001916905590939092509050565b600b5460009060ff1615610a775760405162461bcd60e51b81526004016106aa906125b1565b610a82843384611a80565b610a8d848484611b29565b5060019392505050565b6003546001600160a01b03163314610ac15760405162461bcd60e51b81526004016106aa90612691565b600b805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b601154601254601354600080610b1561156f565b9150670de0b6b3a76400008211610b2d576000610b56565b670de0b6b3a7640000610b408184612627565b610b4c906127106125ee565b610b569190612605565b90509091929394565b6004546001600160a01b03163314610bad5760405162461bcd60e51b81526020600482015260116024820152702737ba103832b73234b7339037bbb732b960791b60448201526064016106aa565b60038054600480546001600160a01b03198084166001600160a01b038381169182179096559116909155604051929091169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a350565b6003546001600160a01b03163314610c345760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b038116610c745760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106aa565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b03163314610cc05760405162461bcd60e51b81526004016106aa90612691565b600b805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890602001610af7565b60008054600003610d1057506000919050565b670de0b6b3a7640000610d2161156f565b610d2b90846125ee565b6106279190612605565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610d87573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063f91906126b4565b600b5460009060ff1615610dd15760405162461bcd60e51b81526004016106aa906125b1565b600b54610100900460ff1615610e155760405162461bcd60e51b81526020600482015260096024820152681499595b9d1c985b9d60ba1b60448201526064016106aa565b600b805461ff00191661010017905581610e625760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b60448201526064016106aa565b33600090815260016020526040902054821115610eb85760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016106aa565b6000805411610ef55760405162461bcd60e51b81526020600482015260096024820152684e6f20737570706c7960b81b60448201526064016106aa565b6000610eff61156f565b9050670de0b6b3a7640000610f1482856125ee565b610f1e9190612605565b915060008211610f405760405162461bcd60e51b81526004016106aa906126cd565b6040516370a0823160e01b815230600482015260009073efd766ccb38eaf1dfd701853bfce31359239f305906370a0823190602401602060405180830381865afa158015610f92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb691906126b4565b9050828110156110005760405162461bcd60e51b8152602060048201526015602482015274496e73756666696369656e7420747265617375727960581b60448201526064016106aa565b6000805461101686670de0b6b3a76400006125ee565b6110209190612605565b90506000670de0b6b3a76400008260065461103b91906125ee565b6110459190612605565b90506000670de0b6b3a76400008360075461106091906125ee565b61106a9190612605565b9050816006600082825461107e9190612627565b9250508190555080600760008282546110979190612627565b909155505033600090815260096020526040812080548992906110bb90849061259e565b909155506110cb90503388611c5d565b60405163a9059cbb60e01b81523360048201526024810187905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611126573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061114a91906125d1565b9050806111905760405162461bcd60e51b815260206004820152601460248201527319511052481d1c985b9cd9995c8819985a5b195960621b60448201526064016106aa565b604080518981526020810189905233917ff3a670cd3af7d64b488926880889d08a8585a138ff455227af6737339a1ec262910160405180910390a27faabc7a8108435a4fc30d1e2cecd59cbdec96ee6fa583c6eebf9a20bc9d14d3ed6111f461062d565b6111fc61156f565b6040805192835260208301919091520160405180910390a1505050505050600b805461ff0019169055919050565b600b5460009060ff16156112505760405162461bcd60e51b81526004016106aa906125b1565b610623338484611b29565b6003546001600160a01b031633146112855760405162461bcd60e51b81526004016106aa90612691565b600b5460ff166112ca5760405162461bcd60e51b815260206004820152601060248201526f135d5cdd081c185d5cd948199a5c9cdd60821b60448201526064016106aa565b60035460405163a9059cbb60e01b81526001600160a01b0390911660048201526024810182905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063a9059cbb906044016020604051808303816000875af1158015611332573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135691906125d1565b90508061138e5760405162461bcd60e51b815260206004820152600660248201526511985a5b195960d21b60448201526064016106aa565b5050565b6003546001600160a01b031633146113bc5760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b03919091166000908152600a60205260409020805460ff1916911515919091179055565b6003546001600160a01b031633146114115760405162461bcd60e51b81526004016106aa90612691565b603285111561144c5760405162461bcd60e51b81526020600482015260076024820152664d61782035302560c81b60448201526064016106aa565b60328410156114885760405162461bcd60e51b81526020600482015260086024820152674d696e20302e352560c01b60448201526064016106aa565b6107d08311156114c45760405162461bcd60e51b81526020600482015260076024820152664d61782032302560c81b60448201526064016106aa565b838310156115005760405162461bcd60e51b815260206004820152600960248201526826b0bc101e1036b4b760b91b60448201526064016106aa565b600c859055600d849055600e839055600f8290556010819055604080518681526020810186905290810184905260608101839052608081018290527fd7eb6830d58fec1f7218ede3317273bc3ddc1292d5444175e5ed3e0f98716be89060a00160405180910390a15050505050565b600080546000036115875750670de0b6b3a764000090565b60005461159261062d565b6115a490670de0b6b3a76400006125ee565b61063f9190612605565b6003546001600160a01b031633146115d85760405162461bcd60e51b81526004016106aa90612691565b6001600160a01b0381166116185760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b60448201526064016106aa565b600480546001600160a01b0319166001600160a01b03838116918217909255600354604051919216907fb150023a879fd806e3599b6ca8ee3b60f0e360ab3846d128d67ebce1a391639a90600090a350565b6001600160a01b0383161580159061168a57506001600160a01b03821615155b6116a65760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000600c54600003611791578160066000828254611726919061259e565b90915550506013805490600061173b8361263a565b90915550506040805181815260128183015271105c989a5d1c9859d948191a5cd8589b195960721b60608201526020810184905290516000805160206128af8339815191529181900360800190a1506000919050565b600061179b61156f565b905060006117a7611d5d565b90506000828211156118fe57826117be8184612627565b6117ca906127106125ee565b6117d49190612605565b9050600e5481111561186b5784600660008282546117f2919061259e565b9091555050601380549060006118078361263a565b90915550506040805181815260208183018190527f53707265616420746f6f206c6172676520286d616e6970756c6174696f6e3f296060830152810187905290516000805160206128af8339815191529181900360800190a1506000949350505050565b600d5481106118865761187f858484611ea9565b93506119c9565b8460066000828254611898919061259e565b9091555050601380549060006118ad8361263a565b9091555050604080518181526010818301526f14dc1c995859081d1bdbc81cdb585b1b60821b60608201526020810187905290516000805160206128af8339815191529181900360800190a16119c9565b8282101561195957826119118382612627565b61191d906127106125ee565b6119279190612605565b9050600e548111156119455784600660008282546117f2919061259e565b600d5481106118865761187f85848461212b565b846006600082825461196b919061259e565b9091555050601380549060006119808361263a565b909155505060408051818152600c818301526b141c9a58d95cc8195c5d585b60a21b60608201526020810187905290516000805160206128af8339815191529181900360800190a15b505050919050565b6001600160a01b0382166119f75760405162461bcd60e51b81526004016106aa906126fd565b80600080828254611a08919061259e565b90915550506001600160a01b03821660009081526001602052604081208054839290611a3590849061259e565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6001600160a01b038084166000908152600260209081526040808320938616835292905220546000198114611b235781811015611af85760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016106aa565b6001600160a01b03808516600090815260026020908152604080832093871683529290522082820390555b50505050565b6001600160a01b03831615801590611b4957506001600160a01b03821615155b611b655760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b038316600090815260016020526040902054811115611bbc5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106aa565b6001600160a01b03831660009081526001602052604081208054839290611be4908490612627565b90915550506001600160a01b03821660009081526001602052604081208054839290611c1190849061259e565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516116fb91815260200190565b6001600160a01b038216611c835760405162461bcd60e51b81526004016106aa906126fd565b6001600160a01b038216600090815260016020526040902054811115611cda5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016106aa565b6001600160a01b03821660009081526001602052604081208054839290611d02908490612627565b9250508190555080600080828254611d1a9190612627565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611a74565b604080516002808252606082018352600092839291906020830190803683370190505090503081600081518110611d9657611d96612739565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611dde57611dde612739565b6001600160a01b039092166020928302919091019091015260405163d06ca61f60e01b815273165c3410fc91ef562c50559f7d2289febed552d99063d06ca61f90611e3790670de0b6b3a7640000908590600401612793565b600060405180830381865afa925050508015611e7557506040513d6000823e601f3d908101601f19168201604052611e7291908101906127b4565b60015b611e8757611e8161156f565b91505090565b80600181518110611e9a57611e9a612739565b60200260200101519250505090565b60008083611ebf86670de0b6b3a76400006125ee565b611ec99190612605565b9050611ed530826119d1565b611ef43073165c3410fc91ef562c50559f7d2289febed552d98361166a565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110611f2957611f29612739565b60200260200101906001600160a01b031690816001600160a01b03168152505073efd766ccb38eaf1dfd701853bfce31359239f30581600181518110611f7157611f71612739565b6001600160a01b0390921660209283029190910190910152600068056bc75e2d63100000611f9f86856125ee565b611faa9060626125ee565b611fb49190612605565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed173985848630611fe24261012c61259e565b6040518663ffffffff1660e01b8152600401612002959493929190612872565b6000604051808303816000875af1158015612021573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261204991908101906127b4565b905060008160018151811061206057612060612739565b60200260200101519050888111156120c45761207c8982612627565b95508560076000828254612090919061259e565b9250508190555085601160008282546120a9919061259e565b9091555050601280549060006120be8361263a565b91905055505b7f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060018a87896120f261156f565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a150505050509392505050565b60405163095ea7b360e01b815273165c3410fc91ef562c50559f7d2289febed552d960048201526024810184905260009073efd766ccb38eaf1dfd701853bfce31359239f3059063095ea7b3906044016020604051808303816000875af115801561219a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121be91906125d1565b5060408051600280825260608201835260009260208301908036833701905050905073efd766ccb38eaf1dfd701853bfce31359239f3058160008151811061220857612208612739565b60200260200101906001600160a01b031690816001600160a01b031681525050308160018151811061223c5761223c612739565b6001600160a01b039092166020928302919091019091015260006122618460646125ee565b61227387670de0b6b3a76400006125ee565b61227e9060626125ee565b6122889190612605565b9050600073165c3410fc91ef562c50559f7d2289febed552d96338ed1739888486306122b64261012c61259e565b6040518663ffffffff1660e01b81526004016122d6959493929190612872565b6000604051808303816000875af11580156122f5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261231d91908101906127b4565b905060008160018151811061233457612334612739565b602002602001015190506123483082611c5d565b601280549060006123588361263a565b91905055507f560f22ff4d63f97bb10bc39ad6ea0b90caebf129c92f9d8608f8feb058e43c5060008983600061238c61156f565b6040805195151586526020860194909452928401919091526060830152608082015260a00160405180910390a1506000979650505050505050565b600060208083528351808285015260005b818110156123f4578581018301518582016040015282016123d8565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b038116811461242c57600080fd5b919050565b6000806040838503121561244457600080fd5b61244d83612415565b946020939093013593505050565b60008060006060848603121561247057600080fd5b61247984612415565b925061248760208501612415565b9150604084013590509250925092565b6000602082840312156124a957600080fd5b6124b282612415565b9392505050565b6000602082840312156124cb57600080fd5b5035919050565b80151581146124e057600080fd5b50565b600080604083850312156124f657600080fd5b6124ff83612415565b9150602083013561250f816124d2565b809150509250929050565b6000806040838503121561252d57600080fd5b61253683612415565b915061254460208401612415565b90509250929050565b600080600080600060a0868803121561256557600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561062757610627612588565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156125e357600080fd5b81516124b2816124d2565b808202811582820484141761062757610627612588565b60008261262257634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561062757610627612588565b60006001820161264c5761264c612588565b5060010190565b60408152600061268360408301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b905082602083015292915050565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b6000602082840312156126c657600080fd5b5051919050565b60208152600061062760208301601081526f105b5bdd5b9d081d1bdbc81cdb585b1b60821b602082015260400190565b6020808252600c908201526b5a65726f206164647265737360a01b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600081518084526020808501945080840160005b838110156127885781516001600160a01b031687529582019590820190600101612763565b509495945050505050565b8281526040602082015260006127ac604083018461274f565b949350505050565b600060208083850312156127c757600080fd5b825167ffffffffffffffff808211156127df57600080fd5b818501915085601f8301126127f357600080fd5b81518181111561280557612805612723565b8060051b604051601f19603f8301168101818110858211171561282a5761282a612723565b60405291825284820192508381018501918883111561284857600080fd5b938501935b828510156128665784518452938501939285019261284d565b98975050505050505050565b85815284602082015260a06040820152600061289160a083018661274f565b6001600160a01b039490941660608301525060800152939250505056fea87d5e72382e1279629de8ddc63dfdc32098c7e8812a592ab3053cd443194ff2a2646970667358221220483f58f4fd6b8355f43d1e6fd9cabef66bfe24aacb3b8f4db6ae268e502ee45464736f6c63430008130033