send two transactions when settling all in ui

This commit is contained in:
Tyler Shipe 2021-08-05 11:58:31 -04:00
parent 8695a7f397
commit 43ca4871f8
1 changed files with 33 additions and 9 deletions

View File

@ -35,7 +35,11 @@ import {
makeSettleFundsInstruction, makeSettleFundsInstruction,
makeWithdrawInstruction, makeWithdrawInstruction,
} from '@blockworks-foundation/mango-client/lib/instruction' } from '@blockworks-foundation/mango-client/lib/instruction'
import { sendTransaction } from './send' import {
sendSignedTransaction,
sendTransaction,
signTransactions,
} from './send'
import { TOKEN_PROGRAM_ID } from './tokens' import { TOKEN_PROGRAM_ID } from './tokens'
import BN from 'bn.js' import BN from 'bn.js'
import { import {
@ -1304,8 +1308,9 @@ export async function settleAll(
marginAccount: MarginAccount, marginAccount: MarginAccount,
markets: Market[], markets: Market[],
wallet: Wallet wallet: Wallet
): Promise<TransactionSignature> { ): Promise<Array<string>> {
const transaction = new Transaction() const settleBorrowTransaction = new Transaction()
const settleFundsTransaction = new Transaction()
const assetGains: number[] = new Array(NUM_TOKENS).fill(0) const assetGains: number[] = new Array(NUM_TOKENS).fill(0)
@ -1376,7 +1381,7 @@ export async function settleAll(
programId, programId,
}) })
transaction.add(settleFundsInstruction) settleFundsTransaction.add(settleFundsInstruction)
} }
const deposits = marginAccount.getDeposits(mangoGroup) const deposits = marginAccount.getDeposits(mangoGroup)
@ -1384,7 +1389,6 @@ export async function settleAll(
for (let i = 0; i < NUM_TOKENS; i++) { for (let i = 0; i < NUM_TOKENS; i++) {
// TODO test this. maybe it hits transaction size limit // TODO test this. maybe it hits transaction size limit
const deposit = deposits[i] + assetGains[i] const deposit = deposits[i] + assetGains[i]
if (deposit === 0 || liabs[i] === 0) { if (deposit === 0 || liabs[i] === 0) {
continue continue
@ -1407,14 +1411,34 @@ export async function settleAll(
data, data,
programId, programId,
}) })
transaction.add(settleBorrowsInstruction) settleBorrowTransaction.add(settleBorrowsInstruction)
} }
if (transaction.instructions.length === 0) { const transactionsAndSigners = []
throw new Error('No unsettled funds') if (settleBorrowTransaction.instructions.length > 0) {
transactionsAndSigners.push({
transaction: settleBorrowTransaction,
signers: [],
})
}
if (settleFundsTransaction.instructions.length > 0) {
transactionsAndSigners.push({
transaction: settleFundsTransaction,
signers: [],
})
} }
return await packageAndSend(transaction, connection, wallet, [], 'Settle All') const signedTransactions = await signTransactions({
transactionsAndSigners,
wallet,
connection,
})
return await Promise.all(
signedTransactions.map((signedTransaction) => {
return sendSignedTransaction({ signedTransaction, connection })
})
)
} }
async function packageAndSend( async function packageAndSend(