pragma solidity 0.5.15;
// https://github.com/makerdao/sai/blob/master/src/tap.sol
contract SaiTapInterface {
function sai() public view returns (address);
function cash(uint256) public;
}
contract TokenInterface {
function approve(address, uint256) public;
function transferFrom(address, address, uint256) public returns (bool);
function withdraw(uint256) public;
function balanceOf(address) public view returns (uint256);
}
// User must approve() this contract on Sai prior to calling.
contract CageFree {
address public tap;
address public sai;
address public weth;
event FreeCash(address sender, uint256 amount);
constructor(address _tap, address _weth) public {
tap = _tap;
sai = SaiTapInterface(tap).sai();
weth = _weth;
TokenInterface(sai).approve(tap, uint256(-1));
}
function freeCash(uint256 wad) public returns (uint256 cashoutBalance) {
TokenInterface(sai).transferFrom(msg.sender, address(this), wad);
SaiTapInterface(tap).cash(wad);
cashoutBalance = TokenInterface(weth).balanceOf(address(this));
require(cashoutBalance > 0, "Zero ETH value");
TokenInterface(weth).withdraw(cashoutBalance);
msg.sender.transfer(cashoutBalance);
emit FreeCash(msg.sender, cashoutBalance);
}
function() external payable {
require(msg.sender == weth, "Only WETH can send ETH");
}
}
{
"compilationTarget": {
"CageFree.sol": "CageFree"
},
"evmVersion": "istanbul",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_tap","type":"address"},{"internalType":"address","name":"_weth","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FreeCash","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"freeCash","outputs":[{"internalType":"uint256","name":"cashoutBalance","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sai","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tap","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]