improvements to flash loan
Signed-off-by: microwavedcola1 <microwavedcola@gmail.com>
This commit is contained in:
parent
719b944f89
commit
7a28a3bfb0
|
@ -36,6 +36,7 @@ pub struct FlashLoan<'info> {
|
||||||
pub token_program: Program<'info, Token>,
|
pub token_program: Program<'info, Token>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
struct AllowedVault {
|
struct AllowedVault {
|
||||||
/// index of the vault in cpi_ais
|
/// index of the vault in cpi_ais
|
||||||
vault_cpi_ai_index: usize,
|
vault_cpi_ai_index: usize,
|
||||||
|
@ -51,7 +52,7 @@ struct AllowedVault {
|
||||||
loan_amount: I80F48,
|
loan_amount: I80F48,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(AnchorDeserialize, AnchorSerialize, Clone, Copy)]
|
#[derive(AnchorDeserialize, AnchorSerialize, Clone, Copy, Debug)]
|
||||||
pub struct FlashLoanWithdraw {
|
pub struct FlashLoanWithdraw {
|
||||||
/// Account index of the vault to withdraw from in the target_accounts section.
|
/// Account index of the vault to withdraw from in the target_accounts section.
|
||||||
/// Index is counted after health accounts.
|
/// Index is counted after health accounts.
|
||||||
|
@ -60,7 +61,7 @@ pub struct FlashLoanWithdraw {
|
||||||
pub amount: u64,
|
pub amount: u64,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(AnchorDeserialize, AnchorSerialize)]
|
#[derive(AnchorDeserialize, AnchorSerialize, Debug)]
|
||||||
pub struct CpiData {
|
pub struct CpiData {
|
||||||
pub account_start: u8,
|
pub account_start: u8,
|
||||||
pub data: Vec<u8>,
|
pub data: Vec<u8>,
|
||||||
|
@ -232,6 +233,11 @@ pub fn flash_loan<'key, 'accounts, 'remaining, 'info>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
msg!("withdraws {:#?}", withdraws);
|
||||||
|
msg!("cpi_datas {:#?}", cpi_datas);
|
||||||
|
msg!("allowed_vaults {:#?}", allowed_vaults);
|
||||||
|
msg!("used_vaults {:#?}", used_vaults);
|
||||||
|
|
||||||
// get rid of Ref<> to avoid limiting the cpi call
|
// get rid of Ref<> to avoid limiting the cpi call
|
||||||
drop(allowed_banks);
|
drop(allowed_banks);
|
||||||
drop(group);
|
drop(group);
|
||||||
|
|
|
@ -22,13 +22,13 @@ if [[ -z "${NO_DEPLOY}" ]]; then
|
||||||
solana --url https://mango.devnet.rpcpool.com program deploy --program-id $PROGRAM_ID \
|
solana --url https://mango.devnet.rpcpool.com program deploy --program-id $PROGRAM_ID \
|
||||||
-k $WALLET_WITH_FUNDS target/deploy/mango_v4.so
|
-k $WALLET_WITH_FUNDS target/deploy/mango_v4.so
|
||||||
|
|
||||||
# publish idl
|
# # publish idl
|
||||||
anchor idl upgrade --provider.cluster https://mango.devnet.rpcpool.com --provider.wallet $WALLET_WITH_FUNDS \
|
# anchor idl upgrade --provider.cluster https://mango.devnet.rpcpool.com --provider.wallet $WALLET_WITH_FUNDS \
|
||||||
--filepath target/idl/mango_v4.json $PROGRAM_ID
|
# --filepath target/idl/mango_v4.json $PROGRAM_ID
|
||||||
else
|
else
|
||||||
echo "Skipping deployment..."
|
echo "Skipping deployment..."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
# build npm package
|
# # build npm package
|
||||||
(cd ./ts/client && tsc)
|
# (cd ./ts/client && tsc)
|
||||||
|
|
|
@ -1212,11 +1212,17 @@ export class MangoClient {
|
||||||
])
|
])
|
||||||
.flat();
|
.flat();
|
||||||
|
|
||||||
const keys = instructions.map((ix) => ix.keys).flat();
|
const vaultIndex = targetRemainingAccounts
|
||||||
const vaultIndex = keys.findIndex((k) => k.pubkey.equals(inputBank.vault));
|
.reverse()
|
||||||
|
.findIndex((k) => k.pubkey.equals(inputBank.vault));
|
||||||
|
|
||||||
|
targetRemainingAccounts.reverse();
|
||||||
|
|
||||||
const withdraws: FlashLoanWithdraw[] = [
|
const withdraws: FlashLoanWithdraw[] = [
|
||||||
{ index: vaultIndex, amount: toU64(amountIn, inputBank.mintDecimals) },
|
{
|
||||||
|
index: targetRemainingAccounts.length - vaultIndex - 1,
|
||||||
|
amount: toU64(amountIn, inputBank.mintDecimals),
|
||||||
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
let cpiDatas = [];
|
let cpiDatas = [];
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
import { AnchorProvider, Wallet } from '@project-serum/anchor';
|
||||||
|
import { Connection, Keypair } from '@solana/web3.js';
|
||||||
|
import fs from 'fs';
|
||||||
|
import { MangoClient } from '../client';
|
||||||
|
import { MANGO_V4_ID } from '../constants';
|
||||||
|
|
||||||
|
async function main() {
|
||||||
|
const options = AnchorProvider.defaultOptions();
|
||||||
|
const connection = new Connection(
|
||||||
|
'https://mango.devnet.rpcpool.com',
|
||||||
|
options,
|
||||||
|
);
|
||||||
|
|
||||||
|
const user = Keypair.fromSecretKey(
|
||||||
|
Buffer.from(
|
||||||
|
JSON.parse(fs.readFileSync(process.env.USER_KEYPAIR!, 'utf-8')),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
const userWallet = new Wallet(user);
|
||||||
|
const userProvider = new AnchorProvider(connection, userWallet, options);
|
||||||
|
const client = await MangoClient.connect(
|
||||||
|
userProvider,
|
||||||
|
'devnet',
|
||||||
|
MANGO_V4_ID['devnet'],
|
||||||
|
);
|
||||||
|
console.log(`User ${userWallet.publicKey.toBase58()}`);
|
||||||
|
|
||||||
|
// fetch group
|
||||||
|
const admin = Keypair.fromSecretKey(
|
||||||
|
Buffer.from(
|
||||||
|
JSON.parse(fs.readFileSync(process.env.ADMIN_KEYPAIR!, 'utf-8')),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
const group = await client.getGroupForAdmin(admin.publicKey, 0);
|
||||||
|
console.log(`Found group ${group.publicKey.toBase58()}`);
|
||||||
|
|
||||||
|
// create + fetch account
|
||||||
|
console.log(`Creating mangoaccount...`);
|
||||||
|
const mangoAccount = await client.getOrCreateMangoAccount(
|
||||||
|
group,
|
||||||
|
user.publicKey,
|
||||||
|
0,
|
||||||
|
'my_mango_account',
|
||||||
|
);
|
||||||
|
console.log(`...created/found mangoAccount ${mangoAccount.publicKey}`);
|
||||||
|
console.log(mangoAccount.toString());
|
||||||
|
|
||||||
|
if (false) {
|
||||||
|
// deposit and withdraw
|
||||||
|
console.log(`Depositing...50 USDC`);
|
||||||
|
await client.tokenDeposit(group, mangoAccount, 'USDC', 50);
|
||||||
|
await mangoAccount.reload(client);
|
||||||
|
|
||||||
|
console.log(`Depositing...0.0005 BTC`);
|
||||||
|
await client.tokenDeposit(group, mangoAccount, 'BTC', 0.0005);
|
||||||
|
await mangoAccount.reload(client);
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const sig = await client.marginTrade({
|
||||||
|
group: group,
|
||||||
|
mangoAccount: mangoAccount,
|
||||||
|
inputToken: 'USDC',
|
||||||
|
amountIn: 0.001,
|
||||||
|
outputToken: 'SOL',
|
||||||
|
minimumAmountOut: 0.1,
|
||||||
|
});
|
||||||
|
console.log(
|
||||||
|
`sig https://explorer.solana.com/address/${sig}?cluster=devnet`,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
console.log(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
|
||||||
|
main();
|
Loading…
Reference in New Issue