Mc/keeper (#714)

* v0.19.28

* ts: tokenWithdrawAllDepositForMint

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* Fix

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* Fix

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* rust: dont include tokens with errors in crank

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* Fixes from review

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

* review fixes

* Fixes from review

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>

---------

Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
Co-authored-by: Christian Kamm <mail@ckamm.de>
This commit is contained in:
microwavedcola1 2023-09-11 13:37:11 +02:00 committed by GitHub
parent b2c187dd92
commit 885427e777
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 70 additions and 1 deletions

View File

@ -217,7 +217,22 @@ pub async fn loop_update_index_and_rate(
is_writable: true, is_writable: true,
}) })
.collect::<Vec<_>>(); .collect::<Vec<_>>();
ix.accounts.append(&mut banks); ix.accounts.append(&mut banks);
let sim_result = match client.simulate(vec![ix.clone()]).await {
Ok(response) => response.value,
Err(e) => {
error!(token.name, "simulation request error: {e:?}");
continue;
}
};
if let Some(e) = sim_result.err {
error!(token.name, "simulation error: {e:?} {:?}", sim_result.logs);
continue;
}
instructions.push(ix); instructions.push(ix);
} }
let pre = Instant::now(); let pre = Instant::now();

View File

@ -26,6 +26,7 @@ use mango_v4::state::{
use solana_address_lookup_table_program::state::AddressLookupTable; use solana_address_lookup_table_program::state::AddressLookupTable;
use solana_client::nonblocking::rpc_client::RpcClient as RpcClientAsync; use solana_client::nonblocking::rpc_client::RpcClient as RpcClientAsync;
use solana_client::rpc_config::RpcSendTransactionConfig; use solana_client::rpc_config::RpcSendTransactionConfig;
use solana_client::rpc_response::RpcSimulateTransactionResult;
use solana_sdk::address_lookup_table_account::AddressLookupTableAccount; use solana_sdk::address_lookup_table_account::AddressLookupTableAccount;
use solana_sdk::commitment_config::CommitmentLevel; use solana_sdk::commitment_config::CommitmentLevel;
use solana_sdk::hash::Hash; use solana_sdk::hash::Hash;
@ -1757,6 +1758,21 @@ impl MangoClient {
.send_and_confirm(&self.client) .send_and_confirm(&self.client)
.await .await
} }
pub async fn simulate(
&self,
instructions: Vec<Instruction>,
) -> anyhow::Result<SimulateTransactionResponse> {
TransactionBuilder {
instructions,
address_lookup_tables: vec![],
payer: self.client.fee_payer.pubkey(),
signers: vec![self.client.fee_payer.clone()],
config: self.client.transaction_builder_config,
}
.simulate(&self.client)
.await
}
} }
#[derive(Debug, thiserror::Error)] #[derive(Debug, thiserror::Error)]
@ -1784,6 +1800,9 @@ pub struct TransactionBuilder {
pub config: TransactionBuilderConfig, pub config: TransactionBuilderConfig,
} }
pub type SimulateTransactionResponse =
solana_client::rpc_response::Response<RpcSimulateTransactionResult>;
impl TransactionBuilder { impl TransactionBuilder {
pub async fn transaction( pub async fn transaction(
&self, &self,
@ -1834,6 +1853,12 @@ impl TransactionBuilder {
.map_err(prettify_solana_client_error) .map_err(prettify_solana_client_error)
} }
pub async fn simulate(&self, client: &Client) -> anyhow::Result<SimulateTransactionResponse> {
let rpc = client.rpc_async();
let tx = self.transaction(&rpc).await?;
Ok(rpc.simulate_transaction(&tx).await?)
}
pub async fn send_and_confirm(&self, client: &Client) -> anyhow::Result<Signature> { pub async fn send_and_confirm(&self, client: &Client) -> anyhow::Result<Signature> {
let rpc = client.rpc_async(); let rpc = client.rpc_async();
let tx = self.transaction(&rpc).await?; let tx = self.transaction(&rpc).await?;

View File

@ -1,6 +1,6 @@
{ {
"name": "@blockworks-foundation/mango-v4", "name": "@blockworks-foundation/mango-v4",
"version": "0.19.27", "version": "0.19.28",
"description": "Typescript Client for mango-v4 program.", "description": "Typescript Client for mango-v4 program.",
"repository": "https://github.com/blockworks-foundation/mango-v4", "repository": "https://github.com/blockworks-foundation/mango-v4",
"author": { "author": {

View File

@ -1409,6 +1409,35 @@ export class MangoClient {
]); ]);
} }
/**
* Withdraw the entire deposit balance for a token, effectively freeing the token position
*
* @param group
* @param mangoAccount
* @param mintPk
* @returns
*/
public async tokenWithdrawAllDepositForMint(
group: Group,
mangoAccount: MangoAccount,
mintPk: PublicKey,
): Promise<MangoSignatureStatus> {
const bank = group.getFirstBankByMint(mintPk);
const b = mangoAccount.getTokenBalance(bank).toNumber();
if (b < 0) {
throw new Error(`Only call this method for deposits and not borrows!`);
}
const ixes = await this.tokenWithdrawNativeIx(
group,
mangoAccount,
mintPk,
U64_MAX_BN,
false,
);
return await this.sendAndConfirmTransactionForGroup(group, ixes);
}
public async tokenWithdraw( public async tokenWithdraw(
group: Group, group: Group,
mangoAccount: MangoAccount, mangoAccount: MangoAccount,