Skip to content

Instantly share code, notes, and snippets.

@mcchan1
Created July 21, 2020 18:19
Show Gist options
  • Save mcchan1/d05ff5404f36c1b31df9df976b51ab82 to your computer and use it in GitHub Desktop.
Save mcchan1/d05ff5404f36c1b31df9df976b51ab82 to your computer and use it in GitHub Desktop.
///-safemath, ownable, reentrancy,et..
//add proxy contracts below
interface ZapInUniSwap2 {
//updated zapIn parameters - replace slippage w/ _minPoolTokkenss
function ZapIn(
address _FromTokenContractAddress,
address _ToUnipoolToken0,
address _ToUnipoolToken1,
uint256 _amount,
uint256 _minPoolTokens) payable external returns(uint256);
}
//ZapIn(address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount, uint256 _minPoolTokens);
//updated Zapout
interface ZapOutUniSwap2 {
function ZapOut(
address _ToTokenContractAddress,
address _FromUniPoolAddress,
uint256 _IncomingLP,
uint256 _minTokensRec) payable external returns(uint256);
}
/**
* WIP _ The UniSwapv2MinionProxy contract is an extension with goal of keeping Minion itself modular...
*/
contract MinionZap is Ownable, ReentrancyGuard{
ZapInUniSwap2 public zapIn; // 0x775ee938186fddc13bd7c89d24820e1b0758f91d
ZapOutUniSwap2 public zapOut; //Zapper's Remove Liquidity K = 0x343e3a490c9251dc0eaa81da146ba6abe6c78b2d
address public recipient;
address rawETH = address(0);
//has to be hardcoded to deploy, maybe better to let user input param?
//uint256 public slippage; //= 500;//zapOut.defaultSlippage();
constructor(address _zapIn, address _zapOut, address _receipient) public {
zapIn = ZapInUniSwap2(_zapIn); //0x775ee938186fddc13bd7c89d24820e1b0758f91d
zapOut = ZapOutUniSwap2(_zapOut); // 0x343e3a490c9251dc0eaa81da146ba6abe6c78b2d
recipient = _receipient;
}
// _FromTokenContractAddress => rawETH = addresss(0) - not hardcodig for test purposes.
//maker dai 0x6b175474e89094c44da98b954eedeac495271d0f - token 0
//weth 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 - token 1
//amount = amount of eth to be exchanged
function zapInUniSwap2Pool (address _FromTokenContractAddress, address _ToUnipoolToken0, address _ToUnipoolToken1, uint256 _amount, uint256 _minPoolTokens) public payable returns(uint256) {
//move require statement for testing
//require(msg.value == _amount);
zapIn.ZapIn(_FromTokenContractAddress, _ToUnipoolToken0, _ToUnipoolToken1, _amount, _minPoolTokens);
}
//Integrate into ZapInUniSwap2Pool - IS THIS NEEDED TO ZAP OUT of UNISWAP?
function approveLP (address _poolTokenAddress, address _zapContractAddress, uint256 _amount) public onlyOwner nonReentrant {
//require(IERC20(_poolTokenAddress).approve(_zapContractAddress, _amount), "token approval failed");
IERC20(_poolTokenAddress).approve(_zapContractAddress, _amount); //less strict for testing
}
//// maker dai/weth pair 0xA478c2975Ab1Ea89e8196811F51A7B7Ade33eB11 - uniPool
// alternate use WETH K instead of eth- 0c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2 for _toTokenContractAddress
// @notice This function is used to zapout of given Uniswap pair in ETH/ERC20 Tokens
// @param _ToTokenContractAddress The ERC20 token to zapout in (address(0x00) if ether)
// @param _FromUniPoolAddress The uniswap pair address to zapout from
// @param _IncomingLP The amount of LP
// @return the amount of eth/tokens received after zapout
function zapOutUniSwap2Pool (address _FromUniPoolAddress, uint256 _IncomingLP, uint256 _minTokensRec ) public onlyOwner nonReentrant{
zapOut.ZapOut(rawETH, _FromUniPoolAddress, _IncomingLP, _minTokensRec);
}
//recipeint could. be a wallet or pool manager.
//@param _recipient accepts erc20 tokens. Set by Owner/multisig
function setTokenRecipient (address _recipient) public nonReentrant onlyOwner {
recipient = _recipient;
}
//Need to be able to transfer tokens that the Minion withdraws from the LAO
//@param _tokenAddress is the erc20 token contract
//@param _amount = in wei format
function moveTokens(address _tokenAdress,uint _amount) public nonReentrant onlyOwner {
require(IERC20(_tokenAdress).transfer(recipient, _amount), "transfer failed");
}
//add ownership to udpate slippage, zapin, zapout K addresses...
function udpdateZapperSettings (address _zapIn, address _zapOut) public onlyOwner {
zapIn = ZapInUniSwap2(_zapIn);
zapOut = ZapOutUniSwap2(_zapOut);
}
function() external payable { }
}
@mcchan1
Copy link
Author

mcchan1 commented Jul 21, 2020

Thanks for taking a look -- idea is to zapIn/zapOut to a pool with ETH from a proxy contract. Members from a Moloch DAO/LAO would fund a proxy contract with ETH, and then the proxy contract would handle zapIn/zapOut

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment