ETH Price: $2,671.73 (-1.28%)

Contract

0xf0b7808b940b78bE81ad6F9E075Ce8be4A837E2c
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve SAFE Mod...180494452023-09-02 14:31:47392 days ago1693665107IN
0xf0b7808b...e4A837E2c
0 ETH0.0006655714.67155588
Approve SAFE Mod...180494422023-09-02 14:31:11392 days ago1693665071IN
0xf0b7808b...e4A837E2c
0 ETH0.0006737314.85132977
Approve SAFE Mod...180494082023-09-02 14:24:23392 days ago1693664663IN
0xf0b7808b...e4A837E2c
0 ETH0.0006594714.53699262
Approve SAFE Mod...118983602021-02-21 5:17:521315 days ago1613884672IN
0xf0b7808b...e4A837E2c
0 ETH0.00475915110
Approve SAFE Mod...118983582021-02-21 5:17:321315 days ago1613884652IN
0xf0b7808b...e4A837E2c
0 ETH0.00480241111.00000145
Approve SAFE Mod...118983572021-02-21 5:17:191315 days ago1613884639IN
0xf0b7808b...e4A837E2c
0 ETH0.00480241111.00000145
Approve SAFE Mod...117782082021-02-02 17:39:401334 days ago1612287580IN
0xf0b7808b...e4A837E2c
0 ETH0.00944816218.37887612
Approve SAFE Mod...117396332021-01-27 19:02:541340 days ago1611774174IN
0xf0b7808b...e4A837E2c
0 ETH0.00456229105.45
Approve SAFE Mod...117395712021-01-27 18:48:221340 days ago1611773302IN
0xf0b7808b...e4A837E2c
0 ETH0.003902590.2
Modify SAFE Coll...116421992021-01-12 19:57:271355 days ago1610481447IN
0xf0b7808b...e4A837E2c
0 ETH0.004720875
Modify SAFE Coll...116421942021-01-12 19:56:441355 days ago1610481404IN
0xf0b7808b...e4A837E2c
0 ETH0.004232475
Modify SAFE Coll...116421922021-01-12 19:56:161355 days ago1610481376IN
0xf0b7808b...e4A837E2c
0 ETH0.0053173974.39
Modify SAFE Coll...116380962021-01-12 4:57:531355 days ago1610427473IN
0xf0b7808b...e4A837E2c
0 ETH0.0071653575.00000156
Modify SAFE Coll...115900572021-01-04 20:05:541363 days ago1609790754IN
0xf0b7808b...e4A837E2c
0 ETH0.0064086698.3
Modify SAFE Coll...115898852021-01-04 19:24:291363 days ago1609788269IN
0xf0b7808b...e4A837E2c
0 ETH0.0088451392.61722976
Modify SAFE Coll...115896382021-01-04 18:29:391363 days ago1609784979IN
0xf0b7808b...e4A837E2c
0 ETH0.00654603144.1
Modify SAFE Coll...115657942021-01-01 2:42:201366 days ago1609468940IN
0xf0b7808b...e4A837E2c
0 ETH0.0041047957
Modify SAFE Coll...114659372020-12-16 18:58:101382 days ago1608145090IN
0xf0b7808b...e4A837E2c
0 ETH0.0039768961
Modify SAFE Coll...114658832020-12-16 18:46:391382 days ago1608144399IN
0xf0b7808b...e4A837E2c
0 ETH0.0046795260
Modify SAFE Coll...114658642020-12-16 18:40:281382 days ago1608144028IN
0xf0b7808b...e4A837E2c
0 ETH0.0026724537.4
Approve SAFE Mod...114533982020-12-14 20:50:161384 days ago1607979016IN
0xf0b7808b...e4A837E2c
0 ETH0.0010767524.88749986
Approve SAFE Mod...114532792020-12-14 20:27:191384 days ago1607977639IN
0xf0b7808b...e4A837E2c
0 ETH0.001730640
Modify SAFE Coll...112900262020-11-19 18:09:141409 days ago1605809354IN
0xf0b7808b...e4A837E2c
0 ETH0.0023200836.999999
Modify SAFE Coll...112842392020-11-18 20:56:231410 days ago1605732983IN
0xf0b7808b...e4A837E2c
0 ETH0.0013700538
Modify SAFE Coll...112842392020-11-18 20:56:231410 days ago1605732983IN
0xf0b7808b...e4A837E2c
0 ETH0.0029597937.95
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
111209522020-10-24 19:22:041435 days ago1603567324  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SAFEEngine

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license
/**
 *Submitted for verification at Etherscan.io on 2020-10-25
*/

/// SAFEEngine.sol -- SAFE database

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

pragma solidity ^0.6.7;

contract SAFEEngine {
    // --- Auth ---
    mapping (address => uint) public authorizedAccounts;
    /**
     * @notice Add auth to an account
     * @param account Account to add auth to
     */
    function addAuthorization(address account) external isAuthorized {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        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 {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        authorizedAccounts[account] = 0;
        emit RemoveAuthorization(account);
    }
    /**
    * @notice Checks whether msg.sender can call an authed function
    **/
    modifier isAuthorized {
        require(authorizedAccounts[msg.sender] == 1, "SAFEEngine/account-not-authorized");
        _;
    }

    // Who can transfer collateral & debt in/out of a SAFE
    mapping(address => mapping (address => uint)) public safeRights;
    /**
     * @notice Allow an address to modify your SAFE
     * @param account Account to give SAFE permissions to
     */
    function approveSAFEModification(address account) external {
        safeRights[msg.sender][account] = 1;
        emit ApproveSAFEModification(msg.sender, account);
    }
    /**
     * @notice Deny an address the rights to modify your SAFE
     * @param account Account to give SAFE permissions to
     */
    function denySAFEModification(address account) external {
        safeRights[msg.sender][account] = 0;
        emit DenySAFEModification(msg.sender, account);
    }
    /**
    * @notice Checks whether msg.sender has the right to modify a SAFE
    **/
    function canModifySAFE(address safe, address account) public view returns (bool) {
        return either(safe == account, safeRights[safe][account] == 1);
    }

    // --- Data ---
    struct CollateralType {
        // Total debt issued for this specific collateral type
        uint256 debtAmount;        // [wad]
        // Accumulator for interest accrued on this collateral type
        uint256 accumulatedRate;   // [ray]
        // Floor price at which a SAFE is allowed to generate debt
        uint256 safetyPrice;       // [ray]
        // Maximum amount of debt that can be generated with this collateral type
        uint256 debtCeiling;       // [rad]
        // Minimum amount of debt that must be generated by a SAFE using this collateral
        uint256 debtFloor;         // [rad]
        // Price at which a SAFE gets liquidated
        uint256 liquidationPrice;  // [ray]
    }
    struct SAFE {
        // Total amount of collateral locked in a SAFE
        uint256 lockedCollateral;  // [wad]
        // Total amount of debt generated by a SAFE
        uint256 generatedDebt;     // [wad]
    }

    // Data about each collateral type
    mapping (bytes32 => CollateralType)             public collateralTypes;
    // Data about each SAFE
    mapping (bytes32 => mapping (address => SAFE )) public safes;
    // Balance of each collateral type
    mapping (bytes32 => mapping (address => uint))  public tokenCollateral;  // [wad]
    // Internal balance of system coins
    mapping (address => uint)                       public coinBalance;      // [rad]
    // Amount of debt held by an account. Coins & debt are like matter and antimatter. They nullify each other
    mapping (address => uint)                       public debtBalance;      // [rad]

    // Total amount of debt that a single safe can generate
    uint256 public safeDebtCeiling;      // [wad]
    // Total amount of debt (coins) currently issued
    uint256  public globalDebt;          // [rad]
    // 'Bad' debt that's not covered by collateral
    uint256  public globalUnbackedDebt;  // [rad]
    // Maximum amount of debt that can be issued
    uint256  public globalDebtCeiling;   // [rad]
    // Access flag, indicates whether this contract is still active
    uint256  public contractEnabled;

    // --- Events ---
    event AddAuthorization(address account);
    event RemoveAuthorization(address account);
    event ApproveSAFEModification(address sender, address account);
    event DenySAFEModification(address sender, address account);
    event InitializeCollateralType(bytes32 collateralType);
    event ModifyParameters(bytes32 parameter, uint data);
    event ModifyParameters(bytes32 collateralType, bytes32 parameter, uint data);
    event DisableContract();
    event ModifyCollateralBalance(bytes32 collateralType, address account, int256 wad);
    event TransferCollateral(bytes32 collateralType, address src, address dst, uint256 wad);
    event TransferInternalCoins(address src, address dst, uint256 rad);
    event ModifySAFECollateralization(
        bytes32 collateralType,
        address safe,
        address collateralSource,
        address debtDestination,
        int deltaCollateral,
        int deltaDebt,
        uint lockedCollateral,
        uint generatedDebt,
        uint globalDebt
    );
    event TransferSAFECollateralAndDebt(
        bytes32 collateralType,
        address src,
        address dst,
        int deltaCollateral,
        int deltaDebt,
        uint srcLockedCollateral,
        uint srcGeneratedDebt,
        uint dstLockedCollateral,
        uint dstGeneratedDebt
    );
    event ConfiscateSAFECollateralAndDebt(
        bytes32 collateralType,
        address safe,
        address collateralCounterparty,
        address debtCounterparty,
        int deltaCollateral,
        int deltaDebt,
        uint globalUnbackedDebt
    );
    event SettleDebt(address account, uint rad, uint debtBalance, uint coinBalance, uint globalUnbackedDebt, uint globalDebt);
    event CreateUnbackedDebt(
        address debtDestination,
        address coinDestination,
        uint rad,
        uint debtDstBalance,
        uint coinDstBalance,
        uint globalUnbackedDebt,
        uint globalDebt
    );
    event UpdateAccumulatedRate(
        bytes32 collateralType,
        address surplusDst,
        int rateMultiplier,
        uint dstCoinBalance,
        uint globalDebt
    );

    // --- Init ---
    constructor() public {
        authorizedAccounts[msg.sender] = 1;
        safeDebtCeiling = uint(-1);
        contractEnabled = 1;
        emit AddAuthorization(msg.sender);
        emit ModifyParameters("safeDebtCeiling", uint(-1));
    }

    // --- Math ---
    function addition(uint x, int y) internal pure returns (uint z) {
        z = x + uint(y);
        require(y >= 0 || z <= x);
        require(y <= 0 || z >= x);
    }
    function addition(int x, int y) internal pure returns (int z) {
        z = x + y;
        require(y >= 0 || z <= x);
        require(y <= 0 || z >= x);
    }
    function subtract(uint x, int y) internal pure returns (uint z) {
        z = x - uint(y);
        require(y <= 0 || z <= x);
        require(y >= 0 || z >= x);
    }
    function subtract(int x, int y) internal pure returns (int z) {
        z = x - y;
        require(y <= 0 || z <= x);
        require(y >= 0 || z >= x);
    }
    function multiply(uint x, int y) internal pure returns (int z) {
        z = int(x) * y;
        require(int(x) >= 0);
        require(y == 0 || z / y == int(x));
    }
    function addition(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function subtract(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function multiply(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    // --- Administration ---

    /**
     * @notice Creates a brand new collateral type
     * @param collateralType Collateral type name (e.g ETH-A, TBTC-B)
     */
    function initializeCollateralType(bytes32 collateralType) external isAuthorized {
        require(collateralTypes[collateralType].accumulatedRate == 0, "SAFEEngine/collateral-type-already-exists");
        collateralTypes[collateralType].accumulatedRate = 10 ** 27;
        emit InitializeCollateralType(collateralType);
    }
    /**
     * @notice Modify general uint params
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(bytes32 parameter, uint data) external isAuthorized {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        if (parameter == "globalDebtCeiling") globalDebtCeiling = data;
        else if (parameter == "safeDebtCeiling") safeDebtCeiling = data;
        else revert("SAFEEngine/modify-unrecognized-param");
        emit ModifyParameters(parameter, data);
    }
    /**
     * @notice Modify collateral specific params
     * @param collateralType Collateral type we modify params for
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(
        bytes32 collateralType,
        bytes32 parameter,
        uint data
    ) external isAuthorized {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        if (parameter == "safetyPrice") collateralTypes[collateralType].safetyPrice = data;
        else if (parameter == "liquidationPrice") collateralTypes[collateralType].liquidationPrice = data;
        else if (parameter == "debtCeiling") collateralTypes[collateralType].debtCeiling = data;
        else if (parameter == "debtFloor") collateralTypes[collateralType].debtFloor = data;
        else revert("SAFEEngine/modify-unrecognized-param");
        emit ModifyParameters(collateralType, parameter, data);
    }
    /**
     * @notice Disable this contract (normally called by GlobalSettlement)
     */
    function disableContract() external isAuthorized {
        contractEnabled = 0;
        emit DisableContract();
    }

    // --- Fungibility ---
    /**
     * @notice Join/exit collateral into and and out of the system
     * @param collateralType Collateral type we join/exit
     * @param account Account that gets credited/debited
     * @param wad Amount of collateral
     */
    function modifyCollateralBalance(
        bytes32 collateralType,
        address account,
        int256 wad
    ) external isAuthorized {
        tokenCollateral[collateralType][account] = addition(tokenCollateral[collateralType][account], wad);
        emit ModifyCollateralBalance(collateralType, account, wad);
    }
    /**
     * @notice Transfer collateral between accounts
     * @param collateralType Collateral type transferred
     * @param src Collateral source
     * @param dst Collateral destination
     * @param wad Amount of collateral transferred
     */
    function transferCollateral(
        bytes32 collateralType,
        address src,
        address dst,
        uint256 wad
    ) external {
        require(canModifySAFE(src, msg.sender), "SAFEEngine/not-allowed");
        tokenCollateral[collateralType][src] = subtract(tokenCollateral[collateralType][src], wad);
        tokenCollateral[collateralType][dst] = addition(tokenCollateral[collateralType][dst], wad);
        emit TransferCollateral(collateralType, src, dst, wad);
    }
    /**
     * @notice Transfer internal coins (does not affect external balances from Coin.sol)
     * @param src Coins source
     * @param dst Coins destination
     * @param rad Amount of coins transferred
     */
    function transferInternalCoins(address src, address dst, uint256 rad) external {
        require(canModifySAFE(src, msg.sender), "SAFEEngine/not-allowed");
        coinBalance[src] = subtract(coinBalance[src], rad);
        coinBalance[dst] = addition(coinBalance[dst], rad);
        emit TransferInternalCoins(src, dst, rad);
    }

    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)}
    }

    // --- SAFE Manipulation ---
    /**
     * @notice Add/remove collateral or put back/generate more debt in a SAFE
     * @param collateralType Type of collateral to withdraw/deposit in and from the SAFE
     * @param safe Target SAFE
     * @param collateralSource Account we take collateral from/put collateral into
     * @param debtDestination Account from which we credit/debit coins and debt
     * @param deltaCollateral Amount of collateral added/extract from the SAFE (wad)
     * @param deltaDebt Amount of debt to generate/repay (wad)
     */
    function modifySAFECollateralization(
        bytes32 collateralType,
        address safe,
        address collateralSource,
        address debtDestination,
        int deltaCollateral,
        int deltaDebt
    ) external {
        // system is live
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");

        SAFE memory safeData = safes[collateralType][safe];
        CollateralType memory collateralTypeData = collateralTypes[collateralType];
        // collateral type has been initialised
        require(collateralTypeData.accumulatedRate != 0, "SAFEEngine/collateral-type-not-initialized");

        safeData.lockedCollateral      = addition(safeData.lockedCollateral, deltaCollateral);
        safeData.generatedDebt         = addition(safeData.generatedDebt, deltaDebt);
        collateralTypeData.debtAmount  = addition(collateralTypeData.debtAmount, deltaDebt);

        int deltaAdjustedDebt = multiply(collateralTypeData.accumulatedRate, deltaDebt);
        uint totalDebtIssued  = multiply(collateralTypeData.accumulatedRate, safeData.generatedDebt);
        globalDebt            = addition(globalDebt, deltaAdjustedDebt);

        // either debt has decreased, or debt ceilings are not exceeded
        require(
          either(
            deltaDebt <= 0,
            both(multiply(collateralTypeData.debtAmount, collateralTypeData.accumulatedRate) <= collateralTypeData.debtCeiling,
              globalDebt <= globalDebtCeiling)
            ),
          "SAFEEngine/ceiling-exceeded"
        );
        // safe is either less risky than before, or it is safe
        require(
          either(
            both(deltaDebt <= 0, deltaCollateral >= 0),
            totalDebtIssued <= multiply(safeData.lockedCollateral, collateralTypeData.safetyPrice)
          ),
          "SAFEEngine/not-safe"
        );

        // safe is either more safe, or the owner consents
        require(either(both(deltaDebt <= 0, deltaCollateral >= 0), canModifySAFE(safe, msg.sender)), "SAFEEngine/not-allowed-to-modify-safe");
        // collateral src consents
        require(either(deltaCollateral <= 0, canModifySAFE(collateralSource, msg.sender)), "SAFEEngine/not-allowed-collateral-src");
        // debt dst consents
        require(either(deltaDebt >= 0, canModifySAFE(debtDestination, msg.sender)), "SAFEEngine/not-allowed-debt-dst");

        // safe has no debt, or a non-dusty amount
        require(either(safeData.generatedDebt == 0, totalDebtIssued >= collateralTypeData.debtFloor), "SAFEEngine/dust");

        // safe didn't go above the safe debt limit
        if (deltaDebt > 0) {
          require(safeData.generatedDebt <= safeDebtCeiling, "SAFEEngine/above-debt-limit");
        }

        tokenCollateral[collateralType][collateralSource] =
          subtract(tokenCollateral[collateralType][collateralSource], deltaCollateral);

        coinBalance[debtDestination] = addition(coinBalance[debtDestination], deltaAdjustedDebt);

        safes[collateralType][safe] = safeData;
        collateralTypes[collateralType] = collateralTypeData;

        emit ModifySAFECollateralization(
            collateralType,
            safe,
            collateralSource,
            debtDestination,
            deltaCollateral,
            deltaDebt,
            safeData.lockedCollateral,
            safeData.generatedDebt,
            globalDebt
        );
    }

    // --- SAFE Fungibility ---
    /**
     * @notice Transfer collateral and/or debt between SAFEs
     * @param collateralType Collateral type transferred between SAFEs
     * @param src Source SAFE
     * @param dst Destination SAFE
     * @param deltaCollateral Amount of collateral to take/add into src and give/take from dst (wad)
     * @param deltaDebt Amount of debt to take/add into src and give/take from dst (wad)
     */
    function transferSAFECollateralAndDebt(
        bytes32 collateralType,
        address src,
        address dst,
        int deltaCollateral,
        int deltaDebt
    ) external {
        SAFE storage srcSAFE = safes[collateralType][src];
        SAFE storage dstSAFE = safes[collateralType][dst];
        CollateralType storage collateralType_ = collateralTypes[collateralType];

        srcSAFE.lockedCollateral = subtract(srcSAFE.lockedCollateral, deltaCollateral);
        srcSAFE.generatedDebt    = subtract(srcSAFE.generatedDebt, deltaDebt);
        dstSAFE.lockedCollateral = addition(dstSAFE.lockedCollateral, deltaCollateral);
        dstSAFE.generatedDebt    = addition(dstSAFE.generatedDebt, deltaDebt);

        uint srcTotalDebtIssued = multiply(srcSAFE.generatedDebt, collateralType_.accumulatedRate);
        uint dstTotalDebtIssued = multiply(dstSAFE.generatedDebt, collateralType_.accumulatedRate);

        // both sides consent
        require(both(canModifySAFE(src, msg.sender), canModifySAFE(dst, msg.sender)), "SAFEEngine/not-allowed");

        // both sides safe
        require(srcTotalDebtIssued <= multiply(srcSAFE.lockedCollateral, collateralType_.safetyPrice), "SAFEEngine/not-safe-src");
        require(dstTotalDebtIssued <= multiply(dstSAFE.lockedCollateral, collateralType_.safetyPrice), "SAFEEngine/not-safe-dst");

        // both sides non-dusty
        require(either(srcTotalDebtIssued >= collateralType_.debtFloor, srcSAFE.generatedDebt == 0), "SAFEEngine/dust-src");
        require(either(dstTotalDebtIssued >= collateralType_.debtFloor, dstSAFE.generatedDebt == 0), "SAFEEngine/dust-dst");

        emit TransferSAFECollateralAndDebt(
            collateralType,
            src,
            dst,
            deltaCollateral,
            deltaDebt,
            srcSAFE.lockedCollateral,
            srcSAFE.generatedDebt,
            dstSAFE.lockedCollateral,
            dstSAFE.generatedDebt
        );
    }

    // --- SAFE Confiscation ---
    /**
     * @notice Normally used by the LiquidationEngine in order to confiscate collateral and
       debt from a SAFE and give them to someone else
     * @param collateralType Collateral type the SAFE has locked inside
     * @param safe Target SAFE
     * @param collateralCounterparty Who we take/give collateral to
     * @param debtCounterparty Who we take/give debt to
     * @param deltaCollateral Amount of collateral taken/added into the SAFE (wad)
     * @param deltaDebt Amount of collateral taken/added into the SAFE (wad)
     */
    function confiscateSAFECollateralAndDebt(
        bytes32 collateralType,
        address safe,
        address collateralCounterparty,
        address debtCounterparty,
        int deltaCollateral,
        int deltaDebt
    ) external isAuthorized {
        SAFE storage safe_ = safes[collateralType][safe];
        CollateralType storage collateralType_ = collateralTypes[collateralType];

        safe_.lockedCollateral = addition(safe_.lockedCollateral, deltaCollateral);
        safe_.generatedDebt = addition(safe_.generatedDebt, deltaDebt);
        collateralType_.debtAmount = addition(collateralType_.debtAmount, deltaDebt);

        int deltaTotalIssuedDebt = multiply(collateralType_.accumulatedRate, deltaDebt);

        tokenCollateral[collateralType][collateralCounterparty] = subtract(
          tokenCollateral[collateralType][collateralCounterparty],
          deltaCollateral
        );
        debtBalance[debtCounterparty] = subtract(
          debtBalance[debtCounterparty],
          deltaTotalIssuedDebt
        );
        globalUnbackedDebt = subtract(
          globalUnbackedDebt,
          deltaTotalIssuedDebt
        );

        emit ConfiscateSAFECollateralAndDebt(
            collateralType,
            safe,
            collateralCounterparty,
            debtCounterparty,
            deltaCollateral,
            deltaDebt,
            globalUnbackedDebt
        );
    }

    // --- Settlement ---
    /**
     * @notice Nullify an amount of coins with an equal amount of debt
     * @param rad Amount of debt & coins to destroy
     */
    function settleDebt(uint rad) external {
        address account       = msg.sender;
        debtBalance[account]  = subtract(debtBalance[account], rad);
        coinBalance[account]  = subtract(coinBalance[account], rad);
        globalUnbackedDebt    = subtract(globalUnbackedDebt, rad);
        globalDebt            = subtract(globalDebt, rad);
        emit SettleDebt(account, rad, debtBalance[account], coinBalance[account], globalUnbackedDebt, globalDebt);
    }
    /**
     * @notice Usually called by CoinSavingsAccount in order to create unbacked debt
     * @param debtDestination Usually AccountingEngine that can settle debt with surplus
     * @param coinDestination Usually CoinSavingsAccount that passes the new coins to depositors
     * @param rad Amount of debt to create
     */
    function createUnbackedDebt(
        address debtDestination,
        address coinDestination,
        uint rad
    ) external isAuthorized {
        debtBalance[debtDestination]  = addition(debtBalance[debtDestination], rad);
        coinBalance[coinDestination]  = addition(coinBalance[coinDestination], rad);
        globalUnbackedDebt            = addition(globalUnbackedDebt, rad);
        globalDebt                    = addition(globalDebt, rad);
        emit CreateUnbackedDebt(
            debtDestination,
            coinDestination,
            rad,
            debtBalance[debtDestination],
            coinBalance[coinDestination],
            globalUnbackedDebt,
            globalDebt
        );
    }

    // --- Rates ---
    /**
     * @notice Usually called by TaxCollector in order to accrue interest on a specific collateral type
     * @param collateralType Collateral type we accrue interest for
     * @param surplusDst Destination for amount of surplus created by applying the interest rate
       to debt created by SAFEs with 'collateralType'
     * @param rateMultiplier Multiplier applied to the debtAmount in order to calculate the surplus [ray]
     */
    function updateAccumulatedRate(
        bytes32 collateralType,
        address surplusDst,
        int rateMultiplier
    ) external isAuthorized {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        CollateralType storage collateralType_ = collateralTypes[collateralType];
        collateralType_.accumulatedRate        = addition(collateralType_.accumulatedRate, rateMultiplier);
        int deltaSurplus                       = multiply(collateralType_.debtAmount, rateMultiplier);
        coinBalance[surplusDst]                = addition(coinBalance[surplusDst], deltaSurplus);
        globalDebt                             = addition(globalDebt, deltaSurplus);
        emit UpdateAccumulatedRate(
            collateralType,
            surplusDst,
            rateMultiplier,
            coinBalance[surplusDst],
            globalDebt
        );
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"ApproveSAFEModification","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"collateralCounterparty","type":"address"},{"indexed":false,"internalType":"address","name":"debtCounterparty","type":"address"},{"indexed":false,"internalType":"int256","name":"deltaCollateral","type":"int256"},{"indexed":false,"internalType":"int256","name":"deltaDebt","type":"int256"},{"indexed":false,"internalType":"uint256","name":"globalUnbackedDebt","type":"uint256"}],"name":"ConfiscateSAFECollateralAndDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"debtDestination","type":"address"},{"indexed":false,"internalType":"address","name":"coinDestination","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtDstBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"coinDstBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalUnbackedDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalDebt","type":"uint256"}],"name":"CreateUnbackedDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"DenySAFEModification","type":"event"},{"anonymous":false,"inputs":[],"name":"DisableContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"InitializeCollateralType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"int256","name":"wad","type":"int256"}],"name":"ModifyCollateralBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"collateralSource","type":"address"},{"indexed":false,"internalType":"address","name":"debtDestination","type":"address"},{"indexed":false,"internalType":"int256","name":"deltaCollateral","type":"int256"},{"indexed":false,"internalType":"int256","name":"deltaDebt","type":"int256"},{"indexed":false,"internalType":"uint256","name":"lockedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"generatedDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalDebt","type":"uint256"}],"name":"ModifySAFECollateralization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"coinBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalUnbackedDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalDebt","type":"uint256"}],"name":"SettleDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"TransferCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"}],"name":"TransferInternalCoins","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"src","type":"address"},{"indexed":false,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"int256","name":"deltaCollateral","type":"int256"},{"indexed":false,"internalType":"int256","name":"deltaDebt","type":"int256"},{"indexed":false,"internalType":"uint256","name":"srcLockedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"srcGeneratedDebt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstLockedCollateral","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"dstGeneratedDebt","type":"uint256"}],"name":"TransferSAFECollateralAndDebt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"address","name":"surplusDst","type":"address"},{"indexed":false,"internalType":"int256","name":"rateMultiplier","type":"int256"},{"indexed":false,"internalType":"uint256","name":"dstCoinBalance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"globalDebt","type":"uint256"}],"name":"UpdateAccumulatedRate","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"approveSAFEModification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"canModifySAFE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"coinBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collateralTypes","outputs":[{"internalType":"uint256","name":"debtAmount","type":"uint256"},{"internalType":"uint256","name":"accumulatedRate","type":"uint256"},{"internalType":"uint256","name":"safetyPrice","type":"uint256"},{"internalType":"uint256","name":"debtCeiling","type":"uint256"},{"internalType":"uint256","name":"debtFloor","type":"uint256"},{"internalType":"uint256","name":"liquidationPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"collateralCounterparty","type":"address"},{"internalType":"address","name":"debtCounterparty","type":"address"},{"internalType":"int256","name":"deltaCollateral","type":"int256"},{"internalType":"int256","name":"deltaDebt","type":"int256"}],"name":"confiscateSAFECollateralAndDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractEnabled","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"debtDestination","type":"address"},{"internalType":"address","name":"coinDestination","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"createUnbackedDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"debtBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"denySAFEModification","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"disableContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"globalDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalDebtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalUnbackedDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"initializeCollateralType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"account","type":"address"},{"internalType":"int256","name":"wad","type":"int256"}],"name":"modifyCollateralBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"collateralSource","type":"address"},{"internalType":"address","name":"debtDestination","type":"address"},{"internalType":"int256","name":"deltaCollateral","type":"int256"},{"internalType":"int256","name":"deltaDebt","type":"int256"}],"name":"modifySAFECollateralization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeDebtCeiling","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"safeRights","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"safes","outputs":[{"internalType":"uint256","name":"lockedCollateral","type":"uint256"},{"internalType":"uint256","name":"generatedDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"settleDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"}],"name":"tokenCollateral","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"transferCollateral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"rad","type":"uint256"}],"name":"transferInternalCoins","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"int256","name":"deltaCollateral","type":"int256"},{"internalType":"int256","name":"deltaDebt","type":"int256"}],"name":"transferSAFECollateralAndDebt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"address","name":"surplusDst","type":"address"},{"internalType":"int256","name":"rateMultiplier","type":"int256"}],"name":"updateAccumulatedRate","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b503360008181526020818152604091829020600190819055600019600755600b55815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a1604080516e73616665446562744365696c696e6760881b8152600019602082015281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a16123b7806100bf6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806350de215d11610104578063d07900bb116100a2578063efabcadc11610071578063efabcadc1461063b578063fabde80c14610671578063fd450fb714610697578063fe4f58901461069f576101da565b8063d07900bb14610576578063d49d7867146105c6578063d4b9311d146105ec578063d94d420814610615576101da565b80638543d5e0116100de5780638543d5e0146104f8578063894ba8331461050057806394f3f81d1461050857806399bec3151461052e576101da565b806350de215d1461046d5780635e412858146104af57806376e0b4ca146104cc576101da565b80632efcc8661161017c578063476bb6ef1161014b578063476bb6ef146103755780634a11825e146103b75780634e14a967146103e95780634e5111a614610431576101da565b80632efcc866146102fa57806335b28153146103025780633d4225041461032857806341b3a0d91461036d576101da565b80631b142820116101b85780631b142820146102795780631d2a783d146102af57806324ba5884146102b757806327a0bb33146102dd576101da565b806306eb54df146101df5780630e9e11d31461021f57806311005b0714610253575b600080fd5b61020d600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106c2565b60408051918252519081900360200190f35b6102516004803603606081101561023557600080fd5b508035906001600160a01b0360208201351690604001356106df565b005b61020d6004803603602081101561026957600080fd5b50356001600160a01b0316610866565b6102516004803603606081101561028f57600080fd5b506001600160a01b03813581169160208101359091169060400135610878565b61020d6109e8565b61020d600480360360208110156102cd57600080fd5b50356001600160a01b03166109ee565b610251600480360360208110156102f357600080fd5b5035610a00565b61020d610b03565b6102516004803603602081101561031857600080fd5b50356001600160a01b0316610b09565b6103546004803603604081101561033e57600080fd5b50803590602001356001600160a01b0316610bee565b6040805192835260208301919091528051918290030190f35b61020d610c12565b610251600480360360a081101561038b57600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135610c18565b610251600480360360608110156103cd57600080fd5b508035906001600160a01b036020820135169060400135610f68565b610251600480360360c08110156103ff57600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a0013561104f565b6102516004803603608081101561044757600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611215565b61049b6004803603604081101561048357600080fd5b506001600160a01b0381358116916020013516611346565b604080519115158252519081900360200190f35b610251600480360360208110156104c557600080fd5b5035611386565b61020d600480360360408110156104e257600080fd5b50803590602001356001600160a01b031661147b565b61020d611498565b61025161149e565b6102516004803603602081101561051e57600080fd5b50356001600160a01b031661151c565b610251600480360360c081101561054457600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a00135611600565b6105936004803603602081101561058c57600080fd5b5035611c46565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610251600480360360208110156105dc57600080fd5b50356001600160a01b0316611c7d565b6102516004803603606081101561060257600080fd5b5080359060208101359060400135611ce1565b6102516004803603602081101561062b57600080fd5b50356001600160a01b0316611eb0565b6102516004803603606081101561065157600080fd5b506001600160a01b03813581169160208101359091169060400135611f14565b61020d6004803603602081101561068757600080fd5b50356001600160a01b031661201d565b61020d61202f565b610251600480360360408110156106b557600080fd5b5080359060200135612035565b600160209081526000928352604080842090915290825290205481565b3360009081526020819052604090205460011461072d5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114610772576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6000838152600260205260409020600181015461078f908361214d565b600182015580546000906107a39084612182565b6001600160a01b0385166000908152600560205260409020549091506107c9908261214d565b6001600160a01b0385166000908152600560205260409020556008546107ef908261214d565b60088190556001600160a01b0385166000818152600560209081526040918290205482518a8152918201939093528082018790526060810192909252608082019290925290517f5b9f54db46fa62a65324e3e9cad8e6fa0deb965ce36134b30377d7edd3a8136f9181900360a00190a15050505050565b60066020526000908152604090205481565b336000908152602081905260409020546001146108c65760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020546108e990826121b0565b6001600160a01b0380851660009081526006602090815260408083209490945591851681526005909152205461091f90826121b0565b6001600160a01b03831660009081526005602052604090205560095461094590826121b0565b60095560085461095590826121b0565b60088190556001600160a01b038085166000818152600660209081526040808320549488168084526005835292819020546009548251958652928501939093528381018790526060840194909452608083019190915260a082015260c0810192909252517fede723541c3aae745504c3732f6a7161031353ddf05caba15d48b1edd35646b99181900360e00190a1505050565b60095481565b60006020819052908152604090205481565b33600081815260066020526040902054610a1a90836121c0565b6001600160a01b038216600090815260066020908152604080832093909355600590522054610a4990836121c0565b6001600160a01b038216600090815260056020526040902055600954610a6f90836121c0565b600955600854610a7f90836121c0565b60088190556001600160a01b0382166000818152600660209081526040808320546005835292819020546009548251958652928501889052848201939093526060840192909252608083015260a082019290925290517f11000f3497809a546a9de313df16f9ce615e1c65098ba758180e1cac823ed4159181900360c00190a15050565b600a5481565b33600090815260208190526040902054600114610b575760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114610b9c576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60036020908152600092835260408084209091529082529020805460019091015482565b600b5481565b60008581526003602090815260408083206001600160a01b0388811685529083528184209087168452818420898552600290935292208254610c5a90866121d0565b83556001830154610c6b90856121d0565b60018401558154610c7c908661214d565b82556001820154610c8d908561214d565b82600101819055506000610ca984600101548360010154612204565b90506000610cbf84600101548460010154612204565b9050610cdd610cce8a33611346565b610cd88a33611346565b612227565b610d27576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b610d3985600001548460020154612204565b821115610d8d576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d737263000000000000000000604482015290519081900360640190fd5b610d9f84600001548460020154612204565b811115610df3576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d647374000000000000000000604482015290519081900360640190fd5b610e0b8360040154831015866001015460001461222b565b610e52576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f647573742d73726360681b604482015290519081900360640190fd5b610e6a8360040154821015856001015460001461222b565b610eb1576040805162461bcd60e51b815260206004820152601360248201527214d05191515b99da5b994bd91d5cdd0b591cdd606a1b604482015290519081900360640190fd5b7f4b49cc19514005253f36d0517c21b92404f50cc0d9e0c070af00b96e296b08358a8a8a8a8a8a600001548b600101548b600001548c60010154604051808a8152602001896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a150505050505050505050565b33600090815260208190526040902054600114610fb65760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b60008381526004602090815260408083206001600160a01b0386168452909152902054610fe3908261214d565b60008481526004602090815260408083206001600160a01b038716808552908352928190209390935582518681529081019190915280820183905290517f488ac1e40bb6e5ee1f88b998568d1de4cb595e9ce0e0d4e4d4cc4c202053f1079181900360600190a1505050565b3360009081526020819052604090205460011461109d5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b60008681526003602090815260408083206001600160a01b03891684528252808320898452600290925290912081546110d6908561214d565b825560018201546110e7908461214d565b600183015580546110f8908461214d565b8155600181015460009061110c9085612182565b60008a81526004602090815260408083206001600160a01b038c16845290915290205490915061113c90866121d0565b60008a81526004602090815260408083206001600160a01b03808d16855290835281842094909455928916825260069052205461117990826121d0565b6001600160a01b03871660009081526006602052604090205560095461119f90826121d0565b6009819055604080518b81526001600160a01b03808c166020830152808b1682840152891660608201526080810188905260a0810187905260c0810192909252517f9bef7b734be54aaed05e906c2ccf923767f44a93d136b674e212ce858a6d031c9181900360e00190a1505050505050505050565b61121f8333611346565b611269576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b60008481526004602090815260408083206001600160a01b038716845290915290205461129690826121c0565b60008581526004602090815260408083206001600160a01b0388811685529252808320939093558416815220546112cd90826121b0565b60008581526004602090815260408083206001600160a01b038088168086529184529382902094909455805188815292871691830191909152818101929092526060810183905290517fb08760a077e71005cf3651212fdbd4028d6ebc8e1844c0475f36000f2756c0d79181900360800190a150505050565b6001600160a01b03828116600081815260016020818152604080842095871680855295909152822054919361137d9314911461222b565b90505b92915050565b336000908152602081905260409020546001146113d45760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600081815260026020526040902060010154156114225760405162461bcd60e51b815260040180806020018281038252602981526020018061230e6029913960400191505060405180910390fd5b6000818152600260209081526040918290206b033b2e3c9fd0803ce8000000600190910155815183815291517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359281900390910190a150565b600460209081526000928352604080842090915290825290205481565b60085481565b336000908152602081905260409020546001146114ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b6000600b8190556040517f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e9190a1565b3360009081526020819052604090205460011461156a5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b546001146115af576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b600b54600114611645576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b61164d61222f565b5060008681526003602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015261168d612249565b50600087815260026020818152604092839020835160c0810185528154815260018201549281018390529281015493830193909352600383015460608301526004830154608083015260059092015460a08201529061171d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612337602a913960400191505060405180910390fd5b8151611729908561214d565b8252602082015161173a908461214d565b6020830152805161174b908461214d565b8152602081015160009061175f9085612182565b9050600061177583602001518560200151612204565b90506117836008548361214d565b6008819055506117bf60008613156117ba85606001516117ab87600001518860200151612204565b1115600a546008541115612227565b61222b565b611810576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f6365696c696e672d65786365656465640000000000604482015290519081900360640190fd5b61183f61182560008713156000891215612227565b61183786600001518660400151612204565b83111561222b565b611886576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f6e6f742d7361666560681b604482015290519081900360640190fd5b6118a561189b60008713156000891215612227565b6117ba8b33611346565b6118e05760405162461bcd60e51b81526004018080602001828103825260258152602001806122806025913960400191505060405180910390fd5b6118f260008713156117ba8a33611346565b61192d5760405162461bcd60e51b81526004018080602001828103825260258152602001806122e96025913960400191505060405180910390fd5b61193f60008612156117ba8933611346565b611990576040805162461bcd60e51b815260206004820152601f60248201527f53414645456e67696e652f6e6f742d616c6c6f7765642d646562742d64737400604482015290519081900360640190fd5b6119a88460200151600014846080015183101561222b565b6119eb576040805162461bcd60e51b815260206004820152600f60248201526e14d05191515b99da5b994bd91d5cdd608a1b604482015290519081900360640190fd5b6000851315611a4f5760075484602001511115611a4f576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f61626f76652d646562742d6c696d69740000000000604482015290519081900360640190fd5b60008a81526004602090815260408083206001600160a01b038c168452909152902054611a7c90876121d0565b60008b81526004602090815260408083206001600160a01b03808e16855290835281842094909455928a168252600590522054611ab9908361214d565b60056000896001600160a01b03166001600160a01b031681526020019081526020016000208190555083600360008c815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015590505082600260008c8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050507f182725621f9c0d485fb256f86699c82616bd6e4670325087fd08f643cab7d9178a8a8a8a8a8a8a600001518b60200151600854604051808a8152602001896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a150505050505050505050565b6002602081905260009182526040909120805460018201549282015460038301546004840154600590940154929493919290919086565b3360008181526001602090815260408083206001600160a01b0386168085529083528184209390935580519384529083019190915280517fb1b0368dbc2a1d366ba32be3f455812a3db862c3f52fd3434020a262442b1bb09281900390910190a150565b33600090815260208190526040902054600114611d2f5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114611d74576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b816a736166657479507269636560a81b1415611da457600083815260026020819052604090912001819055611e6b565b816f6c69717569646174696f6e507269636560801b1415611dd8576000838152600260205260409020600501819055611e6b565b816a646562744365696c696e6760a81b1415611e07576000838152600260205260409020600301819055611e6b565b81683232b13a233637b7b960b91b1415611e34576000838152600260205260409020600401819055611e6b565b60405162461bcd60e51b81526004018080602001828103825260248152602001806122c56024913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b3360008181526001602081815260408084206001600160a01b0387168086529083529381902092909255815193845283019190915280517ff7db8b086d1ab5e5802059364bff5428c7622c6d4623f9780947306d492770539281900390910190a150565b611f1e8333611346565b611f68576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260056020526040902054611f8b90826121c0565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611fba90826121b0565b6001600160a01b0380841660008181526005602090815260409182902094909455805192871683529282015280820183905290517f4cd53b0b754082a31f5a6f3dc965c36d1d901c309830e0b4c17949aff97f0b149181900360600190a1505050565b60056020526000908152604090205481565b60075481565b336000908152602081905260409020546001146120835760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b546001146120c8576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b8170676c6f62616c446562744365696c696e6760781b14156120ee57600a81905561210e565b816e73616665446562744365696c696e6760881b1415611e345760078190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b8181016000821215806121605750828111155b61216957600080fd5b6000821315806121795750828110155b61138057600080fd5b818102600083121561219357600080fd5b8115806121795750828282816121a557fe5b051461138057600080fd5b8082018281101561138057600080fd5b8082038281111561138057600080fd5b8082036000821315806121e35750828111155b6121ec57600080fd5b60008212158061217957508281101561138057600080fd5b60008115806121795750508082028282828161221c57fe5b041461138057600080fd5b1690565b1790565b604051806040016040528060008152602001600081525090565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe53414645456e67696e652f6e6f742d616c6c6f7765642d746f2d6d6f646966792d7361666553414645456e67696e652f636f6e74726163742d6e6f742d656e61626c65640053414645456e67696e652f6d6f646966792d756e7265636f676e697a65642d706172616d53414645456e67696e652f6e6f742d616c6c6f7765642d636f6c6c61746572616c2d73726353414645456e67696e652f636f6c6c61746572616c2d747970652d616c72656164792d65786973747353414645456e67696e652f636f6c6c61746572616c2d747970652d6e6f742d696e697469616c697a656453414645456e67696e652f6163636f756e742d6e6f742d617574686f72697a6564a264697066735822122019acaf0b758e88d7398641f8e6524b72e4cc129cbad4170247a0f607b8938f9664736f6c63430006070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806350de215d11610104578063d07900bb116100a2578063efabcadc11610071578063efabcadc1461063b578063fabde80c14610671578063fd450fb714610697578063fe4f58901461069f576101da565b8063d07900bb14610576578063d49d7867146105c6578063d4b9311d146105ec578063d94d420814610615576101da565b80638543d5e0116100de5780638543d5e0146104f8578063894ba8331461050057806394f3f81d1461050857806399bec3151461052e576101da565b806350de215d1461046d5780635e412858146104af57806376e0b4ca146104cc576101da565b80632efcc8661161017c578063476bb6ef1161014b578063476bb6ef146103755780634a11825e146103b75780634e14a967146103e95780634e5111a614610431576101da565b80632efcc866146102fa57806335b28153146103025780633d4225041461032857806341b3a0d91461036d576101da565b80631b142820116101b85780631b142820146102795780631d2a783d146102af57806324ba5884146102b757806327a0bb33146102dd576101da565b806306eb54df146101df5780630e9e11d31461021f57806311005b0714610253575b600080fd5b61020d600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106c2565b60408051918252519081900360200190f35b6102516004803603606081101561023557600080fd5b508035906001600160a01b0360208201351690604001356106df565b005b61020d6004803603602081101561026957600080fd5b50356001600160a01b0316610866565b6102516004803603606081101561028f57600080fd5b506001600160a01b03813581169160208101359091169060400135610878565b61020d6109e8565b61020d600480360360208110156102cd57600080fd5b50356001600160a01b03166109ee565b610251600480360360208110156102f357600080fd5b5035610a00565b61020d610b03565b6102516004803603602081101561031857600080fd5b50356001600160a01b0316610b09565b6103546004803603604081101561033e57600080fd5b50803590602001356001600160a01b0316610bee565b6040805192835260208301919091528051918290030190f35b61020d610c12565b610251600480360360a081101561038b57600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135610c18565b610251600480360360608110156103cd57600080fd5b508035906001600160a01b036020820135169060400135610f68565b610251600480360360c08110156103ff57600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a0013561104f565b6102516004803603608081101561044757600080fd5b508035906001600160a01b03602082013581169160408101359091169060600135611215565b61049b6004803603604081101561048357600080fd5b506001600160a01b0381358116916020013516611346565b604080519115158252519081900360200190f35b610251600480360360208110156104c557600080fd5b5035611386565b61020d600480360360408110156104e257600080fd5b50803590602001356001600160a01b031661147b565b61020d611498565b61025161149e565b6102516004803603602081101561051e57600080fd5b50356001600160a01b031661151c565b610251600480360360c081101561054457600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a00135611600565b6105936004803603602081101561058c57600080fd5b5035611c46565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610251600480360360208110156105dc57600080fd5b50356001600160a01b0316611c7d565b6102516004803603606081101561060257600080fd5b5080359060208101359060400135611ce1565b6102516004803603602081101561062b57600080fd5b50356001600160a01b0316611eb0565b6102516004803603606081101561065157600080fd5b506001600160a01b03813581169160208101359091169060400135611f14565b61020d6004803603602081101561068757600080fd5b50356001600160a01b031661201d565b61020d61202f565b610251600480360360408110156106b557600080fd5b5080359060200135612035565b600160209081526000928352604080842090915290825290205481565b3360009081526020819052604090205460011461072d5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114610772576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6000838152600260205260409020600181015461078f908361214d565b600182015580546000906107a39084612182565b6001600160a01b0385166000908152600560205260409020549091506107c9908261214d565b6001600160a01b0385166000908152600560205260409020556008546107ef908261214d565b60088190556001600160a01b0385166000818152600560209081526040918290205482518a8152918201939093528082018790526060810192909252608082019290925290517f5b9f54db46fa62a65324e3e9cad8e6fa0deb965ce36134b30377d7edd3a8136f9181900360a00190a15050505050565b60066020526000908152604090205481565b336000908152602081905260409020546001146108c65760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020546108e990826121b0565b6001600160a01b0380851660009081526006602090815260408083209490945591851681526005909152205461091f90826121b0565b6001600160a01b03831660009081526005602052604090205560095461094590826121b0565b60095560085461095590826121b0565b60088190556001600160a01b038085166000818152600660209081526040808320549488168084526005835292819020546009548251958652928501939093528381018790526060840194909452608083019190915260a082015260c0810192909252517fede723541c3aae745504c3732f6a7161031353ddf05caba15d48b1edd35646b99181900360e00190a1505050565b60095481565b60006020819052908152604090205481565b33600081815260066020526040902054610a1a90836121c0565b6001600160a01b038216600090815260066020908152604080832093909355600590522054610a4990836121c0565b6001600160a01b038216600090815260056020526040902055600954610a6f90836121c0565b600955600854610a7f90836121c0565b60088190556001600160a01b0382166000818152600660209081526040808320546005835292819020546009548251958652928501889052848201939093526060840192909252608083015260a082019290925290517f11000f3497809a546a9de313df16f9ce615e1c65098ba758180e1cac823ed4159181900360c00190a15050565b600a5481565b33600090815260208190526040902054600114610b575760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114610b9c576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60036020908152600092835260408084209091529082529020805460019091015482565b600b5481565b60008581526003602090815260408083206001600160a01b0388811685529083528184209087168452818420898552600290935292208254610c5a90866121d0565b83556001830154610c6b90856121d0565b60018401558154610c7c908661214d565b82556001820154610c8d908561214d565b82600101819055506000610ca984600101548360010154612204565b90506000610cbf84600101548460010154612204565b9050610cdd610cce8a33611346565b610cd88a33611346565b612227565b610d27576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b610d3985600001548460020154612204565b821115610d8d576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d737263000000000000000000604482015290519081900360640190fd5b610d9f84600001548460020154612204565b811115610df3576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d647374000000000000000000604482015290519081900360640190fd5b610e0b8360040154831015866001015460001461222b565b610e52576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f647573742d73726360681b604482015290519081900360640190fd5b610e6a8360040154821015856001015460001461222b565b610eb1576040805162461bcd60e51b815260206004820152601360248201527214d05191515b99da5b994bd91d5cdd0b591cdd606a1b604482015290519081900360640190fd5b7f4b49cc19514005253f36d0517c21b92404f50cc0d9e0c070af00b96e296b08358a8a8a8a8a8a600001548b600101548b600001548c60010154604051808a8152602001896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001878152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a150505050505050505050565b33600090815260208190526040902054600114610fb65760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b60008381526004602090815260408083206001600160a01b0386168452909152902054610fe3908261214d565b60008481526004602090815260408083206001600160a01b038716808552908352928190209390935582518681529081019190915280820183905290517f488ac1e40bb6e5ee1f88b998568d1de4cb595e9ce0e0d4e4d4cc4c202053f1079181900360600190a1505050565b3360009081526020819052604090205460011461109d5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b60008681526003602090815260408083206001600160a01b03891684528252808320898452600290925290912081546110d6908561214d565b825560018201546110e7908461214d565b600183015580546110f8908461214d565b8155600181015460009061110c9085612182565b60008a81526004602090815260408083206001600160a01b038c16845290915290205490915061113c90866121d0565b60008a81526004602090815260408083206001600160a01b03808d16855290835281842094909455928916825260069052205461117990826121d0565b6001600160a01b03871660009081526006602052604090205560095461119f90826121d0565b6009819055604080518b81526001600160a01b03808c166020830152808b1682840152891660608201526080810188905260a0810187905260c0810192909252517f9bef7b734be54aaed05e906c2ccf923767f44a93d136b674e212ce858a6d031c9181900360e00190a1505050505050505050565b61121f8333611346565b611269576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b60008481526004602090815260408083206001600160a01b038716845290915290205461129690826121c0565b60008581526004602090815260408083206001600160a01b0388811685529252808320939093558416815220546112cd90826121b0565b60008581526004602090815260408083206001600160a01b038088168086529184529382902094909455805188815292871691830191909152818101929092526060810183905290517fb08760a077e71005cf3651212fdbd4028d6ebc8e1844c0475f36000f2756c0d79181900360800190a150505050565b6001600160a01b03828116600081815260016020818152604080842095871680855295909152822054919361137d9314911461222b565b90505b92915050565b336000908152602081905260409020546001146113d45760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600081815260026020526040902060010154156114225760405162461bcd60e51b815260040180806020018281038252602981526020018061230e6029913960400191505060405180910390fd5b6000818152600260209081526040918290206b033b2e3c9fd0803ce8000000600190910155815183815291517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359281900390910190a150565b600460209081526000928352604080842090915290825290205481565b60085481565b336000908152602081905260409020546001146114ec5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b6000600b8190556040517f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e9190a1565b3360009081526020819052604090205460011461156a5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b546001146115af576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b600b54600114611645576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b61164d61222f565b5060008681526003602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015261168d612249565b50600087815260026020818152604092839020835160c0810185528154815260018201549281018390529281015493830193909352600383015460608301526004830154608083015260059092015460a08201529061171d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612337602a913960400191505060405180910390fd5b8151611729908561214d565b8252602082015161173a908461214d565b6020830152805161174b908461214d565b8152602081015160009061175f9085612182565b9050600061177583602001518560200151612204565b90506117836008548361214d565b6008819055506117bf60008613156117ba85606001516117ab87600001518860200151612204565b1115600a546008541115612227565b61222b565b611810576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f6365696c696e672d65786365656465640000000000604482015290519081900360640190fd5b61183f61182560008713156000891215612227565b61183786600001518660400151612204565b83111561222b565b611886576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f6e6f742d7361666560681b604482015290519081900360640190fd5b6118a561189b60008713156000891215612227565b6117ba8b33611346565b6118e05760405162461bcd60e51b81526004018080602001828103825260258152602001806122806025913960400191505060405180910390fd5b6118f260008713156117ba8a33611346565b61192d5760405162461bcd60e51b81526004018080602001828103825260258152602001806122e96025913960400191505060405180910390fd5b61193f60008612156117ba8933611346565b611990576040805162461bcd60e51b815260206004820152601f60248201527f53414645456e67696e652f6e6f742d616c6c6f7765642d646562742d64737400604482015290519081900360640190fd5b6119a88460200151600014846080015183101561222b565b6119eb576040805162461bcd60e51b815260206004820152600f60248201526e14d05191515b99da5b994bd91d5cdd608a1b604482015290519081900360640190fd5b6000851315611a4f5760075484602001511115611a4f576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f61626f76652d646562742d6c696d69740000000000604482015290519081900360640190fd5b60008a81526004602090815260408083206001600160a01b038c168452909152902054611a7c90876121d0565b60008b81526004602090815260408083206001600160a01b03808e16855290835281842094909455928a168252600590522054611ab9908361214d565b60056000896001600160a01b03166001600160a01b031681526020019081526020016000208190555083600360008c815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015590505082600260008c8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a082015181600501559050507f182725621f9c0d485fb256f86699c82616bd6e4670325087fd08f643cab7d9178a8a8a8a8a8a8a600001518b60200151600854604051808a8152602001896001600160a01b03166001600160a01b03168152602001886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b03168152602001868152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a150505050505050505050565b6002602081905260009182526040909120805460018201549282015460038301546004840154600590940154929493919290919086565b3360008181526001602090815260408083206001600160a01b0386168085529083528184209390935580519384529083019190915280517fb1b0368dbc2a1d366ba32be3f455812a3db862c3f52fd3434020a262442b1bb09281900390910190a150565b33600090815260208190526040902054600114611d2f5760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b54600114611d74576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b816a736166657479507269636560a81b1415611da457600083815260026020819052604090912001819055611e6b565b816f6c69717569646174696f6e507269636560801b1415611dd8576000838152600260205260409020600501819055611e6b565b816a646562744365696c696e6760a81b1415611e07576000838152600260205260409020600301819055611e6b565b81683232b13a233637b7b960b91b1415611e34576000838152600260205260409020600401819055611e6b565b60405162461bcd60e51b81526004018080602001828103825260248152602001806122c56024913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b3360008181526001602081815260408084206001600160a01b0387168086529083529381902092909255815193845283019190915280517ff7db8b086d1ab5e5802059364bff5428c7622c6d4623f9780947306d492770539281900390910190a150565b611f1e8333611346565b611f68576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260056020526040902054611f8b90826121c0565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611fba90826121b0565b6001600160a01b0380841660008181526005602090815260409182902094909455805192871683529282015280820183905290517f4cd53b0b754082a31f5a6f3dc965c36d1d901c309830e0b4c17949aff97f0b149181900360600190a1505050565b60056020526000908152604090205481565b60075481565b336000908152602081905260409020546001146120835760405162461bcd60e51b81526004018080602001828103825260218152602001806123616021913960400191505060405180910390fd5b600b546001146120c8576040805162461bcd60e51b815260206004820152601f60248201526000805160206122a5833981519152604482015290519081900360640190fd5b8170676c6f62616c446562744365696c696e6760781b14156120ee57600a81905561210e565b816e73616665446562744365696c696e6760881b1415611e345760078190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b8181016000821215806121605750828111155b61216957600080fd5b6000821315806121795750828110155b61138057600080fd5b818102600083121561219357600080fd5b8115806121795750828282816121a557fe5b051461138057600080fd5b8082018281101561138057600080fd5b8082038281111561138057600080fd5b8082036000821315806121e35750828111155b6121ec57600080fd5b60008212158061217957508281101561138057600080fd5b60008115806121795750508082028282828161221c57fe5b041461138057600080fd5b1690565b1790565b604051806040016040528060008152602001600081525090565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe53414645456e67696e652f6e6f742d616c6c6f7765642d746f2d6d6f646966792d7361666553414645456e67696e652f636f6e74726163742d6e6f742d656e61626c65640053414645456e67696e652f6d6f646966792d756e7265636f676e697a65642d706172616d53414645456e67696e652f6e6f742d616c6c6f7765642d636f6c6c61746572616c2d73726353414645456e67696e652f636f6c6c61746572616c2d747970652d616c72656164792d65786973747353414645456e67696e652f636f6c6c61746572616c2d747970652d6e6f742d696e697469616c697a656453414645456e67696e652f6163636f756e742d6e6f742d617574686f72697a6564a264697066735822122019acaf0b758e88d7398641f8e6524b72e4cc129cbad4170247a0f607b8938f9664736f6c63430006070033

Deployed Bytecode Sourcemap

803:24084:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;803:24084:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1894:63:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;1894:63:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23975:909;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;23975:909:0;;;-1:-1:-1;;;;;23975:909:0;;;;;;;;;;:::i;:::-;;4404:66;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4404:66:0;-1:-1:-1;;;;;4404:66:0;;:::i;22758:735::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;22758:735:0;;;;;;;;;;;;;;;;;:::i;4762:34::-;;;:::i;851:51::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;851:51:0;-1:-1:-1;;;;;851:51:0;;:::i;21940:476::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;21940:476:0;;:::i;4863:33::-;;;:::i;1012:231::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1012:231:0;-1:-1:-1;;;;;1012:231:0;;:::i;3970:60::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3970:60:0;;;;;;-1:-1:-1;;;;;3970:60:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4983:31;;;:::i;17719:1996::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;17719:1996:0;;;-1:-1:-1;;;;;17719:1996:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;11334:328::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11334:328:0;;;-1:-1:-1;;;;;11334:328:0;;;;;;;;;;:::i;20316:1446::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;20316:1446:0;;;-1:-1:-1;;;;;20316:1446:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;11928:494::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;11928:494:0;;;-1:-1:-1;;;;;11928:494:0;;;;;;;;;;;;;;;;;;;:::i;2676:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;2676:162:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;8923:330;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;8923:330:0;;:::i;4077:70::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4077:70:0;;;;;;-1:-1:-1;;;;;4077:70:0;;:::i;4659:26::-;;;:::i;10935:120::-;;;:::i;1362:237::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1362:237:0;-1:-1:-1;;;;;1362:237:0;;:::i;13788:3479::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;13788:3479:0;;;-1:-1:-1;;;;;13788:3479:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3864:70::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3864:70:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2413:167;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2413:167:0;-1:-1:-1;;;;;2413:167:0;;:::i;10096:739::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10096:739:0;;;;;;;;;;;;:::i;2094:173::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2094:173:0;-1:-1:-1;;;;;2094:173:0;;:::i;12652:337::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;12652:337:0;;;;;;;;;;;;;;;;;:::i;4205:66::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4205:66:0;-1:-1:-1;;;;;4205:66:0;;:::i;4554:30::-;;;:::i;9428:419::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9428:419:0;;;;;;;:::i;1894:63::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;23975:909::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24145:15:::1;;24164:1;24145:20;24137:64;;;::::0;;-1:-1:-1;;;24137:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;24137:64:0;;;;;;;;;;;;;::::1;;24212:38;24253:31:::0;;;:15:::1;:31;::::0;;;;24345::::1;::::0;::::1;::::0;24336:57:::1;::::0;24378:14;24336:8:::1;:57::i;:::-;24295:31;::::0;::::1;:98:::0;24454:26;;24404:16:::1;::::0;24445:52:::1;::::0;24482:14;24445:8:::1;:52::i;:::-;-1:-1:-1::0;;;;;24558:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;24404:93;;-1:-1:-1;24549:47:0::1;::::0;24404:93;24549:8:::1;:47::i;:::-;-1:-1:-1::0;;;;;24508:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;:88;24657:10:::1;::::0;24648:34:::1;::::0;24669:12;24648:8:::1;:34::i;:::-;24607:10;:75:::0;;;-1:-1:-1;;;;;24817:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;;;24698:178;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;1817:1;;23975:909:::0;;;:::o;4404:66::-;;;;;;;;;;;;;:::o;22758:735::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22954:28:0;::::1;;::::0;;;:11:::1;:28;::::0;;;;;22945:43:::1;::::0;22984:3;22945:8:::1;:43::i;:::-;-1:-1:-1::0;;;;;22913:28:0;;::::1;;::::0;;;:11:::1;:28;::::0;;;;;;;:75;;;;23040:28;;::::1;::::0;;:11:::1;:28:::0;;;;;23031:43:::1;::::0;23070:3;23031:8:::1;:43::i;:::-;-1:-1:-1::0;;;;;22999:28:0;::::1;;::::0;;;:11:::1;:28;::::0;;;;:75;23126:18:::1;::::0;23117:33:::1;::::0;23146:3;23117:8:::1;:33::i;:::-;23085:18;:65:::0;23202:10:::1;::::0;23193:25:::1;::::0;23214:3;23193:8:::1;:25::i;:::-;23161:10;:57:::0;;;-1:-1:-1;;;;;23345:28:0;;::::1;;::::0;;;:11:::1;:28;::::0;;;;;;;;23388;;::::1;::::0;;;:11:::1;:28:::0;;;;;;;23431:18:::1;::::0;23234:251;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;22758:735:::0;;;:::o;4762:34::-;;;;:::o;851:51::-;;;;;;;;;;;;;;:::o;21940:476::-;22014:10;21990:15;22068:20;;;:11;:20;;;;;;22059:35;;22090:3;22059:8;:35::i;:::-;-1:-1:-1;;;;;22035:20:0;;;;;;:11;:20;;;;;;;;:59;;;;22138:11;:20;;;;22129:35;;22160:3;22129:8;:35::i;:::-;-1:-1:-1;;;;;22105:20:0;;;;;;:11;:20;;;;;:59;22208:18;;22199:33;;22228:3;22199:8;:33::i;:::-;22175:18;:57;22276:10;;22267:25;;22288:3;22267:8;:25::i;:::-;22243:10;:49;;;-1:-1:-1;;;;;22333:20:0;;;;;;:11;:20;;;;;;;;;22355:11;:20;;;;;;;22377:18;;22308:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21940:476;;:::o;4863:33::-;;;;:::o;1012:231::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1096:15:::1;;1115:1;1096:20;1088:64;;;::::0;;-1:-1:-1;;;1088:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;1088:64:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1163:27:0;::::1;:18;:27:::0;;;::::1;::::0;;;;;;;;1193:1:::1;1163:31:::0;;1210:25;;;;;;;::::1;::::0;;;;;;;;::::1;1012:231:::0;:::o;3970:60::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4983:31::-;;;;:::o;17719:1996::-;17916:20;17939:21;;;:5;:21;;;;;;;;-1:-1:-1;;;;;17939:26:0;;;;;;;;;;;17999;;;;;;;;18077:31;;;:15;:31;;;;;18157:24;;18148:51;;18183:15;18148:8;:51::i;:::-;18121:78;;18246:21;;;;18237:42;;18269:9;18237:8;:42::i;:::-;18210:21;;;:69;18326:24;;18317:51;;18352:15;18317:8;:51::i;:::-;18290:78;;18415:21;;;;18406:42;;18438:9;18406:8;:42::i;:::-;18379:7;:21;;:69;;;;18461:23;18487:64;18496:7;:21;;;18519:15;:31;;;18487:8;:64::i;:::-;18461:90;;18562:23;18588:64;18597:7;:21;;;18620:15;:31;;;18588:8;:64::i;:::-;18562:90;;18704:68;18709:30;18723:3;18728:10;18709:13;:30::i;:::-;18741;18755:3;18760:10;18741:13;:30::i;:::-;18704:4;:68::i;:::-;18696:103;;;;;-1:-1:-1;;;18696:103:0;;;;;;;;;;;;-1:-1:-1;;;18696:103:0;;;;;;;;;;;;;;;18870:63;18879:7;:24;;;18905:15;:27;;;18870:8;:63::i;:::-;18848:18;:85;;18840:121;;;;;-1:-1:-1;;;18840:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19002:63;19011:7;:24;;;19037:15;:27;;;19002:8;:63::i;:::-;18980:18;:85;;18972:121;;;;;-1:-1:-1;;;18972:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19147:83;19176:15;:25;;;19154:18;:47;;19203:7;:21;;;19228:1;19203:26;19147:6;:83::i;:::-;19139:115;;;;;-1:-1:-1;;;19139:115:0;;;;;;;;;;;;-1:-1:-1;;;19139:115:0;;;;;;;;;;;;;;;19273:83;19302:15;:25;;;19280:18;:47;;19329:7;:21;;;19354:1;19329:26;19273:6;:83::i;:::-;19265:115;;;;;-1:-1:-1;;;19265:115:0;;;;;;;;;;;;-1:-1:-1;;;19265:115:0;;;;;;;;;;;;;;;19398:309;19442:14;19471:3;19489;19507:15;19537:9;19561:7;:24;;;19600:7;:21;;;19636:7;:24;;;19675:7;:21;;;19398:309;;;;;;;;;-1:-1:-1;;;;;19398:309:0;-1:-1:-1;;;;;19398:309:0;;;;;;-1:-1:-1;;;;;19398:309:0;-1:-1:-1;;;;;19398:309:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17719:1996;;;;;;;;;;:::o;11334:328::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11539:31:::1;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;11539:40:0;::::1;::::0;;;;;;;;11530:55:::1;::::0;11581:3;11530:8:::1;:55::i;:::-;11487:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;11487:40:0;::::1;::::0;;;;;;;;;;:98;;;;11601:53;;;;;;;::::1;::::0;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;11334:328:::0;;;:::o;20316:1446::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20583:18:::1;20604:21:::0;;;:5:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;20604:27:0;::::1;::::0;;;;;;;20683:31;;;:15:::1;:31:::0;;;;;;20761:22;;20752:49:::1;::::0;20785:15;20752:8:::1;:49::i;:::-;20727:74:::0;;20843:19:::1;::::0;::::1;::::0;20834:40:::1;::::0;20864:9;20834:8:::1;:40::i;:::-;20812:19;::::0;::::1;:62:::0;20923:26;;20914:47:::1;::::0;20951:9;20914:8:::1;:47::i;:::-;20885:76:::0;;21010:31:::1;::::0;::::1;::::0;20885:26:::1;::::0;21001:52:::1;::::0;21043:9;21001:8:::1;:52::i;:::-;21145:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;21145:55:0;::::1;::::0;;;;;;;;20974:79;;-1:-1:-1;21124:115:0::1;::::0;21213:15;21124:8:::1;:115::i;:::-;21066:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;21066:55:0;;::::1;::::0;;;;;;;;:173;;;;21303:29;;::::1;::::0;;:11:::1;:29:::0;;;;21282:94:::1;::::0;21345:20;21282:8:::1;:94::i;:::-;-1:-1:-1::0;;;;;21250:29:0;::::1;;::::0;;;:11:::1;:29;::::0;;;;:126;21429:18:::1;::::0;21408:83:::1;::::0;21460:20;21408:8:::1;:83::i;:::-;21387:18;:104:::0;;;21509:245:::1;::::0;;;;;-1:-1:-1;;;;;21509:245:0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;1817:1;;;20316:1446:::0;;;;;;:::o;11928:494::-;12090:30;12104:3;12109:10;12090:13;:30::i;:::-;12082:65;;;;;-1:-1:-1;;;12082:65:0;;;;;;;;;;;;-1:-1:-1;;;12082:65:0;;;;;;;;;;;;;;;12206:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;12206:36:0;;;;;;;;;;12197:51;;12244:3;12197:8;:51::i;:::-;12158:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;12158:36:0;;;;;;;;;;:90;;;;12307:36;;;;;;12298:51;;12345:3;12298:8;:51::i;:::-;12259:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;12259:36:0;;;;;;;;;;;;;:90;;;;12365:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11928:494;;;;:::o;2676:162::-;-1:-1:-1;;;;;2782:15:0;;;2751:4;2799:16;;;:10;:16;;;;;;;;2782:15;;;2799:25;;;;;;;;;;2751:4;;2775:55;;2782:15;;2799:30;2775:6;:55::i;:::-;2768:62;;2676:162;;;;;:::o;8923:330::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9022:31:::1;::::0;;;:15:::1;:31;::::0;;;;:47:::1;;::::0;:52;9014:106:::1;;;;-1:-1:-1::0;;;9014:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9131:31;::::0;;;:15:::1;:31;::::0;;;;;;;;9181:8:::1;9131:47;::::0;;::::1;:58:::0;9205:40;;;;;;;::::1;::::0;;;;;;;;::::1;8923:330:::0;:::o;4077:70::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;4659:26::-;;;;:::o;10935:120::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11013:1:::1;10995:15;:19:::0;;;11030:17:::1;::::0;::::1;::::0;11013:1;11030:17:::1;10935:120::o:0;1362:237::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1449:15:::1;;1468:1;1449:20;1441:64;;;::::0;;-1:-1:-1;;;1441:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;1441:64:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1516:27:0;::::1;1546:1;1516:27:::0;;;::::1;::::0;;;;;;;:31;;;;1563:28;;;;;;;::::1;::::0;;;;;;;;::::1;1362:237:::0;:::o;13788:3479::-;14066:15;;14085:1;14066:20;14058:64;;;;;-1:-1:-1;;;14058:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14058:64:0;;;;;;;;;;;;;;;14135:20;;:::i;:::-;-1:-1:-1;14158:21:0;;;;:5;:21;;;;;;;;-1:-1:-1;;;;;14158:27:0;;;;;;;;;;14135:50;;;;;;;;;;;;;;;;;;;14196:40;;:::i;:::-;-1:-1:-1;14239:31:0;;;;:15;:31;;;;;;;;;14196:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14330:94;;;;-1:-1:-1;;;14330:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14479:25;;14470:52;;14506:15;14470:8;:52::i;:::-;14437:85;;14575:22;;;;14566:43;;14599:9;14566:8;:43::i;:::-;14533:22;;;:76;14662:29;;14653:50;;14693:9;14653:8;:50::i;:::-;14620:83;;14749:34;;;;14620:29;;14740:55;;14785:9;14740:8;:55::i;:::-;14716:79;;14806:20;14830:68;14839:18;:34;;;14875:8;:22;;;14830:8;:68::i;:::-;14806:92;;14933:39;14942:10;;14954:17;14933:8;:39::i;:::-;14909:10;:63;;;;15078:228;15112:1;15099:9;:14;;15128:163;15212:18;:30;;;15133:75;15142:18;:29;;;15173:18;:34;;;15133:8;:75::i;:::-;:109;;15273:17;;15259:10;;:31;;15128:4;:163::i;:::-;15078:6;:228::i;:::-;15058:301;;;;;-1:-1:-1;;;15058:301:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15455:177;15476:42;15494:1;15481:9;:14;;15516:1;15497:15;:20;;15476:4;:42::i;:::-;15552:67;15561:8;:25;;;15588:18;:30;;;15552:8;:67::i;:::-;15533:15;:86;;15455:6;:177::i;:::-;15435:242;;;;;-1:-1:-1;;;15435:242:0;;;;;;;;;;;;-1:-1:-1;;;15435:242:0;;;;;;;;;;;;;;;15758:83;15765:42;15783:1;15770:9;:14;;15805:1;15786:15;:20;;15765:4;:42::i;:::-;15809:31;15823:4;15829:10;15809:13;:31::i;15758:83::-;15750:133;;;;-1:-1:-1;;;15750:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15938:73;15964:1;15945:15;:20;;15967:43;15981:16;15999:10;15967:13;:43::i;15938:73::-;15930:123;;;;-1:-1:-1;;;15930:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16102:66;16122:1;16109:9;:14;;16125:42;16139:15;16156:10;16125:13;:42::i;16102:66::-;16094:110;;;;;-1:-1:-1;;;16094:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16277:84;16284:8;:22;;;16310:1;16284:27;16332:18;:28;;;16313:15;:47;;16277:6;:84::i;:::-;16269:112;;;;;-1:-1:-1;;;16269:112:0;;;;;;;;;;;;-1:-1:-1;;;16269:112:0;;;;;;;;;;;;;;;16463:1;16451:9;:13;16447:125;;;16513:15;;16487:8;:22;;;:41;;16479:81;;;;;-1:-1:-1;;;16479:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16656:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;16656:49:0;;;;;;;;;;16647:76;;16707:15;16647:8;:76::i;:::-;16584:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;16584:49:0;;;;;;;;;;;:139;;;;16776:28;;;;;:11;:28;;;;16767:57;;16806:17;16767:8;:57::i;:::-;16736:11;:28;16748:15;-1:-1:-1;;;;;16736:28:0;-1:-1:-1;;;;;16736:28:0;;;;;;;;;;;;:88;;;;16867:8;16837:5;:21;16843:14;16837:21;;;;;;;;;;;:27;16859:4;-1:-1:-1;;;;;16837:27:0;-1:-1:-1;;;;;16837:27:0;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;16920:18;16886:15;:31;16902:14;16886:31;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16956:303;16998:14;17027:4;17046:16;17077:15;17107;17137:9;17161:8;:25;;;17201:8;:22;;;17238:10;;16956:303;;;;;;;;;-1:-1:-1;;;;;16956:303:0;-1:-1:-1;;;;;16956:303:0;;;;;;-1:-1:-1;;;;;16956:303:0;-1:-1:-1;;;;;16956:303:0;;;;;;-1:-1:-1;;;;;16956:303:0;-1:-1:-1;;;;;16956:303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13788:3479;;;;;;;;;;:::o;3864:70::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2413:167::-;2491:10;2514:1;2480:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;2480:31:0;;;;;;;;;;;:35;;;;2531:41;;;;;;;;;;;;;;;;;;;;;;;;2413:167;:::o;10096:739::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10251:15:::1;;10270:1;10251:20;10243:64;;;::::0;;-1:-1:-1;;;10243:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;10243:64:0;;;;;;;;;;;;;::::1;;10322:9;-1:-1:-1::0;;;10322:26:0::1;10318:444;;;10350:31;::::0;;;:15:::1;:31;::::0;;;;;;;:43:::1;:50:::0;;;10318:444:::1;;;10420:9;-1:-1:-1::0;;;10420:31:0::1;10416:346;;;10453:31;::::0;;;:15:::1;:31;::::0;;;;:48:::1;;:55:::0;;;10416:346:::1;;;10528:9;-1:-1:-1::0;;;10528:26:0::1;10524:238;;;10556:31;::::0;;;:15:::1;:31;::::0;;;;:43:::1;;:50:::0;;;10524:238:::1;;;10626:9;-1:-1:-1::0;;;10626:24:0::1;10622:140;;;10652:31;::::0;;;:15:::1;:31;::::0;;;;:41:::1;;:48:::0;;;10622:140:::1;;;10716:46;;-1:-1:-1::0;;;10716:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10622:140;10778:49;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;10096:739:::0;;;:::o;2094:173::-;2175:10;2164:22;;;;2198:1;2164:22;;;;;;;;-1:-1:-1;;;;;2164:31:0;;;;;;;;;;;;:35;;;;2215:44;;;;;;;;;;;;;;;;;;;;;;;2094:173;:::o;12652:337::-;12750:30;12764:3;12769:10;12750:13;:30::i;:::-;12742:65;;;;;-1:-1:-1;;;12742:65:0;;;;;;;;;;;;-1:-1:-1;;;12742:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;12846:16:0;;;;;;:11;:16;;;;;;12837:31;;12864:3;12837:8;:31::i;:::-;-1:-1:-1;;;;;12818:16:0;;;;;;;:11;:16;;;;;;:50;;;;12907:16;;;;;;;12898:31;;12925:3;12898:8;:31::i;:::-;-1:-1:-1;;;;;12879:16:0;;;;;;;:11;:16;;;;;;;;;:50;;;;12945:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;12652:337;;;:::o;4205:66::-;;;;;;;;;;;;;:::o;4554:30::-;;;;:::o;9428:419::-;1752:10;1733:18;:30;;;;;;;;;;;1767:1;1733:35;1725:81;;;;-1:-1:-1;;;1725:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9525:15:::1;;9544:1;9525:20;9517:64;;;::::0;;-1:-1:-1;;;9517:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;9517:64:0;;;;;;;;;;;;;::::1;;9596:9;-1:-1:-1::0;;;9596:32:0::1;9592:198;;;9630:17;:24:::0;;;9592:198:::1;;;9674:9;-1:-1:-1::0;;;9674:30:0::1;9670:120;;;9706:15;:22:::0;;;9670:120:::1;9806:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;9428:419:::0;;:::o;7522:170::-;7601:11;;;7578:6;7631;;;;:16;;;7646:1;7641;:6;;7631:16;7623:25;;12:1:-1;9;2:12;7623:25:0;7672:1;7667;:6;;:16;;;;7682:1;7677;:6;;7667:16;7659:25;;12:1:-1;9;2:12;8210:172:0;8288:10;;;8266:5;8317:11;;;8309:20;;12:1:-1;9;2:12;8309:20:0;8348:6;;;:25;;;8371:1;8362;8358;:5;;;;;;:15;8340:34;;12:1:-1;9;2:12;8388:109:0;8477:5;;;8472:16;;;;8464:25;;12:1:-1;9;2:12;8503:109:0;8592:5;;;8587:16;;;;8579:25;;12:1:-1;9;2:12;7866:170:0;7945:11;;;7922:6;7975;;;;:16;;;7990:1;7985;:6;;7975:16;7967:25;;12:1:-1;9;2:12;7967:25:0;8016:1;8011;:6;;:16;;;;8026:1;8021;:6;;8003:25;;12:1:-1;9;2:12;8618:123:0;8675:6;8702;;;:30;;-1:-1:-1;;8717:5:0;;;8731:1;8726;8717:5;8726:1;8712:15;;;;;:20;8694:39;;12:1:-1;9;2:12;13108:104:0;13195:9;;13188:17::o;12997:105::-;13086:8;;13079:16::o;803:24084::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://19acaf0b758e88d7398641f8e6524b72e4cc129cbad4170247a0f607b8938f96

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  ]
[ 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.