diff --git a/package.json b/package.json index b9e54ec..8d32360 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "trailingComma": "all" }, "dependencies": { - "@blockworks-foundation/mango-client": "^3.2.5", + "@blockworks-foundation/mango-client": "git+https://github.com/blockworks-foundation/mango-client-v3.git", "@project-serum/anchor": "^0.16.2", "@project-serum/serum": "0.13.55", "@project-serum/sol-wallet-adapter": "^0.2.0", diff --git a/src/liquidator.ts b/src/liquidator.ts index 46a0930..3eac176 100644 --- a/src/liquidator.ts +++ b/src/liquidator.ts @@ -75,8 +75,6 @@ const connection = new Connection( ); const client = new MangoClient(connection, mangoProgramId); -let mangoAccounts: MangoAccount[] = []; - let mangoSubscriptionId = -1; let dexSubscriptionId = -1; @@ -162,9 +160,9 @@ async function main() { } console.log(`Liqor Public Key: ${liqorMangoAccount.publicKey.toBase58()}`); - - await refreshAccounts(mangoGroup); - watchAccounts(groupIds.mangoProgramId, mangoGroup); + let mangoAccounts: MangoAccount[] = []; + await refreshAccounts(mangoGroup, mangoAccounts); + watchAccounts(groupIds.mangoProgramId, mangoGroup, mangoAccounts); const perpMarkets = await Promise.all( groupIds.perpMarkets.map((perpMarket) => { return mangoGroup.loadPerpMarket( @@ -310,7 +308,11 @@ async function main() { } } -function watchAccounts(mangoProgramId: PublicKey, mangoGroup: MangoGroup) { +function watchAccounts( + mangoProgramId: PublicKey, + mangoGroup: MangoGroup, + mangoAccounts: MangoAccount[], +) { try { console.log('Watching accounts...'); const openOrdersAccountSpan = OpenOrders.getLayout( @@ -403,25 +405,34 @@ function watchAccounts(mangoProgramId: PublicKey, mangoGroup: MangoGroup) { refreshWebsocketInterval, mangoProgramId, mangoGroup, + mangoAccounts, ); } } -async function refreshAccounts(mangoGroup: MangoGroup) { +async function refreshAccounts( + mangoGroup: MangoGroup, + mangoAccounts: MangoAccount[], +) { try { console.log('Refreshing accounts...'); console.time('getAllMangoAccounts'); - mangoAccounts = await client.getAllMangoAccounts( + mangoAccounts.splice(0, mangoAccounts.length, ...(await client.getAllMangoAccounts( mangoGroup, undefined, true, - ); + ))); console.timeEnd('getAllMangoAccounts'); console.log(`Fetched ${mangoAccounts.length} accounts`); } catch (err) { console.error('Error reloading accounts', err); } finally { - setTimeout(refreshAccounts, refreshAccountsInterval, mangoGroup); + setTimeout( + refreshAccounts, + refreshAccountsInterval, + mangoGroup, + mangoAccounts, + ); } } @@ -508,7 +519,9 @@ async function liquidateAccount( for (let i = 0; i < mangoGroup.tokens.length; i++) { shouldLiquidateSpot = liqee.getNet(cache.rootBankCache[i], i).isNeg(); } - const shouldLiquidatePerps = maintHealths.perp.lt(ZERO_I80F48) || (initHealths.perp.lt(ZERO_I80F48) && liqee.beingLiquidated); + const shouldLiquidatePerps = + maintHealths.perp.lt(ZERO_I80F48) || + (initHealths.perp.lt(ZERO_I80F48) && liqee.beingLiquidated); if (shouldLiquidateSpot) { await liquidateSpot( @@ -533,7 +546,11 @@ async function liquidateAccount( ); } - if (!shouldLiquidateSpot && !maintHealths.perp.isNeg() && liqee.beingLiquidated) { + if ( + !shouldLiquidateSpot && + !maintHealths.perp.isNeg() && + liqee.beingLiquidated + ) { // Send a ForceCancelPerp to reset the being_liquidated flag await client.forceCancelAllPerpOrdersInMarket( mangoGroup, diff --git a/yarn.lock b/yarn.lock index 56011e6..726f7f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -30,10 +30,9 @@ dependencies: regenerator-runtime "^0.13.4" -"@blockworks-foundation/mango-client@^3.2.5": +"@blockworks-foundation/mango-client@git+https://github.com/blockworks-foundation/mango-client-v3.git": version "3.2.5" - resolved "https://registry.yarnpkg.com/@blockworks-foundation/mango-client/-/mango-client-3.2.5.tgz#a1da40078754eb1ee3ec5aa897d3a1cb548d0253" - integrity sha512-3mXYFDaDiIdDXfBf/McEZIpYMT5dpYAT4h6CRVA4GR62Vk6bY+ARzr5Ei2xc6tVyxvEU7fnutJ07cSxW4U8Qow== + resolved "git+https://github.com/blockworks-foundation/mango-client-v3.git#834505a8a7ffb68c56035d6602f3d12b1c953cf0" dependencies: "@project-serum/anchor" "^0.16.2" "@project-serum/serum" "0.13.55" @@ -217,7 +216,27 @@ buffer-layout "^1.2.0" dotenv "10.0.0" -"@solana/web3.js@1.21.0", "@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0": +"@solana/web3.js@1.21.0": + version "1.21.0" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.21.0.tgz#4f98edea38d4cb3ae4d2ea49a050b0ec09508023" + integrity sha512-x1NXlF92tEjxuTxS0u4n9JV17UKk0Dn2L+qSWGvKOb4iWhzApDj6wicJsrGdSbGdxnZ7eciQ/SNn3zB4ydUllA== + dependencies: + "@babel/runtime" "^7.12.5" + "@solana/buffer-layout" "^3.0.0" + bn.js "^5.0.0" + borsh "^0.4.0" + bs58 "^4.0.1" + buffer "6.0.1" + crypto-hash "^1.2.2" + jayson "^3.4.4" + js-sha3 "^0.8.0" + node-fetch "^2.6.1" + rpc-websockets "^7.4.2" + secp256k1 "^4.0.2" + superstruct "^0.14.2" + tweetnacl "^1.0.0" + +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0": version "1.30.2" resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.30.2.tgz#e85da75e0825dc64f53eb64a1ff0115b27bec135" integrity sha512-hznCj+rkfvM5taRP3Z+l5lumB7IQnDrB4l55Wpsg4kDU9Zds8pE5YOH5Z9bbF/pUzZJKQjyBjnY/6kScBm3Ugg==