编译器
0.6.12+commit.27d51765
文件 1 的 5:DaiAbstract.sol
pragma solidity >=0.5.12;
interface DaiAbstract {
function wards(address) external view returns (uint256);
function rely(address) external;
function deny(address) external;
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function version() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address) external view returns (uint256);
function allowance(address, address) external view returns (uint256);
function nonces(address) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external view returns (bytes32);
function transfer(address, uint256) external returns (bool);
function transferFrom(address, address, uint256) external returns (bool);
function mint(address, uint256) external;
function burn(address, uint256) external;
function approve(address, uint256) external returns (bool);
function push(address, uint256) external;
function pull(address, uint256) external;
function move(address, address, uint256) external;
function permit(address, address, uint256, uint256, bool, uint8, bytes32, bytes32) external;
}
文件 2 的 5:GemAbstract.sol
pragma solidity >=0.5.12;
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);
}
文件 3 的 5:GemJoinAbstract.sol
pragma solidity >=0.5.12;
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;
}
文件 4 的 5:PsmAbstract.sol
pragma solidity >=0.5.12;
interface PsmAbstract {
function wards(address) external view returns (uint256);
function rely(address) external;
function deny(address) external;
function vat() external view returns (address);
function gemJoin() external view returns (address);
function dai() external view returns (address);
function daiJoin() external view returns (address);
function ilk() external view returns (bytes32);
function vow() external view returns (address);
function tin() external view returns (uint256);
function tout() external view returns (uint256);
function file(bytes32 what, uint256 data) external;
function hope(address) external;
function nope(address) external;
function sellGem(address usr, uint256 gemAmt) external;
function buyGem(address usr, uint256 gemAmt) external;
}
文件 5 的 5:RwaSwapInputConduit2.sol
pragma solidity 0.6.12;
import {GemAbstract} from "dss-interfaces/ERC/GemAbstract.sol";
import {DaiAbstract} from "dss-interfaces/dss/DaiAbstract.sol";
import {PsmAbstract} from "dss-interfaces/dss/PsmAbstract.sol";
import {GemJoinAbstract} from "dss-interfaces/dss/GemJoinAbstract.sol";
contract RwaSwapInputConduit2 {
GemAbstract public immutable gem;
DaiAbstract public immutable dai;
uint256 private immutable to18ConversionFactor;
mapping(address => uint256) public wards;
mapping(address => uint256) public may;
PsmAbstract public psm;
address public to;
address public quitTo;
event Rely(address indexed usr);
event Deny(address indexed usr);
event Mate(address indexed usr);
event Hate(address indexed usr);
event Push(address indexed to, uint256 wad);
event File(bytes32 indexed what, address data);
event Quit(address indexed quitTo, uint256 wad);
event Yank(address indexed token, address indexed usr, uint256 amt);
modifier auth() {
require(wards[msg.sender] == 1, "RwaSwapInputConduit2/not-authorized");
_;
}
modifier onlyMate() {
require(may[msg.sender] == 1, "RwaSwapInputConduit2/not-mate");
_;
}
constructor(
address _dai,
address _gem,
address _psm,
address _to
) public {
require(_to != address(0), "RwaSwapInputConduit2/invalid-to-address");
require(PsmAbstract(_psm).dai() == _dai, "RwaSwapInputConduit2/wrong-dai-for-psm");
require(GemJoinAbstract(PsmAbstract(_psm).gemJoin()).gem() == _gem, "RwaSwapInputConduit2/wrong-gem-for-psm");
to18ConversionFactor = 10**_sub(18, GemAbstract(_gem).decimals());
psm = PsmAbstract(_psm);
dai = DaiAbstract(_dai);
gem = GemAbstract(_gem);
to = _to;
GemAbstract(_gem).approve(address(psm.gemJoin()), type(uint256).max);
wards[msg.sender] = 1;
emit Rely(msg.sender);
}
function rely(address usr) external auth {
wards[usr] = 1;
emit Rely(usr);
}
function deny(address usr) external auth {
wards[usr] = 0;
emit Deny(usr);
}
function mate(address usr) external auth {
may[usr] = 1;
emit Mate(usr);
}
function hate(address usr) external auth {
may[usr] = 0;
emit Hate(usr);
}
function file(bytes32 what, address data) external auth {
if (what == "quitTo") {
quitTo = data;
} else if (what == "to") {
to = data;
} else if (what == "psm") {
require(PsmAbstract(data).dai() == address(dai), "RwaSwapInputConduit2/wrong-dai-for-psm");
require(
GemJoinAbstract(PsmAbstract(data).gemJoin()).gem() == address(gem),
"RwaSwapInputConduit2/wrong-gem-for-psm"
);
gem.approve(address(psm.gemJoin()), 0);
gem.approve(address(PsmAbstract(data).gemJoin()), type(uint256).max);
psm = PsmAbstract(data);
} else {
revert("RwaSwapInputConduit2/unrecognised-param");
}
emit File(what, data);
}
function push() external {
_doPush(gem.balanceOf(address(this)));
}
function push(uint256 amt) external {
_doPush(amt);
}
function quit() external onlyMate {
_doQuit(gem.balanceOf(address(this)));
}
function quit(uint256 amt) external onlyMate {
_doQuit(amt);
}
function yank(
address token,
address usr,
uint256 amt
) external auth {
GemAbstract(token).transfer(usr, amt);
emit Yank(token, usr, amt);
}
function expectedDaiWad(uint256 amt) public view returns (uint256 wad) {
uint256 amt18 = _mul(amt, to18ConversionFactor);
uint256 fee = _mul(amt18, psm.tin()) / WAD;
return _sub(amt18, fee);
}
function requiredGemAmt(uint256 wad) external view returns (uint256 amt) {
return _mul(wad, WAD) / _mul(_sub(WAD, psm.tin()), to18ConversionFactor);
}
function _doPush(uint256 amt) internal {
require(to != address(0), "RwaSwapInputConduit2/invalid-to-address");
psm.sellGem(to, amt);
emit Push(to, expectedDaiWad(amt));
}
function _doQuit(uint256 amt) internal {
require(quitTo != address(0), "RwaSwapInputConduit2/invalid-quit-to-address");
gem.transfer(quitTo, amt);
emit Quit(quitTo, amt);
}
uint256 internal constant WAD = 10**18;
function _sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "Math/sub-overflow");
}
function _mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "Math/mul-overflow");
}
}
{
"compilationTarget": {
"lib/mip21-toolkit/src/conduits/RwaSwapInputConduit2.sol": "RwaSwapInputConduit2"
},
"evmVersion": "istanbul",
"libraries": {
"ChecksummedAddress": "0xf880b93f25d9c528703adc403a56c1fdfb2e5900",
"SolidityTypeConversions": "0xf9e6d5084f70f814f1f03514e75c37a6b40f4936",
"Strings": "0x93688e1fa99e80d65dc3c07f69ff07198321056d"
},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": [
":clipper-mom/=lib/dss-exec-lib/lib/clipper-mom/src/",
":ds-auth/=lib/ds-token/lib/ds-auth/src/",
":ds-math/=lib/ds-math/src/",
":ds-note/=lib/ds-value/lib/ds-thing/lib/ds-note/src/",
":ds-pause/=lib/dss-gem-joins/lib/dss-deploy/lib/ds-pause/src/",
":ds-proxy/=lib/dss-exec-lib/lib/ds-proxy/src/",
":ds-stop/=lib/dss-exec-lib/lib/osm-mom/lib/osm/lib/ds-stop/src/",
":ds-test/=lib/ds-test/src/",
":ds-thing/=lib/ds-value/lib/ds-thing/src/",
":ds-token/=lib/ds-token/src/",
":ds-value/=lib/ds-value/src/",
":dss-auto-line/=lib/dss-exec-lib/lib/dss-auto-line/src/",
":dss-chain-log/=lib/mip21-toolkit/lib/dss-chain-log/src/",
":dss-deploy/=lib/dss-gem-joins/lib/dss-deploy/src/",
":dss-direct-deposit/=lib/dss-exec-lib/lib/dss-direct-deposit/src/",
":dss-exec-lib/=lib/dss-exec-lib/src/",
":dss-gem-joins/=lib/dss-gem-joins/src/",
":dss-interfaces/=lib/dss-interfaces/src/",
":dss-lerp/=lib/dss-exec-lib/lib/dss-lerp/src/",
":dss-psm/=lib/mip21-toolkit/lib/dss-psm/src/",
":dss/=lib/dss/src/",
":esm/=lib/dss-gem-joins/lib/dss-deploy/lib/esm/src/",
":flipper-mom/=lib/dss-exec-lib/lib/flipper-mom/src/",
":forge-std/=lib/forge-std/src/",
":forward-proxy/=lib/forward-proxy/src/",
":ilk-registry/=lib/mip21-toolkit/lib/ilk-registry/src/",
":median/=lib/dss-exec-lib/lib/median/src/",
":mip21-toolkit/=lib/mip21-toolkit/src/",
":mkr-authority/=lib/dss-exec-lib/lib/mkr-authority/src/",
":osm-mom/=lib/dss-exec-lib/lib/osm-mom/src/",
":osm/=lib/dss-exec-lib/lib/osm-mom/lib/osm/src/",
":univ2-lp-oracle/=lib/dss-exec-lib/lib/univ2-lp-oracle/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_dai","type":"address"},{"internalType":"address","name":"_gem","type":"address"},{"internalType":"address","name":"_psm","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"File","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Hate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Mate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Push","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"quitTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Quit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Yank","type":"event"},{"inputs":[],"name":"dai","outputs":[{"internalType":"contract DaiAbstract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"expectedDaiWad","outputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gem","outputs":[{"internalType":"contract GemAbstract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"hate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"mate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"may","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"psm","outputs":[{"internalType":"contract PsmAbstract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"push","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"push","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"quit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quitTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"requiredGemAmt","outputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"to","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"yank","outputs":[],"stateMutability":"nonpayable","type":"function"}]