ETH Price: $3,436.49 (+5.56%)
Gas: 12 Gwei

Contract

0xCC88a9d330da1133Df3A7bD823B95e52511A6962
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve SAFE Mod...199098742024-05-20 8:13:5956 days ago1716192839IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000170423.58306059
Approve SAFE Mod...198779272024-05-15 20:59:5961 days ago1715806799IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000362527.99123208
Approve SAFE Mod...198483362024-05-11 17:39:4765 days ago1715449187IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000255395.62979726
Modify SAFE Coll...190586162024-01-22 0:06:23175 days ago1705881983IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000827111.6633956
Approve SAFE Mod...190521692024-01-21 2:11:11176 days ago1705803071IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0005365611.8278272
Approve SAFE Mod...185244162023-11-08 2:59:47250 days ago1699412387IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0008698119.17360266
Approve SAFE Mod...185244122023-11-08 2:58:59250 days ago1699412339IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0008101617.85878945
Approve SAFE Mod...185244112023-11-08 2:58:47250 days ago1699412327IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0008214118.10684078
Approve SAFE Mod...166205442023-02-13 14:50:23518 days ago1676299823IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0019405242.77574275
Approve SAFE Mod...166205422023-02-13 14:49:59518 days ago1676299799IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0020491445.17014508
Approve SAFE Mod...166205412023-02-13 14:49:47518 days ago1676299787IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0021609947.63575181
Approve SAFE Mod...161969392022-12-16 11:23:59577 days ago1671189839IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0006817915.02911935
Approve SAFE Mod...161968892022-12-16 11:13:59577 days ago1671189239IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0009675621.32841265
Approve SAFE Mod...159358222022-11-09 23:44:35613 days ago1668037475IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0032858172.43066014
Approve SAFE Mod...159358192022-11-09 23:43:59613 days ago1668037439IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0033009572.76437549
Approve SAFE Mod...159358182022-11-09 23:43:47613 days ago1668037427IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0034230175.45493527
Approve SAFE Mod...157207382022-10-10 22:38:59643 days ago1665441539IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0014668632.33479332
Approve SAFE Mod...156794752022-10-05 4:18:59649 days ago1664943539IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000127325
Approve SAFE Mod...155867112022-09-22 5:11:35662 days ago1663823495IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000213124.69792165
Approve SAFE Mod...155529592022-09-17 11:19:11667 days ago1663413551IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000230285.07622905
Approve SAFE Mod...155529352022-09-17 11:14:23667 days ago1663413263IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000233775.15328412
Approve SAFE Mod...155528992022-09-17 11:07:11667 days ago1663412831IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000220154.85290094
Approve SAFE Mod...155528652022-09-17 10:59:59667 days ago1663412399IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000227635.01790273
Approve SAFE Mod...155528442022-09-17 10:55:47667 days ago1663412147IN
Reflexer Finance: GEB Safe Engine
0 ETH0.000226354.98974175
Approve SAFE Mod...155382722022-09-15 9:40:47669 days ago1663234847IN
Reflexer Finance: GEB Safe Engine
0 ETH0.0005578912.29785913
View all transactions

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
118484222021-02-13 13:01:361248 days ago1613221296  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 2021-02-13
*/

/**
 *Submitted for verification at Etherscan.io on 2021-02-02
*/

/// 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 => uint256) 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 => uint256)) 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 that is denied SAFE permissions
     */
    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 => uint256))  public tokenCollateral;  // [wad]
    // Internal balance of system coins
    mapping (address => uint256)                       public coinBalance;      // [rad]
    // Amount of debt held by an account. Coins & debt are like matter and antimatter. They nullify each other
    mapping (address => uint256)                       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, uint256 data);
    event ModifyParameters(bytes32 collateralType, bytes32 parameter, uint256 data);
    event DisableContract();
    event ModifyCollateralBalance(bytes32 indexed collateralType, address indexed account, int256 wad);
    event TransferCollateral(bytes32 indexed collateralType, address indexed src, address indexed dst, uint256 wad);
    event TransferInternalCoins(address indexed src, address indexed dst, uint256 rad);
    event ModifySAFECollateralization(
        bytes32 indexed collateralType,
        address indexed safe,
        address collateralSource,
        address debtDestination,
        int256 deltaCollateral,
        int256 deltaDebt,
        uint256 lockedCollateral,
        uint256 generatedDebt,
        uint256 globalDebt
    );
    event TransferSAFECollateralAndDebt(
        bytes32 indexed collateralType,
        address indexed src,
        address indexed dst,
        int256 deltaCollateral,
        int256 deltaDebt,
        uint256 srcLockedCollateral,
        uint256 srcGeneratedDebt,
        uint256 dstLockedCollateral,
        uint256 dstGeneratedDebt
    );
    event ConfiscateSAFECollateralAndDebt(
        bytes32 indexed collateralType,
        address indexed safe,
        address collateralCounterparty,
        address debtCounterparty,
        int256 deltaCollateral,
        int256 deltaDebt,
        uint256 globalUnbackedDebt
    );
    event SettleDebt(address indexed account, uint256 rad, uint256 debtBalance, uint256 coinBalance, uint256 globalUnbackedDebt, uint256 globalDebt);
    event CreateUnbackedDebt(
        address indexed debtDestination,
        address indexed coinDestination,
        uint256 rad,
        uint256 debtDstBalance,
        uint256 coinDstBalance,
        uint256 globalUnbackedDebt,
        uint256 globalDebt
    );
    event UpdateAccumulatedRate(
        bytes32 indexed collateralType,
        address surplusDst,
        int256 rateMultiplier,
        uint256 dstCoinBalance,
        uint256 globalDebt
    );

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

    // --- Math ---
    function addition(uint256 x, int256 y) internal pure returns (uint256 z) {
        z = x + uint256(y);
        require(y >= 0 || z <= x, "SAFEEngine/add-uint-int-overflow");
        require(y <= 0 || z >= x, "SAFEEngine/add-uint-int-underflow");
    }
    function addition(int256 x, int256 y) internal pure returns (int256 z) {
        z = x + y;
        require(y >= 0 || z <= x, "SAFEEngine/add-int-int-overflow");
        require(y <= 0 || z >= x, "SAFEEngine/add-int-int-underflow");
    }
    function subtract(uint256 x, int256 y) internal pure returns (uint256 z) {
        z = x - uint256(y);
        require(y <= 0 || z <= x, "SAFEEngine/sub-uint-int-overflow");
        require(y >= 0 || z >= x, "SAFEEngine/sub-uint-int-underflow");
    }
    function subtract(int256 x, int256 y) internal pure returns (int256 z) {
        z = x - y;
        require(y <= 0 || z <= x, "SAFEEngine/sub-int-int-overflow");
        require(y >= 0 || z >= x, "SAFEEngine/sub-int-int-underflow");
    }
    function multiply(uint256 x, int256 y) internal pure returns (int256 z) {
        z = int256(x) * y;
        require(int256(x) >= 0, "SAFEEngine/mul-uint-int-null-x");
        require(y == 0 || z / y == int256(x), "SAFEEngine/mul-uint-int-overflow");
    }
    function addition(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "SAFEEngine/add-uint-uint-overflow");
    }
    function subtract(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "SAFEEngine/sub-uint-uint-underflow");
    }
    function multiply(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "SAFEEngine/multiply-uint-uint-overflow");
    }

    // --- 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 uint256 params
     * @param parameter The name of the parameter modified
     * @param data New value for the parameter
     */
    function modifyParameters(bytes32 parameter, uint256 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,
        uint256 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,
        int256 deltaCollateral,
        int256 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);

        int256 deltaAdjustedDebt = multiply(collateralTypeData.accumulatedRate, deltaDebt);
        uint256 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,
        int256 deltaCollateral,
        int256 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);

        uint256 srcTotalDebtIssued = multiply(srcSAFE.generatedDebt, collateralType_.accumulatedRate);
        uint256 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 debt taken/added into the SAFE (wad)
     */
    function confiscateSAFECollateralAndDebt(
        bytes32 collateralType,
        address safe,
        address collateralCounterparty,
        address debtCounterparty,
        int256 deltaCollateral,
        int256 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);

        int256 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(uint256 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,
        uint256 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,
        int256 rateMultiplier
    ) external isAuthorized {
        require(contractEnabled == 1, "SAFEEngine/contract-not-enabled");
        CollateralType storage collateralType_ = collateralTypes[collateralType];
        collateralType_.accumulatedRate        = addition(collateralType_.accumulatedRate, rateMultiplier);
        int256 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":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"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":true,"internalType":"address","name":"debtDestination","type":"address"},{"indexed":true,"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":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"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":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"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":true,"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":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"TransferCollateral","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"rad","type":"uint256"}],"name":"TransferInternalCoins","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"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":true,"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"}]

608060405234801561001057600080fd5b503360008181526020818152604091829020600190819055600019600755600b55815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a1604080516e73616665446562744365696c696e6760881b8152600019602082015281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a1612602806100bf6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806350de215d11610104578063d07900bb116100a2578063efabcadc11610071578063efabcadc1461063b578063fabde80c14610671578063fd450fb714610697578063fe4f58901461069f576101da565b8063d07900bb14610576578063d49d7867146105c6578063d4b9311d146105ec578063d94d420814610615576101da565b80638543d5e0116100de5780638543d5e0146104f8578063894ba8331461050057806394f3f81d1461050857806399bec3151461052e576101da565b806350de215d1461046d5780635e412858146104af57806376e0b4ca146104cc576101da565b80632efcc8661161017c578063476bb6ef1161014b578063476bb6ef146103755780634a11825e146103b75780634e14a967146103e95780634e5111a614610431576101da565b80632efcc866146102fa57806335b28153146103025780633d4225041461032857806341b3a0d91461036d576101da565b80631b142820116101b85780631b142820146102795780631d2a783d146102af57806324ba5884146102b757806327a0bb33146102dd576101da565b806306eb54df146101df5780630e9e11d31461021f57806311005b0714610253575b600080fd5b61020d600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106c2565b60408051918252519081900360200190f35b6102516004803603606081101561023557600080fd5b508035906001600160a01b0360208201351690604001356106df565b005b61020d6004803603602081101561026957600080fd5b50356001600160a01b031661085e565b6102516004803603606081101561028f57600080fd5b506001600160a01b03813581169160208101359091169060400135610870565b61020d6109d6565b61020d600480360360208110156102cd57600080fd5b50356001600160a01b03166109dc565b610251600480360360208110156102f357600080fd5b50356109ee565b61020d610aec565b6102516004803603602081101561031857600080fd5b50356001600160a01b0316610af2565b6103546004803603604081101561033e57600080fd5b50803590602001356001600160a01b0316610bd7565b6040805192835260208301919091528051918290030190f35b61020d610bfb565b610251600480360360a081101561038b57600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135610c01565b610251600480360360608110156103cd57600080fd5b508035906001600160a01b036020820135169060400135610f2a565b610251600480360360c08110156103ff57600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a00135611009565b6102516004803603608081101561044757600080fd5b508035906001600160a01b036020820135811691604081013590911690606001356111ca565b61049b6004803603604081101561048357600080fd5b506001600160a01b03813581169160200135166112e7565b604080519115158252519081900360200190f35b610251600480360360208110156104c557600080fd5b5035611327565b61020d600480360360408110156104e257600080fd5b50803590602001356001600160a01b031661141c565b61020d611439565b61025161143f565b6102516004803603602081101561051e57600080fd5b50356001600160a01b03166114bd565b610251600480360360c081101561054457600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a001356115a1565b6105936004803603602081101561058c57600080fd5b5035611bd0565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610251600480360360208110156105dc57600080fd5b50356001600160a01b0316611c07565b6102516004803603606081101561060257600080fd5b5080359060208101359060400135611c6b565b6102516004803603602081101561062b57600080fd5b50356001600160a01b0316611e3a565b6102516004803603606081101561065157600080fd5b506001600160a01b03813581169160208101359091169060400135611e9e565b61020d6004803603602081101561068757600080fd5b50356001600160a01b0316611fa0565b61020d611fb2565b610251600480360360408110156106b557600080fd5b5080359060200135611fb8565b600160209081526000928352604080842090915290825290205481565b3360009081526020819052604090205460011461072d5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114610772576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6000838152600260205260409020600181015461078f90836120d0565b600182015580546000906107a3908461217f565b6001600160a01b0385166000908152600560205260409020549091506107c990826120d0565b6001600160a01b0385166000908152600560205260409020556008546107ef90826120d0565b60088190556001600160a01b038516600081815260056020908152604091829020548251938452908301879052828201526060820192909252905186917f5b9f54db46fa62a65324e3e9cad8e6fa0deb965ce36134b30377d7edd3a8136f919081900360800190a25050505050565b60066020526000908152604090205481565b336000908152602081905260409020546001146108be5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020546108e1908261223e565b6001600160a01b03808516600090815260066020908152604080832094909455918516815260059091522054610917908261223e565b6001600160a01b03831660009081526005602052604090205560095461093d908261223e565b60095560085461094d908261223e565b60088190556001600160a01b0384811660008181526006602090815260408083205494881680845260058352928190205460095482518981529384019690965282820152606082019490945260808101949094529151919290917fede723541c3aae745504c3732f6a7161031353ddf05caba15d48b1edd35646b99181900360a00190a3505050565b60095481565b60006020819052908152604090205481565b33600081815260066020526040902054610a089083612280565b6001600160a01b038216600090815260066020908152604080832093909355600590522054610a379083612280565b6001600160a01b038216600090815260056020526040902055600954610a5d9083612280565b600955600854610a6d9083612280565b60088190556001600160a01b03821660008181526006602090815260408083205460058352928190205460095482518981529384019490945282820152606082019290925260808101939093525190917f11000f3497809a546a9de313df16f9ce615e1c65098ba758180e1cac823ed415919081900360a00190a25050565b600a5481565b33600090815260208190526040902054600114610b405760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114610b85576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60036020908152600092835260408084209091529082529020805460019091015482565b600b5481565b60008581526003602090815260408083206001600160a01b0388811685529083528184209087168452818420898552600290935292208254610c4390866122c2565b83556001830154610c5490856122c2565b60018401558154610c6590866120d0565b82556001820154610c7690856120d0565b82600101819055506000610c9284600101548360010154612371565b90506000610ca884600101548460010154612371565b9050610cc6610cb78a336112e7565b610cc18a336112e7565b6123c7565b610d10576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b610d2285600001548460020154612371565b821115610d76576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d737263000000000000000000604482015290519081900360640190fd5b610d8884600001548460020154612371565b811115610ddc576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d647374000000000000000000604482015290519081900360640190fd5b610df4836004015483101586600101546000146123cb565b610e3b576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f647573742d73726360681b604482015290519081900360640190fd5b610e53836004015482101585600101546000146123cb565b610e9a576040805162461bcd60e51b815260206004820152601360248201527214d05191515b99da5b994bd91d5cdd0b591cdd606a1b604482015290519081900360640190fd5b876001600160a01b0316896001600160a01b03168b7f4b49cc19514005253f36d0517c21b92404f50cc0d9e0c070af00b96e296b08358a8a8a600001548b600101548b600001548c6001015460405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a450505050505050505050565b33600090815260208190526040902054600114610f785760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b60008381526004602090815260408083206001600160a01b0386168452909152902054610fa590826120d0565b60008481526004602090815260408083206001600160a01b038716808552908352928190209390935582518481529251919286927f488ac1e40bb6e5ee1f88b998568d1de4cb595e9ce0e0d4e4d4cc4c202053f107929181900390910190a3505050565b336000908152602081905260409020546001146110575760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b60008681526003602090815260408083206001600160a01b038916845282528083208984526002909252909120815461109090856120d0565b825560018201546110a190846120d0565b600183015580546110b290846120d0565b815560018101546000906110c6908561217f565b60008a81526004602090815260408083206001600160a01b038c1684529091529020549091506110f690866122c2565b60008a81526004602090815260408083206001600160a01b03808d16855290835281842094909455928916825260069052205461113390826122c2565b6001600160a01b03871660009081526006602052604090205560095461115990826122c2565b6009819055604080516001600160a01b038a8116825289811660208301528183018990526060820188905260808201939093529051918a16918b917f9bef7b734be54aaed05e906c2ccf923767f44a93d136b674e212ce858a6d031c919081900360a00190a3505050505050505050565b6111d483336112e7565b61121e576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b60008481526004602090815260408083206001600160a01b038716845290915290205461124b9082612280565b60008581526004602090815260408083206001600160a01b038881168552925280832093909355841681522054611282908261223e565b60008581526004602090815260408083206001600160a01b038088168086529184529382902094909455805185815290519287169288927fb08760a077e71005cf3651212fdbd4028d6ebc8e1844c0475f36000f2756c0d7928290030190a450505050565b6001600160a01b03828116600081815260016020818152604080842095871680855295909152822054919361131e931491146123cb565b90505b92915050565b336000908152602081905260409020546001146113755760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600081815260026020526040902060010154156113c35760405162461bcd60e51b81526004018080602001828103825260298152602001806124cf6029913960400191505060405180910390fd5b6000818152600260209081526040918290206b033b2e3c9fd0803ce8000000600190910155815183815291517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359281900390910190a150565b600460209081526000928352604080842090915290825290205481565b60085481565b3360009081526020819052604090205460011461148d5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b6000600b8190556040517f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e9190a1565b3360009081526020819052604090205460011461150b5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114611550576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b600b546001146115e6576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6115ee6123cf565b5060008681526003602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015261162e6123e9565b50600087815260026020818152604092839020835160c0810185528154815260018201549281018390529281015493830193909352600383015460608301526004830154608083015260059092015460a0820152906116be5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124f8602a913960400191505060405180910390fd5b81516116ca90856120d0565b825260208201516116db90846120d0565b602083015280516116ec90846120d0565b81526020810151600090611700908561217f565b9050600061171683602001518560200151612371565b9050611724600854836120d0565b600881905550611760600086131561175b856060015161174c87600001518860200151612371565b1115600a5460085411156123c7565b6123cb565b6117b1576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f6365696c696e672d65786365656465640000000000604482015290519081900360640190fd5b6117e06117c6600087131560008912156123c7565b6117d886600001518660400151612371565b8311156123cb565b611827576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f6e6f742d7361666560681b604482015290519081900360640190fd5b61184661183c600087131560008912156123c7565b61175b8b336112e7565b6118815760405162461bcd60e51b81526004018080602001828103825260258152602001806124206025913960400191505060405180910390fd5b611893600087131561175b8a336112e7565b6118ce5760405162461bcd60e51b81526004018080602001828103825260258152602001806124aa6025913960400191505060405180910390fd5b6118e0600086121561175b89336112e7565b611931576040805162461bcd60e51b815260206004820152601f60248201527f53414645456e67696e652f6e6f742d616c6c6f7765642d646562742d64737400604482015290519081900360640190fd5b611949846020015160001484608001518310156123cb565b61198c576040805162461bcd60e51b815260206004820152600f60248201526e14d05191515b99da5b994bd91d5cdd608a1b604482015290519081900360640190fd5b60008513156119f057600754846020015111156119f0576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f61626f76652d646562742d6c696d69740000000000604482015290519081900360640190fd5b60008a81526004602090815260408083206001600160a01b038c168452909152902054611a1d90876122c2565b60008b81526004602090815260408083206001600160a01b03808e16855290835281842094909455928a168252600590522054611a5a90836120d0565b60056000896001600160a01b03166001600160a01b031681526020019081526020016000208190555083600360008c815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015590505082600260008c8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050886001600160a01b03168a7f182725621f9c0d485fb256f86699c82616bd6e4670325087fd08f643cab7d9178a8a8a8a8a600001518b6020015160085460405180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a350505050505050505050565b6002602081905260009182526040909120805460018201549282015460038301546004840154600590940154929493919290919086565b3360008181526001602090815260408083206001600160a01b0386168085529083528184209390935580519384529083019190915280517fb1b0368dbc2a1d366ba32be3f455812a3db862c3f52fd3434020a262442b1bb09281900390910190a150565b33600090815260208190526040902054600114611cb95760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114611cfe576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b816a736166657479507269636560a81b1415611d2e57600083815260026020819052604090912001819055611df5565b816f6c69717569646174696f6e507269636560801b1415611d62576000838152600260205260409020600501819055611df5565b816a646562744365696c696e6760a81b1415611d91576000838152600260205260409020600301819055611df5565b81683232b13a233637b7b960b91b1415611dbe576000838152600260205260409020600401819055611df5565b60405162461bcd60e51b81526004018080602001828103825260248152602001806124656024913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b3360008181526001602081815260408084206001600160a01b0387168086529083529381902092909255815193845283019190915280517ff7db8b086d1ab5e5802059364bff5428c7622c6d4623f9780947306d492770539281900390910190a150565b611ea883336112e7565b611ef2576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260056020526040902054611f159082612280565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611f44908261223e565b6001600160a01b0380841660008181526005602090815260409182902094909455805185815290519193928716927f4cd53b0b754082a31f5a6f3dc965c36d1d901c309830e0b4c17949aff97f0b1492918290030190a3505050565b60056020526000908152604090205481565b60075481565b336000908152602081905260409020546001146120065760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b5460011461204b576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b8170676c6f62616c446562744365696c696e6760781b141561207157600a819055612091565b816e73616665446562744365696c696e6760881b1415611dbe5760078190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b8181016000821215806120e35750828111155b612134576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f6164642d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b6000821315806121445750828110155b6113215760405162461bcd60e51b81526004018080602001828103825260218152602001806125446021913960400191505060405180910390fd5b81810260008312156121d8576040805162461bcd60e51b815260206004820152601e60248201527f53414645456e67696e652f6d756c2d75696e742d696e742d6e756c6c2d780000604482015290519081900360640190fd5b8115806121ed5750828282816121ea57fe5b05145b611321576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f6d756c2d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b808201828110156113215760405162461bcd60e51b81526004018080602001828103825260218152602001806125866021913960400191505060405180910390fd5b808203828111156113215760405162461bcd60e51b81526004018080602001828103825260228152602001806125226022913960400191505060405180910390fd5b8082036000821315806122d55750828111155b612326576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f7375622d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b6000821215806123365750828110155b6113215760405162461bcd60e51b81526004018080602001828103825260218152602001806124896021913960400191505060405180910390fd5b600081158061238c5750508082028282828161238957fe5b04145b6113215760405162461bcd60e51b81526004018080602001828103825260268152602001806125a76026913960400191505060405180910390fd5b1690565b1790565b604051806040016040528060008152602001600081525090565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe53414645456e67696e652f6e6f742d616c6c6f7765642d746f2d6d6f646966792d7361666553414645456e67696e652f636f6e74726163742d6e6f742d656e61626c65640053414645456e67696e652f6d6f646966792d756e7265636f676e697a65642d706172616d53414645456e67696e652f7375622d75696e742d696e742d756e646572666c6f7753414645456e67696e652f6e6f742d616c6c6f7765642d636f6c6c61746572616c2d73726353414645456e67696e652f636f6c6c61746572616c2d747970652d616c72656164792d65786973747353414645456e67696e652f636f6c6c61746572616c2d747970652d6e6f742d696e697469616c697a656453414645456e67696e652f7375622d75696e742d75696e742d756e646572666c6f7753414645456e67696e652f6164642d75696e742d696e742d756e646572666c6f7753414645456e67696e652f6163636f756e742d6e6f742d617574686f72697a656453414645456e67696e652f6164642d75696e742d75696e742d6f766572666c6f7753414645456e67696e652f6d756c7469706c792d75696e742d75696e742d6f766572666c6f77a2646970667358221220b984909f35a410f65749fd6fea7c79754913d1b3d33734d672f025667996763264736f6c63430006070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806350de215d11610104578063d07900bb116100a2578063efabcadc11610071578063efabcadc1461063b578063fabde80c14610671578063fd450fb714610697578063fe4f58901461069f576101da565b8063d07900bb14610576578063d49d7867146105c6578063d4b9311d146105ec578063d94d420814610615576101da565b80638543d5e0116100de5780638543d5e0146104f8578063894ba8331461050057806394f3f81d1461050857806399bec3151461052e576101da565b806350de215d1461046d5780635e412858146104af57806376e0b4ca146104cc576101da565b80632efcc8661161017c578063476bb6ef1161014b578063476bb6ef146103755780634a11825e146103b75780634e14a967146103e95780634e5111a614610431576101da565b80632efcc866146102fa57806335b28153146103025780633d4225041461032857806341b3a0d91461036d576101da565b80631b142820116101b85780631b142820146102795780631d2a783d146102af57806324ba5884146102b757806327a0bb33146102dd576101da565b806306eb54df146101df5780630e9e11d31461021f57806311005b0714610253575b600080fd5b61020d600480360360408110156101f557600080fd5b506001600160a01b03813581169160200135166106c2565b60408051918252519081900360200190f35b6102516004803603606081101561023557600080fd5b508035906001600160a01b0360208201351690604001356106df565b005b61020d6004803603602081101561026957600080fd5b50356001600160a01b031661085e565b6102516004803603606081101561028f57600080fd5b506001600160a01b03813581169160208101359091169060400135610870565b61020d6109d6565b61020d600480360360208110156102cd57600080fd5b50356001600160a01b03166109dc565b610251600480360360208110156102f357600080fd5b50356109ee565b61020d610aec565b6102516004803603602081101561031857600080fd5b50356001600160a01b0316610af2565b6103546004803603604081101561033e57600080fd5b50803590602001356001600160a01b0316610bd7565b6040805192835260208301919091528051918290030190f35b61020d610bfb565b610251600480360360a081101561038b57600080fd5b508035906001600160a01b03602082013581169160408101359091169060608101359060800135610c01565b610251600480360360608110156103cd57600080fd5b508035906001600160a01b036020820135169060400135610f2a565b610251600480360360c08110156103ff57600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a00135611009565b6102516004803603608081101561044757600080fd5b508035906001600160a01b036020820135811691604081013590911690606001356111ca565b61049b6004803603604081101561048357600080fd5b506001600160a01b03813581169160200135166112e7565b604080519115158252519081900360200190f35b610251600480360360208110156104c557600080fd5b5035611327565b61020d600480360360408110156104e257600080fd5b50803590602001356001600160a01b031661141c565b61020d611439565b61025161143f565b6102516004803603602081101561051e57600080fd5b50356001600160a01b03166114bd565b610251600480360360c081101561054457600080fd5b508035906001600160a01b03602082013581169160408101358216916060820135169060808101359060a001356115a1565b6105936004803603602081101561058c57600080fd5b5035611bd0565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b610251600480360360208110156105dc57600080fd5b50356001600160a01b0316611c07565b6102516004803603606081101561060257600080fd5b5080359060208101359060400135611c6b565b6102516004803603602081101561062b57600080fd5b50356001600160a01b0316611e3a565b6102516004803603606081101561065157600080fd5b506001600160a01b03813581169160208101359091169060400135611e9e565b61020d6004803603602081101561068757600080fd5b50356001600160a01b0316611fa0565b61020d611fb2565b610251600480360360408110156106b557600080fd5b5080359060200135611fb8565b600160209081526000928352604080842090915290825290205481565b3360009081526020819052604090205460011461072d5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114610772576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6000838152600260205260409020600181015461078f90836120d0565b600182015580546000906107a3908461217f565b6001600160a01b0385166000908152600560205260409020549091506107c990826120d0565b6001600160a01b0385166000908152600560205260409020556008546107ef90826120d0565b60088190556001600160a01b038516600081815260056020908152604091829020548251938452908301879052828201526060820192909252905186917f5b9f54db46fa62a65324e3e9cad8e6fa0deb965ce36134b30377d7edd3a8136f919081900360800190a25050505050565b60066020526000908152604090205481565b336000908152602081905260409020546001146108be5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b6001600160a01b0383166000908152600660205260409020546108e1908261223e565b6001600160a01b03808516600090815260066020908152604080832094909455918516815260059091522054610917908261223e565b6001600160a01b03831660009081526005602052604090205560095461093d908261223e565b60095560085461094d908261223e565b60088190556001600160a01b0384811660008181526006602090815260408083205494881680845260058352928190205460095482518981529384019690965282820152606082019490945260808101949094529151919290917fede723541c3aae745504c3732f6a7161031353ddf05caba15d48b1edd35646b99181900360a00190a3505050565b60095481565b60006020819052908152604090205481565b33600081815260066020526040902054610a089083612280565b6001600160a01b038216600090815260066020908152604080832093909355600590522054610a379083612280565b6001600160a01b038216600090815260056020526040902055600954610a5d9083612280565b600955600854610a6d9083612280565b60088190556001600160a01b03821660008181526006602090815260408083205460058352928190205460095482518981529384019490945282820152606082019290925260808101939093525190917f11000f3497809a546a9de313df16f9ce615e1c65098ba758180e1cac823ed415919081900360a00190a25050565b600a5481565b33600090815260208190526040902054600114610b405760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114610b85576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60036020908152600092835260408084209091529082529020805460019091015482565b600b5481565b60008581526003602090815260408083206001600160a01b0388811685529083528184209087168452818420898552600290935292208254610c4390866122c2565b83556001830154610c5490856122c2565b60018401558154610c6590866120d0565b82556001820154610c7690856120d0565b82600101819055506000610c9284600101548360010154612371565b90506000610ca884600101548460010154612371565b9050610cc6610cb78a336112e7565b610cc18a336112e7565b6123c7565b610d10576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b610d2285600001548460020154612371565b821115610d76576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d737263000000000000000000604482015290519081900360640190fd5b610d8884600001548460020154612371565b811115610ddc576040805162461bcd60e51b815260206004820152601760248201527f53414645456e67696e652f6e6f742d736166652d647374000000000000000000604482015290519081900360640190fd5b610df4836004015483101586600101546000146123cb565b610e3b576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f647573742d73726360681b604482015290519081900360640190fd5b610e53836004015482101585600101546000146123cb565b610e9a576040805162461bcd60e51b815260206004820152601360248201527214d05191515b99da5b994bd91d5cdd0b591cdd606a1b604482015290519081900360640190fd5b876001600160a01b0316896001600160a01b03168b7f4b49cc19514005253f36d0517c21b92404f50cc0d9e0c070af00b96e296b08358a8a8a600001548b600101548b600001548c6001015460405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a450505050505050505050565b33600090815260208190526040902054600114610f785760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b60008381526004602090815260408083206001600160a01b0386168452909152902054610fa590826120d0565b60008481526004602090815260408083206001600160a01b038716808552908352928190209390935582518481529251919286927f488ac1e40bb6e5ee1f88b998568d1de4cb595e9ce0e0d4e4d4cc4c202053f107929181900390910190a3505050565b336000908152602081905260409020546001146110575760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b60008681526003602090815260408083206001600160a01b038916845282528083208984526002909252909120815461109090856120d0565b825560018201546110a190846120d0565b600183015580546110b290846120d0565b815560018101546000906110c6908561217f565b60008a81526004602090815260408083206001600160a01b038c1684529091529020549091506110f690866122c2565b60008a81526004602090815260408083206001600160a01b03808d16855290835281842094909455928916825260069052205461113390826122c2565b6001600160a01b03871660009081526006602052604090205560095461115990826122c2565b6009819055604080516001600160a01b038a8116825289811660208301528183018990526060820188905260808201939093529051918a16918b917f9bef7b734be54aaed05e906c2ccf923767f44a93d136b674e212ce858a6d031c919081900360a00190a3505050505050505050565b6111d483336112e7565b61121e576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b60008481526004602090815260408083206001600160a01b038716845290915290205461124b9082612280565b60008581526004602090815260408083206001600160a01b038881168552925280832093909355841681522054611282908261223e565b60008581526004602090815260408083206001600160a01b038088168086529184529382902094909455805185815290519287169288927fb08760a077e71005cf3651212fdbd4028d6ebc8e1844c0475f36000f2756c0d7928290030190a450505050565b6001600160a01b03828116600081815260016020818152604080842095871680855295909152822054919361131e931491146123cb565b90505b92915050565b336000908152602081905260409020546001146113755760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600081815260026020526040902060010154156113c35760405162461bcd60e51b81526004018080602001828103825260298152602001806124cf6029913960400191505060405180910390fd5b6000818152600260209081526040918290206b033b2e3c9fd0803ce8000000600190910155815183815291517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359281900390910190a150565b600460209081526000928352604080842090915290825290205481565b60085481565b3360009081526020819052604090205460011461148d5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b6000600b8190556040517f2d4b4ecff7bd7503135271925520a2f6c0d98c9473ffc1a1e72c92502f51b25e9190a1565b3360009081526020819052604090205460011461150b5760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114611550576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b600b546001146115e6576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b6115ee6123cf565b5060008681526003602090815260408083206001600160a01b0389168452825291829020825180840190935280548352600101549082015261162e6123e9565b50600087815260026020818152604092839020835160c0810185528154815260018201549281018390529281015493830193909352600383015460608301526004830154608083015260059092015460a0820152906116be5760405162461bcd60e51b815260040180806020018281038252602a8152602001806124f8602a913960400191505060405180910390fd5b81516116ca90856120d0565b825260208201516116db90846120d0565b602083015280516116ec90846120d0565b81526020810151600090611700908561217f565b9050600061171683602001518560200151612371565b9050611724600854836120d0565b600881905550611760600086131561175b856060015161174c87600001518860200151612371565b1115600a5460085411156123c7565b6123cb565b6117b1576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f6365696c696e672d65786365656465640000000000604482015290519081900360640190fd5b6117e06117c6600087131560008912156123c7565b6117d886600001518660400151612371565b8311156123cb565b611827576040805162461bcd60e51b815260206004820152601360248201527253414645456e67696e652f6e6f742d7361666560681b604482015290519081900360640190fd5b61184661183c600087131560008912156123c7565b61175b8b336112e7565b6118815760405162461bcd60e51b81526004018080602001828103825260258152602001806124206025913960400191505060405180910390fd5b611893600087131561175b8a336112e7565b6118ce5760405162461bcd60e51b81526004018080602001828103825260258152602001806124aa6025913960400191505060405180910390fd5b6118e0600086121561175b89336112e7565b611931576040805162461bcd60e51b815260206004820152601f60248201527f53414645456e67696e652f6e6f742d616c6c6f7765642d646562742d64737400604482015290519081900360640190fd5b611949846020015160001484608001518310156123cb565b61198c576040805162461bcd60e51b815260206004820152600f60248201526e14d05191515b99da5b994bd91d5cdd608a1b604482015290519081900360640190fd5b60008513156119f057600754846020015111156119f0576040805162461bcd60e51b815260206004820152601b60248201527f53414645456e67696e652f61626f76652d646562742d6c696d69740000000000604482015290519081900360640190fd5b60008a81526004602090815260408083206001600160a01b038c168452909152902054611a1d90876122c2565b60008b81526004602090815260408083206001600160a01b03808e16855290835281842094909455928a168252600590522054611a5a90836120d0565b60056000896001600160a01b03166001600160a01b031681526020019081526020016000208190555083600360008c815260200190815260200160002060008b6001600160a01b03166001600160a01b03168152602001908152602001600020600082015181600001556020820151816001015590505082600260008c8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050886001600160a01b03168a7f182725621f9c0d485fb256f86699c82616bd6e4670325087fd08f643cab7d9178a8a8a8a8a600001518b6020015160085460405180886001600160a01b03166001600160a01b03168152602001876001600160a01b03166001600160a01b0316815260200186815260200185815260200184815260200183815260200182815260200197505050505050505060405180910390a350505050505050505050565b6002602081905260009182526040909120805460018201549282015460038301546004840154600590940154929493919290919086565b3360008181526001602090815260408083206001600160a01b0386168085529083528184209390935580519384529083019190915280517fb1b0368dbc2a1d366ba32be3f455812a3db862c3f52fd3434020a262442b1bb09281900390910190a150565b33600090815260208190526040902054600114611cb95760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b54600114611cfe576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b816a736166657479507269636560a81b1415611d2e57600083815260026020819052604090912001819055611df5565b816f6c69717569646174696f6e507269636560801b1415611d62576000838152600260205260409020600501819055611df5565b816a646562744365696c696e6760a81b1415611d91576000838152600260205260409020600301819055611df5565b81683232b13a233637b7b960b91b1415611dbe576000838152600260205260409020600401819055611df5565b60405162461bcd60e51b81526004018080602001828103825260248152602001806124656024913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b3360008181526001602081815260408084206001600160a01b0387168086529083529381902092909255815193845283019190915280517ff7db8b086d1ab5e5802059364bff5428c7622c6d4623f9780947306d492770539281900390910190a150565b611ea883336112e7565b611ef2576040805162461bcd60e51b815260206004820152601660248201527514d05191515b99da5b994bdb9bdd0b585b1b1bddd95960521b604482015290519081900360640190fd5b6001600160a01b038316600090815260056020526040902054611f159082612280565b6001600160a01b038085166000908152600560205260408082209390935590841681522054611f44908261223e565b6001600160a01b0380841660008181526005602090815260409182902094909455805185815290519193928716927f4cd53b0b754082a31f5a6f3dc965c36d1d901c309830e0b4c17949aff97f0b1492918290030190a3505050565b60056020526000908152604090205481565b60075481565b336000908152602081905260409020546001146120065760405162461bcd60e51b81526004018080602001828103825260218152602001806125656021913960400191505060405180910390fd5b600b5460011461204b576040805162461bcd60e51b815260206004820152601f6024820152600080516020612445833981519152604482015290519081900360640190fd5b8170676c6f62616c446562744365696c696e6760781b141561207157600a819055612091565b816e73616665446562744365696c696e6760881b1415611dbe5760078190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b8181016000821215806120e35750828111155b612134576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f6164642d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b6000821315806121445750828110155b6113215760405162461bcd60e51b81526004018080602001828103825260218152602001806125446021913960400191505060405180910390fd5b81810260008312156121d8576040805162461bcd60e51b815260206004820152601e60248201527f53414645456e67696e652f6d756c2d75696e742d696e742d6e756c6c2d780000604482015290519081900360640190fd5b8115806121ed5750828282816121ea57fe5b05145b611321576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f6d756c2d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b808201828110156113215760405162461bcd60e51b81526004018080602001828103825260218152602001806125866021913960400191505060405180910390fd5b808203828111156113215760405162461bcd60e51b81526004018080602001828103825260228152602001806125226022913960400191505060405180910390fd5b8082036000821315806122d55750828111155b612326576040805162461bcd60e51b815260206004820181905260248201527f53414645456e67696e652f7375622d75696e742d696e742d6f766572666c6f77604482015290519081900360640190fd5b6000821215806123365750828110155b6113215760405162461bcd60e51b81526004018080602001828103825260218152602001806124896021913960400191505060405180910390fd5b600081158061238c5750508082028282828161238957fe5b04145b6113215760405162461bcd60e51b81526004018080602001828103825260268152602001806125a76026913960400191505060405180910390fd5b1690565b1790565b604051806040016040528060008152602001600081525090565b6040518060c00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe53414645456e67696e652f6e6f742d616c6c6f7765642d746f2d6d6f646966792d7361666553414645456e67696e652f636f6e74726163742d6e6f742d656e61626c65640053414645456e67696e652f6d6f646966792d756e7265636f676e697a65642d706172616d53414645456e67696e652f7375622d75696e742d696e742d756e646572666c6f7753414645456e67696e652f6e6f742d616c6c6f7765642d636f6c6c61746572616c2d73726353414645456e67696e652f636f6c6c61746572616c2d747970652d616c72656164792d65786973747353414645456e67696e652f636f6c6c61746572616c2d747970652d6e6f742d696e697469616c697a656453414645456e67696e652f7375622d75696e742d75696e742d756e646572666c6f7753414645456e67696e652f6164642d75696e742d696e742d756e646572666c6f7753414645456e67696e652f6163636f756e742d6e6f742d617574686f72697a656453414645456e67696e652f6164642d75696e742d75696e742d6f766572666c6f7753414645456e67696e652f6d756c7469706c792d75696e742d75696e742d6f766572666c6f77a2646970667358221220b984909f35a410f65749fd6fea7c79754913d1b3d33734d672f025667996763264736f6c63430006070033

Deployed Bytecode Sourcemap

873:24956:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;873:24956:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;1967:66:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;1967:66:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24914:912;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;24914:912:0;;;-1:-1:-1;;;;;24914:912:0;;;;;;;;;;:::i;:::-;;4496:69;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4496:69:0;-1:-1:-1;;;;;4496:69:0;;:::i;23694:738::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;23694:738:0;;;;;;;;;;;;;;;;;:::i;4857:34::-;;;:::i;921:54::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;921:54:0;-1:-1:-1;;;;;921:54:0;;:::i;22873:479::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;22873:479:0;;:::i;4958:33::-;;;:::i;1085:231::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1085:231:0;-1:-1:-1;;;;;1085:231:0;;:::i;4053:63::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4053:63:0;;;;;;-1:-1:-1;;;;;4053:63:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5078:31;;;:::i;18637:2008::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;18637:2008:0;;;-1:-1:-1;;;;;18637:2008:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;12237:328::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12237:328:0;;;-1:-1:-1;;;;;12237:328:0;;;;;;;;;;:::i;21240:1455::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21240:1455:0;;;-1:-1:-1;;;;;21240:1455:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;12831:494::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;12831:494:0;;;-1:-1:-1;;;;;12831:494:0;;;;;;;;;;;;;;;;;;;:::i;2756:162::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;2756:162:0;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;9817:330;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9817:330:0;;:::i;4163:73::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4163:73:0;;;;;;-1:-1:-1;;;;;4163:73:0;;:::i;4754:26::-;;;:::i;11838:120::-;;;:::i;1435:237::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1435:237:0;-1:-1:-1;;;;;1435:237:0;;:::i;14691:3494::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;14691:3494:0;;;-1:-1:-1;;;;;14691:3494:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3944:73::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3944:73:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2493:167;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2493:167:0;-1:-1:-1;;;;;2493:167:0;;:::i;10996:742::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10996:742:0;;;;;;;;;;;;:::i;2170:173::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2170:173:0;-1:-1:-1;;;;;2170:173:0;;:::i;13555:337::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;13555:337:0;;;;;;;;;;;;;;;;;:::i;4294:69::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4294:69:0;-1:-1:-1;;;;;4294:69:0;;:::i;4649:30::-;;;:::i;10325:422::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10325:422:0;;;;;;;:::i;1967:66::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;24914:912::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25087:15:::1;;25106:1;25087:20;25079:64;;;::::0;;-1:-1:-1;;;25079:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;25079:64:0;;;;;;;;;;;;;::::1;;25154:38;25195:31:::0;;;:15:::1;:31;::::0;;;;25287::::1;::::0;::::1;::::0;25278:57:::1;::::0;25320:14;25278:8:::1;:57::i;:::-;25237:31;::::0;::::1;:98:::0;25396:26;;25346:19:::1;::::0;25387:52:::1;::::0;25424:14;25387:8:::1;:52::i;:::-;-1:-1:-1::0;;;;;25500:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;25346:93;;-1:-1:-1;25491:47:0::1;::::0;25346:93;25491:8:::1;:47::i;:::-;-1:-1:-1::0;;;;;25450:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;:88;25599:10:::1;::::0;25590:34:::1;::::0;25611:12;25590:8:::1;:34::i;:::-;25549:10;:75:::0;;;-1:-1:-1;;;;;25759:23:0;::::1;;::::0;;;:11:::1;:23;::::0;;;;;;;;;25640:178;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;25676:14;;25640:178:::1;::::0;;;;;;;;::::1;1890:1;;24914:912:::0;;;:::o;4496:69::-;;;;;;;;;;;;;:::o;23694:738::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23893:28:0;::::1;;::::0;;;:11:::1;:28;::::0;;;;;23884:43:::1;::::0;23923:3;23884:8:::1;:43::i;:::-;-1:-1:-1::0;;;;;23852:28:0;;::::1;;::::0;;;:11:::1;:28;::::0;;;;;;;:75;;;;23979:28;;::::1;::::0;;:11:::1;:28:::0;;;;;23970:43:::1;::::0;24009:3;23970:8:::1;:43::i;:::-;-1:-1:-1::0;;;;;23938:28:0;::::1;;::::0;;;:11:::1;:28;::::0;;;;:75;24065:18:::1;::::0;24056:33:::1;::::0;24085:3;24056:8:::1;:33::i;:::-;24024:18;:65:::0;24141:10:::1;::::0;24132:25:::1;::::0;24153:3;24132:8:::1;:25::i;:::-;24100:10;:57:::0;;;-1:-1:-1;;;;;24173:251:0;;::::1;24284:28;::::0;;;:11:::1;:28;::::0;;;;;;;;24173:251;;::::1;24327:28:::0;;;:11:::1;:28:::0;;;;;;;24370:18:::1;::::0;24173:251;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;23694:738:::0;;;:::o;4857:34::-;;;;:::o;921:54::-;;;;;;;;;;;;;;:::o;22873:479::-;22950:10;22926:15;23004:20;;;:11;:20;;;;;;22995:35;;23026:3;22995:8;:35::i;:::-;-1:-1:-1;;;;;22971:20:0;;;;;;:11;:20;;;;;;;;:59;;;;23074:11;:20;;;;23065:35;;23096:3;23065:8;:35::i;:::-;-1:-1:-1;;;;;23041:20:0;;;;;;:11;:20;;;;;:59;23144:18;;23135:33;;23164:3;23135:8;:33::i;:::-;23111:18;:57;23212:10;;23203:25;;23224:3;23203:8;:25::i;:::-;23179:10;:49;;;-1:-1:-1;;;;;23244:100:0;;23269:20;;;;:11;:20;;;;;;;;;23291:11;:20;;;;;;;23313:18;;23244:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22873:479;;:::o;4958:33::-;;;;:::o;1085:231::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1169:15:::1;;1188:1;1169:20;1161:64;;;::::0;;-1:-1:-1;;;1161:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;1161:64:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1236:27:0;::::1;:18;:27:::0;;;::::1;::::0;;;;;;;;1266:1:::1;1236:31:::0;;1283:25;;;;;;;::::1;::::0;;;;;;;;::::1;1085:231:::0;:::o;4053:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5078:31::-;;;;:::o;18637:2008::-;18840:20;18863:21;;;:5;:21;;;;;;;;-1:-1:-1;;;;;18863:26:0;;;;;;;;;;;18923;;;;;;;;19001:31;;;:15;:31;;;;;19081:24;;19072:51;;19107:15;19072:8;:51::i;:::-;19045:78;;19170:21;;;;19161:42;;19193:9;19161:8;:42::i;:::-;19134:21;;;:69;19250:24;;19241:51;;19276:15;19241:8;:51::i;:::-;19214:78;;19339:21;;;;19330:42;;19362:9;19330:8;:42::i;:::-;19303:7;:21;;:69;;;;19385:26;19414:64;19423:7;:21;;;19446:15;:31;;;19414:8;:64::i;:::-;19385:93;;19489:26;19518:64;19527:7;:21;;;19550:15;:31;;;19518:8;:64::i;:::-;19489:93;;19634:68;19639:30;19653:3;19658:10;19639:13;:30::i;:::-;19671;19685:3;19690:10;19671:13;:30::i;:::-;19634:4;:68::i;:::-;19626:103;;;;;-1:-1:-1;;;19626:103:0;;;;;;;;;;;;-1:-1:-1;;;19626:103:0;;;;;;;;;;;;;;;19800:63;19809:7;:24;;;19835:15;:27;;;19800:8;:63::i;:::-;19778:18;:85;;19770:121;;;;;-1:-1:-1;;;19770:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19932:63;19941:7;:24;;;19967:15;:27;;;19932:8;:63::i;:::-;19910:18;:85;;19902:121;;;;;-1:-1:-1;;;19902:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20077:83;20106:15;:25;;;20084:18;:47;;20133:7;:21;;;20158:1;20133:26;20077:6;:83::i;:::-;20069:115;;;;;-1:-1:-1;;;20069:115:0;;;;;;;;;;;;-1:-1:-1;;;20069:115:0;;;;;;;;;;;;;;;20203:83;20232:15;:25;;;20210:18;:47;;20259:7;:21;;;20284:1;20259:26;20203:6;:83::i;:::-;20195:115;;;;;-1:-1:-1;;;20195:115:0;;;;;;;;;;;;-1:-1:-1;;;20195:115:0;;;;;;;;;;;;;;;20419:3;-1:-1:-1;;;;;20328:309:0;20401:3;-1:-1:-1;;;;;20328:309:0;20372:14;20328:309;20437:15;20467:9;20491:7;:24;;;20530:7;:21;;;20566:7;:24;;;20605:7;:21;;;20328:309;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18637:2008;;;;;;;;;;:::o;12237:328::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12442:31:::1;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;12442:40:0;::::1;::::0;;;;;;;;12433:55:::1;::::0;12484:3;12433:8:::1;:55::i;:::-;12390:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;12390:40:0;::::1;::::0;;;;;;;;;;:98;;;;12504:53;;;;;;;12390:40;;12406:14;;12504:53:::1;::::0;;;;;;;;;::::1;12237:328:::0;;;:::o;21240:1455::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21513:18:::1;21534:21:::0;;;:5:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;21534:27:0;::::1;::::0;;;;;;;21613:31;;;:15:::1;:31:::0;;;;;;21691:22;;21682:49:::1;::::0;21715:15;21682:8:::1;:49::i;:::-;21657:74:::0;;21773:19:::1;::::0;::::1;::::0;21764:40:::1;::::0;21794:9;21764:8:::1;:40::i;:::-;21742:19;::::0;::::1;:62:::0;21853:26;;21844:47:::1;::::0;21881:9;21844:8:::1;:47::i;:::-;21815:76:::0;;21943:31:::1;::::0;::::1;::::0;21815:26:::1;::::0;21934:52:::1;::::0;21976:9;21934:8:::1;:52::i;:::-;22078:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;22078:55:0;::::1;::::0;;;;;;;;21904:82;;-1:-1:-1;22057:115:0::1;::::0;22146:15;22057:8:::1;:115::i;:::-;21999:31;::::0;;;:15:::1;:31;::::0;;;;;;;-1:-1:-1;;;;;21999:55:0;;::::1;::::0;;;;;;;;:173;;;;22236:29;;::::1;::::0;;:11:::1;:29:::0;;;;22215:94:::1;::::0;22278:20;22215:8:::1;:94::i;:::-;-1:-1:-1::0;;;;;22183:29:0;::::1;;::::0;;;:11:::1;:29;::::0;;;;:126;22362:18:::1;::::0;22341:83:::1;::::0;22393:20;22341:8:::1;:83::i;:::-;22320:18;:104:::0;;;22442:245:::1;::::0;;-1:-1:-1;;;;;22442:245:0;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;22488:14;;22442:245:::1;::::0;;;;;;;;::::1;1890:1;;;21240:1455:::0;;;;;;:::o;12831:494::-;12993:30;13007:3;13012:10;12993:13;:30::i;:::-;12985:65;;;;;-1:-1:-1;;;12985:65:0;;;;;;;;;;;;-1:-1:-1;;;12985:65:0;;;;;;;;;;;;;;;13109:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;13109:36:0;;;;;;;;;;13100:51;;13147:3;13100:8;:51::i;:::-;13061:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;13061:36:0;;;;;;;;;;:90;;;;13210:36;;;;;;13201:51;;13248:3;13201:8;:51::i;:::-;13162:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;13162:36:0;;;;;;;;;;;;;:90;;;;13268:49;;;;;;;;;;;13178:14;;13268:49;;;;;;;;12831:494;;;;:::o;2756:162::-;-1:-1:-1;;;;;2862:15:0;;;2831:4;2879:16;;;:10;:16;;;;;;;;2862:15;;;2879:25;;;;;;;;;;2831:4;;2855:55;;2862:15;;2879:30;2855:6;:55::i;:::-;2848:62;;2756:162;;;;;:::o;9817:330::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9916:31:::1;::::0;;;:15:::1;:31;::::0;;;;:47:::1;;::::0;:52;9908:106:::1;;;;-1:-1:-1::0;;;9908:106:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10025:31;::::0;;;:15:::1;:31;::::0;;;;;;;;10075:8:::1;10025:47;::::0;;::::1;:58:::0;10099:40;;;;;;;::::1;::::0;;;;;;;;::::1;9817:330:::0;:::o;4163:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;4754:26::-;;;;:::o;11838:120::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11916:1:::1;11898:15;:19:::0;;;11933:17:::1;::::0;::::1;::::0;11916:1;11933:17:::1;11838:120::o:0;1435:237::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1522:15:::1;;1541:1;1522:20;1514:64;;;::::0;;-1:-1:-1;;;1514:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;1514:64:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;1589:27:0;::::1;1619:1;1589:27:::0;;;::::1;::::0;;;;;;;:31;;;;1636:28;;;;;;;::::1;::::0;;;;;;;;::::1;1435:237:::0;:::o;14691:3494::-;14975:15;;14994:1;14975:20;14967:64;;;;;-1:-1:-1;;;14967:64:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;14967:64:0;;;;;;;;;;;;;;;15044:20;;:::i;:::-;-1:-1:-1;15067:21:0;;;;:5;:21;;;;;;;;-1:-1:-1;;;;;15067:27:0;;;;;;;;;;15044:50;;;;;;;;;;;;;;;;;;;15105:40;;:::i;:::-;-1:-1:-1;15148:31:0;;;;:15;:31;;;;;;;;;15105:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15239:94;;;;-1:-1:-1;;;15239:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15388:25;;15379:52;;15415:15;15379:8;:52::i;:::-;15346:85;;15484:22;;;;15475:43;;15508:9;15475:8;:43::i;:::-;15442:22;;;:76;15571:29;;15562:50;;15602:9;15562:8;:50::i;:::-;15529:83;;15661:34;;;;15529:29;;15652:55;;15697:9;15652:8;:55::i;:::-;15625:82;;15718:23;15745:68;15754:18;:34;;;15790:8;:22;;;15745:8;:68::i;:::-;15718:95;;15851:39;15860:10;;15872:17;15851:8;:39::i;:::-;15824:10;:66;;;;15996:228;16030:1;16017:9;:14;;16046:163;16130:18;:30;;;16051:75;16060:18;:29;;;16091:18;:34;;;16051:8;:75::i;:::-;:109;;16191:17;;16177:10;;:31;;16046:4;:163::i;:::-;15996:6;:228::i;:::-;15976:301;;;;;-1:-1:-1;;;15976:301:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;16373:177;16394:42;16412:1;16399:9;:14;;16434:1;16415:15;:20;;16394:4;:42::i;:::-;16470:67;16479:8;:25;;;16506:18;:30;;;16470:8;:67::i;:::-;16451:15;:86;;16373:6;:177::i;:::-;16353:242;;;;;-1:-1:-1;;;16353:242:0;;;;;;;;;;;;-1:-1:-1;;;16353:242:0;;;;;;;;;;;;;;;16676:83;16683:42;16701:1;16688:9;:14;;16723:1;16704:15;:20;;16683:4;:42::i;:::-;16727:31;16741:4;16747:10;16727:13;:31::i;16676:83::-;16668:133;;;;-1:-1:-1;;;16668:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16856:73;16882:1;16863:15;:20;;16885:43;16899:16;16917:10;16885:13;:43::i;16856:73::-;16848:123;;;;-1:-1:-1;;;16848:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17020:66;17040:1;17027:9;:14;;17043:42;17057:15;17074:10;17043:13;:42::i;17020:66::-;17012:110;;;;;-1:-1:-1;;;17012:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17195:84;17202:8;:22;;;17228:1;17202:27;17250:18;:28;;;17231:15;:47;;17195:6;:84::i;:::-;17187:112;;;;;-1:-1:-1;;;17187:112:0;;;;;;;;;;;;-1:-1:-1;;;17187:112:0;;;;;;;;;;;;;;;17381:1;17369:9;:13;17365:125;;;17431:15;;17405:8;:22;;;:41;;17397:81;;;;;-1:-1:-1;;;17397:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17574:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;17574:49:0;;;;;;;;;;17565:76;;17625:15;17565:8;:76::i;:::-;17502:31;;;;:15;:31;;;;;;;;-1:-1:-1;;;;;17502:49:0;;;;;;;;;;;:139;;;;17694:28;;;;;:11;:28;;;;17685:57;;17724:17;17685:8;:57::i;:::-;17654:11;:28;17666:15;-1:-1:-1;;;;;17654:28:0;-1:-1:-1;;;;;17654:28:0;;;;;;;;;;;;:88;;;;17785:8;17755:5;:21;17761:14;17755:21;;;;;;;;;;;:27;17777:4;-1:-1:-1;;;;;17755:27:0;-1:-1:-1;;;;;17755:27:0;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;17838:18;17804:15;:31;17820:14;17804:31;;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17945:4;-1:-1:-1;;;;;17874:303:0;17916:14;17874:303;17964:16;17995:15;18025;18055:9;18079:8;:25;;;18119:8;:22;;;18156:10;;17874:303;;;;-1:-1:-1;;;;;17874:303:0;-1:-1:-1;;;;;17874:303:0;;;;;;-1:-1:-1;;;;;17874:303:0;-1:-1:-1;;;;;17874:303:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14691:3494;;;;;;;;;;:::o;3944:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2493:167::-;2571:10;2594:1;2560:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;2560:31:0;;;;;;;;;;;:35;;;;2611:41;;;;;;;;;;;;;;;;;;;;;;;;2493:167;:::o;10996:742::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11154:15:::1;;11173:1;11154:20;11146:64;;;::::0;;-1:-1:-1;;;11146:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;11146:64:0;;;;;;;;;;;;;::::1;;11225:9;-1:-1:-1::0;;;11225:26:0::1;11221:444;;;11253:31;::::0;;;:15:::1;:31;::::0;;;;;;;:43:::1;:50:::0;;;11221:444:::1;;;11323:9;-1:-1:-1::0;;;11323:31:0::1;11319:346;;;11356:31;::::0;;;:15:::1;:31;::::0;;;;:48:::1;;:55:::0;;;11319:346:::1;;;11431:9;-1:-1:-1::0;;;11431:26:0::1;11427:238;;;11459:31;::::0;;;:15:::1;:31;::::0;;;;:43:::1;;:50:::0;;;11427:238:::1;;;11529:9;-1:-1:-1::0;;;11529:24:0::1;11525:140;;;11555:31;::::0;;;:15:::1;:31;::::0;;;;:41:::1;;:48:::0;;;11525:140:::1;;;11619:46;;-1:-1:-1::0;;;11619:46:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11525:140;11681:49;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;10996:742:::0;;;:::o;2170:173::-;2251:10;2240:22;;;;2274:1;2240:22;;;;;;;;-1:-1:-1;;;;;2240:31:0;;;;;;;;;;;;:35;;;;2291:44;;;;;;;;;;;;;;;;;;;;;;;2170:173;:::o;13555:337::-;13653:30;13667:3;13672:10;13653:13;:30::i;:::-;13645:65;;;;;-1:-1:-1;;;13645:65:0;;;;;;;;;;;;-1:-1:-1;;;13645:65:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;13749:16:0;;;;;;:11;:16;;;;;;13740:31;;13767:3;13740:8;:31::i;:::-;-1:-1:-1;;;;;13721:16:0;;;;;;;:11;:16;;;;;;:50;;;;13810:16;;;;;;;13801:31;;13828:3;13801:8;:31::i;:::-;-1:-1:-1;;;;;13782:16:0;;;;;;;:11;:16;;;;;;;;;:50;;;;13848:36;;;;;;;13782:16;;13848:36;;;;;;;;;;;;;13555:337;;;:::o;4294:69::-;;;;;;;;;;;;;:::o;4649:30::-;;;;:::o;10325:422::-;1825:10;1806:18;:30;;;;;;;;;;;1840:1;1806:35;1798:81;;;;-1:-1:-1;;;1798:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10425:15:::1;;10444:1;10425:20;10417:64;;;::::0;;-1:-1:-1;;;10417:64:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;;;;;;;10417:64:0;;;;;;;;;;;;;::::1;;10496:9;-1:-1:-1::0;;;10496:32:0::1;10492:198;;;10530:17;:24:::0;;;10492:198:::1;;;10574:9;-1:-1:-1::0;;;10574:30:0::1;10570:120;;;10606:15;:22:::0;;;10570:120:::1;10706:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;10325:422:::0;;:::o;7854:255::-;7942:14;;;7916:9;7975:6;;;;:16;;;7990:1;7985;:6;;7975:16;7967:61;;;;;-1:-1:-1;;;7967:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8052:1;8047;:6;;:16;;;;8062:1;8057;:6;;8047:16;8039:62;;;;-1:-1:-1;;;8039:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8872:260;8959:13;;;8934:8;8991:14;;;8983:57;;;;;-1:-1:-1;;;8983:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9059:6;;;:28;;;9085:1;9073;9069;:5;;;;;;:18;9059:28;9051:73;;;;;-1:-1:-1;;;9051:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9138:155;9236:5;;;9231:16;;;;9223:62;;;;-1:-1:-1;;;9223:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9299:156;9397:5;;;9392:16;;;;9384:63;;;;-1:-1:-1;;;9384:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8363:255;8451:14;;;8425:9;8484:6;;;;:16;;;8499:1;8494;:6;;8484:16;8476:61;;;;;-1:-1:-1;;;8476:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8561:1;8556;:6;;:16;;;;8571:1;8566;:6;;8556:16;8548:62;;;;-1:-1:-1;;;8548:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9461:174;9524:9;9554:6;;;:30;;-1:-1:-1;;9569:5:0;;;9583:1;9578;9569:5;9578:1;9564:15;;;;;:20;9554:30;9546:81;;;;-1:-1:-1;;;9546:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14011:104;14098:9;;14091:17::o;13900:105::-;13989:8;;13982:16::o;873:24956::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

ipfs://b984909f35a410f65749fd6fea7c79754913d1b3d33734d672f0256679967632

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

The SAFE Engine stores all SAFEs' states and system coin balances, as well as the amount of collateral and debt each address has. This contract is self-contained and has no external dependencies.

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.