ETH Price: $2,276.95 (-5.96%)

Contract

0x67A45c2163798d47c32Fc2bcD5Dc0ABc6dCDFe78
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Cast152762962022-08-04 14:01:43773 days ago1659621703IN
0x67A45c21...c6dCDFe78
0 ETH0.0597821415.12841192
Schedule152633762022-08-02 13:25:30775 days ago1659446730IN
0x67A45c21...c6dCDFe78
0 ETH0.0010348511.15401255
0x61010060152377542022-07-29 13:55:24779 days ago1659102924IN
 Create: DssSpell
0 ETH0.1441900629.11484225

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
152377542022-07-29 13:55:24779 days ago1659102924
0x67A45c21...c6dCDFe78
 Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DssSpell

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-07-29
*/

// hevm: flattened sources of src/DssSpell.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity =0.6.12 >=0.5.12 >=0.6.12 <0.7.0;
// pragma experimental ABIEncoderV2;

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

struct CollateralOpts {
    bytes32 ilk;
    address gem;
    address join;
    address clip;
    address calc;
    address pip;
    bool    isLiquidatable;
    bool    isOSM;
    bool    whitelistOSM;
    uint256 ilkDebtCeiling;
    uint256 minVaultAmount;
    uint256 maxLiquidationAmount;
    uint256 liquidationPenalty;
    uint256 ilkStabilityFee;
    uint256 startingPriceFactor;
    uint256 breakerTolerance;
    uint256 auctionDuration;
    uint256 permittedDrop;
    uint256 liquidationRatio;
    uint256 kprFlatReward;
    uint256 kprPctReward;
}

////// lib/dss-exec-lib/src/DssExecLib.sol
//
// DssExecLib.sol -- MakerDAO Executive Spellcrafting Library
//
// 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.12; */
/* // pragma experimental ABIEncoderV2; */

/* import { CollateralOpts } from "./CollateralOpts.sol"; */

interface Initializable {
    function init(bytes32) external;
}

interface Authorizable {
    function rely(address) external;
    function deny(address) external;
    function setAuthority(address) external;
}

interface Fileable {
    function file(bytes32, address) external;
    function file(bytes32, uint256) external;
    function file(bytes32, bytes32, uint256) external;
    function file(bytes32, bytes32, address) external;
}

interface Drippable {
    function drip() external returns (uint256);
    function drip(bytes32) external returns (uint256);
}

interface Pricing {
    function poke(bytes32) external;
}

interface ERC20 {
    function decimals() external returns (uint8);
}

interface DssVat {
    function hope(address) external;
    function nope(address) external;
    function ilks(bytes32) external returns (uint256 Art, uint256 rate, uint256 spot, uint256 line, uint256 dust);
    function Line() external view returns (uint256);
    function suck(address, address, uint) external;
}

interface ClipLike {
    function vat() external returns (address);
    function dog() external returns (address);
    function spotter() external view returns (address);
    function calc() external view returns (address);
    function ilk() external returns (bytes32);
}

interface DogLike {
    function ilks(bytes32) external returns (address clip, uint256 chop, uint256 hole, uint256 dirt);
}

interface JoinLike {
    function vat() external returns (address);
    function ilk() external returns (bytes32);
    function gem() external returns (address);
    function dec() external returns (uint256);
    function join(address, uint) external;
    function exit(address, uint) external;
}

// Includes Median and OSM functions
interface OracleLike_2 {
    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;
    function orb0() external view returns (address);
    function orb1() external view returns (address);
}

interface MomLike {
    function setOsm(bytes32, address) external;
    function setPriceTolerance(address, uint256) external;
}

interface RegistryLike {
    function add(address) external;
    function xlip(bytes32) external view returns (address);
}

// https://github.com/makerdao/dss-chain-log
interface ChainlogLike {
    function setVersion(string calldata) external;
    function setIPFS(string calldata) external;
    function setSha256sum(string calldata) external;
    function getAddress(bytes32) external view returns (address);
    function setAddress(bytes32, address) external;
    function removeAddress(bytes32) external;
}

interface IAMLike {
    function ilks(bytes32) external view returns (uint256,uint256,uint48,uint48,uint48);
    function setIlk(bytes32,uint256,uint256,uint256) external;
    function remIlk(bytes32) external;
    function exec(bytes32) external returns (uint256);
}

interface LerpFactoryLike {
    function newLerp(bytes32 name_, address target_, bytes32 what_, uint256 startTime_, uint256 start_, uint256 end_, uint256 duration_) external returns (address);
    function newIlkLerp(bytes32 name_, address target_, bytes32 ilk_, bytes32 what_, uint256 startTime_, uint256 start_, uint256 end_, uint256 duration_) external returns (address);
}

interface LerpLike {
    function tick() external returns (uint256);
}


library DssExecLib {

    /* WARNING

The following library code acts as an interface to the actual DssExecLib
library, which can be found in its own deployed contract. Only trust the actual
library's implementation.

    */

    address constant public LOG = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F;
    uint256 constant internal WAD      = 10 ** 18;
    uint256 constant internal RAY      = 10 ** 27;
    uint256 constant internal RAD      = 10 ** 45;
    uint256 constant internal THOUSAND = 10 ** 3;
    uint256 constant internal MILLION  = 10 ** 6;
    uint256 constant internal BPS_ONE_PCT             = 100;
    uint256 constant internal BPS_ONE_HUNDRED_PCT     = 100 * BPS_ONE_PCT;
    uint256 constant internal RATES_ONE_HUNDRED_PCT   = 1000000021979553151239153027;
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {}
    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {}
    function rdiv(uint256 x, uint256 y) internal pure returns (uint256 z) {}
    function dai()        public view returns (address) { return getChangelogAddress("MCD_DAI"); }
    function vat()        public view returns (address) { return getChangelogAddress("MCD_VAT"); }
    function jug()        public view returns (address) { return getChangelogAddress("MCD_JUG"); }
    function pot()        public view returns (address) { return getChangelogAddress("MCD_POT"); }
    function end()        public view returns (address) { return getChangelogAddress("MCD_END"); }
    function reg()        public view returns (address) { return getChangelogAddress("ILK_REGISTRY"); }
    function spotter()    public view returns (address) { return getChangelogAddress("MCD_SPOT"); }
    function daiJoin()    public view returns (address) { return getChangelogAddress("MCD_JOIN_DAI"); }
    function lerpFab()    public view returns (address) { return getChangelogAddress("LERP_FAB"); }
    function clip(bytes32 _ilk) public view returns (address _clip) {}
    function flip(bytes32 _ilk) public view returns (address _flip) {}
    function calc(bytes32 _ilk) public view returns (address _calc) {}
    function getChangelogAddress(bytes32 _key) public view returns (address) {}
    function setChangelogAddress(bytes32 _key, address _val) public {}
    function setChangelogVersion(string memory _version) public {}
    function authorize(address _base, address _ward) public {}
    function setAuthority(address _base, address _authority) public {}
    function canCast(uint40 _ts, bool _officeHours) public pure returns (bool) {}
    function nextCastTime(uint40 _eta, uint40 _ts, bool _officeHours) public pure returns (uint256 castTime) {}
    function updateCollateralPrice(bytes32 _ilk) public {}
    function setContract(address _base, bytes32 _what, address _addr) public {}
    function setContract(address _base, bytes32 _ilk, bytes32 _what, address _addr) public {}
    function setValue(address _base, bytes32 _what, uint256 _amt) public {}
    function setValue(address _base, bytes32 _ilk, bytes32 _what, uint256 _amt) public {}
    function increaseGlobalDebtCeiling(uint256 _amount) public {}
    function increaseIlkDebtCeiling(bytes32 _ilk, uint256 _amount, bool _global) public {}
    function setIlkLiquidationRatio(bytes32 _ilk, uint256 _pct_bps) public {}
    function setIlkStabilityFee(bytes32 _ilk, uint256 _rate, bool _doDrip) public {}
    function linearInterpolation(bytes32 _name, address _target, bytes32 _ilk, bytes32 _what, uint256 _startTime, uint256 _start, uint256 _end, uint256 _duration) public returns (address) {}
}

////// 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.12; */

/* import { DssExecLib } from "./DssExecLib.sol"; */
/* import { CollateralOpts } from "./CollateralOpts.sol"; */

interface OracleLike_1 {
    function src() external view returns (address);
}

abstract contract DssAction {

    using DssExecLib for *;

    // Modifier used to limit execution time when office hours is enabled
    modifier limited {
        require(DssExecLib.canCast(uint40(block.timestamp), officeHours()), "Outside office hours");
        _;
    }

    // Office Hours defaults to true by default.
    //   To disable office hours, override this function and
    //    return false in the inherited action.
    function officeHours() public virtual returns (bool) {
        return true;
    }

    // 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;

    // 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)"
    function description() external virtual view returns (string memory);

    // Returns the next available cast time
    function nextCastTime(uint256 eta) external returns (uint256 castTime) {
        require(eta <= uint40(-1));
        castTime = DssExecLib.nextCastTime(uint40(eta), uint40(block.timestamp), officeHours());
    }
}

////// 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.12; */

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);
    function description() external view returns (string memory);
    function nextCastTime(uint256) external view returns (uint256);
}

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)"
    function description() external view returns (string memory) {
        return SpellAction(action).description();
    }

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

    function nextCastTime() external view returns (uint256 castTime) {
        return SpellAction(action).nextCastTime(eta);
    }

    // @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(uint256 _expiration, address _spellAction) public {
        pause       = PauseAbstract(log.getAddress("MCD_PAUSE"));
        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);
    }
}

////// lib/dss-interfaces/src/ERC/GemAbstract.sol
/* pragma solidity >=0.5.12; */

// A base ERC-20 abstract class
// https://eips.ethereum.org/EIPS/eip-20
interface GemAbstract {
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function allowance(address, address) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

////// lib/dss-interfaces/src/dss/ChainlogAbstract.sol
/* pragma solidity >=0.5.12; */

// https://github.com/makerdao/dss-chain-log
interface ChainlogAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function keys() external view returns (bytes32[] memory);
    function version() external view returns (string memory);
    function ipfs() external view returns (string memory);
    function setVersion(string calldata) external;
    function setSha256sum(string calldata) external;
    function setIPFS(string calldata) external;
    function setAddress(bytes32,address) external;
    function removeAddress(bytes32) external;
    function count() external view returns (uint256);
    function get(uint256) external view returns (bytes32,address);
    function list() external view returns (bytes32[] memory);
    function getAddress(bytes32) external view returns (address);
}

// Helper function for returning address or abstract of Chainlog
//  Valid on Mainnet, Kovan, Rinkeby, Ropsten, and Goerli
contract ChainlogHelper {
    address          public constant ADDRESS  = 0xdA0Ab1e0017DEbCd72Be8599041a2aa3bA7e740F;
    ChainlogAbstract public constant ABSTRACT = ChainlogAbstract(ADDRESS);
}

////// lib/dss-interfaces/src/dss/GemJoinAbstract.sol
/* pragma solidity >=0.5.12; */

// https://github.com/makerdao/dss/blob/master/src/join.sol
interface GemJoinAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function vat() external view returns (address);
    function ilk() external view returns (bytes32);
    function gem() external view returns (address);
    function dec() external view returns (uint256);
    function live() external view returns (uint256);
    function cage() external;
    function join(address, uint256) external;
    function exit(address, uint256) external;
}

////// lib/dss-interfaces/src/dss/IlkRegistryAbstract.sol
/* pragma solidity >=0.5.12; */

// https://github.com/makerdao/ilk-registry
interface IlkRegistryAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function vat() external view returns (address);
    function dog() external view returns (address);
    function cat() external view returns (address);
    function spot() external view returns (address);
    function ilkData(bytes32) external view returns (
        uint96, address, address, uint8, uint96, address, address, string memory, string memory
    );
    function ilks() external view returns (bytes32[] memory);
    function ilks(uint) external view returns (bytes32);
    function add(address) external;
    function remove(bytes32) external;
    function update(bytes32) external;
    function removeAuth(bytes32) external;
    function file(bytes32, address) external;
    function file(bytes32, bytes32, address) external;
    function file(bytes32, bytes32, uint256) external;
    function file(bytes32, bytes32, string calldata) external;
    function count() external view returns (uint256);
    function list() external view returns (bytes32[] memory);
    function list(uint256, uint256) external view returns (bytes32[] memory);
    function get(uint256) external view returns (bytes32);
    function info(bytes32) external view returns (
        string memory, string memory, uint256, uint256, address, address, address, address
    );
    function pos(bytes32) external view returns (uint256);
    function class(bytes32) external view returns (uint256);
    function gem(bytes32) external view returns (address);
    function pip(bytes32) external view returns (address);
    function join(bytes32) external view returns (address);
    function xlip(bytes32) external view returns (address);
    function dec(bytes32) external view returns (uint256);
    function symbol(bytes32) external view returns (string memory);
    function name(bytes32) external view returns (string memory);
    function put(bytes32, address, address, uint256, uint256, address, address, string calldata, string calldata) external;
}

////// src/DssSpellCollateral.sol
// SPDX-FileCopyrightText: © 2022 Dai Foundation <www.daifoundation.org>
//
// 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.12; */
// Enable ABIEncoderV2 when onboarding collateral through `DssExecLib.addNewCollateral()`
// // pragma experimental ABIEncoderV2;

/* import "dss-exec-lib/DssExecLib.sol"; */
/* import "dss-interfaces/dss/ChainlogAbstract.sol"; */
/* import "dss-interfaces/dss/GemJoinAbstract.sol"; */
/* import "dss-interfaces/dss/IlkRegistryAbstract.sol"; */
/* import "dss-interfaces/ERC/GemAbstract.sol"; */

interface RwaLiquidationLike_2 {
    function ilks(bytes32) external returns (string memory, address, uint48, uint48);
    function init(bytes32, uint256, string calldata, uint48) external;
}

interface RwaUrnLike_3 {
    function vat() external view returns(address);
    function jug() external view returns(address);
    function gemJoin() external view returns(address);
    function daiJoin() external view returns(address);
    function outputConduit() external view returns(address);
    function hope(address) external;
}

interface RwaOutputConduitLike_2 {
    function dai() external view returns(address);
    function hope(address) external;
    function mate(address) external;
}

interface RwaInputConduitLike_2 {
    function dai() external view returns(address);
    function to() external view returns(address);
    function mate(address usr) external;
}

contract DssSpellCollateralAction {
    // --- Rates ---
    // 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/QmX2QMoM1SZq2XMoTbMak8pZP86Y2icpgPAKDjQg4r4YHn

    uint256 constant ZERO_PCT_RATE           = 1000000000000000000000000000;
    uint256 constant ZERO_ZERO_FIVE_PCT_RATE = 1000000000015850933588756013;

    // --- Math ---
    uint256 public constant WAD = 10**18;
    uint256 public constant RAY = 10**27;
    uint256 public constant RAD = 10**45;

    // -- RWA008 MIP21 components --
    address constant RWA008                    = 0xb9737098b50d7c536b6416dAeB32879444F59fCA;
    address constant MCD_JOIN_RWA008_A         = 0x56eDD5067d89D4E65Bf956c49eAF054e6Ff0b262;
    address constant RWA008_A_URN              = 0x495215cabc630830071F80263a908E8826a66121;
    address constant RWA008_A_URN_CLOSE_HELPER = 0xCfc4043675EE82EEAe63C90D6eb3aB2dcf833431;
    address constant RWA008_A_INPUT_CONDUIT    = 0xa397a23dDA051186F202C67148c90683c413383C;
    address constant RWA008_A_OUTPUT_CONDUIT   = 0x21CF5Ad1311788D762f9035829f81B9f54610F0C;
    // SocGen's wallet
    address constant RWA008_A_OPERATOR         = 0x03f1A14A5b31e2f1751b6db368451dFCEA5A0439;
    // DIIS Group wallet
    address constant RWA008_A_MATE             = 0xb9444802F0831A3EB9f90E24EFe5FfA20138d684;

    string  constant RWA008_DOC                = "QmdfzY6p5EpkYMN8wcomF2a1GsJbhkPiRQVRYSPfS4NZtB";
    /**
     * The Future Value of the debt ceiling by the end of the agreement:
     *   - 30,000,00 USD: Debt Ceiling
     *   - 0.05% per year: Stability Fee
     *   - 2.9 years: Duration of the Loan
     *
     *     bc -l <<< 'scale=18; (30000000 * e( l(1.0005) * 2.9 ))'
     *
     * There is no DssExecLib helper, so WAD precision is used.
     */
    uint256 constant RWA008_A_INITIAL_PRICE    = 30_043_520_665599336150000000;
    uint48  constant RWA008_A_TAU              = 0;

    // Ilk registry params
    uint256 constant RWA008_REG_CLASS_RWA      = 3;

    // Remaining params
    uint256 constant RWA008_A_LINE             = 30_000_000;
    uint256 constant RWA008_A_MAT              = 100_00; // 100% in basis-points
    uint256 constant RWA008_A_RATE             = ZERO_ZERO_FIVE_PCT_RATE;
    // -- RWA008 end --

    // -- RWA009 MIP21 components --
    address constant RWA009                  = 0x8b9734bbaA628bFC0c9f323ba08Ed184e5b88Da2;
    address constant MCD_JOIN_RWA009_A       = 0xEe0FC514280f09083a32AE906cCbD2FAc4c680FA;
    address constant RWA009_A_URN            = 0x1818EE501cd28e01E058E7C283E178E9e04a1e79;
    address constant RWA009_A_JAR            = 0x6C6d4Be2223B5d202263515351034861dD9aFdb6;
    // Goerli: CES Goerli Multisig / Mainnet: Genesis
    address constant RWA009_A_OUTPUT_CONDUIT = 0x508D982e13263Fc8e1b5A4E6bf59b335202e36b4;

    // MIP21_LIQUIDATION_ORACLE params
    string  constant RWA009_DOC              = "QmRe77P2JsvQWygVr9ZAMs4SHnjUQXz6uawdSboAaj2ryF";
    // There is no DssExecLib helper, so WAD precision is used.
    uint256 constant RWA009_A_INITIAL_PRICE  = 100_000_000 * WAD;
    uint48  constant RWA009_A_TAU            = 0;

    // Ilk registry params
    uint256 constant RWA009_REG_CLASS_RWA    = 3;

    // Remaining params
    uint256 constant RWA009_A_LINE           = 100_000_000;
    uint256 constant RWA009_A_MAT            = 100_00; // 100% in basis-points
    uint256 constant RWA009_A_RATE           = ZERO_PCT_RATE;

    // -- RWA009 END --

    function onboardRwa008(
        ChainlogAbstract CHANGELOG,
        IlkRegistryAbstract REGISTRY,
        address MIP21_LIQUIDATION_ORACLE,
        address MCD_VAT,
        address MCD_JUG,
        address MCD_SPOT,
        address MCD_JOIN_DAI,
        address MCD_DAI
    ) internal {
        // RWA008-A collateral deploy
        bytes32 ilk      = "RWA008-A";
        uint256 decimals = GemAbstract(RWA008).decimals();

        // Sanity checks
        require(GemJoinAbstract(MCD_JOIN_RWA008_A).vat() == MCD_VAT,  "join-vat-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA008_A).ilk() == ilk,      "join-ilk-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA008_A).gem() == RWA008,   "join-gem-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA008_A).dec() == decimals, "join-dec-not-match");

        require(RwaUrnLike_3(RWA008_A_URN).vat()           == MCD_VAT,                 "urn-vat-not-match");
        require(RwaUrnLike_3(RWA008_A_URN).jug()           == MCD_JUG,                 "urn-jug-not-match");
        require(RwaUrnLike_3(RWA008_A_URN).daiJoin()       == MCD_JOIN_DAI,            "urn-daijoin-not-match");
        require(RwaUrnLike_3(RWA008_A_URN).gemJoin()       == MCD_JOIN_RWA008_A,       "urn-gemjoin-not-match");
        require(RwaUrnLike_3(RWA008_A_URN).outputConduit() == RWA008_A_OUTPUT_CONDUIT, "urn-outputconduit-not-match");

        require(RwaInputConduitLike_2(RWA008_A_INPUT_CONDUIT).dai() == MCD_DAI,      "inputconduit-dai-not-match");
        require(RwaInputConduitLike_2(RWA008_A_INPUT_CONDUIT).to()  == RWA008_A_URN, "inputconduit-to-not-match");

        require(RwaOutputConduitLike_2(RWA008_A_OUTPUT_CONDUIT).dai() == MCD_DAI, "outputconduit-dai-not-match");

        // Init the RwaLiquidationOracle
        RwaLiquidationLike_2(MIP21_LIQUIDATION_ORACLE).init(ilk, RWA008_A_INITIAL_PRICE, RWA008_DOC, RWA008_A_TAU);
        (, address pip, , ) = RwaLiquidationLike_2(MIP21_LIQUIDATION_ORACLE).ilks(ilk);

        // Set price feed for RWA008
        DssExecLib.setContract(MCD_SPOT, ilk, "pip", pip);

        // Init RWA008 in Vat
        Initializable(MCD_VAT).init(ilk);
        // Init RWA008 in Jug
        Initializable(MCD_JUG).init(ilk);

        // Allow RWA008 Join to modify Vat registry
        DssExecLib.authorize(MCD_VAT, MCD_JOIN_RWA008_A);

        // Set the debt ceiling
        DssExecLib.increaseIlkDebtCeiling(ilk, RWA008_A_LINE, /* _global = */ true);

        // Set the stability fee
        DssExecLib.setIlkStabilityFee(ilk, RWA008_A_RATE, /* _doDrip = */ false);

        // Set the collateralization ratio
        DssExecLib.setIlkLiquidationRatio(ilk, RWA008_A_MAT);

        // Poke the spotter to pull in a price
        DssExecLib.updateCollateralPrice(ilk);

        // Give the urn permissions on the join adapter
        DssExecLib.authorize(MCD_JOIN_RWA008_A, RWA008_A_URN);

        // Helper contract permisison on URN
        RwaUrnLike_3(RWA008_A_URN).hope(RWA008_A_URN_CLOSE_HELPER);
        RwaUrnLike_3(RWA008_A_URN).hope(RWA008_A_OPERATOR);

        // Set up output conduit
        //
        // We are not hope-ing the operator wallet in this spell because SocGen could not verify their addess in time.
        //
        // There is a potential front-running attack:
        //   1. The operator choses a legit `to` address with `pick()`
        //   2. The mate calls `push()` on the output conduit
        //   3. The operator front-runs the `push()` transaction and `pick()`s a fraudulent address.
        //
        // Once SocGen verifies the ownership of the address, it will be hope-d in the output conduit.
        //
        // RwaOutputConduitLike(RWA008_A_OUTPUT_CONDUIT).hope(RWA008_A_OPERATOR);

        // Whitelist DIIS Group in the conduits
        RwaOutputConduitLike_2(RWA008_A_OUTPUT_CONDUIT).mate(RWA008_A_MATE);
        RwaInputConduitLike_2(RWA008_A_INPUT_CONDUIT)  .mate(RWA008_A_MATE);

        // Whitelist Socgen in the conduits as a fallback for DIIS Group
        RwaOutputConduitLike_2(RWA008_A_OUTPUT_CONDUIT).mate(RWA008_A_OPERATOR);
        RwaInputConduitLike_2(RWA008_A_INPUT_CONDUIT)  .mate(RWA008_A_OPERATOR);

        // Add RWA008 contract to the changelog
        CHANGELOG.setAddress("RWA008",                  RWA008);
        CHANGELOG.setAddress("PIP_RWA008",              pip);
        CHANGELOG.setAddress("MCD_JOIN_RWA008_A",       MCD_JOIN_RWA008_A);
        CHANGELOG.setAddress("RWA008_A_URN",            RWA008_A_URN);
        CHANGELOG.setAddress("RWA008_A_INPUT_CONDUIT",  RWA008_A_INPUT_CONDUIT);
        CHANGELOG.setAddress("RWA008_A_OUTPUT_CONDUIT", RWA008_A_OUTPUT_CONDUIT);

        REGISTRY.put(
            ilk,
            MCD_JOIN_RWA008_A,
            RWA008,
            decimals,
            RWA008_REG_CLASS_RWA,
            pip,
            address(0),
            "RWA008-A: SG Forge OFH",
            GemAbstract(RWA008).symbol()
        );
    }

    function onboardRwa009(
        ChainlogAbstract CHANGELOG,
        IlkRegistryAbstract REGISTRY,
        address MIP21_LIQUIDATION_ORACLE,
        address MCD_VAT,
        address MCD_JUG,
        address MCD_SPOT,
        address MCD_JOIN_DAI
    ) internal {
        // RWA009-A collateral deploy
        bytes32 ilk      = "RWA009-A";
        uint256 decimals = GemAbstract(RWA009).decimals();

        // Sanity checks
        require(GemJoinAbstract(MCD_JOIN_RWA009_A).vat() == MCD_VAT,  "join-vat-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA009_A).ilk() == ilk,      "join-ilk-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA009_A).gem() == RWA009,   "join-gem-not-match");
        require(GemJoinAbstract(MCD_JOIN_RWA009_A).dec() == decimals, "join-dec-not-match");

        require(RwaUrnLike_3(RWA009_A_URN).vat()           == MCD_VAT,                 "urn-vat-not-match");
        require(RwaUrnLike_3(RWA009_A_URN).jug()           == MCD_JUG,                 "urn-jug-not-match");
        require(RwaUrnLike_3(RWA009_A_URN).daiJoin()       == MCD_JOIN_DAI,            "urn-daijoin-not-match");
        require(RwaUrnLike_3(RWA009_A_URN).gemJoin()       == MCD_JOIN_RWA009_A,       "urn-gemjoin-not-match");
        require(RwaUrnLike_3(RWA009_A_URN).outputConduit() == RWA009_A_OUTPUT_CONDUIT, "urn-outputconduit-not-match");

        // Init the RwaLiquidationOracle
        RwaLiquidationLike_2(MIP21_LIQUIDATION_ORACLE).init(ilk, RWA009_A_INITIAL_PRICE, RWA009_DOC, RWA009_A_TAU);
        (, address pip, , ) = RwaLiquidationLike_2(MIP21_LIQUIDATION_ORACLE).ilks(ilk);

        // Set price feed for RWA009
        DssExecLib.setContract(MCD_SPOT, ilk, "pip", pip);

        // Init RWA009 in Vat
        Initializable(MCD_VAT).init(ilk);
        // Init RWA009 in Jug
        Initializable(MCD_JUG).init(ilk);

        // Allow RWA009 Join to modify Vat registry
        DssExecLib.authorize(MCD_VAT, MCD_JOIN_RWA009_A);

        // 100m debt ceiling
        DssExecLib.increaseIlkDebtCeiling(ilk, RWA009_A_LINE, /* _global = */ true);

        // Set the stability fee
        DssExecLib.setIlkStabilityFee(ilk, RWA009_A_RATE, /* _doDrip = */ false);

        // Set collateralization ratio
        DssExecLib.setIlkLiquidationRatio(ilk, RWA009_A_MAT);

        // Poke the spotter to pull in a price
        DssExecLib.updateCollateralPrice(ilk);

        // Give the urn permissions on the join adapter
        DssExecLib.authorize(MCD_JOIN_RWA009_A, RWA009_A_URN);

        // MCD_PAUSE_PROXY permission on URN
        RwaUrnLike_3(RWA009_A_URN).hope(address(this));

        // Add RWA009 contract to the changelog
        CHANGELOG.setAddress("RWA009",                  RWA009);
        CHANGELOG.setAddress("PIP_RWA009",              pip);
        CHANGELOG.setAddress("MCD_JOIN_RWA009_A",       MCD_JOIN_RWA009_A);
        CHANGELOG.setAddress("RWA009_A_URN",            RWA009_A_URN);
        CHANGELOG.setAddress("RWA009_A_JAR",            RWA009_A_JAR);
        CHANGELOG.setAddress("RWA009_A_OUTPUT_CONDUIT", RWA009_A_OUTPUT_CONDUIT);

        // Add RWA009 to ILK REGISTRY
        REGISTRY.put(
            ilk,
            MCD_JOIN_RWA009_A,
            RWA009,
            decimals,
            RWA009_REG_CLASS_RWA,
            pip,
            address(0),
            "RWA009-A: H. V. Bank",
            GemAbstract(RWA009).symbol()
        );
    }

    function onboardNewCollaterals() internal {
        ChainlogAbstract CHANGELOG       = ChainlogAbstract(DssExecLib.LOG);
        IlkRegistryAbstract REGISTRY     = IlkRegistryAbstract(DssExecLib.reg());
        address MIP21_LIQUIDATION_ORACLE = CHANGELOG.getAddress("MIP21_LIQUIDATION_ORACLE");
        address MCD_VAT                  = DssExecLib.vat();
        address MCD_DAI                  = DssExecLib.dai();
        address MCD_JUG                  = DssExecLib.jug();
        address MCD_SPOT                 = DssExecLib.spotter();
        address MCD_JOIN_DAI             = DssExecLib.daiJoin();

        // --------------------------- RWA Collateral onboarding ---------------------------

        // Onboard SocGen: https://vote.makerdao.com/polling/QmajCtnG
        onboardRwa008(CHANGELOG, REGISTRY, MIP21_LIQUIDATION_ORACLE, MCD_VAT, MCD_JUG, MCD_SPOT, MCD_JOIN_DAI, MCD_DAI);

        // Onboard HvB: https://vote.makerdao.com/polling/QmQMDasC
        onboardRwa009(CHANGELOG, REGISTRY, MIP21_LIQUIDATION_ORACLE, MCD_VAT, MCD_JUG, MCD_SPOT, MCD_JOIN_DAI);
    }

    function offboardCollaterals() internal {}
}


////// src/DssSpell.sol
// SPDX-FileCopyrightText: © 2020 Dai Foundation <www.daifoundation.org>
//
// 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.12; */
// Enable ABIEncoderV2 when onboarding collateral through `DssExecLib.addNewCollateral()`
// // pragma experimental ABIEncoderV2;

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

/* import { DssSpellCollateralAction } from "./DssSpellCollateral.sol"; */

interface ERC20Like {
    function approve(address, uint256) external returns (bool);
}

interface RwaUrnLike_1 {
    function lock(uint256) external;
    function draw(uint256) external;
}

contract DssSpellAction is DssAction, DssSpellCollateralAction {
    // Provides a descriptive tag for bot consumption
    // This should be modified weekly to provide a summary of the actions
    // Hash: cast keccak -- "$(wget https://raw.githubusercontent.com/makerdao/community/969f04cfec25e56791fbe4503bcbe2df7a58df1e/governance/votes/Executive%20vote%20-%20July%2029%2C%202022.md -q -O - 2>/dev/null)"
    string public constant override description =
        "2022-07-29 MakerDAO Executive Spell | Hash: 0x18850080b101bb43125dd2bec32e5e7196586c5614bb9a0f05f9bbe392901d64";

    address constant RWA_TOKEN_FAB = 0x2B3a4c18705e99bC29b22222dA7E10b643658552;

    uint256 constant RWA009_DRAW_AMOUNT = 25_000_000 * WAD;

    // 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/QmX2QMoM1SZq2XMoTbMak8pZP86Y2icpgPAKDjQg4r4YHn
    //

    function officeHours() public override returns (bool) {
        return true;
    }

    function actions() public override {

        // ---------------------------------------------------------------------
        // Includes changes from the DssSpellCollateralAction
        onboardNewCollaterals();
        // offboardCollaterals();

        drawFromRWA009Urn();

        // Add RWA_TOKEN_FAB to changelog
        DssExecLib.setChangelogAddress("RWA_TOKEN_FAB", RWA_TOKEN_FAB);

        DssExecLib.setChangelogVersion("1.13.3");
    }

    function drawFromRWA009Urn() internal {
        // lock RWA009 Token in the URN
        ERC20Like(RWA009).approve(RWA009_A_URN, 1 * WAD);
        RwaUrnLike_1(RWA009_A_URN).lock(1 * WAD);

        // draw DAI to genesis address
        RwaUrnLike_1(RWA009_A_URN).draw(RWA009_DRAW_AMOUNT);
    }
}

contract DssSpell is DssExec {
    constructor() DssExec(block.timestamp + 30 days, address(new DssSpellAction())) public {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"tag","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

6101006040523480156200001257600080fd5b5062278d004201604051620000279062000234565b604051809103906000f08015801562000044573d6000803e3d6000fd5b5073da0ab1e0017debcd72be8599041a2aa3ba7e740f73ffffffffffffffffffffffffffffffffffffffff166321f8a7216040518163ffffffff1660e01b815260040180807f4d43445f50415553450000000000000000000000000000000000000000000000815250602001905060206040518083038186803b158015620000cb57600080fd5b505afa158015620000e0573d6000803e3d6000fd5b505050506040513d6020811015620000f757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508160c081815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250506040516024016040516020818303038152906040527f61461954000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600190805190602001906200021792919062000242565b50600080829050803f9150816080818152505050505050620002e8565b6149ee806200113283390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028557805160ff1916838001178555620002b6565b82800160010185558215620002b6579182015b82811115620002b557825182559160200191906001019062000298565b5b509050620002c59190620002c9565b5090565b5b80821115620002e4576000816000905550600101620002ca565b5090565b60805160a05160601c60c05160e05160601c610dd76200035b6000398061067352806107355280610a9a5280610b4352508061040552806109aa5250806103e15280610467528061050f52806107715280610b7f5280610ccb52508061044152806107925280610ba05250610dd76000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c80637284e4161161008c578063ae8421e111610066578063ae8421e1146102db578063b0604a26146102fb578063f7992d8514610305578063fe7d47bb14610323576100ce565b80637284e4161461021a5780638456cb591461029d57806396d373e5146102d1576100ce565b8062a7029b146100d35780630a7a1c4d146101565780634665096d1461018a57806351973ec9146101a857806351f91066146101dc5780636e832f07146101fa575b600080fd5b6100db610341565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561011b578082015181840152602081019050610100565b50505050905090810190601f1680156101485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015e6103df565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610192610403565b6040518082815260200191505060405180910390f35b6101b0610427565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e461043f565b6040518082815260200191505060405180910390f35b610202610463565b60405180821515815260200191505060405180910390f35b61022261050b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610262578082015181840152602081019050610247565b50505050905090810190601f16801561028f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a5610671565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102d9610695565b005b6102e3610995565b60405180821515815260200191505060405180910390f35b6103036109a8565b005b61030d610cc1565b6040518082815260200191505060405180910390f35b61032b610cc7565b6040518082815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d75780601f106103ac576101008083540402835291602001916103d7565b820191906000526020600020905b8154815290600101906020018083116103ba57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d60208110156104f557600080fd5b8101908080519060200190929190505050905090565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105b157600080fd5b81019080805160405193929190846401000000008211156105d157600080fd5b838201915060208201858111156105e757600080fd5b825186600182028301116401000000008211171561060457600080fd5b8083526020830192505050908051906020019080838360005b8381101561063857808201518184015260208101905061061d565b50505050905090810190601f1680156106655780820380516001836020036101000a031916815260200191505b50604052505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900460ff1615610718576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f7370656c6c2d616c72656164792d63617374000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663168ccd677f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018381526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505095505050505050600060405180830381600087803b15801561089957600080fd5b505af11580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156108d757600080fd5b81019080805160405193929190846401000000008211156108f757600080fd5b8382019150602082018581111561090d57600080fd5b825186600182028301116401000000008211171561092a57600080fd5b8083526020830192505050908051906020019080838360005b8381101561095e578082015181840152602081019050610943565b50505050905090810190601f16801561098b5780820380516001836020036101000a031916815260200191505b5060405250505050565b600260009054906101000a900460ff1681565b7f0000000000000000000000000000000000000000000000000000000000000000421115610a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5468697320636f6e74726163742068617320657870697265640000000000000081525060200191505060405180910390fd5b6000805414610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180610d7d6025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d6020811015610b2857600080fd5b810190808051906020019092919050505042016000819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346d2fbbb7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b505095505050505050600060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b50505050565b60005481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bf0fbcec6000546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d6020811015610d6657600080fd5b810190808051906020019092919050505090509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a26469706673582212200ba770595e555842a30f15288a5bee5d9bbfa3f352f5cdd4414f3e04bdd2c44c64736f6c634300060c0033608060405234801561001057600080fd5b506149ce806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80636e832f071161005b5780636e832f07146100f15780637284e41614610111578063bf0fbcec14610194578063f99e36bc146101d657610088565b806306f405fd1461008d578063552033c4146100ab57806361461954146100c95780636a146024146100d3575b600080fd5b6100956101e0565b6040518082815260200191505060405180910390f35b6100b36101f7565b6040518082815260200191505060405180910390f35b6100d1610207565b005b6100db610325565b6040518082815260200191505060405180910390f35b6100f9610331565b60405180821515815260200191505060405180910390f35b61011961033a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015957808201518184015260208101905061013e565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c0600480360360208110156101aa57600080fd5b8101908080359060200190929190505050610356565b6040518082815260200191505060405180910390f35b6101de610444565b005b722cd76fe086b93ce2f768a00b22a0000000000081565b6b033b2e3c9fd0803ce800000081565b738de6ddbcd5053d32292aaa0d2105a32d108484a66335329d4c4261022a610331565b6040518363ffffffff1660e01b8152600401808364ffffffffff16815260200182151581526020019250505060206040518083038186803b15801561026e57600080fd5b505af4158015610282573d6000803e3d6000fd5b505050506040513d602081101561029857600080fd5b810190808051906020019092919050505061031b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4f757473696465206f666669636520686f75727300000000000000000000000081525060200191505060405180910390fd5b610323610444565b565b670de0b6b3a764000081565b60006001905090565b6040518060a00160405280606e815260200161492b606e913981565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64ffffffffff1682111561038c57600080fd5b738de6ddbcd5053d32292aaa0d2105a32d108484a663d255745683426103b0610331565b6040518463ffffffff1660e01b8152600401808464ffffffffff1681526020018364ffffffffff1681526020018215158152602001935050505060206040518083038186803b15801561040257600080fd5b505af4158015610416573d6000803e3d6000fd5b505050506040513d602081101561042c57600080fd5b81019080805190602001909291905050509050919050565b61044c6105a7565b6104546109ab565b738de6ddbcd5053d32292aaa0d2105a32d108484a66319d900a1732b3a4c18705e99bc29b22222da7e10b6436585526040518263ffffffff1660e01b815260040180807f5257415f544f4b454e5f464142000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff16815260200191505060006040518083038186803b1580156104f557600080fd5b505af4158015610509573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6635f3a7dd76040518163ffffffff1660e01b81526004018080602001828103825260068152602001807f312e31332e33000000000000000000000000000000000000000000000000000081525060200191505060006040518083038186803b15801561058d57600080fd5b505af41580156105a1573d6000803e3d6000fd5b50505050565b600073da0ab1e0017debcd72be8599041a2aa3ba7e740f90506000738de6ddbcd5053d32292aaa0d2105a32d108484a663738fdd1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561060657600080fd5b505af415801561061a573d6000803e3d6000fd5b505050506040513d602081101561063057600080fd5b8101908080519060200190929190505050905060008273ffffffffffffffffffffffffffffffffffffffff166321f8a7216040518163ffffffff1660e01b815260040180807f4d495032315f4c49515549444154494f4e5f4f5241434c450000000000000000815250602001905060206040518083038186803b1580156106b657600080fd5b505afa1580156106ca573d6000803e3d6000fd5b505050506040513d60208110156106e057600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a66336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561073957600080fd5b505af415801561074d573d6000803e3d6000fd5b505050506040513d602081101561076357600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b1580156107bc57600080fd5b505af41580156107d0573d6000803e3d6000fd5b505050506040513d60208110156107e657600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a66384718d896040518163ffffffff1660e01b815260040160206040518083038186803b15801561083f57600080fd5b505af4158015610853573d6000803e3d6000fd5b505050506040513d602081101561086957600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a6632e77468d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c257600080fd5b505af41580156108d6573d6000803e3d6000fd5b505050506040513d60208110156108ec57600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505af4158015610959573d6000803e3d6000fd5b505050506040513d602081101561096f57600080fd5b81019080805190602001909291905050509050610992888888888787878b610ba4565b6109a188888888878787612dc2565b5050505050505050565b738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3731818ee501cd28e01e058e7c283e178e9e04a1e79670de0b6b3a76400006001026040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b505050506040513d6020811015610a7957600080fd5b810190808051906020019092919050505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663dd467064670de0b6b3a76400006001026040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610afd57600080fd5b505af1158015610b11573d6000803e3d6000fd5b50505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff16633b304147670de0b6b3a764000063017d7840026040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b8a57600080fd5b505af1158015610b9e573d6000803e3d6000fd5b50505050565b60007f5257413030382d410000000000000000000000000000000000000000000000009050600073b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2557600080fd5b505afa158015610c39573d6000803e3d6000fd5b505050506040513d6020811015610c4f57600080fd5b810190808051906020019092919050505060ff1690508673ffffffffffffffffffffffffffffffffffffffff167356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd657600080fd5b505afa158015610cea573d6000803e3d6000fd5b505050506040513d6020811015610d0057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d7661742d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b817356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df557600080fd5b505afa158015610e09573d6000803e3d6000fd5b505050506040513d6020811015610e1f57600080fd5b810190808051906020019092919050505014610ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d696c6b2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b73b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff167356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d6020811015610f5257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d67656d2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b807356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b8101908080519060200190929190505050146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d6465632d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d7661742d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166384718d896040518163ffffffff1660e01b815260040160206040518083038186803b15801561129b57600080fd5b505afa1580156112af573d6000803e3d6000fd5b505050506040513d60208110156112c557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d6a75672d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d057600080fd5b505afa1580156113e4573d6000803e3d6000fd5b505050506040513d60208110156113fa57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d6461696a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b7356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d67656d6a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b7321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff16637692535f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f75726e2d6f7574707574636f6e647569742d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1673a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b15801561179757600080fd5b505afa1580156117ab573d6000803e3d6000fd5b505050506040513d60208110156117c157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e707574636f6e647569742d6461692d6e6f742d6d6174636800000000000081525060200191505060405180910390fd5b73495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1673a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663131519816040518163ffffffff1660e01b815260040160206040518083038186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e707574636f6e647569742d746f2d6e6f742d6d617463680000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6f7574707574636f6e647569742d6461692d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff16633304e282836a18d9f684cc00131ff4e1806040518060600160405280602e81526020016148cf602e913960006040518563ffffffff1660e01b815260040180858152602001848152602001806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611b86578082015181840152602081019050611b6b565b50505050905090810190601f168015611bb35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015611bd557600080fd5b505af1158015611be9573d6000803e3d6000fd5b5050505060008873ffffffffffffffffffffffffffffffffffffffff1663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611c8057600080fd5b8101908080516040519392919084640100000000821115611ca057600080fd5b83820191506020820185811115611cb657600080fd5b8251866001820283011164010000000082111715611cd357600080fd5b8083526020830192505050908051906020019080838360005b83811015611d07578082015181840152602081019050611cec565b50505050905090810190601f168015611d345780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190805190602001909291905050505050915050738de6ddbcd5053d32292aaa0d2105a32d108484a663e5c6eb338785846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001807f70697000000000000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060006040518083038186803b158015611e1457600080fd5b505af4158015611e28573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611eea57600080fd5b505af1158015611efe573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef4595897356edd5067d89d4e65bf956c49eaf054e6ff0b2626040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015611f9957600080fd5b505af4158015611fad573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663ef94132e846301c9c38060016040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b15801561201757600080fd5b505af415801561202b573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663e40898e0846b033b2e3ca008d093f9ea862d60006040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b15801561209d57600080fd5b505af41580156120b1573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663bdc56f30846127106040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561210e57600080fd5b505af4158015612122573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6636d530fb3846040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561217557600080fd5b505af4158015612189573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef45957356edd5067d89d4e65bf956c49eaf054e6ff0b26273495215cabc630830071f80263a908e8826a661216040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b15801561223857600080fd5b505af415801561224c573d6000803e3d6000fd5b5050505073495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663a3b22fc473cfc4043675ee82eeae63c90d6eb3ab2dcf8334316040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156122e157600080fd5b505af11580156122f5573d6000803e3d6000fd5b5050505073495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663a3b22fc47303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561238a57600080fd5b505af115801561239e573d6000803e3d6000fd5b505050507321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f873b9444802f0831a3eb9f90e24efe5ffa20138d6846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561243357600080fd5b505af1158015612447573d6000803e3d6000fd5b5050505073a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f873b9444802f0831a3eb9f90e24efe5ffa20138d6846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156124dc57600080fd5b505af11580156124f0573d6000803e3d6000fd5b505050507321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f87303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050505073a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f87303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561262e57600080fd5b505af1158015612642573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973b9737098b50d7c536b6416daeb32879444f59fca6040518263ffffffff1660e01b815260040180807f52574130303800000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126eb57600080fd5b505af11580156126ff573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd9826040518263ffffffff1660e01b815260040180807f5049505f525741303038000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd97356edd5067d89d4e65bf956c49eaf054e6ff0b2626040518263ffffffff1660e01b815260040180807f4d43445f4a4f494e5f5257413030385f410000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561285157600080fd5b505af1158015612865573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973495215cabc630830071f80263a908e8826a661216040518263ffffffff1660e01b815260040180807f5257413030385f415f55524e00000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561290e57600080fd5b505af1158015612922573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973a397a23dda051186f202c67148c90683c413383c6040518263ffffffff1660e01b815260040180807f5257413030385f415f494e5055545f434f4e44554954000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156129cb57600080fd5b505af11580156129df573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd97321cf5ad1311788d762f9035829f81b9f54610f0c6040518263ffffffff1660e01b815260040180807f5257413030385f415f4f55545055545f434f4e445549540000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015612a8857600080fd5b505af1158015612a9c573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff16634d8835e6847356edd5067d89d4e65bf956c49eaf054e6ff0b26273b9737098b50d7c536b6416daeb32879444f59fca86600387600073b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612b4757600080fd5b505afa158015612b5b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612b8557600080fd5b8101908080516040519392919084640100000000821115612ba557600080fd5b83820191506020820185811115612bbb57600080fd5b8251866001820283011164010000000082111715612bd857600080fd5b8083526020830192505050908051906020019080838360005b83811015612c0c578082015181840152602081019050612bf1565b50505050905090810190601f168015612c395780820380516001836020036101000a031916815260200191505b506040525050506040518963ffffffff1660e01b8152600401808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835260168152602001807f5257413030382d413a20534720466f726765204f464800000000000000000000815250602001838103825284818151815260200191508051906020019080838360005b83811015612d49578082015181840152602081019050612d2e565b50505050905090810190601f168015612d765780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b158015612d9d57600080fd5b505af1158015612db1573d6000803e3d6000fd5b505050505050505050505050505050565b60007f5257413030392d4100000000000000000000000000000000000000000000000090506000738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4357600080fd5b505afa158015612e57573d6000803e3d6000fd5b505050506040513d6020811015612e6d57600080fd5b810190808051906020019092919050505060ff1690508573ffffffffffffffffffffffffffffffffffffffff1673ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015612ef457600080fd5b505afa158015612f08573d6000803e3d6000fd5b505050506040513d6020811015612f1e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612fb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d7661742d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8173ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301357600080fd5b505afa158015613027573d6000803e3d6000fd5b505050506040513d602081101561303d57600080fd5b8101908080519060200190929190505050146130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d696c6b2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1673ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561314657600080fd5b505afa15801561315a573d6000803e3d6000fd5b505050506040513d602081101561317057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461320a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d67656d2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8073ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff1663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561326557600080fd5b505afa158015613279573d6000803e3d6000fd5b505050506040513d602081101561328f57600080fd5b810190808051906020019092919050505014613313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d6465632d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561338457600080fd5b505afa158015613398573d6000803e3d6000fd5b505050506040513d60208110156133ae57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613448576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d7661742d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166384718d896040518163ffffffff1660e01b815260040160206040518083038186803b1580156134b957600080fd5b505afa1580156134cd573d6000803e3d6000fd5b505050506040513d60208110156134e357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461357d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d6a75672d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ee57600080fd5b505afa158015613602573d6000803e3d6000fd5b505050506040513d602081101561361857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146136b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d6461696a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b73ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561373757600080fd5b505afa15801561374b573d6000803e3d6000fd5b505050506040513d602081101561376157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d67656d6a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b73508d982e13263fc8e1b5a4e6bf59b335202e36b473ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff16637692535f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561388057600080fd5b505afa158015613894573d6000803e3d6000fd5b505050506040513d60208110156138aa57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f75726e2d6f7574707574636f6e647569742d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff16633304e28283670de0b6b3a76400006305f5e100026040518060600160405280602e81526020016148fd602e913960006040518563ffffffff1660e01b815260040180858152602001848152602001806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156139f45780820151818401526020810190506139d9565b50505050905090810190601f168015613a215780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613a4357600080fd5b505af1158015613a57573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613ab057600080fd5b505af1158015613ac4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015613aee57600080fd5b8101908080516040519392919084640100000000821115613b0e57600080fd5b83820191506020820185811115613b2457600080fd5b8251866001820283011164010000000082111715613b4157600080fd5b8083526020830192505050908051906020019080838360005b83811015613b75578082015181840152602081019050613b5a565b50505050905090810190601f168015613ba25780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190805190602001909291905050505050915050738de6ddbcd5053d32292aaa0d2105a32d108484a663e5c6eb338685846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001807f70697000000000000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060006040518083038186803b158015613c8257600080fd5b505af4158015613c96573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613ced57600080fd5b505af1158015613d01573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613d5857600080fd5b505af1158015613d6c573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef45958873ee0fc514280f09083a32ae906ccbd2fac4c680fa6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015613e0757600080fd5b505af4158015613e1b573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663ef94132e846305f5e10060016040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b158015613e8557600080fd5b505af4158015613e99573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663e40898e0846b033b2e3c9fd0803ce800000060006040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b158015613f0b57600080fd5b505af4158015613f1f573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663bdc56f30846127106040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015613f7c57600080fd5b505af4158015613f90573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6636d530fb3846040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613fe357600080fd5b505af4158015613ff7573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef459573ee0fc514280f09083a32ae906ccbd2fac4c680fa731818ee501cd28e01e058e7c283e178e9e04a1e796040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b1580156140a657600080fd5b505af41580156140ba573d6000803e3d6000fd5b50505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663a3b22fc4306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561413b57600080fd5b505af115801561414f573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9738b9734bbaa628bfc0c9f323ba08ed184e5b88da26040518263ffffffff1660e01b815260040180807f52574130303900000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156141f857600080fd5b505af115801561420c573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9826040518263ffffffff1660e01b815260040180807f5049505f525741303039000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156142a157600080fd5b505af11580156142b5573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd973ee0fc514280f09083a32ae906ccbd2fac4c680fa6040518263ffffffff1660e01b815260040180807f4d43445f4a4f494e5f5257413030395f410000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9731818ee501cd28e01e058e7c283e178e9e04a1e796040518263ffffffff1660e01b815260040180807f5257413030395f415f55524e00000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561441b57600080fd5b505af115801561442f573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9736c6d4be2223b5d202263515351034861dd9afdb66040518263ffffffff1660e01b815260040180807f5257413030395f415f4a415200000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156144d857600080fd5b505af11580156144ec573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd973508d982e13263fc8e1b5a4e6bf59b335202e36b46040518263ffffffff1660e01b815260040180807f5257413030395f415f4f55545055545f434f4e445549540000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561459557600080fd5b505af11580156145a9573d6000803e3d6000fd5b505050508873ffffffffffffffffffffffffffffffffffffffff16634d8835e68473ee0fc514280f09083a32ae906ccbd2fac4c680fa738b9734bbaa628bfc0c9f323ba08ed184e5b88da2866003876000738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561465457600080fd5b505afa158015614668573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561469257600080fd5b81019080805160405193929190846401000000008211156146b257600080fd5b838201915060208201858111156146c857600080fd5b82518660018202830111640100000000821117156146e557600080fd5b8083526020830192505050908051906020019080838360005b838110156147195780820151818401526020810190506146fe565b50505050905090810190601f1680156147465780820380516001836020036101000a031916815260200191505b506040525050506040518963ffffffff1660e01b8152600401808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835260148152602001807f5257413030392d413a20482e20562e2042616e6b000000000000000000000000815250602001838103825284818151815260200191508051906020019080838360005b8381101561485657808201518184015260208101905061483b565b50505050905090810190601f1680156148835780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b1580156148aa57600080fd5b505af11580156148be573d6000803e3d6000fd5b505050505050505050505050505056fe516d64667a5936703545706b594d4e3877636f6d4632613147734a62686b5069525156525953506653344e5a7442516d5265373750324a7376515779675672395a414d733453486e6a5551587a367561776453626f41616a32727946323032322d30372d3239204d616b657244414f20457865637574697665205370656c6c207c20486173683a20307831383835303038306231303162623433313235646432626563333265356537313936353836633536313462623961306630356639626265333932393031643634a264697066735822122043c1d0f6463db8f6b4b4d67ab4f98ef22eacf0f4d621b79c5a86cd516878a0d464736f6c634300060c0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100ce5760003560e01c80637284e4161161008c578063ae8421e111610066578063ae8421e1146102db578063b0604a26146102fb578063f7992d8514610305578063fe7d47bb14610323576100ce565b80637284e4161461021a5780638456cb591461029d57806396d373e5146102d1576100ce565b8062a7029b146100d35780630a7a1c4d146101565780634665096d1461018a57806351973ec9146101a857806351f91066146101dc5780636e832f07146101fa575b600080fd5b6100db610341565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561011b578082015181840152602081019050610100565b50505050905090810190601f1680156101485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015e6103df565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610192610403565b6040518082815260200191505060405180910390f35b6101b0610427565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e461043f565b6040518082815260200191505060405180910390f35b610202610463565b60405180821515815260200191505060405180910390f35b61022261050b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610262578082015181840152602081019050610247565b50505050905090810190601f16801561028f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a5610671565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102d9610695565b005b6102e3610995565b60405180821515815260200191505060405180910390f35b6103036109a8565b005b61030d610cc1565b6040518082815260200191505060405180910390f35b61032b610cc7565b6040518082815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d75780601f106103ac576101008083540402835291602001916103d7565b820191906000526020600020905b8154815290600101906020018083116103ba57829003601f168201915b505050505081565b7f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677981565b7f00000000000000000000000000000000000000000000000000000000630b73cc81565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca81565b60007f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff16636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d60208110156104f557600080fd5b8101908080519060200190929190505050905090565b60607f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105b157600080fd5b81019080805160405193929190846401000000008211156105d157600080fd5b838201915060208201858111156105e757600080fd5b825186600182028301116401000000008211171561060457600080fd5b8083526020830192505050908051906020019080838360005b8381101561063857808201518184015260208101905061061d565b50505050905090810190601f1680156106655780820380516001836020036101000a031916815260200191505b50604052505050905090565b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f381565b600260009054906101000a900460ff1615610718576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f7370656c6c2d616c72656164792d63617374000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff1663168ccd677f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef529767797fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca60016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018381526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505095505050505050600060405180830381600087803b15801561089957600080fd5b505af11580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156108d757600080fd5b81019080805160405193929190846401000000008211156108f757600080fd5b8382019150602082018581111561090d57600080fd5b825186600182028301116401000000008211171561092a57600080fd5b8083526020830192505050908051906020019080838360005b8381101561095e578082015181840152602081019050610943565b50505050905090810190601f16801561098b5780820380516001836020036101000a031916815260200191505b5060405250505050565b600260009054906101000a900460ff1681565b7f00000000000000000000000000000000000000000000000000000000630b73cc421115610a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5468697320636f6e74726163742068617320657870697265640000000000000081525060200191505060405180910390fd5b6000805414610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180610d7d6025913960400191505060405180910390fd5b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d6020811015610b2857600080fd5b810190808051906020019092919050505042016000819055507f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff166346d2fbbb7f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef529767797fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca60016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b505095505050505050600060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b50505050565b60005481565b60007f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff1663bf0fbcec6000546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d6020811015610d6657600080fd5b810190808051906020019092919050505090509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a26469706673582212200ba770595e555842a30f15288a5bee5d9bbfa3f352f5cdd4414f3e04bdd2c44c64736f6c634300060c0033

Libraries Used


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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