mirror of
https://github.com/autistic-symposium/mev-toolkit.git
synced 2025-04-27 03:09:17 -04:00
Create dydx_flahsloan.sol
This commit is contained in:
parent
2631af7f36
commit
36b007d01c
61
flashloans/dydx_flahsloan.sol
Normal file
61
flashloans/dydx_flahsloan.sol
Normal file
@ -0,0 +1,61 @@
|
||||
function callFunction(address sender, Account.Info memory accountInfo, bytes memory data) external {
|
||||
// Use chi tokens
|
||||
uint256 gasStart = gasleft();
|
||||
|
||||
// Let the executor or the dYdX contract call this function
|
||||
// probably fine to restrict to dYdX
|
||||
require(msg.sender == executor || msg.sender == address(soloMargin));
|
||||
|
||||
// Decode the passed variables from the data object
|
||||
(
|
||||
address[] memory sUSDAddresses,
|
||||
uint256[] memory sUSDLoanIDs,
|
||||
uint256 wethEstimate,
|
||||
uint256 usdcEstimate,
|
||||
uint256 ethToCoinbase
|
||||
)
|
||||
= abi.decode(data,
|
||||
(
|
||||
address[],
|
||||
uint256[],
|
||||
uint256,
|
||||
uint256,
|
||||
uint256
|
||||
));
|
||||
|
||||
// Swap WETH for USDC on uniswap v3
|
||||
uniswapRouter.exactOutputSingle(
|
||||
ISwapRouter.ExactOutputSingleParams(
|
||||
address(WETH), // address tokenIn;
|
||||
usdcTokenAddress, // address tokenOut;
|
||||
3000, // uint24 fee;
|
||||
address(this), // address recipient;
|
||||
10**18, // uint256 deadline;
|
||||
usdcEstimate, // uint256 amountOut;
|
||||
wethEstimate, // uint256 amountInMaximum;
|
||||
0 // uint160 sqrtPriceLimitX96;
|
||||
)
|
||||
);
|
||||
|
||||
// Swap USDC for sUSD on Curve
|
||||
curvePoolSUSD.exchange_underlying(
|
||||
1, // usdc
|
||||
3, // sUSD
|
||||
usdcEstimate, // usdc input
|
||||
1); // min sUSD, generally not advisible to make a trade with a min amount out of 1, but its fine here I think because the overall risk of getting rekt is low
|
||||
|
||||
// Liquidate the loans
|
||||
for (uint256 i = 0; i < sUSDAddresses.length; i++) {
|
||||
sUSDLoansAddress.liquidateUnclosedLoan(sUSDAddresses[i], sUSDLoanIDs[i]);
|
||||
}
|
||||
|
||||
// We got back ETH but must pay dYdX in WETH, so deposit our whole balance sans what is paid to miners
|
||||
WETH.deposit{value: address(this).balance - ethToCoinbase}();
|
||||
|
||||
// Pay the miner
|
||||
block.coinbase.transfer(ethToCoinbase);
|
||||
|
||||
// Use for chi tokens
|
||||
uint256 gasSpent = 21000 + gasStart - gasleft() + (16 * msg.data.length);
|
||||
CHI.freeFromUpTo(owner, (gasSpent + 14154) / 41947);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user