ETH Price: $3,226.54 (+4.52%)
Gas: 44 Gwei

Contract

0x1CD24E3FBae88BECbaFED4b8Cda765D1e6e3BC03
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Take Profit174435732023-06-09 15:30:47262 days 15 hrs ago1686324647IN
Inverse Finance: Aura Fed
0 ETH0.0062173126.51601084
Take Profit173366802023-05-25 14:14:11277 days 16 hrs ago1685024051IN
Inverse Finance: Aura Fed
0 ETH0.0144994961.83837368
Take Profit172453142023-05-12 16:27:47290 days 14 hrs ago1683908867IN
Inverse Finance: Aura Fed
0 ETH0.0178049875.93586094
Take Profit171460892023-04-28 17:23:47304 days 13 hrs ago1682702627IN
Inverse Finance: Aura Fed
0 ETH0.0095227540.190574
Take Profit171318702023-04-26 17:24:23306 days 13 hrs ago1682529863IN
Inverse Finance: Aura Fed
0 ETH0.0090091938.0231094
Take Profit170469012023-04-14 17:34:59318 days 13 hrs ago1681493699IN
Inverse Finance: Aura Fed
0 ETH0.0068216129.09328137
Take Profit169496442023-03-31 20:46:59332 days 10 hrs ago1680295619IN
Inverse Finance: Aura Fed
0 ETH0.0065087627.75900234
Take Profit168483552023-03-17 15:15:47346 days 15 hrs ago1679066147IN
Inverse Finance: Aura Fed
0 ETH0.0066754328.46982419
Take Profit167487792023-03-03 15:09:35360 days 15 hrs ago1677856175IN
Inverse Finance: Aura Fed
0 ETH0.0072131334.4171059
Take Profit166500822023-02-17 18:03:47374 days 13 hrs ago1676657027IN
Inverse Finance: Aura Fed
0 ETH0.012321161.52122578
0x60018054164942642023-01-26 23:25:47396 days 7 hrs ago1674775547IN
 Create: AuraStablepoolFed
0 ETH0.0542305721.67646016

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AuraStablepoolFed

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : AuraStablepoolFed.sol
pragma solidity ^0.8.13;

import "src/interfaces/IERC20.sol";
import "src/interfaces/balancer/IVault.sol";
import "src/interfaces/aura/IAuraLocker.sol";
import "src/interfaces/aura/IAuraBalRewardPool.sol";
import "src/aura-fed/BalancerComposableStablepoolAdapter.sol";
import {BalancerStablepoolAdapter} from "src/aura-fed/BalancerStablepoolAdapter.sol";

interface IAuraBooster {
    function depositAll(uint _pid, bool _stake) external;
    function withdraw(uint _pid, uint _amount) external;
}

contract AuraStablepoolFed is BalancerStablepoolAdapter{

    IAuraBalRewardPool public dolaBptRewardPool;
    IAuraBooster public booster;
    IERC20 public bal;
    IERC20 public aura;
    address public chair; // Fed Chair
    address public guardian;
    address public gov;
    uint public dolaSupply;
    uint public constant pid = 45; //Gauge pid, should never change
    uint public maxLossExpansionBps;
    uint public maxLossWithdrawBps;
    uint public maxLossTakeProfitBps;
    uint public maxLossSetableByGuardian = 500;

    event Expansion(uint amount);
    event Contraction(uint amount);

    constructor(
            address dola_, 
            address aura_,
            address vault_,
            address dolaBptRewardPool_, 
            address booster_,
            address chair_,
            address guardian_,
            address gov_, 
            uint maxLossExpansionBps_,
            uint maxLossWithdrawBps_,
            uint maxLossTakeProfitBps_,
            bytes32 poolId_) 
            BalancerStablepoolAdapter(poolId_, dola_, vault_)
    {
        require(maxLossExpansionBps_ < 10000, "Expansion max loss too high");
        require(maxLossWithdrawBps_ < 10000, "Withdraw max loss too high");
        require(maxLossTakeProfitBps_ < 10000, "TakeProfit max loss too high");
        dolaBptRewardPool = IAuraBalRewardPool(dolaBptRewardPool_);
        booster = IAuraBooster(booster_);
        aura = IERC20(aura_);
        bal = IERC20(dolaBptRewardPool.rewardToken());
        (address bpt,) = IVault(vault_).getPool(poolId_);
        IERC20(bpt).approve(booster_, type(uint256).max);
        maxLossExpansionBps = maxLossExpansionBps_;
        maxLossWithdrawBps = maxLossWithdrawBps_;
        maxLossTakeProfitBps = maxLossTakeProfitBps_;
        chair = chair_;
        gov = gov_;
        guardian = guardian_;
    }

    /**
    @notice Method for gov to change gov address
    */
    function changeGov(address newGov_) public {
        require(msg.sender == gov, "ONLY GOV");

        gov = newGov_;
    }

    /**
    @notice Method for gov to change the chair
    */
    function changeChair(address newChair_) public {
        require(msg.sender == gov, "ONLY GOV");
        chair = newChair_;
    }

    /**
    @notice Method for current chair of the Aura FED to resign
    */
    function resign() public {
        require(msg.sender == chair, "ONLY CHAIR");
        chair = address(0);
    }

    function setMaxLossExpansionBps(uint newMaxLossExpansionBps) public {
        require(msg.sender == gov, "ONLY GOV");
        require(newMaxLossExpansionBps <= 10000, "Can't have max loss above 100%");
        maxLossExpansionBps = newMaxLossExpansionBps;
    }

    function setMaxLossWithdrawBps(uint newMaxLossWithdrawBps) public {
        require(msg.sender == gov || msg.sender == guardian, "ONLY GOV OR CHAIR");
        if(msg.sender == guardian){
            //We limit the max loss a guardian, as we only want governance to be able to set a very high maxloss 
            require(newMaxLossWithdrawBps <= maxLossSetableByGuardian, "Above allowed maxloss for chair");
        }
        require(newMaxLossWithdrawBps <= 10000, "Can't have max loss above 100%");
        maxLossWithdrawBps = newMaxLossWithdrawBps;
    }

    function setMaxLossTakeProfitBps(uint newMaxLossTakeProfitBps) public {
        require(msg.sender == gov, "ONLY GOV");
        require(newMaxLossTakeProfitBps <= 10000, "Can't have max loss above 100%");
        maxLossTakeProfitBps = newMaxLossTakeProfitBps;   
    }

    function setMaxLossSetableByGuardian(uint newMaxLossSetableByGuardian) public {
        require(msg.sender == gov, "ONLY GOV");
        require(newMaxLossSetableByGuardian < 10000);
        maxLossSetableByGuardian = newMaxLossSetableByGuardian;
    }
    /**
    @notice Deposits amount of dola tokens into balancer, before locking with aura
    @param amount Amount of dola token to deposit
    */
    function expansion(uint amount) public {
        require(msg.sender == chair, "ONLY CHAIR");
        dolaSupply += amount;
        IERC20(dola).mint(address(this), amount);
        _deposit(amount, maxLossExpansionBps);
        booster.depositAll(pid, true);
        emit Expansion(amount);
    }
    /**
    @notice Withdraws an amount of dola token to be burnt, contracting DOLA dolaSupply
    @dev Be careful when setting maxLoss parameter. There will almost always be some loss from
    slippage + trading fees that may be incurred when withdrawing from a Balancer pool.
    On the other hand, setting the maxLoss too high, may cause you to be front run by MEV
    sandwhich bots, making sure your entire maxLoss is incurred.
    Recommended to always broadcast withdrawl transactions(contraction & takeProfits)
    through a frontrun protected RPC like Flashbots RPC.
    @param amountDola The amount of dola tokens to withdraw. Note that more tokens may
    be withdrawn than requested, as price is calculated by debts to strategies, but strategies
    may have outperformed price of dola token.
    */
    function contraction(uint amountDola) public {
        require(msg.sender == chair, "ONLY CHAIR");
        //Calculate how many lp tokens are needed to withdraw the dola
        uint bptNeeded = bptNeededForDola(amountDola);
        require(bptNeeded <= bptSupply(), "Not enough BPT tokens");

        //Withdraw BPT tokens from aura, but don't claim rewards
        require(dolaBptRewardPool.withdrawAndUnwrap(bptNeeded, false), "AURA WITHDRAW FAILED");


        //Withdraw DOLA from balancer pool
        uint dolaWithdrawn = _withdraw(amountDola, maxLossWithdrawBps);
        require(dolaWithdrawn > 0, "Must contract");
        _burnAndPay();
        emit Contraction(dolaWithdrawn);
    }

    /**
    @notice Withdraws every remaining balLP token. Can take up to maxLossWithdrawBps in loss, compared to dolaSupply.
    It will still be necessary to call takeProfit to withdraw any potential rewards.
    */
    function contractAll() public {
        require(msg.sender == chair, "ONLY CHAIR");
        //dolaBptRewardPool.withdrawAllAndUnwrap(false);
        require(dolaBptRewardPool.withdrawAndUnwrap(dolaBptRewardPool.balanceOf(address(this)), false), "AURA WITHDRAW FAILED");
        uint dolaWithdrawn = _withdrawAll(maxLossWithdrawBps);
        require(dolaWithdrawn > 0, "Must contract");
        _burnAndPay();
        emit Contraction(dolaWithdrawn);
    }

    /**
    @notice Burns all dola tokens held by the fed up to the dolaSupply, taking any surplus as profit.
    */
    function _burnAndPay() internal {
        uint dolaBal = dola.balanceOf(address(this));
        if(dolaBal > dolaSupply){
            IERC20(dola).transfer(gov, dolaBal - dolaSupply);
            IERC20(dola).burn(dolaSupply);
            dolaSupply = 0;
        } else {
            IERC20(dola).burn(dolaBal);
            dolaSupply -= dolaBal;
        }
    }

    /**
    @notice Withdraws the profit generated by aura staking
    @dev See dev note on Contraction method
    */
    function takeProfit(bool harvestLP) public {
        //This takes balLP at face value, but doesn't take into account slippage or fees
        //Worth considering that the additional transaction fees incurred by withdrawing the small amount of profit generated by tx fees,
        //may not eclipse additional transaction costs. Set harvestLP = false to only withdraw bal and aura rewards.
        uint bptValue = bptSupply() * bpt.getRate() / 10**18;
        if(harvestLP && bptValue > dolaSupply) {
            require(msg.sender == chair, "ONLY CHAIR CAN TAKE BPT PROFIT");
            uint dolaSurplus = bptValue - dolaSupply;
            uint bptToWithdraw = bptNeededForDola(dolaSurplus);
            if(bptToWithdraw > dolaBptRewardPool.balanceOf(address(this))){
                bptToWithdraw = dolaBptRewardPool.balanceOf(address(this));
            }
            require(dolaBptRewardPool.withdrawAndUnwrap(bptToWithdraw, false), "AURA WITHDRAW FAILED");
            uint dolaProfit = _withdraw(dolaSurplus, maxLossTakeProfitBps);
            require(dolaProfit > 0, "NO PROFIT");
            dola.transfer(gov, dolaProfit);
        }
        _burnAndPay();
        require(dolaBptRewardPool.getReward(address(this), true), "Getting reward failed");
        bal.transfer(gov, bal.balanceOf(address(this)));
        aura.transfer(gov, aura.balanceOf(address(this)));
    }

    /**
    @notice Burns the remaining dola supply in case the FED has been completely contracted, and still has a negative dola balance.
    */
    function burnRemainingDolaSupply() public {
        dola.transferFrom(msg.sender, address(this), dolaSupply);
        dola.burn(dolaSupply);
        dolaSupply = 0;
    }
    
    /**
    @notice View function for getting bpt tokens in the contract + aura dolaBptRewardPool
    */
    function bptSupply() public view returns(uint){
        return IERC20(bpt).balanceOf(address(this)) + dolaBptRewardPool.balanceOf(address(this));
    }
}

File 2 of 7 : BalancerComposableStablepoolAdapter.sol
pragma solidity ^0.8.13;

import "src/interfaces/balancer/IVault.sol";
import "src/interfaces/IERC20.sol";

interface IBPT is IERC20{
    function getPoolId() external view returns (bytes32);
    function getRate() external view returns (uint256);
}

interface IBalancerHelper{
    function queryExit(bytes32 poolId, address sender, address recipient, IVault.ExitPoolRequest memory erp) external returns (uint256 bptIn, uint256[] memory amountsOut);
    function queryJoin(bytes32 poolId, address sender, address recipient, IVault.JoinPoolRequest memory jrp) external returns (uint256 bptOut, uint256[] memory amountsIn);
}

contract BalancerComposableStablepoolAdapter {
    
    uint constant BPS = 10_000;
    bytes32 immutable poolId;
    IERC20 immutable dola;
    IBPT immutable bpt = IBPT(0x5b3240B6BE3E7487d61cd1AFdFC7Fe4Fa1D81e64);
    IVault immutable vault;
    IVault.FundManagement fundMan;
    
    constructor(bytes32 poolId_, address dola_, address vault_){
        poolId = poolId_;
        dola = IERC20(dola_);
        vault = IVault(vault_);
        dola.approve(vault_, type(uint).max);
        bpt.approve(vault_, type(uint).max);
        fundMan.sender = address(this);
        fundMan.fromInternalBalance = false;
        fundMan.recipient = payable(address(this));
        fundMan.toInternalBalance = false;
    }
    
    /**
    @notice Swaps exact amount of assetIn for asseetOut through a balancer pool. Output must be higher than minOut
    @dev Due to the unique design of Balancer ComposableStablePools, where BPT are part of the swappable balance, we can just swap DOLA directly for BPT
    @param assetIn Address of the asset to trade an exact amount in
    @param assetOut Address of the asset to trade for
    @param amount Amount of assetIn to trade
    @param minOut minimum amount of assetOut to receive
    */
    function swapExactIn(address assetIn, address assetOut, uint amount, uint minOut) internal {
        IVault.SingleSwap memory swapStruct;

        //Populate Single Swap struct
        swapStruct.poolId = poolId;
        swapStruct.kind = IVault.SwapKind.GIVEN_IN;
        swapStruct.assetIn = IAsset(assetIn);
        swapStruct.assetOut = IAsset(assetOut);
        swapStruct.amount = amount;
        //swapStruct.userData: User data can be left empty

        vault.swap(swapStruct, fundMan, minOut, block.timestamp+1);
    }

    /**
    @notice Deposit an amount of dola into balancer, getting balancer pool tokens in return
    @param dolaAmount Amount of dola to buy BPTs for
    @param maxSlippage Maximum amount of value that can be lost in basis points, assuming DOLA = 1$
    */
    function _deposit(uint dolaAmount, uint maxSlippage) internal returns(uint){
        uint init = bpt.balanceOf(address(this));
        uint bptWanted = bptNeededForDola(dolaAmount);
        uint minBptOut = bptWanted - bptWanted * maxSlippage / BPS;
        swapExactIn(address(dola), address(bpt), dolaAmount, minBptOut);
        uint bptOut =  bpt.balanceOf(address(this)) - init;
        return bptOut;
    }
    
    /**
    @notice Withdraws an amount of value close to dolaAmount
    @dev Will rarely withdraw an amount equal to dolaAmount, due to slippage.
    @param dolaAmount Amount of dola the withdrawer wants to withdraw
    @param maxSlippage Maximum amount of value that can be lost in basis points, assuming DOLA = 1$
    */
    function _withdraw(uint dolaAmount, uint maxSlippage) internal returns(uint){
        uint init = dola.balanceOf(address(this));
        uint bptNeeded = bptNeededForDola(dolaAmount);
        uint minDolaOut = dolaAmount - dolaAmount * maxSlippage / BPS;
        swapExactIn(address(bpt), address(dola), bptNeeded, minDolaOut);
        uint dolaOut = dola.balanceOf(address(this)) - init;
        return dolaOut;
    }

    /**
    @notice Withdraws all BPT in the contract
    @dev Will rarely withdraw an amount equal to dolaAmount, due to slippage.
    @param maxSlippage Maximum amount of value that can be lost in basis points, assuming DOLA = 1$
    */
    function _withdrawAll(uint maxSlippage) internal returns(uint){
        uint bptBal = bpt.balanceOf(address(this));
        uint expectedDolaOut = bptBal * bpt.getRate() / 10**18;
        uint minDolaOut = expectedDolaOut - expectedDolaOut * maxSlippage / BPS;
        swapExactIn(address(bpt), address(dola), bptBal, minDolaOut);
        return dola.balanceOf(address(this));
    }

    /**
    @notice Get amount of BPT equal to the value of dolaAmount, assuming Dola = 1$
    @dev Uses the getRate() function of the balancer pool to calculate the value of the dolaAmount
    @param dolaAmount Amount of DOLA to get the equal value in BPT.
    @return Uint representing the amount of BPT the dolaAmount should be worth.
    */
    function bptNeededForDola(uint dolaAmount) public view returns(uint) {
        return dolaAmount * 10**18 / bpt.getRate();
    }
}

File 3 of 7 : BalancerStablepoolAdapter.sol
pragma solidity ^0.8.13;

import "src/interfaces/balancer/IVault.sol";
import "src/interfaces/IERC20.sol";

interface IBPT is IERC20{
    function getPoolId() external view returns (bytes32);
    function getRate() external view returns (uint256);
}

interface IBalancerHelper{
    function queryExit(bytes32 poolId, address sender, address recipient, IVault.ExitPoolRequest memory erp) external returns (uint256 bptIn, uint256[] memory amountsOut);
    function queryJoin(bytes32 poolId, address sender, address recipient, IVault.JoinPoolRequest memory jrp) external returns (uint256 bptOut, uint256[] memory amountsIn);
}

contract BalancerStablepoolAdapter {

    uint constant BPS = 10_000;
    bytes32 immutable poolId;
    IERC20 dola;
    IERC20 usdc = IERC20(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48);
    //IBPT immutable bbAUSD = IBPT(0xA13a9247ea42D743238089903570127DdA72fE44);
    //IBalancerHelper helper = IBalancerHelper(0x5aDDCCa35b7A0D07C74063c48700C8590E87864E);
    IBPT immutable bpt = IBPT(0xFf4ce5AAAb5a627bf82f4A571AB1cE94Aa365eA6);
    IVault vault;
    IAsset[] assets = new IAsset[](0);
    uint dolaIndex = type(uint).max;

    constructor(bytes32 poolId_, address dola_, address vault_){
        poolId = poolId_;
        dola = IERC20(dola_);
        vault = IVault(vault_);
        dola.approve(vault_, type(uint).max);
        bpt.approve(vault_, type(uint).max);
        (address[] memory tokens,,) = vault.getPoolTokens(poolId_);
        for(uint i; i<tokens.length; i++){
            assets.push(IAsset(address(tokens[i])));
            if(address(tokens[i]) == dola_){
                dolaIndex = i;
            }
        }
        require(dolaIndex < type(uint).max, "Underlying token not found");
    }

    function getUserDataExactInDola(uint amountIn) internal view returns(bytes memory) {
        uint[] memory amounts = new uint[](assets.length);
        amounts[dolaIndex] = amountIn;
        return abi.encode(1, amounts, 0);
    }

    function getUserDataExactInBPT(uint amountIn) internal view returns(bytes memory) {
        uint[] memory amounts = new uint[](assets.length);
        amounts[dolaIndex] = amountIn;
        return abi.encode(0, amounts);
    }

    function getUserDataCustomExit(uint exactDolaOut, uint maxBPTin) internal view returns(bytes memory) {
        uint[] memory amounts = new uint[](assets.length);
        amounts[dolaIndex] = exactDolaOut;
        return abi.encode(2, amounts, maxBPTin);
    }

    function getUserDataExitExact(uint exactBptIn) internal view returns(bytes memory) {
        return abi.encode(0, exactBptIn, dolaIndex);
    }

    function createJoinPoolRequest(uint dolaAmount) internal view returns(IVault.JoinPoolRequest memory){
        IVault.JoinPoolRequest memory jpr;
        jpr.assets = assets;
        jpr.maxAmountsIn = new uint[](assets.length);
        jpr.maxAmountsIn[dolaIndex] = dolaAmount;
        jpr.userData = getUserDataExactInDola(dolaAmount);
        jpr.fromInternalBalance = false;
        return jpr;
    }

    function createExitPoolRequest(uint index, uint dolaAmount, uint maxBPTin) internal view returns (IVault.ExitPoolRequest memory){
        IVault.ExitPoolRequest memory epr;
        epr.assets = assets;
        epr.minAmountsOut = new uint[](assets.length);
        epr.minAmountsOut[index] = dolaAmount;
        epr.userData = getUserDataCustomExit(dolaAmount, maxBPTin);
        epr.toInternalBalance = false;
        return epr;
    }

    function createExitExactPoolRequest(uint index, uint bptAmount, uint minDolaOut) internal view returns (IVault.ExitPoolRequest memory){
        IVault.ExitPoolRequest memory epr;
        epr.assets = assets;
        epr.minAmountsOut = new uint[](assets.length);
        epr.minAmountsOut[index] = minDolaOut;
        epr.userData = getUserDataExitExact(bptAmount);
        epr.toInternalBalance = false;
        return epr;
    }


    function _deposit(uint dolaAmount, uint maxSlippage) internal returns(uint){
        uint init = bpt.balanceOf(address(this));
        uint bptWanted = bptNeededForDola(dolaAmount);
        vault.joinPool(poolId, address(this), address(this), createJoinPoolRequest(dolaAmount));
        uint bptOut =  bpt.balanceOf(address(this)) - init;
        require(bptOut > bptWanted - bptWanted * maxSlippage / BPS, "Insufficient BPT received");
        return bptOut;
    }

    function _withdraw(uint dolaAmount, uint maxSlippage) internal returns(uint){
        uint init = dola.balanceOf(address(this));
        uint bptNeeded = bptNeededForDola(dolaAmount);
        uint minDolaOut = dolaAmount - dolaAmount * maxSlippage / BPS;
        vault.exitPool(poolId, address(this), payable(address(this)), createExitExactPoolRequest(dolaIndex, bptNeeded, minDolaOut));
        uint dolaOut = dola.balanceOf(address(this)) - init;
        return dolaOut;
    }

    function _withdrawAll(uint maxSlippage) internal returns(uint){
        uint bptBal = bpt.balanceOf(address(this));
        uint expectedDolaOut = bptBal * bpt.getRate() / 10**18;
        uint minDolaOut = expectedDolaOut - expectedDolaOut * maxSlippage / BPS;
        vault.exitPool(poolId, address(this), payable(address(this)), createExitExactPoolRequest(dolaIndex, bptBal, minDolaOut));
        return dola.balanceOf(address(this));
    }

    function bptNeededForDola(uint dolaAmount) public view returns(uint) {
        return dolaAmount * 10 ** 18 / bpt.getRate();
    }
}

File 4 of 7 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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 decimal points used by the token.
     */
    function decimals() external view returns (uint8);

    /**
     
    * @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);
    
    /**
     * @dev Burns `amount` of token, shringking total supply
     */
    function burn(uint amount) external;

    /**
     * @dev Mints `amount` of token to address `to` increasing total supply
     */
    function mint(address to, uint amount) external;

    //For testing
    function addMinter(address minter_) external;
}

File 5 of 7 : IAuraBalRewardPool.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./IAuraLocker.sol";

interface IAuraBalRewardPool {
    function auraLocker() external view returns (IAuraLocker);

    function rewardToken() external view returns (address);
    
    function stakingToken() external view returns (address);

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function lastTimeRewardApplicable() external view returns (uint256);

    function rewardPerToken() external view returns (uint256);

    function earned(address account) external view returns (uint256);

    function stake(uint256 _amount) external returns (bool);

    function stakeAll() external returns (bool);

    function stakeFor(address _for, uint256 _amount) external  returns (bool);

    function withdrawAndUnwrap(uint256 amount, bool claim) external returns (bool);
    
    function withdrawAllAndUnwrap(bool claim) external returns (bool);

    /**
     * @dev Gives a staker their rewards
     * @param _lock Lock the rewards? If false, takes a 20% haircut
     */
    function getReward(bool _lock) external returns (bool);

    function getReward(address _addr, bool _claimExtra) external returns (bool);

    /**
     * @dev Forwards to the penalty forwarder for distro to Aura Lockers
     */
    function forwardPenalty() external;

    function periodFinish() external returns (uint);
}

File 6 of 7 : IAuraLocker.sol
pragma solidity ^0.8.13;

interface IAuraLocker {
    function delegate(address _newDelegate) external;

    function lock(address _account, uint256 _amount) external;

    function lockedBalances(address _account) view external returns (uint);

    function checkpointEpoch() external;

    function epochCount() external view returns (uint256);

    function balanceAtEpochOf(uint256 _epoch, address _user) external view returns (uint256 amount);

    function totalSupplyAtEpoch(uint256 _epoch) external view returns (uint256 supply);

    function queueNewRewards(address _rewardsToken, uint256 reward) external;

    function getReward(address _account, bool _stake) external;

    function getReward(address _account) external;

    function balanceOf(address _user) external view returns (uint256);

    function rewardTokens() external view returns (address[] memory);
}

File 7 of 7 : IVault.sol
pragma solidity ^0.8.13;

import "src/interfaces/IERC20.sol";
interface IAsset {}

interface IVault {
    
    function getInternalBalance(address user, IERC20[] memory tokens) external view returns (uint256[] memory);
    
    enum PoolSpecialization { GENERAL, MINIMAL_SWAP_INFO, TWO_TOKEN }

    function getPool(bytes32 poolId) external view returns (address, PoolSpecialization);
    
    function getPoolTokenInfo(bytes32 poolId, IERC20 token)
        external
        view
        returns (
            uint256 cash,
            uint256 managed,
            uint256 lastChangeBlock,
            address assetManager
    );

    function getPoolTokens(bytes32 poolId)
        external
        view
        returns (
            address[] memory tokens,
            uint256[] memory balances,
            uint256 lastChangeBlock
    );

    function joinPool(
        bytes32 poolId,
        address sender,
        address recipient,
        JoinPoolRequest memory request
    ) external payable;

    struct JoinPoolRequest {
        IAsset[] assets;
        uint256[] maxAmountsIn;
        bytes userData;
        bool fromInternalBalance;
    }

    function exitPool(
        bytes32 poolId,
        address sender,
        address payable recipient,
        ExitPoolRequest memory request
    ) external;

    struct ExitPoolRequest {
        IAsset[] assets;
        uint256[] minAmountsOut;
        bytes userData;
        bool toInternalBalance;
    }

    enum SwapKind { GIVEN_IN, GIVEN_OUT }

    struct SingleSwap {
        bytes32 poolId;
        SwapKind kind;
        IAsset assetIn;
        IAsset assetOut;
        uint256 amount;
        bytes userData;
    }

    struct FundManagement {
        address sender;
        bool fromInternalBalance;
        address payable recipient;
        bool toInternalBalance;
    }

    function swap(
        SingleSwap memory singleSwap,
        FundManagement memory funds,
        uint256 limit,
        uint256 deadline
    ) external payable returns (uint256);
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"dola_","type":"address"},{"internalType":"address","name":"aura_","type":"address"},{"internalType":"address","name":"vault_","type":"address"},{"internalType":"address","name":"dolaBptRewardPool_","type":"address"},{"internalType":"address","name":"booster_","type":"address"},{"internalType":"address","name":"chair_","type":"address"},{"internalType":"address","name":"guardian_","type":"address"},{"internalType":"address","name":"gov_","type":"address"},{"internalType":"uint256","name":"maxLossExpansionBps_","type":"uint256"},{"internalType":"uint256","name":"maxLossWithdrawBps_","type":"uint256"},{"internalType":"uint256","name":"maxLossTakeProfitBps_","type":"uint256"},{"internalType":"bytes32","name":"poolId_","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Contraction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Expansion","type":"event"},{"inputs":[],"name":"aura","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bal","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"booster","outputs":[{"internalType":"contract IAuraBooster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"dolaAmount","type":"uint256"}],"name":"bptNeededForDola","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bptSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnRemainingDolaSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newChair_","type":"address"}],"name":"changeChair","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGov_","type":"address"}],"name":"changeGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDola","type":"uint256"}],"name":"contraction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dolaBptRewardPool","outputs":[{"internalType":"contract IAuraBalRewardPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dolaSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"expansion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLossExpansionBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLossSetableByGuardian","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLossTakeProfitBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLossWithdrawBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resign","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLossExpansionBps","type":"uint256"}],"name":"setMaxLossExpansionBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLossSetableByGuardian","type":"uint256"}],"name":"setMaxLossSetableByGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLossTakeProfitBps","type":"uint256"}],"name":"setMaxLossTakeProfitBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxLossWithdrawBps","type":"uint256"}],"name":"setMaxLossWithdrawBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"harvestLP","type":"bool"}],"name":"takeProfit","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600180546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905573ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea660a052600060c081905260e060408190526200005a916003919062000628565b506000196004556101f46010553480156200007457600080fd5b5060405162002d4038038062002d408339810160408190526200009791620006dc565b6080819052600080546001600160a01b03199081166001600160a01b038f811691821790935560028054909216928d1692831790915560405163095ea7b360e01b81526004810192909252600019602483015282918e918d9163095ea7b3906044016020604051808303816000875af115801562000119573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200013f9190620007ad565b5060a05160405163095ea7b360e01b81526001600160a01b03838116600483015260001960248301529091169063095ea7b3906044016020604051808303816000875af115801562000195573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bb9190620007ad565b50600254604051631f29a8cd60e31b8152600481018590526000916001600160a01b03169063f94d466890602401600060405180830381865afa15801562000207573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002319190810190620008a4565b5050905060005b8151811015620002de5760038282815181106200025957620002596200097d565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b03928316179055825190851690839083908110620002ac57620002ac6200097d565b60200260200101516001600160a01b031603620002c95760048190555b80620002d58162000993565b91505062000238565b5060001960045410620003385760405162461bcd60e51b815260206004820152601a60248201527f556e6465726c79696e6720746f6b656e206e6f7420666f756e6400000000000060448201526064015b60405180910390fd5b5050505061271084106200038f5760405162461bcd60e51b815260206004820152601b60248201527f457870616e73696f6e206d6178206c6f737320746f6f2068696768000000000060448201526064016200032f565b6127108310620003e25760405162461bcd60e51b815260206004820152601a60248201527f5769746864726177206d6178206c6f737320746f6f206869676800000000000060448201526064016200032f565b6127108210620004355760405162461bcd60e51b815260206004820152601c60248201527f54616b6550726f666974206d6178206c6f737320746f6f20686967680000000060448201526064016200032f565b600580546001600160a01b03808c166001600160a01b03199283168117909355600680548c831690841617905560088054918f16919092161790556040805163f7c618c160e01b8152905163f7c618c1916004808201926020929091908290030181865afa158015620004ac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d29190620009bb565b600780546001600160a01b0319166001600160a01b0392831617905560405163f6c0092760e01b8152600481018390526000918c169063f6c00927906024016040805180830381865afa1580156200052e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005549190620009d9565b5060405163095ea7b360e01b81526001600160a01b038b8116600483015260001960248301529192509082169063095ea7b3906044016020604051808303816000875af1158015620005aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d09190620007ad565b505050600d92909255600e55600f55600980546001600160a01b039485166001600160a01b031991821617909155600b805492851692821692909217909155600a80549290931691161790555062000a189350505050565b82805482825590600052602060002090810192821562000680579160200282015b828111156200068057825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000649565b506200068e92915062000692565b5090565b5b808211156200068e576000815560010162000693565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620006d757600080fd5b919050565b6000806000806000806000806000806000806101808d8f0312156200070057600080fd5b6200070b8d620006bf565b9b506200071b60208e01620006bf565b9a506200072b60408e01620006bf565b99506200073b60608e01620006bf565b98506200074b60808e01620006bf565b97506200075b60a08e01620006bf565b96506200076b60c08e01620006bf565b95506200077b60e08e01620006bf565b94506101008d015193506101208d015192506101408d015191506101608d015190509295989b509295989b509295989b565b600060208284031215620007c057600080fd5b81518015158114620007d157600080fd5b9392505050565b604051601f8201601f191681016001600160401b0381118282101715620008035762000803620006a9565b604052919050565b60006001600160401b03821115620008275762000827620006a9565b5060051b60200190565b600082601f8301126200084357600080fd5b815160206200085c62000856836200080b565b620007d8565b82815260059290921b840181019181810190868411156200087c57600080fd5b8286015b8481101562000899578051835291830191830162000880565b509695505050505050565b600080600060608486031215620008ba57600080fd5b83516001600160401b0380821115620008d257600080fd5b818601915086601f830112620008e757600080fd5b81516020620008fa62000856836200080b565b82815260059290921b8401810191818101908a8411156200091a57600080fd5b948201945b8386101562000943576200093386620006bf565b825294820194908201906200091f565b918901519197509093505050808211156200095d57600080fd5b506200096c8682870162000831565b925050604084015190509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620009b457634e487b7160e01b600052601160045260246000fd5b5060010190565b600060208284031215620009ce57600080fd5b620007d182620006bf565b60008060408385031215620009ed57600080fd5b620009f883620006bf565b915060208301516003811062000a0d57600080fd5b809150509250929050565b60805160a0516122ca62000a766000396000818161038001528181611091015281816111170152818161173c015281816118670152818161197801526119f201526000818161141b015281816117ca0152611ac601526122ca6000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c80639045b763116100f9578063d630a30011610097578063e13b7f5c11610071578063e13b7f5c14610332578063e1a611b714610345578063f106845414610358578063fdf893f51461036057600080fd5b8063d630a3001461030e578063d680a9b114610317578063e06b8aab1461031f57600080fd5b8063a962ef1e116100d3578063a962ef1e146102c2578063c002e56e146102d5578063c57f8c50146102e8578063c6def076146102fb57600080fd5b80639045b7631461029e578063985d29a9146102a6578063a7c5b616146102af57600080fd5b806331682bf911610166578063452a932011610140578063452a93201461025d5780636630acf81461027057806369652fcf146102835780638888cdd71461028b57600080fd5b806331682bf91461022e5780633d79d1c81461023757806340648d1a1461024a57600080fd5b806306d45513146101ae5780630dbb9b52146101c357806312d43a51146101df57806321698e9d1461020a5780632720b22e1461021357806330256be214610226575b600080fd5b6101c16101bc366004611f11565b610373565b005b6101cc60105481565b6040519081526020015b60405180910390f35b600b546101f2906001600160a01b031681565b6040516001600160a01b0390911681526020016101d6565b6101cc600d5481565b6101c1610221366004611f35565b610983565b6101c1610ad6565b6101cc600e5481565b6007546101f2906001600160a01b031681565b6101c1610258366004611f35565b610c80565b600a546101f2906001600160a01b031681565b6101c161027e366004611f35565b610cd1565b6101c1610d22565b6101c1610299366004611f35565b610d5e565b6101c1610e4c565b6101cc600c5481565b6005546101f2906001600160a01b031681565b6101c16102d0366004611f4e565b610f3a565b6101c16102e3366004611f4e565b610f86565b6101c16102f6366004611f35565b610fd2565b6006546101f2906001600160a01b031681565b6101cc600f5481565b6101cc61100f565b6101cc61032d366004611f35565b611113565b6008546101f2906001600160a01b031681565b6101c1610353366004611f35565b6111b9565b6101cc602d81565b6009546101f2906001600160a01b031681565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104009190611f77565b61040861100f565b6104129190611fa6565b61041c9190611fc5565b905081801561042c5750600c5481115b156106ec576009546001600160a01b031633146104905760405162461bcd60e51b815260206004820152601e60248201527f4f4e4c592043484149522043414e2054414b45204250542050524f464954000060448201526064015b60405180910390fd5b6000600c54826104a09190611fe7565b905060006104ad82611113565b6005546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190611f77565b811115610590576005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058d9190611f77565b90505b600554604051636197390160e11b815260048101839052600060248201526001600160a01b039091169063c32e7202906044016020604051808303816000875af11580156105e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106069190611ffe565b6106225760405162461bcd60e51b81526004016104879061201b565b600061063083600f54611361565b90506000811161066e5760405162461bcd60e51b81526020600482015260096024820152681393c8141493d1925560ba1b6044820152606401610487565b600054600b5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af11580156106c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e79190611ffe565b505050505b6106f461151f565b600554604051637050ccd960e01b8152306004820152600160248201526001600160a01b0390911690637050ccd9906044016020604051808303816000875af1158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611ffe565b6107ad5760405162461bcd60e51b815260206004820152601560248201527411d95d1d1a5b99c81c995dd85c990819985a5b1959605a1b6044820152606401610487565b600754600b546040516370a0823160e01b81523060048201526001600160a01b039283169263a9059cbb92169083906370a0823190602401602060405180830381865afa158015610802573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108269190611f77565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108959190611ffe565b50600854600b546040516370a0823160e01b81523060048201526001600160a01b039283169263a9059cbb92169083906370a0823190602401602060405180830381865afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190611f77565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ffe565b505050565b6009546001600160a01b031633146109ad5760405162461bcd60e51b815260040161048790612049565b80600c60008282546109bf919061206d565b90915550506000546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610a1057600080fd5b505af1158015610a24573d6000803e3d6000fd5b50505050610a3481600d5461171a565b5060065460405163303acfe760e11b8152602d6004820152600160248201526001600160a01b03909116906360759fce90604401600060405180830381600087803b158015610a8257600080fd5b505af1158015610a96573d6000803e3d6000fd5b505050507fdcc16fd18a808d877bcd9a09b544844b36ae8f0a4b222e317d7b777b2c18b03281604051610acb91815260200190565b60405180910390a150565b6009546001600160a01b03163314610b005760405162461bcd60e51b815260040161048790612049565b6005546040516370a0823160e01b81523060048201526001600160a01b039091169063c32e72029082906370a0823190602401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190611f77565b6040516001600160e01b031960e084901b1681526004810191909152600060248201526044016020604051808303816000875af1158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190611ffe565b610bf95760405162461bcd60e51b81526004016104879061201b565b6000610c06600e54611956565b905060008111610c485760405162461bcd60e51b815260206004820152600d60248201526c135d5cdd0818dbdb9d1c9858dd609a1b6044820152606401610487565b610c5061151f565b6040518181527f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba90602001610acb565b600b546001600160a01b03163314610caa5760405162461bcd60e51b815260040161048790612085565b612710811115610ccc5760405162461bcd60e51b8152600401610487906120a7565b600f55565b600b546001600160a01b03163314610cfb5760405162461bcd60e51b815260040161048790612085565b612710811115610d1d5760405162461bcd60e51b8152600401610487906120a7565b600d55565b6009546001600160a01b03163314610d4c5760405162461bcd60e51b815260040161048790612049565b600980546001600160a01b0319169055565b600b546001600160a01b0316331480610d815750600a546001600160a01b031633145b610dc15760405162461bcd60e51b815260206004820152601160248201527027a7262c9023a7ab1027a91021a420a4a960791b6044820152606401610487565b600a546001600160a01b03163303610e2557601054811115610e255760405162461bcd60e51b815260206004820152601f60248201527f41626f766520616c6c6f776564206d61786c6f737320666f72206368616972006044820152606401610487565b612710811115610e475760405162461bcd60e51b8152600401610487906120a7565b600e55565b600054600c546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611ffe565b50600054600c54604051630852cd8d60e31b81526001600160a01b03909216916342966c6891610f019160040190815260200190565b600060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b50506000600c555050565b600b546001600160a01b03163314610f645760405162461bcd60e51b815260040161048790612085565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610fb05760405162461bcd60e51b815260040161048790612085565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610ffc5760405162461bcd60e51b815260040161048790612085565b612710811061100a57600080fd5b601055565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190611f77565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190611f77565b61110e919061206d565b905090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111979190611f77565b6111a983670de0b6b3a7640000611fa6565b6111b39190611fc5565b92915050565b6009546001600160a01b031633146111e35760405162461bcd60e51b815260040161048790612049565b60006111ee82611113565b90506111f861100f565b81111561123f5760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682042505420746f6b656e7360581b6044820152606401610487565b600554604051636197390160e11b815260048101839052600060248201526001600160a01b039091169063c32e7202906044016020604051808303816000875af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190611ffe565b6112d15760405162461bcd60e51b81526004016104879061201b565b60006112df83600e54611361565b9050600081116113215760405162461bcd60e51b815260206004820152600d60248201526c135d5cdd0818dbdb9d1c9858dd609a1b6044820152606401610487565b61132961151f565b6040518181527f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba9060200160405180910390a1505050565b600080546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ce9190611f77565b905060006113db85611113565b905060006127106113ec8688611fa6565b6113f69190611fc5565b6114009087611fe7565b6002546004549192506001600160a01b031690638bdb3913907f0000000000000000000000000000000000000000000000000000000000000000903090819061144a908888611bb2565b6040518563ffffffff1660e01b815260040161146994939291906121fd565b600060405180830381600087803b15801561148357600080fd5b505af1158015611497573d6000803e3d6000fd5b5050600080546040516370a0823160e01b81523060048201529193508692506001600160a01b0316906370a0823190602401602060405180830381865afa1580156114e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150a9190611f77565b6115149190611fe7565b979650505050505050565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190611f77565b9050600c548111156116a157600054600b54600c546001600160a01b039283169263a9059cbb9216906115bf9085611fe7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190611ffe565b50600054600c54604051630852cd8d60e31b81526001600160a01b03909216916342966c68916116649160040190815260200190565b600060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b50506000600c55506117179050565b600054604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b1580156116e757600080fd5b505af11580156116fb573d6000803e3d6000fd5b5050505080600c60008282546117119190611fe7565b90915550505b50565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a79190611f77565b905060006117b485611113565b6002549091506001600160a01b031663b95cac287f000000000000000000000000000000000000000000000000000000000000000030806117f48a611d25565b6040518563ffffffff1660e01b815260040161181394939291906121fd565b600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092508491506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d29190611f77565b6118dc9190611fe7565b90506127106118eb8684611fa6565b6118f59190611fc5565b6118ff9083611fe7565b811161194d5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420425054207265636569766564000000000000006044820152606401610487565b95945050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156119bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e39190611f77565b90506000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a729190611f77565b611a7c9084611fa6565b611a869190611fc5565b90506000612710611a978684611fa6565b611aa19190611fc5565b611aab9083611fe7565b6002546004549192506001600160a01b031690638bdb3913907f00000000000000000000000000000000000000000000000000000000000000009030908190611af5908988611bb2565b6040518563ffffffff1660e01b8152600401611b1494939291906121fd565b600060405180830381600087803b158015611b2e57600080fd5b505af1158015611b42573d6000803e3d6000fd5b50506000546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015611b8e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190611f77565b611bdf60405180608001604052806060815260200160608152602001606081526020016000151581525090565b611c0c60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6003805480602002602001604051908101604052809291908181526020018280548015611c6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c44575b505050918352505060035467ffffffffffffffff811115611c8557611c85612239565b604051908082528060200260200182016040528015611cae578160200160208202803683370190505b5060208201819052805184919087908110611ccb57611ccb61224f565b602002602001018181525050611d118460045460408051600060208201529081018390526060818101929092526080016040516020818303038152906040529050919050565b604082015260006060820152949350505050565b611d5260405180608001604052806060815260200160608152602001606081526020016000151581525090565b611d7f60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6003805480602002602001604051908101604052809291908181526020018280548015611dd557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db7575b505050918352505060035467ffffffffffffffff811115611df857611df8612239565b604051908082528060200260200182016040528015611e21578160200160208202803683370190505b50602082018190526004548151859291908110611e4057611e4061224f565b602002602001018181525050611e5583611e67565b60408201526000606082015292915050565b60035460609060009067ffffffffffffffff811115611e8857611e88612239565b604051908082528060200260200182016040528015611eb1578160200160208202803683370190505b509050828160045481518110611ec957611ec961224f565b6020026020010181815250506001816000604051602001611eec93929190612265565b604051602081830303815290604052915050919050565b801515811461171757600080fd5b600060208284031215611f2357600080fd5b8135611f2e81611f03565b9392505050565b600060208284031215611f4757600080fd5b5035919050565b600060208284031215611f6057600080fd5b81356001600160a01b0381168114611f2e57600080fd5b600060208284031215611f8957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611fc057611fc0611f90565b500290565b600082611fe257634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611ff957611ff9611f90565b500390565b60006020828403121561201057600080fd5b8151611f2e81611f03565b602080825260149082015273105554904815d2551211149055c811905253115160621b604082015260600190565b6020808252600a908201526927a7262c9021a420a4a960b11b604082015260600190565b6000821982111561208057612080611f90565b500190565b60208082526008908201526727a7262c9023a7ab60c11b604082015260600190565b6020808252601e908201527f43616e27742068617665206d6178206c6f73732061626f766520313030250000604082015260600190565b600081518084526020808501945080840160005b8381101561210e578151875295820195908201906001016120f2565b509495945050505050565b6000815180845260005b8181101561213f57602081850181015186830182015201612123565b81811115612151576000602083870101525b50601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156121ab5783516001600160a01b031683529284019291840191600101612186565b5050828501519150858103838701526121c481836120de565b92505050604083015184820360408601526121df8282612119565b91505060608301516121f5606086018215159052565b509392505050565b8481526001600160a01b0384811660208301528316604082015260806060820181905260009061222f90830184612166565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff8416815260606020820152600061228160608301856120de565b905060ff8316604083015294935050505056fea26469706673582212204db761e266837fe4a579781160d68797897acea978b89a8b4a05f36cc1bfb42864736f6c634300080d0033000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4000000000000000000000000c0c293ce456ff0ed870add98a0828dd4d2903dbf000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000022915f309ec0182c85cd8331c23bd187fd761360000000000000000000000000a57b8d98dae62b26ec3bcc4a365338157060b2340000000000000000000000008f97cca30dbe80e7a8b462f1dd1a51c32accdfc8000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000014ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6000200000000000000000426

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101a95760003560e01c80639045b763116100f9578063d630a30011610097578063e13b7f5c11610071578063e13b7f5c14610332578063e1a611b714610345578063f106845414610358578063fdf893f51461036057600080fd5b8063d630a3001461030e578063d680a9b114610317578063e06b8aab1461031f57600080fd5b8063a962ef1e116100d3578063a962ef1e146102c2578063c002e56e146102d5578063c57f8c50146102e8578063c6def076146102fb57600080fd5b80639045b7631461029e578063985d29a9146102a6578063a7c5b616146102af57600080fd5b806331682bf911610166578063452a932011610140578063452a93201461025d5780636630acf81461027057806369652fcf146102835780638888cdd71461028b57600080fd5b806331682bf91461022e5780633d79d1c81461023757806340648d1a1461024a57600080fd5b806306d45513146101ae5780630dbb9b52146101c357806312d43a51146101df57806321698e9d1461020a5780632720b22e1461021357806330256be214610226575b600080fd5b6101c16101bc366004611f11565b610373565b005b6101cc60105481565b6040519081526020015b60405180910390f35b600b546101f2906001600160a01b031681565b6040516001600160a01b0390911681526020016101d6565b6101cc600d5481565b6101c1610221366004611f35565b610983565b6101c1610ad6565b6101cc600e5481565b6007546101f2906001600160a01b031681565b6101c1610258366004611f35565b610c80565b600a546101f2906001600160a01b031681565b6101c161027e366004611f35565b610cd1565b6101c1610d22565b6101c1610299366004611f35565b610d5e565b6101c1610e4c565b6101cc600c5481565b6005546101f2906001600160a01b031681565b6101c16102d0366004611f4e565b610f3a565b6101c16102e3366004611f4e565b610f86565b6101c16102f6366004611f35565b610fd2565b6006546101f2906001600160a01b031681565b6101cc600f5481565b6101cc61100f565b6101cc61032d366004611f35565b611113565b6008546101f2906001600160a01b031681565b6101c1610353366004611f35565b6111b9565b6101cc602d81565b6009546101f2906001600160a01b031681565b6000670de0b6b3a76400007f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea66001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104009190611f77565b61040861100f565b6104129190611fa6565b61041c9190611fc5565b905081801561042c5750600c5481115b156106ec576009546001600160a01b031633146104905760405162461bcd60e51b815260206004820152601e60248201527f4f4e4c592043484149522043414e2054414b45204250542050524f464954000060448201526064015b60405180910390fd5b6000600c54826104a09190611fe7565b905060006104ad82611113565b6005546040516370a0823160e01b81523060048201529192506001600160a01b0316906370a0823190602401602060405180830381865afa1580156104f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061051a9190611f77565b811115610590576005546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610569573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061058d9190611f77565b90505b600554604051636197390160e11b815260048101839052600060248201526001600160a01b039091169063c32e7202906044016020604051808303816000875af11580156105e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106069190611ffe565b6106225760405162461bcd60e51b81526004016104879061201b565b600061063083600f54611361565b90506000811161066e5760405162461bcd60e51b81526020600482015260096024820152681393c8141493d1925560ba1b6044820152606401610487565b600054600b5460405163a9059cbb60e01b81526001600160a01b0391821660048201526024810184905291169063a9059cbb906044016020604051808303816000875af11580156106c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106e79190611ffe565b505050505b6106f461151f565b600554604051637050ccd960e01b8152306004820152600160248201526001600160a01b0390911690637050ccd9906044016020604051808303816000875af1158015610745573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107699190611ffe565b6107ad5760405162461bcd60e51b815260206004820152601560248201527411d95d1d1a5b99c81c995dd85c990819985a5b1959605a1b6044820152606401610487565b600754600b546040516370a0823160e01b81523060048201526001600160a01b039283169263a9059cbb92169083906370a0823190602401602060405180830381865afa158015610802573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108269190611f77565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108959190611ffe565b50600854600b546040516370a0823160e01b81523060048201526001600160a01b039283169263a9059cbb92169083906370a0823190602401602060405180830381865afa1580156108eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061090f9190611f77565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561095a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097e9190611ffe565b505050565b6009546001600160a01b031633146109ad5760405162461bcd60e51b815260040161048790612049565b80600c60008282546109bf919061206d565b90915550506000546040516340c10f1960e01b8152306004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b158015610a1057600080fd5b505af1158015610a24573d6000803e3d6000fd5b50505050610a3481600d5461171a565b5060065460405163303acfe760e11b8152602d6004820152600160248201526001600160a01b03909116906360759fce90604401600060405180830381600087803b158015610a8257600080fd5b505af1158015610a96573d6000803e3d6000fd5b505050507fdcc16fd18a808d877bcd9a09b544844b36ae8f0a4b222e317d7b777b2c18b03281604051610acb91815260200190565b60405180910390a150565b6009546001600160a01b03163314610b005760405162461bcd60e51b815260040161048790612049565b6005546040516370a0823160e01b81523060048201526001600160a01b039091169063c32e72029082906370a0823190602401602060405180830381865afa158015610b50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b749190611f77565b6040516001600160e01b031960e084901b1681526004810191909152600060248201526044016020604051808303816000875af1158015610bb9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bdd9190611ffe565b610bf95760405162461bcd60e51b81526004016104879061201b565b6000610c06600e54611956565b905060008111610c485760405162461bcd60e51b815260206004820152600d60248201526c135d5cdd0818dbdb9d1c9858dd609a1b6044820152606401610487565b610c5061151f565b6040518181527f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba90602001610acb565b600b546001600160a01b03163314610caa5760405162461bcd60e51b815260040161048790612085565b612710811115610ccc5760405162461bcd60e51b8152600401610487906120a7565b600f55565b600b546001600160a01b03163314610cfb5760405162461bcd60e51b815260040161048790612085565b612710811115610d1d5760405162461bcd60e51b8152600401610487906120a7565b600d55565b6009546001600160a01b03163314610d4c5760405162461bcd60e51b815260040161048790612049565b600980546001600160a01b0319169055565b600b546001600160a01b0316331480610d815750600a546001600160a01b031633145b610dc15760405162461bcd60e51b815260206004820152601160248201527027a7262c9023a7ab1027a91021a420a4a960791b6044820152606401610487565b600a546001600160a01b03163303610e2557601054811115610e255760405162461bcd60e51b815260206004820152601f60248201527f41626f766520616c6c6f776564206d61786c6f737320666f72206368616972006044820152606401610487565b612710811115610e475760405162461bcd60e51b8152600401610487906120a7565b600e55565b600054600c546040516323b872dd60e01b815233600482015230602482015260448101919091526001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ecb9190611ffe565b50600054600c54604051630852cd8d60e31b81526001600160a01b03909216916342966c6891610f019160040190815260200190565b600060405180830381600087803b158015610f1b57600080fd5b505af1158015610f2f573d6000803e3d6000fd5b50506000600c555050565b600b546001600160a01b03163314610f645760405162461bcd60e51b815260040161048790612085565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610fb05760405162461bcd60e51b815260040161048790612085565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b600b546001600160a01b03163314610ffc5760405162461bcd60e51b815260040161048790612085565b612710811061100a57600080fd5b601055565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611058573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061107c9190611f77565b6040516370a0823160e01b81523060048201527f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea66001600160a01b0316906370a0823190602401602060405180830381865afa1580156110e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111049190611f77565b61110e919061206d565b905090565b60007f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea66001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111979190611f77565b6111a983670de0b6b3a7640000611fa6565b6111b39190611fc5565b92915050565b6009546001600160a01b031633146111e35760405162461bcd60e51b815260040161048790612049565b60006111ee82611113565b90506111f861100f565b81111561123f5760405162461bcd60e51b81526020600482015260156024820152744e6f7420656e6f7567682042505420746f6b656e7360581b6044820152606401610487565b600554604051636197390160e11b815260048101839052600060248201526001600160a01b039091169063c32e7202906044016020604051808303816000875af1158015611291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b59190611ffe565b6112d15760405162461bcd60e51b81526004016104879061201b565b60006112df83600e54611361565b9050600081116113215760405162461bcd60e51b815260206004820152600d60248201526c135d5cdd0818dbdb9d1c9858dd609a1b6044820152606401610487565b61132961151f565b6040518181527f32d275175c36fa468b3e61c6763f9488ff3c9be127e35e011cf4e04d602224ba9060200160405180910390a1505050565b600080546040516370a0823160e01b815230600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ce9190611f77565b905060006113db85611113565b905060006127106113ec8688611fa6565b6113f69190611fc5565b6114009087611fe7565b6002546004549192506001600160a01b031690638bdb3913907fff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6000200000000000000000426903090819061144a908888611bb2565b6040518563ffffffff1660e01b815260040161146994939291906121fd565b600060405180830381600087803b15801561148357600080fd5b505af1158015611497573d6000803e3d6000fd5b5050600080546040516370a0823160e01b81523060048201529193508692506001600160a01b0316906370a0823190602401602060405180830381865afa1580156114e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150a9190611f77565b6115149190611fe7565b979650505050505050565b600080546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015611568573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158c9190611f77565b9050600c548111156116a157600054600b54600c546001600160a01b039283169263a9059cbb9216906115bf9085611fe7565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af115801561160a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162e9190611ffe565b50600054600c54604051630852cd8d60e31b81526001600160a01b03909216916342966c68916116649160040190815260200190565b600060405180830381600087803b15801561167e57600080fd5b505af1158015611692573d6000803e3d6000fd5b50506000600c55506117179050565b600054604051630852cd8d60e31b8152600481018390526001600160a01b03909116906342966c6890602401600060405180830381600087803b1580156116e757600080fd5b505af11580156116fb573d6000803e3d6000fd5b5050505080600c60008282546117119190611fe7565b90915550505b50565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea616906370a0823190602401602060405180830381865afa158015611783573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a79190611f77565b905060006117b485611113565b6002549091506001600160a01b031663b95cac287fff4ce5aaab5a627bf82f4a571ab1ce94aa365ea600020000000000000000042630806117f48a611d25565b6040518563ffffffff1660e01b815260040161181394939291906121fd565b600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092508491506001600160a01b037f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea616906370a0823190602401602060405180830381865afa1580156118ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d29190611f77565b6118dc9190611fe7565b90506127106118eb8684611fa6565b6118f59190611fc5565b6118ff9083611fe7565b811161194d5760405162461bcd60e51b815260206004820152601960248201527f496e73756666696369656e7420425054207265636569766564000000000000006044820152606401610487565b95945050505050565b6040516370a0823160e01b815230600482015260009081906001600160a01b037f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea616906370a0823190602401602060405180830381865afa1580156119bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e39190611f77565b90506000670de0b6b3a76400007f000000000000000000000000ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea66001600160a01b031663679aefce6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a729190611f77565b611a7c9084611fa6565b611a869190611fc5565b90506000612710611a978684611fa6565b611aa19190611fc5565b611aab9083611fe7565b6002546004549192506001600160a01b031690638bdb3913907fff4ce5aaab5a627bf82f4a571ab1ce94aa365ea60002000000000000000004269030908190611af5908988611bb2565b6040518563ffffffff1660e01b8152600401611b1494939291906121fd565b600060405180830381600087803b158015611b2e57600080fd5b505af1158015611b42573d6000803e3d6000fd5b50506000546040516370a0823160e01b81523060048201526001600160a01b0390911692506370a082319150602401602060405180830381865afa158015611b8e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061194d9190611f77565b611bdf60405180608001604052806060815260200160608152602001606081526020016000151581525090565b611c0c60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6003805480602002602001604051908101604052809291908181526020018280548015611c6257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611c44575b505050918352505060035467ffffffffffffffff811115611c8557611c85612239565b604051908082528060200260200182016040528015611cae578160200160208202803683370190505b5060208201819052805184919087908110611ccb57611ccb61224f565b602002602001018181525050611d118460045460408051600060208201529081018390526060818101929092526080016040516020818303038152906040529050919050565b604082015260006060820152949350505050565b611d5260405180608001604052806060815260200160608152602001606081526020016000151581525090565b611d7f60405180608001604052806060815260200160608152602001606081526020016000151581525090565b6003805480602002602001604051908101604052809291908181526020018280548015611dd557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611db7575b505050918352505060035467ffffffffffffffff811115611df857611df8612239565b604051908082528060200260200182016040528015611e21578160200160208202803683370190505b50602082018190526004548151859291908110611e4057611e4061224f565b602002602001018181525050611e5583611e67565b60408201526000606082015292915050565b60035460609060009067ffffffffffffffff811115611e8857611e88612239565b604051908082528060200260200182016040528015611eb1578160200160208202803683370190505b509050828160045481518110611ec957611ec961224f565b6020026020010181815250506001816000604051602001611eec93929190612265565b604051602081830303815290604052915050919050565b801515811461171757600080fd5b600060208284031215611f2357600080fd5b8135611f2e81611f03565b9392505050565b600060208284031215611f4757600080fd5b5035919050565b600060208284031215611f6057600080fd5b81356001600160a01b0381168114611f2e57600080fd5b600060208284031215611f8957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611fc057611fc0611f90565b500290565b600082611fe257634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611ff957611ff9611f90565b500390565b60006020828403121561201057600080fd5b8151611f2e81611f03565b602080825260149082015273105554904815d2551211149055c811905253115160621b604082015260600190565b6020808252600a908201526927a7262c9021a420a4a960b11b604082015260600190565b6000821982111561208057612080611f90565b500190565b60208082526008908201526727a7262c9023a7ab60c11b604082015260600190565b6020808252601e908201527f43616e27742068617665206d6178206c6f73732061626f766520313030250000604082015260600190565b600081518084526020808501945080840160005b8381101561210e578151875295820195908201906001016120f2565b509495945050505050565b6000815180845260005b8181101561213f57602081850181015186830182015201612123565b81811115612151576000602083870101525b50601f01601f19169290920160200192915050565b8051608080845281519084018190526000916020919082019060a0860190845b818110156121ab5783516001600160a01b031683529284019291840191600101612186565b5050828501519150858103838701526121c481836120de565b92505050604083015184820360408601526121df8282612119565b91505060608301516121f5606086018215159052565b509392505050565b8481526001600160a01b0384811660208301528316604082015260806060820181905260009061222f90830184612166565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60ff8416815260606020820152600061228160608301856120de565b905060ff8316604083015294935050505056fea26469706673582212204db761e266837fe4a579781160d68797897acea978b89a8b4a05f36cc1bfb42864736f6c634300080d0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4000000000000000000000000c0c293ce456ff0ed870add98a0828dd4d2903dbf000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c800000000000000000000000022915f309ec0182c85cd8331c23bd187fd761360000000000000000000000000a57b8d98dae62b26ec3bcc4a365338157060b2340000000000000000000000008f97cca30dbe80e7a8b462f1dd1a51c32accdfc8000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000320000000000000000000000000000000000000000000000000000000000000014ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6000200000000000000000426

-----Decoded View---------------
Arg [0] : dola_ (address): 0x865377367054516e17014CcdED1e7d814EDC9ce4
Arg [1] : aura_ (address): 0xC0c293ce456fF0ED870ADd98a0828Dd4d2903DBF
Arg [2] : vault_ (address): 0xBA12222222228d8Ba445958a75a0704d566BF2C8
Arg [3] : dolaBptRewardPool_ (address): 0x22915f309EC0182c85cD8331C23bD187fd761360
Arg [4] : booster_ (address): 0xA57b8d98dAE62B26Ec3bcC4a365338157060B234
Arg [5] : chair_ (address): 0x8F97cCA30Dbe80e7a8B462F1dD1a51C32accDfC8
Arg [6] : guardian_ (address): 0xE3eD95e130ad9E15643f5A5f232a3daE980784cd
Arg [7] : gov_ (address): 0x926dF14a23BE491164dCF93f4c468A50ef659D5B
Arg [8] : maxLossExpansionBps_ (uint256): 50
Arg [9] : maxLossWithdrawBps_ (uint256): 50
Arg [10] : maxLossTakeProfitBps_ (uint256): 20
Arg [11] : poolId_ (bytes32): 0xff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6000200000000000000000426

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000865377367054516e17014ccded1e7d814edc9ce4
Arg [1] : 000000000000000000000000c0c293ce456ff0ed870add98a0828dd4d2903dbf
Arg [2] : 000000000000000000000000ba12222222228d8ba445958a75a0704d566bf2c8
Arg [3] : 00000000000000000000000022915f309ec0182c85cd8331c23bd187fd761360
Arg [4] : 000000000000000000000000a57b8d98dae62b26ec3bcc4a365338157060b234
Arg [5] : 0000000000000000000000008f97cca30dbe80e7a8b462f1dd1a51c32accdfc8
Arg [6] : 000000000000000000000000e3ed95e130ad9e15643f5a5f232a3dae980784cd
Arg [7] : 000000000000000000000000926df14a23be491164dcf93f4c468a50ef659d5b
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [11] : ff4ce5aaab5a627bf82f4a571ab1ce94aa365ea6000200000000000000000426


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Txn Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.