ETH Price: $1,972.95 (+0.22%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Cast117904772021-02-04 15:04:381843 days ago1612451078IN
0xEc0E7423...0A2D3A2e1
0 ETH0.03228195252
Schedule117775022021-02-02 15:00:221845 days ago1612278022IN
0xEc0E7423...0A2D3A2e1
0 ETH0.01428339172

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Method Block
From
To
-117519502021-01-29 16:49:301849 days ago1611938970
0xEc0E7423...0A2D3A2e1
 Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

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

Contract Source Code Verified (Exact Match)

Contract Name:
DssSpell

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 1 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
/**
 *Submitted for verification at Etherscan.io on 2021-01-29
*/

// SPDX-License-Identifier: GPL-3.0-or-later
// hevm: flattened sources of src/DssSpell.sol
pragma solidity =0.6.11 >=0.6.11 <0.7.0;

////// lib/dss-exec-lib/src/CollateralOpts.sol
/* pragma solidity ^0.6.11; */

struct CollateralOpts {
    bytes32 ilk;
    address gem;
    address join;
    address flip;
    address pip;
    bool    isLiquidatable;
    bool    isOSM;
    bool    whitelistOSM;
    uint256 ilkDebtCeiling;
    uint256 minVaultAmount;
    uint256 maxLiquidationAmount;
    uint256 liquidationPenalty;
    uint256 ilkStabilityFee;
    uint256 bidIncrease;
    uint256 bidDuration;
    uint256 auctionDuration;
    uint256 liquidationRatio;
}

////// lib/dss-exec-lib/src/DssAction.sol
//
// DssAction.sol -- DSS Executive Spell Actions
//
// Copyright (C) 2020 Maker Ecosystem Growth Holdings, Inc.
//
// 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.11; */

/* import "./CollateralOpts.sol"; */

// https://github.com/makerdao/dss-chain-log
interface ChainlogLike {
    function getAddress(bytes32) external view returns (address);
}

interface RegistryLike {
    function ilkData(bytes32) external view returns (
        uint256       pos,
        address       gem,
        address       pip,
        address       join,
        address       flip,
        uint256       dec,
        string memory name,
        string memory symbol
    );
}

// Includes Median and OSM functions
interface OracleLike {
    function src() external view returns (address);
    function lift(address[] calldata) external;
    function drop(address[] calldata) external;
    function setBar(uint256) external;
    function kiss(address) external;
    function diss(address) external;
    function kiss(address[] calldata) external;
    function diss(address[] calldata) external;
}

abstract contract DssAction {

    address public immutable lib;
    bool    public immutable officeHours;

    // Changelog address applies to MCD deployments on
    //        mainnet, kovan, rinkeby, ropsten, and goerli
    address constant public LOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F;

    constructor(address lib_, bool officeHours_) public {
        lib = lib_;
        officeHours = officeHours_;
    }

    // DssExec calls execute. We limit this function subject to officeHours modifier.
    function execute() external limited {
        actions();
    }

    // DssAction developer must override `actions()` and place all actions to be called inside.
    //   The DssExec function will call this subject to the officeHours limiter
    //   By keeping this function public we allow simulations of `execute()` on the actions outside of the cast time.
    function actions() public virtual;

    // Modifier required to
    modifier limited {
        if (officeHours) {
            uint day = (block.timestamp / 1 days + 3) % 7;
            require(day < 5, "Can only be cast on a weekday");
            uint hour = block.timestamp / 1 hours % 24;
            require(hour >= 14 && hour < 21, "Outside office hours");
        }
        _;
    }

    /****************************/
    /*** Core Address Helpers ***/
    /****************************/
    function vat()        internal view returns (address) { return getChangelogAddress("MCD_VAT"); }
    function cat()        internal view returns (address) { return getChangelogAddress("MCD_CAT"); }
    function jug()        internal view returns (address) { return getChangelogAddress("MCD_JUG"); }
    function pot()        internal view returns (address) { return getChangelogAddress("MCD_POT"); }
    function vow()        internal view returns (address) { return getChangelogAddress("MCD_VOW"); }
    function end()        internal view returns (address) { return getChangelogAddress("MCD_END"); }
    function reg()        internal view returns (address) { return getChangelogAddress("ILK_REGISTRY"); }
    function spot()       internal view returns (address) { return getChangelogAddress("MCD_SPOT"); }
    function flap()       internal view returns (address) { return getChangelogAddress("MCD_FLAP"); }
    function flop()       internal view returns (address) { return getChangelogAddress("MCD_FLOP"); }
    function osmMom()     internal view returns (address) { return getChangelogAddress("OSM_MOM"); }
    function govGuard()   internal view returns (address) { return getChangelogAddress("GOV_GUARD"); }
    function flipperMom() internal view returns (address) { return getChangelogAddress("FLIPPER_MOM"); }
    function autoLine()   internal view returns (address) { return getChangelogAddress("MCD_IAM_AUTO_LINE"); }

    function flip(bytes32 ilk) internal view returns (address) {
        (,,,, address _flip,,,) = RegistryLike(reg()).ilkData(ilk);
        return _flip;
    }

    function getChangelogAddress(bytes32 key) internal view returns (address) {
        return ChainlogLike(LOG).getAddress(key);
    }

    function libcall(bytes memory data) internal {
        (bool ok,) = lib.delegatecall(data);
        require(ok, "DssAction/failed-lib-call");
    }


    /****************************/
    /*** Changelog Management ***/
    /****************************/
    function setChangelogAddress(bytes32 key, address value) internal {
        libcall(abi.encodeWithSignature("setChangelogAddress(address,bytes32,address)", LOG, key, value));
    }

    function setChangelogVersion(string memory version) internal {
        libcall(abi.encodeWithSignature("setChangelogVersion(address,string)", LOG, version));
    }

    function setChangelogIPFS(string memory ipfs) internal {
        libcall(abi.encodeWithSignature("setChangelogIPFS(address,string)", LOG, ipfs));
    }

    function setChangelogSHA256(string memory SHA256) internal {
        libcall(abi.encodeWithSignature("setChangelogSHA256(address,string)", LOG, SHA256));
    }

    /**********************/
    /*** Authorizations ***/
    /**********************/
    function authorize(address base, address ward) internal virtual {
        libcall(abi.encodeWithSignature("authorize(address,address)", base, ward));
    }

    function deauthorize(address base, address ward) internal {
        libcall(abi.encodeWithSignature("deauthorize(address,address)", base, ward));
    }

    /**************************/
    /*** Accumulating Rates ***/
    /**************************/
    function accumulateDSR() internal {
        libcall(abi.encodeWithSignature("accumulateDSR(address)", pot()));
    }

    function accumulateCollateralStabilityFees(bytes32 ilk) internal {
        libcall(abi.encodeWithSignature("accumulateCollateralStabilityFees(address,bytes32)", jug(), ilk));
    }

    /*********************/
    /*** Price Updates ***/
    /*********************/
    function updateCollateralPrice(bytes32 ilk) internal {
        libcall(abi.encodeWithSignature("updateCollateralPrice(address,bytes32)", spot(), ilk));
    }

    /****************************/
    /*** System Configuration ***/
    /****************************/
    function setContract(address base, bytes32 what, address addr) internal {
        libcall(abi.encodeWithSignature("setContract(address,bytes32,address)", base, what, addr));
    }

    function setContract(address base, bytes32 ilk, bytes32 what, address addr) internal {
        libcall(abi.encodeWithSignature("setContract(address,bytes32,bytes32,address)", base, ilk, what, addr));
    }

    /******************************/
    /*** System Risk Parameters ***/
    /******************************/
    function setGlobalDebtCeiling(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setGlobalDebtCeiling(address,uint256)", vat(), amount));
    }

    function increaseGlobalDebtCeiling(uint256 amount) internal {
        libcall(abi.encodeWithSignature("increaseGlobalDebtCeiling(address,uint256)", vat(), amount));
    }

    function decreaseGlobalDebtCeiling(uint256 amount) internal {
        libcall(abi.encodeWithSignature("decreaseGlobalDebtCeiling(address,uint256)", vat(), amount));
    }

    function setDSR(uint256 rate) internal {
        libcall(abi.encodeWithSignature("setDSR(address,uint256)", pot(), rate));
    }

    function setSurplusAuctionAmount(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setSurplusAuctionAmount(address,uint256)", vow(), amount));
    }

    function setSurplusBuffer(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setSurplusBuffer(address,uint256)", vow(), amount));
    }

    function setMinSurplusAuctionBidIncrease(uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setMinSurplusAuctionBidIncrease(address,uint256)", flap(), pct_bps));
    }

    function setSurplusAuctionBidDuration(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setSurplusAuctionBidDuration(address,uint256)", flap(), duration));
    }

    function setSurplusAuctionDuration(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setSurplusAuctionDuration(address,uint256)", flap(), duration));
    }

    function setDebtAuctionDelay(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionDelay(address,uint256)", vow(), duration));
    }

    function setDebtAuctionDAIAmount(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionDAIAmount(address,uint256)", vow(), amount));
    }

    function setDebtAuctionMKRAmount(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionMKRAmount(address,uint256)", vow(), amount));
    }

    function setMinDebtAuctionBidIncrease(uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setMinDebtAuctionBidIncrease(address,uint256)", flop(), pct_bps));
    }

    function setDebtAuctionBidDuration(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionBidDuration(address,uint256)", flop(), duration));
    }

    function setDebtAuctionDuration(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionDuration(address,uint256)", flop(), duration));
    }

    function setDebtAuctionMKRIncreaseRate(uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setDebtAuctionMKRIncreaseRate(address,uint256)", flop(), pct_bps));
    }

    function setMaxTotalDAILiquidationAmount(uint256 amount) internal {
        libcall(abi.encodeWithSignature("setMaxTotalDAILiquidationAmount(address,uint256)", cat(), amount));
    }

    function setEmergencyShutdownProcessingTime(uint256 duration) internal {
        libcall(abi.encodeWithSignature("setEmergencyShutdownProcessingTime(address,uint256)", end(), duration));
    }

    function setGlobalStabilityFee(uint256 rate) internal {
        libcall(abi.encodeWithSignature("setGlobalStabilityFee(address,uint256)", jug(), rate));
    }

    function setDAIReferenceValue(uint256 value) internal {
        libcall(abi.encodeWithSignature("setDAIReferenceValue(address,uint256)", spot(),value));
    }

    /*****************************/
    /*** Collateral Management ***/
    /*****************************/
    function setIlkDebtCeiling(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("setIlkDebtCeiling(address,bytes32,uint256)", vat(), ilk, amount));
    }

    function increaseIlkDebtCeiling(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("increaseIlkDebtCeiling(address,bytes32,uint256,bool)", vat(), ilk, amount, true));
    }

    function decreaseIlkDebtCeiling(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("decreaseIlkDebtCeiling(address,bytes32,uint256,bool)", vat(), ilk, amount, true));
    }

    function setIlkAutoLineParameters(bytes32 ilk, uint256 amount, uint256 gap, uint256 ttl) internal {
        libcall(abi.encodeWithSignature("setIlkAutoLineParameters(address,bytes32,uint256,uint256,uint256)", autoLine(), ilk, amount, gap, ttl));
    }

    function setIlkAutoLineDebtCeiling(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("setIlkAutoLineDebtCeiling(address,bytes32,uint256)", autoLine(), ilk, amount));
    }

    function removeIlkFromAutoLine(bytes32 ilk) internal {
        libcall(abi.encodeWithSignature("removeIlkFromAutoLine(address,bytes32)", autoLine(), ilk));
    }

    function setIlkMinVaultAmount(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("setIlkMinVaultAmount(address,bytes32,uint256)", vat(), ilk, amount));
    }

    function setIlkLiquidationPenalty(bytes32 ilk, uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setIlkLiquidationPenalty(address,bytes32,uint256)", cat(), ilk, pct_bps));
    }

    function setIlkMaxLiquidationAmount(bytes32 ilk, uint256 amount) internal {
        libcall(abi.encodeWithSignature("setIlkMaxLiquidationAmount(address,bytes32,uint256)", cat(), ilk, amount));
    }

    function setIlkLiquidationRatio(bytes32 ilk, uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setIlkLiquidationRatio(address,bytes32,uint256)", spot(), ilk, pct_bps));
    }

    function setIlkMinAuctionBidIncrease(bytes32 ilk, uint256 pct_bps) internal {
        libcall(abi.encodeWithSignature("setIlkMinAuctionBidIncrease(address,uint256)", flip(ilk), pct_bps));
    }

    function setIlkBidDuration(bytes32 ilk, uint256 duration) internal {
        libcall(abi.encodeWithSignature("setIlkBidDuration(address,uint256)", flip(ilk), duration));
    }

    function setIlkAuctionDuration(bytes32 ilk, uint256 duration) internal {
        libcall(abi.encodeWithSignature("setIlkAuctionDuration(address,uint256)", flip(ilk), duration));
    }

    function setIlkStabilityFee(bytes32 ilk, uint256 rate) internal {
        libcall(abi.encodeWithSignature("setIlkStabilityFee(address,bytes32,uint256,bool)", jug(), ilk, rate, true));
    }

    /***********************/
    /*** Core Management ***/
    /***********************/
    function updateCollateralAuctionContract(bytes32 ilk, address newFlip, address oldFlip) internal {
        libcall(abi.encodeWithSignature("updateCollateralAuctionContract(address,address,address,address,bytes32,address,address)", vat(), cat(), end(), flipperMom(), ilk, newFlip, oldFlip));
    }

    function updateSurplusAuctionContract(address newFlap, address oldFlap) internal {
        libcall(abi.encodeWithSignature("updateSurplusAuctionContract(address,address,address,address)", vat(), vow(), newFlap, oldFlap));
    }

    function updateDebtAuctionContract(address newFlop, address oldFlop) internal {
        libcall(abi.encodeWithSignature("updateDebtAuctionContract(address,address,address,address,address)", vat(), vow(), govGuard(), newFlop, oldFlop));
    }

    /*************************/
    /*** Oracle Management ***/
    /*************************/
    function addWritersToMedianWhitelist(address medianizer, address[] memory feeds) internal {
        libcall(abi.encodeWithSignature("addWritersToMedianWhitelist(address,address[])", medianizer, feeds));
    }

    function removeWritersFromMedianWhitelist(address medianizer, address[] memory feeds) internal {
        libcall(abi.encodeWithSignature("removeWritersFromMedianWhitelist(address,address[])", medianizer, feeds));
    }

    function addReadersToMedianWhitelist(address medianizer, address[] memory readers) internal {
        libcall(abi.encodeWithSignature("addReadersToMedianWhitelist(address,address[])", medianizer, readers));
    }

    function addReaderToMedianWhitelist(address medianizer, address reader) internal {
        libcall(abi.encodeWithSignature("addReaderToMedianWhitelist(address,address)", medianizer, reader));
    }

    function removeReadersFromMedianWhitelist(address medianizer, address[] memory readers) internal {
        libcall(abi.encodeWithSignature("removeReadersFromMedianWhitelist(address,address[])", medianizer, readers));
    }

    function removeReaderFromMedianWhitelist(address medianizer, address reader) internal {
        libcall(abi.encodeWithSignature("removeReaderFromMedianWhitelist(address,address)", medianizer, reader));
    }

    function setMedianWritersQuorum(address medianizer, uint256 minQuorum) internal {
        libcall(abi.encodeWithSignature("setMedianWritersQuorum(address,uint256)", medianizer, minQuorum));
    }

    function addReaderToOSMWhitelist(address osm, address reader) internal {
        libcall(abi.encodeWithSignature("addReaderToOSMWhitelist(address,address)", osm, reader));
    }

    function removeReaderFromOSMWhitelist(address osm, address reader) internal {
        libcall(abi.encodeWithSignature("removeReaderFromOSMWhitelist(address,address)", osm, reader));
    }

    function allowOSMFreeze(address osm, bytes32 ilk) internal {
        libcall(abi.encodeWithSignature("allowOSMFreeze(address,address,bytes32)", osmMom(), osm, ilk));
    }

    /*****************************/
    /*** Collateral Onboarding ***/
    /*****************************/

    // Minimum actions to onboard a collateral to the system with 0 line.
    function addCollateralBase(bytes32 ilk, address gem, address join, address flipper, address pip) internal {
        libcall(abi.encodeWithSignature(
            "addCollateralBase(address,address,address,address,address,address,bytes32,address,address,address,address)",
            vat(), cat(), jug(), end(), spot(), reg(), ilk, gem, join, flipper, pip
        ));
    }

    // Complete collateral onboarding logic.
    function addNewCollateral(CollateralOpts memory co) internal {
        // Add the collateral to the system.
        addCollateralBase(co.ilk, co.gem, co.join, co.flip, co.pip);

        // Allow FlipperMom to access to the ilk Flipper
        authorize(co.flip, flipperMom());
        // Disallow Cat to kick auctions in ilk Flipper
        if(!co.isLiquidatable) deauthorize(flipperMom(), co.flip);

        if(co.isOSM) { // If pip == OSM
            // Allow OsmMom to access to the TOKEN OSM
            authorize(co.pip, osmMom());
            if (co.whitelistOSM) { // If median is src in OSM
                // Whitelist OSM to read the Median data (only necessary if it is the first time the token is being added to an ilk)
                addReaderToMedianWhitelist(address(OracleLike(co.pip).src()), co.pip);
            }
            // Whitelist Spotter to read the OSM data (only necessary if it is the first time the token is being added to an ilk)
            addReaderToOSMWhitelist(co.pip, spot());
            // Whitelist End to read the OSM data (only necessary if it is the first time the token is being added to an ilk)
            addReaderToOSMWhitelist(co.pip, end());
            // Set TOKEN OSM in the OsmMom for new ilk
            allowOSMFreeze(co.pip, co.ilk);
        }
        // Increase the global debt ceiling by the ilk ceiling
        increaseGlobalDebtCeiling(co.ilkDebtCeiling);
        // Set the ilk debt ceiling
        setIlkDebtCeiling(co.ilk, co.ilkDebtCeiling);
        // Set the ilk dust
        setIlkMinVaultAmount(co.ilk, co.minVaultAmount);
        // Set the dunk size
        setIlkMaxLiquidationAmount(co.ilk, co.maxLiquidationAmount);
        // Set the ilk liquidation penalty
        setIlkLiquidationPenalty(co.ilk, co.liquidationPenalty);

        // Set the ilk stability fee
        setIlkStabilityFee(co.ilk, co.ilkStabilityFee);

        // Set the ilk percentage between bids
        setIlkMinAuctionBidIncrease(co.ilk, co.bidIncrease);
        // Set the ilk time max time between bids
        setIlkBidDuration(co.ilk, co.bidDuration);
        // Set the ilk max auction duration
        setIlkAuctionDuration(co.ilk, co.auctionDuration);
        // Set the ilk min collateralization ratio
        setIlkLiquidationRatio(co.ilk, co.liquidationRatio);

        // Update ilk spot value in Vat
        updateCollateralPrice(co.ilk);
    }
}

////// lib/dss-exec-lib/src/DssExec.sol
//
// DssExec.sol -- MakerDAO Executive Spell Template
//
// Copyright (C) 2020 Maker Ecosystem Growth Holdings, Inc.
//
// 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.11; */

interface PauseAbstract {
    function delay() external view returns (uint256);
    function plot(address, bytes32, bytes calldata, uint256) external;
    function exec(address, bytes32, bytes calldata, uint256) external returns (bytes memory);
}

interface Changelog {
    function getAddress(bytes32) external view returns (address);
}

interface SpellAction {
    function officeHours() external view returns (bool);
}

contract DssExec {

    Changelog      constant public log   = Changelog(0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F);
    uint256                 public eta;
    bytes                   public sig;
    bool                    public done;
    bytes32       immutable public tag;
    address       immutable public action;
    uint256       immutable public expiration;
    PauseAbstract immutable public pause;

    // Provides a descriptive tag for bot consumption
    // This should be modified weekly to provide a summary of the actions
    // Hash: seth keccak -- "$(wget https://<executive-vote-canonical-post> -q -O - 2>/dev/null)"
    string                  public description;

    function officeHours() external view returns (bool) {
        return SpellAction(action).officeHours();
    }

    function nextCastTime() external view returns (uint256 castTime) {
        require(eta != 0, "DssExec/spell-not-scheduled");
        castTime = block.timestamp > eta ? block.timestamp : eta; // Any day at XX:YY

        if (SpellAction(action).officeHours()) {
            uint256 day    = (castTime / 1 days + 3) % 7;
            uint256 hour   = castTime / 1 hours % 24;
            uint256 minute = castTime / 1 minutes % 60;
            uint256 second = castTime % 60;

            if (day >= 5) {
                castTime += (6 - day) * 1 days;                 // Go to Sunday XX:YY
                castTime += (24 - hour + 14) * 1 hours;         // Go to 14:YY UTC Monday
                castTime -= minute * 1 minutes + second;        // Go to 14:00 UTC
            } else {
                if (hour >= 21) {
                    if (day == 4) castTime += 2 days;           // If Friday, fast forward to Sunday XX:YY
                    castTime += (24 - hour + 14) * 1 hours;     // Go to 14:YY UTC next day
                    castTime -= minute * 1 minutes + second;    // Go to 14:00 UTC
                } else if (hour < 14) {
                    castTime += (14 - hour) * 1 hours;          // Go to 14:YY UTC same day
                    castTime -= minute * 1 minutes + second;    // Go to 14:00 UTC
                }
            }
        }
    }

    // @param _description  A string description of the spell
    // @param _expiration   The timestamp this spell will expire. (Ex. now + 30 days)
    // @param _spellAction  The address of the spell action
    constructor(string memory _description, uint256 _expiration, address _spellAction) public {
        pause       = PauseAbstract(log.getAddress("MCD_PAUSE"));
        description = _description;
        expiration  = _expiration;
        action      = _spellAction;

        sig = abi.encodeWithSignature("execute()");
        bytes32 _tag;                    // Required for assembly access
        address _action = _spellAction;  // Required for assembly access
        assembly { _tag := extcodehash(_action) }
        tag = _tag;
    }

    function schedule() public {
        require(now <= expiration, "This contract has expired");
        require(eta == 0, "This spell has already been scheduled");
        eta = now + PauseAbstract(pause).delay();
        pause.plot(action, tag, sig, eta);
    }

    function cast() public {
        require(!done, "spell-already-cast");
        done = true;
        pause.exec(action, tag, sig, eta);
    }
}

////// src/DssSpell.sol
// Copyright (C) 2021 Maker Ecosystem Growth Holdings, INC.
//
// 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.11; */

/* import "dss-exec-lib/DssExec.sol"; */
/* import "dss-exec-lib/DssAction.sol"; */

contract DssSpellAction is DssAction {

    // Provides a descriptive tag for bot consumption
    // This should be modified weekly to provide a summary of the actions
    // Hash: seth keccak -- "$(wget https://raw.githubusercontent.com/makerdao/community/e2929f286f2c486c0485637967284630643ddc8d/governance/votes/Executive%20vote%20-%20January%2029%2C%202021.md -q -O - 2>/dev/null)"
    string public constant description =
        "2021-01-29 MakerDAO Executive Spell | Hash: 0xbb7974fc8e89c016a6c42f5ced4b1f42e45671e5f4f4009535658affb6a98343";


    // Many of the settings that change weekly rely on the rate accumulator
    // described at https://docs.makerdao.com/smart-contract-modules/rates-module
    // To check this yourself, use the following rate calculation (example 8%):
    //
    // $ bc -l <<< 'scale=27; e( l(1.08)/(60 * 60 * 24 * 365) )'
    //
    // A table of rates can be found at
    //    https://ipfs.io/ipfs/QmefQMseb3AiTapiAKKexdKHig8wroKuZbmLtPLv4u2YwW
    //

    /**
        @dev constructor (required)
        @param lib         address of the DssExecLib contract
        @param officeHours true if officehours enabled
    */
    constructor(address lib, bool officeHours) public DssAction(lib, officeHours) {}

    uint256 constant MILLION = 10**6;

    function actions() public override {
        //                           ilk            line           gap       ttl
        setIlkAutoLineParameters("ETH-A", 1500 * MILLION, 30 * MILLION, 12 hours);
    }
}

contract DssSpell is DssExec {
    address public constant LIB = 0xFC32E74e6e33D924bd2fBFC7A27b6F2177032760;
    DssSpellAction public spell = new DssSpellAction(LIB, false);
    constructor() DssExec(spell.description(), now + 30 days, address(spell)) public {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"LIB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"action","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"description","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"done","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"expiration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"log","outputs":[{"internalType":"contract Changelog","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextCastTime","outputs":[{"internalType":"uint256","name":"castTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"officeHours","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"contract PauseAbstract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"schedule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sig","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"spell","outputs":[{"internalType":"contract DssSpellAction","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tag","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

61010060405273fc32e74e6e33d924bd2fbfc7a27b6f217703276060006040516200002a90620002f8565b6001600160a01b03909216825215156020820152604080519182900301906000f0801580156200005e573d6000803e3d6000fd5b50600480546001600160a01b0319166001600160a01b03929092169190911790553480156200008c57600080fd5b506004805460408051633942720b60e11b815290516001600160a01b0390921692637284e416928282019260009290829003018186803b158015620000d057600080fd5b505afa158015620000e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156200010f57600080fd5b81019080805160405193929190846401000000008211156200013057600080fd5b9083019060208201858111156200014657600080fd5b82516401000000008111828201881017156200016157600080fd5b82525081516020918201929091019080838360005b838110156200019057818101518382015260200162000176565b50505050905090810190601f168015620001be5780820380516001836020036101000a031916815260200191505b506040525050504262278d0001600460009054906101000a90046001600160a01b031673da0ab1e0017debcd72be8599041a2aa3ba7e740f6001600160a01b03166321f8a7216040518163ffffffff1660e01b81526004018080684d43445f504155534560b81b815250602001905060206040518083038186803b1580156200024657600080fd5b505afa1580156200025b573d6000803e3d6000fd5b505050506040513d60208110156200027257600080fd5b505160601b6001600160601b03191660e05282516200029990600390602086019062000306565b5060c08290526001600160601b0319606082901b1660a0526040805160048152602481019091526020810180516001600160e01b0316631851865560e21b1781529051620002ea9160019162000306565b503f60805250620003ab9050565b6106338062000f8483390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034957805160ff191683800117855562000379565b8280016001018555821562000379579182015b82811115620003795782518255916020019190600101906200035c565b50620003879291506200038b565b5090565b620003a891905b8082111562000387576000815560010162000392565b90565b60805160a05160601c60c05160e05160601c610b6b620004196000398061040d5280610522528061077352806108945250806102ad52806106c3525080610289528061030f528061049d528061081452806109d75250806102e952806104d0528061083f5250610b6b6000f3fe608060405234801561001057600080fd5b50600436106100c45760003560e01c8062a7029b146100c95780630a7a1c4d146101465780634665096d1461016a57806351973ec91461018457806351f910661461018c5780636e832f07146101945780637284e416146101b057806379885b91146101b85780638456cb59146101c057806396d373e5146101c8578063ae8421e1146101d2578063b0604a26146101da578063ea762b79146101e2578063f7992d85146101ea578063fe7d47bb146101f2575b600080fd5b6100d16101fa565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010b5781810151838201526020016100f3565b50505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61014e610287565b604080516001600160a01b039092168252519081900360200190f35b6101726102ab565b60408051918252519081900360200190f35b61014e6102cf565b6101726102e7565b61019c61030b565b604080519115158252519081900360200190f35b6100d1610398565b61014e6103f3565b61014e61040b565b6101d061042f565b005b61019c6106b8565b6101d06106c1565b61014e610958565b610172610967565b61017261096d565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561027f5780601f106102545761010080835404028352916020019161027f565b820191906000526020600020905b81548152906001019060200180831161026257829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b15801561036657600080fd5b505afa15801561037a573d6000803e3d6000fd5b505050506040513d602081101561039057600080fd5b505190505b90565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561027f5780601f106102545761010080835404028352916020019161027f565b73fc32e74e6e33d924bd2fbfc7a27b6f217703276081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025460ff161561047c576040805162461bcd60e51b81526020600482015260126024820152711cdc195b1b0b585b1c9958591e4b58d85cdd60721b604482015290519081900360640190fd5b6002805460ff19166001908117825560005460405163168ccd6760e01b81527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03818116600484019081527f000000000000000000000000000000000000000000000000000000000000000060248501819052606485018690526080604486019081528754600019818a161561010002011698909804608486018190527f0000000000000000000000000000000000000000000000000000000000000000939093169763168ccd6797949691959193909160a40190859080156105a75780601f1061057c576101008083540402835291602001916105a7565b820191906000526020600020905b81548152906001019060200180831161058a57829003601f168201915b505095505050505050600060405180830381600087803b1580156105ca57600080fd5b505af11580156105de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561060757600080fd5b8101908080516040519392919084600160201b82111561062657600080fd5b90830190602082018581111561063b57600080fd5b8251600160201b81118282018810171561065457600080fd5b82525081516020918201929091019080838360005b83811015610681578181015183820152602001610669565b50505050905090810190601f1680156106ae5780820380516001836020036101000a031916815260200191505b5060405250505050565b60025460ff1681565b7f0000000000000000000000000000000000000000000000000000000000000000421115610732576040805162461bcd60e51b8152602060048201526019602482015278151a1a5cc818dbdb9d1c9858dd081a185cc8195e1c1a5c9959603a1b604482015290519081900360640190fd5b600054156107715760405162461bcd60e51b8152600401808060200182810382526025815260200180610b116025913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050506040513d60208110156107f457600080fd5b5051420160008190556040516346d2fbbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000818116600484019081527f0000000000000000000000000000000000000000000000000000000000000000602485018190526064850186905260806044860190815260018054600281831615610100026000190190911604608488018190527f0000000000000000000000000000000000000000000000000000000000000000909616976346d2fbbb97959693959194909390929160a401908590801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b505095505050505050600060405180830381600087803b15801561093e57600080fd5b505af1158015610952573d6000803e3d6000fd5b50505050565b6004546001600160a01b031681565b60005481565b600080546109c0576040805162461bcd60e51b815260206004820152601b60248201527a111cdcd15e1958cbdcdc195b1b0b5b9bdd0b5cd8da19591d5b1959602a1b604482015290519081900360640190fd5b60005442116109d1576000546109d3565b425b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d6020811015610a5857600080fd5b505115610395576007620151808204600301066018610e10830406603c80840481900690840660058410610ab1578360060362015180028501945082601803600e01610e1002850194508082603c020185039450610b09565b60158310610ae9578360041415610acb576202a300850194505b82601803600e01610e1002850194508082603c020185039450610b09565b600e831015610b095782600e03610e1002850194508082603c0201850394505b505050509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a264697066735822122019ad98dbae1e2b616b5502e303fe34581e70dab45ec3668ea327afed33c74ffa64736f6c634300060b003360c060405234801561001057600080fd5b506040516106333803806106338339818101604052604081101561003357600080fd5b508051602090910151606082901b6001600160601b031916608052151560f881901b60a0526001600160a01b039091169060ff166105a561008e60003980610158528061024d52508061028d528061036252506105a56000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631816a5e114610067578063614619541461008b5780636e832f07146100955780637284e416146100b1578063928012301461012e578063f99e36bc14610136575b600080fd5b61006f61013e565b604080516001600160a01b039092168252519081900360200190f35b610093610156565b005b61009d61024b565b604080519115158252519081900360200190f35b6100b961026f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f35781810151838201526020016100db565b50505050905090810190601f1680156101205780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61006f61028b565b6100936102af565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7f00000000000000000000000000000000000000000000000000000000000000001561024157600762015180420460030106600581106101dd576040805162461bcd60e51b815260206004820152601d60248201527f43616e206f6e6c792062652063617374206f6e2061207765656b646179000000604482015290519081900360640190fd5b6018610e10420406600e81108015906101f65750601581105b61023e576040805162461bcd60e51b81526020600482015260146024820152734f757473696465206f666669636520686f75727360601b604482015290519081900360640190fd5b50505b6102496102af565b565b7f000000000000000000000000000000000000000000000000000000000000000081565b6040518060a00160405280606e8152602001610502606e913981565b7f000000000000000000000000000000000000000000000000000000000000000081565b610249644554482d4160d81b6359682f006301c9c38061a8c06103346102d361033a565b604080516001600160a01b03909216602483015260448201879052606482018690526084820185905260a48083018590528151808403909101815260c490920190526020810180516001600160e01b03166325d6be1160e21b17905261035e565b50505050565b6000610359704d43445f49414d5f4155544f5f4c494e4560781b610475565b905090565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826040518082805190602001908083835b602083106103ba5780518252601f19909201916020918201910161039b565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461041a576040519150601f19603f3d011682016040523d82523d6000602084013e61041f565b606091505b5050905080610471576040805162461bcd60e51b8152602060048201526019602482015278111cdcd058dd1a5bdb8bd9985a5b19590b5b1a588b58d85b1b603a1b604482015290519081900360640190fd5b5050565b600073da0ab1e0017debcd72be8599041a2aa3ba7e740f6001600160a01b03166321f8a721836040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156104cf57600080fd5b505afa1580156104e3573d6000803e3d6000fd5b505050506040513d60208110156104f957600080fd5b50519291505056fe323032312d30312d3239204d616b657244414f20457865637574697665205370656c6c207c20486173683a20307862623739373466633865383963303136613663343266356365643462316634326534353637316535663466343030393533353635386166666236613938333433a26469706673582212207667d3e19da6f74011b8a89ba4e41e0b8b0da016c648a3ee3b4b51c522f9c0d164736f6c634300060b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100c45760003560e01c8062a7029b146100c95780630a7a1c4d146101465780634665096d1461016a57806351973ec91461018457806351f910661461018c5780636e832f07146101945780637284e416146101b057806379885b91146101b85780638456cb59146101c057806396d373e5146101c8578063ae8421e1146101d2578063b0604a26146101da578063ea762b79146101e2578063f7992d85146101ea578063fe7d47bb146101f2575b600080fd5b6100d16101fa565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561010b5781810151838201526020016100f3565b50505050905090810190601f1680156101385780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61014e610287565b604080516001600160a01b039092168252519081900360200190f35b6101726102ab565b60408051918252519081900360200190f35b61014e6102cf565b6101726102e7565b61019c61030b565b604080519115158252519081900360200190f35b6100d1610398565b61014e6103f3565b61014e61040b565b6101d061042f565b005b61019c6106b8565b6101d06106c1565b61014e610958565b610172610967565b61017261096d565b60018054604080516020600284861615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561027f5780601f106102545761010080835404028352916020019161027f565b820191906000526020600020905b81548152906001019060200180831161026257829003601f168201915b505050505081565b7f000000000000000000000000e4365db41166a79d8d6a971db064509674e0ed3f81565b7f00000000000000000000000000000000000000000000000000000000603bc99a81565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7fc41dc6ac1570dcc37f168fc3508d5b7d1bc31c727115f67fbe66617f6132f67781565b60007f000000000000000000000000e4365db41166a79d8d6a971db064509674e0ed3f6001600160a01b0316636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b15801561036657600080fd5b505afa15801561037a573d6000803e3d6000fd5b505050506040513d602081101561039057600080fd5b505190505b90565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561027f5780601f106102545761010080835404028352916020019161027f565b73fc32e74e6e33d924bd2fbfc7a27b6f217703276081565b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f381565b60025460ff161561047c576040805162461bcd60e51b81526020600482015260126024820152711cdc195b1b0b585b1c9958591e4b58d85cdd60721b604482015290519081900360640190fd5b6002805460ff19166001908117825560005460405163168ccd6760e01b81527f000000000000000000000000e4365db41166a79d8d6a971db064509674e0ed3f6001600160a01b03818116600484019081527fc41dc6ac1570dcc37f168fc3508d5b7d1bc31c727115f67fbe66617f6132f67760248501819052606485018690526080604486019081528754600019818a161561010002011698909804608486018190527f000000000000000000000000be286431454714f511008713973d3b053a2d38f3939093169763168ccd6797949691959193909160a40190859080156105a75780601f1061057c576101008083540402835291602001916105a7565b820191906000526020600020905b81548152906001019060200180831161058a57829003601f168201915b505095505050505050600060405180830381600087803b1580156105ca57600080fd5b505af11580156105de573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561060757600080fd5b8101908080516040519392919084600160201b82111561062657600080fd5b90830190602082018581111561063b57600080fd5b8251600160201b81118282018810171561065457600080fd5b82525081516020918201929091019080838360005b83811015610681578181015183820152602001610669565b50505050905090810190601f1680156106ae5780820380516001836020036101000a031916815260200191505b5060405250505050565b60025460ff1681565b7f00000000000000000000000000000000000000000000000000000000603bc99a421115610732576040805162461bcd60e51b8152602060048201526019602482015278151a1a5cc818dbdb9d1c9858dd081a185cc8195e1c1a5c9959603a1b604482015290519081900360640190fd5b600054156107715760405162461bcd60e51b8152600401808060200182810382526025815260200180610b116025913960400191505060405180910390fd5b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f36001600160a01b0316636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050506040513d60208110156107f457600080fd5b5051420160008190556040516346d2fbbb60e01b81526001600160a01b037f000000000000000000000000e4365db41166a79d8d6a971db064509674e0ed3f818116600484019081527fc41dc6ac1570dcc37f168fc3508d5b7d1bc31c727115f67fbe66617f6132f677602485018190526064850186905260806044860190815260018054600281831615610100026000190190911604608488018190527f000000000000000000000000be286431454714f511008713973d3b053a2d38f3909616976346d2fbbb97959693959194909390929160a401908590801561091b5780601f106108f05761010080835404028352916020019161091b565b820191906000526020600020905b8154815290600101906020018083116108fe57829003601f168201915b505095505050505050600060405180830381600087803b15801561093e57600080fd5b505af1158015610952573d6000803e3d6000fd5b50505050565b6004546001600160a01b031681565b60005481565b600080546109c0576040805162461bcd60e51b815260206004820152601b60248201527a111cdcd15e1958cbdcdc195b1b0b5b9bdd0b5cd8da19591d5b1959602a1b604482015290519081900360640190fd5b60005442116109d1576000546109d3565b425b90507f000000000000000000000000e4365db41166a79d8d6a971db064509674e0ed3f6001600160a01b0316636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2e57600080fd5b505afa158015610a42573d6000803e3d6000fd5b505050506040513d6020811015610a5857600080fd5b505115610395576007620151808204600301066018610e10830406603c80840481900690840660058410610ab1578360060362015180028501945082601803600e01610e1002850194508082603c020185039450610b09565b60158310610ae9578360041415610acb576202a300850194505b82601803600e01610e1002850194508082603c020185039450610b09565b600e831015610b095782600e03610e1002850194508082603c0201850394505b505050509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a264697066735822122019ad98dbae1e2b616b5502e303fe34581e70dab45ec3668ea327afed33c74ffa64736f6c634300060b0033

Deployed Bytecode Sourcemap

28206:268:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22534:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22658:37;;;:::i;:::-;;;;-1:-1:-1;;;;;22658:37:0;;;;;;;;;;;;;;22702:41;;;:::i;:::-;;;;;;;;;;;;;;;;22394:92;;;:::i;22617:34::-;;;:::i;23075:111::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;23024:42;;;:::i;28242:72::-;;;:::i;22750:36::-;;;:::i;25629:144::-;;;:::i;:::-;;22575:35;;;:::i;25356:265::-;;;:::i;28321:60::-;;;:::i;22493:34::-;;;:::i;23194:1385::-;;;:::i;22534:34::-;;;;;;;;;;;;;;;-1:-1:-1;;22534:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22658:37::-;;;:::o;22702:41::-;;;:::o;22394:92::-;22443:42;22394:92;:::o;22617:34::-;;;:::o;23075:111::-;23121:4;23157:6;-1:-1:-1;;;;;23145:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23145:33:0;;-1:-1:-1;23075:111:0;;:::o;23024:42::-;;;;;;;;;;;;;;;-1:-1:-1;;23024:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28242:72;28272:42;28242:72;:::o;22750:36::-;;;:::o;25629:144::-;25672:4;;;;25671:5;25663:36;;;;;-1:-1:-1;;;25663:36:0;;;;;;;;;;;;-1:-1:-1;;;25663:36:0;;;;;;;;;;;;;;;25710:4;:11;;-1:-1:-1;;25710:11:0;25717:4;25710:11;;;;;:4;25761:3;25732:33;;-1:-1:-1;;;25732:33:0;;25743:6;-1:-1:-1;;;;;25732:33:0;;;;;;;;;25751:3;25732:33;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25732:33:0;;;;25710:11;25732:33;;;;;;;;;;;;;:5;:10;;;;;;;25743:6;;25751:3;;25761;;25732:33;;;;;25717:4;;25732:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25732:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25732:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;25732:33:0;;;;;;-1:-1:-1;25732:33:0;;;;;;;;;;-1:-1:-1;25732:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25629:144::o;22575:35::-;;;;;;:::o;25356:265::-;25409:10;25402:3;:17;;25394:55;;;;;-1:-1:-1;;;25394:55:0;;;;;;;;;;;;-1:-1:-1;;;25394:55:0;;;;;;;;;;;;;;;25468:3;;:8;25460:58;;;;-1:-1:-1;;;25460:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25555:5;-1:-1:-1;;;;;25541:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25541:28:0;25535:3;:34;25529:3;:40;;;25580:33;;-1:-1:-1;;;25580:33:0;;-1:-1:-1;;;;;25591:6:0;25580:33;;;;;;;;;25599:3;25580:33;;;;;;;;;;;;;;;;;;;25604:3;25580:33;;;;;;;;;-1:-1:-1;;25580:33:0;;;;;;;;;;;:5;:10;;;;;;25591:6;;25599:3;;25604;;25535:34;;25580:33;;;;;;25604:3;;25580:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25356:265::o;28321:60::-;;;-1:-1:-1;;;;;28321:60:0;;:::o;22493:34::-;;;;:::o;23194:1385::-;23241:16;23278:3;;23270:48;;;;;-1:-1:-1;;;23270:48:0;;;;;;;;;;;;-1:-1:-1;;;23270:48:0;;;;;;;;;;;;;;;23358:3;;23340:15;:21;:45;;23382:3;;23340:45;;;23364:15;23340:45;23329:56;;23434:6;-1:-1:-1;;;;;23422:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23422:33:0;23418:1154;;;23515:1;23501:6;23490:17;;23510:1;23490:21;23489:27;23569:2;23559:7;23548:18;;:23;23626:2;23603:20;;;:25;;;;23660:13;;23701:1;23694:8;;23690:871;;23740:3;23736:1;:7;23747:6;23735:18;23723:30;;;;23828:4;23823:2;:9;23835:2;23823:14;23841:7;23822:26;23810:38;;;;23934:6;23913;23922:9;23913:18;:27;23901:39;;;;23690:871;;;24019:2;24011:4;:10;24007:539;;24050:3;24057:1;24050:8;24046:32;;;24072:6;24060:18;;;;24046:32;24172:4;24167:2;:9;24179:2;24167:14;24185:7;24166:26;24154:38;;;;24280:6;24259;24268:9;24259:18;:27;24247:39;;;;24007:539;;;24345:2;24338:4;:9;24334:212;;;24390:4;24385:2;:9;24398:7;24384:21;24372:33;;;;24498:6;24477;24486:9;24477:18;:27;24465:39;;;;24334:212;23418:1154;;;;23194:1385;:::o

Swarm Source

ipfs://7667d3e19da6f74011b8a89ba4e41e0b8b0da016c648a3ee3b4b51c522f9c0d1

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.