Skip to content

Instantly share code, notes, and snippets.

@korrio
Created November 28, 2021 04:10
Show Gist options
  • Save korrio/77c9861cf9742c2c5016f9786759f700 to your computer and use it in GitHub Desktop.
Save korrio/77c9861cf9742c2c5016f9786759f700 to your computer and use it in GitHub Desktop.
Artbitrage_nov.sol
pragma solidity 0.6.12;
interface IMyRouterInterface { // UniswapV2Interface
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
}
interface IERC20 {
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract Arbitrage {
address public routerA;
address public routerB;
address public BUSD;
address public BNB;
address[] public path;
constructor () public {
routerA = address(0x91f5b34D3600D2630F6A37dd7F41666b63975BEC);
routerB = address(0x458134fDB03ee63035b48BD07Ae39b799C1991CB);
BUSD = address(0x62fA3d49518010d43FAf3101909730645Da488F1);
BNB = address(0x7f014543C001a0F616c466ba6C3f2641D11a731c);
}
function execArtbitrage(uint bnbAmount,uint busdAmount) public {
uint bnbPriceAtA = checkPriceAtRouterA(bnbAmount);
uint bnbPriceAtB = checkPriceAtRouterB(bnbAmount);
if(bnbPriceAtB > bnbPriceAtA) { // BNB B 600 > BNB A 500
uint bnbAmountRecieved = swapAtRouterA(busdAmount);
uint busdAmountRecieved = swapAtRouterB(bnbAmountRecieved);
uint profit = busdAmountRecieved - busdAmount;
IERC20(BUSD).transfer(msg.sender,profit);
}
}
function withdrawBUSD() public {
IERC20 theBUSD = IERC20(BUSD);
theBUSD.transfer(msg.sender,theBUSD.balanceOf(address(this)));
}
function checkPriceAtRouterA(uint bnbAmount) public view returns(uint) {
uint[] memory amounts = IMyRouterInterface(routerA).getAmountsOut(bnbAmount,path);
return amounts[1];
}
function checkPriceAtRouterB(uint bnbAmount) public view returns(uint) {
uint[] memory amounts = IMyRouterInterface(routerB).getAmountsOut(bnbAmount,path);
return amounts[1];
}
function swapAtRouterA(uint busdAmount) public returns (uint) { // BUSD -> BNB
path = [BUSD,BNB];
IERC20(BUSD).approve(address(this),busdAmount);
uint[] memory amountsOut = IMyRouterInterface(routerA).getAmountsOut(busdAmount,path);
uint[] memory amountsBNB = IMyRouterInterface(routerA).swapExactTokensForTokens(busdAmount,amountsOut[1],path,address(this),block.timestamp);
return amountsBNB[1];
}
function swapAtRouterB(uint bnbAmount) public returns (uint) { // BNB -> BUSD
path = [BNB,BUSD];
IERC20(BNB).approve(address(this),bnbAmount);
uint[] memory amountsOut = IMyRouterInterface(routerB).getAmountsOut(bnbAmount,path);
uint[] memory amountsBUSD = IMyRouterInterface(routerB).swapExactTokensForTokens(bnbAmount,amountsOut[1],path,address(this),block.timestamp);
return amountsBUSD[1];
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment