ETH Price: $2,323.45 (-0.99%)

Token

ERC20 ***
 

Overview

Max Total Supply

1.99991452 ERC20 ***

Holders

4

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
Dharma: Deployer
Balance
0.99999861 ERC20 ***

Value
$0.00
0x7e4a8391c728fed9069b2962699ab416628b19fa
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DharmaDaiPrototype0

Compiler Version
v0.5.11+commit.c082d0b4

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-01-13
*/

pragma solidity 0.5.11; // optimization runs: 200, evm version: petersburg


interface DTokenInterface {
  event Mint(address minter, uint256 mintAmount, uint256 mintTokens);
  event Redeem(address redeemer, uint256 redeemAmount, uint256 redeemTokens);

  function mint(uint256 underlyingToSupply) external returns (uint256 dTokensMinted);

  function redeem(uint256 dTokenToBurn) external returns (uint256 underlyingReceived);

  function redeemUnderlying(uint256 underelyingToReceive) external returns (uint256 dTokensBurned);

  function pullSurplus() external returns (uint256 cTokenSurplus);

  function accrueInterest() external;

  function balanceOfUnderlying(address account) external returns (uint256 underlyingBalance);

  function getSurplus() external returns (uint256 cDaiSurplus);

  function exchangeRateCurrent() external returns (uint256 dTokenExchangeRate);

  function supplyRatePerBlock() external view returns (uint256 dTokenInterestRate);

  function getSpreadPerBlock() external view returns (uint256 rateSpread);

  function getVersion() external pure returns (uint256 version);
}


interface CTokenInterface {
  function mint(uint256 mintAmount) external returns (uint256 err);

  function redeem(uint256 redeemAmount) external returns (uint256 err);

  function redeemUnderlying(uint256 redeemAmount) external returns (uint256 err);

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

  function balanceOfUnderlying(address account) external returns (uint256 balance);

  function exchangeRateCurrent() external returns (uint256 exchangeRate);

  function transfer(address recipient, uint256 value) external returns (bool);

  function supplyRatePerBlock() external view returns (uint256 rate);
}


interface ERC20Interface {
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
}


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) {
    require(b <= a, "SafeMath: subtraction overflow");
    uint256 c = a - b;

    return c;
  }

  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    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) {
    require(b > 0, "SafeMath: division by zero");
    uint256 c = a / b;

    return c;
  }

  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0, "SafeMath: modulo by zero");
    return a % b;
  }
}


/**
 * @title DharmaDaiPrototype0
 * @author 0age (dToken mechanics derived from Compound cTokens, ERC20 methods
 * derived from Open Zeppelin's ERC20 contract)
 * @notice Initial prototype for a cDai wrapper token. This version is not
 * upgradeable, and serves as an initial test of the eventual dDai mechanics.
 * The dDai exchange rate will grow at an approximate APR of 5% or at the cDai
 * exchange rate, whichever is greater.
 */
contract DharmaDaiPrototype0 is ERC20Interface, DTokenInterface {
  using SafeMath for uint256;

  uint256 internal constant _DHARMA_DAI_VERSION = 0;

  // Note: this is a constant for the proof-of-concept but will be configurable.
  // 5% APR interest assuming 15 second block time & 2,102,400 blocks per year
  uint256 internal constant _RATE_PER_BLOCK = 1000000023782344094;

  string internal constant _NAME = "Dharma Dai (Prototype 0)";
  string internal constant _SYMBOL = "dDai-p0";
  uint8 internal constant _DECIMALS = 8; // to match cDai

  uint256 internal constant _SCALING_FACTOR = 1e18;
  uint256 internal constant _HALF_OF_SCALING_FACTOR = 5e17;
  uint256 internal constant _COMPOUND_SUCCESS = 0;

  CTokenInterface internal constant _CDAI = CTokenInterface(
    0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643 // mainnet
  );

  ERC20Interface internal constant _DAI = ERC20Interface(
    0x6B175474E89094C44Da98b954EedeAC495271d0F // mainnet
  );

  // Note: this is just an EOA for the initial prototype.
  address internal constant _VAULT = 0x7e4A8391C728fEd9069B2962699AB416628B19Fa;

  mapping (address => uint256) private _balances;

  mapping (address => mapping (address => uint256)) private _allowances;

  uint256 private _totalSupply;

  // TODO: pack these more tightly in storage
  uint256 private _blockLastUpdated;
  uint256 private _dDaiExchangeRate;
  uint256 private _cDaiExchangeRate;

  constructor() public {
    // Approve cDai to transfer Dai on behalf of this contract in order to mint.
    require(_DAI.approve(address(_CDAI), uint256(-1)));

    _blockLastUpdated = block.number;
    _dDaiExchangeRate = 1e28; // 1 Dai == 1 dDai to start
    _cDaiExchangeRate = _CDAI.exchangeRateCurrent();
  }

  /**
   * @notice Transfer `amount` Dai from `msg.sender` to this contract, use them
   * to mint cDAI, and mint dTokens with `msg.sender` as the beneficiary. Ensure
   * that this contract has been approved to transfer the Dai on behalf of the
   * caller.
   * @param daiToSupply uint256 The amount of dai to provide as part of minting.
   * @return The amount of dDai received in return for the supplied Dai.
   */
  function mint(
    uint256 daiToSupply
  ) external accrues returns (uint256 dDaiMinted) {
    // Determine the dDai to mint using the exchange rate
    dDaiMinted = daiToSupply.mul(_SCALING_FACTOR).div(_dDaiExchangeRate);

    // Pull in Dai (requires that this contract has sufficient allowance)
    require(
      _DAI.transferFrom(msg.sender, address(this), daiToSupply),
      "Dai transfer failed."
    );

    // Use the Dai to mint cDai (TODO: include error code in revert reason)
    require(_CDAI.mint(daiToSupply) == _COMPOUND_SUCCESS, "cDai mint failed.");

    // Mint dDai to the caller
    _mint(msg.sender, daiToSupply, dDaiMinted);
  }

  /**
   * @notice Redeem `dDaiToBurn` dDai from `msg.sender`, use the corresponding
   * cDai to redeem Dai, and transfer the Dai to `msg.sender`.
   * @param dDaiToBurn uint256 The amount of dDai to provide for Dai.
   * @return The amount of dai received in return for the provided cDai.
   */
  function redeem(
    uint256 dDaiToBurn
  ) external accrues returns (uint256 daiReceived) {
    // Determine the underlying Dai value of the dDai to be burned
    daiReceived = dDaiToBurn.mul(_dDaiExchangeRate) / _SCALING_FACTOR;

    // Burn the dDai
    _burn(msg.sender, daiReceived, dDaiToBurn);

    // Use the cDai to redeem Dai  (TODO: include error code in revert reason)
    require(
      _CDAI.redeemUnderlying(daiReceived) == _COMPOUND_SUCCESS,
      "cDai redeem failed."
    );

    // Send the Dai to the redeemer
    require(_DAI.transfer(msg.sender, daiReceived), "Dai transfer failed.");
  }

  /**
   * @notice Redeem the dDai equivalent value of Dai amount `daiToReceive` from
   * `msg.sender`, use the corresponding cDai to redeem Dai, and transfer the
   * Dai to `msg.sender`.
   * @param daiToReceive uint256 The amount, denominated in Dai, of the cDai to
   * provide for Dai.
   * @return The amount of Dai received in return for the provided cDai.
   */
  function redeemUnderlying(
    uint256 daiToReceive
  ) external accrues returns (uint256 dDaiBurned) {
    // Determine the dDai to redeem using the exchange rate
    dDaiBurned = daiToReceive.mul(_SCALING_FACTOR).div(_dDaiExchangeRate);

    // Burn the dDai
    _burn(msg.sender, daiToReceive, dDaiBurned);

    // Use the cDai to redeem Dai  (TODO: include error code in revert reason)
    require(
      _CDAI.redeemUnderlying(daiToReceive) == _COMPOUND_SUCCESS,
      "cDai redeem failed."
    );

    // Send the Dai to the redeemer
    require(_DAI.transfer(msg.sender, daiToReceive), "Dai transfer failed.");
  }

  /**
   * @notice Transfer cDai in excess of the total dDai balance to a dedicated
   * "vault" account.
   * @return The amount of cDai transferred to the vault account.
   */
  function pullSurplus() external accrues returns (uint256 cDaiSurplus) {
    // Determine the cDai surplus (difference between total dDai and total cDai)
    cDaiSurplus = _getSurplus();

    // Send the cDai surplus to the vault
    require(_CDAI.transfer(_VAULT, cDaiSurplus), "cDai transfer failed.");
  }

  /**
   * @notice Manually advance the dDai exchange rate and update the cDai
   * exchange rate to that of the current block.
   */
  function accrueInterest() external accrues {
    // The `accrues()` modifier contains all function logic.
  }

  /**
   * @notice Transfer `amount` tokens from `msg.sender` to `recipient`.
   * @param recipient address The account to transfer tokens to.
   * @param amount uint256 The amount of tokens to transfer.
   * @return A boolean indicating whether the transfer was successful.
   */
  function transfer(address recipient, uint256 amount) external returns (bool) {
    _transfer(msg.sender, recipient, amount);
    return true;
  }

  /**
   * @notice Approve `spender` to transfer up to `value` tokens on behalf of
   * `msg.sender`.
   * @param spender address The account to grant the allowance.
   * @param value uint256 The size of the allowance to grant.
   * @return A boolean indicating whether the approval was successful.
   */
  function approve(address spender, uint256 value) external returns (bool) {
    _approve(msg.sender, spender, value);
    return true;
  }

  /**
   * @notice Transfer `amount` tokens from `sender` to `recipient` as long as
   * `msg.sender` has sufficient allowance.
   * @param sender address The account to transfer tokens from.
   * @param recipient address The account to transfer tokens to.
   * @param amount uint256 The amount of tokens to transfer.
   * @return A boolean indicating whether the transfer was successful.
   */
  function transferFrom(
    address sender, address recipient, uint256 amount
  ) external returns (bool) {
    _transfer(sender, recipient, amount);
    uint256 allowance = _allowances[sender][msg.sender];
    if (allowance != uint256(-1)) {
      _approve(sender, msg.sender, allowance.sub(amount));
    }
    return true;
  }

  /**
   * @notice Increase the current allowance of `spender` by `value` tokens.
   * @param spender address The account to grant the additional allowance.
   * @param addedValue uint256 The amount to increase the allowance by.
   * @return A boolean indicating whether the modification was successful.
   */
  function increaseAllowance(
    address spender, uint256 addedValue
  ) external returns (bool) {
    _approve(
      msg.sender, spender, _allowances[msg.sender][spender].add(addedValue)
    );
    return true;
  }

  /**
   * @notice Decrease the current allowance of `spender` by `value` tokens.
   * @param spender address The account to decrease the allowance for.
   * @param subtractedValue uint256 The amount to subtract from the allowance.
   * @return A boolean indicating whether the modification was successful.
   */
  function decreaseAllowance(
    address spender, uint256 subtractedValue
  ) external returns (bool) {
    _approve(
      msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)
    );
    return true;
  }

  /**
   * @notice View function to get the dDai balance of an account, denominated in
   * its Dai equivalent value.
   * @param account address The account to check the balance for.
   * @return The total Dai-equivalent cDai balance.
   */
  function balanceOfUnderlying(
    address account
  ) external returns (uint256 daiBalance) {
    // Get most recent dDai exchange rate by determining accrued interest
    (uint256 dDaiExchangeRate,,) = _getAccruedInterest();

    // Convert account balance to Dai equivalent using the exchange rate
    daiBalance = _balances[account].mul(dDaiExchangeRate) / _SCALING_FACTOR;
  }

  /**
   * @notice View function to get the total surplus, or cDai balance that
   * exceeds the total dDai balance.
   * @return The total surplus.
   */
  function getSurplus() external accrues returns (uint256 cDaiSurplus) {
    // Determine the cDai surplus (difference between total dDai and total cDai)
    cDaiSurplus = _getSurplus();
  }

  /**
   * @notice View function to get the current dDai exchange rate (multiplied by
   * 10^18).
   * @return The current exchange rate.
   */
  function exchangeRateCurrent() external returns (uint256 dDaiExchangeRate) {
    // Get most recent dDai exchange rate by determining accrued interest
    (dDaiExchangeRate,,) = _getAccruedInterest();
  }

  /**
   * @notice View function to get the current dDai interest earned per block
   * (multiplied by 10^18).
   * @return The current interest rate.
   */
  function supplyRatePerBlock() external view returns (uint256 dDaiInterestRate) {
    (dDaiInterestRate,) = _getRatePerBlock();
  }

  /**
   * @notice View function to get the current cDai interest spread over dDai per
   * block (multiplied by 10^18).
   * @return The current interest rate spread.
   */
  function getSpreadPerBlock() external view returns (uint256 rateSpread) {
    (uint256 dDaiInterestRate, uint256 cDaiInterestRate) = _getRatePerBlock();
    rateSpread = cDaiInterestRate - dDaiInterestRate;
  }

  /**
   * @notice View function to get the total dDai supply.
   * @return The total supply.
   */
  function totalSupply() external view returns (uint256) {
    return _totalSupply;
  }

  /**
   * @notice View function to get the total dDai balance of an account.
   * @param account address The account to check the dDai balance for.
   * @return The balance of the given account.
   */
  function balanceOf(address account) external view returns (uint256 dDai) {
    dDai = _balances[account];
  }

  /**
   * @notice View function to get the total allowance that `spender` has to
   * transfer funds from the `owner` account using `transferFrom`.
   * @param owner address The account that is granting the allowance.
   * @param spender address The account that has been granted the allowance.
   * @return The allowance of the given spender for the given owner.
   */
  function allowance(address owner, address spender) external view returns (uint256) {
    return _allowances[owner][spender];
  }

  /**
   * @notice Pure function to get the name of the token.
   * @return The name of the token.
   */
  function name() external pure returns (string memory) {
    return _NAME;
  }

  /**
   * @notice Pure function to get the symbol of the token.
   * @return The symbol of the token.
   */
  function symbol() external pure returns (string memory) {
    return _SYMBOL;
  }

  /**
   * @notice Pure function to get the number of decimals of the token.
   * @return The number of decimals of the token.
   */
  function decimals() external pure returns (uint8) {
    return _DECIMALS;
  }

  /**
   * @notice Pure function for getting the current Dharma Dai version.
   * @return The current Dharma Dai version.
   */
  function getVersion() external pure returns (uint256 version) {
    version = _DHARMA_DAI_VERSION;
  }

  /**
   * @notice Internal function to mint `amount` tokens by exchanging `exchanged`
   * tokens to `account` and emit corresponding `Mint` & `Transfer` events.
   * @param account address The account to mint tokens to.
   * @param exchanged uint256 The amount of underlying tokens used to mint.
   * @param amount uint256 The amount of tokens to mint.
   */
  function _mint(address account, uint256 exchanged, uint256 amount) internal {
    _totalSupply = _totalSupply.add(amount);
    _balances[account] = _balances[account].add(amount);

    emit Mint(account, exchanged, amount);
    emit Transfer(address(0), account, amount);
  }

  /**
   * @notice Internal function to burn `amount` tokens by exchanging `exchanged`
   * tokens from `account` and emit corresponding `Redeeem` & `Transfer` events.
   * @param account address The account to burn tokens from.
   * @param exchanged uint256 The amount of underlying tokens given for burning.
   * @param amount uint256 The amount of tokens to burn.
   */
  function _burn(address account, uint256 exchanged, uint256 amount) internal {
    uint256 balancePriorToBurn = _balances[account];
    require(
      balancePriorToBurn >= amount, "Supplied amount exceeds account balance."
    );

    _totalSupply = _totalSupply.sub(amount);
    _balances[account] = balancePriorToBurn - amount; // overflow checked above

    emit Transfer(account, address(0), amount);
    emit Redeem(account, exchanged, amount);
  }

  /**
   * @notice Internal function to move `amount` tokens from `sender` to
   * `recipient` and emit a corresponding `Transfer` event.
   * @param sender address The account to transfer tokens from.
   * @param recipient address The account to transfer tokens to.
   * @param amount uint256 The amount of tokens to transfer.
   */
  function _transfer(address sender, address recipient, uint256 amount) internal {
    require(sender != address(0), "ERC20: transfer from the zero address");
    require(recipient != address(0), "ERC20: transfer to the zero address");

    _balances[sender] = _balances[sender].sub(amount);
    _balances[recipient] = _balances[recipient].add(amount);
    emit Transfer(sender, recipient, amount);
  }

  /**
   * @notice Internal function to set the allowance for `spender` to transfer up
   * to `value` tokens on behalf of `owner`.
   * @param owner address The account that has granted the allowance.
   * @param spender address The account to grant the allowance.
   * @param value uint256 The size of the allowance to grant.
   */
  function _approve(address owner, address spender, uint256 value) internal {
    require(owner != address(0), "ERC20: approve from the zero address");
    require(spender != address(0), "ERC20: approve to the zero address");

    _allowances[owner][spender] = value;
    emit Approval(owner, spender, value);
  }

  /**
   * @notice Internal, view-esque function to get the latest dDai and cDai
   * exchange rates for Dai and update the record of each in the event that they
   * have not already been updated in the given block.
   * @return The dDai and cDai exchange rate, as well as a boolean indicating if
   * interest accrual has been processed already or needs to be calculated and
   * placed in storage.
   */
  function _getAccruedInterest() internal /* view */ returns (
    uint256 dDaiExchangeRate, uint256 cDaiExchangeRate, bool fullyAccrued
  ) {
    // Get the number of blocks since the last time interest was accrued
    uint256 blocksToAccrueInterest = block.number - _blockLastUpdated;
    fullyAccrued = (blocksToAccrueInterest == 0);

    // Skip calculation and read from storage if interest was accrued this block
    if (fullyAccrued) {
      dDaiExchangeRate = _dDaiExchangeRate;
      cDaiExchangeRate = _cDaiExchangeRate;
    } else {
      // Calculate the accrued interest over the period
      uint256 defaultInterest = _pow(_RATE_PER_BLOCK, blocksToAccrueInterest);

      // Retrieve the latest exchange rate for cDai
      cDaiExchangeRate = _CDAI.exchangeRateCurrent();

      // Calculate the accrued interest for Compound over the period
      uint256 cDaiInterest = (
        cDaiExchangeRate.mul(_SCALING_FACTOR).div(_cDaiExchangeRate)
      );

      // Take the lesser of the two and use it to adjust the dDai exchange rate
      dDaiExchangeRate = _dDaiExchangeRate.mul(
        defaultInterest > cDaiInterest ? cDaiInterest : defaultInterest
      ) / _SCALING_FACTOR;
    }
  }

  /**
   * @notice Internal, view-esque function to get the total surplus, or cDai
   * balance that exceeds the total dDai balance.
   * @return The total surplus.
   */
  function _getSurplus() internal /* view */ returns (uint256 cDaiSurplus) {
    // Determine the total value of all issued dDai in Dai, rounded up
    uint256 dDaiUnderlying = (
      _totalSupply.mul(_dDaiExchangeRate) / _SCALING_FACTOR
    ).add(1);

    // Compare to total underlying Dai value of all cDai held by this contract
    uint256 daiSurplus = (
      _CDAI.balanceOfUnderlying(address(this)).sub(dDaiUnderlying)
    );

    // Determine the cDai equivalent of this surplus amount
    cDaiSurplus = daiSurplus.mul(_SCALING_FACTOR).div(_cDaiExchangeRate);
  }

  /**
   * @notice View function to get the current dDai and cDai interest supply rate
   * per block (multiplied by 10^18).
   * @return The current dDai and cDai interest rates.
   */
  function _getRatePerBlock() internal view returns (
    uint256 dDaiSupplyRate, uint256 cDaiSupplyRate
  ) {
    uint256 defaultSupplyRate = _RATE_PER_BLOCK.sub(_SCALING_FACTOR);
    cDaiSupplyRate = _CDAI.supplyRatePerBlock(); // NOTE: accrue on Compound first?
    dDaiSupplyRate = (
      defaultSupplyRate < cDaiSupplyRate ? defaultSupplyRate : cDaiSupplyRate
    );
  }

  /**
   * @notice Internal function to take `floatIn` (i.e. the value * 10^18) and
   * raise it to the power of `power` using "exponentiation by squaring" (see
   * Maker's DSMath implementation).
   * @param floatIn uint256 The value.
   * @param power address The power to raise the value by.
   * @return The specified value raised to the specified power.
   */
  function _pow(uint256 floatIn, uint256 power) internal pure returns (uint256 floatOut) {
    floatOut = power % 2 != 0 ? floatIn : _SCALING_FACTOR;

    for (power /= 2; power != 0; power /= 2) {
      floatIn = (floatIn.mul(floatIn)).add(_HALF_OF_SCALING_FACTOR) / _SCALING_FACTOR;

      if (power % 2 != 0) {
        floatOut = (floatIn.mul(floatOut)).add(_HALF_OF_SCALING_FACTOR) / _SCALING_FACTOR;
      }
    }
  }

  /**
   * @notice Modifier to determine the latest dDai and cDai exchange rates, and
   * to update the respective storage values if they have not already been
   * updated at some point in the current block, before proceeding to execution
   * of the rest of the decorated function.
   */
  modifier accrues() {
    (
      uint256 dDaiExchangeRate, uint256 cDaiExchangeRate, bool fullyAccrued
    ) = _getAccruedInterest();

    if (!fullyAccrued) {
      // Update storage with dDai + cDai exchange rates as of the current block
      _blockLastUpdated = block.number;
      _dDaiExchangeRate = dDaiExchangeRate;
      _cDaiExchangeRate = cDaiExchangeRate;
    }

    _;
  }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getVersion","outputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pullSurplus","outputs":[{"internalType":"uint256","name":"cDaiSurplus","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getSurplus","outputs":[{"internalType":"uint256","name":"cDaiSurplus","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOfUnderlying","outputs":[{"internalType":"uint256","name":"daiBalance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSpreadPerBlock","outputs":[{"internalType":"uint256","name":"rateSpread","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"dDai","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiToReceive","type":"uint256"}],"name":"redeemUnderlying","outputs":[{"internalType":"uint256","name":"dDaiBurned","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"daiToSupply","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"dDaiMinted","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"accrueInterest","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"supplyRatePerBlock","outputs":[{"internalType":"uint256","name":"dDaiInterestRate","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"exchangeRateCurrent","outputs":[{"internalType":"uint256","name":"dDaiExchangeRate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"dDaiToBurn","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"daiReceived","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"mintAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintTokens","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"redeemer","type":"address"},{"indexed":false,"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"redeemTokens","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

608060405234801561001057600080fd5b50604080517f095ea7b3000000000000000000000000000000000000000000000000000000008152735d3a536e4d6dbd6114cc1ead35777bab948e3643600482015260001960248201529051736b175474e89094c44da98b954eedeac495271d0f9163095ea7b39160448083019260209291908290030181600087803b15801561009957600080fd5b505af11580156100ad573d6000803e3d6000fd5b505050506040513d60208110156100c357600080fd5b50516100ce57600080fd5b436003556b204fce5e3e250261100000006004908155604080517fbd6d894d0000000000000000000000000000000000000000000000000000000081529051735d3a536e4d6dbd6114cc1ead35777bab948e36439263bd6d894d928082019260209290918290030181600087803b15801561014857600080fd5b505af115801561015c573d6000803e3d6000fd5b505050506040513d602081101561017257600080fd5b505160055561175b806101866000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c61057f565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b7565b610274610616565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061b565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610657565b61020c6106a9565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106be565b61020c6004803603602081101561032057600080fd5b50356106d9565b61014f6108df565b61020c6004803603602081101561034557600080fd5b5035610900565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610af8565b610380610b34565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b60565b61020c610b6d565b61020c610b7d565b61020c600480360360208110156103d457600080fd5b5035610b8f565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d14565b60408051808201909152601881527f446861726d6120446169202850726f746f747970652030290000000000000000602082015290565b600061044d338484610d3f565b5060015b92915050565b600090565b60025490565b600080600080610470610e2b565b9250925092508061048a5743600355600483905560058290555b610492610f42565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa6004820152602481018390529051919550735d3a536e4d6dbd6114cc1ead35777bab948e36439163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b5051610579576040805162461bcd60e51b815260206004820152601560248201527431a230b4903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b50505090565b60008060008061058d610e2b565b925092509250806105a75743600355600483905560058290555b6105af610f42565b935050505090565b60006105c484848461103d565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060b5761060b8533610606848763ffffffff61117f16565b610d3f565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff6111dc16565b600080610662610e2b565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069a908363ffffffff61123d16565b816106a157fe5b049392505050565b60008060006106b6611296565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e7610e2b565b925092509250806107015743600355600483905560058290555b60045461072c9061072087670de0b6b3a764000063ffffffff61123d16565b9063ffffffff61134d16565b93506107393386866113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506040513d60208110156107bf57600080fd5b505114610809576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018790529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b505050506040513d602081101561088d57600080fd5b50516108d7576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b505050919050565b6040805180820190915260078152660644461692d70360cc1b602082015290565b60008060008061090e610e2b565b925092509250806109285743600355600483905560058290555b6004546109479061072087670de0b6b3a764000063ffffffff61123d16565b604080516323b872dd60e01b8152336004820152306024820152604481018890529051919550736b175474e89094c44da98b954eedeac495271d0f916323b872dd916064808201926020929091908290030181600087803b1580156109ab57600080fd5b505af11580156109bf573d6000803e3d6000fd5b505050506040513d60208110156109d557600080fd5b5051610a1f576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b505114610aed576040805162461bcd60e51b815260206004820152601160248201527031a230b49036b4b73a103330b4b632b21760791b604482015290519081900360640190fd5b6108d73386866114c7565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff61117f16565b6000806000610b41610e2b565b92509250925080610b5b5743600355600483905560058290555b505050565b600061044d33848461103d565b6000610b77611296565b50919050565b6000610b87610e2b565b509092915050565b600080600080610b9d610e2b565b92509250925080610bb75743600355600483905560058290555b670de0b6b3a7640000610bd56004548761123d90919063ffffffff16565b81610bdc57fe5b049350610bea3385876113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b505050506040513d6020811015610c7057600080fd5b505114610cba576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018690529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d845760405162461bcd60e51b81526004018080602001828103825260248152602001806116db6024913960400191505060405180910390fd5b6001600160a01b038216610dc95760405162461bcd60e51b81526004018080602001828103825260228152602001806116736022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e4d5760045493506005549250610f3c565b6000610e61670de0b6b930edc59e836115a7565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb257600080fd5b505af1158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051600554909450600090610f039061072087670de0b6b3a764000063ffffffff61123d16565b9050670de0b6b3a7640000610f2f828411610f1e5783610f20565b825b6004549063ffffffff61123d16565b81610f3657fe5b04955050505b50909192565b600080610f7e6001670de0b6b3a7640000610f6a60045460025461123d90919063ffffffff16565b81610f7157fe5b049063ffffffff6111dc16565b60408051633af9e66960e01b81523060048201529051919250600091611014918491735d3a536e4d6dbd6114cc1ead35777bab948e364391633af9e66991602480830192602092919082900301818987803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b50519063ffffffff61117f16565b6005549091506110369061072083670de0b6b3a764000063ffffffff61123d16565b9250505090565b6001600160a01b0383166110825760405162461bcd60e51b81526004018080602001828103825260258152602001806116b66025913960400191505060405180910390fd5b6001600160a01b0382166110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806116506023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f0908263ffffffff61117f16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611125908263ffffffff6111dc16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611236576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261124c57506000610451565b8282028284828161125957fe5b04146112365760405162461bcd60e51b81526004018080602001828103825260218152602001806116956021913960400191505060405180910390fd5b600080806112ba670de0b6b930edc59e670de0b6b3a764000063ffffffff61117f16565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b505191508181106113445781611346565b805b9250509091565b60008082116113a3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113ae57fe5b04949350505050565b6001600160a01b0383166000908152602081905260409020548181101561140f5760405162461bcd60e51b81526004018080602001828103825260288152602001806116ff6028913960400191505060405180910390fd5b600254611422908363ffffffff61117f16565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114da908263ffffffff6111dc16565b6002556001600160a01b038316600090815260208190526040902054611506908263ffffffff6111dc16565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115bf57670de0b6b3a76400006115c1565b825b90506002820491505b811561045157670de0b6b3a76400006116016706f05b59d3b200006115f5868063ffffffff61123d16565b9063ffffffff6111dc16565b8161160857fe5b049250600282061561164457670de0b6b3a76400006116396706f05b59d3b200006115f5868563ffffffff61123d16565b8161164057fe5b0490505b6002820491506115ca56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a72315820f7a560014fa4fb38ffff6704f2dd0746ae7a8b5ed4ae70da672c367a61f77e3e64736f6c634300050b0032

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c806370a08231116100b8578063a6afed951161007c578063a6afed9514610378578063a9059cbb14610382578063ae9d70b0146103ae578063bd6d894d146103b6578063db006a75146103be578063dd62ed3e146103db57610142565b806370a08231146102e4578063852a12e31461030a57806395d89b4114610327578063a0712d681461032f578063a457c2d71461034c57610142565b80632383b0741161010a5780632383b0741461022e57806323b872dd14610236578063313ce5671461026c578063395093511461028a5780633af9e669146102b657806344b5a802146102dc57610142565b806306fdde0314610147578063095ea7b3146101c45780630d8e6e2c1461020457806318160ddd1461021e5780631937653214610226575b600080fd5b61014f610409565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610189578181015183820152602001610171565b50505050905090810190601f1680156101b65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101f0600480360360408110156101da57600080fd5b506001600160a01b038135169060200135610440565b604080519115158252519081900360200190f35b61020c610457565b60408051918252519081900360200190f35b61020c61045c565b61020c610462565b61020c61057f565b6101f06004803603606081101561024c57600080fd5b506001600160a01b038135811691602081013590911690604001356105b7565b610274610616565b6040805160ff9092168252519081900360200190f35b6101f0600480360360408110156102a057600080fd5b506001600160a01b03813516906020013561061b565b61020c600480360360208110156102cc57600080fd5b50356001600160a01b0316610657565b61020c6106a9565b61020c600480360360208110156102fa57600080fd5b50356001600160a01b03166106be565b61020c6004803603602081101561032057600080fd5b50356106d9565b61014f6108df565b61020c6004803603602081101561034557600080fd5b5035610900565b6101f06004803603604081101561036257600080fd5b506001600160a01b038135169060200135610af8565b610380610b34565b005b6101f06004803603604081101561039857600080fd5b506001600160a01b038135169060200135610b60565b61020c610b6d565b61020c610b7d565b61020c600480360360208110156103d457600080fd5b5035610b8f565b61020c600480360360408110156103f157600080fd5b506001600160a01b0381358116916020013516610d14565b60408051808201909152601881527f446861726d6120446169202850726f746f747970652030290000000000000000602082015290565b600061044d338484610d3f565b5060015b92915050565b600090565b60025490565b600080600080610470610e2b565b9250925092508061048a5743600355600483905560058290555b610492610f42565b6040805163a9059cbb60e01b8152737e4a8391c728fed9069b2962699ab416628b19fa6004820152602481018390529051919550735d3a536e4d6dbd6114cc1ead35777bab948e36439163a9059cbb916044808201926020929091908290030181600087803b15801561050457600080fd5b505af1158015610518573d6000803e3d6000fd5b505050506040513d602081101561052e57600080fd5b5051610579576040805162461bcd60e51b815260206004820152601560248201527431a230b4903a3930b739b332b9103330b4b632b21760591b604482015290519081900360640190fd5b50505090565b60008060008061058d610e2b565b925092509250806105a75743600355600483905560058290555b6105af610f42565b935050505090565b60006105c484848461103d565b6001600160a01b0384166000908152600160209081526040808320338452909152902054600019811461060b5761060b8533610606848763ffffffff61117f16565b610d3f565b506001949350505050565b600890565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff6111dc16565b600080610662610e2b565b50506001600160a01b038416600090815260208190526040902054909150670de0b6b3a76400009061069a908363ffffffff61123d16565b816106a157fe5b049392505050565b60008060006106b6611296565b039392505050565b6001600160a01b031660009081526020819052604090205490565b6000806000806106e7610e2b565b925092509250806107015743600355600483905560058290555b60045461072c9061072087670de0b6b3a764000063ffffffff61123d16565b9063ffffffff61134d16565b93506107393386866113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b15801561079557600080fd5b505af11580156107a9573d6000803e3d6000fd5b505050506040513d60208110156107bf57600080fd5b505114610809576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018790529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b505af1158015610877573d6000803e3d6000fd5b505050506040513d602081101561088d57600080fd5b50516108d7576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b505050919050565b6040805180820190915260078152660644461692d70360cc1b602082015290565b60008060008061090e610e2b565b925092509250806109285743600355600483905560058290555b6004546109479061072087670de0b6b3a764000063ffffffff61123d16565b604080516323b872dd60e01b8152336004820152306024820152604481018890529051919550736b175474e89094c44da98b954eedeac495271d0f916323b872dd916064808201926020929091908290030181600087803b1580156109ab57600080fd5b505af11580156109bf573d6000803e3d6000fd5b505050506040513d60208110156109d557600080fd5b5051610a1f576040805162461bcd60e51b81526020600482015260146024820152732230b4903a3930b739b332b9103330b4b632b21760611b604482015290519081900360640190fd5b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663a0712d68876040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610a7b57600080fd5b505af1158015610a8f573d6000803e3d6000fd5b505050506040513d6020811015610aa557600080fd5b505114610aed576040805162461bcd60e51b815260206004820152601160248201527031a230b49036b4b73a103330b4b632b21760791b604482015290519081900360640190fd5b6108d73386866114c7565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161044d918590610606908663ffffffff61117f16565b6000806000610b41610e2b565b92509250925080610b5b5743600355600483905560058290555b505050565b600061044d33848461103d565b6000610b77611296565b50919050565b6000610b87610e2b565b509092915050565b600080600080610b9d610e2b565b92509250925080610bb75743600355600483905560058290555b670de0b6b3a7640000610bd56004548761123d90919063ffffffff16565b81610bdc57fe5b049350610bea3385876113b7565b6000735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663852a12e3866040518263ffffffff1660e01b815260040180828152602001915050602060405180830381600087803b158015610c4657600080fd5b505af1158015610c5a573d6000803e3d6000fd5b505050506040513d6020811015610c7057600080fd5b505114610cba576040805162461bcd60e51b815260206004820152601360248201527231a230b4903932b232b2b6903330b4b632b21760691b604482015290519081900360640190fd5b6040805163a9059cbb60e01b8152336004820152602481018690529051736b175474e89094c44da98b954eedeac495271d0f9163a9059cbb9160448083019260209291908290030181600087803b15801561086357600080fd5b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6001600160a01b038316610d845760405162461bcd60e51b81526004018080602001828103825260248152602001806116db6024913960400191505060405180910390fd5b6001600160a01b038216610dc95760405162461bcd60e51b81526004018080602001828103825260228152602001806116736022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600354600090819043038015908115610e4d5760045493506005549250610f3c565b6000610e61670de0b6b930edc59e836115a7565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663bd6d894d6040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610eb257600080fd5b505af1158015610ec6573d6000803e3d6000fd5b505050506040513d6020811015610edc57600080fd5b5051600554909450600090610f039061072087670de0b6b3a764000063ffffffff61123d16565b9050670de0b6b3a7640000610f2f828411610f1e5783610f20565b825b6004549063ffffffff61123d16565b81610f3657fe5b04955050505b50909192565b600080610f7e6001670de0b6b3a7640000610f6a60045460025461123d90919063ffffffff16565b81610f7157fe5b049063ffffffff6111dc16565b60408051633af9e66960e01b81523060048201529051919250600091611014918491735d3a536e4d6dbd6114cc1ead35777bab948e364391633af9e66991602480830192602092919082900301818987803b158015610fdc57600080fd5b505af1158015610ff0573d6000803e3d6000fd5b505050506040513d602081101561100657600080fd5b50519063ffffffff61117f16565b6005549091506110369061072083670de0b6b3a764000063ffffffff61123d16565b9250505090565b6001600160a01b0383166110825760405162461bcd60e51b81526004018080602001828103825260258152602001806116b66025913960400191505060405180910390fd5b6001600160a01b0382166110c75760405162461bcd60e51b81526004018080602001828103825260238152602001806116506023913960400191505060405180910390fd5b6001600160a01b0383166000908152602081905260409020546110f0908263ffffffff61117f16565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611125908263ffffffff6111dc16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b6000828211156111d6576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611236576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60008261124c57506000610451565b8282028284828161125957fe5b04146112365760405162461bcd60e51b81526004018080602001828103825260218152602001806116956021913960400191505060405180910390fd5b600080806112ba670de0b6b930edc59e670de0b6b3a764000063ffffffff61117f16565b9050735d3a536e4d6dbd6114cc1ead35777bab948e36436001600160a01b031663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b15801561130957600080fd5b505afa15801561131d573d6000803e3d6000fd5b505050506040513d602081101561133357600080fd5b505191508181106113445781611346565b805b9250509091565b60008082116113a3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816113ae57fe5b04949350505050565b6001600160a01b0383166000908152602081905260409020548181101561140f5760405162461bcd60e51b81526004018080602001828103825260288152602001806116ff6028913960400191505060405180910390fd5b600254611422908363ffffffff61117f16565b6002556001600160a01b0384166000818152602081815260408083208686039055805186815290519293927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929181900390910190a3604080516001600160a01b03861681526020810185905280820184905290517fe5b754fb1abb7f01b499791d0b820ae3b6af3424ac1c59768edb53f4ec31a9299181900360600190a150505050565b6002546114da908263ffffffff6111dc16565b6002556001600160a01b038316600090815260208190526040902054611506908263ffffffff6111dc16565b6001600160a01b0384166000818152602081815260409182902093909355805191825291810184905280820183905290517f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f9181900360600190a16040805182815290516001600160a01b038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a3505050565b6000600282066115bf57670de0b6b3a76400006115c1565b825b90506002820491505b811561045157670de0b6b3a76400006116016706f05b59d3b200006115f5868063ffffffff61123d16565b9063ffffffff6111dc16565b8161160857fe5b049250600282061561164457670de0b6b3a76400006116396706f05b59d3b200006115f5868563ffffffff61123d16565b8161164057fe5b0490505b6002820491506115ca56fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373537570706c69656420616d6f756e742065786365656473206163636f756e742062616c616e63652ea265627a7a72315820f7a560014fa4fb38ffff6704f2dd0746ae7a8b5ed4ae70da672c367a61f77e3e64736f6c634300050b0032

Deployed Bytecode Sourcemap

3854:19726:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3854:19726:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15404:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15404:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10208:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10208:140:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16045:104;;;:::i;:::-;;;;;;;;;;;;;;;;14364:87;;;:::i;8881:313::-;;;:::i;13002:191::-;;;:::i;10757:336::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10757:336:0;;;;;;;;;;;;;;;;;:::i;15828:79::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;11415:222;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11415:222:0;;;;;;;;:::i;12448:388::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12448:388:0;-1:-1:-1;;;;;12448:388:0;;:::i;14041:213::-;;;:::i;14664:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14664:111:0;-1:-1:-1;;;;;14664:111:0;;:::i;8054:638::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8054:638:0;;:::i;15602:83::-;;;:::i;6064:669::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6064:669:0;;:::i;11962:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11962:232:0;;;;;;;;:::i;9338:111::-;;;:::i;:::-;;9742:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;9742:148:0;;;;;;;;:::i;13724:132::-;;;:::i;13349:207::-;;;:::i;7042:627::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7042:627:0;;:::i;15159:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15159:130:0;;;;;;;;;;:::i;15404:79::-;15472:5;;;;;;;;;;;;;;;;;15404:79;:::o;10208:140::-;10275:4;10288:36;10297:10;10309:7;10318:5;10288:8;:36::i;:::-;-1:-1:-1;10338:4:0;10208:140;;;;;:::o;16045:104::-;16090:15;;16045:104::o;14364:87::-;14433:12;;14364:87;:::o;8881:313::-;8930:19;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;9054:13;:11;:13::i;:::-;9127:35;;;-1:-1:-1;;;9127:35:0;;4935:42;9127:35;;;;;;;;;;;;9040:27;;-1:-1:-1;4650:42:0;;9127:14;;:35;;;;;;;;;;;;;;;-1:-1:-1;4650:42:0;9127:35;;;5:2:-1;;;;30:1;27;20:12;5:2;9127:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9127:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9127:35:0;9119:69;;;;;-1:-1:-1;;;9119:69:0;;;;;;;;;;;;-1:-1:-1;;;9119:69:0;;;;;;;;;;;;;;;8881:313;;;;:::o;13002:191::-;13050:19;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;13174:13;:11;:13::i;:::-;13160:27;;13002:191;;;;:::o;10757:336::-;10858:4;10871:36;10881:6;10889:9;10900:6;10871:9;:36::i;:::-;-1:-1:-1;;;;;10934:19:0;;10914:17;10934:19;;;:11;:19;;;;;;;;10954:10;10934:31;;;;;;;;-1:-1:-1;;10976:24:0;;10972:98;;11011:51;11020:6;11028:10;11040:21;:9;11054:6;11040:21;:13;:21;:::i;:::-;11011:8;:51::i;:::-;-1:-1:-1;11083:4:0;;10757:336;-1:-1:-1;;;;10757:336:0:o;15828:79::-;4393:1;15828:79;:::o;11415:222::-;11537:10;11507:4;11558:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;11558:32:0;;;;;;;;;;11507:4;;11520:93;;11549:7;;11558:48;;11595:10;11558:48;:36;:48;:::i;12448:388::-;12522:18;12625:24;12655:21;:19;:21::i;:::-;-1:-1:-1;;;;;;;12772:18:0;;:9;:18;;;;;;;;;;;12624:52;;-1:-1:-1;4462:4:0;;12772:40;;12624:52;12772:40;:22;:40;:::i;:::-;:58;;;;;;;12448:388;-1:-1:-1;;;12448:388:0:o;14041:213::-;14093:18;14121:24;14147;14175:18;:16;:18::i;:::-;14213:35;;14041:213;-1:-1:-1;;;14041:213:0:o;14664:111::-;-1:-1:-1;;;;;14751:18:0;14723:12;14751:18;;;;;;;;;;;;14664:111::o;8054:638::-;8138:18;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;8277:17;;8239:56;;:33;:12;4462:4;8239:33;:16;:33;:::i;:::-;:37;:56;:37;:56;:::i;:::-;8226:69;;8326:43;8332:10;8344:12;8358:10;8326:5;:43::i;:::-;4578:1;4650:42;-1:-1:-1;;;;;8474:22:0;;8497:12;8474:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8474:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8474:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8474:36:0;:57;8458:110;;;;;-1:-1:-1;;;8458:110:0;;;;;;;;;;;;-1:-1:-1;;;8458:110:0;;;;;;;;;;;;;;;8622:39;;;-1:-1:-1;;;8622:39:0;;8636:10;8622:39;;;;;;;;;;;;4776:42;;8622:13;;:39;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;8622:39;;;5:2:-1;;;;30:1;27;20:12;5:2;8622:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8622:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8622:39:0;8614:72;;;;;-1:-1:-1;;;8614:72:0;;;;;;;;;;;;-1:-1:-1;;;8614:72:0;;;;;;;;;;;;;;;8054:638;;;;;;:::o;15602:83::-;15672:7;;;;;;;;;;;;-1:-1:-1;;;15672:7:0;;;;15602:83;:::o;6064:669::-;6135:18;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;6271:17;;6234:55;;:32;:11;4462:4;6234:32;:15;:32;:::i;:55::-;6389:57;;;-1:-1:-1;;;6389:57:0;;6407:10;6389:57;;;;6427:4;6389:57;;;;;;;;;;;;6221:68;;-1:-1:-1;4776:42:0;;6389:17;;:57;;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;6389:57;;;5:2:-1;;;;30:1;27;20:12;5:2;6389:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6389:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6389:57:0;6373:111;;;;;-1:-1:-1;;;6373:111:0;;;;;;;;;;;;-1:-1:-1;;;6373:111:0;;;;;;;;;;;;;;;4578:1;4650:42;-1:-1:-1;;;;;6578:10:0;;6589:11;6578:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6578:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6578:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6578:23:0;:44;6570:74;;;;;-1:-1:-1;;;6570:74:0;;;;;;;;;;;;-1:-1:-1;;;6570:74:0;;;;;;;;;;;;;;;6685:42;6691:10;6703:11;6716:10;6685:5;:42::i;11962:232::-;12089:10;12059:4;12110:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12110:32:0;;;;;;;;;;12059:4;;12072:98;;12101:7;;12110:53;;12147:15;12110:53;:36;:53;:::i;9338:111::-;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;9338:111;;;:::o;9742:148::-;9813:4;9826:40;9836:10;9848:9;9859:6;9826:9;:40::i;13724:132::-;13777:24;13832:18;:16;:18::i;:::-;-1:-1:-1;13810:40:0;13724:132;-1:-1:-1;13724:132:0:o;13349:207::-;13398:24;13529:21;:19;:21::i;:::-;-1:-1:-1;13506:44:0;;13349:207;-1:-1:-1;;13349:207:0:o;7042:627::-;7114:19;23214:24;23240;23266:17;23293:21;:19;:21::i;:::-;23205:109;;;;;;23328:12;23323:239;;23452:12;23432:17;:32;23473:17;:36;;;23518:17;:36;;;23323:239;4462:4;7224:33;7239:17;;7224:10;:14;;:33;;;;:::i;:::-;:51;;;;;;7210:65;;7306:42;7312:10;7324:11;7337:10;7306:5;:42::i;:::-;4578:1;4650:42;-1:-1:-1;;;;;7453:22:0;;7476:11;7453:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7453:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7453:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7453:35:0;:56;7437:109;;;;;-1:-1:-1;;;7437:109:0;;;;;;;;;;;;-1:-1:-1;;;7437:109:0;;;;;;;;;;;;;;;7600:38;;;-1:-1:-1;;;7600:38:0;;7614:10;7600:38;;;;;;;;;;;;4776:42;;7600:13;;:38;;;;;;;;;;;;;;-1:-1:-1;4776:42:0;7600:38;;;5:2:-1;;;;30:1;27;20:12;15159:130:0;-1:-1:-1;;;;;15256:18:0;;;15233:7;15256:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;15159:130::o;18755:317::-;-1:-1:-1;;;;;18844:19:0;;18836:68;;;;-1:-1:-1;;;18836:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18919:21:0;;18911:68;;;;-1:-1:-1;;;18911:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18988:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;19035:31;;;;;;;;;;;;;;;;;18755:317;;;:::o;19493:1228::-;19763:17;;19559:24;;;;19748:12;:32;19803:27;;;19922:794;;;;19968:17;;19949:36;;20013:17;;19994:36;;19922:794;;;20110:23;20136:45;4218:19;20158:22;20136:4;:45::i;:::-;20110:71;;4650:42;-1:-1:-1;;;;;20264:25:0;;:27;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20264:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20264:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20264:27:0;20448:17;;20264:27;;-1:-1:-1;20372:20:0;;20406:60;;:37;20264:27;4462:4;20406:37;:20;:37;:::i;:60::-;20372:103;;4462:4;20586:104;20636:12;20618:15;:30;:63;;20666:15;20618:63;;;20651:12;20618:63;20586:17;;;:104;:21;:104;:::i;:::-;:122;;;;;;20567:141;;19922:794;;;19493:1228;;;;:::o;20903:583::-;20955:19;21055:22;21080:76;21154:1;4462:4;21089:35;21106:17;;21089:12;;:16;;:35;;;;:::i;:::-;:53;;;;;;;21080:76;:73;:76;:::i;:::-;21275:40;;;-1:-1:-1;;;21275:40:0;;21309:4;21275:40;;;;;;21055:101;;-1:-1:-1;21245:18:0;;21275:60;;21055:101;;4650:42;;21275:25;;:40;;;;;;;;;;;;;;21245:18;4650:42;21275:40;;;5:2:-1;;;;30:1;27;20:12;5:2;21275:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21275:40:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21275:40:0;;:60;:44;:60;:::i;:::-;21462:17;;21245:97;;-1:-1:-1;21426:54:0;;:31;21245:97;4462:4;21426:31;:14;:31;:::i;:54::-;21412:68;;20903:583;;;:::o;18001:407::-;-1:-1:-1;;;;;18095:20:0;;18087:70;;;;-1:-1:-1;;;18087:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18172:23:0;;18164:71;;;;-1:-1:-1;;;18164:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18264:17:0;;:9;:17;;;;;;;;;;;:29;;18286:6;18264:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;18244:17:0;;;:9;:17;;;;;;;;;;;:49;;;;18323:20;;;;;;;:32;;18348:6;18323:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;18300:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;18367:35;;;;;;;18300:20;;18367:35;;;;;;;;;;;;;18001:407;;;:::o;2682:170::-;2740:7;2769:1;2764;:6;;2756:49;;;;;-1:-1:-1;;;2756:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2824:5:0;;;2682:170::o;2509:167::-;2567:7;2595:5;;;2615:6;;;;2607:46;;;;;-1:-1:-1;;;2607:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2669:1;2509:167;-1:-1:-1;;;2509:167:0:o;2858:222::-;2916:7;2936:6;2932:37;;-1:-1:-1;2960:1:0;2953:8;;2932:37;2989:5;;;2993:1;2989;:5;:1;3009:5;;;;;:10;3001:56;;;;-1:-1:-1;;;3001:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21683:382;21740:22;;;21827:36;4218:19;4462:4;21827:36;:19;:36;:::i;:::-;21799:64;;4650:42;-1:-1:-1;;;;;21887:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21887:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21887:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21887:26:0;;-1:-1:-1;21981:34:0;;;:71;;22038:14;21981:71;;;22018:17;21981:71;21955:104;;21683:382;;;:::o;3086:165::-;3144:7;3172:1;3168;:5;3160:44;;;;;-1:-1:-1;;;3160:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;3211:9;3227:1;3223;:5;;;;;;;3086:165;-1:-1:-1;;;;3086:165:0:o;17190:464::-;-1:-1:-1;;;;;17302:18:0;;17273:26;17302:18;;;;;;;;;;;17343:28;;;;17327:95;;;;-1:-1:-1;;;17327:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17446:12;;:24;;17463:6;17446:24;:16;:24;:::i;:::-;17431:12;:39;-1:-1:-1;;;;;17477:18:0;;:9;:18;;;;;;;;;;;17498:27;;;17477:48;;17565:37;;;;;;;17477:9;;:18;17565:37;;;;;;;;;;;17614:34;;;-1:-1:-1;;;;;17614:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17190:464;;;;:::o;16523:281::-;16621:12;;:24;;16638:6;16621:24;:16;:24;:::i;:::-;16606:12;:39;-1:-1:-1;;;;;16673:18:0;;:9;:18;;;;;;;;;;;:30;;16696:6;16673:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;16652:18:0;;:9;:18;;;;;;;;;;;;:51;;;;16717:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;16761:37;;;;;;;;-1:-1:-1;;;;;16761:37:0;;;16778:1;;16761:37;;;;;;;;;16523:281;;;:::o;22446:430::-;22515:16;22559:1;22551:5;:9;:42;;4462:4;22551:42;;;22568:7;22551:42;22540:53;-1:-1:-1;22616:1:0;22607:10;;;;22602:269;22619:10;;22602:269;;4462:4;22662:51;4523:4;22663:20;22675:7;;22663:20;:11;:20;:::i;:::-;22662:26;:51;:26;:51;:::i;:::-;:69;;;;;;;-1:-1:-1;22754:1:0;22746:5;:9;:14;22742:122;;4462:4;22784:52;4523:4;22785:21;:7;22797:8;22785:21;:11;:21;:::i;22784:52::-;:70;;;;;;22773:81;;22742:122;22640:1;22631:10;;;;22602:269;

Swarm Source

bzzr://f7a560014fa4fb38ffff6704f2dd0746ae7a8b5ed4ae70da672c367a61f77e3e
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.