remove liquidity example (#1290)
* remove liquidity example * remove liquidity exmaple * remove liquidity exmaple * remove liquidity exmaple * chore: tidy up remove-liquidity example * chore: fix typo Co-authored-by: ankit <ankitgci1@gamil.com> Co-authored-by: Georgios Konstantopoulos <me@gakonst.com>
This commit is contained in:
parent
f237f85959
commit
0897336fb4
|
@ -0,0 +1,88 @@
|
|||
use ethers::prelude::*;
|
||||
use eyre::Result;
|
||||
use std::{convert::TryFrom, sync::Arc};
|
||||
|
||||
abigen!(
|
||||
UniswapV2Router,
|
||||
r#"[
|
||||
removeLiquidity(address tokenA,address tokenB, uint liquidity,uint amountAMin, uint amountBMin, address to, uint ) external returns (uint amountA, uint amountB)
|
||||
]"#,
|
||||
);
|
||||
|
||||
abigen!(
|
||||
UniswapV2Pair,
|
||||
r#"[
|
||||
approve(address,uint256)(bool)
|
||||
getReserves()(uint112,uint112,uint32)
|
||||
token0()(address)
|
||||
token1()(address)
|
||||
]"#
|
||||
);
|
||||
|
||||
// Remove liquidity from uniswap V2.
|
||||
// This example will remove 500 liquidity of 2 test tokens, TA and TB on Rinkeby testnet.
|
||||
// This example uses pair contract and uniswap swap contract to remove liquidity.
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<()> {
|
||||
let provider = Arc::new({
|
||||
// connect to the network
|
||||
let provider = Provider::<Http>::try_from(
|
||||
"https://rinkeby.infura.io/v3/a111fcada47746d990e0e2b7df50d00a",
|
||||
)?;
|
||||
let chain_id = provider.get_chainid().await?;
|
||||
|
||||
// this wallet's private key
|
||||
let wallet = "725fd1619b2653b7ff1806bf29ae11d0568606d83777afd5b1f2e649bd5132a9"
|
||||
.parse::<LocalWallet>()?
|
||||
.with_chain_id(chain_id.as_u64());
|
||||
|
||||
SignerMiddleware::new(provider, wallet)
|
||||
});
|
||||
|
||||
let pair = "0xA6108E4d436bE592bAc12F9A0aB7D9A10d821176".parse::<Address>()?;
|
||||
let pair = UniswapV2Pair::new(pair, provider.clone());
|
||||
|
||||
let router = "0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D".parse::<Address>()?;
|
||||
let router = UniswapV2Router::new(router, provider.clone());
|
||||
|
||||
let (reserve0, reserve1, _) = pair.get_reserves().call().await?;
|
||||
|
||||
println!("Reserves (token A, Token B): ({}, {})", reserve0, reserve1);
|
||||
|
||||
let price =
|
||||
if reserve0 > reserve1 { 1000 * reserve0 / reserve1 } else { 1000 * reserve1 / reserve0 }
|
||||
/ 1000;
|
||||
println!("token0 / token1 price = {}", price);
|
||||
|
||||
let liquidity = 100.into();
|
||||
|
||||
println!("Approving the transaction!");
|
||||
let receipt =
|
||||
pair.approve(router.address(), liquidity).send().await?.await?.expect("no receipt found");
|
||||
println!("contract approved succesfully!");
|
||||
println!("{:?}", receipt);
|
||||
|
||||
println!("Removing {} liquidity!", liquidity);
|
||||
|
||||
let token0 = pair.token_0().call().await?;
|
||||
let token1 = pair.token_1().call().await?;
|
||||
|
||||
let receipt = router
|
||||
.remove_liquidity(
|
||||
token0,
|
||||
token1,
|
||||
liquidity,
|
||||
0.into(),
|
||||
0.into(),
|
||||
provider.address(),
|
||||
U256::MAX,
|
||||
)
|
||||
.send()
|
||||
.await?
|
||||
.await?
|
||||
.expect("no receipt for remove_liquidity");
|
||||
println!("liquidity removed succesfully!");
|
||||
println!("{:?}", receipt);
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue