ETH Price: $2,137.72 (-9.32%)
Gas: 1.3 Gwei

Contract

0xED3A954c0ADFC8E3F85d92729c051FF320648E30
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Internal Transactions and > 10 Token Transfers found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
217669882025-02-03 15:51:1124 days ago1738597871
0xED3A954c...320648E30
0 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GuniMultiplyProxyActions

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 17 : GuniMultiplyProxyActions.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.7.6;
pragma abicoder v2;
import "../interfaces/IERC20.sol";
import "./ExchangeData.sol";
import "../utils/SafeMath.sol";
import "../interfaces/mcd/IJoin.sol";
import "../interfaces/mcd/IManager.sol";
import "../interfaces/mcd/IVat.sol";
import "../interfaces/mcd/IJug.sol";
import "../interfaces/mcd/IDaiJoin.sol";
import "../interfaces/misc/IUniPool.sol";
import "../interfaces/misc/IGUNIRouter.sol";
import "../interfaces/misc/IGUNIResolver.sol";
import "../interfaces/misc/IGUNIToken.sol";
import "../interfaces/exchange/IExchange.sol";
import "./../flashMint/interface/IERC3156FlashBorrower.sol";
import "./../flashMint/interface/IERC3156FlashLender.sol";

struct CdpData {
  address gemJoin;
  address payable fundsReceiver;
  uint256 cdpId;
  bytes32 ilk;
  uint256 requiredDebt;
  uint256 token0Amount;
  string methodName;
}

struct GuniAddressRegistry {
  address guni;
  address router;
  address resolver;
  address guniProxyActions;
  address otherToken;
  address exchange;
  address jug;
  address manager;
  address lender;
}

contract GuniMultiplyProxyActions is IERC3156FlashBorrower {
  using SafeMath for uint256;
  uint256 constant RAY = 10**27;
  address public constant DAIJOIN = 0x9759A6Ac90977b93B58547b4A71c78317f391A28;
  address public constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
  IERC20 public constant daiContract = IERC20(DAI);

  modifier logMethodName(
    string memory name,
    CdpData memory data,
    address destination
  ) {
    if (bytes(data.methodName).length == 0) {
      data.methodName = name;
    }
    _;
    data.methodName = "";
  }

  function openMultiplyGuniVault(
    ExchangeData calldata exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry calldata guniAddressRegistry
  ) public logMethodName("openMultiplyGuniVault", cdpData, guniAddressRegistry.guniProxyActions) {
    cdpData.ilk = IJoin(cdpData.gemJoin).ilk();
    cdpData.cdpId = IManager(guniAddressRegistry.manager).open(cdpData.ilk, address(this));

    increaseMultipleGuni(exchangeData, cdpData, guniAddressRegistry);
  }

  function increaseMultipleGuni(
    ExchangeData calldata exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry calldata guniAddressRegistry
  ) public logMethodName("increaseMultipleGuni", cdpData, guniAddressRegistry.guniProxyActions) {
    daiContract.transferFrom(
      msg.sender,
      guniAddressRegistry.guniProxyActions,
      cdpData.token0Amount
    );
    takeAFlashLoan(exchangeData, cdpData, guniAddressRegistry, 1);
  }

  function closeGuniVaultExitDai(
    ExchangeData calldata exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry calldata guniAddressRegistry
  ) public logMethodName("closeGuniVaultExitDai", cdpData, guniAddressRegistry.guniProxyActions) {
    cdpData.ilk = IJoin(cdpData.gemJoin).ilk();

    address urn = IManager(guniAddressRegistry.manager).urns(cdpData.cdpId);
    address vat = IManager(guniAddressRegistry.manager).vat();

    uint256 wadD = _getWipeAllWad(vat, urn, urn, cdpData.ilk);
    cdpData.requiredDebt = wadD;

    takeAFlashLoan(exchangeData, cdpData, guniAddressRegistry, 0);
  }

  function takeAFlashLoan(
    ExchangeData calldata exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry calldata guniAddressRegistry,
    uint256 action
  ) internal {
    bytes memory paramsData = abi.encode(action, exchangeData, cdpData, guniAddressRegistry);

    IManager(guniAddressRegistry.manager).cdpAllow(
      cdpData.cdpId,
      guniAddressRegistry.guniProxyActions,
      1
    );

    IERC3156FlashLender(guniAddressRegistry.lender).flashLoan(
      IERC3156FlashBorrower(guniAddressRegistry.guniProxyActions),
      DAI,
      cdpData.requiredDebt,
      paramsData
    );

    IManager(guniAddressRegistry.manager).cdpAllow(
      cdpData.cdpId,
      guniAddressRegistry.guniProxyActions,
      0
    );
  }

  function _increaseMPGuni(
    ExchangeData memory exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry memory guniAddressRegistry,
    uint256 borrowedDaiAmount
  ) internal {
    IGUNIToken guni = IGUNIToken(guniAddressRegistry.guni);
    IERC20 otherToken = IERC20(guniAddressRegistry.otherToken);

    uint256 bal0 = daiContract.balanceOf(address(this));

    {
      IExchange exchange = IExchange(guniAddressRegistry.exchange);

      daiContract.approve(address(exchange), exchangeData.fromTokenAmount);

      exchange.swapDaiForToken(
        exchangeData.toTokenAddress,
        exchangeData.fromTokenAmount,
        exchangeData.minToTokenAmount,
        exchangeData.exchangeAddress,
        exchangeData._exchangeCalldata
      );
    }

    uint256 guniBalance;
    uint256 bal1 = otherToken.balanceOf(address(this));
    bal0 = daiContract.balanceOf(address(this));

    {
      IGUNIRouter router = IGUNIRouter(guniAddressRegistry.router);
      daiContract.approve(address(router), bal0);
      otherToken.approve(address(router), bal1);

      (, , guniBalance) = router.addLiquidity(address(guni), bal0, bal1, 0, 0, address(this));
    }

    guni.approve(guniAddressRegistry.guniProxyActions, guniBalance);
    joinDrawDebt(
      cdpData,
      borrowedDaiAmount.sub(IERC20(DAI).balanceOf(address(this))),
      guniAddressRegistry.manager,
      guniAddressRegistry.jug
    );

    uint256 daiLeft = IERC20(DAI).balanceOf(address(this)).sub(borrowedDaiAmount);
    uint256 otherTokenLeft = otherToken.balanceOf(address(this));

    emit MultipleActionCalled(
      cdpData.methodName,
      cdpData.cdpId,
      exchangeData.minToTokenAmount,
      exchangeData.toTokenAmount,
      0,
      daiLeft
    );

    if (daiLeft > 0) {
      IERC20(DAI).transfer(cdpData.fundsReceiver, daiLeft);
    }
    if (otherTokenLeft > 0) {
      otherToken.transfer(cdpData.fundsReceiver, otherTokenLeft);
    }
  }

  function _closeToDaiMPGuni(
    ExchangeData memory exchangeData,
    CdpData memory cdpData,
    GuniAddressRegistry memory guniAddressRegistry,
    uint256 borrowedDaiAmount
  ) internal {
    IExchange exchange = IExchange(guniAddressRegistry.exchange);
    IERC20 otherToken = IERC20(guniAddressRegistry.otherToken);
    uint256 ink = getInk(guniAddressRegistry.manager, cdpData);

    wipeAndFreeGem(
      guniAddressRegistry.manager,
      cdpData.gemJoin,
      cdpData.cdpId,
      cdpData.requiredDebt,
      ink
    );

    IGUNIToken guni = IGUNIToken(guniAddressRegistry.guni);

    uint256 guniBalance = guni.balanceOf(address(this));

    {
      IGUNIRouter router = IGUNIRouter(guniAddressRegistry.router);
      guni.approve(address(router), guniBalance);
      router.removeLiquidity(address(guni), guniBalance, 0, 0, address(this));
    }

    otherToken.approve(address(exchange), otherToken.balanceOf(address(this)));
    exchange.swapTokenForDai(
      exchangeData.toTokenAddress,
      otherToken.balanceOf(address(this)),
      exchangeData.minToTokenAmount,
      exchangeData.exchangeAddress,
      exchangeData._exchangeCalldata
    );

    uint256 daiLeft = IERC20(DAI).balanceOf(address(this)).sub(borrowedDaiAmount);
    uint256 otherTokenLeft = otherToken.balanceOf(address(this));

    emit MultipleActionCalled(
      cdpData.methodName,
      cdpData.cdpId,
      exchangeData.minToTokenAmount,
      exchangeData.toTokenAmount,
      0,
      daiLeft
    );

    if (daiLeft > 0) {
      IERC20(DAI).transfer(cdpData.fundsReceiver, daiLeft);
    }
    if (otherTokenLeft > 0) {
      otherToken.transfer(cdpData.fundsReceiver, otherTokenLeft);
    }
  }

  function onFlashLoan(
    address initiator,
    address token,
    uint256 amount,
    uint256 fee,
    bytes calldata params
  ) public override returns (bytes32) {
    (
      uint256 mode,
      ExchangeData memory exchangeData,
      CdpData memory cdpData,
      GuniAddressRegistry memory guniAddressRegistry
    ) = abi.decode(params, (uint256, ExchangeData, CdpData, GuniAddressRegistry));

    require(msg.sender == address(guniAddressRegistry.lender), "mpa-untrusted-lender");
    uint256 borrowedDaiAmount;
    {
      borrowedDaiAmount = amount.add(fee);
    }
    emit FLData(IERC20(DAI).balanceOf(address(this)).sub(cdpData.token0Amount), borrowedDaiAmount);

    require(
      cdpData.requiredDebt.add(cdpData.token0Amount) <= IERC20(DAI).balanceOf(address(this)),
      "mpa-receive-requested-amount-mismatch"
    );

    if (mode == 1) {
      _increaseMPGuni(exchangeData, cdpData, guniAddressRegistry, borrowedDaiAmount);
    }
    if (mode == 0) {
      _closeToDaiMPGuni(exchangeData, cdpData, guniAddressRegistry, borrowedDaiAmount);
    }

    IERC20(token).approve(guniAddressRegistry.lender, borrowedDaiAmount);

    return keccak256("ERC3156FlashBorrower.onFlashLoan");
  }

  function getOtherTokenAmount(
    IGUNIToken guni,
    IGUNIResolver resolver,
    uint256 bal0,
    uint256 otherTokenDecimals
  ) public view returns (uint256 amount) {
    (uint256 sqrtPriceX96, , , , , , ) = IUniPool(guni.pool()).slot0();

    uint256 otherTokenTo18Conv = 10**(18 - otherTokenDecimals);

    (, amount) = resolver.getRebalanceParams(
      address(guni),
      guni.token0() == DAI ? bal0 : 0,
      guni.token1() == DAI ? bal0 : 0,
      ((((sqrtPriceX96 * sqrtPriceX96) >> 96) * 1e18) >> 96) * otherTokenTo18Conv
    );
  }

  function getInk(address manager, CdpData memory cdpData) internal view returns (uint256) {
    address urn = IManager(manager).urns(cdpData.cdpId);
    address vat = IManager(manager).vat();

    (uint256 ink, ) = IVat(vat).urns(cdpData.ilk, urn);
    return ink;
  }

  function wipeAndFreeGem(
    address manager,
    address gemJoin,
    uint256 cdp,
    uint256 borrowedDai,
    uint256 collateralDraw
  ) internal {
    address vat = IManager(manager).vat();
    address urn = IManager(manager).urns(cdp);
    bytes32 ilk = IManager(manager).ilks(cdp);

    IERC20(DAI).approve(DAIJOIN, borrowedDai);
    IDaiJoin(DAIJOIN).join(urn, borrowedDai);

    uint256 wadC = convertTo18(gemJoin, collateralDraw);

    IManager(manager).frob(cdp, -toInt256(wadC), _getWipeDart(vat, IVat(vat).dai(urn), urn, ilk));

    IManager(manager).flux(cdp, address(this), wadC);
    IJoin(gemJoin).exit(address(this), collateralDraw);
  }

  function convertTo18(address gemJoin, uint256 amt) internal returns (uint256 wad) {
    // For those collaterals that have less than 18 decimals precision we need to do the conversion before passing to frob function
    // Adapters will automatically handle the difference of precision
    wad = amt.mul(10**(18 - IJoin(gemJoin).dec()));
  }

  function _getWipeDart(
    address vat,
    uint256 dai,
    address urn,
    bytes32 ilk
  ) internal view returns (int256 dart) {
    // Gets actual rate from the vat
    (, uint256 rate, , , ) = IVat(vat).ilks(ilk);
    // Gets actual art value of the urn
    (, uint256 art) = IVat(vat).urns(ilk, urn);

    // Uses the whole dai balance in the vat to reduce the debt
    dart = toInt256(dai / rate);
    // Checks the calculated dart is not higher than urn.art (total debt), otherwise uses its value
    dart = uint256(dart) <= art ? -dart : -toInt256(art);
  }

  function joinDrawDebt(
    CdpData memory cdpData,
    uint256 borrowedDai,
    address manager,
    address jug
  ) private {
    IGem gem = IJoin(cdpData.gemJoin).gem();

    uint256 balance = IERC20(address(gem)).balanceOf(address(this));
    gem.approve(address(cdpData.gemJoin), balance);

    address urn = IManager(manager).urns(cdpData.cdpId);
    address vat = IManager(manager).vat();

    IJoin(cdpData.gemJoin).join(urn, balance);

    IManager(manager).frob(
      cdpData.cdpId,
      toInt256(convertTo18(cdpData.gemJoin, balance)),
      _getDrawDart(vat, jug, urn, cdpData.ilk, borrowedDai)
    );
    IManager(manager).move(cdpData.cdpId, address(this), borrowedDai.mul(RAY));

    IVat(vat).hope(DAIJOIN);

    IJoin(DAIJOIN).exit(address(this), borrowedDai);
  }

  function _getDrawDart(
    address vat,
    address jug,
    address urn,
    bytes32 ilk,
    uint256 wad
  ) internal returns (int256 dart) {
    // Updates stability fee rate
    uint256 rate = IJug(jug).drip(ilk);

    // Gets DAI balance of the urn in the vat
    uint256 dai = IVat(vat).dai(urn);

    // If there was already enough DAI in the vat balance, just exits it without adding more debt
    if (dai < wad.mul(RAY)) {
      // Calculates the needed dart so together with the existing dai in the vat is enough to exit wad amount of DAI tokens
      dart = toInt256(wad.mul(RAY).sub(dai) / rate);
      // This is neeeded due lack of precision. It might need to sum an extra dart wei (for the given DAI wad amount)
      dart = uint256(dart).mul(rate) < wad.mul(RAY) ? dart + 1 : dart;
    }
  }

  function toRad(uint256 wad) internal pure returns (uint256 rad) {
    rad = wad.mul(10**27);
  }

  function toInt256(uint256 x) internal pure returns (int256 y) {
    y = int256(x);
    require(y >= 0, "int256-overflow");
  }

  function _getWipeAllWad(
    address vat,
    address usr,
    address urn,
    bytes32 ilk
  ) internal view returns (uint256 wad) {
    // Gets actual rate from the vat
    (, uint256 rate, , , ) = IVat(vat).ilks(ilk);
    // Gets actual art value of the urn
    (, uint256 art) = IVat(vat).urns(ilk, urn);
    // Gets actual dai amount in the urn
    uint256 dai = IVat(vat).dai(usr);

    uint256 rad = art.mul(rate).sub(dai);
    wad = rad / RAY;

    // If the rad precision has some dust, it will need to request for 1 extra wad wei
    wad = wad.mul(RAY) < rad ? wad + 1 : wad;
  }

  event FLData(uint256 borrowed, uint256 due);
  event MultipleActionCalled(
    string methodName,
    uint256 indexed cdpId,
    uint256 swapMinAmount,
    uint256 swapOptimistAmount,
    uint256 collateralLeft,
    uint256 daiLeft
  );
}

File 2 of 17 : IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

interface IERC20 {
  function totalSupply() external view returns (uint256 supply);

  function balanceOf(address _owner) external view returns (uint256 balance);

  function transfer(address _to, uint256 _value) external returns (bool success);

  function transferFrom(
    address _from,
    address _to,
    uint256 _value
  ) external returns (bool success);

  function approve(address _spender, uint256 _value) external returns (bool success);

  function allowance(address _owner, address _spender) external view returns (uint256 remaining);

  function decimals() external view returns (uint256 digits);

  event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

File 3 of 17 : ExchangeData.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.7.6;

struct ExchangeData {
  address fromTokenAddress;
  address toTokenAddress;
  uint256 fromTokenAmount;
  uint256 toTokenAmount;
  uint256 minToTokenAmount;
  address exchangeAddress;
  bytes _exchangeCalldata;
}

File 4 of 17 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6;

library SafeMath {
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a, 'SafeMath: addition overflow');

    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    return sub(a, b, 'SafeMath: subtraction overflow');
  }

  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
    if (a == 0) {
      return 0;
    }

    uint256 c = a * b;
    require(c / a == b, 'SafeMath: multiplication overflow');

    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    return div(a, b, 'SafeMath: division by zero');
  }

  function div(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    return mod(a, b, 'SafeMath: modulo by zero');
  }

  function mod(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b != 0, errorMessage);
    return a % b;
  }
}

File 5 of 17 : IJoin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import './IGem.sol';

abstract contract IJoin {
  bytes32 public ilk;

  function dec() public view virtual returns (uint256);

  function gem() public view virtual returns (IGem);

  function join(address, uint256) public payable virtual;

  function exit(address, uint256) public virtual;
}

File 6 of 17 : IManager.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IManager {
  function last(address) public virtual returns (uint256);

  function cdpCan(
    address,
    uint256,
    address
  ) public view virtual returns (uint256);

  function ilks(uint256) public view virtual returns (bytes32);

  function owns(uint256) public view virtual returns (address);

  function urns(uint256) public view virtual returns (address);

  function vat() public view virtual returns (address);

  function open(bytes32, address) public virtual returns (uint256);

  function give(uint256, address) public virtual;

  function cdpAllow(
    uint256,
    address,
    uint256
  ) public virtual;

  function urnAllow(address, uint256) public virtual;

  function frob(
    uint256,
    int256,
    int256
  ) public virtual;

  function flux(
    uint256,
    address,
    uint256
  ) public virtual;

  function move(
    uint256,
    address,
    uint256
  ) public virtual;

  function exit(
    address,
    uint256,
    address,
    uint256
  ) public virtual;

  function quit(uint256, address) public virtual;

  function enter(address, uint256) public virtual;

  function shift(uint256, uint256) public virtual;
}

File 7 of 17 : IVat.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IVat {
  struct Urn {
    uint256 ink; // Locked Collateral  [wad]
    uint256 art; // Normalised Debt    [wad]
  }

  struct Ilk {
    uint256 Art; // Total Normalised Debt     [wad]
    uint256 rate; // Accumulated Rates         [ray]
    uint256 spot; // Price with Safety Margin  [ray]
    uint256 line; // Debt Ceiling              [rad]
    uint256 dust; // Urn Debt Floor            [rad]
  }

  mapping(bytes32 => mapping(address => Urn)) public urns;
  mapping(bytes32 => Ilk) public ilks;
  mapping(bytes32 => mapping(address => uint256)) public gem; // [wad]

  function can(address, address) public view virtual returns (uint256);

  function dai(address) public view virtual returns (uint256);

  function frob(
    bytes32,
    address,
    address,
    address,
    int256,
    int256
  ) public virtual;

  function hope(address) public virtual;

  function move(
    address,
    address,
    uint256
  ) public virtual;

  function fork(
    bytes32,
    address,
    address,
    int256,
    int256
  ) public virtual;
}

File 8 of 17 : IJug.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IJug {
  struct Ilk {
    uint256 duty;
    uint256 rho;
  }

  mapping(bytes32 => Ilk) public ilks;

  function drip(bytes32) public virtual returns (uint256);
}

File 9 of 17 : IDaiJoin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import './IVat.sol';
import './IGem.sol';

abstract contract IDaiJoin {
  function vat() public virtual returns (IVat);

  function dai() public virtual returns (IGem);

  function join(address, uint256) public payable virtual;

  function exit(address, uint256) public virtual;
}

File 10 of 17 : IUniPool.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IUniPool {
  function slot0()
    public view virtual
    returns (
      uint160,
      int24,
      uint16,
      uint16,
      uint16,
      uint8,
      bool
    );

  function swap(
    address,
    bool,
    int256,
    uint160,
    bytes calldata
  ) public view virtual;

  function positions(bytes32)
    public view virtual
    returns (
      uint128,
      uint256,
      uint256,
      uint128,
      uint128
    );
}

File 11 of 17 : IGUNIRouter.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IGUNIRouter {
  function addLiquidity(
    address _pool,
    uint256 _amount0Max,
    uint256 _amount1Max,
    uint256 _amount0Min,
    uint256 _amount1Min,
    address _receiver
  )
    public virtual
    returns (
      uint256 amount0,
      uint256 amount1,
      uint256 mintAmount
    );

  function removeLiquidity(
    address _pool,
    uint256 _burnAmount,
    uint256 _amount0Min,
    uint256 _amount1Min,
    address _receiver
  )
    public virtual
    returns (
      uint256 amount0,
      uint256 amount1,
      uint256 liquidityBurned
    );
}

File 12 of 17 : IGUNIResolver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;


abstract contract  IGUNIResolver {
  function getRebalanceParams(
    address pool,
    uint256 amount0In,
    uint256 amount1In,
    uint256 price18Decimals
  ) external view virtual returns (bool zeroForOne, uint256 swapAmount);
}

File 13 of 17 : IGUNIToken.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

import "./../IERC20.sol";

abstract contract IGUNIToken is IERC20 {
  function mint(uint256 mintAmount, address receiver)
    public virtual
    returns (
      uint256 amount0,
      uint256 amount1,
      uint128 liquidityMinted
    );

  function burn(uint256 burnAmount, address receiver)
    public virtual
    returns (
      uint256 amount0,
      uint256 amount1,
      uint128 liquidityBurned
    );

  function getMintAmounts(uint256 amount0Max, uint256 amount1Max)
    public virtual
    view
    returns (
      uint256 amount0,
      uint256 amount1,
      uint256 mintAmount
    );

  function token0() public virtual view returns (address);

  function token1() public virtual view returns (address);

  function pool() public virtual view returns (address);

  function getUnderlyingBalances() public virtual view returns (uint256, uint256);
}

File 14 of 17 : IExchange.sol
pragma solidity >=0.7.0;

abstract contract IExchange {
  function swapDaiForToken(
    address asset,
    uint256 amount,
    uint256 receiveAtLeast,
    address callee,
    bytes calldata withData
  ) external virtual;

  function swapTokenForDai(
    address asset,
    uint256 amount,
    uint256 receiveAtLeast,
    address callee,
    bytes calldata withData
  ) external virtual;
}

File 15 of 17 : IERC3156FlashBorrower.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity >=0.6.12;

interface IERC3156FlashBorrower {

    /**
     * @dev Receive a flash loan.
     * @param initiator The initiator of the loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param fee The additional amount of tokens to repay.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     * @return The keccak256 hash of "ERC3156FlashBorrower.onFlashLoan"
     */
    function onFlashLoan(
        address initiator,
        address token,
        uint256 amount,
        uint256 fee,
        bytes calldata data
    ) external returns (bytes32);
}

File 16 of 17 : IERC3156FlashLender.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
// Copyright (C) 2021 Dai Foundation
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

pragma solidity >=0.6.12;

import "./IERC3156FlashBorrower.sol";

interface IERC3156FlashLender {

    /**
     * @dev The amount of currency available to be lent.
     * @param token The loan currency.
     * @return The amount of `token` that can be borrowed.
     */
    function maxFlashLoan(
        address token
    ) external view returns (uint256);

    /**
     * @dev The fee to be charged for a given loan.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @return The amount of `token` to be charged for the loan, on top of the returned principal.
     */
    function flashFee(
        address token,
        uint256 amount
    ) external view returns (uint256);

    /**
     * @dev Initiate a flash loan.
     * @param receiver The receiver of the tokens in the loan, and the receiver of the callback.
     * @param token The loan currency.
     * @param amount The amount of tokens lent.
     * @param data Arbitrary data structure, intended to contain user-defined parameters.
     */
    function flashLoan(
        IERC3156FlashBorrower receiver,
        address token,
        uint256 amount,
        bytes calldata data
    ) external returns (bool);
}

File 17 of 17 : IGem.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.7.0;

abstract contract IGem {
  function dec() public virtual returns (uint256);

  function gem() public virtual returns (IGem);

  function join(address, uint256) public payable virtual;

  function exit(address, uint256) public virtual;

  function approve(address, uint256) public virtual;

  function transfer(address, uint256) public virtual returns (bool);

  function transferFrom(
    address,
    address,
    uint256
  ) public virtual returns (bool);

  function deposit() public payable virtual;

  function withdraw(uint256) public virtual;

  function allowance(address, address) public virtual returns (uint256);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"borrowed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"due","type":"uint256"}],"name":"FLData","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"methodName","type":"string"},{"indexed":true,"internalType":"uint256","name":"cdpId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapMinAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swapOptimistAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"collateralLeft","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"daiLeft","type":"uint256"}],"name":"MultipleActionCalled","type":"event"},{"inputs":[],"name":"DAI","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAIJOIN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"closeGuniVaultExitDai","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daiContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IGUNIToken","name":"guni","type":"address"},{"internalType":"contract IGUNIResolver","name":"resolver","type":"address"},{"internalType":"uint256","name":"bal0","type":"uint256"},{"internalType":"uint256","name":"otherTokenDecimals","type":"uint256"}],"name":"getOtherTokenAmount","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"increaseMultipleGuni","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"fee","type":"uint256"},{"internalType":"bytes","name":"params","type":"bytes"}],"name":"onFlashLoan","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"fromTokenAddress","type":"address"},{"internalType":"address","name":"toTokenAddress","type":"address"},{"internalType":"uint256","name":"fromTokenAmount","type":"uint256"},{"internalType":"uint256","name":"toTokenAmount","type":"uint256"},{"internalType":"uint256","name":"minToTokenAmount","type":"uint256"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"_exchangeCalldata","type":"bytes"}],"internalType":"struct ExchangeData","name":"exchangeData","type":"tuple"},{"components":[{"internalType":"address","name":"gemJoin","type":"address"},{"internalType":"address payable","name":"fundsReceiver","type":"address"},{"internalType":"uint256","name":"cdpId","type":"uint256"},{"internalType":"bytes32","name":"ilk","type":"bytes32"},{"internalType":"uint256","name":"requiredDebt","type":"uint256"},{"internalType":"uint256","name":"token0Amount","type":"uint256"},{"internalType":"string","name":"methodName","type":"string"}],"internalType":"struct CdpData","name":"cdpData","type":"tuple"},{"components":[{"internalType":"address","name":"guni","type":"address"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"resolver","type":"address"},{"internalType":"address","name":"guniProxyActions","type":"address"},{"internalType":"address","name":"otherToken","type":"address"},{"internalType":"address","name":"exchange","type":"address"},{"internalType":"address","name":"jug","type":"address"},{"internalType":"address","name":"manager","type":"address"},{"internalType":"address","name":"lender","type":"address"}],"internalType":"struct GuniAddressRegistry","name":"guniAddressRegistry","type":"tuple"}],"name":"openMultiplyGuniVault","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b506136a3806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063aa27fd441161005b578063aa27fd44146100f3578063ac0397b314610106578063e0bab4c4146100b6578063f85c2ce31461011957610088565b806323e30c8b1461008d5780632ce8b913146100b65780633be1b5fe146100cb57806377925bf1146100de575b600080fd5b6100a061009b366004612c86565b610121565b6040516100ad9190613362565b60405180910390f35b6100be6103e7565b6040516100ad9190613249565b6100a06100d9366004612d88565b6103f9565b6100f16100ec366004612dcd565b6106d9565b005b6100f1610101366004612dcd565b610862565b6100f1610114366004612dcd565b610a8f565b6100be610b85565b60008080808061013386880188612ee9565b93509350935093508061010001516001600160a01b0316336001600160a01b03161461017a5760405162461bcd60e51b815260040161017190613464565b60405180910390fd5b60006101868a8a610b9d565b90507f9c6641b21946115d10f3f55df9bec5752ec06d40dc9250b1cc6560549764600e6102418460a0015160008051602061362d8339815191526001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016101eb9190613249565b60206040518083038186803b15801561020357600080fd5b505afa158015610217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023b9190612d70565b90610c00565b82604051610250929190613596565b60405180910390a16040516370a0823160e01b815260008051602061362d833981519152906370a0823190610289903090600401613249565b60206040518083038186803b1580156102a157600080fd5b505afa1580156102b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d99190612d70565b60a084015160808501516102ec91610b9d565b111561030a5760405162461bcd60e51b81526004016101719061341f565b846001141561031f5761031f84848484610c42565b8461033057610330848484846113da565b61010082015160405163095ea7b360e01b81526001600160a01b038d169163095ea7b39161036391908590600401613281565b602060405180830381600087803b15801561037d57600080fd5b505af1158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190612d2b565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99c9b505050505050505050505050565b60008051602061362d83398151915281565b600080856001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190612c6a565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104a557600080fd5b505afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190612e52565b5050505050506001600160a01b03169050600083601203600a0a9050856001600160a01b031663444b4bf68860008051602061362d8339815191526001600160a01b03168a6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561055a57600080fd5b505afa15801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190612c6a565b6001600160a01b0316146105a75760006105a9565b875b60008051602061362d8339815191526001600160a01b03168b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190612c6a565b6001600160a01b031614610647576000610649565b885b85606080898a02901c670de0b6b3a764000002901c026040518563ffffffff1660e01b815260040161067e949392919061333c565b604080518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cd9190612d45565b98975050505050505050565b6040805180820190915260158152741bdc195b935d5b1d1a5c1b1e51dd5b9a55985d5b1d605a1b6020820152826107166080840160608501612c4e565b60c0820151516107285760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612d70565b60608601526107b3610100850160e08601612c4e565b6001600160a01b0316636090dec58660600151306040518363ffffffff1660e01b81526004016107e492919061336b565b602060405180830381600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190612d70565b6040860152610846868686610a8f565b5060408051602081019091526000815260c09091015250505050565b604080518082019091526015815274636c6f736547756e695661756c744578697444616960581b60208201528261089f6080840160608501612c4e565b60c0820151516108b15760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ee57600080fd5b505afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190612d70565b6060860152600061093e610100860160e08701612c4e565b6001600160a01b0316632726b07387604001516040518263ffffffff1660e01b815260040161096d9190613362565b60206040518083038186803b15801561098557600080fd5b505afa158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190612c6a565b905060006109d2610100870160e08801612c4e565b6001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0a57600080fd5b505afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190612c6a565b90506000610a568284858b606001516117cc565b608089018190529050610a6c89898960006119aa565b505050604051806020016040528060008152508260c00181905250505050505050565b604080518082019091526014815273696e6372656173654d756c7469706c6547756e6960601b602082015282610acb6080840160608501612c4e565b60c082015151610add5760c082018390525b60008051602061362d8339815191526323b872dd33610b026080880160608901612c4e565b8860a001516040518463ffffffff1660e01b8152600401610b259392919061325d565b602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612d2b565b5061084686868660016119aa565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ba6565b815160808301516040516370a0823160e01b815260009060008051602061362d833981519152906370a0823190610c7d903090600401613249565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612d70565b60a08601516040808a0151905163095ea7b360e01b8152929350909160008051602061362d8339815191529163095ea7b391610d0d918591600401613281565b602060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612d2b565b50806001600160a01b031663bc6f02b289602001518a604001518b608001518c60a001518d60c001516040518663ffffffff1660e01b8152600401610da89594939291906132ca565b600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b5050505050600080836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e0a9190613249565b60206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612d70565b6040516370a0823160e01b815290915060008051602061362d833981519152906370a0823190610e8e903090600401613249565b60206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612d70565b602088015160405163095ea7b360e01b81529194509060008051602061362d8339815191529063095ea7b390610f1a9084908890600401613281565b602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612d2b565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b390610f9b9084908690600401613281565b602060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612d2b565b5060405163fb9f478960e01b81526001600160a01b0382169063fb9f4789906110259089908890879060009081903090600401613304565b606060405180830381600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110779190613008565b60608b015160405163095ea7b360e01b81529196506001600160a01b038a16945063095ea7b393506110af9250908690600401613281565b602060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190612d2b565b506040516370a0823160e01b81526111a39089906111949060008051602061362d833981519152906370a082319061113d903090600401613249565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190612d70565b8990610c00565b8960e001518a60c00151611c3d565b6040516370a0823160e01b81526000906111dd90889060008051602061362d833981519152906370a08231906101eb903090600401613249565b90506000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161120d9190613249565b60206040518083038186803b15801561122557600080fd5b505afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d9190612d70565b905089604001517fead01ff65532b6ee1646408ed4a14f45b5ee091a71e9bb1f579c0a44d59230118b60c001518d608001518e606001516000876040516112a89594939291906133bf565b60405180910390a281156113415760208a015160405163a9059cbb60e01b815260008051602061362d8339815191529163a9059cbb916112ed91908690600401613281565b602060405180830381600087803b15801561130757600080fd5b505af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612d2b565b505b80156113cd5760208a015160405163a9059cbb60e01b81526001600160a01b0388169163a9059cbb9161137991908590600401613281565b602060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612d2b565b505b5050505050505050505050565b60a0820151608083015160e08401516000906113f690876120d3565b90506114158560e001518760000151886040015189608001518561225b565b84516040516370a0823160e01b81526000906001600160a01b038316906370a0823190611446903090600401613249565b60206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612d70565b602088015160405163095ea7b360e01b8152919250906001600160a01b0384169063095ea7b3906114cd9084908690600401613281565b602060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190612d2b565b50604051632cfc215960e11b81526001600160a01b038216906359f842b29061155590869086906000908190309060040161329a565b606060405180830381600087803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a79190613008565b50506040516370a0823160e01b81526001600160a01b038716925063095ea7b39150879083906370a08231906115e1903090600401613249565b60206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190612d70565b6040518363ffffffff1660e01b815260040161164e929190613281565b602060405180830381600087803b15801561166857600080fd5b505af115801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190612d2b565b50846001600160a01b031663c723c87f8a60200151866001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016116e19190613249565b60206040518083038186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612d70565b8c608001518d60a001518e60c001516040518663ffffffff1660e01b81526004016117609594939291906132ca565b600060405180830381600087803b15801561177a57600080fd5b505af115801561178e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506111dd9150889060008051602061362d833981519152906370a08231906101eb903090600401613249565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016117fb9190613362565b60a06040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b815260040161188192919061336b565b604080518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612fe5565b9150506000876001600160a01b0316636c25b346886040518263ffffffff1660e01b81526004016119019190613249565b60206040518083038186803b15801561191957600080fd5b505afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190612d70565b905060006119638261023b85876126a4565b90506b033b2e3c9fd0803ce8000000810494508061198d866b033b2e3c9fd0803ce80000006126a4565b10611998578461199d565b846001015b9998505050505050505050565b6000818585856040516020016119c394939291906134c7565b60408051601f1981840301815291905290506119e6610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611a0c9190612c4e565b60016040518463ffffffff1660e01b8152600401611a2c93929190613492565b600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b50611a719250505061012084016101008501612c4e565b6001600160a01b0316635cffe9de611a8f6080860160608701612c4e565b60008051602061362d8339815191528760800151856040518563ffffffff1660e01b8152600401611ac39493929190613382565b602060405180830381600087803b158015611add57600080fd5b505af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612d2b565b50611b27610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611b4d9190612c4e565b60006040518463ffffffff1660e01b8152600401611b6d93929190613492565b600060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050505050505050565b60008184841115611c355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bfa578181015183820152602001611be2565b50505050905090810190601f168015611c275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600084600001516001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190612c6a565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ce49190613249565b60206040518083038186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d349190612d70565b865160405163095ea7b360e01b81529192506001600160a01b0384169163095ea7b391611d65918590600401613281565b600060405180830381600087803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b505050506000846001600160a01b0316632726b07388604001516040518263ffffffff1660e01b8152600401611dc99190613362565b60206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612c6a565b90506000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190612c6a565b8851604051633b4da69f60e01b81529192506001600160a01b031690633b4da69f90611ec09085908790600401613281565b600060405180830381600087803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b50505050856001600160a01b03166345e6bdcd8960400151611f1c611f178c60000151886126fd565b612780565b611f2d858a888f606001518f6127a7565b6040518463ffffffff1660e01b8152600401611f4b939291906134b1565b600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505060408901516001600160a01b038816915063f9f30db69030611faa8b6b033b2e3c9fd0803ce80000006126a4565b6040518463ffffffff1660e01b8152600401611fc893929190613492565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50506040516328ec8bf160e21b81526001600160a01b038416925063a3b22fc4915061203a90739759a6ac90977b93b58547b4a71c78317f391a2890600401613249565b600060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505060405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a28925063ef693bed91506120a59030908b90600401613281565b600060405180830381600087803b1580156120bf57600080fd5b505af11580156113cb573d6000803e3d6000fd5b600080836001600160a01b0316632726b07384604001516040518263ffffffff1660e01b81526004016121069190613362565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190612c6a565b90506000846001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561219357600080fd5b505afa1580156121a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cb9190612c6a565b90506000816001600160a01b0316632424be5c8660600151856040518363ffffffff1660e01b815260040161220192919061336b565b604080518083038186803b15801561221857600080fd5b505afa15801561222c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122509190612fe5565b509695505050505050565b6000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190612c6a565b90506000866001600160a01b0316632726b073866040518263ffffffff1660e01b81526004016122fe9190613362565b60206040518083038186803b15801561231657600080fd5b505afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190612c6a565b90506000876001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b815260040161237e9190613362565b60206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612d70565b60405163095ea7b360e01b815290915060008051602061362d8339815191529063095ea7b39061241890739759a6ac90977b93b58547b4a71c78317f391a28908990600401613281565b602060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246a9190612d2b565b50604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f906124a49085908990600401613281565b600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b5050505060006124e288866126fd565b9050886001600160a01b03166345e6bdcd886124fd84612780565b60000361258788896001600160a01b0316636c25b3468a6040518263ffffffff1660e01b81526004016125309190613249565b60206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190612d70565b8989612932565b6040518463ffffffff1660e01b81526004016125a5939291906134b1565b600060405180830381600087803b1580156125bf57600080fd5b505af11580156125d3573d6000803e3d6000fd5b50506040516313771f0760e31b81526001600160a01b038c169250639bb8f8389150612607908a9030908690600401613492565b600060405180830381600087803b15801561262157600080fd5b505af1158015612635573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038b16925063ef693bed91506126679030908990600401613281565b600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50505050505050505050505050565b6000826126b357506000610bfa565b828202828482816126c057fe5b0414610bf75760405162461bcd60e51b815260040180806020018281038252602181526020018061364d6021913960400191505060405180910390fd5b6000610bf7836001600160a01b031663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127739190612d70565b8390601203600a0a6126a4565b8060008112156127a25760405162461bcd60e51b8152600401610171906133f6565b919050565b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b81526004016127d69190613362565b602060405180830381600087803b1580156127f057600080fd5b505af1158015612804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128289190612d70565b90506000876001600160a01b0316636c25b346876040518263ffffffff1660e01b81526004016128589190613249565b60206040518083038186803b15801561287057600080fd5b505afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190612d70565b90506128c0846b033b2e3c9fd0803ce80000006126a4565b811015612927576128f2826128e58361023b886b033b2e3c9fd0803ce80000006126a4565b816128ec57fe5b04612780565b925061290a846b033b2e3c9fd0803ce80000006126a4565b61291484846126a4565b1061291f5782612924565b826001015b92505b505095945050505050565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016129619190613362565b60a06040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b81526004016129e792919061336b565b604080518083038186803b1580156129fe57600080fd5b505afa158015612a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a369190612fe5565b915050612a458287816128ec57fe5b925080831115612a6057612a5881612780565b600003612a65565b826000035b979650505050505050565b80356127a281613614565b805180151581146127a257600080fd5b600082601f830112612a9b578081fd5b813567ffffffffffffffff811115612aaf57fe5b612ac2601f8201601f19166020016135a4565b818152846020838601011115612ad6578283fd5b816020850160208301379081016020019190915292915050565b600060e08284031215612b01578081fd5b612b0b60e06135a4565b9050612b1682612a70565b8152612b2460208301612a70565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff811115612b6b57600080fd5b612b7784828501612a8b565b60c08301525092915050565b6000610120808385031215612b96578182fd5b612b9f816135a4565b915050612bab82612a70565b8152612bb960208301612a70565b6020820152612bca60408301612a70565b6040820152612bdb60608301612a70565b6060820152612bec60808301612a70565b6080820152612bfd60a08301612a70565b60a0820152612c0e60c08301612a70565b60c0820152612c1f60e08301612a70565b60e0820152610100612c32818401612a70565b9082015292915050565b805161ffff811681146127a257600080fd5b600060208284031215612c5f578081fd5b8135610bf781613614565b600060208284031215612c7b578081fd5b8151610bf781613614565b60008060008060008060a08789031215612c9e578182fd5b8635612ca981613614565b95506020870135612cb981613614565b94506040870135935060608701359250608087013567ffffffffffffffff80821115612ce3578384fd5b818901915089601f830112612cf6578384fd5b813581811115612d04578485fd5b8a6020828501011115612d15578485fd5b6020830194508093505050509295509295509295565b600060208284031215612d3c578081fd5b610bf782612a7b565b60008060408385031215612d57578182fd5b612d6083612a7b565b9150602083015190509250929050565b600060208284031215612d81578081fd5b5051919050565b60008060008060808587031215612d9d578182fd5b8435612da881613614565b93506020850135612db881613614565b93969395505050506040820135916060013590565b6000806000838503610160811215612de3578182fd5b843567ffffffffffffffff80821115612dfa578384fd5b9086019060e08289031215612e0d578384fd5b90945060208601359080821115612e22578384fd5b50612e2f87828801612af0565b935050610120603f1982011215612e44578182fd5b506040840190509250925092565b600080600080600080600060e0888a031215612e6c578485fd5b8751612e7781613614565b8097505060208801518060020b8114612e8e578586fd5b9550612e9c60408901612c3c565b9450612eaa60608901612c3c565b9350612eb860808901612c3c565b925060a088015160ff81168114612ecd578182fd5b9150612edb60c08901612a7b565b905092959891949750929550565b6000806000806101808587031215612eff578182fd5b84359350602085013567ffffffffffffffff80821115612f1d578384fd5b9086019060e08289031215612f30578384fd5b612f3a60e06135a4565b612f4383612a70565b8152612f5160208401612a70565b6020820152604083013560408201526060830135606082015260808301356080820152612f8060a08401612a70565b60a082015260c083013582811115612f96578586fd5b612fa28a828601612a8b565b60c08301525094506040870135915080821115612fbd578384fd5b50612fca87828801612af0565b925050612fda8660608701612b83565b905092959194509250565b60008060408385031215612ff7578182fd5b505080516020909101519092909150565b60008060006060848603121561301c578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a0868803121561304c578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b818110156130d0576020818501810151868301820152016130b4565b818111156130e15782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160e060c085015261315360e08501826130ab565b949350505050565b803561316681613614565b6001600160a01b03168252602081013561317f81613614565b61318c6020840182613074565b5061319960408201612a70565b6131a66040840182613074565b506131b360608201612a70565b6131c06060840182613074565b506131cd60808201612a70565b6131da6080840182613074565b506131e760a08201612a70565b6131f460a0840182613074565b5061320160c08201612a70565b61320e60c0840182613074565b5061321b60e08201612a70565b61322860e0840182613074565b50610100613237818301612a70565b61324382850182613074565b50505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160a01b03868116825260208201869052604082018590528316606082015260a060808201819052600090612a65908301846130ab565b6001600160a01b039687168152602081019590955260408501939093526060840191909152608083015290911660a082015260c00190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133b5908301846130ab565b9695505050505050565b600060a082526133d260a08301886130ab565b90508560208301528460408301528360608301528260808301529695505050505050565b6020808252600f908201526e696e743235362d6f766572666c6f7760881b604082015260600190565b60208082526025908201527f6d70612d726563656976652d7265717565737465642d616d6f756e742d6d69736040820152640dac2e8c6d60db1b606082015260800190565b60208082526014908201527336b83096bab73a393ab9ba32b216b632b73232b960611b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600061018086835280602084015285356134e081613614565b6001600160a01b0316908301526134f960208601612a70565b6135076101a0840182613074565b5060408501356101c083015260608501356101e0830152608085013561020083015261353560a08601612a70565b613543610220840182613074565b5061355160c08601866135c8565b60e061024085015261356861026085018284613081565b915050828103604084015261357d81866130f6565b91505061358d606083018461315b565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156135c057fe5b604052919050565b6000808335601e198436030181126135de578283fd5b830160208101925035905067ffffffffffffffff8111156135fe57600080fd5b80360383131561360d57600080fd5b9250929050565b6001600160a01b038116811461362957600080fd5b5056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220501289e884483aeb5f7f4c6333cd4fddce7794e653c038f1f5272ad23943e1cc64736f6c63430007060033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063aa27fd441161005b578063aa27fd44146100f3578063ac0397b314610106578063e0bab4c4146100b6578063f85c2ce31461011957610088565b806323e30c8b1461008d5780632ce8b913146100b65780633be1b5fe146100cb57806377925bf1146100de575b600080fd5b6100a061009b366004612c86565b610121565b6040516100ad9190613362565b60405180910390f35b6100be6103e7565b6040516100ad9190613249565b6100a06100d9366004612d88565b6103f9565b6100f16100ec366004612dcd565b6106d9565b005b6100f1610101366004612dcd565b610862565b6100f1610114366004612dcd565b610a8f565b6100be610b85565b60008080808061013386880188612ee9565b93509350935093508061010001516001600160a01b0316336001600160a01b03161461017a5760405162461bcd60e51b815260040161017190613464565b60405180910390fd5b60006101868a8a610b9d565b90507f9c6641b21946115d10f3f55df9bec5752ec06d40dc9250b1cc6560549764600e6102418460a0015160008051602061362d8339815191526001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016101eb9190613249565b60206040518083038186803b15801561020357600080fd5b505afa158015610217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061023b9190612d70565b90610c00565b82604051610250929190613596565b60405180910390a16040516370a0823160e01b815260008051602061362d833981519152906370a0823190610289903090600401613249565b60206040518083038186803b1580156102a157600080fd5b505afa1580156102b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102d99190612d70565b60a084015160808501516102ec91610b9d565b111561030a5760405162461bcd60e51b81526004016101719061341f565b846001141561031f5761031f84848484610c42565b8461033057610330848484846113da565b61010082015160405163095ea7b360e01b81526001600160a01b038d169163095ea7b39161036391908590600401613281565b602060405180830381600087803b15801561037d57600080fd5b505af1158015610391573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103b59190612d2b565b507f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd99c9b505050505050505050505050565b60008051602061362d83398151915281565b600080856001600160a01b03166316f0115b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561043557600080fd5b505afa158015610449573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061046d9190612c6a565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156104a557600080fd5b505afa1580156104b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dd9190612e52565b5050505050506001600160a01b03169050600083601203600a0a9050856001600160a01b031663444b4bf68860008051602061362d8339815191526001600160a01b03168a6001600160a01b0316630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561055a57600080fd5b505afa15801561056e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105929190612c6a565b6001600160a01b0316146105a75760006105a9565b875b60008051602061362d8339815191526001600160a01b03168b6001600160a01b031663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b1580156105fa57600080fd5b505afa15801561060e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106329190612c6a565b6001600160a01b031614610647576000610649565b885b85606080898a02901c670de0b6b3a764000002901c026040518563ffffffff1660e01b815260040161067e949392919061333c565b604080518083038186803b15801561069557600080fd5b505afa1580156106a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106cd9190612d45565b98975050505050505050565b6040805180820190915260158152741bdc195b935d5b1d1a5c1b1e51dd5b9a55985d5b1d605a1b6020820152826107166080840160608501612c4e565b60c0820151516107285760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061079d9190612d70565b60608601526107b3610100850160e08601612c4e565b6001600160a01b0316636090dec58660600151306040518363ffffffff1660e01b81526004016107e492919061336b565b602060405180830381600087803b1580156107fe57600080fd5b505af1158015610812573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108369190612d70565b6040860152610846868686610a8f565b5060408051602081019091526000815260c09091015250505050565b604080518082019091526015815274636c6f736547756e695661756c744578697444616960581b60208201528261089f6080840160608501612c4e565b60c0820151516108b15760c082018390525b84600001516001600160a01b031663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108ee57600080fd5b505afa158015610902573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109269190612d70565b6060860152600061093e610100860160e08701612c4e565b6001600160a01b0316632726b07387604001516040518263ffffffff1660e01b815260040161096d9190613362565b60206040518083038186803b15801561098557600080fd5b505afa158015610999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109bd9190612c6a565b905060006109d2610100870160e08801612c4e565b6001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610a0a57600080fd5b505afa158015610a1e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a429190612c6a565b90506000610a568284858b606001516117cc565b608089018190529050610a6c89898960006119aa565b505050604051806020016040528060008152508260c00181905250505050505050565b604080518082019091526014815273696e6372656173654d756c7469706c6547756e6960601b602082015282610acb6080840160608501612c4e565b60c082015151610add5760c082018390525b60008051602061362d8339815191526323b872dd33610b026080880160608901612c4e565b8860a001516040518463ffffffff1660e01b8152600401610b259392919061325d565b602060405180830381600087803b158015610b3f57600080fd5b505af1158015610b53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b779190612d2b565b5061084686868660016119aa565b739759a6ac90977b93b58547b4a71c78317f391a2881565b600082820183811015610bf7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b6000610bf783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611ba6565b815160808301516040516370a0823160e01b815260009060008051602061362d833981519152906370a0823190610c7d903090600401613249565b60206040518083038186803b158015610c9557600080fd5b505afa158015610ca9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ccd9190612d70565b60a08601516040808a0151905163095ea7b360e01b8152929350909160008051602061362d8339815191529163095ea7b391610d0d918591600401613281565b602060405180830381600087803b158015610d2757600080fd5b505af1158015610d3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5f9190612d2b565b50806001600160a01b031663bc6f02b289602001518a604001518b608001518c60a001518d60c001516040518663ffffffff1660e01b8152600401610da89594939291906132ca565b600060405180830381600087803b158015610dc257600080fd5b505af1158015610dd6573d6000803e3d6000fd5b5050505050600080836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e0a9190613249565b60206040518083038186803b158015610e2257600080fd5b505afa158015610e36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e5a9190612d70565b6040516370a0823160e01b815290915060008051602061362d833981519152906370a0823190610e8e903090600401613249565b60206040518083038186803b158015610ea657600080fd5b505afa158015610eba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ede9190612d70565b602088015160405163095ea7b360e01b81529194509060008051602061362d8339815191529063095ea7b390610f1a9084908890600401613281565b602060405180830381600087803b158015610f3457600080fd5b505af1158015610f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6c9190612d2b565b5060405163095ea7b360e01b81526001600160a01b0386169063095ea7b390610f9b9084908690600401613281565b602060405180830381600087803b158015610fb557600080fd5b505af1158015610fc9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fed9190612d2b565b5060405163fb9f478960e01b81526001600160a01b0382169063fb9f4789906110259089908890879060009081903090600401613304565b606060405180830381600087803b15801561103f57600080fd5b505af1158015611053573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110779190613008565b60608b015160405163095ea7b360e01b81529196506001600160a01b038a16945063095ea7b393506110af9250908690600401613281565b602060405180830381600087803b1580156110c957600080fd5b505af11580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190612d2b565b506040516370a0823160e01b81526111a39089906111949060008051602061362d833981519152906370a082319061113d903090600401613249565b60206040518083038186803b15801561115557600080fd5b505afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d9190612d70565b8990610c00565b8960e001518a60c00151611c3d565b6040516370a0823160e01b81526000906111dd90889060008051602061362d833981519152906370a08231906101eb903090600401613249565b90506000856001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161120d9190613249565b60206040518083038186803b15801561122557600080fd5b505afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d9190612d70565b905089604001517fead01ff65532b6ee1646408ed4a14f45b5ee091a71e9bb1f579c0a44d59230118b60c001518d608001518e606001516000876040516112a89594939291906133bf565b60405180910390a281156113415760208a015160405163a9059cbb60e01b815260008051602061362d8339815191529163a9059cbb916112ed91908690600401613281565b602060405180830381600087803b15801561130757600080fd5b505af115801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612d2b565b505b80156113cd5760208a015160405163a9059cbb60e01b81526001600160a01b0388169163a9059cbb9161137991908590600401613281565b602060405180830381600087803b15801561139357600080fd5b505af11580156113a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113cb9190612d2b565b505b5050505050505050505050565b60a0820151608083015160e08401516000906113f690876120d3565b90506114158560e001518760000151886040015189608001518561225b565b84516040516370a0823160e01b81526000906001600160a01b038316906370a0823190611446903090600401613249565b60206040518083038186803b15801561145e57600080fd5b505afa158015611472573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114969190612d70565b602088015160405163095ea7b360e01b8152919250906001600160a01b0384169063095ea7b3906114cd9084908690600401613281565b602060405180830381600087803b1580156114e757600080fd5b505af11580156114fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151f9190612d2b565b50604051632cfc215960e11b81526001600160a01b038216906359f842b29061155590869086906000908190309060040161329a565b606060405180830381600087803b15801561156f57600080fd5b505af1158015611583573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a79190613008565b50506040516370a0823160e01b81526001600160a01b038716925063095ea7b39150879083906370a08231906115e1903090600401613249565b60206040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116319190612d70565b6040518363ffffffff1660e01b815260040161164e929190613281565b602060405180830381600087803b15801561166857600080fd5b505af115801561167c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a09190612d2b565b50846001600160a01b031663c723c87f8a60200151866001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016116e19190613249565b60206040518083038186803b1580156116f957600080fd5b505afa15801561170d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117319190612d70565b8c608001518d60a001518e60c001516040518663ffffffff1660e01b81526004016117609594939291906132ca565b600060405180830381600087803b15801561177a57600080fd5b505af115801561178e573d6000803e3d6000fd5b50506040516370a0823160e01b8152600092506111dd9150889060008051602061362d833981519152906370a08231906101eb903090600401613249565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016117fb9190613362565b60a06040518083038186803b15801561181357600080fd5b505afa158015611827573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061184b9190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b815260040161188192919061336b565b604080518083038186803b15801561189857600080fd5b505afa1580156118ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d09190612fe5565b9150506000876001600160a01b0316636c25b346886040518263ffffffff1660e01b81526004016119019190613249565b60206040518083038186803b15801561191957600080fd5b505afa15801561192d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119519190612d70565b905060006119638261023b85876126a4565b90506b033b2e3c9fd0803ce8000000810494508061198d866b033b2e3c9fd0803ce80000006126a4565b10611998578461199d565b846001015b9998505050505050505050565b6000818585856040516020016119c394939291906134c7565b60408051601f1981840301815291905290506119e6610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611a0c9190612c4e565b60016040518463ffffffff1660e01b8152600401611a2c93929190613492565b600060405180830381600087803b158015611a4657600080fd5b505af1158015611a5a573d6000803e3d6000fd5b50611a719250505061012084016101008501612c4e565b6001600160a01b0316635cffe9de611a8f6080860160608701612c4e565b60008051602061362d8339815191528760800151856040518563ffffffff1660e01b8152600401611ac39493929190613382565b602060405180830381600087803b158015611add57600080fd5b505af1158015611af1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b159190612d2b565b50611b27610100840160e08501612c4e565b6001600160a01b0316630b63fb628560400151856060016020810190611b4d9190612c4e565b60006040518463ffffffff1660e01b8152600401611b6d93929190613492565b600060405180830381600087803b158015611b8757600080fd5b505af1158015611b9b573d6000803e3d6000fd5b505050505050505050565b60008184841115611c355760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611bfa578181015183820152602001611be2565b50505050905090810190601f168015611c275780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600084600001516001600160a01b0316637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7c57600080fd5b505afa158015611c90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb49190612c6a565b90506000816001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611ce49190613249565b60206040518083038186803b158015611cfc57600080fd5b505afa158015611d10573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d349190612d70565b865160405163095ea7b360e01b81529192506001600160a01b0384169163095ea7b391611d65918590600401613281565b600060405180830381600087803b158015611d7f57600080fd5b505af1158015611d93573d6000803e3d6000fd5b505050506000846001600160a01b0316632726b07388604001516040518263ffffffff1660e01b8152600401611dc99190613362565b60206040518083038186803b158015611de157600080fd5b505afa158015611df5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e199190612c6a565b90506000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015611e5657600080fd5b505afa158015611e6a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e8e9190612c6a565b8851604051633b4da69f60e01b81529192506001600160a01b031690633b4da69f90611ec09085908790600401613281565b600060405180830381600087803b158015611eda57600080fd5b505af1158015611eee573d6000803e3d6000fd5b50505050856001600160a01b03166345e6bdcd8960400151611f1c611f178c60000151886126fd565b612780565b611f2d858a888f606001518f6127a7565b6040518463ffffffff1660e01b8152600401611f4b939291906134b1565b600060405180830381600087803b158015611f6557600080fd5b505af1158015611f79573d6000803e3d6000fd5b50505060408901516001600160a01b038816915063f9f30db69030611faa8b6b033b2e3c9fd0803ce80000006126a4565b6040518463ffffffff1660e01b8152600401611fc893929190613492565b600060405180830381600087803b158015611fe257600080fd5b505af1158015611ff6573d6000803e3d6000fd5b50506040516328ec8bf160e21b81526001600160a01b038416925063a3b22fc4915061203a90739759a6ac90977b93b58547b4a71c78317f391a2890600401613249565b600060405180830381600087803b15801561205457600080fd5b505af1158015612068573d6000803e3d6000fd5b505060405163ef693bed60e01b8152739759a6ac90977b93b58547b4a71c78317f391a28925063ef693bed91506120a59030908b90600401613281565b600060405180830381600087803b1580156120bf57600080fd5b505af11580156113cb573d6000803e3d6000fd5b600080836001600160a01b0316632726b07384604001516040518263ffffffff1660e01b81526004016121069190613362565b60206040518083038186803b15801561211e57600080fd5b505afa158015612132573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121569190612c6a565b90506000846001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561219357600080fd5b505afa1580156121a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121cb9190612c6a565b90506000816001600160a01b0316632424be5c8660600151856040518363ffffffff1660e01b815260040161220192919061336b565b604080518083038186803b15801561221857600080fd5b505afa15801561222c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122509190612fe5565b509695505050505050565b6000856001600160a01b03166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561229657600080fd5b505afa1580156122aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ce9190612c6a565b90506000866001600160a01b0316632726b073866040518263ffffffff1660e01b81526004016122fe9190613362565b60206040518083038186803b15801561231657600080fd5b505afa15801561232a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061234e9190612c6a565b90506000876001600160a01b0316632c2cb9fd876040518263ffffffff1660e01b815260040161237e9190613362565b60206040518083038186803b15801561239657600080fd5b505afa1580156123aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ce9190612d70565b60405163095ea7b360e01b815290915060008051602061362d8339815191529063095ea7b39061241890739759a6ac90977b93b58547b4a71c78317f391a28908990600401613281565b602060405180830381600087803b15801561243257600080fd5b505af1158015612446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061246a9190612d2b565b50604051633b4da69f60e01b8152739759a6ac90977b93b58547b4a71c78317f391a2890633b4da69f906124a49085908990600401613281565b600060405180830381600087803b1580156124be57600080fd5b505af11580156124d2573d6000803e3d6000fd5b5050505060006124e288866126fd565b9050886001600160a01b03166345e6bdcd886124fd84612780565b60000361258788896001600160a01b0316636c25b3468a6040518263ffffffff1660e01b81526004016125309190613249565b60206040518083038186803b15801561254857600080fd5b505afa15801561255c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125809190612d70565b8989612932565b6040518463ffffffff1660e01b81526004016125a5939291906134b1565b600060405180830381600087803b1580156125bf57600080fd5b505af11580156125d3573d6000803e3d6000fd5b50506040516313771f0760e31b81526001600160a01b038c169250639bb8f8389150612607908a9030908690600401613492565b600060405180830381600087803b15801561262157600080fd5b505af1158015612635573d6000803e3d6000fd5b505060405163ef693bed60e01b81526001600160a01b038b16925063ef693bed91506126679030908990600401613281565b600060405180830381600087803b15801561268157600080fd5b505af1158015612695573d6000803e3d6000fd5b50505050505050505050505050565b6000826126b357506000610bfa565b828202828482816126c057fe5b0414610bf75760405162461bcd60e51b815260040180806020018281038252602181526020018061364d6021913960400191505060405180910390fd5b6000610bf7836001600160a01b031663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561273b57600080fd5b505afa15801561274f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127739190612d70565b8390601203600a0a6126a4565b8060008112156127a25760405162461bcd60e51b8152600401610171906133f6565b919050565b600080856001600160a01b03166344e2a5a8856040518263ffffffff1660e01b81526004016127d69190613362565b602060405180830381600087803b1580156127f057600080fd5b505af1158015612804573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128289190612d70565b90506000876001600160a01b0316636c25b346876040518263ffffffff1660e01b81526004016128589190613249565b60206040518083038186803b15801561287057600080fd5b505afa158015612884573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a89190612d70565b90506128c0846b033b2e3c9fd0803ce80000006126a4565b811015612927576128f2826128e58361023b886b033b2e3c9fd0803ce80000006126a4565b816128ec57fe5b04612780565b925061290a846b033b2e3c9fd0803ce80000006126a4565b61291484846126a4565b1061291f5782612924565b826001015b92505b505095945050505050565b600080856001600160a01b031663d9638d36846040518263ffffffff1660e01b81526004016129619190613362565b60a06040518083038186803b15801561297957600080fd5b505afa15801561298d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129b19190613035565b5050509150506000866001600160a01b0316632424be5c85876040518363ffffffff1660e01b81526004016129e792919061336b565b604080518083038186803b1580156129fe57600080fd5b505afa158015612a12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a369190612fe5565b915050612a458287816128ec57fe5b925080831115612a6057612a5881612780565b600003612a65565b826000035b979650505050505050565b80356127a281613614565b805180151581146127a257600080fd5b600082601f830112612a9b578081fd5b813567ffffffffffffffff811115612aaf57fe5b612ac2601f8201601f19166020016135a4565b818152846020838601011115612ad6578283fd5b816020850160208301379081016020019190915292915050565b600060e08284031215612b01578081fd5b612b0b60e06135a4565b9050612b1682612a70565b8152612b2460208301612a70565b602082015260408201356040820152606082013560608201526080820135608082015260a082013560a082015260c082013567ffffffffffffffff811115612b6b57600080fd5b612b7784828501612a8b565b60c08301525092915050565b6000610120808385031215612b96578182fd5b612b9f816135a4565b915050612bab82612a70565b8152612bb960208301612a70565b6020820152612bca60408301612a70565b6040820152612bdb60608301612a70565b6060820152612bec60808301612a70565b6080820152612bfd60a08301612a70565b60a0820152612c0e60c08301612a70565b60c0820152612c1f60e08301612a70565b60e0820152610100612c32818401612a70565b9082015292915050565b805161ffff811681146127a257600080fd5b600060208284031215612c5f578081fd5b8135610bf781613614565b600060208284031215612c7b578081fd5b8151610bf781613614565b60008060008060008060a08789031215612c9e578182fd5b8635612ca981613614565b95506020870135612cb981613614565b94506040870135935060608701359250608087013567ffffffffffffffff80821115612ce3578384fd5b818901915089601f830112612cf6578384fd5b813581811115612d04578485fd5b8a6020828501011115612d15578485fd5b6020830194508093505050509295509295509295565b600060208284031215612d3c578081fd5b610bf782612a7b565b60008060408385031215612d57578182fd5b612d6083612a7b565b9150602083015190509250929050565b600060208284031215612d81578081fd5b5051919050565b60008060008060808587031215612d9d578182fd5b8435612da881613614565b93506020850135612db881613614565b93969395505050506040820135916060013590565b6000806000838503610160811215612de3578182fd5b843567ffffffffffffffff80821115612dfa578384fd5b9086019060e08289031215612e0d578384fd5b90945060208601359080821115612e22578384fd5b50612e2f87828801612af0565b935050610120603f1982011215612e44578182fd5b506040840190509250925092565b600080600080600080600060e0888a031215612e6c578485fd5b8751612e7781613614565b8097505060208801518060020b8114612e8e578586fd5b9550612e9c60408901612c3c565b9450612eaa60608901612c3c565b9350612eb860808901612c3c565b925060a088015160ff81168114612ecd578182fd5b9150612edb60c08901612a7b565b905092959891949750929550565b6000806000806101808587031215612eff578182fd5b84359350602085013567ffffffffffffffff80821115612f1d578384fd5b9086019060e08289031215612f30578384fd5b612f3a60e06135a4565b612f4383612a70565b8152612f5160208401612a70565b6020820152604083013560408201526060830135606082015260808301356080820152612f8060a08401612a70565b60a082015260c083013582811115612f96578586fd5b612fa28a828601612a8b565b60c08301525094506040870135915080821115612fbd578384fd5b50612fca87828801612af0565b925050612fda8660608701612b83565b905092959194509250565b60008060408385031215612ff7578182fd5b505080516020909101519092909150565b60008060006060848603121561301c578081fd5b8351925060208401519150604084015190509250925092565b600080600080600060a0868803121561304c578283fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6001600160a01b03169052565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b60008151808452815b818110156130d0576020818501810151868301820152016130b4565b818111156130e15782602083870101525b50601f01601f19169290920160200192915050565b600060018060a01b038083511684528060208401511660208501525060408201516040840152606082015160608401526080820151608084015260a082015160a084015260c082015160e060c085015261315360e08501826130ab565b949350505050565b803561316681613614565b6001600160a01b03168252602081013561317f81613614565b61318c6020840182613074565b5061319960408201612a70565b6131a66040840182613074565b506131b360608201612a70565b6131c06060840182613074565b506131cd60808201612a70565b6131da6080840182613074565b506131e760a08201612a70565b6131f460a0840182613074565b5061320160c08201612a70565b61320e60c0840182613074565b5061321b60e08201612a70565b61322860e0840182613074565b50610100613237818301612a70565b61324382850182613074565b50505050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039586168152602081019490945260408401929092526060830152909116608082015260a00190565b6001600160a01b03868116825260208201869052604082018590528316606082015260a060808201819052600090612a65908301846130ab565b6001600160a01b039687168152602081019590955260408501939093526060840191909152608083015290911660a082015260c00190565b6001600160a01b0394909416845260208401929092526040830152606082015260800190565b90815260200190565b9182526001600160a01b0316602082015260400190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133b5908301846130ab565b9695505050505050565b600060a082526133d260a08301886130ab565b90508560208301528460408301528360608301528260808301529695505050505050565b6020808252600f908201526e696e743235362d6f766572666c6f7760881b604082015260600190565b60208082526025908201527f6d70612d726563656976652d7265717565737465642d616d6f756e742d6d69736040820152640dac2e8c6d60db1b606082015260800190565b60208082526014908201527336b83096bab73a393ab9ba32b216b632b73232b960611b604082015260600190565b9283526001600160a01b03919091166020830152604082015260600190565b9283526020830191909152604082015260600190565b600061018086835280602084015285356134e081613614565b6001600160a01b0316908301526134f960208601612a70565b6135076101a0840182613074565b5060408501356101c083015260608501356101e0830152608085013561020083015261353560a08601612a70565b613543610220840182613074565b5061355160c08601866135c8565b60e061024085015261356861026085018284613081565b915050828103604084015261357d81866130f6565b91505061358d606083018461315b565b95945050505050565b918252602082015260400190565b60405181810167ffffffffffffffff811182821017156135c057fe5b604052919050565b6000808335601e198436030181126135de578283fd5b830160208101925035905067ffffffffffffffff8111156135fe57600080fd5b80360383131561360d57600080fd5b9250929050565b6001600160a01b038116811461362957600080fd5b5056fe0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220501289e884483aeb5f7f4c6333cd4fddce7794e653c038f1f5272ad23943e1cc64736f6c63430007060033

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

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.