Skip to content

Commit

Permalink
Robustness improvements (#330)
Browse files Browse the repository at this point in the history
  • Loading branch information
filipzeta authored Dec 22, 2023
1 parent 4d6eda5 commit 5aa6f45
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 9 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
2 changes: 2 additions & 0 deletions src/exchange.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
2 changes: 1 addition & 1 deletion src/risk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -837,7 +837,7 @@ export class RiskCalculator {
thresholdPercent: number = 1,
bufferPercent: number = 5,
maxIterations: number = 100
): number {
): number | undefined {
if (tradePrice <= 0) {
return undefined;
}
Expand Down
40 changes: 32 additions & 8 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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
);
Expand All @@ -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]);
}
}
}
Expand All @@ -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...");
}
})
);
}
Expand Down

0 comments on commit 5aa6f45

Please sign in to comment.