Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15237754 | 779 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
DssSpell
Compiler Version
v0.6.12+commit.27d51765
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
6101006040523480156200001257600080fd5b5062278d004201604051620000279062000234565b604051809103906000f08015801562000044573d6000803e3d6000fd5b5073da0ab1e0017debcd72be8599041a2aa3ba7e740f73ffffffffffffffffffffffffffffffffffffffff166321f8a7216040518163ffffffff1660e01b815260040180807f4d43445f50415553450000000000000000000000000000000000000000000000815250602001905060206040518083038186803b158015620000cb57600080fd5b505afa158015620000e0573d6000803e3d6000fd5b505050506040513d6020811015620000f757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508160c081815250508073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250506040516024016040516020818303038152906040527f61461954000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050600190805190602001906200021792919062000242565b50600080829050803f9150816080818152505050505050620002e8565b6149ee806200113283390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200028557805160ff1916838001178555620002b6565b82800160010185558215620002b6579182015b82811115620002b557825182559160200191906001019062000298565b5b509050620002c59190620002c9565b5090565b5b80821115620002e4576000816000905550600101620002ca565b5090565b60805160a05160601c60c05160e05160601c610dd76200035b6000398061067352806107355280610a9a5280610b4352508061040552806109aa5250806103e15280610467528061050f52806107715280610b7f5280610ccb52508061044152806107925280610ba05250610dd76000f3fe608060405234801561001057600080fd5b50600436106100ce5760003560e01c80637284e4161161008c578063ae8421e111610066578063ae8421e1146102db578063b0604a26146102fb578063f7992d8514610305578063fe7d47bb14610323576100ce565b80637284e4161461021a5780638456cb591461029d57806396d373e5146102d1576100ce565b8062a7029b146100d35780630a7a1c4d146101565780634665096d1461018a57806351973ec9146101a857806351f91066146101dc5780636e832f07146101fa575b600080fd5b6100db610341565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561011b578082015181840152602081019050610100565b50505050905090810190601f1680156101485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015e6103df565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610192610403565b6040518082815260200191505060405180910390f35b6101b0610427565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e461043f565b6040518082815260200191505060405180910390f35b610202610463565b60405180821515815260200191505060405180910390f35b61022261050b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610262578082015181840152602081019050610247565b50505050905090810190601f16801561028f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a5610671565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102d9610695565b005b6102e3610995565b60405180821515815260200191505060405180910390f35b6103036109a8565b005b61030d610cc1565b6040518082815260200191505060405180910390f35b61032b610cc7565b6040518082815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d75780601f106103ac576101008083540402835291602001916103d7565b820191906000526020600020905b8154815290600101906020018083116103ba57829003601f168201915b505050505081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d60208110156104f557600080fd5b8101908080519060200190929190505050905090565b60607f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105b157600080fd5b81019080805160405193929190846401000000008211156105d157600080fd5b838201915060208201858111156105e757600080fd5b825186600182028301116401000000008211171561060457600080fd5b8083526020830192505050908051906020019080838360005b8381101561063857808201518184015260208101905061061d565b50505050905090810190601f1680156106655780820380516001836020036101000a031916815260200191505b50604052505050905090565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900460ff1615610718576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f7370656c6c2d616c72656164792d63617374000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663168ccd677f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018381526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505095505050505050600060405180830381600087803b15801561089957600080fd5b505af11580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156108d757600080fd5b81019080805160405193929190846401000000008211156108f757600080fd5b8382019150602082018581111561090d57600080fd5b825186600182028301116401000000008211171561092a57600080fd5b8083526020830192505050908051906020019080838360005b8381101561095e578082015181840152602081019050610943565b50505050905090810190601f16801561098b5780820380516001836020036101000a031916815260200191505b5060405250505050565b600260009054906101000a900460ff1681565b7f0000000000000000000000000000000000000000000000000000000000000000421115610a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5468697320636f6e74726163742068617320657870697265640000000000000081525060200191505060405180910390fd5b6000805414610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180610d7d6025913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d6020811015610b2857600080fd5b810190808051906020019092919050505042016000819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166346d2fbbb7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000060016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b505095505050505050600060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b50505050565b60005481565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663bf0fbcec6000546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d6020811015610d6657600080fd5b810190808051906020019092919050505090509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a26469706673582212200ba770595e555842a30f15288a5bee5d9bbfa3f352f5cdd4414f3e04bdd2c44c64736f6c634300060c0033608060405234801561001057600080fd5b506149ce806100206000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80636e832f071161005b5780636e832f07146100f15780637284e41614610111578063bf0fbcec14610194578063f99e36bc146101d657610088565b806306f405fd1461008d578063552033c4146100ab57806361461954146100c95780636a146024146100d3575b600080fd5b6100956101e0565b6040518082815260200191505060405180910390f35b6100b36101f7565b6040518082815260200191505060405180910390f35b6100d1610207565b005b6100db610325565b6040518082815260200191505060405180910390f35b6100f9610331565b60405180821515815260200191505060405180910390f35b61011961033a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561015957808201518184015260208101905061013e565b50505050905090810190601f1680156101865780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101c0600480360360208110156101aa57600080fd5b8101908080359060200190929190505050610356565b6040518082815260200191505060405180910390f35b6101de610444565b005b722cd76fe086b93ce2f768a00b22a0000000000081565b6b033b2e3c9fd0803ce800000081565b738de6ddbcd5053d32292aaa0d2105a32d108484a66335329d4c4261022a610331565b6040518363ffffffff1660e01b8152600401808364ffffffffff16815260200182151581526020019250505060206040518083038186803b15801561026e57600080fd5b505af4158015610282573d6000803e3d6000fd5b505050506040513d602081101561029857600080fd5b810190808051906020019092919050505061031b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4f757473696465206f666669636520686f75727300000000000000000000000081525060200191505060405180910390fd5b610323610444565b565b670de0b6b3a764000081565b60006001905090565b6040518060a00160405280606e815260200161492b606e913981565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff64ffffffffff1682111561038c57600080fd5b738de6ddbcd5053d32292aaa0d2105a32d108484a663d255745683426103b0610331565b6040518463ffffffff1660e01b8152600401808464ffffffffff1681526020018364ffffffffff1681526020018215158152602001935050505060206040518083038186803b15801561040257600080fd5b505af4158015610416573d6000803e3d6000fd5b505050506040513d602081101561042c57600080fd5b81019080805190602001909291905050509050919050565b61044c6105a7565b6104546109ab565b738de6ddbcd5053d32292aaa0d2105a32d108484a66319d900a1732b3a4c18705e99bc29b22222da7e10b6436585526040518263ffffffff1660e01b815260040180807f5257415f544f4b454e5f464142000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff16815260200191505060006040518083038186803b1580156104f557600080fd5b505af4158015610509573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6635f3a7dd76040518163ffffffff1660e01b81526004018080602001828103825260068152602001807f312e31332e33000000000000000000000000000000000000000000000000000081525060200191505060006040518083038186803b15801561058d57600080fd5b505af41580156105a1573d6000803e3d6000fd5b50505050565b600073da0ab1e0017debcd72be8599041a2aa3ba7e740f90506000738de6ddbcd5053d32292aaa0d2105a32d108484a663738fdd1a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561060657600080fd5b505af415801561061a573d6000803e3d6000fd5b505050506040513d602081101561063057600080fd5b8101908080519060200190929190505050905060008273ffffffffffffffffffffffffffffffffffffffff166321f8a7216040518163ffffffff1660e01b815260040180807f4d495032315f4c49515549444154494f4e5f4f5241434c450000000000000000815250602001905060206040518083038186803b1580156106b657600080fd5b505afa1580156106ca573d6000803e3d6000fd5b505050506040513d60208110156106e057600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a66336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561073957600080fd5b505af415801561074d573d6000803e3d6000fd5b505050506040513d602081101561076357600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b1580156107bc57600080fd5b505af41580156107d0573d6000803e3d6000fd5b505050506040513d60208110156107e657600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a66384718d896040518163ffffffff1660e01b815260040160206040518083038186803b15801561083f57600080fd5b505af4158015610853573d6000803e3d6000fd5b505050506040513d602081101561086957600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a6632e77468d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156108c257600080fd5b505af41580156108d6573d6000803e3d6000fd5b505050506040513d60208110156108ec57600080fd5b810190808051906020019092919050505090506000738de6ddbcd5053d32292aaa0d2105a32d108484a663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505af4158015610959573d6000803e3d6000fd5b505050506040513d602081101561096f57600080fd5b81019080805190602001909291905050509050610992888888888787878b610ba4565b6109a188888888878787612dc2565b5050505050505050565b738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3731818ee501cd28e01e058e7c283e178e9e04a1e79670de0b6b3a76400006001026040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015610a4f57600080fd5b505af1158015610a63573d6000803e3d6000fd5b505050506040513d6020811015610a7957600080fd5b810190808051906020019092919050505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663dd467064670de0b6b3a76400006001026040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610afd57600080fd5b505af1158015610b11573d6000803e3d6000fd5b50505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff16633b304147670de0b6b3a764000063017d7840026040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610b8a57600080fd5b505af1158015610b9e573d6000803e3d6000fd5b50505050565b60007f5257413030382d410000000000000000000000000000000000000000000000009050600073b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610c2557600080fd5b505afa158015610c39573d6000803e3d6000fd5b505050506040513d6020811015610c4f57600080fd5b810190808051906020019092919050505060ff1690508673ffffffffffffffffffffffffffffffffffffffff167356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015610cd657600080fd5b505afa158015610cea573d6000803e3d6000fd5b505050506040513d6020811015610d0057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610d9a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d7661742d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b817356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b158015610df557600080fd5b505afa158015610e09573d6000803e3d6000fd5b505050506040513d6020811015610e1f57600080fd5b810190808051906020019092919050505014610ea3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d696c6b2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b73b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff167356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2857600080fd5b505afa158015610f3c573d6000803e3d6000fd5b505050506040513d6020811015610f5257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d67656d2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b807356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561104757600080fd5b505afa15801561105b573d6000803e3d6000fd5b505050506040513d602081101561107157600080fd5b8101908080519060200190929190505050146110f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d6465632d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561116657600080fd5b505afa15801561117a573d6000803e3d6000fd5b505050506040513d602081101561119057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461122a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d7661742d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166384718d896040518163ffffffff1660e01b815260040160206040518083038186803b15801561129b57600080fd5b505afa1580156112af573d6000803e3d6000fd5b505050506040513d60208110156112c557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461135f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d6a75672d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113d057600080fd5b505afa1580156113e4573d6000803e3d6000fd5b505050506040513d60208110156113fa57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611494576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d6461696a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b7356edd5067d89d4e65bf956c49eaf054e6ff0b26273ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561151957600080fd5b505afa15801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146115dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d67656d6a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b7321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1673495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff16637692535f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166257600080fd5b505afa158015611676573d6000803e3d6000fd5b505050506040513d602081101561168c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f75726e2d6f7574707574636f6e647569742d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1673a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b15801561179757600080fd5b505afa1580156117ab573d6000803e3d6000fd5b505050506040513d60208110156117c157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461185b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f696e707574636f6e647569742d6461692d6e6f742d6d6174636800000000000081525060200191505060405180910390fd5b73495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1673a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663131519816040518163ffffffff1660e01b815260040160206040518083038186803b1580156118e057600080fd5b505afa1580156118f4573d6000803e3d6000fd5b505050506040513d602081101561190a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146119a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e707574636f6e647569742d746f2d6e6f742d6d617463680000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff167321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1557600080fd5b505afa158015611a29573d6000803e3d6000fd5b505050506040513d6020811015611a3f57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614611ad9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f6f7574707574636f6e647569742d6461692d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8773ffffffffffffffffffffffffffffffffffffffff16633304e282836a18d9f684cc00131ff4e1806040518060600160405280602e81526020016148cf602e913960006040518563ffffffff1660e01b815260040180858152602001848152602001806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b83811015611b86578082015181840152602081019050611b6b565b50505050905090810190601f168015611bb35780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015611bd557600080fd5b505af1158015611be9573d6000803e3d6000fd5b5050505060008873ffffffffffffffffffffffffffffffffffffffff1663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015611c8057600080fd5b8101908080516040519392919084640100000000821115611ca057600080fd5b83820191506020820185811115611cb657600080fd5b8251866001820283011164010000000082111715611cd357600080fd5b8083526020830192505050908051906020019080838360005b83811015611d07578082015181840152602081019050611cec565b50505050905090810190601f168015611d345780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190805190602001909291905050505050915050738de6ddbcd5053d32292aaa0d2105a32d108484a663e5c6eb338785846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001807f70697000000000000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060006040518083038186803b158015611e1457600080fd5b505af4158015611e28573d6000803e3d6000fd5b505050508773ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611e7f57600080fd5b505af1158015611e93573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611eea57600080fd5b505af1158015611efe573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef4595897356edd5067d89d4e65bf956c49eaf054e6ff0b2626040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015611f9957600080fd5b505af4158015611fad573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663ef94132e846301c9c38060016040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b15801561201757600080fd5b505af415801561202b573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663e40898e0846b033b2e3ca008d093f9ea862d60006040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b15801561209d57600080fd5b505af41580156120b1573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663bdc56f30846127106040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b15801561210e57600080fd5b505af4158015612122573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6636d530fb3846040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b15801561217557600080fd5b505af4158015612189573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef45957356edd5067d89d4e65bf956c49eaf054e6ff0b26273495215cabc630830071f80263a908e8826a661216040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b15801561223857600080fd5b505af415801561224c573d6000803e3d6000fd5b5050505073495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663a3b22fc473cfc4043675ee82eeae63c90d6eb3ab2dcf8334316040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156122e157600080fd5b505af11580156122f5573d6000803e3d6000fd5b5050505073495215cabc630830071f80263a908e8826a6612173ffffffffffffffffffffffffffffffffffffffff1663a3b22fc47303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561238a57600080fd5b505af115801561239e573d6000803e3d6000fd5b505050507321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f873b9444802f0831a3eb9f90e24efe5ffa20138d6846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561243357600080fd5b505af1158015612447573d6000803e3d6000fd5b5050505073a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f873b9444802f0831a3eb9f90e24efe5ffa20138d6846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156124dc57600080fd5b505af11580156124f0573d6000803e3d6000fd5b505050507321cf5ad1311788d762f9035829f81b9f54610f0c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f87303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561258557600080fd5b505af1158015612599573d6000803e3d6000fd5b5050505073a397a23dda051186f202c67148c90683c413383c73ffffffffffffffffffffffffffffffffffffffff1663a81de4f87303f1a14a5b31e2f1751b6db368451dfcea5a04396040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561262e57600080fd5b505af1158015612642573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973b9737098b50d7c536b6416daeb32879444f59fca6040518263ffffffff1660e01b815260040180807f52574130303800000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156126eb57600080fd5b505af11580156126ff573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd9826040518263ffffffff1660e01b815260040180807f5049505f525741303038000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561279457600080fd5b505af11580156127a8573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd97356edd5067d89d4e65bf956c49eaf054e6ff0b2626040518263ffffffff1660e01b815260040180807f4d43445f4a4f494e5f5257413030385f410000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561285157600080fd5b505af1158015612865573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973495215cabc630830071f80263a908e8826a661216040518263ffffffff1660e01b815260040180807f5257413030385f415f55524e00000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561290e57600080fd5b505af1158015612922573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd973a397a23dda051186f202c67148c90683c413383c6040518263ffffffff1660e01b815260040180807f5257413030385f415f494e5055545f434f4e44554954000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156129cb57600080fd5b505af11580156129df573d6000803e3d6000fd5b505050508a73ffffffffffffffffffffffffffffffffffffffff1663ca446dd97321cf5ad1311788d762f9035829f81b9f54610f0c6040518263ffffffff1660e01b815260040180807f5257413030385f415f4f55545055545f434f4e445549540000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015612a8857600080fd5b505af1158015612a9c573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff16634d8835e6847356edd5067d89d4e65bf956c49eaf054e6ff0b26273b9737098b50d7c536b6416daeb32879444f59fca86600387600073b9737098b50d7c536b6416daeb32879444f59fca73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b158015612b4757600080fd5b505afa158015612b5b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015612b8557600080fd5b8101908080516040519392919084640100000000821115612ba557600080fd5b83820191506020820185811115612bbb57600080fd5b8251866001820283011164010000000082111715612bd857600080fd5b8083526020830192505050908051906020019080838360005b83811015612c0c578082015181840152602081019050612bf1565b50505050905090810190601f168015612c395780820380516001836020036101000a031916815260200191505b506040525050506040518963ffffffff1660e01b8152600401808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835260168152602001807f5257413030382d413a20534720466f726765204f464800000000000000000000815250602001838103825284818151815260200191508051906020019080838360005b83811015612d49578082015181840152602081019050612d2e565b50505050905090810190601f168015612d765780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b158015612d9d57600080fd5b505af1158015612db1573d6000803e3d6000fd5b505050505050505050505050505050565b60007f5257413030392d4100000000000000000000000000000000000000000000000090506000738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e4357600080fd5b505afa158015612e57573d6000803e3d6000fd5b505050506040513d6020811015612e6d57600080fd5b810190808051906020019092919050505060ff1690508573ffffffffffffffffffffffffffffffffffffffff1673ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b158015612ef457600080fd5b505afa158015612f08573d6000803e3d6000fd5b505050506040513d6020811015612f1e57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614612fb8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d7661742d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8173ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561301357600080fd5b505afa158015613027573d6000803e3d6000fd5b505050506040513d602081101561303d57600080fd5b8101908080519060200190929190505050146130c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d696c6b2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff1673ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561314657600080fd5b505afa15801561315a573d6000803e3d6000fd5b505050506040513d602081101561317057600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461320a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d67656d2d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8073ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff1663b3bcfa826040518163ffffffff1660e01b815260040160206040518083038186803b15801561326557600080fd5b505afa158015613279573d6000803e3d6000fd5b505050506040513d602081101561328f57600080fd5b810190808051906020019092919050505014613313576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f6a6f696e2d6465632d6e6f742d6d61746368000000000000000000000000000081525060200191505060405180910390fd5b8573ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166336569e776040518163ffffffff1660e01b815260040160206040518083038186803b15801561338457600080fd5b505afa158015613398573d6000803e3d6000fd5b505050506040513d60208110156133ae57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613448576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d7661742d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166384718d896040518163ffffffff1660e01b815260040160206040518083038186803b1580156134b957600080fd5b505afa1580156134cd573d6000803e3d6000fd5b505050506040513d60208110156134e357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161461357d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f75726e2d6a75672d6e6f742d6d6174636800000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663c11645bc6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135ee57600080fd5b505afa158015613602573d6000803e3d6000fd5b505050506040513d602081101561361857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146136b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d6461696a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b73ee0fc514280f09083a32ae906ccbd2fac4c680fa73ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561373757600080fd5b505afa15801561374b573d6000803e3d6000fd5b505050506040513d602081101561376157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146137fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f75726e2d67656d6a6f696e2d6e6f742d6d61746368000000000000000000000081525060200191505060405180910390fd5b73508d982e13263fc8e1b5a4e6bf59b335202e36b473ffffffffffffffffffffffffffffffffffffffff16731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff16637692535f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561388057600080fd5b505afa158015613894573d6000803e3d6000fd5b505050506040513d60208110156138aa57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614613944576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f75726e2d6f7574707574636f6e647569742d6e6f742d6d61746368000000000081525060200191505060405180910390fd5b8673ffffffffffffffffffffffffffffffffffffffff16633304e28283670de0b6b3a76400006305f5e100026040518060600160405280602e81526020016148fd602e913960006040518563ffffffff1660e01b815260040180858152602001848152602001806020018365ffffffffffff168152602001828103825284818151815260200191508051906020019080838360005b838110156139f45780820151818401526020810190506139d9565b50505050905090810190601f168015613a215780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015613a4357600080fd5b505af1158015613a57573d6000803e3d6000fd5b5050505060008773ffffffffffffffffffffffffffffffffffffffff1663d9638d36846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613ab057600080fd5b505af1158015613ac4573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506080811015613aee57600080fd5b8101908080516040519392919084640100000000821115613b0e57600080fd5b83820191506020820185811115613b2457600080fd5b8251866001820283011164010000000082111715613b4157600080fd5b8083526020830192505050908051906020019080838360005b83811015613b75578082015181840152602081019050613b5a565b50505050905090810190601f168015613ba25780820380516001836020036101000a031916815260200191505b506040526020018051906020019092919080519060200190929190805190602001909291905050505050915050738de6ddbcd5053d32292aaa0d2105a32d108484a663e5c6eb338685846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001807f70697000000000000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001935050505060006040518083038186803b158015613c8257600080fd5b505af4158015613c96573d6000803e3d6000fd5b505050508673ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613ced57600080fd5b505af1158015613d01573d6000803e3d6000fd5b505050508573ffffffffffffffffffffffffffffffffffffffff16633b663195846040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015613d5857600080fd5b505af1158015613d6c573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef45958873ee0fc514280f09083a32ae906ccbd2fac4c680fa6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b158015613e0757600080fd5b505af4158015613e1b573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663ef94132e846305f5e10060016040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b158015613e8557600080fd5b505af4158015613e99573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663e40898e0846b033b2e3c9fd0803ce800000060006040518463ffffffff1660e01b8152600401808481526020018381526020018215158152602001935050505060006040518083038186803b158015613f0b57600080fd5b505af4158015613f1f573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a663bdc56f30846127106040518363ffffffff1660e01b8152600401808381526020018281526020019250505060006040518083038186803b158015613f7c57600080fd5b505af4158015613f90573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6636d530fb3846040518263ffffffff1660e01b81526004018082815260200191505060006040518083038186803b158015613fe357600080fd5b505af4158015613ff7573d6000803e3d6000fd5b50505050738de6ddbcd5053d32292aaa0d2105a32d108484a6632bef459573ee0fc514280f09083a32ae906ccbd2fac4c680fa731818ee501cd28e01e058e7c283e178e9e04a1e796040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060006040518083038186803b1580156140a657600080fd5b505af41580156140ba573d6000803e3d6000fd5b50505050731818ee501cd28e01e058e7c283e178e9e04a1e7973ffffffffffffffffffffffffffffffffffffffff1663a3b22fc4306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561413b57600080fd5b505af115801561414f573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9738b9734bbaa628bfc0c9f323ba08ed184e5b88da26040518263ffffffff1660e01b815260040180807f52574130303900000000000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156141f857600080fd5b505af115801561420c573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9826040518263ffffffff1660e01b815260040180807f5049505f525741303039000000000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156142a157600080fd5b505af11580156142b5573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd973ee0fc514280f09083a32ae906ccbd2fac4c680fa6040518263ffffffff1660e01b815260040180807f4d43445f4a4f494e5f5257413030395f410000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561435e57600080fd5b505af1158015614372573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9731818ee501cd28e01e058e7c283e178e9e04a1e796040518263ffffffff1660e01b815260040180807f5257413030395f415f55524e00000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561441b57600080fd5b505af115801561442f573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd9736c6d4be2223b5d202263515351034861dd9afdb66040518263ffffffff1660e01b815260040180807f5257413030395f415f4a415200000000000000000000000000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156144d857600080fd5b505af11580156144ec573d6000803e3d6000fd5b505050508973ffffffffffffffffffffffffffffffffffffffff1663ca446dd973508d982e13263fc8e1b5a4e6bf59b335202e36b46040518263ffffffff1660e01b815260040180807f5257413030395f415f4f55545055545f434f4e445549540000000000000000008152506020018273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561459557600080fd5b505af11580156145a9573d6000803e3d6000fd5b505050508873ffffffffffffffffffffffffffffffffffffffff16634d8835e68473ee0fc514280f09083a32ae906ccbd2fac4c680fa738b9734bbaa628bfc0c9f323ba08ed184e5b88da2866003876000738b9734bbaa628bfc0c9f323ba08ed184e5b88da273ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b15801561465457600080fd5b505afa158015614668573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561469257600080fd5b81019080805160405193929190846401000000008211156146b257600080fd5b838201915060208201858111156146c857600080fd5b82518660018202830111640100000000821117156146e557600080fd5b8083526020830192505050908051906020019080838360005b838110156147195780820151818401526020810190506146fe565b50505050905090810190601f1680156147465780820380516001836020036101000a031916815260200191505b506040525050506040518963ffffffff1660e01b8152600401808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff1681526020018681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018060200180602001838103835260148152602001807f5257413030392d413a20482e20562e2042616e6b000000000000000000000000815250602001838103825284818151815260200191508051906020019080838360005b8381101561485657808201518184015260208101905061483b565b50505050905090810190601f1680156148835780820380516001836020036101000a031916815260200191505b509a5050505050505050505050600060405180830381600087803b1580156148aa57600080fd5b505af11580156148be573d6000803e3d6000fd5b505050505050505050505050505056fe516d64667a5936703545706b594d4e3877636f6d4632613147734a62686b5069525156525953506653344e5a7442516d5265373750324a7376515779675672395a414d733453486e6a5551587a367561776453626f41616a32727946323032322d30372d3239204d616b657244414f20457865637574697665205370656c6c207c20486173683a20307831383835303038306231303162623433313235646432626563333265356537313936353836633536313462623961306630356639626265333932393031643634a264697066735822122043c1d0f6463db8f6b4b4d67ab4f98ef22eacf0f4d621b79c5a86cd516878a0d464736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ce5760003560e01c80637284e4161161008c578063ae8421e111610066578063ae8421e1146102db578063b0604a26146102fb578063f7992d8514610305578063fe7d47bb14610323576100ce565b80637284e4161461021a5780638456cb591461029d57806396d373e5146102d1576100ce565b8062a7029b146100d35780630a7a1c4d146101565780634665096d1461018a57806351973ec9146101a857806351f91066146101dc5780636e832f07146101fa575b600080fd5b6100db610341565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561011b578082015181840152602081019050610100565b50505050905090810190601f1680156101485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61015e6103df565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610192610403565b6040518082815260200191505060405180910390f35b6101b0610427565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101e461043f565b6040518082815260200191505060405180910390f35b610202610463565b60405180821515815260200191505060405180910390f35b61022261050b565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610262578082015181840152602081019050610247565b50505050905090810190601f16801561028f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102a5610671565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102d9610695565b005b6102e3610995565b60405180821515815260200191505060405180910390f35b6103036109a8565b005b61030d610cc1565b6040518082815260200191505060405180910390f35b61032b610cc7565b6040518082815260200191505060405180910390f35b60018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103d75780601f106103ac576101008083540402835291602001916103d7565b820191906000526020600020905b8154815290600101906020018083116103ba57829003601f168201915b505050505081565b7f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677981565b7f00000000000000000000000000000000000000000000000000000000630b73cc81565b73da0ab1e0017debcd72be8599041a2aa3ba7e740f81565b7fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca81565b60007f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff16636e832f076040518163ffffffff1660e01b815260040160206040518083038186803b1580156104cb57600080fd5b505afa1580156104df573d6000803e3d6000fd5b505050506040513d60208110156104f557600080fd5b8101908080519060200190929190505050905090565b60607f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff16637284e4166040518163ffffffff1660e01b815260040160006040518083038186803b15801561057357600080fd5b505afa158015610587573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156105b157600080fd5b81019080805160405193929190846401000000008211156105d157600080fd5b838201915060208201858111156105e757600080fd5b825186600182028301116401000000008211171561060457600080fd5b8083526020830192505050908051906020019080838360005b8381101561063857808201518184015260208101905061061d565b50505050905090810190601f1680156106655780820380516001836020036101000a031916815260200191505b50604052505050905090565b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f381565b600260009054906101000a900460ff1615610718576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f7370656c6c2d616c72656164792d63617374000000000000000000000000000081525060200191505060405180910390fd5b6001600260006101000a81548160ff0219169083151502179055507f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff1663168ccd677f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef529767797fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca60016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff168152602001848152602001806020018381526020018281038252848181546001816001161561010002031660029004815260200191508054600181600116156101000203166002900480156108765780601f1061084b57610100808354040283529160200191610876565b820191906000526020600020905b81548152906001019060200180831161085957829003601f168201915b505095505050505050600060405180830381600087803b15801561089957600080fd5b505af11580156108ad573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060208110156108d757600080fd5b81019080805160405193929190846401000000008211156108f757600080fd5b8382019150602082018581111561090d57600080fd5b825186600182028301116401000000008211171561092a57600080fd5b8083526020830192505050908051906020019080838360005b8381101561095e578082015181840152602081019050610943565b50505050905090810190601f16801561098b5780820380516001836020036101000a031916815260200191505b5060405250505050565b600260009054906101000a900460ff1681565b7f00000000000000000000000000000000000000000000000000000000630b73cc421115610a3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5468697320636f6e74726163742068617320657870697265640000000000000081525060200191505060405180910390fd5b6000805414610a98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180610d7d6025913960400191505060405180910390fd5b7f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b815260040160206040518083038186803b158015610afe57600080fd5b505afa158015610b12573d6000803e3d6000fd5b505050506040513d6020811015610b2857600080fd5b810190808051906020019092919050505042016000819055507f000000000000000000000000be286431454714f511008713973d3b053a2d38f373ffffffffffffffffffffffffffffffffffffffff166346d2fbbb7f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef529767797fea0c1ebcc4a72c342ffd0cca7e65f916e8b926488a2c53f5f46f3628c54d3eca60016000546040518563ffffffff1660e01b8152600401808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200180602001838152602001828103825284818154600181600116156101000203166002900481526020019150805460018160011615610100020316600290048015610c845780601f10610c5957610100808354040283529160200191610c84565b820191906000526020600020905b815481529060010190602001808311610c6757829003601f168201915b505095505050505050600060405180830381600087803b158015610ca757600080fd5b505af1158015610cbb573d6000803e3d6000fd5b50505050565b60005481565b60007f0000000000000000000000001b4eb06e91835cc4c3b01bf9178812ef5297677973ffffffffffffffffffffffffffffffffffffffff1663bf0fbcec6000546040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b158015610d3c57600080fd5b505afa158015610d50573d6000803e3d6000fd5b505050506040513d6020811015610d6657600080fd5b810190808051906020019092919050505090509056fe54686973207370656c6c2068617320616c7265616479206265656e207363686564756c6564a26469706673582212200ba770595e555842a30f15288a5bee5d9bbfa3f352f5cdd4414f3e04bdd2c44c64736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.