ETH Price: $2,571.96 (-1.28%)
Gas: 4 Gwei

Contract

0xB3c5866f6690AbD50536683994Cc949697a64cd0
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Add Authorizatio...172485452023-05-13 3:57:47456 days ago1683950267IN
0xB3c5866f...697a64cd0
0 ETH0.002125345
0x60806040172485442023-05-13 3:57:35456 days ago1683950255IN
 Create: StabilityFeeTreasury
0 ETH0.1686954145

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
StabilityFeeTreasury

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 1 : StabilityFeeTreasury.sol
/// StabilityFeeTreasury.sol

// Copyright (C) 2018 Rain <[email protected]>, 2020 Reflexer Labs, INC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

pragma solidity 0.6.7;

abstract contract SAFEEngineLike {
    function approveSAFEModification(address) virtual external;
    function denySAFEModification(address) virtual external;
    function transferInternalCoins(address,address,uint256) virtual external;
    function settleDebt(uint256) virtual external;
    function coinBalance(address) virtual public view returns (uint256);
    function debtBalance(address) virtual public view returns (uint256);
}
abstract contract SystemCoinLike {
    function balanceOf(address) virtual public view returns (uint256);
    function approve(address, uint256) virtual public returns (uint256);
    function transfer(address,uint256) virtual public returns (bool);
    function transferFrom(address,address,uint256) virtual public returns (bool);
}
abstract contract CoinJoinLike {
    function systemCoin() virtual public view returns (address);
    function join(address, uint256) virtual external;
}

contract StabilityFeeTreasury {
    // --- Auth ---
    mapping (address => uint256) public authorizedAccounts;
    /**
     * @notice Add auth to an account
     * @param account Account to add auth to
     */
    function addAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 1;
        emit AddAuthorization(account);
    }
    /**
     * @notice Remove auth from an account
     * @param account Account to remove auth from
     */
    function removeAuthorization(address account) external isAuthorized {
        authorizedAccounts[account] = 0;
        emit RemoveAuthorization(account);
    }
    /**
    * @notice Checks whether msg.sender can call an authed function
    **/
    modifier isAuthorized {
        require(authorizedAccounts[msg.sender] == 1, "StabilityFeeTreasury/account-not-authorized");
        _;
    }

    // --- Events ---
    event AddAuthorization(address account);
    event RemoveAuthorization(address account);
    event ModifyParameters(bytes32 parameter, address addr);
    event ModifyParameters(bytes32 parameter, uint256 val);
    event DisableContract();
    event SetTotalAllowance(address indexed account, uint256 rad);
    event SetPerBlockAllowance(address indexed account, uint256 rad);
    event GiveFunds(address indexed account, uint256 rad, uint256 expensesAccumulator);
    event TakeFunds(address indexed account, uint256 rad);
    event PullFunds(address indexed sender, address indexed dstAccount, address token, uint256 rad, uint256 expensesAccumulator);
    event TransferSurplusFunds(address extraSurplusReceiver, uint256 fundsToTransfer);

    // --- Structs ---
    struct Allowance {
        uint256 total;
        uint256 perBlock;
    }

    // Mapping of total and per block allowances
    mapping(address => Allowance)                   private allowance;
    // Mapping that keeps track of how much surplus an authorized address has pulled each block
    mapping(address => mapping(uint256 => uint256)) public pulledPerBlock;

    SAFEEngineLike  public safeEngine;
    SystemCoinLike  public systemCoin;
    CoinJoinLike    public coinJoin;

    // The address that receives any extra surplus which is not used by the treasury
    address public extraSurplusReceiver;

    uint256 public treasuryCapacity;           // max amount of SF that can be kept in the treasury                        [rad]
    uint256 public minimumFundsRequired;       // minimum amount of SF that must be kept in the treasury at all times      [rad]
    uint256 public expensesMultiplier;         // multiplier for expenses                                                  [hundred]
    uint256 public surplusTransferDelay;       // minimum time between transferSurplusFunds calls                          [seconds]
    uint256 public expensesAccumulator;        // expenses accumulator                                                     [rad]
    uint256 public accumulatorTag;             // latest tagged accumulator price                                          [rad]
    uint256 public pullFundsMinThreshold;      // minimum funds that must be in the treasury so that someone can pullFunds [rad]
    uint256 public latestSurplusTransferTime;  // latest timestamp when transferSurplusFunds was called                    [seconds]
    uint256 public contractEnabled;

    modifier accountNotTreasury(address account) {
        require(account != address(this), "StabilityFeeTreasury/account-cannot-be-treasury");
        _;
    }

    constructor(
        address safeEngine_,
        address extraSurplusReceiver_,
        address coinJoin_
    ) public {
        require(address(CoinJoinLike(coinJoin_).systemCoin()) != address(0), "StabilityFeeTreasury/null-system-coin");
        require(extraSurplusReceiver_ != address(0), "StabilityFeeTreasury/null-surplus-receiver");

        authorizedAccounts[msg.sender] = 1;

        safeEngine                = SAFEEngineLike(safeEngine_);
        extraSurplusReceiver      = extraSurplusReceiver_;
        coinJoin                  = CoinJoinLike(coinJoin_);
        systemCoin                = SystemCoinLike(coinJoin.systemCoin());
        latestSurplusTransferTime = now;
        expensesMultiplier        = HUNDRED;
        contractEnabled           = 1;

        systemCoin.approve(address(coinJoin), uint256(-1));

        emit AddAuthorization(msg.sender);
    }

    // --- Math ---
    uint256 constant HUNDRED = 10 ** 2;
    uint256 constant RAY     = 10 ** 27;

    function addition(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x + y;
        require(z >= x, "StabilityFeeTreasury/add-uint-uint-overflow");
    }
    function addition(int256 x, int256 y) internal pure returns (int256 z) {
        z = x + y;
        if (y <= 0) require(z <= x, "StabilityFeeTreasury/add-int-int-underflow");
        if (y  > 0) require(z > x, "StabilityFeeTreasury/add-int-int-overflow");
    }
    function subtract(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "StabilityFeeTreasury/sub-uint-uint-underflow");
    }
    function subtract(int256 x, int256 y) internal pure returns (int256 z) {
        z = x - y;
        require(y <= 0 || z <= x, "StabilityFeeTreasury/sub-int-int-underflow");
        require(y >= 0 || z >= x, "StabilityFeeTreasury/sub-int-int-overflow");
    }
    function multiply(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "StabilityFeeTreasury/mul-uint-uint-overflow");
    }
    function divide(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y > 0, "StabilityFeeTreasury/div-y-null");
        z = x / y;
        require(z <= x, "StabilityFeeTreasury/div-invalid");
    }
    function minimum(uint256 x, uint256 y) internal view returns (uint256 z) {
        z = (x <= y) ? x : y;
    }

    // --- Administration ---
    /**
     * @notice Modify address parameters
     * @param parameter The name of the contract whose address will be changed
     * @param addr New address for the contract
     */
    function modifyParameters(bytes32 parameter, address addr) external isAuthorized {
        require(contractEnabled == 1, "StabilityFeeTreasury/contract-not-enabled");
        require(addr != address(0), "StabilityFeeTreasury/null-addr");
        if (parameter == "extraSurplusReceiver") {
          require(addr != address(this), "StabilityFeeTreasury/accounting-engine-cannot-be-treasury");
          extraSurplusReceiver = addr;
        }
        else revert("StabilityFeeTreasury/modify-unrecognized-param");
        emit ModifyParameters(parameter, addr);
    }
    /**
     * @notice Modify uint256 parameters
     * @param parameter The name of the parameter to modify
     * @param val New parameter value
     */
    function modifyParameters(bytes32 parameter, uint256 val) external isAuthorized {
        require(contractEnabled == 1, "StabilityFeeTreasury/not-live");
        if (parameter == "expensesMultiplier") expensesMultiplier = val;
        else if (parameter == "treasuryCapacity") {
          require(val >= minimumFundsRequired, "StabilityFeeTreasury/capacity-lower-than-min-funds");
          treasuryCapacity = val;
        }
        else if (parameter == "minimumFundsRequired") {
          require(val <= treasuryCapacity, "StabilityFeeTreasury/min-funds-higher-than-capacity");
          minimumFundsRequired = val;
        }
        else if (parameter == "pullFundsMinThreshold") {
          pullFundsMinThreshold = val;
        }
        else if (parameter == "surplusTransferDelay") surplusTransferDelay = val;
        else revert("StabilityFeeTreasury/modify-unrecognized-param");
        emit ModifyParameters(parameter, val);
    }
    /**
     * @notice Disable this contract (normally called by GlobalSettlement)
     */
    function disableContract() external isAuthorized {
        require(contractEnabled == 1, "StabilityFeeTreasury/already-disabled");
        contractEnabled = 0;
        joinAllCoins();
        safeEngine.transferInternalCoins(address(this), extraSurplusReceiver, safeEngine.coinBalance(address(this)));
        emit DisableContract();
    }

    // --- Utils ---
    function either(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := or(x, y)}
    }
    function both(bool x, bool y) internal pure returns (bool z) {
        assembly{ z := and(x, y)}
    }
    /**
     * @notice Join all ERC20 system coins that the treasury has inside the SAFEEngine
     */
    function joinAllCoins() internal {
        if (systemCoin.balanceOf(address(this)) > 0) {
          coinJoin.join(address(this), systemCoin.balanceOf(address(this)));
        }
    }
    /*
    * @notice Settle as much bad debt as possible (if this contract has any)
    */
    function settleDebt() public {
        uint256 coinBalanceSelf = safeEngine.coinBalance(address(this));
        uint256 debtBalanceSelf = safeEngine.debtBalance(address(this));

        if (debtBalanceSelf > 0) {
          safeEngine.settleDebt(minimum(coinBalanceSelf, debtBalanceSelf));
        }
    }

    // --- Getters ---
    /*
    * @notice Returns the total and per block allowances for a specific address
    * @param account The address to return the allowances for
    */
    function getAllowance(address account) public view returns (uint256, uint256) {
        return (allowance[account].total, allowance[account].perBlock);
    }

    // --- SF Transfer Allowance ---
    /**
     * @notice Modify an address' total allowance in order to withdraw SF from the treasury
     * @param account The approved address
     * @param rad The total approved amount of SF to withdraw (number with 45 decimals)
     */
    function setTotalAllowance(address account, uint256 rad) external isAuthorized accountNotTreasury(account) {
        require(account != address(0), "StabilityFeeTreasury/null-account");
        allowance[account].total = rad;
        emit SetTotalAllowance(account, rad);
    }
    /**
     * @notice Modify an address' per block allowance in order to withdraw SF from the treasury
     * @param account The approved address
     * @param rad The per block approved amount of SF to withdraw (number with 45 decimals)
     */
    function setPerBlockAllowance(address account, uint256 rad) external isAuthorized accountNotTreasury(account) {
        require(account != address(0), "StabilityFeeTreasury/null-account");
        allowance[account].perBlock = rad;
        emit SetPerBlockAllowance(account, rad);
    }

    // --- Stability Fee Transfer (Governance) ---
    /**
     * @notice Governance transfers SF to an address
     * @param account Address to transfer SF to
     * @param rad Amount of internal system coins to transfer (a number with 45 decimals)
     */
    function giveFunds(address account, uint256 rad) external isAuthorized accountNotTreasury(account) {
        require(account != address(0), "StabilityFeeTreasury/null-account");

        joinAllCoins();
        settleDebt();

        require(safeEngine.debtBalance(address(this)) == 0, "StabilityFeeTreasury/outstanding-bad-debt");
        require(safeEngine.coinBalance(address(this)) >= rad, "StabilityFeeTreasury/not-enough-funds");

        if (account != extraSurplusReceiver) {
          expensesAccumulator = addition(expensesAccumulator, rad);
        }

        safeEngine.transferInternalCoins(address(this), account, rad);
        emit GiveFunds(account, rad, expensesAccumulator);
    }
    /**
     * @notice Governance takes funds from an address
     * @param account Address to take system coins from
     * @param rad Amount of internal system coins to take from the account (a number with 45 decimals)
     */
    function takeFunds(address account, uint256 rad) external isAuthorized accountNotTreasury(account) {
        safeEngine.transferInternalCoins(account, address(this), rad);
        emit TakeFunds(account, rad);
    }

    // --- Stability Fee Transfer (Approved Accounts) ---
    /**
     * @notice Pull stability fees from the treasury (if your allowance permits)
     * @param dstAccount Address to transfer funds to
     * @param token Address of the token to transfer (in this case it must be the address of the ERC20 system coin).
     *              Used only to adhere to a standard for automated, on-chain treasuries
     * @param wad Amount of system coins (SF) to transfer (expressed as an 18 decimal number but the contract will transfer
              internal system coins that have 45 decimals)
     */
    function pullFunds(address dstAccount, address token, uint256 wad) external {
        if (dstAccount == address(this)) return;
	      require(allowance[msg.sender].total >= multiply(wad, RAY), "StabilityFeeTreasury/not-allowed");
        require(dstAccount != address(0), "StabilityFeeTreasury/null-dst");
        require(dstAccount != extraSurplusReceiver, "StabilityFeeTreasury/dst-cannot-be-accounting");
        require(wad > 0, "StabilityFeeTreasury/null-transfer-amount");
        require(token == address(systemCoin), "StabilityFeeTreasury/token-unavailable");
        if (allowance[msg.sender].perBlock > 0) {
          require(addition(pulledPerBlock[msg.sender][block.number], multiply(wad, RAY)) <= allowance[msg.sender].perBlock, "StabilityFeeTreasury/per-block-limit-exceeded");
        }

        pulledPerBlock[msg.sender][block.number] = addition(pulledPerBlock[msg.sender][block.number], multiply(wad, RAY));

        joinAllCoins();
        settleDebt();

        require(safeEngine.debtBalance(address(this)) == 0, "StabilityFeeTreasury/outstanding-bad-debt");
        require(safeEngine.coinBalance(address(this)) >= multiply(wad, RAY), "StabilityFeeTreasury/not-enough-funds");
        require(safeEngine.coinBalance(address(this)) >= pullFundsMinThreshold, "StabilityFeeTreasury/below-pullFunds-min-threshold");

        // Update allowance and accumulator
        allowance[msg.sender].total = subtract(allowance[msg.sender].total, multiply(wad, RAY));
        expensesAccumulator         = addition(expensesAccumulator, multiply(wad, RAY));

        // Transfer money
        safeEngine.transferInternalCoins(address(this), dstAccount, multiply(wad, RAY));

        emit PullFunds(msg.sender, dstAccount, token, multiply(wad, RAY), expensesAccumulator);
    }

    // --- Treasury Maintenance ---
    /**
     * @notice Transfer surplus stability fees to the extraSurplusReceiver. This is here to make sure that the treasury
               doesn't accumulate fees that it doesn't even need in order to pay for allowances. It ensures
               that there are enough funds left in the treasury to account for projected expenses (latest expenses multiplied
               by an expense multiplier)
     */
    function transferSurplusFunds() external {
        require(now >= addition(latestSurplusTransferTime, surplusTransferDelay), "StabilityFeeTreasury/transfer-cooldown-not-passed");
        // Compute latest expenses
        uint256 latestExpenses = subtract(expensesAccumulator, accumulatorTag);
        // Check if we need to keep more funds than the total capacity
        uint256 remainingFunds =
          (treasuryCapacity <= divide(multiply(expensesMultiplier, latestExpenses), HUNDRED)) ?
          divide(multiply(expensesMultiplier, latestExpenses), HUNDRED) : treasuryCapacity;
        // Make sure to keep at least minimum funds
        remainingFunds = (divide(multiply(expensesMultiplier, latestExpenses), HUNDRED) <= minimumFundsRequired) ?
                   minimumFundsRequired : remainingFunds;
        // Set internal vars
        accumulatorTag            = expensesAccumulator;
        latestSurplusTransferTime = now;
        // Join all coins in system
        joinAllCoins();
        // Settle outstanding bad debt
        settleDebt();
        // Check that there's no bad debt left
        require(safeEngine.debtBalance(address(this)) == 0, "StabilityFeeTreasury/outstanding-bad-debt");
        // Check if we have too much money
        if (safeEngine.coinBalance(address(this)) > remainingFunds) {
          // Make sure that we still keep min SF in treasury
          uint256 fundsToTransfer = subtract(safeEngine.coinBalance(address(this)), remainingFunds);
          // Transfer surplus to accounting engine
          safeEngine.transferInternalCoins(address(this), extraSurplusReceiver, fundsToTransfer);
          // Emit event
          emit TransferSurplusFunds(extraSurplusReceiver, fundsToTransfer);
        }
    }
}

Settings
{
  "remappings": [
    "ds-auth/=lib/ds-proxy/lib/ds-auth/src/",
    "ds-exec/=lib/ds-pause/lib/ds-spell/lib/ds-exec/src/",
    "ds-guard/=lib/geb-deploy/lib/ds-guard/src/",
    "ds-math/=lib/esm/lib/ds-token/lib/ds-math/src/",
    "ds-note/=lib/ds-proxy/lib/ds-note/src/",
    "ds-pause/=lib/ds-pause/src/",
    "ds-proxy/=lib/ds-proxy/src/",
    "ds-roles/=lib/ds-pause/lib/ds-vote-quorum/lib/ds-roles/src/",
    "ds-spell/=lib/ds-pause/lib/ds-spell/src/",
    "ds-stop/=lib/geb-fsm/lib/ds-stop/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "ds-thing/=lib/ds-value/lib/ds-thing/src/",
    "ds-token/=lib/esm/lib/ds-token/src/",
    "ds-value/=lib/ds-value/src/",
    "ds-vote-quorum/=lib/ds-pause/lib/ds-vote-quorum/src/",
    "ds-weth/=lib/ds-weth/",
    "erc20/=lib/ds-weth/lib/erc20/src/",
    "esm/=lib/esm/src/",
    "forge-std/=lib/forge-std/src/",
    "geb-basic-multisig/=lib/ds-pause/lib/geb-basic-multisig/src/",
    "geb-chainlink-median/=lib/geb-chainlink-median/src/",
    "geb-debt-popper-rewards/=lib/geb-debt-popper-rewards/src/",
    "geb-deploy/=lib/geb-deploy/src/",
    "geb-esm-threshold-setter/=lib/geb-esm-threshold-setter/src/",
    "geb-fsm/=lib/geb-fsm/src/",
    "geb-incentives/=lib/geb-proxy-actions/lib/geb-incentives/src/",
    "geb-lender-first-resort/=lib/geb-lender-first-resort/src/",
    "geb-pit/=lib/geb-pit/src/",
    "geb-protocol-token-authority/=lib/geb-protocol-token-authority/src/",
    "geb-proxy-actions/=lib/geb-proxy-actions/src/",
    "geb-proxy-registry/=lib/geb-proxy-registry/src/",
    "geb-rrfm-calculators/=lib/geb-rrfm-calculators/src/",
    "geb-rrfm-rate-setter/=lib/geb-rrfm-rate-setter/src/",
    "geb-safe-manager/=lib/geb-safe-manager/src/",
    "geb-safe-saviours/=lib/geb-proxy-actions/lib/geb-safe-saviours/src/",
    "geb-treasury-reimbursement/=lib/geb-debt-popper-rewards/lib/geb-treasury-reimbursement/src/",
    "geb-uniswap-median/=lib/geb-uniswap-median/src/",
    "geb/=lib/geb/src/",
    "mgl-debt-minter-rewards/=lib/mgl-debt-minter-rewards/",
    "mgl-emitter/=lib/mgl-emitter/src/",
    "multicall/=lib/multicall/src/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "istanbul",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"safeEngine_","type":"address"},{"internalType":"address","name":"extraSurplusReceiver_","type":"address"},{"internalType":"address","name":"coinJoin_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[],"name":"DisableContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expensesAccumulator","type":"uint256"}],"name":"GiveFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"dstAccount","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expensesAccumulator","type":"uint256"}],"name":"PullFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"}],"name":"SetPerBlockAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"}],"name":"SetTotalAllowance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"}],"name":"TakeFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"extraSurplusReceiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"fundsToTransfer","type":"uint256"}],"name":"TransferSurplusFunds","type":"event"},{"inputs":[],"name":"accumulatorTag","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coinJoin","outputs":[{"internalType":"contract CoinJoinLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"expensesAccumulator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expensesMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraSurplusReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"giveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"latestSurplusTransferTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumFundsRequired","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"address","name":"addr","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"dstAccount","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"pullFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullFundsMinThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pulledPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeEngine","outputs":[{"internalType":"contract SAFEEngineLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"setPerBlockAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"setTotalAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"settleDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"surplusTransferDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"systemCoin","outputs":[{"internalType":"contract SystemCoinLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"takeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferSurplusFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryCapacity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50604051620044aa380380620044aa833981810160405260608110156200003757600080fd5b81019080805190602001909291908051906020019092919080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b158015620000bb57600080fd5b505afa158015620000d0573d6000803e3d6000fd5b505050506040513d6020811015620000e757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141562000167576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260258152602001806200445b6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620001ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018062004480602a913960400191505060405180910390fd5b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555082600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a7e944556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200035f57600080fd5b505afa15801562000374573d6000803e3d6000fd5b505050506040513d60208110156200038b57600080fd5b8101908080519060200190929190505050600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555042600e8190555060646009819055506001600f81905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015620004df57600080fd5b505af1158015620004f4573d6000803e3d6000fd5b505050506040513d60208110156200050b57600080fd5b8101908080519060200190929190505050507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010233604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1505050613ec880620005936000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c806379b5f040116100f9578063aafb96b611610097578063c4cc925311610071578063c4cc9253146106e7578063ca9ece3514610735578063eb5a662e14610753578063fe4f5890146107b2576101c4565b8063aafb96b61461065d578063b6e785b114610667578063b734054014610685576101c4565b806394f3f81d116100d357806394f3f81d146105935780639e6ab9a3146105d75780639ff8edff146105f5578063a7e9445514610613576101c4565b806379b5f0401461054d5780638454ff5a1461056b578063894ba83314610589576101c4565b806341b3a0d911610166578063505239bf11610140578063505239bf1461045d5780636614f0101461046757806367aea313146104b55780636e7dd917146104ff576101c4565b806341b3a0d9146103a757806343e9c6b0146103c55780634e6afb9e14610413576101c4565b806330413a2a116101a257806330413a2a146102ad57806335b28153146102f757806337b7eca11461033b5780633d285a6f14610359576101c4565b8063021de13f146101c9578063201add9b146101e757806324ba588414610255575b600080fd5b6101d16107ea565b6040518082815260200191505060405180910390f35b610253600480360360608110156101fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107f0565b005b6102976004803603602081101561026b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113aa565b6040518082815260200191505060405180910390f35b6102b56113c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103396004803603602081101561030d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e8565b005b610343611529565b6040518082815260200191505060405180910390f35b6103a56004803603604081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152f565b005b6103af61176c565b6040518082815260200191505060405180910390f35b610411600480360360408110156103db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611772565b005b61041b6119af565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104656119d5565b005b6104b36004803603604081101561047d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f7e565b005b6104bd6122c6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054b6004803603604081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ec565b005b6105556128bd565b6040518082815260200191505060405180910390f35b6105736128c3565b6040518082815260200191505060405180910390f35b6105916128c9565b005b6105d5600480360360208110156105a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be9565b005b6105df612d2a565b6040518082815260200191505060405180910390f35b6105fd612d30565b6040518082815260200191505060405180910390f35b61061b612d36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610665612d5c565b005b61066f612fbc565b6040518082815260200191505060405180910390f35b6106d16004803603604081101561069b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fc2565b6040518082815260200191505060405180910390f35b610733600480360360408110156106fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fe7565b005b61073d61324c565b6040518082815260200191505060405180910390f35b6107956004803603602081101561076957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613252565b604051808381526020018281526020019250505060405180910390f35b6107e8600480360360408110156107c857600080fd5b8101908080359060200190929190803590602001909291905050506132e4565b005b60095481565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610829576113a5565b61083f816b033b2e3c9fd0803ce8000000613645565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410156108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53746162696c69747946656554726561737572792f6e6f742d616c6c6f77656481525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53746162696c69747946656554726561737572792f6e756c6c2d64737400000081525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613e15602d913960400191505060405180910390fd5b60008111610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b736029913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b226026913960400191505060405180910390fd5b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115610c9457600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154610c3c600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054610c37846b033b2e3c9fd0803ce8000000613645565b6136bd565b1115610c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613c22602d913960400191505060405180910390fd5b5b610d03600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054610cfe836b033b2e3c9fd0803ce8000000613645565b6136bd565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002081905550610d5f613723565b610d67612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e0857600080fd5b505afa158015610e1c573d6000803e3d6000fd5b505050506040513d6020811015610e3257600080fd5b810190808051906020019092919050505014610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b610eaf816b033b2e3c9fd0803ce8000000613645565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f4e57600080fd5b505afa158015610f62573d6000803e3d6000fd5b505050506040513d6020811015610f7857600080fd5b81019080805190602001909291905050501015610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e426025913960400191505060405180910390fd5b600d54600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561108257600080fd5b505afa158015611096573d6000803e3d6000fd5b505050506040513d60208110156110ac57600080fd5b81019080805190602001909291905050501015611114576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613d306032913960400191505060405180910390fd5b611175600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611170836b033b2e3c9fd0803ce8000000613645565b6139a2565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506111dc600b546111d7836b033b2e3c9fd0803ce8000000613645565b6136bd565b600b81905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc3085611238856b033b2e3c9fd0803ce8000000613645565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156112d457600080fd5b505af11580156112e8573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7f1bd32912cc1caeaa0a1221e71cf675c272dadfc4bbb9f9e7b15e3aba962c8384611352856b033b2e3c9fd0803ce8000000613645565b600b54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a35b505050565b60006020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010281604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600a5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146115c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff167f872b1baa7b7b264504136eb033469a05552185dc7454b7dc405f006fe4175298836040518082815260200191505060405180910390a2505050565b600f5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611915576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508273ffffffffffffffffffffffffffffffffffffffff167f2c5e94d86b8348fb36d52453e5460c21e506c0fa8a48a721d021490e22ece3eb836040518082815260200191505060405180910390a2505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119e3600e54600a546136bd565b421015611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613d626031913960400191505060405180910390fd5b6000611a4b600b54600c546139a2565b90506000611a65611a5e60095484613645565b6064613a08565b6007541115611a7657600754611a8d565b611a8c611a8560095484613645565b6064613a08565b5b9050600854611aa8611aa160095485613645565b6064613a08565b1115611ab45780611ab8565b6008545b9050600b54600c8190555042600e81905550611ad2613723565b611ada612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b7b57600080fd5b505afa158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b810190808051906020019092919050505014611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b81019080805190602001909291905050501115611f7a576000611dd2600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d9157600080fd5b505afa158015611da5573d6000803e3d6000fd5b505050506040513d6020811015611dbb57600080fd5b8101908080519060200190929190505050836139a2565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611ed357600080fd5b505af1158015611ee7573d6000803e3d6000fd5b505050507f405ec0d46a8a982eb3d6a307ca6e12b0a8c5b178bd7b41dd6aec3232fccc83c1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505b5050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f5414612070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613c886029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53746162696c69747946656554726561737572792f6e756c6c2d61646472000081525060200191505060405180910390fd5b7f6578747261537572706c75735265636569766572000000000000000000000000821415612206573073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613c4f6039913960400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612257565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613d93602e913960400191505060405180910390fd5b7fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d18282604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561248f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b612497613723565b61249f612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561254057600080fd5b505afa158015612554573d6000803e3d6000fd5b505050506040513d602081101561256a57600080fd5b8101908080519060200190929190505050146125d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b81600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561267157600080fd5b505afa158015612685573d6000803e3d6000fd5b505050506040513d602081101561269b57600080fd5b81019080805190602001909291905050501015612703576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e426025913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461276b57612764600b54836136bd565b600b819055505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc3085856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167ff3b9d7846b41e3cdfe96580c8ccad08ec3180b2156af0d3bd27cb67a8eb8495283600b54604051808381526020018281526020019250505060405180910390a2505050565b600e5481565b600c5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f54146129bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613dc16025913960400191505060405180910390fd5b6000600f819055506129cb613723565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612acc57600080fd5b505afa158015612ae0573d6000803e3d6000fd5b505050506040513d6020811015612af657600080fd5b81019080805190602001909291905050506040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ba357600080fd5b505af1158015612bb7573d6000803e3d6000fd5b505050507f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e60405160405180910390a1565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612c80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b90381604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60085481565b600b5481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b810190808051906020019092919050505090506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612edb57600080fd5b505afa158015612eef573d6000803e3d6000fd5b505050506040513d6020811015612f0557600080fd5b810190808051906020019092919050505090506000811115612fb857600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327a0bb33612f698484613b07565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f9f57600080fd5b505af1158015612fb3573d6000803e3d6000fd5b505050505b5050565b60075481565b6002602052816000526040600020602052806000526040600020600091509150505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc8430856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156131e157600080fd5b505af11580156131f5573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fbbf79e146587871d724f2a0ff9c8beff1c42b3d5ef6ea6a7ba1990b104be51e4836040518082815260200191505060405180910390a2505050565b600d5481565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015491509150915091565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461337b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f54146133f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53746162696c69747946656554726561737572792f6e6f742d6c69766500000081525060200191505060405180910390fd5b7f657870656e7365734d756c7469706c69657200000000000000000000000000008214156134275780600981905550613602565b7f74726561737572794361706163697479000000000000000000000000000000008214156134b6576008548110156134aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613bc56032913960400191505060405180910390fd5b80600781905550613601565b7f6d696e696d756d46756e6473526571756972656400000000000000000000000082141561354557600754811115613539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180613cb16033913960400191505060405180910390fd5b80600881905550613600565b7f70756c6c46756e64734d696e5468726573686f6c6400000000000000000000008214156135795780600d819055506135ff565b7f737572706c75735472616e7366657244656c61790000000000000000000000008214156135ad5780600a819055506135fe565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613d93602e913960400191505060405180910390fd5b5b5b5b5b7fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a8282604051808381526020018281526020019250505060405180910390a15050565b600080821480613662575082828385029250828161365f57fe5b04145b6136b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613d05602b913960400191505060405180910390fd5b92915050565b600081830190508281101561371d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613bf7602b913960400191505060405180910390fd5b92915050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156137c457600080fd5b505afa1580156137d8573d6000803e3d6000fd5b505050506040513d60208110156137ee57600080fd5b810190808051906020019092919050505011156139a057600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633b4da69f30600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138e357600080fd5b505afa1580156138f7573d6000803e3d6000fd5b505050506040513d602081101561390d57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561398757600080fd5b505af115801561399b573d6000803e3d6000fd5b505050505b565b6000828284039150811115613a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613e67602c913960400191505060405180910390fd5b92915050565b6000808211613a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746162696c69747946656554726561737572792f6469762d792d6e756c6c0081525060200191505060405180910390fd5b818381613a8857fe5b04905082811115613b01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53746162696c69747946656554726561737572792f6469762d696e76616c696481525060200191505060405180910390fd5b92915050565b600081831115613b175781613b19565b825b90509291505056fe53746162696c69747946656554726561737572792f746f6b656e2d756e617661696c61626c6553746162696c69747946656554726561737572792f6163636f756e742d6e6f742d617574686f72697a656453746162696c69747946656554726561737572792f6e756c6c2d7472616e736665722d616d6f756e7453746162696c69747946656554726561737572792f6f75747374616e64696e672d6261642d6465627453746162696c69747946656554726561737572792f63617061636974792d6c6f7765722d7468616e2d6d696e2d66756e647353746162696c69747946656554726561737572792f6164642d75696e742d75696e742d6f766572666c6f7753746162696c69747946656554726561737572792f7065722d626c6f636b2d6c696d69742d657863656564656453746162696c69747946656554726561737572792f6163636f756e74696e672d656e67696e652d63616e6e6f742d62652d747265617375727953746162696c69747946656554726561737572792f636f6e74726163742d6e6f742d656e61626c656453746162696c69747946656554726561737572792f6d696e2d66756e64732d6869676865722d7468616e2d636170616369747953746162696c69747946656554726561737572792f6e756c6c2d6163636f756e7453746162696c69747946656554726561737572792f6d756c2d75696e742d75696e742d6f766572666c6f7753746162696c69747946656554726561737572792f62656c6f772d70756c6c46756e64732d6d696e2d7468726573686f6c6453746162696c69747946656554726561737572792f7472616e736665722d636f6f6c646f776e2d6e6f742d70617373656453746162696c69747946656554726561737572792f6d6f646966792d756e7265636f676e697a65642d706172616d53746162696c69747946656554726561737572792f616c72656164792d64697361626c656453746162696c69747946656554726561737572792f6163636f756e742d63616e6e6f742d62652d747265617375727953746162696c69747946656554726561737572792f6473742d63616e6e6f742d62652d6163636f756e74696e6753746162696c69747946656554726561737572792f6e6f742d656e6f7567682d66756e647353746162696c69747946656554726561737572792f7375622d75696e742d75696e742d756e646572666c6f77a264697066735822122022ae9e63491e336aa138c958e04c9286acef2d9766f08c5858550111e60fd7e964736f6c6343000607003353746162696c69747946656554726561737572792f6e756c6c2d73797374656d2d636f696e53746162696c69747946656554726561737572792f6e756c6c2d737572706c75732d72656365697665720000000000000000000000003ad2f30266b35f775d58aecde3fbb7ea8b83bf2b000000000000000000000000daf29a8bd397a4177c895c02f415ad9e4774c7b10000000000000000000000003498503e58b65f3585c87780aff380e061d55d23

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c806379b5f040116100f9578063aafb96b611610097578063c4cc925311610071578063c4cc9253146106e7578063ca9ece3514610735578063eb5a662e14610753578063fe4f5890146107b2576101c4565b8063aafb96b61461065d578063b6e785b114610667578063b734054014610685576101c4565b806394f3f81d116100d357806394f3f81d146105935780639e6ab9a3146105d75780639ff8edff146105f5578063a7e9445514610613576101c4565b806379b5f0401461054d5780638454ff5a1461056b578063894ba83314610589576101c4565b806341b3a0d911610166578063505239bf11610140578063505239bf1461045d5780636614f0101461046757806367aea313146104b55780636e7dd917146104ff576101c4565b806341b3a0d9146103a757806343e9c6b0146103c55780634e6afb9e14610413576101c4565b806330413a2a116101a257806330413a2a146102ad57806335b28153146102f757806337b7eca11461033b5780633d285a6f14610359576101c4565b8063021de13f146101c9578063201add9b146101e757806324ba588414610255575b600080fd5b6101d16107ea565b6040518082815260200191505060405180910390f35b610253600480360360608110156101fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506107f0565b005b6102976004803603602081101561026b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113aa565b6040518082815260200191505060405180910390f35b6102b56113c2565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6103396004803603602081101561030d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113e8565b005b610343611529565b6040518082815260200191505060405180910390f35b6103a56004803603604081101561036f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061152f565b005b6103af61176c565b6040518082815260200191505060405180910390f35b610411600480360360408110156103db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611772565b005b61041b6119af565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104656119d5565b005b6104b36004803603604081101561047d57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f7e565b005b6104bd6122c6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054b6004803603604081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122ec565b005b6105556128bd565b6040518082815260200191505060405180910390f35b6105736128c3565b6040518082815260200191505060405180910390f35b6105916128c9565b005b6105d5600480360360208110156105a957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612be9565b005b6105df612d2a565b6040518082815260200191505060405180910390f35b6105fd612d30565b6040518082815260200191505060405180910390f35b61061b612d36565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610665612d5c565b005b61066f612fbc565b6040518082815260200191505060405180910390f35b6106d16004803603604081101561069b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fc2565b6040518082815260200191505060405180910390f35b610733600480360360408110156106fd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612fe7565b005b61073d61324c565b6040518082815260200191505060405180910390f35b6107956004803603602081101561076957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613252565b604051808381526020018281526020019250505060405180910390f35b6107e8600480360360408110156107c857600080fd5b8101908080359060200190929190803590602001909291905050506132e4565b005b60095481565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610829576113a5565b61083f816b033b2e3c9fd0803ce8000000613645565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015410156108f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53746162696c69747946656554726561737572792f6e6f742d616c6c6f77656481525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53746162696c69747946656554726561737572792f6e756c6c2d64737400000081525060200191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613e15602d913960400191505060405180910390fd5b60008111610a99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b736029913960400191505060405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b226026913960400191505060405180910390fd5b6000600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541115610c9457600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154610c3c600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054610c37846b033b2e3c9fd0803ce8000000613645565b6136bd565b1115610c93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180613c22602d913960400191505060405180910390fd5b5b610d03600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002054610cfe836b033b2e3c9fd0803ce8000000613645565b6136bd565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600043815260200190815260200160002081905550610d5f613723565b610d67612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610e0857600080fd5b505afa158015610e1c573d6000803e3d6000fd5b505050506040513d6020811015610e3257600080fd5b810190808051906020019092919050505014610e99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b610eaf816b033b2e3c9fd0803ce8000000613645565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610f4e57600080fd5b505afa158015610f62573d6000803e3d6000fd5b505050506040513d6020811015610f7857600080fd5b81019080805190602001909291905050501015610fe0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e426025913960400191505060405180910390fd5b600d54600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561108257600080fd5b505afa158015611096573d6000803e3d6000fd5b505050506040513d60208110156110ac57600080fd5b81019080805190602001909291905050501015611114576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613d306032913960400191505060405180910390fd5b611175600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611170836b033b2e3c9fd0803ce8000000613645565b6139a2565b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506111dc600b546111d7836b033b2e3c9fd0803ce8000000613645565b6136bd565b600b81905550600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc3085611238856b033b2e3c9fd0803ce8000000613645565b6040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156112d457600080fd5b505af11580156112e8573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f7f1bd32912cc1caeaa0a1221e71cf675c272dadfc4bbb9f9e7b15e3aba962c8384611352856b033b2e3c9fd0803ce8000000613645565b600b54604051808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a35b505050565b60006020528060005260406000206000915090505481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461147f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f700010281604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b600a5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146115c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561164c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156116d2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055508273ffffffffffffffffffffffffffffffffffffffff167f872b1baa7b7b264504136eb033469a05552185dc7454b7dc405f006fe4175298836040518082815260200191505060405180910390a2505050565b600f5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561188f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611915576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508273ffffffffffffffffffffffffffffffffffffffff167f2c5e94d86b8348fb36d52453e5460c21e506c0fa8a48a721d021490e22ece3eb836040518082815260200191505060405180910390a2505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6119e3600e54600a546136bd565b421015611a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613d626031913960400191505060405180910390fd5b6000611a4b600b54600c546139a2565b90506000611a65611a5e60095484613645565b6064613a08565b6007541115611a7657600754611a8d565b611a8c611a8560095484613645565b6064613a08565b5b9050600854611aa8611aa160095485613645565b6064613a08565b1115611ab45780611ab8565b6008545b9050600b54600c8190555042600e81905550611ad2613723565b611ada612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611b7b57600080fd5b505afa158015611b8f573d6000803e3d6000fd5b505050506040513d6020811015611ba557600080fd5b810190808051906020019092919050505014611c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b80600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cac57600080fd5b505afa158015611cc0573d6000803e3d6000fd5b505050506040513d6020811015611cd657600080fd5b81019080805190602001909291905050501115611f7a576000611dd2600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611d9157600080fd5b505afa158015611da5573d6000803e3d6000fd5b505050506040513d6020811015611dbb57600080fd5b8101908080519060200190929190505050836139a2565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015611ed357600080fd5b505af1158015611ee7573d6000803e3d6000fd5b505050507f405ec0d46a8a982eb3d6a307ca6e12b0a8c5b178bd7b41dd6aec3232fccc83c1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1505b5050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f5414612070576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613c886029913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612113576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f53746162696c69747946656554726561737572792f6e756c6c2d61646472000081525060200191505060405180910390fd5b7f6578747261537572706c75735265636569766572000000000000000000000000821415612206573073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121c0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613c4f6039913960400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612257565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613d93602e913960400191505060405180910390fd5b7fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d18282604051808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a15050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612383576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612409576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561248f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613ce46021913960400191505060405180910390fd5b612497613723565b61249f612d5c565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561254057600080fd5b505afa158015612554573d6000803e3d6000fd5b505050506040513d602081101561256a57600080fd5b8101908080519060200190929190505050146125d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613b9c6029913960400191505060405180910390fd5b81600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561267157600080fd5b505afa158015612685573d6000803e3d6000fd5b505050506040513d602081101561269b57600080fd5b81019080805190602001909291905050501015612703576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e426025913960400191505060405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461276b57612764600b54836136bd565b600b819055505b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc3085856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b15801561284857600080fd5b505af115801561285c573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167ff3b9d7846b41e3cdfe96580c8ccad08ec3180b2156af0d3bd27cb67a8eb8495283600b54604051808381526020018281526020019250505060405180910390a2505050565b600e5481565b600c5481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f54146129bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613dc16025913960400191505060405180910390fd5b6000600f819055506129cb613723565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc30600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612acc57600080fd5b505afa158015612ae0573d6000803e3d6000fd5b505050506040513d6020811015612af657600080fd5b81019080805190602001909291905050506040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612ba357600080fd5b505af1158015612bb7573d6000803e3d6000fd5b505050507f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e60405160405180910390a1565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612c80576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b90381604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60085481565b600b5481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fabde80c306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612dfd57600080fd5b505afa158015612e11573d6000803e3d6000fd5b505050506040513d6020811015612e2757600080fd5b810190808051906020019092919050505090506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166311005b07306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612edb57600080fd5b505afa158015612eef573d6000803e3d6000fd5b505050506040513d6020811015612f0557600080fd5b810190808051906020019092919050505090506000811115612fb857600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166327a0bb33612f698484613b07565b6040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015612f9f57600080fd5b505af1158015612fb3573d6000803e3d6000fd5b505050505b5050565b60075481565b6002602052816000526040600020602052806000526040600020600091509150505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461307e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b813073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613104576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180613de6602f913960400191505060405180910390fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663efabcadc8430856040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b1580156131e157600080fd5b505af11580156131f5573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff167fbbf79e146587871d724f2a0ff9c8beff1c42b3d5ef6ea6a7ba1990b104be51e4836040518082815260200191505060405180910390a2505050565b600d5481565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015491509150915091565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461337b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613b48602b913960400191505060405180910390fd5b6001600f54146133f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f53746162696c69747946656554726561737572792f6e6f742d6c69766500000081525060200191505060405180910390fd5b7f657870656e7365734d756c7469706c69657200000000000000000000000000008214156134275780600981905550613602565b7f74726561737572794361706163697479000000000000000000000000000000008214156134b6576008548110156134aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526032815260200180613bc56032913960400191505060405180910390fd5b80600781905550613601565b7f6d696e696d756d46756e6473526571756972656400000000000000000000000082141561354557600754811115613539576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180613cb16033913960400191505060405180910390fd5b80600881905550613600565b7f70756c6c46756e64734d696e5468726573686f6c6400000000000000000000008214156135795780600d819055506135ff565b7f737572706c75735472616e7366657244656c61790000000000000000000000008214156135ad5780600a819055506135fe565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613d93602e913960400191505060405180910390fd5b5b5b5b5b7fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a8282604051808381526020018281526020019250505060405180910390a15050565b600080821480613662575082828385029250828161365f57fe5b04145b6136b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613d05602b913960400191505060405180910390fd5b92915050565b600081830190508281101561371d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180613bf7602b913960400191505060405180910390fd5b92915050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156137c457600080fd5b505afa1580156137d8573d6000803e3d6000fd5b505050506040513d60208110156137ee57600080fd5b810190808051906020019092919050505011156139a057600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633b4da69f30600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156138e357600080fd5b505afa1580156138f7573d6000803e3d6000fd5b505050506040513d602081101561390d57600080fd5b81019080805190602001909291905050506040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561398757600080fd5b505af115801561399b573d6000803e3d6000fd5b505050505b565b6000828284039150811115613a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613e67602c913960400191505060405180910390fd5b92915050565b6000808211613a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f53746162696c69747946656554726561737572792f6469762d792d6e756c6c0081525060200191505060405180910390fd5b818381613a8857fe5b04905082811115613b01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f53746162696c69747946656554726561737572792f6469762d696e76616c696481525060200191505060405180910390fd5b92915050565b600081831115613b175781613b19565b825b90509291505056fe53746162696c69747946656554726561737572792f746f6b656e2d756e617661696c61626c6553746162696c69747946656554726561737572792f6163636f756e742d6e6f742d617574686f72697a656453746162696c69747946656554726561737572792f6e756c6c2d7472616e736665722d616d6f756e7453746162696c69747946656554726561737572792f6f75747374616e64696e672d6261642d6465627453746162696c69747946656554726561737572792f63617061636974792d6c6f7765722d7468616e2d6d696e2d66756e647353746162696c69747946656554726561737572792f6164642d75696e742d75696e742d6f766572666c6f7753746162696c69747946656554726561737572792f7065722d626c6f636b2d6c696d69742d657863656564656453746162696c69747946656554726561737572792f6163636f756e74696e672d656e67696e652d63616e6e6f742d62652d747265617375727953746162696c69747946656554726561737572792f636f6e74726163742d6e6f742d656e61626c656453746162696c69747946656554726561737572792f6d696e2d66756e64732d6869676865722d7468616e2d636170616369747953746162696c69747946656554726561737572792f6e756c6c2d6163636f756e7453746162696c69747946656554726561737572792f6d756c2d75696e742d75696e742d6f766572666c6f7753746162696c69747946656554726561737572792f62656c6f772d70756c6c46756e64732d6d696e2d7468726573686f6c6453746162696c69747946656554726561737572792f7472616e736665722d636f6f6c646f776e2d6e6f742d70617373656453746162696c69747946656554726561737572792f6d6f646966792d756e7265636f676e697a65642d706172616d53746162696c69747946656554726561737572792f616c72656164792d64697361626c656453746162696c69747946656554726561737572792f6163636f756e742d63616e6e6f742d62652d747265617375727953746162696c69747946656554726561737572792f6473742d63616e6e6f742d62652d6163636f756e74696e6753746162696c69747946656554726561737572792f6e6f742d656e6f7567682d66756e647353746162696c69747946656554726561737572792f7375622d75696e742d75696e742d756e646572666c6f77a264697066735822122022ae9e63491e336aa138c958e04c9286acef2d9766f08c5858550111e60fd7e964736f6c63430006070033

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

0000000000000000000000003ad2f30266b35f775d58aecde3fbb7ea8b83bf2b000000000000000000000000daf29a8bd397a4177c895c02f415ad9e4774c7b10000000000000000000000003498503e58b65f3585c87780aff380e061d55d23

-----Decoded View---------------
Arg [0] : safeEngine_ (address): 0x3AD2F30266B35F775D58Aecde3fbB7ea8b83bF2b
Arg [1] : extraSurplusReceiver_ (address): 0xDAf29A8bD397a4177C895C02F415Ad9e4774C7B1
Arg [2] : coinJoin_ (address): 0x3498503E58b65F3585C87780Aff380e061d55d23

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000003ad2f30266b35f775d58aecde3fbb7ea8b83bf2b
Arg [1] : 000000000000000000000000daf29a8bd397a4177c895c02f415ad9e4774c7b1
Arg [2] : 0000000000000000000000003498503e58b65f3585c87780aff380e061d55d23


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
[ Download: CSV Export  ]

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