From ec10681c75c816c38d57a44249d341c6ee183831 Mon Sep 17 00:00:00 2001 From: dd Date: Tue, 20 Apr 2021 10:56:07 -0400 Subject: [PATCH] Added different confirm levels for transactions in the client; Removed useless log statements --- src/client.ts | 9 ++-- src/index.ts | 141 ++++++++++++++++++++++++++------------------------ src/utils.ts | 16 ++++-- 3 files changed, 90 insertions(+), 76 deletions(-) diff --git a/src/client.ts b/src/client.ts index 69fc597..ddf9379 100644 --- a/src/client.ts +++ b/src/client.ts @@ -6,7 +6,7 @@ import { SimulatedTransactionResponse, SYSVAR_CLOCK_PUBKEY, SYSVAR_RENT_PUBKEY, - Transaction, + Transaction, TransactionConfirmationStatus, TransactionInstruction, TransactionSignature, } from '@solana/web3.js'; @@ -388,6 +388,10 @@ export class MangoSrmAccount { } export class MangoClient { + confirmLevel: TransactionConfirmationStatus; + constructor(confirmLevel: TransactionConfirmationStatus = 'processed') { + this.confirmLevel = confirmLevel + } async sendTransaction( connection: Connection, @@ -403,7 +407,6 @@ export class MangoClient { const signers = [payer].concat(additionalSigners) transaction.sign(...signers) const rawTransaction = transaction.serialize() - console.log('Transaction size:', rawTransaction.length) const startTime = getUnixTs(); const txid: TransactionSignature = await connection.sendRawTransaction( @@ -425,7 +428,7 @@ export class MangoClient { })(); try { - await awaitTransactionSignatureConfirmation(txid, timeout, connection); + await awaitTransactionSignatureConfirmation(txid, timeout, connection, this.confirmLevel); } catch (err) { if (err.timeout) { throw new Error('Timed out awaiting confirmation on transaction'); diff --git a/src/index.ts b/src/index.ts index f8e2387..75cc7d0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -16,72 +16,75 @@ import { nativeToUi, sleep, uiToNative } from './utils'; import { NUM_MARKETS, NUM_TOKENS } from './layout'; -// async function tests() { -// const cluster = "mainnet-beta"; -// const client = new MangoClient(); -// const clusterIds = IDS[cluster] -// -// const connection = new Connection(IDS.cluster_urls[cluster], 'singleGossip') -// const mangoGroupPk = new PublicKey(clusterIds.mango_groups['BTC_ETH_USDT'].mango_group_pk); -// const mangoProgramId = new PublicKey(clusterIds.mango_program_id); -// -// const keyPairPath = process.env.KEYPAIR || homedir() + '/.config/solana/id.json' -// const payer = new Account(JSON.parse(fs.readFileSync(keyPairPath, 'utf-8'))) -// -// -// async function testSolink() { -// -// const oraclePk = new PublicKey(IDS[cluster].oracles['ETH/USDT']) -// const agg = await Aggregator.loadWithConnection(oraclePk, connection) -// -// // const agg = await Aggregator.loadWithConnection(oraclePk, connection) -// console.log(agg.answer.median.toNumber(), agg.answer.updatedAt.toNumber(), agg.round.id.toNumber()) -// -// } -// -// async function testDepositSrm() { -// const srmVaultPk = new PublicKey(clusterIds['mango_groups']['BTC_ETH_USDT']['srm_vault_pk']) -// const mangoGroup = await client.getMangoGroup(connection, mangoGroupPk, srmVaultPk) -// const srmAccountPk = new PublicKey("6utvndL8EEjpwK5QVtguErncQEPVbkuyABmXu6FeygeV") -// const mangoSrmAccountPk = await client.depositSrm(connection, mangoProgramId, mangoGroup, payer, srmAccountPk, 100) -// console.log(mangoSrmAccountPk.toBase58()) -// await sleep(2000) -// const mangoSrmAccount = await client.getMangoSrmAccount(connection, mangoSrmAccountPk) -// const txid = await client.withdrawSrm(connection, mangoProgramId, mangoGroup, mangoSrmAccount, payer, srmAccountPk, 50) -// console.log('success', txid) -// } -// -// async function getMarginAccountDetails() { -// const mangoGroup = await client.getMangoGroup(connection, mangoGroupPk); -// const marginAccountPk = new PublicKey("BSFaizvArm1dpVGwJvrsqbWTpT8nh3xD7ERrdHuaY1C1") -// const marginAccount = await client.getMarginAccount(connection, marginAccountPk, mangoGroup.dexProgramId) -// const prices = await mangoGroup.getPrices(connection) -// -// console.log(marginAccount.toPrettyString(mangoGroup, prices)) -// -// for (let i = 0; i < NUM_MARKETS; i++) { -// let openOrdersAccount = marginAccount.openOrdersAccounts[i] -// if (openOrdersAccount === undefined) { -// continue -// } -// -// for (const oid of openOrdersAccount.orders) { -// console.log(oid.toString()) -// } -// console.log(i, -// nativeToUi(openOrdersAccount.quoteTokenTotal.toNumber(), mangoGroup.mintDecimals[NUM_MARKETS]), -// nativeToUi(openOrdersAccount.quoteTokenFree.toNumber(), mangoGroup.mintDecimals[NUM_MARKETS]), -// -// nativeToUi(openOrdersAccount.baseTokenTotal.toNumber(), mangoGroup.mintDecimals[i]), -// nativeToUi(openOrdersAccount.baseTokenFree.toNumber(), mangoGroup.mintDecimals[i]) -// -// ) -// } -// -// } -// await getMarginAccountDetails() -// // await testSolink() -// // testDepositSrm() -// } -// -// tests() \ No newline at end of file +async function tests() { + const cluster = "mainnet-beta"; + const client = new MangoClient(); + const clusterIds = IDS[cluster] + + const connection = new Connection(IDS.cluster_urls[cluster], 'singleGossip') + const mangoGroupPk = new PublicKey(clusterIds.mango_groups['BTC_ETH_USDT'].mango_group_pk); + const mangoProgramId = new PublicKey(clusterIds.mango_program_id); + + const keyPairPath = process.env.KEYPAIR || homedir() + '/.config/solana/id.json' + const payer = new Account(JSON.parse(fs.readFileSync(keyPairPath, 'utf-8'))) + + async function testSolink() { + + const oraclePk = new PublicKey(IDS[cluster].oracles['ETH/USDT']) + const agg = await Aggregator.loadWithConnection(oraclePk, connection) + + // const agg = await Aggregator.loadWithConnection(oraclePk, connection) + console.log(agg.answer.median.toNumber(), agg.answer.updatedAt.toNumber(), agg.round.id.toNumber()) + + } + + async function testDepositSrm() { + const srmVaultPk = new PublicKey(clusterIds['mango_groups']['BTC_ETH_USDT']['srm_vault_pk']) + const mangoGroup = await client.getMangoGroup(connection, mangoGroupPk, srmVaultPk) + const srmAccountPk = new PublicKey("6utvndL8EEjpwK5QVtguErncQEPVbkuyABmXu6FeygeV") + const mangoSrmAccountPk = await client.depositSrm(connection, mangoProgramId, mangoGroup, payer, srmAccountPk, 100) + console.log(mangoSrmAccountPk.toBase58()) + await sleep(2000) + const mangoSrmAccount = await client.getMangoSrmAccount(connection, mangoSrmAccountPk) + const txid = await client.withdrawSrm(connection, mangoProgramId, mangoGroup, mangoSrmAccount, payer, srmAccountPk, 50) + console.log('success', txid) + } + + async function getMarginAccountDetails() { + const mangoGroup = await client.getMangoGroup(connection, mangoGroupPk); + const marginAccountPk = new PublicKey("6vAry8oHVvWqPJV6SMzzJ9EcQr5kkQYHef6ui2ewaagQ") + const marginAccount = await client.getMarginAccount(connection, marginAccountPk, mangoGroup.dexProgramId) + const prices = await mangoGroup.getPrices(connection) + + console.log(marginAccount.toPrettyString(mangoGroup, prices)) + console.log(marginAccount.beingLiquidated) + console.log(marginAccount.getUiDeposit(mangoGroup, 0), marginAccount.getUiBorrow(mangoGroup, 0)) + console.log(marginAccount.getUiDeposit(mangoGroup, 1), marginAccount.getUiBorrow(mangoGroup, 1)) + console.log(marginAccount.getUiDeposit(mangoGroup, 2), marginAccount.getUiBorrow(mangoGroup, 2)) + console.log(marginAccount.getCollateralRatio(mangoGroup, prices)) + // for (let i = 0; i < NUM_MARKETS; i++) { + // let openOrdersAccount = marginAccount.openOrdersAccounts[i] + // if (openOrdersAccount === undefined) { + // continue + // } + // + // for (const oid of openOrdersAccount.orders) { + // console.log(oid.toString()) + // } + // console.log(i, + // nativeToUi(openOrdersAccount.quoteTokenTotal.toNumber(), mangoGroup.mintDecimals[NUM_MARKETS]), + // nativeToUi(openOrdersAccount.quoteTokenFree.toNumber(), mangoGroup.mintDecimals[NUM_MARKETS]), + // + // nativeToUi(openOrdersAccount.baseTokenTotal.toNumber(), mangoGroup.mintDecimals[i]), + // nativeToUi(openOrdersAccount.baseTokenFree.toNumber(), mangoGroup.mintDecimals[i]) + // + // ) + // } + + } + await getMarginAccountDetails() + // await testSolink() + // testDepositSrm() +} + +tests() \ No newline at end of file diff --git a/src/utils.ts b/src/utils.ts index 183456a..9505e36 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,7 +3,7 @@ import { AccountInfo, Commitment, Connection, PublicKey, RpcResponseAndContext, SimulatedTransactionResponse, - SystemProgram, Transaction, + SystemProgram, Transaction, TransactionConfirmationStatus, TransactionInstruction, TransactionSignature, } from '@solana/web3.js'; @@ -49,8 +49,18 @@ export async function awaitTransactionSignatureConfirmation( txid: TransactionSignature, timeout: number, connection: Connection, + confirmLevel: TransactionConfirmationStatus ) { let done = false; + + const confirmLevels: (TransactionConfirmationStatus | null)[] = ['finalized'] + if (confirmLevel === 'confirmed') { + confirmLevels.push('confirmed') + } else if (confirmLevel === 'processed') { + confirmLevels.push('confirmed') + confirmLevels.push('processed') + } + const result = await new Promise((resolve, reject) => { (async () => { setTimeout(() => { @@ -95,7 +105,7 @@ export async function awaitTransactionSignatureConfirmation( console.log('REST error for', txid, result); done = true; reject(result.err); - } else if (!(result.confirmations || result.confirmationStatus === "confirmed" || result.confirmationStatus === "finalized")) { + } else if (!(result.confirmations || confirmLevels.includes(result.confirmationStatus))) { console.log('REST not confirmed', txid, result); } else { console.log('REST confirmed', txid, result); @@ -168,9 +178,7 @@ export function uiToNative(amount: number, decimals: number): BN { } export function nativeToUi(amount: number, decimals: number): number { - return amount / Math.pow(10, decimals) - }