/** * Source Code first verified at https://etherscan.io on Friday, March 22, 2019 (UTC) */ // hevm: flattened sources of src/spell.sol pragma solidity >=0.4.23; ////// lib/ds-exec/src/exec.sol // exec.sol - base contract used by anything that wants to do "untyped" calls // Copyright (C) 2017 DappHub, LLC // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . /* pragma solidity >=0.4.23; */ contract DSExec { function tryExec( address target, bytes memory data, uint value) internal returns (bool ok) { assembly { ok := call(gas, target, value, add(data, 0x20), mload(data), 0, 0) } } function exec( address target, bytes memory data, uint value) internal { if(!tryExec(target, data, value)) { revert("ds-exec-call-failed"); } } // Convenience aliases function exec( address t, bytes memory c ) internal { exec(t, c, 0); } function exec( address t, uint256 v ) internal { bytes memory c; exec(t, c, v); } function tryExec( address t, bytes memory c ) internal returns (bool) { return tryExec(t, c, 0); } function tryExec( address t, uint256 v ) internal returns (bool) { bytes memory c; return tryExec(t, c, v); } } ////// lib/ds-note/src/note.sol /// note.sol -- the `note' modifier, for logging calls as events // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . /* pragma solidity >=0.4.23; */ contract DSNote { event LogNote( bytes4 indexed sig, address indexed guy, bytes32 indexed foo, bytes32 indexed bar, uint256 wad, bytes fax ) anonymous; modifier note { bytes32 foo; bytes32 bar; uint256 wad; assembly { foo := calldataload(4) bar := calldataload(36) wad := callvalue } emit LogNote(msg.sig, msg.sender, foo, bar, wad, msg.data); _; } } ////// src/spell.sol // spell.sol - An un-owned object that performs one action one time only // Copyright (C) 2017, 2018 DappHub, LLC // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU 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 General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see . /* pragma solidity >=0.4.23; */ /* import "ds-exec/exec.sol"; */ /* import "ds-note/note.sol"; */ contract DSSpell is DSExec, DSNote { address public whom; uint256 public mana; bytes public data; bool public done; constructor(address whom_, uint256 mana_, bytes memory data_) public { whom = whom_; mana = mana_; data = data_; } // Only marked 'done' if CALL succeeds (not exceptional condition). function cast() public note { require(!done, "ds-spell-already-cast"); exec(whom, data, mana); done = true; } }