Skip to content

Commit

Permalink
feat - add withdraw command
Browse files Browse the repository at this point in the history
  • Loading branch information
Dvisacker committed Oct 14, 2024
1 parent f1fa070 commit 92732c3
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 61 deletions.
8 changes: 7 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,6 @@ repay-arbitrum:
@echo "Repaying on Arbitrum..."
@cd $(CONTRACTS_DIR) && forge script script/Repay.s.sol:Repay --rpc-url $(ARBITRUM_RPC_URL) --private-key $(PRIVATE_KEY) --broadcast -vv


get-position-local-fork:
@echo "Getting position on Local..."
@cd $(CONTRACTS_DIR) && forge script script/GetPosition.s.sol:GetPosition --rpc-url http://localhost:8545 --private-key $(PRIVATE_KEY) --broadcast -vv
Expand All @@ -141,6 +140,13 @@ leverage-arbitrum:
@echo "Leveraging on Arbitrum..."
$(CARGO) run leverage --amount 1 --supply-asset USDC --borrow-asset WETH --leverage 2

deleverage-arbitrum:
@echo "Deleveraging on Arbitrum..."
$(CARGO) run deleverage --supply-asset USDC --borrow-asset WETH

withdraw-assets-arbitrum:
@echo "Withdrawing assets from Arbitrum..."
$(CARGO) run withdraw --asset WETH


# Combined commands
Expand Down
40 changes: 21 additions & 19 deletions src/bot.rs
Original file line number Diff line number Diff line change
Expand Up @@ -233,25 +233,6 @@ impl AaveBot {
Ok(())
}

pub async fn enter_position(&self) -> Result<(), Box<dyn Error>> {
// Approve AAVE to spend our tokens
self.approve_tokens(
self.asset_address,
*self.lending_pool.address(),
self.max_amount,
)
.await?;

// Supply assets to AAVE
self.supply_tokens(self.asset_address, self.max_amount)
.await?;

self.borrow_tokens(self.asset_address, self.max_amount / U256::from(2))
.await?;

Ok(())
}

async fn send_telegram_message(&self, message: String) -> Result<(), Box<dyn Error>> {
// self.telegram_bot
// .send_message(ChatId(self.chat_id), message)
Expand Down Expand Up @@ -283,4 +264,25 @@ impl AaveBot {

Ok(())
}

pub async fn deleverage(
&self,
supply_asset: Address,
borrow_asset: Address,
) -> Result<(), Box<dyn Error>> {
let tx =
self.looper
.exitPosition(supply_asset, borrow_asset, U256::from(10), U24::from(500));

let receipt = tx.send().await?.get_receipt().await?;
println!("Exit position: {:?}", receipt);
Ok(())
}

pub async fn withdraw(&self, asset_address: Address) -> Result<(), Box<dyn Error>> {
let tx = self.looper._withdrawToOwner(asset_address);
let receipt = tx.send().await?.get_receipt().await?;
println!("Withdrawn from AaveLooper: {:?}", receipt);
Ok(())
}
}
108 changes: 67 additions & 41 deletions src/cli.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,6 @@ struct Cli {

#[derive(Subcommand)]
enum Commands {
EnterPosition {
#[arg(short, long)]
amount: u64,
#[arg(short, long, default_value_t = 1)]
leverage: u8,
#[arg(short, long, default_value = "USDC")]
token: String,
},
RunBot {
#[arg(short, long)]
amount: u64,
Expand Down Expand Up @@ -61,6 +53,16 @@ enum Commands {
#[arg(short, long, default_value_t = 2)]
leverage: u8,
},
Deleverage {
#[arg(short, long)]
supply_asset: String,
#[arg(short, long)]
borrow_asset: String,
},
Withdraw {
#[arg(short, long)]
asset: String,
},
}

pub async fn run_cli(provider: Arc<SignerProvider>) -> Result<(), Box<dyn Error>> {
Expand All @@ -70,38 +72,6 @@ pub async fn run_cli(provider: Arc<SignerProvider>) -> Result<(), Box<dyn Error>
let looper_address: Address = "0x5119C3d14c892D710311bE3f102619df669BD62C".parse()?;

match &cli.command {
Commands::EnterPosition {
amount,
leverage,
token,
} => {
let aave_address = get_aave_lending_pool_address(chain).ok_or_else(|| {
Box::<dyn Error>::from("Aave lending pool address not found for this chain")
})?;
let asset_address = get_token_address(chain, &token).ok_or_else(|| {
Box::<dyn Error>::from(format!("{} address not found for this chain", token))
})?;

let amount_wei = U256::from(*amount) * U256::from(10).pow(U256::from(6)); // Convert to USDC wei
let threshold = U256::from(0); // Set threshold to 0 for immediate execution

let looper = AaveBot::new(
provider,
aave_address,
looper_address,
asset_address,
amount_wei,
*leverage,
threshold,
String::new(), // Empty string for Telegram token (not used in this context)
0, // 0 for chat_id (not used in this context)
)
.await?;

println!("Entering position on Aave...");
looper.enter_position().await?;
println!("Position entered successfully!");
}
Commands::RunBot {
amount,
leverage,
Expand Down Expand Up @@ -242,7 +212,7 @@ pub async fn run_cli(provider: Arc<SignerProvider>) -> Result<(), Box<dyn Error>
borrow_asset
))
})?;
let amount_wei = U256::from(*amount) * U256::from(10).pow(U256::from(6)); // Assuming 6 decimals, adjust if needed
let amount_wei = U256::from(*amount) * U256::from(10).pow(U256::from(4)); // Assuming 6 decimals, adjust if needed

let bot = AaveBot::new(
provider.clone(),
Expand All @@ -265,6 +235,62 @@ pub async fn run_cli(provider: Arc<SignerProvider>) -> Result<(), Box<dyn Error>
.await?;
println!("Leverage increased successfully!");
}
Commands::Deleverage {
supply_asset,
borrow_asset,
} => {
let aave_address = get_aave_lending_pool_address(chain).ok_or_else(|| {
Box::<dyn Error>::from("Aave lending pool address not found for this chain")
})?;
let supply_asset_address = get_token_address(chain, supply_asset).ok_or_else(|| {
Box::<dyn Error>::from(format!("{} address not found for this chain", supply_asset))
})?;
let borrow_asset_address = get_token_address(chain, borrow_asset).ok_or_else(|| {
Box::<dyn Error>::from(format!("{} address not found for this chain", borrow_asset))
})?;

let bot = AaveBot::new(
provider.clone(),
aave_address,
looper_address,
supply_asset_address,
U256::ZERO, // Not used for deleverage
1, // Not used for deleverage
U256::ZERO, // Not used for deleverage
String::new(),
0,
)
.await?;

println!("Deleveraging position...");
bot.deleverage(supply_asset_address, borrow_asset_address)
.await?;
}
Commands::Withdraw { asset } => {
let aave_address = get_aave_lending_pool_address(chain).ok_or_else(|| {
Box::<dyn Error>::from("Aave lending pool address not found for this chain")
})?;
let asset_address = get_token_address(chain, asset).ok_or_else(|| {
Box::<dyn Error>::from(format!("{} address not found for this chain", asset))
})?;

let bot = AaveBot::new(
provider.clone(),
aave_address,
looper_address,
asset_address,
U256::ZERO, // Not used for withdraw
1, // Not used for withdraw
U256::ZERO, // Not used for withdraw
String::new(),
0,
)
.await?;

println!("Withdrawing {} from AaveLooper...", asset);
bot.withdraw(asset_address).await?;
println!("Withdrawal successful!");
}
}

Ok(())
Expand Down

0 comments on commit 92732c3

Please sign in to comment.