diff --git a/CHANGELOG.md b/CHANGELOG.md index 715e06845..8d857deaf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Version changes are pinned to SDK releases. ## [1.16.8] +- Robustness improvements around RPCs and cranking ([#330](https://github.com/zetamarkets/sdk/pull/330)) - Add user to placeOrderEvent ([#328](https://github.com/zetamarkets/sdk/pull/328)) ## [1.16.7] diff --git a/src/exchange.ts b/src/exchange.ts index 056b43515..01f928231 100644 --- a/src/exchange.ts +++ b/src/exchange.ts @@ -288,6 +288,8 @@ export class Exchange { this._ledgerWallet = wallet; } + public maxRpcRetries: number | undefined = undefined; + // Handy map to grab zetagroup asset by pubkey without an RPC fetch // or having to manually filter all zetaGroups public zetaGroupPubkeyToAsset(key: PublicKey): Asset { diff --git a/src/risk.ts b/src/risk.ts index 741fe3e0e..ac743377c 100644 --- a/src/risk.ts +++ b/src/risk.ts @@ -837,7 +837,7 @@ export class RiskCalculator { thresholdPercent: number = 1, bufferPercent: number = 5, maxIterations: number = 100 - ): number { + ): number | undefined { if (tradePrice <= 0) { return undefined; } diff --git a/src/utils.ts b/src/utils.ts index 884d33ec9..047cf8c94 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -848,11 +848,17 @@ export function defaultCommitment(): ConfirmOptions { } export function commitmentConfig(commitment: Commitment): ConfirmOptions { - return { + let opts = { skipPreflight: false, preflightCommitment: commitment, commitment, }; + + if (Exchange.maxRpcRetries != undefined) { + opts["maxRetries"] = Exchange.maxRpcRetries; + } + + return opts; } export async function getTradeEventsFromTx( @@ -1510,21 +1516,34 @@ export async function getAllOpenOrdersAccounts( export async function settleAndBurnVaultTokens( asset: Asset, - provider: anchor.AnchorProvider + provider: anchor.AnchorProvider, + accountLimit: number = 100 ) { - let openOrders = await getAllOpenOrdersAccounts(asset); + let openOrdersRaw = await getAllOpenOrdersAccounts(asset); + // Randomly sort so that if we have an accountLimit we don't keep grabbing the same N accounts every time + let openOrdersRandSort = openOrdersRaw.sort(() => Math.random() - 0.5); let openOrdersFiltered = []; - for (var i = 0; i < openOrders.length; i += constants.MAX_ACCOUNTS_TO_FETCH) { + for ( + var i = 0; + i < openOrdersRandSort.length; + i += constants.MAX_ACCOUNTS_TO_FETCH + ) { + if (openOrdersFiltered.length >= accountLimit) { + break; + } let ooBatch = await Exchange.connection.getMultipleAccountsInfo( - openOrders.slice(i, i + constants.MAX_ACCOUNTS_TO_FETCH), + openOrdersRandSort.slice(i, i + constants.MAX_ACCOUNTS_TO_FETCH), provider.connection.commitment ); for (var j = 0; j < ooBatch.length; j++) { + if (openOrdersFiltered.length >= accountLimit) { + break; + } const decoded = _OPEN_ORDERS_LAYOUT_V2.decode(ooBatch[j].data); let openOrdersAccount = new OpenOrders( - openOrders[i + j], + openOrdersRandSort[i + j], decoded, Exchange.programId ); @@ -1535,7 +1554,7 @@ export async function settleAndBurnVaultTokens( openOrdersAccount.quoteTokenFree.toNumber() != 0 || openOrdersAccount.quoteTokenTotal.toNumber() != 0 ) { - openOrdersFiltered.push(openOrders[i + j]); + openOrdersFiltered.push(openOrdersRandSort[i + j]); } } } @@ -1560,10 +1579,15 @@ export async function settleAndBurnVaultTokens( ); for (var j = 0; j < txs.length; j += 5) { + console.log("Settle tx num =", j); let txSlice = txs.slice(j, j + 5); await Promise.all( txSlice.map(async (tx) => { - await processTransaction(provider, tx); + try { + await processTransaction(provider, tx); + } catch (e) { + console.log("Settle failed, continuing..."); + } }) ); }