mango-v4/ts/client/src/utils/rpc.ts

78 lines
1.9 KiB
TypeScript
Raw Normal View History

import { AnchorProvider } from '@project-serum/anchor';
import { Transaction } from '@solana/web3.js';
export async function sendTransaction(
provider: AnchorProvider,
transaction: Transaction,
opts: any = {},
) {
const connection = provider.connection;
const payer = provider.wallet;
const latestBlockhash = await connection.getLatestBlockhash(
opts.preflightCommitment,
);
transaction.recentBlockhash = latestBlockhash.blockhash;
transaction.lastValidBlockHeight = latestBlockhash.lastValidBlockHeight;
transaction.feePayer = payer.publicKey;
if (opts.additionalSigners?.length > 0) {
transaction.partialSign(...opts.additionalSigners);
}
await payer.signTransaction(transaction);
const rawTransaction = transaction.serialize();
const signature = await connection.sendRawTransaction(rawTransaction, {
skipPreflight: true,
});
if (opts.postSendTxCallback) {
try {
opts.postSendTxCallback({ txid: signature });
} catch (e) {
console.warn(`postSendTxCallback error ${e}`);
}
}
2022-08-26 12:42:10 -07:00
let status: any;
if (
transaction.recentBlockhash != null &&
transaction.lastValidBlockHeight != null
2022-08-26 12:42:10 -07:00
) {
console.log('confirming via blockhash');
status = (
await connection.confirmTransaction(
{
signature: signature,
blockhash: transaction.recentBlockhash,
lastValidBlockHeight: transaction.lastValidBlockHeight,
},
'processed',
)
).value;
} else {
console.log('confirming via timeout');
status = (await connection.confirmTransaction(signature, 'processed'))
.value;
}
if (status.err) {
throw new MangoError({
txid: signature,
message: `Transaction ${signature} failed (${JSON.stringify(status)})`,
});
}
return signature;
}
class MangoError extends Error {
message: string;
txid: string;
constructor({ txid, message }) {
super();
this.message = message;
this.txid = txid;
}
}