From fd15ba3c06f95a47f6b7f0a045b6979fc876c20e Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 30 Jul 2025 08:25:40 +0800 Subject: [PATCH 1/5] Revert "sdk: revert drift interface (#1784)" This reverts commit 5b54070f39dfa280543698f129a308f982293815. --- bun.lock | 1072 ++++++++ .../grpcAccountSubscriber.ts | 4 +- .../webSocketAccountSubscriber.ts | 4 +- .../bulkAccountLoader.ts | 8 +- .../customizedCadenceBulkAccountLoader.ts | 2 +- .../testBulkAccountLoader.ts | 0 sdk/src/accounts/bulkUserStatsSubscription.ts | 4 +- sdk/src/accounts/bulkUserSubscription.ts | 4 +- .../grpcDriftClientAccountSubscriber.ts | 18 +- .../pollingDriftClientAccountSubscriber.ts | 20 +- .../webSocketDriftClientAccountSubscriber.ts | 26 +- ...HighLeverageModeConfigAccountSubscriber.ts | 6 +- ...HighLeverageModeConfigAccountSubscriber.ts | 6 +- ...grpcInsuranceFundStakeAccountSubscriber.ts | 6 +- ...lingInsuranceFundStakeAccountSubscriber.ts | 6 +- ...cketInsuranceFundStakeAccountSubscriber.ts | 6 +- .../pollingOracleAccountSubscriber.ts | 6 +- .../grpcProgramAccountSubscriber.ts | 4 +- .../webSocketProgramAccountSubscriber.ts | 2 +- .../pollingTokenAccountSubscriber.ts | 6 +- sdk/src/accounts/types.ts | 7 - .../basicUserAccountSubscriber.ts | 8 +- .../grpcUserAccountSubscriber.ts | 6 +- .../oneShotUserAccountSubscriber.ts | 4 +- .../pollingUserAccountSubscriber.ts | 8 +- .../webSocketUserAccountSubscriber.ts | 6 +- .../grpcUserStatsAccountSubscriber.ts | 6 +- .../pollingUserStatsAccountSubscriber.ts | 6 +- .../webSocketUserStatsAccountSubsriber.ts | 6 +- .../auctionSubscriber/auctionSubscriber.ts | 2 +- .../auctionSubscriberGrpc.ts | 4 +- sdk/src/{config.ts => config/index.ts} | 13 +- sdk/src/config/types.ts | 1 + sdk/src/constants/perpMarkets.ts | 2 +- sdk/src/constants/spotMarkets.ts | 2 +- sdk/src/dlob/DLOB.ts | 79 +- sdk/src/dlob/DLOBNode.ts | 2 +- sdk/src/dlob/DLOBSubscriber.ts | 9 +- sdk/src/dlob/NodeList.ts | 10 +- sdk/src/dlob/orderBookLevels.ts | 3 +- sdk/src/dlob/types.ts | 434 +++- sdk/src/dlob/utils.ts | 6 + .../{driftClient.ts => driftClient/index.ts} | 94 +- sdk/src/driftClient/types.ts | 2204 +++++++++++++++++ sdk/src/driftClientConfig.ts | 4 +- sdk/src/events/types.ts | 2 +- sdk/src/index.ts | 43 +- sdk/src/math/amm.ts | 2 +- sdk/src/math/insurance.ts | 3 +- sdk/src/math/margin.ts | 12 +- sdk/src/math/market.ts | 4 +- sdk/src/math/oracles.ts | 16 +- sdk/src/math/orders.ts | 17 +- sdk/src/math/utils.ts | 8 + sdk/src/openbook/openbookV2Subscriber.ts | 2 +- sdk/src/orderSubscriber/OrderSubscriber.ts | 16 +- .../orderSubscriber/PollingSubscription.ts | 6 +- .../orderSubscriber/WebsocketSubscription.ts | 8 +- sdk/src/orderSubscriber/grpcSubscription.ts | 8 +- sdk/src/orderSubscriber/types.ts | 45 +- sdk/src/phoenix/phoenixSubscriber.ts | 2 +- sdk/src/serum/serumSubscriber.ts | 2 +- sdk/src/serum/types.ts | 2 +- .../grpcSignedMsgUserAccountSubscriber.ts | 2 +- .../swift/signedMsgUserAccountSubscriber.ts | 2 +- sdk/src/swift/swiftOrderSubscriber.ts | 8 +- sdk/src/testClient.ts | 2 +- sdk/src/{user.ts => user/index.ts} | 79 +- sdk/src/user/types.ts | 754 ++++++ sdk/src/userConfig.ts | 32 - sdk/src/userMap/PollingSubscription.ts | 6 +- sdk/src/userMap/WebsocketSubscription.ts | 8 +- sdk/src/userMap/events.ts | 7 + sdk/src/userMap/grpcSubscription.ts | 10 +- sdk/src/userMap/types.ts | 105 + sdk/src/userMap/userMap.ts | 43 +- sdk/src/userMap/userMapConfig.ts | 4 +- sdk/src/userMap/userStatsMap.ts | 4 +- sdk/src/{userStats.ts => userStats/index.ts} | 35 +- sdk/src/userStats/types.ts | 23 + sdk/src/userStatsConfig.ts | 11 +- ...customizedCadenceBulkAccountLoader.test.ts | 2 +- tests/admin.ts | 2 +- tests/adminDeposit.ts | 2 +- tests/assetTier.ts | 2 +- tests/cancelAllOrders.ts | 2 +- tests/cappedSymFunding.ts | 2 +- tests/curve.ts | 2 +- tests/deleteInitializedSpotMarket.ts | 2 +- tests/depositIntoSpotMarketVault.ts | 2 +- tests/driftClient.ts | 2 +- tests/fillSpot.ts | 2 +- tests/forceUserDelete.ts | 2 +- tests/fuel.ts | 2 +- tests/fuelSweep.ts | 2 +- tests/govStakeDevnet.ts | 2 +- tests/highLeverageMode.ts | 2 +- tests/ifRebalance.ts | 2 +- tests/imbalancePerpPnl.ts | 2 +- tests/insuranceFundStake.ts | 2 +- tests/ksolver.ts | 2 +- tests/liquidateBorrowForPerpPnl.ts | 2 +- tests/liquidateMaxLps.ts | 2 +- tests/liquidatePerp.ts | 2 +- tests/liquidatePerpAndLp.ts | 2 +- tests/liquidatePerpPnlForDeposit.ts | 2 +- tests/liquidatePerpWithFill.ts | 2 +- tests/liquidateSpot.ts | 2 +- tests/liquidateSpotSocialLoss.ts | 2 +- tests/liquidateSpotWithSwap.ts | 2 +- tests/liquidityProvider.ts | 2 +- tests/marketOrder.ts | 2 +- tests/marketOrderBaseAssetAmount.ts | 2 +- tests/maxDeposit.ts | 2 +- tests/maxLeverageOrderParams.ts | 2 +- tests/modifyOrder.ts | 2 +- tests/multipleMakerOrders.ts | 2 +- tests/multipleSpotMakerOrders.ts | 2 +- tests/openbookTest.ts | 2 +- tests/oracleDiffSources.ts | 2 +- tests/oracleFillPriceGuardrails.ts | 2 +- tests/oracleOffsetOrders.ts | 2 +- tests/order.ts | 2 +- tests/ordersWithSpread.ts | 2 +- tests/overwritePerpAccounts.ts | 2 +- tests/pauseDepositWithdraw.ts | 2 +- tests/pauseExchange.ts | 2 +- tests/perpLpJit.ts | 2 +- tests/perpLpRiskMitigation.ts | 2 +- tests/phoenixTest.ts | 2 +- tests/placeAndMakePerp.ts | 2 +- tests/placeAndMakeSignedMsgBankrun.ts | 2 +- tests/placeAndMakeSpotOrder.ts | 2 +- tests/postOnly.ts | 2 +- tests/postOnlyAmmFulfillment.ts | 2 +- tests/prelisting.ts | 2 +- tests/pyth.ts | 2 +- tests/pythLazerBankrun.ts | 2 +- tests/pythPull.ts | 2 +- tests/referencePriceOffset.ts | 2 +- tests/referrer.ts | 2 +- tests/resizeSwiftUserOrderIds.ts | 2 +- tests/roundInFavorBaseAsset.ts | 2 +- tests/serumTest.ts | 2 +- tests/signedMsgWsDelegates.ts | 2 +- tests/spotDepositWithdraw.ts | 2 +- tests/spotDepositWithdraw22.ts | 2 +- tests/spotDepositWithdraw22TransferHooks.ts | 2 +- tests/spotMarketPoolIds.ts | 2 +- tests/spotSwap.ts | 2 +- tests/spotSwap22.ts | 2 +- tests/spotWithdrawUtil100.ts | 2 +- tests/stopLimits.ts | 2 +- tests/subaccounts.ts | 2 +- tests/surgePricing.ts | 2 +- tests/switchOracle.ts | 2 +- tests/switchboardOnDemand.ts | 2 +- tests/switchboardTxCus.ts | 2 +- tests/testHelpers.ts | 2 +- tests/tokenFaucet.ts | 2 +- tests/tradingLP.ts | 2 +- tests/transferPerpPosition.ts | 2 +- tests/transferPools.ts | 2 +- tests/triggerOrders.ts | 2 +- tests/triggerSpotOrder.ts | 2 +- tests/userAccount.ts | 2 +- tests/userDelegate.ts | 2 +- tests/userOrderId.ts | 2 +- tests/whitelist.ts | 2 +- 169 files changed, 5107 insertions(+), 538 deletions(-) create mode 100644 bun.lock rename sdk/src/accounts/{ => baseSubscribers}/grpcAccountSubscriber.ts (98%) rename sdk/src/accounts/{ => baseSubscribers}/webSocketAccountSubscriber.ts (99%) rename sdk/src/accounts/{ => bulkAccountLoader}/bulkAccountLoader.ts (96%) rename sdk/src/accounts/{ => bulkAccountLoader}/customizedCadenceBulkAccountLoader.ts (98%) rename sdk/src/accounts/{ => bulkAccountLoader}/testBulkAccountLoader.ts (100%) rename sdk/src/accounts/{ => driftClientAccount}/grpcDriftClientAccountSubscriber.ts (93%) rename sdk/src/accounts/{ => driftClientAccount}/pollingDriftClientAccountSubscriber.ts (97%) rename sdk/src/accounts/{ => driftClientAccount}/webSocketDriftClientAccountSubscriber.ts (96%) rename sdk/src/accounts/{ => highLeverageModeConfigAccount}/pollingHighLeverageModeConfigAccountSubscriber.ts (96%) rename sdk/src/accounts/{ => highLeverageModeConfigAccount}/webSocketHighLeverageModeConfigAccountSubscriber.ts (95%) rename sdk/src/accounts/{ => insuranceFundStakeAccount}/grpcInsuranceFundStakeAccountSubscriber.ts (89%) rename sdk/src/accounts/{ => insuranceFundStakeAccount}/pollingInsuranceFundStakeAccountSubscriber.ts (96%) rename sdk/src/accounts/{ => insuranceFundStakeAccount}/webSocketInsuranceFundStakeAccountSubscriber.ts (95%) rename sdk/src/accounts/{ => oracleAccount}/pollingOracleAccountSubscriber.ts (94%) rename sdk/src/accounts/{ => programAccount}/grpcProgramAccountSubscriber.ts (98%) rename sdk/src/accounts/{ => programAccount}/webSocketProgramAccountSubscriber.ts (99%) rename sdk/src/accounts/{ => tokenAccount}/pollingTokenAccountSubscriber.ts (95%) rename sdk/src/accounts/{ => userAccount}/basicUserAccountSubscriber.ts (92%) rename sdk/src/accounts/{ => userAccount}/grpcUserAccountSubscriber.ts (86%) rename sdk/src/accounts/{ => userAccount}/oneShotUserAccountSubscriber.ts (94%) rename sdk/src/accounts/{ => userAccount}/pollingUserAccountSubscriber.ts (94%) rename sdk/src/accounts/{ => userAccount}/webSocketUserAccountSubscriber.ts (94%) rename sdk/src/accounts/{ => userStatsAccount}/grpcUserStatsAccountSubscriber.ts (87%) rename sdk/src/accounts/{ => userStatsAccount}/pollingUserStatsAccountSubscriber.ts (96%) rename sdk/src/accounts/{ => userStatsAccount}/webSocketUserStatsAccountSubsriber.ts (93%) rename sdk/src/{config.ts => config/index.ts} (96%) create mode 100644 sdk/src/config/types.ts create mode 100644 sdk/src/dlob/utils.ts rename sdk/src/{driftClient.ts => driftClient/index.ts} (99%) create mode 100644 sdk/src/driftClient/types.ts rename sdk/src/{user.ts => user/index.ts} (98%) create mode 100644 sdk/src/user/types.ts delete mode 100644 sdk/src/userConfig.ts create mode 100644 sdk/src/userMap/events.ts create mode 100644 sdk/src/userMap/types.ts rename sdk/src/{userStats.ts => userStats/index.ts} (80%) create mode 100644 sdk/src/userStats/types.ts diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000000..5f7ade575e --- /dev/null +++ b/bun.lock @@ -0,0 +1,1072 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "dependencies": { + "@ellipsis-labs/phoenix-sdk": "1.4.2", + "@pythnetwork/pyth-solana-receiver": "0.8.0", + "@switchboard-xyz/common": "3.0.14", + "@switchboard-xyz/on-demand": "2.4.1", + "anchor-bankrun": "0.3.0", + "chai-bn": "0.2.2", + "csvtojson": "2.0.10", + "dotenv": "16.4.5", + "json2csv": "5.0.7", + "nanoid": "3.3.4", + "rpc-websockets": "7.5.1", + "solana-bankrun": "0.3.0", + "zstddec": "0.1.0", + }, + "devDependencies": { + "@coral-xyz/anchor": "0.29.0", + "@coral-xyz/anchor-30": "npm:@coral-xyz/anchor@0.30.1", + "@project-serum/common": "0.0.1-beta.3", + "@project-serum/serum": "0.13.65", + "@pythnetwork/client": "2.21.0", + "@pythnetwork/price-service-client": "1.9.0", + "@solana/spl-token": "0.4.13", + "@solana/web3.js": "1.73.2", + "@types/bn.js": "5.1.6", + "@types/chai": "5.0.0", + "@types/mocha": "8.2.3", + "@typescript-eslint/eslint-plugin": "6.21.0", + "@typescript-eslint/parser": "6.21.0", + "chai": "4.4.1", + "eslint": "8.57.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-prettier": "3.4.0", + "husky": "7.0.4", + "prettier": "3.0.1", + "typedoc": "0.23.23", + "typescript": "5.4.5", + }, + }, + }, + "packages": { + "@babel/runtime": ["@babel/runtime@7.28.2", "", {}, "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA=="], + + "@coral-xyz/anchor": ["@coral-xyz/anchor@0.29.0", "", { "dependencies": { "@coral-xyz/borsh": "^0.29.0", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA=="], + + "@coral-xyz/anchor-30": ["@coral-xyz/anchor@0.30.1", "", { "dependencies": { "@coral-xyz/anchor-errors": "^0.30.1", "@coral-xyz/borsh": "^0.30.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ=="], + + "@coral-xyz/anchor-errors": ["@coral-xyz/anchor-errors@0.30.1", "", {}, "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ=="], + + "@coral-xyz/borsh": ["@coral-xyz/borsh@0.29.0", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ=="], + + "@ellipsis-labs/phoenix-sdk": ["@ellipsis-labs/phoenix-sdk@1.4.2", "", { "dependencies": { "@metaplex-foundation/beet": "^0.7.1", "@metaplex-foundation/rustbin": "^0.3.1", "@metaplex-foundation/solita": "^0.12.2", "@solana/spl-token": "^0.3.7", "@types/node": "^18.11.13", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^5.0.0" } }, "sha512-7Rf2aWHZwuLX8jcrNSRUDf2aHuBnBzsDBN4GzClTdJYVGo4uQzf9ixju5J3apZ+xkQ6qvrEVYOXtogdgOhJFvw=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@2.1.4", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ=="], + + "@eslint/js": ["@eslint/js@8.57.0", "", {}, "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g=="], + + "@grpc/grpc-js": ["@grpc/grpc-js@1.13.4", "", { "dependencies": { "@grpc/proto-loader": "^0.7.13", "@js-sdsl/ordered-map": "^4.4.2" } }, "sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg=="], + + "@grpc/proto-loader": ["@grpc/proto-loader@0.7.15", "", { "dependencies": { "lodash.camelcase": "^4.3.0", "long": "^5.0.0", "protobufjs": "^7.2.5", "yargs": "^17.7.2" }, "bin": { "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" } }, "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ=="], + + "@humanwhocodes/config-array": ["@humanwhocodes/config-array@0.11.14", "", { "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", "minimatch": "^3.0.5" } }, "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/object-schema": ["@humanwhocodes/object-schema@2.0.3", "", {}, "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="], + + "@isaacs/ttlcache": ["@isaacs/ttlcache@1.4.1", "", {}, "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA=="], + + "@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="], + + "@metaplex-foundation/beet": ["@metaplex-foundation/beet@0.7.2", "", { "dependencies": { "ansicolors": "^0.3.2", "assert": "^2.1.0", "bn.js": "^5.2.0", "debug": "^4.3.3" } }, "sha512-K+g3WhyFxKPc0xIvcIjNyV1eaTVJTiuaHZpig7Xx0MuYRMoJLLvhLTnUXhFdR5Tu2l2QSyKwfyXDgZlzhULqFg=="], + + "@metaplex-foundation/beet-solana": ["@metaplex-foundation/beet-solana@0.3.1", "", { "dependencies": { "@metaplex-foundation/beet": ">=0.1.0", "@solana/web3.js": "^1.56.2", "bs58": "^5.0.0", "debug": "^4.3.4" } }, "sha512-tgyEl6dvtLln8XX81JyBvWjIiEcjTkUwZbrM5dIobTmoqMuGewSyk9CClno8qsMsFdB5T3jC91Rjeqmu/6xk2g=="], + + "@metaplex-foundation/rustbin": ["@metaplex-foundation/rustbin@0.3.5", "", { "dependencies": { "debug": "^4.3.3", "semver": "^7.3.7", "text-table": "^0.2.0", "toml": "^3.0.0" } }, "sha512-m0wkRBEQB/8krwMwKBvFugufZtYwMXiGHud2cTDAv+aGXK4M90y0Hx67/wpu+AqqoQfdV8VM9YezUOHKD+Z5kA=="], + + "@metaplex-foundation/solita": ["@metaplex-foundation/solita@0.12.2", "", { "dependencies": { "@metaplex-foundation/beet": "^0.4.0", "@metaplex-foundation/beet-solana": "^0.3.0", "@metaplex-foundation/rustbin": "^0.3.0", "@solana/web3.js": "^1.36.0", "camelcase": "^6.2.1", "debug": "^4.3.3", "js-sha256": "^0.9.0", "prettier": "^2.5.1", "snake-case": "^3.0.4", "spok": "^1.4.3" }, "bin": { "solita": "dist/src/cli/solita.js" } }, "sha512-oczMfE43NNHWweSqhXPTkQBUbap/aAiwjDQw8zLKNnd/J8sXr/0+rKcN5yJIEgcHeKRkp90eTqkmt2WepQc8yw=="], + + "@noble/curves": ["@noble/curves@1.9.5", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-IHiC8xU74NLKg7gNmwMbUVtqqZy9OWKphTAChESCgsXI5NTK6n3ewOFXrj4Dxal/Ml8D3msbPIHfpHLwv50Q2w=="], + + "@noble/ed25519": ["@noble/ed25519@1.7.5", "", {}, "sha512-xuS0nwRMQBvSxDa7UxMb61xTiH3MxTgUfhyPUALVIe0FlOAz4sjELwyDRyUvqeEYfRSG9qNjFIycqLZppg4RSA=="], + + "@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@noble/secp256k1": ["@noble/secp256k1@1.7.2", "", {}, "sha512-/qzwYl5eFLH8OWIecQWM31qld2g1NfjgylK+TNhqtaUKP37Nm+Y+z30Fjhw0Ct8p9yCQEm2N3W/AckdIb3SMcQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@project-serum/anchor": ["@project-serum/anchor@0.11.1", "", { "dependencies": { "@project-serum/borsh": "^0.2.2", "@solana/web3.js": "^1.17.0", "base64-js": "^1.5.1", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.0", "camelcase": "^5.3.1", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "find": "^0.3.0", "js-sha256": "^0.9.0", "pako": "^2.0.3", "snake-case": "^3.0.4", "toml": "^3.0.0" } }, "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA=="], + + "@project-serum/borsh": ["@project-serum/borsh@0.2.5", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.2.0" } }, "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q=="], + + "@project-serum/common": ["@project-serum/common@0.0.1-beta.3", "", { "dependencies": { "@project-serum/serum": "^0.13.21", "bn.js": "^5.1.2", "superstruct": "0.8.3" }, "peerDependencies": { "@solana/web3.js": "^0.87.1" } }, "sha512-gnQE/eUydTtto5okCgLWj1M97R9RRPJqnhKklikYI7jP/pnNhDmngSXC/dmfzED2GXSJEIKNIlxVw1k+E2Aw3w=="], + + "@project-serum/serum": ["@project-serum/serum@0.13.65", "", { "dependencies": { "@project-serum/anchor": "^0.11.1", "@solana/spl-token": "^0.1.6", "@solana/web3.js": "^1.21.0", "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" } }, "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA=="], + + "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="], + + "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="], + + "@protobufjs/codegen": ["@protobufjs/codegen@2.0.4", "", {}, "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg=="], + + "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.0", "", {}, "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q=="], + + "@protobufjs/fetch": ["@protobufjs/fetch@1.1.0", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.1", "@protobufjs/inquire": "^1.1.0" } }, "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ=="], + + "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="], + + "@protobufjs/inquire": ["@protobufjs/inquire@1.1.0", "", {}, "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q=="], + + "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="], + + "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="], + + "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + + "@pythnetwork/client": ["@pythnetwork/client@2.21.0", "", { "dependencies": { "@coral-xyz/anchor": "^0.29.0", "@coral-xyz/borsh": "^0.28.0", "buffer": "^6.0.1" }, "peerDependencies": { "@solana/web3.js": "^1.30.2" } }, "sha512-jqUuPLuVKRNUsZfwLuvK/MwnJ3LIrIxBNoz43xt0fjvVuH5QyTlz51ek76CkeKfCbomGKe41Vq7bvn8aqWVOGA=="], + + "@pythnetwork/price-service-client": ["@pythnetwork/price-service-client@1.9.0", "", { "dependencies": { "@pythnetwork/price-service-sdk": "*", "@types/ws": "^8.5.3", "axios": "^1.5.1", "axios-retry": "^3.8.0", "isomorphic-ws": "^4.0.1", "ts-log": "^2.2.4", "ws": "^8.6.0" } }, "sha512-SLm3IFcfmy9iMqHeT4Ih6qMNZhJEefY14T9yTlpsH2D/FE5+BaGGnfcexUifVlfH6M7mwRC4hEFdNvZ6ebZjJg=="], + + "@pythnetwork/price-service-sdk": ["@pythnetwork/price-service-sdk@1.8.0", "", { "dependencies": { "bn.js": "^5.2.1" } }, "sha512-tFZ1thj3Zja06DzPIX2dEWSi7kIfIyqreoywvw5NQ3Z1pl5OJHQGMEhxt6Li3UCGSp2ooYZS9wl8/8XfrfrNSA=="], + + "@pythnetwork/pyth-solana-receiver": ["@pythnetwork/pyth-solana-receiver@0.8.0", "", { "dependencies": { "@coral-xyz/anchor": "^0.29.0", "@noble/hashes": "^1.4.0", "@pythnetwork/price-service-sdk": ">=1.6.0", "@pythnetwork/solana-utils": "*", "@solana/web3.js": "^1.90.0" } }, "sha512-5lhLtggAqsiHtffTPM8vcKJmhBdxzidBmiNNUlqPyg9XmhZ4Z+roY0dfzluEoX5xer9rEA1ThsBpX0bG1DRIGA=="], + + "@pythnetwork/solana-utils": ["@pythnetwork/solana-utils@0.4.5", "", { "dependencies": { "@coral-xyz/anchor": "^0.29.0", "@solana/web3.js": "^1.90.0", "bs58": "^5.0.0", "jito-ts": "^3.0.1", "ts-log": "^2.2.7" } }, "sha512-NoLdC2rRAx9a66L0hSOAGt6Wj/YxfnKkw+mbb7Tn/Nn1du4HyShi41DiN6B+2XXqnMthNGbf9FSHvj4NXXABvA=="], + + "@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="], + + "@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="], + + "@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/options": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="], + + "@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="], + + "@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="], + + "@solana/codecs-numbers": ["@solana/codecs-numbers@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg=="], + + "@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="], + + "@solana/errors": ["@solana/errors@2.3.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^14.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ=="], + + "@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="], + + "@solana/spl-token": ["@solana/spl-token@0.4.13", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-cite/pYWQZZVvLbg5lsodSovbetK/eA24gaR0eeUeMuBAMNrT8XFCwaygKy0N2WSg3gSyjjNpIeAGBAKZaY/1w=="], + + "@solana/spl-token-group": ["@solana/spl-token-group@0.0.7", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug=="], + + "@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.6", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA=="], + + "@solana/web3.js": ["@solana/web3.js@1.73.2", "", { "dependencies": { "@babel/runtime": "^7.12.5", "@noble/ed25519": "^1.7.0", "@noble/hashes": "^1.1.2", "@noble/secp256k1": "^1.6.3", "@solana/buffer-layout": "^4.0.0", "agentkeepalive": "^4.2.1", "bigint-buffer": "^1.1.5", "bn.js": "^5.0.0", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.1", "fast-stable-stringify": "^1.0.0", "jayson": "^3.4.4", "node-fetch": "2", "rpc-websockets": "^7.5.0", "superstruct": "^0.14.2" } }, "sha512-9WACF8W4Nstj7xiDw3Oom22QmrhBh0VyZyZ7JvvG3gOxLWLlX3hvm5nPVJOGcCE/9fFavBbCUb5A6CIuvMGdoA=="], + + "@swc/helpers": ["@swc/helpers@0.5.17", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A=="], + + "@switchboard-xyz/common": ["@switchboard-xyz/common@3.0.14", "", { "dependencies": { "@solana/web3.js": "^1.98.0", "axios": "^1.8.3", "big.js": "^6.2.2", "bn.js": "^5.2.1", "bs58": "^6.0.0", "buffer": "^6.0.3", "decimal.js": "^10.4.3", "js-sha256": "^0.11.0", "protobufjs": "^7.4.0", "yaml": "^2.6.1" } }, "sha512-LpxzEywO0DjPYIgPzQYkf32C7agwW4YRsPN6BcIvYrw0iJdDMtPZ3SQfIGHLSlD1fwvn2KLUYuGaKegeq4aBTw=="], + + "@switchboard-xyz/on-demand": ["@switchboard-xyz/on-demand@2.4.1", "", { "dependencies": { "@coral-xyz/anchor-30": "npm:@coral-xyz/anchor@0.30.1", "@isaacs/ttlcache": "^1.4.1", "@switchboard-xyz/common": ">=3.0.0", "axios": "^1.8.3", "bs58": "^6.0.0", "buffer": "^6.0.3", "js-yaml": "^4.1.0" } }, "sha512-eSlBp+c8lxpcSgh0/2xK8OaLHPziTSZlcs8V96gZGdiCJz1KgWJRNE1qnIJDOwaGdFecZdwcmajfQRtLRLED3w=="], + + "@types/bn.js": ["@types/bn.js@5.1.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-Xh8vSwUeMKeYYrj3cX4lGQgFSF/N03r+tv4AiLl1SucqV+uTQpxRcnM8AkXKHwYP9ZPXOYXRr2KPXpVlIvqh9w=="], + + "@types/chai": ["@types/chai@5.0.0", "", {}, "sha512-+DwhEHAaFPPdJ2ral3kNHFQXnTfscEEFsUxzD+d7nlcLrFK23JtNjH71RGasTcHb88b4vVi4mTyfpf8u2L8bdA=="], + + "@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/mocha": ["@types/mocha@8.2.3", "", {}, "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw=="], + + "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@types/semver": ["@types/semver@7.7.0", "", {}, "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA=="], + + "@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="], + + "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@6.21.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.5.1", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/type-utils": "6.21.0", "@typescript-eslint/utils": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", "natural-compare": "^1.4.0", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@6.21.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0" } }, "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@6.21.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "6.21.0", "@typescript-eslint/utils": "6.21.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@6.21.0", "", {}, "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "@typescript-eslint/visitor-keys": "6.21.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", "minimatch": "9.0.3", "semver": "^7.5.4", "ts-api-utils": "^1.0.1" } }, "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@6.21.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", "@typescript-eslint/typescript-estree": "6.21.0", "semver": "^7.5.4" }, "peerDependencies": { "eslint": "^7.0.0 || ^8.0.0" } }, "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@6.21.0", "", { "dependencies": { "@typescript-eslint/types": "6.21.0", "eslint-visitor-keys": "^3.4.1" } }, "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A=="], + + "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], + + "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], + + "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], + + "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "anchor-bankrun": ["anchor-bankrun@0.3.0", "", { "peerDependencies": { "@coral-xyz/anchor": "^0.28.0", "@solana/web3.js": "^1.78.4", "solana-bankrun": "^0.2.0" } }, "sha512-PYBW5fWX+iGicIS5MIM/omhk1tQPUc0ELAnI/IkLKQJ6d75De/CQRh8MF2bU/TgGyFi6zEel80wUe3uRol9RrQ=="], + + "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + + "ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "ansicolors": ["ansicolors@0.3.2", "", {}, "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg=="], + + "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "array-union": ["array-union@2.1.0", "", {}, "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="], + + "assert": ["assert@2.1.0", "", { "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", "object-is": "^1.1.5", "object.assign": "^4.1.4", "util": "^0.12.5" } }, "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw=="], + + "assertion-error": ["assertion-error@1.1.0", "", {}, "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw=="], + + "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + + "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], + + "axios": ["axios@1.11.0", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA=="], + + "axios-retry": ["axios-retry@3.9.1", "", { "dependencies": { "@babel/runtime": "^7.15.4", "is-retry-allowed": "^2.2.0" } }, "sha512-8PJDLJv7qTTMMwdnbMvrLYuvB47M81wRtxQmEdV5w4rgbTXTt+vtPkXwajOfOdSyv/wZICJOC+/UhXH4aQ/R+w=="], + + "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="], + + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "big.js": ["big.js@6.2.2", "", {}, "sha512-y/ie+Faknx7sZA5MfGA2xKlu0GDv8RWrXGsmlteyJQ2lvoKv9GBK/fpRMc2qlSoBAgNxrixICFCBefIq8WCQpQ=="], + + "bigint-buffer": ["bigint-buffer@1.1.5", "", { "dependencies": { "bindings": "^1.3.0" } }, "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA=="], + + "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="], + + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], + + "bluebird": ["bluebird@3.7.2", "", {}, "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg=="], + + "bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="], + + "borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="], + + "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="], + + "buffer-layout": ["buffer-layout@1.2.2", "", {}, "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA=="], + + "bufferutil": ["bufferutil@4.0.9", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-WDtdLmJvAuNNPzByAYpRo2rF1Mmradw6gvWsQKf63476DDXmomT9zUiGypLcG4ibIM67vhAj8jJRdbmEws2Aqw=="], + + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], + + "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + + "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="], + + "chai": ["chai@4.4.1", "", { "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.3", "deep-eql": "^4.1.3", "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", "type-detect": "^4.0.8" } }, "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g=="], + + "chai-bn": ["chai-bn@0.2.2", "", { "peerDependencies": { "bn.js": "^4.11.0", "chai": "^4.0.0" } }, "sha512-MzjelH0p8vWn65QKmEq/DLBG1Hle4WeyqT79ANhXZhn/UxRWO0OogkAxi5oGGtfzwU9bZR8mvbvYdoqNVWQwFg=="], + + "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "check-error": ["check-error@1.0.3", "", { "dependencies": { "get-func-name": "^2.0.2" } }, "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg=="], + + "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], + + "commander": ["commander@6.2.1", "", {}, "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA=="], + + "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="], + + "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "crypto-hash": ["crypto-hash@1.3.0", "", {}, "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg=="], + + "csvtojson": ["csvtojson@2.0.10", "", { "dependencies": { "bluebird": "^3.5.1", "lodash": "^4.17.3", "strip-bom": "^2.0.0" }, "bin": { "csvtojson": "./bin/csvtojson" } }, "sha512-lUWFxGKyhraKCW8Qghz6Z0f2l/PqB1W3AO0HKJzGIQ5JRSlR651ekJDiGJbBT4sRNNv5ddnSGVEnsxP9XRCVpQ=="], + + "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], + + "deep-eql": ["deep-eql@4.1.4", "", { "dependencies": { "type-detect": "^4.0.0" } }, "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg=="], + + "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], + + "define-properties": ["define-properties@1.2.1", "", { "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg=="], + + "delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="], + + "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + + "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], + + "doctrine": ["doctrine@3.0.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="], + + "dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="], + + "dotenv": ["dotenv@16.4.5", "", {}, "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg=="], + + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], + + "emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], + + "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], + + "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + + "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + + "es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="], + + "es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@8.57.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", "@eslint/js": "8.57.0", "@humanwhocodes/config-array": "^0.11.14", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.2", "eslint-visitor-keys": "^3.4.3", "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0" }, "bin": { "eslint": "bin/eslint.js" } }, "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ=="], + + "eslint-config-prettier": ["eslint-config-prettier@8.3.0", "", { "peerDependencies": { "eslint": ">=7.0.0" }, "bin": { "eslint-config-prettier": "bin/cli.js" } }, "sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew=="], + + "eslint-plugin-prettier": ["eslint-plugin-prettier@3.4.0", "", { "dependencies": { "prettier-linter-helpers": "^1.0.0" }, "peerDependencies": { "eslint": ">=5.0.0", "prettier": ">=1.13.0" } }, "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw=="], + + "eslint-scope": ["eslint-scope@7.2.2", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "espree": ["espree@9.6.1", "", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "esquery": ["esquery@1.6.0", "", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "esutils": ["esutils@2.0.3", "", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + + "eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-diff": ["fast-diff@1.3.0", "", {}, "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="], + + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="], + + "fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="], + + "fastq": ["fastq@1.19.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "file-entry-cache": ["file-entry-cache@6.0.1", "", { "dependencies": { "flat-cache": "^3.0.4" } }, "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find": ["find@0.3.0", "", { "dependencies": { "traverse-chain": "~0.1.0" } }, "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw=="], + + "find-process": ["find-process@1.4.11", "", { "dependencies": { "chalk": "~4.1.2", "commander": "^12.1.0", "loglevel": "^1.9.2" }, "bin": { "find-process": "bin/find-process.js" } }, "sha512-mAOh9gGk9WZ4ip5UjV0o6Vb4SrfnAmtsFNzkMRH9HQiFXVQnDyQFrSHTK5UoG6E+KV+s+cIznbtwpfN41l2nFA=="], + + "find-up": ["find-up@5.0.0", "", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "flat-cache": ["flat-cache@3.2.0", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", "rimraf": "^3.0.2" } }, "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw=="], + + "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], + + "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], + + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], + + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], + + "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], + + "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], + + "get-func-name": ["get-func-name@2.0.2", "", {}, "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ=="], + + "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], + + "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + + "glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], + + "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@13.24.0", "", { "dependencies": { "type-fest": "^0.20.2" } }, "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ=="], + + "globby": ["globby@11.1.0", "", { "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", "fast-glob": "^3.2.9", "ignore": "^5.2.0", "merge2": "^1.4.1", "slash": "^3.0.0" } }, "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="], + + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + + "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "has-property-descriptors": ["has-property-descriptors@1.0.2", "", { "dependencies": { "es-define-property": "^1.0.0" } }, "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg=="], + + "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], + + "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], + + "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + + "humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="], + + "husky": ["husky@7.0.4", "", { "bin": { "husky": "lib/bin.js" } }, "sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ=="], + + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + + "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "inflight": ["inflight@1.0.6", "", { "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="], + + "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], + + "is-arguments": ["is-arguments@1.2.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA=="], + + "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], + + "is-generator-function": ["is-generator-function@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ=="], + + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-nan": ["is-nan@1.3.2", "", { "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" } }, "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w=="], + + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-path-inside": ["is-path-inside@3.0.3", "", {}, "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="], + + "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], + + "is-retry-allowed": ["is-retry-allowed@2.2.0", "", {}, "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg=="], + + "is-typed-array": ["is-typed-array@1.1.15", "", { "dependencies": { "which-typed-array": "^1.1.16" } }, "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ=="], + + "is-utf8": ["is-utf8@0.2.1", "", {}, "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q=="], + + "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], + + "jayson": ["jayson@3.7.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "JSONStream": "^1.3.5", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "lodash": "^4.17.20", "uuid": "^8.3.2", "ws": "^7.4.5" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-tfy39KJMrrXJ+mFcMpxwBvFDetS8LAID93+rycFglIQM4kl3uNR3W4lBLE/FFhsoUCEox5Dt2adVpDm/XtebbQ=="], + + "jito-ts": ["jito-ts@3.0.1", "", { "dependencies": { "@grpc/grpc-js": "^1.8.13", "@noble/ed25519": "^1.7.1", "@solana/web3.js": "~1.77.3", "agentkeepalive": "^4.3.0", "dotenv": "^16.0.3", "jayson": "^4.0.0", "node-fetch": "^2.6.7", "superstruct": "^1.0.3" } }, "sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg=="], + + "js-sha256": ["js-sha256@0.11.1", "", {}, "sha512-o6WSo/LUvY2uC4j7mO50a2ms7E/EAdbP0swigLV+nzHKTTaYnaLIWJ02VdXrsJX0vGedDESQnLsOekr94ryfjg=="], + + "js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "json-buffer": ["json-buffer@3.0.1", "", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], + + "json2csv": ["json2csv@5.0.7", "", { "dependencies": { "commander": "^6.1.0", "jsonparse": "^1.3.1", "lodash.get": "^4.4.2" }, "bin": { "json2csv": "bin/json2csv.js" } }, "sha512-YRZbUnyaJZLZUJSRi2G/MqahCyRv9n/ds+4oIetjDF3jWQA7AG7iSeKTiZiCNqtMZM7HDyt0e/W6lEnoGEmMGA=="], + + "jsonc-parser": ["jsonc-parser@3.3.1", "", {}, "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ=="], + + "jsonparse": ["jsonparse@1.3.1", "", {}, "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg=="], + + "keyv": ["keyv@4.5.4", "", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kind-of": ["kind-of@6.0.3", "", {}, "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="], + + "levn": ["levn@0.4.1", "", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "locate-path": ["locate-path@6.0.0", "", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.camelcase": ["lodash.camelcase@4.3.0", "", {}, "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="], + + "lodash.get": ["lodash.get@4.4.2", "", {}, "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ=="], + + "lodash.merge": ["lodash.merge@4.6.2", "", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "loglevel": ["loglevel@1.9.2", "", {}, "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg=="], + + "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], + + "loupe": ["loupe@2.3.7", "", { "dependencies": { "get-func-name": "^2.0.1" } }, "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA=="], + + "lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="], + + "lunr": ["lunr@2.3.9", "", {}, "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow=="], + + "marked": ["marked@4.3.0", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A=="], + + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], + + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], + + "mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + + "minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "nanoid": ["nanoid@3.3.4", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="], + + "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="], + + "node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="], + + "node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="], + + "object-is": ["object-is@1.1.6", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" } }, "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q=="], + + "object-keys": ["object-keys@1.1.1", "", {}, "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA=="], + + "object.assign": ["object.assign@4.1.7", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw=="], + + "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], + + "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="], + + "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-exists": ["path-exists@4.0.0", "", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-is-absolute": ["path-is-absolute@1.0.1", "", {}, "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="], + + "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "path-type": ["path-type@4.0.0", "", {}, "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="], + + "pathval": ["pathval@1.1.1", "", {}, "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ=="], + + "picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "prettier": ["prettier@3.0.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-fcOWSnnpCrovBsmFZIGIy9UqK2FaI7Hqax+DIO0A9UxeVoY4iweyaFjS5TavZN97Hfehph0nhsZnjlVKzEQSrQ=="], + + "prettier-linter-helpers": ["prettier-linter-helpers@1.0.0", "", { "dependencies": { "fast-diff": "^1.1.2" } }, "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="], + + "protobufjs": ["protobufjs@7.5.3", "", { "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", "@protobufjs/codegen": "^2.0.4", "@protobufjs/eventemitter": "^1.1.0", "@protobufjs/fetch": "^1.1.0", "@protobufjs/float": "^1.0.2", "@protobufjs/inquire": "^1.1.0", "@protobufjs/path": "^1.1.2", "@protobufjs/pool": "^1.1.0", "@protobufjs/utf8": "^1.1.0", "@types/node": ">=13.7.0", "long": "^5.0.0" } }, "sha512-sildjKwVqOI2kmFDiXQ6aEB0fjYTafpEvIBs8tOR8qI4spuL9OPROLVu2qZqi/xgCfsHIwVqlaF8JBjWFHnKbw=="], + + "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + + "punycode": ["punycode@2.3.1", "", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "require-directory": ["require-directory@2.1.1", "", {}, "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q=="], + + "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rimraf": ["rimraf@3.0.2", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "bin.js" } }, "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="], + + "rpc-websockets": ["rpc-websockets@7.5.1", "", { "dependencies": { "@babel/runtime": "^7.17.2", "eventemitter3": "^4.0.7", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-kGFkeTsmd37pHPMaHIgN1LVKXMi0JD782v4Ds9ZKtLlwdTKjn+CxM9A9/gLT2LaOuEcEFGL98h1QWQtlOIdW0w=="], + + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "safe-regex-test": ["safe-regex-test@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw=="], + + "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], + + "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shiki": ["shiki@0.11.1", "", { "dependencies": { "jsonc-parser": "^3.0.0", "vscode-oniguruma": "^1.6.1", "vscode-textmate": "^6.0.0" } }, "sha512-EugY9VASFuDqOexOgXR18ZV+TbFrQHeCpEYaXamO+SZlsnT/2LxuLBX25GGtIrwaEVFXUAbUQ601SWE2rMwWHA=="], + + "slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], + + "snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="], + + "solana-bankrun": ["solana-bankrun@0.3.0", "", { "dependencies": { "@solana/web3.js": "^1.68.0", "bs58": "^4.0.1" }, "optionalDependencies": { "solana-bankrun-darwin-arm64": "0.3.0", "solana-bankrun-darwin-universal": "0.3.0", "solana-bankrun-darwin-x64": "0.3.0", "solana-bankrun-linux-x64-gnu": "0.3.0", "solana-bankrun-linux-x64-musl": "0.3.0" } }, "sha512-YkH7sa8TB/AoRPzG17CXJtYsRIQHEkEqGLz1Vwc13taXhDBkjO7z6NI5JYw7n0ybRymDHwMYTc7sd+5J40TyVQ=="], + + "solana-bankrun-darwin-arm64": ["solana-bankrun-darwin-arm64@0.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-+NbDncf0U6l3knuacRBiqpjZ2DSp+5lZaAU518gH7/x6qubbui/d000STaIBK+uNTPBS/AL/bCN+7PkXqmA3lA=="], + + "solana-bankrun-darwin-universal": ["solana-bankrun-darwin-universal@0.3.0", "", { "os": "darwin" }, "sha512-1/F0xdMa4qvc5o6z16FCCbZ5jbdvKvxpx5kyPcMWRiRPwyvi+zltMxciPAYMlg3wslQqGz88uFhrBEzq2eTumQ=="], + + "solana-bankrun-darwin-x64": ["solana-bankrun-darwin-x64@0.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U6CANjkmMl+lgNA7UH0GKs5V7LtVIUDzJBZefGGqLfqUNv3EjA/PrrToM0hAOWJgkxSwdz6zW+p5sw5FmnbXtg=="], + + "solana-bankrun-linux-x64-gnu": ["solana-bankrun-linux-x64-gnu@0.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-qJSkCFs0k2n4XtTnyxGMiZsuqO2TiqTYgWjQ+3mZhGNUAMys/Vq8bd7/SyBm6RR7EfVuRXRxZvh+F8oKZ77V4w=="], + + "solana-bankrun-linux-x64-musl": ["solana-bankrun-linux-x64-musl@0.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-xsS2CS2xb1Sw4ivNXM0gPz/qpW9BX0neSvt/pnok5L330Nu9xlTnKAY8FhzzqOP9P9sJlGRM787Y6d0yYwt6xQ=="], + + "spok": ["spok@1.5.5", "", { "dependencies": { "ansicolors": "~0.3.2", "find-process": "^1.4.7" } }, "sha512-IrJIXY54sCNFASyHPOY+jEirkiJ26JDqsGiI0Dvhwcnkl0PEWi1PSsrkYql0rzDw8LFVTcA7rdUCAJdE2HE+2Q=="], + + "stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="], + + "stream-json": ["stream-json@1.9.1", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw=="], + + "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + + "strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + + "strip-bom": ["strip-bom@2.0.0", "", { "dependencies": { "is-utf8": "^0.2.0" } }, "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "superstruct": ["superstruct@0.15.5", "", {}, "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ=="], + + "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "text-encoding-utf-8": ["text-encoding-utf-8@1.0.2", "", {}, "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="], + + "text-table": ["text-table@0.2.0", "", {}, "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="], + + "through": ["through@2.3.8", "", {}, "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg=="], + + "tiny-invariant": ["tiny-invariant@1.3.3", "", {}, "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="], + + "tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], + + "traverse-chain": ["traverse-chain@0.1.0", "", {}, "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg=="], + + "ts-api-utils": ["ts-api-utils@1.4.3", "", { "peerDependencies": { "typescript": ">=4.2.0" } }, "sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw=="], + + "ts-log": ["ts-log@2.2.7", "", {}, "sha512-320x5Ggei84AxzlXp91QkIGSw5wgaLT6GeAH0KsqDmRZdVWW2OiSeVvElVoatk3f7nicwXlElXsoFkARiGE2yg=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "type-detect": ["type-detect@4.1.0", "", {}, "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw=="], + + "type-fest": ["type-fest@0.20.2", "", {}, "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="], + + "typedoc": ["typedoc@0.23.23", "", { "dependencies": { "lunr": "^2.3.9", "marked": "^4.2.4", "minimatch": "^5.1.1", "shiki": "^0.11.1" }, "peerDependencies": { "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x" }, "bin": { "typedoc": "bin/typedoc" } }, "sha512-cg1YQWj+/BU6wq74iott513U16fbrPCbyYs04PHZgvoKJIc6EY4xNobyDZh4KMfRGW8Yjv6wwIzQyoqopKOUGw=="], + + "typescript": ["typescript@5.4.5", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ=="], + + "undici-types": ["undici-types@7.8.0", "", {}, "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw=="], + + "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="], + + "util": ["util@0.12.5", "", { "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", "is-typed-array": "^1.1.3", "which-typed-array": "^1.1.2" } }, "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA=="], + + "uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="], + + "vscode-oniguruma": ["vscode-oniguruma@1.7.0", "", {}, "sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA=="], + + "vscode-textmate": ["vscode-textmate@6.0.0", "", {}, "sha512-gu73tuZfJgu+mvCSy4UZwd2JXykjK9zAZsfmDeut5dx/1a7FeTk0XwJsSuqQn+cuMCGVbIBfl+s53X4T19DnzQ=="], + + "webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], + + "whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], + + "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "which-typed-array": ["which-typed-array@1.1.19", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw=="], + + "word-wrap": ["word-wrap@1.2.5", "", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], + + "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], + + "yaml": ["yaml@2.8.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ=="], + + "yargs": ["yargs@17.7.2", "", { "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" } }, "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w=="], + + "yargs-parser": ["yargs-parser@21.1.1", "", {}, "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw=="], + + "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "zstddec": ["zstddec@0.1.0", "", {}, "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg=="], + + "@coral-xyz/anchor-30/@coral-xyz/borsh": ["@coral-xyz/borsh@0.30.1", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ=="], + + "@ellipsis-labs/phoenix-sdk/@solana/spl-token": ["@solana/spl-token@0.3.11", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-metadata": "^0.1.2", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.88.0" } }, "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ=="], + + "@ellipsis-labs/phoenix-sdk/@types/node": ["@types/node@18.19.121", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-bHOrbyztmyYIi4f1R0s17QsPs1uyyYnGcXeZoGEd227oZjry0q6XQBQxd82X1I57zEfwO8h9Xo+Kl5gX1d9MwQ=="], + + "@ellipsis-labs/phoenix-sdk/bs58": ["bs58@5.0.0", "", { "dependencies": { "base-x": "^4.0.0" } }, "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@metaplex-foundation/beet-solana/bs58": ["bs58@5.0.0", "", { "dependencies": { "base-x": "^4.0.0" } }, "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ=="], + + "@metaplex-foundation/solita/@metaplex-foundation/beet": ["@metaplex-foundation/beet@0.4.0", "", { "dependencies": { "ansicolors": "^0.3.2", "bn.js": "^5.2.0", "debug": "^4.3.3" } }, "sha512-2OAKJnLatCc3mBXNL0QmWVQKAWK2C7XDfepgL0p/9+8oSx4bmRAFHFqptl1A/C0U5O3dxGwKfmKluW161OVGcA=="], + + "@metaplex-foundation/solita/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@metaplex-foundation/solita/js-sha256": ["js-sha256@0.9.0", "", {}, "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="], + + "@metaplex-foundation/solita/prettier": ["prettier@2.8.8", "", { "bin": { "prettier": "bin-prettier.js" } }, "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q=="], + + "@project-serum/anchor/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@project-serum/anchor/camelcase": ["camelcase@5.3.1", "", {}, "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="], + + "@project-serum/anchor/js-sha256": ["js-sha256@0.9.0", "", {}, "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA=="], + + "@project-serum/common/superstruct": ["superstruct@0.8.3", "", { "dependencies": { "kind-of": "^6.0.2", "tiny-invariant": "^1.0.6" } }, "sha512-LbtbFpktW1FcwxVIJlxdk7bCyBq/GzOx2FSFLRLTUhWIA1gHkYPIl3aXRG5mBdGZtnPNT6t+4eEcLDCMOuBHww=="], + + "@project-serum/serum/@solana/spl-token": ["@solana/spl-token@0.1.8", "", { "dependencies": { "@babel/runtime": "^7.10.5", "@solana/web3.js": "^1.21.0", "bn.js": "^5.1.0", "buffer": "6.0.3", "buffer-layout": "^1.2.0", "dotenv": "10.0.0" } }, "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ=="], + + "@pythnetwork/client/@coral-xyz/borsh": ["@coral-xyz/borsh@0.28.0", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-/u1VTzw7XooK7rqeD7JLUSwOyRSesPUk0U37BV9zK0axJc1q0nRbKFGFLYCQ16OtdOJTTwGfGp11Lx9B45bRCQ=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@pythnetwork/solana-utils/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@pythnetwork/solana-utils/bs58": ["bs58@5.0.0", "", { "dependencies": { "base-x": "^4.0.0" } }, "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ=="], + + "@solana/buffer-layout-utils/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/codecs-data-structures/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/codecs-numbers/@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="], + + "@solana/codecs-strings/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/errors/commander": ["commander@14.0.0", "", {}, "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA=="], + + "@solana/options/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="], + + "@solana/options/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/web3.js/buffer": ["buffer@6.0.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ=="], + + "@solana/web3.js/superstruct": ["superstruct@0.14.2", "", {}, "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ=="], + + "@switchboard-xyz/common/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@switchboard-xyz/common/bs58": ["bs58@6.0.0", "", { "dependencies": { "base-x": "^5.0.0" } }, "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw=="], + + "@switchboard-xyz/on-demand/bs58": ["bs58@6.0.0", "", { "dependencies": { "base-x": "^5.0.0" } }, "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.3", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "find-process/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "jito-ts/@solana/web3.js": ["@solana/web3.js@1.77.4", "", { "dependencies": { "@babel/runtime": "^7.12.5", "@noble/curves": "^1.0.0", "@noble/hashes": "^1.3.0", "@solana/buffer-layout": "^4.0.0", "agentkeepalive": "^4.2.1", "bigint-buffer": "^1.1.5", "bn.js": "^5.0.0", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.0", "node-fetch": "^2.6.7", "rpc-websockets": "^7.5.1", "superstruct": "^0.14.2" } }, "sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q=="], + + "jito-ts/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "jito-ts/superstruct": ["superstruct@1.0.4", "", {}, "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ=="], + + "solana-bankrun/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "typedoc/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], + + "@ellipsis-labs/phoenix-sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], + + "@ellipsis-labs/phoenix-sdk/bs58/base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@metaplex-foundation/beet-solana/bs58/base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@metaplex-foundation/solita/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@metaplex-foundation/solita/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@project-serum/anchor/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@project-serum/anchor/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@project-serum/anchor/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js": ["@solana/web3.js@1.98.2", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-BqVwEG+TaG2yCkBMbD3C4hdpustR4FpuUFRPUmqRZYYlPI9Hg4XMWxHWOWRzHE9Lkc9NDjzXFX7lDXSgzC7R1A=="], + + "@project-serum/serum/@solana/spl-token/dotenv": ["dotenv@10.0.0", "", {}, "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@pythnetwork/solana-utils/@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@pythnetwork/solana-utils/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@pythnetwork/solana-utils/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@pythnetwork/solana-utils/bs58/base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@solana/buffer-layout-utils/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@solana/buffer-layout-utils/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@solana/codecs-core/@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "@solana/codecs-data-structures/@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "@solana/codecs-strings/@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="], + + "@solana/options/@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/options/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "@switchboard-xyz/common/@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@switchboard-xyz/common/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@switchboard-xyz/common/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@switchboard-xyz/common/bs58/base-x": ["base-x@5.0.1", "", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], + + "@switchboard-xyz/on-demand/bs58/base-x": ["base-x@5.0.1", "", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "jito-ts/@solana/web3.js/superstruct": ["superstruct@0.14.2", "", {}, "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ=="], + + "jito-ts/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "jito-ts/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "jito-ts/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "jito-ts/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "solana-bankrun/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "solana-bankrun/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "solana-bankrun/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "typedoc/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@metaplex-foundation/solita/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@project-serum/anchor/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@project-serum/anchor/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@project-serum/anchor/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@project-serum/anchor/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@project-serum/anchor/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson": ["jayson@4.2.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-VfJ9t1YLwacIubLhONk0KFeosUBwstRWQ0IRT1KDjEjnVnSOVHC3uwugyV7L0c7R9lpVyrUGT2XWiBA1UTtpyg=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/rpc-websockets": ["rpc-websockets@9.1.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-I+kNjW0udB4Fetr3vvtRuYZJS0PcSPyyvBcH5sDdoV8DFs5E4W2pTr7aiMlKfPxANTClP9RlqCPolj9dd5MsEA=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@pythnetwork/solana-utils/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@solana/buffer-layout-utils/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@solana/codecs/@solana/codecs-numbers/@solana/errors/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], + + "@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@switchboard-xyz/common/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "jito-ts/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "solana-bankrun/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "solana-bankrun/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "solana-bankrun/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "solana-bankrun/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "solana-bankrun/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@metaplex-foundation/beet-solana/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@metaplex-foundation/solita/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@project-serum/anchor/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson/@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson/@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson/commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson/ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/rpc-websockets/eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], + + "@pythnetwork/pyth-solana-receiver/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@pythnetwork/solana-utils/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@solana/buffer-layout-utils/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@switchboard-xyz/common/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "solana-bankrun/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + + "@project-serum/serum/@solana/spl-token/@solana/web3.js/jayson/@types/ws/@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], + } +} diff --git a/sdk/src/accounts/grpcAccountSubscriber.ts b/sdk/src/accounts/baseSubscribers/grpcAccountSubscriber.ts similarity index 98% rename from sdk/src/accounts/grpcAccountSubscriber.ts rename to sdk/src/accounts/baseSubscribers/grpcAccountSubscriber.ts index 1ef65cd17c..1cf04d938c 100644 --- a/sdk/src/accounts/grpcAccountSubscriber.ts +++ b/sdk/src/accounts/baseSubscribers/grpcAccountSubscriber.ts @@ -1,4 +1,4 @@ -import { ResubOpts, GrpcConfigs } from './types'; +import { ResubOpts, GrpcConfigs } from '../types'; import { Program } from '@coral-xyz/anchor'; import { PublicKey } from '@solana/web3.js'; import * as Buffer from 'buffer'; @@ -11,7 +11,7 @@ import { createClient, SubscribeRequest, SubscribeUpdate, -} from '../isomorphic/grpc'; +} from '../../isomorphic/grpc'; export class grpcAccountSubscriber extends WebSocketAccountSubscriber { private client: Client; diff --git a/sdk/src/accounts/webSocketAccountSubscriber.ts b/sdk/src/accounts/baseSubscribers/webSocketAccountSubscriber.ts similarity index 99% rename from sdk/src/accounts/webSocketAccountSubscriber.ts rename to sdk/src/accounts/baseSubscribers/webSocketAccountSubscriber.ts index deee456166..08198c9a44 100644 --- a/sdk/src/accounts/webSocketAccountSubscriber.ts +++ b/sdk/src/accounts/baseSubscribers/webSocketAccountSubscriber.ts @@ -3,10 +3,10 @@ import { BufferAndSlot, AccountSubscriber, ResubOpts, -} from './types'; +} from '../types'; import { AnchorProvider, Program } from '@coral-xyz/anchor'; import { AccountInfo, Commitment, Context, PublicKey } from '@solana/web3.js'; -import { capitalize } from './utils'; +import { capitalize } from '../utils'; import * as Buffer from 'buffer'; export class WebSocketAccountSubscriber implements AccountSubscriber { diff --git a/sdk/src/accounts/bulkAccountLoader.ts b/sdk/src/accounts/bulkAccountLoader/bulkAccountLoader.ts similarity index 96% rename from sdk/src/accounts/bulkAccountLoader.ts rename to sdk/src/accounts/bulkAccountLoader/bulkAccountLoader.ts index c76d91b1cd..76191c03ea 100644 --- a/sdk/src/accounts/bulkAccountLoader.ts +++ b/sdk/src/accounts/bulkAccountLoader/bulkAccountLoader.ts @@ -1,9 +1,9 @@ import { Commitment, PublicKey } from '@solana/web3.js'; import { v4 as uuidv4 } from 'uuid'; -import { BufferAndSlot } from './types'; -import { promiseTimeout } from '../util/promiseTimeout'; -import { Connection } from '../bankrun/bankrunConnection'; -import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../constants/numericConstants'; +import { BufferAndSlot } from '../types'; +import { promiseTimeout } from '../../util/promiseTimeout'; +import { Connection } from '../../bankrun/bankrunConnection'; +import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../../constants/numericConstants'; export type AccountToLoad = { publicKey: PublicKey; diff --git a/sdk/src/accounts/customizedCadenceBulkAccountLoader.ts b/sdk/src/accounts/bulkAccountLoader/customizedCadenceBulkAccountLoader.ts similarity index 98% rename from sdk/src/accounts/customizedCadenceBulkAccountLoader.ts rename to sdk/src/accounts/bulkAccountLoader/customizedCadenceBulkAccountLoader.ts index c870cd6a66..c3774996da 100644 --- a/sdk/src/accounts/customizedCadenceBulkAccountLoader.ts +++ b/sdk/src/accounts/bulkAccountLoader/customizedCadenceBulkAccountLoader.ts @@ -1,4 +1,4 @@ -import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../constants/numericConstants'; +import { GET_MULTIPLE_ACCOUNTS_CHUNK_SIZE } from '../../constants/numericConstants'; import { BulkAccountLoader } from './bulkAccountLoader'; import { Commitment, Connection, PublicKey } from '@solana/web3.js'; import { v4 as uuidv4 } from 'uuid'; diff --git a/sdk/src/accounts/testBulkAccountLoader.ts b/sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader.ts similarity index 100% rename from sdk/src/accounts/testBulkAccountLoader.ts rename to sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader.ts diff --git a/sdk/src/accounts/bulkUserStatsSubscription.ts b/sdk/src/accounts/bulkUserStatsSubscription.ts index 5dca75611a..c2ebe62877 100644 --- a/sdk/src/accounts/bulkUserStatsSubscription.ts +++ b/sdk/src/accounts/bulkUserStatsSubscription.ts @@ -1,6 +1,6 @@ import { UserStats } from '../userStats'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { PollingUserStatsAccountSubscriber } from './pollingUserStatsAccountSubscriber'; +import { BulkAccountLoader } from './bulkAccountLoader/bulkAccountLoader'; +import { PollingUserStatsAccountSubscriber } from './userStatsAccount/pollingUserStatsAccountSubscriber'; /** * @param userStats diff --git a/sdk/src/accounts/bulkUserSubscription.ts b/sdk/src/accounts/bulkUserSubscription.ts index 3720486b3b..c0831c63fe 100644 --- a/sdk/src/accounts/bulkUserSubscription.ts +++ b/sdk/src/accounts/bulkUserSubscription.ts @@ -1,6 +1,6 @@ import { User } from '../user'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { PollingUserAccountSubscriber } from './pollingUserAccountSubscriber'; +import { BulkAccountLoader } from './bulkAccountLoader/bulkAccountLoader'; +import { PollingUserAccountSubscriber } from './userAccount/pollingUserAccountSubscriber'; /** * @param users diff --git a/sdk/src/accounts/grpcDriftClientAccountSubscriber.ts b/sdk/src/accounts/driftClientAccount/grpcDriftClientAccountSubscriber.ts similarity index 93% rename from sdk/src/accounts/grpcDriftClientAccountSubscriber.ts rename to sdk/src/accounts/driftClientAccount/grpcDriftClientAccountSubscriber.ts index 8545b5f029..ac60fda929 100644 --- a/sdk/src/accounts/grpcDriftClientAccountSubscriber.ts +++ b/sdk/src/accounts/driftClientAccount/grpcDriftClientAccountSubscriber.ts @@ -1,16 +1,20 @@ import { WebSocketDriftClientAccountSubscriber } from './webSocketDriftClientAccountSubscriber'; -import { OracleInfo, OraclePriceData } from '../oracles/types'; +import { OracleInfo, OraclePriceData } from '../../oracles/types'; import { Program } from '@coral-xyz/anchor'; -import { findAllMarketAndOracles } from '../config'; +import { findAllMarketAndOracles } from '../../config'; import { getDriftStateAccountPublicKey, getPerpMarketPublicKey, getSpotMarketPublicKey, -} from '../addresses/pda'; -import { DelistedMarketSetting, GrpcConfigs, ResubOpts } from './types'; -import { grpcAccountSubscriber } from './grpcAccountSubscriber'; -import { PerpMarketAccount, SpotMarketAccount, StateAccount } from '../types'; -import { getOracleId } from '../oracles/oracleId'; +} from '../../addresses/pda'; +import { DelistedMarketSetting, GrpcConfigs, ResubOpts } from '../types'; +import { grpcAccountSubscriber } from '../baseSubscribers/grpcAccountSubscriber'; +import { + PerpMarketAccount, + SpotMarketAccount, + StateAccount, +} from '../../types'; +import { getOracleId } from '../../oracles/oracleId'; export class gprcDriftClientAccountSubscriber extends WebSocketDriftClientAccountSubscriber { private grpcConfigs: GrpcConfigs; diff --git a/sdk/src/accounts/pollingDriftClientAccountSubscriber.ts b/sdk/src/accounts/driftClientAccount/pollingDriftClientAccountSubscriber.ts similarity index 97% rename from sdk/src/accounts/pollingDriftClientAccountSubscriber.ts rename to sdk/src/accounts/driftClientAccount/pollingDriftClientAccountSubscriber.ts index 18da8df653..6277d47855 100644 --- a/sdk/src/accounts/pollingDriftClientAccountSubscriber.ts +++ b/sdk/src/accounts/driftClientAccount/pollingDriftClientAccountSubscriber.ts @@ -6,7 +6,7 @@ import { DriftClientAccountSubscriber, NotSubscribedError, OraclesToPoll, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; @@ -16,20 +16,20 @@ import { StateAccount, UserAccount, OracleSource, -} from '../types'; +} from '../../types'; import { getDriftStateAccountPublicKey, getPerpMarketPublicKey, getSpotMarketPublicKey, -} from '../addresses/pda'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { capitalize, findDelistedPerpMarketsAndOracles } from './utils'; +} from '../../addresses/pda'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; +import { capitalize, findDelistedPerpMarketsAndOracles } from '../utils'; import { PublicKey } from '@solana/web3.js'; -import { OracleInfo, OraclePriceData } from '../oracles/types'; -import { OracleClientCache } from '../oracles/oracleClientCache'; -import { QUOTE_ORACLE_PRICE_DATA } from '../oracles/quoteAssetOracleClient'; -import { findAllMarketAndOracles } from '../config'; -import { getOracleId } from '../oracles/oracleId'; +import { OracleInfo, OraclePriceData } from '../../oracles/types'; +import { OracleClientCache } from '../../oracles/oracleClientCache'; +import { QUOTE_ORACLE_PRICE_DATA } from '../../oracles/quoteAssetOracleClient'; +import { findAllMarketAndOracles } from '../../config'; +import { getOracleId } from '../../oracles/oracleId'; const ORACLE_DEFAULT_ID = getOracleId( PublicKey.default, diff --git a/sdk/src/accounts/webSocketDriftClientAccountSubscriber.ts b/sdk/src/accounts/driftClientAccount/webSocketDriftClientAccountSubscriber.ts similarity index 96% rename from sdk/src/accounts/webSocketDriftClientAccountSubscriber.ts rename to sdk/src/accounts/driftClientAccount/webSocketDriftClientAccountSubscriber.ts index c49d425796..4d05f4ef2a 100644 --- a/sdk/src/accounts/webSocketDriftClientAccountSubscriber.ts +++ b/sdk/src/accounts/driftClientAccount/webSocketDriftClientAccountSubscriber.ts @@ -6,8 +6,12 @@ import { DriftClientAccountSubscriber, NotSubscribedError, ResubOpts, -} from './types'; -import { PerpMarketAccount, SpotMarketAccount, StateAccount } from '../types'; +} from '../types'; +import { + PerpMarketAccount, + SpotMarketAccount, + StateAccount, +} from '../../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; @@ -17,17 +21,17 @@ import { getPerpMarketPublicKeySync, getSpotMarketPublicKey, getSpotMarketPublicKeySync, -} from '../addresses/pda'; -import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber'; +} from '../../addresses/pda'; +import { WebSocketAccountSubscriber } from '../baseSubscribers/webSocketAccountSubscriber'; import { Commitment, PublicKey } from '@solana/web3.js'; -import { OracleInfo, OraclePriceData } from '../oracles/types'; -import { OracleClientCache } from '../oracles/oracleClientCache'; +import { OracleInfo, OraclePriceData } from '../../oracles/types'; +import { OracleClientCache } from '../../oracles/oracleClientCache'; import * as Buffer from 'buffer'; -import { QUOTE_ORACLE_PRICE_DATA } from '../oracles/quoteAssetOracleClient'; -import { findAllMarketAndOracles } from '../config'; -import { findDelistedPerpMarketsAndOracles } from './utils'; -import { getOracleId } from '../oracles/oracleId'; -import { OracleSource } from '../types'; +import { QUOTE_ORACLE_PRICE_DATA } from '../../oracles/quoteAssetOracleClient'; +import { findAllMarketAndOracles } from '../../config'; +import { findDelistedPerpMarketsAndOracles } from '../utils'; +import { getOracleId } from '../../oracles/oracleId'; +import { OracleSource } from '../../types'; const ORACLE_DEFAULT_ID = getOracleId( PublicKey.default, diff --git a/sdk/src/accounts/pollingHighLeverageModeConfigAccountSubscriber.ts b/sdk/src/accounts/highLeverageModeConfigAccount/pollingHighLeverageModeConfigAccountSubscriber.ts similarity index 96% rename from sdk/src/accounts/pollingHighLeverageModeConfigAccountSubscriber.ts rename to sdk/src/accounts/highLeverageModeConfigAccount/pollingHighLeverageModeConfigAccountSubscriber.ts index 6b7f2a0f65..78009b6f5f 100644 --- a/sdk/src/accounts/pollingHighLeverageModeConfigAccountSubscriber.ts +++ b/sdk/src/accounts/highLeverageModeConfigAccount/pollingHighLeverageModeConfigAccountSubscriber.ts @@ -3,13 +3,13 @@ import { NotSubscribedError, HighLeverageModeConfigAccountEvents, HighLeverageModeConfigAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { HighLeverageModeConfig } from '../types'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; +import { HighLeverageModeConfig } from '../../types'; export class PollingHighLeverageModeConfigAccountSubscriber implements HighLeverageModeConfigAccountSubscriber diff --git a/sdk/src/accounts/webSocketHighLeverageModeConfigAccountSubscriber.ts b/sdk/src/accounts/highLeverageModeConfigAccount/webSocketHighLeverageModeConfigAccountSubscriber.ts similarity index 95% rename from sdk/src/accounts/webSocketHighLeverageModeConfigAccountSubscriber.ts rename to sdk/src/accounts/highLeverageModeConfigAccount/webSocketHighLeverageModeConfigAccountSubscriber.ts index 0742f6b1fa..735535b2d2 100644 --- a/sdk/src/accounts/webSocketHighLeverageModeConfigAccountSubscriber.ts +++ b/sdk/src/accounts/highLeverageModeConfigAccount/webSocketHighLeverageModeConfigAccountSubscriber.ts @@ -4,13 +4,13 @@ import { NotSubscribedError, HighLeverageModeConfigAccountEvents, HighLeverageModeConfigAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { Commitment, PublicKey } from '@solana/web3.js'; -import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber'; -import { HighLeverageModeConfig } from '../types'; +import { WebSocketAccountSubscriber } from '../baseSubscribers/webSocketAccountSubscriber'; +import { HighLeverageModeConfig } from '../../types'; export class WebSocketHighLeverageModeConfigAccountSubscriber implements HighLeverageModeConfigAccountSubscriber diff --git a/sdk/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts b/sdk/src/accounts/insuranceFundStakeAccount/grpcInsuranceFundStakeAccountSubscriber.ts similarity index 89% rename from sdk/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts rename to sdk/src/accounts/insuranceFundStakeAccount/grpcInsuranceFundStakeAccountSubscriber.ts index 56aa167b7e..00ceae93fb 100644 --- a/sdk/src/accounts/grpcInsuranceFundStakeAccountSubscriber.ts +++ b/sdk/src/accounts/insuranceFundStakeAccount/grpcInsuranceFundStakeAccountSubscriber.ts @@ -1,9 +1,9 @@ -import { GrpcConfigs } from './types'; +import { GrpcConfigs } from '../types'; import { Program } from '@coral-xyz/anchor'; import { PublicKey } from '@solana/web3.js'; -import { InsuranceFundStake } from '../types'; +import { InsuranceFundStake } from '../../types'; import { WebSocketInsuranceFundStakeAccountSubscriber } from './webSocketInsuranceFundStakeAccountSubscriber'; -import { grpcAccountSubscriber } from './grpcAccountSubscriber'; +import { grpcAccountSubscriber } from '../baseSubscribers/grpcAccountSubscriber'; export class grpcInsuranceFundStakeAccountSubscriber extends WebSocketInsuranceFundStakeAccountSubscriber { private grpcConfigs: GrpcConfigs; diff --git a/sdk/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts b/sdk/src/accounts/insuranceFundStakeAccount/pollingInsuranceFundStakeAccountSubscriber.ts similarity index 96% rename from sdk/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts rename to sdk/src/accounts/insuranceFundStakeAccount/pollingInsuranceFundStakeAccountSubscriber.ts index bca1c04ac7..32bf6dc91a 100644 --- a/sdk/src/accounts/pollingInsuranceFundStakeAccountSubscriber.ts +++ b/sdk/src/accounts/insuranceFundStakeAccount/pollingInsuranceFundStakeAccountSubscriber.ts @@ -3,13 +3,13 @@ import { NotSubscribedError, InsuranceFundStakeAccountEvents, InsuranceFundStakeAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { InsuranceFundStake } from '../types'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; +import { InsuranceFundStake } from '../../types'; export class PollingInsuranceFundStakeAccountSubscriber implements InsuranceFundStakeAccountSubscriber diff --git a/sdk/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts b/sdk/src/accounts/insuranceFundStakeAccount/webSocketInsuranceFundStakeAccountSubscriber.ts similarity index 95% rename from sdk/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts rename to sdk/src/accounts/insuranceFundStakeAccount/webSocketInsuranceFundStakeAccountSubscriber.ts index bc8042a7ae..0f0844481c 100644 --- a/sdk/src/accounts/webSocketInsuranceFundStakeAccountSubscriber.ts +++ b/sdk/src/accounts/insuranceFundStakeAccount/webSocketInsuranceFundStakeAccountSubscriber.ts @@ -4,13 +4,13 @@ import { NotSubscribedError, InsuranceFundStakeAccountEvents, InsuranceFundStakeAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { Commitment, PublicKey } from '@solana/web3.js'; -import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber'; -import { InsuranceFundStake } from '../types'; +import { WebSocketAccountSubscriber } from '../baseSubscribers/webSocketAccountSubscriber'; +import { InsuranceFundStake } from '../../types'; export class WebSocketInsuranceFundStakeAccountSubscriber implements InsuranceFundStakeAccountSubscriber diff --git a/sdk/src/accounts/pollingOracleAccountSubscriber.ts b/sdk/src/accounts/oracleAccount/pollingOracleAccountSubscriber.ts similarity index 94% rename from sdk/src/accounts/pollingOracleAccountSubscriber.ts rename to sdk/src/accounts/oracleAccount/pollingOracleAccountSubscriber.ts index bdb6e74343..49ee8c6405 100644 --- a/sdk/src/accounts/pollingOracleAccountSubscriber.ts +++ b/sdk/src/accounts/oracleAccount/pollingOracleAccountSubscriber.ts @@ -3,13 +3,13 @@ import { NotSubscribedError, OracleEvents, OracleAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './bulkAccountLoader'; -import { OracleClient, OraclePriceData } from '../oracles/types'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; +import { OracleClient, OraclePriceData } from '../../oracles/types'; export class PollingOracleAccountSubscriber implements OracleAccountSubscriber { isSubscribed: boolean; diff --git a/sdk/src/accounts/grpcProgramAccountSubscriber.ts b/sdk/src/accounts/programAccount/grpcProgramAccountSubscriber.ts similarity index 98% rename from sdk/src/accounts/grpcProgramAccountSubscriber.ts rename to sdk/src/accounts/programAccount/grpcProgramAccountSubscriber.ts index d669b508e9..323ab76848 100644 --- a/sdk/src/accounts/grpcProgramAccountSubscriber.ts +++ b/sdk/src/accounts/programAccount/grpcProgramAccountSubscriber.ts @@ -1,4 +1,4 @@ -import { ResubOpts, GrpcConfigs } from './types'; +import { ResubOpts, GrpcConfigs } from '../types'; import { Program } from '@coral-xyz/anchor'; import bs58 from 'bs58'; import { Context, MemcmpFilter, PublicKey } from '@solana/web3.js'; @@ -11,7 +11,7 @@ import { createClient, SubscribeRequest, SubscribeUpdate, -} from '../isomorphic/grpc'; +} from '../../isomorphic/grpc'; export class grpcProgramAccountSubscriber< T, diff --git a/sdk/src/accounts/webSocketProgramAccountSubscriber.ts b/sdk/src/accounts/programAccount/webSocketProgramAccountSubscriber.ts similarity index 99% rename from sdk/src/accounts/webSocketProgramAccountSubscriber.ts rename to sdk/src/accounts/programAccount/webSocketProgramAccountSubscriber.ts index d860477583..63c7111d0f 100644 --- a/sdk/src/accounts/webSocketProgramAccountSubscriber.ts +++ b/sdk/src/accounts/programAccount/webSocketProgramAccountSubscriber.ts @@ -1,4 +1,4 @@ -import { BufferAndSlot, ProgramAccountSubscriber, ResubOpts } from './types'; +import { BufferAndSlot, ProgramAccountSubscriber, ResubOpts } from '../types'; import { AnchorProvider, Program } from '@coral-xyz/anchor'; import { Commitment, diff --git a/sdk/src/accounts/pollingTokenAccountSubscriber.ts b/sdk/src/accounts/tokenAccount/pollingTokenAccountSubscriber.ts similarity index 95% rename from sdk/src/accounts/pollingTokenAccountSubscriber.ts rename to sdk/src/accounts/tokenAccount/pollingTokenAccountSubscriber.ts index 398b462032..37ad965943 100644 --- a/sdk/src/accounts/pollingTokenAccountSubscriber.ts +++ b/sdk/src/accounts/tokenAccount/pollingTokenAccountSubscriber.ts @@ -3,14 +3,14 @@ import { NotSubscribedError, TokenAccountEvents, TokenAccountSubscriber, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './bulkAccountLoader'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; import { Account } from '@solana/spl-token'; -import { parseTokenAccount } from '../token'; +import { parseTokenAccount } from '../../token'; export class PollingTokenAccountSubscriber implements TokenAccountSubscriber { isSubscribed: boolean; diff --git a/sdk/src/accounts/types.ts b/sdk/src/accounts/types.ts index 26bb9cfb49..4845bd1099 100644 --- a/sdk/src/accounts/types.ts +++ b/sdk/src/accounts/types.ts @@ -13,7 +13,6 @@ import { EventEmitter } from 'events'; import { Context, PublicKey } from '@solana/web3.js'; import { Account } from '@solana/spl-token'; import { OracleInfo, OraclePriceData } from '../oracles/types'; -import { User } from '../user'; import { ChannelOptions, CommitmentLevel } from '../isomorphic/grpc'; export interface AccountSubscriber { @@ -103,12 +102,6 @@ export interface UserAccountEvents { error: (e: Error) => void; } -export interface UserEvents { - userUpdate: (payload: User) => void; - update: void; - error: (e: Error) => void; -} - export interface UserAccountSubscriber { eventEmitter: StrictEventEmitter; isSubscribed: boolean; diff --git a/sdk/src/accounts/basicUserAccountSubscriber.ts b/sdk/src/accounts/userAccount/basicUserAccountSubscriber.ts similarity index 92% rename from sdk/src/accounts/basicUserAccountSubscriber.ts rename to sdk/src/accounts/userAccount/basicUserAccountSubscriber.ts index c8731f82fa..848840a9f3 100644 --- a/sdk/src/accounts/basicUserAccountSubscriber.ts +++ b/sdk/src/accounts/userAccount/basicUserAccountSubscriber.ts @@ -1,8 +1,12 @@ -import { DataAndSlot, UserAccountEvents, UserAccountSubscriber } from './types'; +import { + DataAndSlot, + UserAccountEvents, + UserAccountSubscriber, +} from '../types'; import { PublicKey } from '@solana/web3.js'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; -import { UserAccount } from '../types'; +import { UserAccount } from '../../types'; /** * Basic implementation of UserAccountSubscriber. It will only take in UserAccount diff --git a/sdk/src/accounts/grpcUserAccountSubscriber.ts b/sdk/src/accounts/userAccount/grpcUserAccountSubscriber.ts similarity index 86% rename from sdk/src/accounts/grpcUserAccountSubscriber.ts rename to sdk/src/accounts/userAccount/grpcUserAccountSubscriber.ts index db3ad1225a..68013565d1 100644 --- a/sdk/src/accounts/grpcUserAccountSubscriber.ts +++ b/sdk/src/accounts/userAccount/grpcUserAccountSubscriber.ts @@ -1,9 +1,9 @@ -import { ResubOpts, GrpcConfigs } from './types'; +import { ResubOpts, GrpcConfigs } from '../types'; import { Program } from '@coral-xyz/anchor'; import { PublicKey } from '@solana/web3.js'; -import { UserAccount } from '../types'; +import { UserAccount } from '../../types'; import { WebSocketUserAccountSubscriber } from './webSocketUserAccountSubscriber'; -import { grpcAccountSubscriber } from './grpcAccountSubscriber'; +import { grpcAccountSubscriber } from '../baseSubscribers/grpcAccountSubscriber'; export class grpcUserAccountSubscriber extends WebSocketUserAccountSubscriber { private grpcConfigs: GrpcConfigs; diff --git a/sdk/src/accounts/oneShotUserAccountSubscriber.ts b/sdk/src/accounts/userAccount/oneShotUserAccountSubscriber.ts similarity index 94% rename from sdk/src/accounts/oneShotUserAccountSubscriber.ts rename to sdk/src/accounts/userAccount/oneShotUserAccountSubscriber.ts index 263bfa03d6..b901020b0b 100644 --- a/sdk/src/accounts/oneShotUserAccountSubscriber.ts +++ b/sdk/src/accounts/userAccount/oneShotUserAccountSubscriber.ts @@ -1,8 +1,8 @@ import { Commitment, PublicKey } from '@solana/web3.js'; -import { UserAccount } from '../types'; +import { UserAccount } from '../../types'; import { BasicUserAccountSubscriber } from './basicUserAccountSubscriber'; import { Program } from '@coral-xyz/anchor'; -import { UserAccountSubscriber } from './types'; +import { UserAccountSubscriber } from '../types'; /** * Simple implementation of UserAccountSubscriber. It will fetch the UserAccount diff --git a/sdk/src/accounts/pollingUserAccountSubscriber.ts b/sdk/src/accounts/userAccount/pollingUserAccountSubscriber.ts similarity index 94% rename from sdk/src/accounts/pollingUserAccountSubscriber.ts rename to sdk/src/accounts/userAccount/pollingUserAccountSubscriber.ts index d5d7bffeaa..1af3f0f74b 100644 --- a/sdk/src/accounts/pollingUserAccountSubscriber.ts +++ b/sdk/src/accounts/userAccount/pollingUserAccountSubscriber.ts @@ -3,13 +3,13 @@ import { NotSubscribedError, UserAccountEvents, UserAccountSubscriber, -} from './types'; -import { Connection } from '../bankrun/bankrunConnection'; +} from '../types'; +import { Connection } from '../../bankrun/bankrunConnection'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { UserAccount } from '../types'; -import { BulkAccountLoader } from './bulkAccountLoader'; +import { UserAccount } from '../../types'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; export class PollingUserAccountSubscriber implements UserAccountSubscriber { isSubscribed: boolean; diff --git a/sdk/src/accounts/webSocketUserAccountSubscriber.ts b/sdk/src/accounts/userAccount/webSocketUserAccountSubscriber.ts similarity index 94% rename from sdk/src/accounts/webSocketUserAccountSubscriber.ts rename to sdk/src/accounts/userAccount/webSocketUserAccountSubscriber.ts index 79d6f9401f..f2ad1fe772 100644 --- a/sdk/src/accounts/webSocketUserAccountSubscriber.ts +++ b/sdk/src/accounts/userAccount/webSocketUserAccountSubscriber.ts @@ -5,13 +5,13 @@ import { UserAccountEvents, UserAccountSubscriber, ResubOpts, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { Commitment, PublicKey } from '@solana/web3.js'; -import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber'; -import { UserAccount } from '../types'; +import { WebSocketAccountSubscriber } from '../baseSubscribers/webSocketAccountSubscriber'; +import { UserAccount } from '../../types'; export class WebSocketUserAccountSubscriber implements UserAccountSubscriber { isSubscribed: boolean; diff --git a/sdk/src/accounts/grpcUserStatsAccountSubscriber.ts b/sdk/src/accounts/userStatsAccount/grpcUserStatsAccountSubscriber.ts similarity index 87% rename from sdk/src/accounts/grpcUserStatsAccountSubscriber.ts rename to sdk/src/accounts/userStatsAccount/grpcUserStatsAccountSubscriber.ts index 2998e5884f..46d5abef45 100644 --- a/sdk/src/accounts/grpcUserStatsAccountSubscriber.ts +++ b/sdk/src/accounts/userStatsAccount/grpcUserStatsAccountSubscriber.ts @@ -1,9 +1,9 @@ -import { ResubOpts, GrpcConfigs } from './types'; +import { ResubOpts, GrpcConfigs } from '../types'; import { Program } from '@coral-xyz/anchor'; import { PublicKey } from '@solana/web3.js'; -import { UserStatsAccount } from '../types'; +import { UserStatsAccount } from '../../types'; import { WebSocketUserStatsAccountSubscriber } from './webSocketUserStatsAccountSubsriber'; -import { grpcAccountSubscriber } from './grpcAccountSubscriber'; +import { grpcAccountSubscriber } from '../baseSubscribers/grpcAccountSubscriber'; export class grpcUserStatsAccountSubscriber extends WebSocketUserStatsAccountSubscriber { private grpcConfigs: GrpcConfigs; diff --git a/sdk/src/accounts/pollingUserStatsAccountSubscriber.ts b/sdk/src/accounts/userStatsAccount/pollingUserStatsAccountSubscriber.ts similarity index 96% rename from sdk/src/accounts/pollingUserStatsAccountSubscriber.ts rename to sdk/src/accounts/userStatsAccount/pollingUserStatsAccountSubscriber.ts index d146c31dc8..7a8cba922b 100644 --- a/sdk/src/accounts/pollingUserStatsAccountSubscriber.ts +++ b/sdk/src/accounts/userStatsAccount/pollingUserStatsAccountSubscriber.ts @@ -3,13 +3,13 @@ import { NotSubscribedError, UserStatsAccountSubscriber, UserStatsAccountEvents, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { PublicKey } from '@solana/web3.js'; -import { UserStatsAccount } from '../types'; -import { BulkAccountLoader } from './bulkAccountLoader'; +import { UserStatsAccount } from '../../types'; +import { BulkAccountLoader } from '../bulkAccountLoader/bulkAccountLoader'; export class PollingUserStatsAccountSubscriber implements UserStatsAccountSubscriber diff --git a/sdk/src/accounts/webSocketUserStatsAccountSubsriber.ts b/sdk/src/accounts/userStatsAccount/webSocketUserStatsAccountSubsriber.ts similarity index 93% rename from sdk/src/accounts/webSocketUserStatsAccountSubsriber.ts rename to sdk/src/accounts/userStatsAccount/webSocketUserStatsAccountSubsriber.ts index fdc0be5507..29b0e7f1cc 100644 --- a/sdk/src/accounts/webSocketUserStatsAccountSubsriber.ts +++ b/sdk/src/accounts/userStatsAccount/webSocketUserStatsAccountSubsriber.ts @@ -5,13 +5,13 @@ import { UserStatsAccountSubscriber, UserStatsAccountEvents, ResubOpts, -} from './types'; +} from '../types'; import { Program } from '@coral-xyz/anchor'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { Commitment, PublicKey } from '@solana/web3.js'; -import { WebSocketAccountSubscriber } from './webSocketAccountSubscriber'; -import { UserStatsAccount } from '../types'; +import { WebSocketAccountSubscriber } from '../baseSubscribers/webSocketAccountSubscriber'; +import { UserStatsAccount } from '../../types'; export class WebSocketUserStatsAccountSubscriber implements UserStatsAccountSubscriber diff --git a/sdk/src/auctionSubscriber/auctionSubscriber.ts b/sdk/src/auctionSubscriber/auctionSubscriber.ts index 8ffc893713..75b35965e1 100644 --- a/sdk/src/auctionSubscriber/auctionSubscriber.ts +++ b/sdk/src/auctionSubscriber/auctionSubscriber.ts @@ -5,7 +5,7 @@ import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { UserAccount } from '../types'; import { ConfirmOptions, Context, PublicKey } from '@solana/web3.js'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { ResubOpts } from '../accounts/types'; export class AuctionSubscriber { diff --git a/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts b/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts index 75212d376e..ca83f90e49 100644 --- a/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts +++ b/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts @@ -5,9 +5,9 @@ import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { UserAccount } from '../types'; import { ConfirmOptions, Context, PublicKey } from '@solana/web3.js'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { GrpcConfigs, ResubOpts } from '../accounts/types'; -import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber'; +import { grpcProgramAccountSubscriber } from '../accounts/programAccount/grpcProgramAccountSubscriber'; export class AuctionSubscriberGrpc { private driftClient: DriftClient; diff --git a/sdk/src/config.ts b/sdk/src/config/index.ts similarity index 96% rename from sdk/src/config.ts rename to sdk/src/config/index.ts index 0ff967b7ad..8231f130c7 100644 --- a/sdk/src/config.ts +++ b/sdk/src/config/index.ts @@ -1,24 +1,25 @@ import { ConfirmOptions, PublicKey } from '@solana/web3.js'; -import { PerpMarketAccount, SpotMarketAccount } from './types'; +import { PerpMarketAccount, SpotMarketAccount } from '../types'; import { DevnetPerpMarkets, MainnetPerpMarkets, PerpMarketConfig, PerpMarkets, -} from './constants/perpMarkets'; +} from '../constants/perpMarkets'; import { SpotMarketConfig, SpotMarkets, DevnetSpotMarkets, MainnetSpotMarkets, -} from './constants/spotMarkets'; -import { OracleInfo } from './oracles/types'; +} from '../constants/spotMarkets'; +import { OracleInfo } from '../oracles/types'; import { Program, ProgramAccount } from '@coral-xyz/anchor'; import { ON_DEMAND_DEVNET_PID, ON_DEMAND_MAINNET_PID, } from '@switchboard-xyz/on-demand'; -import { getOracleId } from './oracles/oracleId'; +import { getOracleId } from '../oracles/oracleId'; +import { DriftEnv } from './types'; type DriftConfig = { ENV: DriftEnv; @@ -41,8 +42,6 @@ type DriftConfig = { SB_ON_DEMAND_PID: PublicKey; }; -export type DriftEnv = 'devnet' | 'mainnet-beta'; - export const DRIFT_PROGRAM_ID = 'dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH'; export const DRIFT_ORACLE_RECEIVER_ID = 'G6EoTTTgpkNBtVXo96EQp2m6uwwVh2Kt6YidjkmQqoha'; diff --git a/sdk/src/config/types.ts b/sdk/src/config/types.ts new file mode 100644 index 0000000000..392e884514 --- /dev/null +++ b/sdk/src/config/types.ts @@ -0,0 +1 @@ +export type DriftEnv = 'devnet' | 'mainnet-beta'; diff --git a/sdk/src/constants/perpMarkets.ts b/sdk/src/constants/perpMarkets.ts index d23acbe648..97a0bb2d20 100644 --- a/sdk/src/constants/perpMarkets.ts +++ b/sdk/src/constants/perpMarkets.ts @@ -1,6 +1,6 @@ import { PublicKey } from '@solana/web3.js'; import { OracleSource } from '../types'; -import { DriftEnv } from '../config'; +import { DriftEnv } from '../config/types'; export type PerpMarketConfig = { fullName?: string; diff --git a/sdk/src/constants/spotMarkets.ts b/sdk/src/constants/spotMarkets.ts index a732ea2270..c6a99df420 100644 --- a/sdk/src/constants/spotMarkets.ts +++ b/sdk/src/constants/spotMarkets.ts @@ -11,7 +11,7 @@ import { } from './numericConstants'; import { OracleSource } from '../types'; import { BN } from '@coral-xyz/anchor'; -import { DriftEnv } from '../config'; +import { DriftEnv } from '../config/types'; export type SpotMarketConfig = { symbol: string; diff --git a/sdk/src/dlob/DLOB.ts b/sdk/src/dlob/DLOB.ts index 92fb572c22..4bfa7e1350 100644 --- a/sdk/src/dlob/DLOB.ts +++ b/sdk/src/dlob/DLOB.ts @@ -1,4 +1,5 @@ -import { getOrderSignature, NodeList } from './NodeList'; +import { NodeList } from './NodeList'; +import { getOrderSignature } from './utils'; import { BN } from '@coral-xyz/anchor'; import { BASE_PRECISION, @@ -8,8 +9,8 @@ import { ZERO, } from '../constants/numericConstants'; import { decodeName } from '../userName'; -import { DLOBNode, DLOBNodeType, TriggerOrderNode } from './DLOBNode'; -import { DriftClient } from '../driftClient'; +import { DLOBNode, DLOBNodeType } from './DLOBNode'; +import { IDriftClient } from '../driftClient/types'; import { calculateOrderBaseAssetAmount, getLimitPrice, @@ -33,9 +34,18 @@ import { } from '../types'; import { isUserProtectedMaker } from '../math/userStatus'; import { OraclePriceData } from '../oracles/types'; -import { ProtectMakerParamsMap } from './types'; +import { + DLOBFilterFcn, + DLOBOrders, + IDLOB, + MarketNodeLists, + NodeToFill, + NodeToTrigger, + OrderBookCallback, + ProtectMakerParamsMap, +} from './types'; import { SlotSubscriber } from '../slot/SlotSubscriber'; -import { UserMap } from '../userMap/userMap'; +import { IUserMap } from '../userMap/types'; import { PublicKey } from '@solana/web3.js'; import { ammPaused, exchangePaused, fillPaused } from '../math/exchangeStatus'; import { @@ -50,59 +60,6 @@ import { import { isFallbackAvailableLiquiditySource } from '../math/auction'; import { convertToNumber } from '../math/conversion'; -export type DLOBOrder = { user: PublicKey; order: Order }; -export type DLOBOrders = DLOBOrder[]; - -export type MarketNodeLists = { - restingLimit: { - ask: NodeList<'restingLimit'>; - bid: NodeList<'restingLimit'>; - }; - floatingLimit: { - ask: NodeList<'floatingLimit'>; - bid: NodeList<'floatingLimit'>; - }; - protectedFloatingLimit: { - ask: NodeList<'protectedFloatingLimit'>; - bid: NodeList<'protectedFloatingLimit'>; - }; - takingLimit: { - ask: NodeList<'takingLimit'>; - bid: NodeList<'takingLimit'>; - }; - market: { - ask: NodeList<'market'>; - bid: NodeList<'market'>; - }; - trigger: { - above: NodeList<'trigger'>; - below: NodeList<'trigger'>; - }; - signedMsg: { - ask: NodeList<'signedMsg'>; - bid: NodeList<'signedMsg'>; - }; -}; - -type OrderBookCallback = () => void; - -/** - * Receives a DLOBNode and is expected to return true if the node should - * be taken into account when generating, or false otherwise. - * - * Currently used in functions that rely on getBestNode - */ -export type DLOBFilterFcn = (node: DLOBNode) => boolean; - -export type NodeToFill = { - node: DLOBNode; - makerNodes: DLOBNode[]; -}; - -export type NodeToTrigger = { - node: TriggerOrderNode; -}; - const SUPPORTED_ORDER_TYPES = [ 'market', 'limit', @@ -111,7 +68,7 @@ const SUPPORTED_ORDER_TYPES = [ 'oracle', ]; -export class DLOB { +export class DLOB implements IDLOB { openOrders = new Map>(); orderLists = new Map>(); maxSlotForRestingLimitOrders = 0; @@ -166,7 +123,7 @@ export class DLOB { * @returns a promise that resolves when the DLOB is initialized */ public async initFromUserMap( - userMap: UserMap, + userMap: IUserMap, slot: number ): Promise { if (this.initialized) { @@ -1628,7 +1585,7 @@ export class DLOB { } public printTop( - driftClient: DriftClient, + driftClient: IDriftClient, slotSubscriber: SlotSubscriber, marketIndex: number, marketType: MarketType diff --git a/sdk/src/dlob/DLOBNode.ts b/sdk/src/dlob/DLOBNode.ts index a789583ce1..fb5429eaeb 100644 --- a/sdk/src/dlob/DLOBNode.ts +++ b/sdk/src/dlob/DLOBNode.ts @@ -8,7 +8,7 @@ import { getLimitPrice } from '../math/orders'; import { isVariant, Order, ProtectedMakerParams } from '../types'; import { OraclePriceData } from '../oracles/types'; import { convertToNumber } from '../math/conversion'; -import { getOrderSignature } from './NodeList'; +import { getOrderSignature } from './utils'; export interface DLOBNode { getPrice(oraclePriceData: OraclePriceData, slot: number): BN; diff --git a/sdk/src/dlob/DLOBSubscriber.ts b/sdk/src/dlob/DLOBSubscriber.ts index 431302c011..111d231dc6 100644 --- a/sdk/src/dlob/DLOBSubscriber.ts +++ b/sdk/src/dlob/DLOBSubscriber.ts @@ -5,10 +5,10 @@ import { DLOBSource, DLOBSubscriberEvents, DLOBSubscriptionConfig, + IDLOB, ProtectMakerParamsMap, SlotSource, } from './types'; -import { DriftClient } from '../driftClient'; import { isVariant, MarketType } from '../types'; import { DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS, @@ -19,14 +19,15 @@ import { L3OrderBook, } from './orderBookLevels'; import { getProtectedMakerParamsMap } from '../math/protectedMakerParams'; +import { IDriftClient } from '../driftClient/types'; export class DLOBSubscriber { - driftClient: DriftClient; + driftClient: IDriftClient; dlobSource: DLOBSource; slotSource: SlotSource; updateFrequency: number; intervalId?: ReturnType; - dlob: DLOB; + dlob: IDLOB; public eventEmitter: StrictEventEmitter; protectedMakerView: boolean; constructor(config: DLOBSubscriptionConfig) { @@ -69,7 +70,7 @@ export class DLOBSubscriber { ); } - public getDLOB(): DLOB { + public getDLOB(): IDLOB { return this.dlob; } diff --git a/sdk/src/dlob/NodeList.ts b/sdk/src/dlob/NodeList.ts index 4462446b3b..b53bf5eea5 100644 --- a/sdk/src/dlob/NodeList.ts +++ b/sdk/src/dlob/NodeList.ts @@ -5,17 +5,11 @@ import { ProtectedMakerParams, } from '../types'; import { createNode, DLOBNode, DLOBNodeMap } from './DLOBNode'; -import { BN } from '@coral-xyz/anchor'; +import { getOrderSignature } from './utils'; +import { BN } from '../index'; export type SortDirection = 'asc' | 'desc'; -export function getOrderSignature( - orderId: number, - userAccount: string -): string { - return `${userAccount.toString()}-${orderId.toString()}`; -} - export interface DLOBNodeGenerator { getGenerator(): Generator; } diff --git a/sdk/src/dlob/orderBookLevels.ts b/sdk/src/dlob/orderBookLevels.ts index 41022f4998..c5f290c2c4 100644 --- a/sdk/src/dlob/orderBookLevels.ts +++ b/sdk/src/dlob/orderBookLevels.ts @@ -24,7 +24,8 @@ import { } from '../types'; import { OraclePriceData } from '../oracles/types'; import { PublicKey } from '@solana/web3.js'; -import { standardizeBaseAssetAmount, standardizePrice } from '../math/orders'; +import { standardizePrice } from '../math/orders'; +import { standardizeBaseAssetAmount } from '../math/utils'; type liquiditySource = | 'serum' diff --git a/sdk/src/dlob/types.ts b/sdk/src/dlob/types.ts index 6b3c158436..0e05c17184 100644 --- a/sdk/src/dlob/types.ts +++ b/sdk/src/dlob/types.ts @@ -1,10 +1,29 @@ -import { DLOB } from './DLOB'; -import { DriftClient } from '../driftClient'; -import { ProtectedMakerParams } from '../types'; +import { + MarketType, + Order, + PerpMarketAccount, + PositionDirection, + ProtectedMakerParams, + SpotMarketAccount, + StateAccount, +} from '../types'; import { MarketTypeStr } from '../types'; +import { PublicKey } from '@solana/web3.js'; +import { DLOBNode, DLOBNodeType, TriggerOrderNode } from './DLOBNode'; +import { BN } from '@coral-xyz/anchor'; +import { OraclePriceData } from '../oracles/types'; +import { NodeList } from './NodeList'; +import { SlotSubscriber } from '../slot/SlotSubscriber'; +import { + L2OrderBook, + L2OrderBookGenerator, + L3OrderBook, +} from './orderBookLevels'; +import { IDriftClient } from '../driftClient/types'; +import { IUserMap } from '../userMap/types'; export type DLOBSubscriptionConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; dlobSource: DLOBSource; slotSource: SlotSource; updateFrequency: number; @@ -12,7 +31,7 @@ export type DLOBSubscriptionConfig = { }; export interface DLOBSubscriberEvents { - update: (dlob: DLOB) => void; + update: (dlob: IDLOB) => void; error: (e: Error) => void; } @@ -20,7 +39,7 @@ export interface DLOBSource { getDLOB( slot: number, protectedMakerParamsMap?: ProtectMakerParamsMap - ): Promise; + ): Promise; } export interface SlotSource { @@ -30,3 +49,406 @@ export interface SlotSource { export type ProtectMakerParamsMap = { [marketType in MarketTypeStr]: Map; }; + +export type DLOBOrder = { user: PublicKey; order: Order }; +export type DLOBOrders = DLOBOrder[]; + +export type MarketNodeLists = { + restingLimit: { + ask: NodeList<'restingLimit'>; + bid: NodeList<'restingLimit'>; + }; + floatingLimit: { + ask: NodeList<'floatingLimit'>; + bid: NodeList<'floatingLimit'>; + }; + protectedFloatingLimit: { + ask: NodeList<'protectedFloatingLimit'>; + bid: NodeList<'protectedFloatingLimit'>; + }; + takingLimit: { + ask: NodeList<'takingLimit'>; + bid: NodeList<'takingLimit'>; + }; + market: { + ask: NodeList<'market'>; + bid: NodeList<'market'>; + }; + trigger: { + above: NodeList<'trigger'>; + below: NodeList<'trigger'>; + }; + signedMsg: { + ask: NodeList<'signedMsg'>; + bid: NodeList<'signedMsg'>; + }; +}; + +export type OrderBookCallback = () => void; + +/** + * Receives a DLOBNode and is expected to return true if the node should + * be taken into account when generating, or false otherwise. + * + * Currently used in functions that rely on getBestNode + */ +export type DLOBFilterFcn = (node: DLOBNode) => boolean; + +export type NodeToFill = { + node: DLOBNode; + makerNodes: DLOBNode[]; +}; + +export type NodeToTrigger = { + node: TriggerOrderNode; +}; + +export interface IDLOB { + // Properties + openOrders: Map>; + orderLists: Map>; + maxSlotForRestingLimitOrders: number; + initialized: boolean; + protectedMakerParamsMap: ProtectMakerParamsMap; + + // Methods + clear(): void; + + /** + * initializes a new DLOB instance + * + * @returns a promise that resolves when the DLOB is initialized + */ + initFromUserMap(userMap: IUserMap, slot: number): Promise; + + insertOrder( + order: Order, + userAccount: string, + slot: number, + isUserProtectedMaker: boolean, + baseAssetAmount: BN, + onInsert?: OrderBookCallback + ): void; + + insertSignedMsgOrder( + order: Order, + userAccount: string, + isUserProtectedMaker: boolean, + baseAssetAmount: BN, + onInsert?: OrderBookCallback + ): void; + + addOrderList(marketType: MarketTypeStr, marketIndex: number): void; + + delete( + order: Order, + userAccount: PublicKey, + slot: number, + isUserProtectedMaker: boolean, + onDelete?: OrderBookCallback + ): void; + + getListForOnChainOrder( + order: Order, + slot: number, + isProtectedMaker: boolean + ): NodeList | undefined; + + updateRestingLimitOrders(slot: number): void; + + updateRestingLimitOrdersForMarketType( + slot: number, + marketTypeStr: MarketTypeStr + ): void; + + getOrder(orderId: number, userAccount: PublicKey): Order | undefined; + + findNodesToFill( + marketIndex: number, + fallbackBid: BN | undefined, + fallbackAsk: BN | undefined, + slot: number, + ts: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + stateAccount: StateAccount, + marketAccount: PerpMarketAccount | SpotMarketAccount + ): NodeToFill[]; + + getMakerRebate( + marketType: MarketType, + stateAccount: StateAccount, + marketAccount: PerpMarketAccount | SpotMarketAccount + ): { makerRebateNumerator: number; makerRebateDenominator: number }; + + mergeNodesToFill( + restingLimitOrderNodesToFill: NodeToFill[], + takingOrderNodesToFill: NodeToFill[] + ): NodeToFill[]; + + findRestingLimitOrderNodesToFill( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + isAmmPaused: boolean, + minAuctionDuration: number, + makerRebateNumerator: number, + makerRebateDenominator: number, + fallbackAsk: BN | undefined, + fallbackBid: BN | undefined + ): NodeToFill[]; + + findTakingNodesToFill( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + isAmmPaused: boolean, + minAuctionDuration: number, + fallbackAsk: BN | undefined, + fallbackBid?: BN | undefined + ): NodeToFill[]; + + findTakingNodesCrossingMakerNodes( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + takerNodeGenerator: Generator, + makerNodeGeneratorFn: ( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData + ) => Generator, + doesCross: (takerPrice: BN | undefined, makerPrice: BN) => boolean + ): NodeToFill[]; + + findNodesCrossingFallbackLiquidity( + marketType: MarketType, + slot: number, + oraclePriceData: OraclePriceData, + nodeGenerator: Generator, + doesCross: (nodePrice: BN | undefined) => boolean, + minAuctionDuration: number + ): NodeToFill[]; + + findExpiredNodesToFill( + marketIndex: number, + ts: number, + marketType: MarketType, + slot?: BN + ): NodeToFill[]; + + getTakingBids( + marketIndex: number, + marketType: MarketType, + slot: number, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + getTakingAsks( + marketIndex: number, + marketType: MarketType, + slot: number, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + getRestingLimitAsks( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + getRestingLimitBids( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + /** + * This will look at both the taking and resting limit asks + * @param marketIndex + * @param fallbackAsk + * @param slot + * @param marketType + * @param oraclePriceData + * @param filterFcn + */ + getAsks( + marketIndex: number, + fallbackAsk: BN | undefined, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + /** + * This will look at both the taking and resting limit bids + * @param marketIndex + * @param fallbackBid + * @param slot + * @param marketType + * @param oraclePriceData + * @param filterFcn + */ + getBids( + marketIndex: number, + fallbackBid: BN | undefined, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData, + filterFcn?: DLOBFilterFcn + ): Generator; + + findCrossingRestingLimitOrders( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData + ): NodeToFill[]; + + determineMakerAndTaker( + askNode: DLOBNode, + bidNode: DLOBNode + ): { takerNode: DLOBNode; makerNode: DLOBNode } | undefined; + + getBestAsk( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData + ): BN | undefined; + + getBestBid( + marketIndex: number, + slot: number, + marketType: MarketType, + oraclePriceData: OraclePriceData + ): BN | undefined; + + getStopLosses( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + getStopLossMarkets( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + getStopLossLimits( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + getTakeProfits( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + getTakeProfitMarkets( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + getTakeProfitLimits( + marketIndex: number, + marketType: MarketType, + direction: PositionDirection + ): Generator; + + findNodesToTrigger( + marketIndex: number, + slot: number, + oraclePrice: BN, + marketType: MarketType, + stateAccount: StateAccount + ): NodeToTrigger[]; + + printTop( + driftClient: IDriftClient, + slotSubscriber: SlotSubscriber, + marketIndex: number, + marketType: MarketType + ): void; + + getDLOBOrders(): DLOBOrders; + + getNodeLists(): Generator>; + + /** + * Get an L2 view of the order book for a given market. + * + * @param marketIndex + * @param marketType + * @param slot + * @param oraclePriceData + * @param depth how many levels of the order book to return + * @param fallbackL2Generators L2 generators for fallback liquidity e.g. vAMM {@link getVammL2Generator}, openbook {@link SerumSubscriber} + */ + getL2(params: { + marketIndex: number; + marketType: MarketType; + slot: number; + oraclePriceData: OraclePriceData; + depth: number; + fallbackL2Generators?: L2OrderBookGenerator[]; + }): L2OrderBook; + + /** + * Get an L3 view of the order book for a given market. Does not include fallback liquidity sources + * + * @param marketIndex + * @param marketType + * @param slot + * @param oraclePriceData + */ + getL3(params: { + marketIndex: number; + marketType: MarketType; + slot: number; + oraclePriceData: OraclePriceData; + }): L3OrderBook; + + /** + * + * @param param.marketIndex the index of the market + * @param param.marketType the type of the market + * @param param.baseAmount the base amount in to estimate + * @param param.orderDirection the direction of the trade + * @param param.slot current slot for estimating dlob node price + * @param param.oraclePriceData the oracle price data + * @returns the estimated quote amount filled: QUOTE_PRECISION + */ + estimateFillWithExactBaseAmount(params: { + marketIndex: number; + marketType: MarketType; + baseAmount: BN; + orderDirection: PositionDirection; + slot: number; + oraclePriceData: OraclePriceData; + }): BN; + + getBestMakers(params: { + marketIndex: number; + marketType: MarketType; + direction: PositionDirection; + slot: number; + oraclePriceData: OraclePriceData; + numMakers: number; + }): PublicKey[]; +} diff --git a/sdk/src/dlob/utils.ts b/sdk/src/dlob/utils.ts new file mode 100644 index 0000000000..736f4f68ef --- /dev/null +++ b/sdk/src/dlob/utils.ts @@ -0,0 +1,6 @@ +export function getOrderSignature( + orderId: number, + userAccount: string +): string { + return `${userAccount.toString()}-${orderId.toString()}`; +} diff --git a/sdk/src/driftClient.ts b/sdk/src/driftClient/index.ts similarity index 99% rename from sdk/src/driftClient.ts rename to sdk/src/driftClient/index.ts index 2fbfc96d1a..1bede7816e 100644 --- a/sdk/src/driftClient.ts +++ b/sdk/src/driftClient/index.ts @@ -64,8 +64,8 @@ import { ProtectedMakerModeConfig, SignedMsgOrderParamsDelegateMessage, TokenProgramFlag, -} from './types'; -import driftIDL from './idl/drift.json'; +} from '../types'; +import driftIDL from '../idl/drift.json'; import { AccountMeta, @@ -87,7 +87,7 @@ import { VersionedTransaction, } from '@solana/web3.js'; -import { TokenFaucet } from './tokenFaucet'; +import { TokenFaucet } from '../tokenFaucet'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import { @@ -112,14 +112,14 @@ import { getUserStatsAccountPublicKey, getSignedMsgWsDelegatesAccountPublicKey, getIfRebalanceConfigPublicKey, -} from './addresses/pda'; +} from '../addresses/pda'; import { DataAndSlot, DelistedMarketSetting, DriftClientAccountEvents, DriftClientAccountSubscriber, -} from './accounts/types'; -import { TxSender, TxSigAndSlot } from './tx/types'; +} from '../accounts/types'; +import { TxSender, TxSigAndSlot } from '../tx/types'; import { BASE_PRECISION, GOV_SPOT_MARKET_INDEX, @@ -129,44 +129,45 @@ import { QUOTE_PRECISION, QUOTE_SPOT_MARKET_INDEX, ZERO, -} from './constants/numericConstants'; -import { findDirectionToClose, positionIsAvailable } from './math/position'; -import { getSignedTokenAmount, getTokenAmount } from './math/spotBalance'; -import { decodeName, DEFAULT_USER_NAME, encodeName } from './userName'; -import { OraclePriceData } from './oracles/types'; -import { DriftClientConfig } from './driftClientConfig'; -import { PollingDriftClientAccountSubscriber } from './accounts/pollingDriftClientAccountSubscriber'; -import { WebSocketDriftClientAccountSubscriber } from './accounts/webSocketDriftClientAccountSubscriber'; -import { RetryTxSender } from './tx/retryTxSender'; -import { User } from './user'; -import { UserSubscriptionConfig } from './userConfig'; +} from '../constants/numericConstants'; +import { findDirectionToClose, positionIsAvailable } from '../math/position'; +import { getSignedTokenAmount, getTokenAmount } from '../math/spotBalance'; +import { decodeName, DEFAULT_USER_NAME, encodeName } from '../userName'; +import { OraclePriceData } from '../oracles/types'; +import { DriftClientConfig } from '../driftClientConfig'; +import { PollingDriftClientAccountSubscriber } from '../accounts/driftClientAccount/pollingDriftClientAccountSubscriber'; +import { WebSocketDriftClientAccountSubscriber } from '../accounts/driftClientAccount/webSocketDriftClientAccountSubscriber'; +import { RetryTxSender } from '../tx/retryTxSender'; +import { User } from '../user'; +import { UserSubscriptionConfig } from '../user/types'; import { configs, DRIFT_ORACLE_RECEIVER_ID, DEFAULT_CONFIRMATION_OPTS, DRIFT_PROGRAM_ID, - DriftEnv, PYTH_LAZER_STORAGE_ACCOUNT_KEY, -} from './config'; -import { WRAPPED_SOL_MINT } from './constants/spotMarkets'; -import { UserStats } from './userStats'; -import { isSpotPositionAvailable } from './math/spotPosition'; -import { calculateMarketMaxAvailableInsurance } from './math/market'; -import { fetchUserStatsAccount } from './accounts/fetch'; -import { castNumberToSpotPrecision } from './math/spotMarket'; +} from '../config'; +import { DriftEnv } from '../config/types'; +import { WRAPPED_SOL_MINT } from '../constants/spotMarkets'; +import { IUserStats } from '../userStats/types'; +import { UserStats } from '../userStats'; +import { isSpotPositionAvailable } from '../math/spotPosition'; +import { calculateMarketMaxAvailableInsurance } from '../math/market'; +import { fetchUserStatsAccount } from '../accounts/fetch'; +import { castNumberToSpotPrecision } from '../math/spotMarket'; import { JupiterClient, QuoteResponse, SwapMode, -} from './jupiter/jupiterClient'; -import { getNonIdleUserFilter } from './memcmp'; -import { UserStatsSubscriptionConfig } from './userStatsConfig'; -import { getMarinadeDepositIx, getMarinadeFinanceProgram } from './marinade'; -import { getOrderParams, isUpdateHighLeverageMode } from './orderParams'; -import { numberToSafeBN } from './math/utils'; -import { TransactionParamProcessor } from './tx/txParamProcessor'; -import { isOracleValid, trimVaaSignatures } from './math/oracles'; -import { TxHandler } from './tx/txHandler'; +} from '../jupiter/jupiterClient'; +import { getNonIdleUserFilter } from '../memcmp'; +import { UserStatsSubscriptionConfig } from '../userStatsConfig'; +import { getMarinadeDepositIx, getMarinadeFinanceProgram } from '../marinade'; +import { getOrderParams, isUpdateHighLeverageMode } from '../orderParams'; +import { numberToSafeBN } from '../math/utils'; +import { TransactionParamProcessor } from '../tx/txParamProcessor'; +import { isOracleValid, trimVaaSignatures } from '../math/oracles'; +import { TxHandler } from '../tx/txHandler'; import { DEFAULT_RECEIVER_PROGRAM_ID, wormholeCoreBridgeIdl, @@ -178,21 +179,22 @@ import { } from '@pythnetwork/pyth-solana-receiver/lib/address'; import { WormholeCoreBridgeSolana } from '@pythnetwork/pyth-solana-receiver/lib/idl/wormhole_core_bridge_solana'; import { PythSolanaReceiver } from '@pythnetwork/pyth-solana-receiver/lib/idl/pyth_solana_receiver'; -import { getFeedIdUint8Array, trimFeedId } from './util/pythOracleUtils'; -import { createMinimalEd25519VerifyIx } from './util/ed25519Utils'; +import { getFeedIdUint8Array, trimFeedId } from '../util/pythOracleUtils'; +import { createMinimalEd25519VerifyIx } from '../util/ed25519Utils'; import { createNativeInstructionDiscriminatorBuffer, isVersionedTransaction, -} from './tx/utils'; -import pythSolanaReceiverIdl from './idl/pyth_solana_receiver.json'; +} from '../tx/utils'; +import pythSolanaReceiverIdl from '../idl/pyth_solana_receiver.json'; import { asV0Tx, PullFeed, AnchorUtils } from '@switchboard-xyz/on-demand'; -import { gprcDriftClientAccountSubscriber } from './accounts/grpcDriftClientAccountSubscriber'; +import { gprcDriftClientAccountSubscriber } from '../accounts/driftClientAccount/grpcDriftClientAccountSubscriber'; import nacl from 'tweetnacl'; -import { Slothash } from './slot/SlothashSubscriber'; -import { getOracleId } from './oracles/oracleId'; -import { SignedMsgOrderParams } from './types'; +import { Slothash } from '../slot/SlothashSubscriber'; +import { getOracleId } from '../oracles/oracleId'; +import { SignedMsgOrderParams } from '../types'; import { sha256 } from '@noble/hashes/sha256'; -import { getOracleConfidenceFromMMOracleData } from './oracles/utils'; +import { getOracleConfidenceFromMMOracleData } from '../oracles/utils'; +import { IDriftClient } from './types'; type RemainingAccountParams = { userAccounts: UserAccount[]; @@ -207,7 +209,7 @@ type RemainingAccountParams = { * # DriftClient * This class is the main way to interact with Drift Protocol. It allows you to subscribe to the various accounts where the Market's state is stored, as well as: opening positions, liquidating, settling funding, depositing & withdrawing, and more. */ -export class DriftClient { +export class DriftClient implements IDriftClient { connection: Connection; wallet: IWallet; public program: Program; @@ -216,7 +218,7 @@ export class DriftClient { opts?: ConfirmOptions; useHotWalletAdmin?: boolean; users = new Map(); - userStats?: UserStats; + userStats?: IUserStats; activeSubAccountId: number; userAccountSubscriptionConfig: UserSubscriptionConfig; userStatsAccountSubscriptionConfig: UserStatsSubscriptionConfig; @@ -2050,7 +2052,7 @@ export class DriftClient { ); } - public getUserStats(): UserStats { + public getUserStats(): IUserStats { return this.userStats; } diff --git a/sdk/src/driftClient/types.ts b/sdk/src/driftClient/types.ts new file mode 100644 index 0000000000..08ae38611e --- /dev/null +++ b/sdk/src/driftClient/types.ts @@ -0,0 +1,2204 @@ +import { AnchorProvider, BN, Program, ProgramAccount } from '@coral-xyz/anchor'; +import { Program as Program30, Idl as Idl30 } from '@coral-xyz/anchor-30'; +import { + AddressLookupTableAccount, + BlockhashWithExpiryBlockHeight, + ConfirmOptions, + Connection, + PublicKey, + Signer, + TransactionInstruction, + TransactionSignature, + TransactionVersion, + Transaction, + VersionedTransaction, + AccountMeta, + Keypair, +} from '@solana/web3.js'; +import { + DriftClientMetricsEvents, + HighLeverageModeConfig, + IWallet, + MakerInfo, + MarketType, + OpenbookV2FulfillmentConfigAccount, + OptionalOrderParams, + OracleSource, + Order, + OrderParams, + PerpMarketAccount, + PerpMarketExtendedInfo, + PhoenixV1FulfillmentConfigAccount, + PlaceAndTakeOrderSuccessCondition, + PositionDirection, + ReferrerInfo, + ReferrerNameAccount, + SerumV3FulfillmentConfigAccount, + SettlePnlMode, + SpotMarketAccount, + SpotPosition, + StateAccount, + SignedMsgOrderParamsMessage, + TakerInfo, + TxParams, + UserAccount, + UserStatsAccount, + ProtectedMakerModeConfig, + SignedMsgOrderParamsDelegateMessage, + SignedMsgOrderParams, + SwapReduceOnly, + OrderTriggerCondition, + ModifyOrderPolicy, +} from '../types'; +import { EventEmitter } from 'events'; +import StrictEventEmitter from 'strict-event-emitter-types'; +import { + DataAndSlot, + DriftClientAccountEvents, + DriftClientAccountSubscriber, +} from '../accounts/types'; +import { TxSender, TxSigAndSlot } from '../tx/types'; +import { OraclePriceData } from '../oracles/types'; +import { UserSubscriptionConfig } from '../user/types'; +import { DriftEnv } from '../config/types'; +import { IUserStats } from '../userStats/types'; +import { UserStatsSubscriptionConfig } from '../userStatsConfig'; +import { PythSolanaReceiver } from '@pythnetwork/pyth-solana-receiver/lib/idl/pyth_solana_receiver'; +import { WormholeCoreBridgeSolana } from '@pythnetwork/pyth-solana-receiver/lib/idl/wormhole_core_bridge_solana'; +import { Slothash } from '../slot/SlothashSubscriber'; +import { TokenFaucet } from '../tokenFaucet'; +import { + JupiterClient, + QuoteResponse, + SwapMode, +} from '../jupiter/jupiterClient'; +import { TxHandler } from '../tx/txHandler'; +import { IUser } from '../user/types'; + +type RemainingAccountParams = { + userAccounts: UserAccount[]; + writablePerpMarketIndexes?: number[]; + writableSpotMarketIndexes?: number[]; + readablePerpMarketIndex?: number | number[]; + readableSpotMarketIndexes?: number[]; + useMarketLastSlotCache?: boolean; +}; + +export interface IDriftClient { + // Properties + connection: Connection; + wallet: IWallet; + program: Program; + provider: AnchorProvider; + env: DriftEnv; + opts?: ConfirmOptions; + useHotWalletAdmin?: boolean; + users: Map; + userStats?: IUserStats; + activeSubAccountId: number; + userAccountSubscriptionConfig: UserSubscriptionConfig; + userStatsAccountSubscriptionConfig: UserStatsSubscriptionConfig; + accountSubscriber: DriftClientAccountSubscriber; + eventEmitter: StrictEventEmitter; + metricsEventEmitter: StrictEventEmitter< + EventEmitter, + DriftClientMetricsEvents + >; + txSender: TxSender; + perpMarketLastSlotCache: Map; + spotMarketLastSlotCache: Map; + mustIncludePerpMarketIndexes: Set; + mustIncludeSpotMarketIndexes: Set; + authority: PublicKey; + /** @deprecated use marketLookupTables */ + marketLookupTable: PublicKey; + /** @deprecated use lookupTableAccounts */ + lookupTableAccount: AddressLookupTableAccount; + marketLookupTables: PublicKey[]; + lookupTableAccounts: AddressLookupTableAccount[]; + includeDelegates?: boolean; + authoritySubAccountMap?: Map; + skipLoadUsers?: boolean; + txVersion: TransactionVersion; + txParams: TxParams; + enableMetricsEvents?: boolean; + receiverProgram?: Program; + wormholeProgram?: Program; + sbOnDemandProgramdId: PublicKey; + sbOnDemandProgram?: Program30; + sbProgramFeedConfigs?: Map; + statePublicKey?: PublicKey; + signerPublicKey?: PublicKey; + + get isSubscribed(): boolean; + set isSubscribed(val: boolean); + + // Methods + getUserMapKey(subAccountId: number, authority: PublicKey): string; + createUser( + subAccountId: number, + accountSubscriptionConfig: UserSubscriptionConfig, + authority?: PublicKey + ): IUser; + subscribe(): Promise; + subscribeUsers(): Promise[]; + + /** + * Forces the accountSubscriber to fetch account updates from rpc + */ + fetchAccounts(): Promise; + + unsubscribe(): Promise; + unsubscribeUsers(): Promise[]; + getStatePublicKey(): Promise; + getSignerPublicKey(): PublicKey; + getStateAccount(): StateAccount; + + /** + * Forces a fetch to rpc before returning accounts. Useful for anchor tests. + */ + forceGetStateAccount(): Promise; + + getPerpMarketAccount(marketIndex: number): PerpMarketAccount | undefined; + + /** + * Forces a fetch to rpc before returning accounts. Useful for anchor tests. + * @param marketIndex + */ + forceGetPerpMarketAccount( + marketIndex: number + ): Promise; + + getPerpMarketAccounts(): PerpMarketAccount[]; + getSpotMarketAccount(marketIndex: number): SpotMarketAccount | undefined; + + /** + * Forces a fetch to rpc before returning accounts. Useful for anchor tests. + * @param marketIndex + */ + forceGetSpotMarketAccount( + marketIndex: number + ): Promise; + + getSpotMarketAccounts(): SpotMarketAccount[]; + getQuoteSpotMarketAccount(): SpotMarketAccount; + getOraclePriceDataAndSlot( + oraclePublicKey: PublicKey, + oracleSource: OracleSource + ): DataAndSlot | undefined; + getSerumV3FulfillmentConfig( + serumMarket: PublicKey + ): Promise; + getSerumV3FulfillmentConfigs(): Promise; + getPhoenixV1FulfillmentConfig( + phoenixMarket: PublicKey + ): Promise; + getPhoenixV1FulfillmentConfigs(): Promise< + PhoenixV1FulfillmentConfigAccount[] + >; + getOpenbookV2FulfillmentConfig( + openbookMarket: PublicKey + ): Promise; + getOpenbookV2FulfillmentConfigs(): Promise< + OpenbookV2FulfillmentConfigAccount[] + >; + + /** @deprecated use fetchAllLookupTableAccounts() */ + fetchMarketLookupTableAccount(): Promise; + + fetchAllLookupTableAccounts(): Promise; + + /** + * Update the wallet to use for drift transactions and linked user account + * @param newWallet + * @param subAccountIds + * @param activeSubAccountId + * @param includeDelegates + */ + updateWallet( + newWallet: IWallet, + subAccountIds?: number[], + activeSubAccountId?: number, + includeDelegates?: boolean, + authoritySubaccountMap?: Map + ): Promise; + + /** + * Update the subscribed accounts to a given authority, while leaving the + * connected wallet intact. This allows a user to emulate another user's + * account on the UI and sign permissionless transactions with their own wallet. + * @param emulateAuthority + */ + emulateAccount(emulateAuthority: PublicKey): Promise; + + switchActiveUser(subAccountId: number, authority?: PublicKey): Promise; + addUser( + subAccountId: number, + authority?: PublicKey, + userAccount?: UserAccount + ): Promise; + + /** + * Adds and subscribes to users based on params set by the constructor or by updateWallet. + */ + addAndSubscribeToUsers(authority?: PublicKey): Promise; + + /** + * Returns the instructions to initialize a user account and the public key of the user account. + * @param subAccountId + * @param name + * @param referrerInfo + * @returns [instructions, userAccountPublicKey] + */ + getInitializeUserAccountIxs( + subAccountId?: number, + name?: string, + referrerInfo?: ReferrerInfo, + poolId?: number + ): Promise<[TransactionInstruction[], PublicKey]>; + + /** + * Initializes a user account and returns the transaction signature and the public key of the user account. + * @param subAccountId + * @param name + * @param referrerInfo + * @param txParams + * @returns [transactionSignature, userAccountPublicKey] + */ + initializeUserAccount( + subAccountId?: number, + name?: string, + referrerInfo?: ReferrerInfo, + txParams?: TxParams + ): Promise<[TransactionSignature, PublicKey]>; + + getInitializeUserStatsIx(): Promise; + initializeSignedMsgUserOrders( + authority: PublicKey, + numOrders: number, + txParams?: TxParams + ): Promise<[TransactionSignature, PublicKey]>; + getInitializeSignedMsgUserOrdersAccountIx( + authority: PublicKey, + numOrders: number + ): Promise<[PublicKey, TransactionInstruction]>; + resizeSignedMsgUserOrders( + authority: PublicKey, + numOrders: number, + userSubaccountId?: number, + txParams?: TxParams + ): Promise; + getResizeSignedMsgUserOrdersInstruction( + authority: PublicKey, + numOrders: number, + userSubaccountId?: number + ): Promise; + initializeSignedMsgWsDelegatesAccount( + authority: PublicKey, + delegates?: PublicKey[], + txParams?: TxParams + ): Promise; + getInitializeSignedMsgWsDelegatesAccountIx( + authority: PublicKey, + delegates?: PublicKey[] + ): Promise; + addSignedMsgWsDelegate( + authority: PublicKey, + delegate: PublicKey, + txParams?: TxParams + ): Promise; + getAddSignedMsgWsDelegateIx( + authority: PublicKey, + delegate: PublicKey + ): Promise; + removeSignedMsgWsDelegate( + authority: PublicKey, + delegate: PublicKey, + txParams?: TxParams + ): Promise; + getRemoveSignedMsgWsDelegateIx( + authority: PublicKey, + delegate: PublicKey + ): Promise; + initializeFuelOverflow(authority?: PublicKey): Promise; + getInitializeFuelOverflowIx( + authority?: PublicKey + ): Promise; + sweepFuel(authority?: PublicKey): Promise; + getSweepFuelIx(authority?: PublicKey): Promise; + getNextSubAccountId(): Promise; + initializeReferrerName(name: string): Promise; + updateUserName( + name: string, + subAccountId?: number + ): Promise; + updateUserCustomMarginRatio( + updates: { marginRatio: number; subAccountId: number }[], + txParams?: TxParams + ): Promise; + getUpdateUserCustomMarginRatioIx( + marginRatio: number, + subAccountId?: number + ): Promise; + getUpdateUserMarginTradingEnabledIx( + marginTradingEnabled: boolean, + subAccountId?: number, + userAccountPublicKey?: PublicKey + ): Promise; + updateUserMarginTradingEnabled( + updates: { marginTradingEnabled: boolean; subAccountId: number }[] + ): Promise; + updateUserDelegate( + delegate: PublicKey, + subAccountId?: number + ): Promise; + updateUserAdvancedLp( + updates: { advancedLp: boolean; subAccountId: number }[] + ): Promise; + getUpdateAdvancedDlpIx( + advancedLp: boolean, + subAccountId: number + ): Promise; + updateUserReduceOnly( + updates: { reduceOnly: boolean; subAccountId: number }[] + ): Promise; + getUpdateUserReduceOnlyIx( + reduceOnly: boolean, + subAccountId: number + ): Promise; + updateUserPoolId( + updates: { poolId: number; subAccountId: number }[] + ): Promise; + getUpdateUserPoolIdIx( + poolId: number, + subAccountId: number + ): Promise; + fetchAllUserAccounts( + includeIdle?: boolean + ): Promise[]>; + getUserAccountsForDelegate(delegate: PublicKey): Promise; + getUserAccountsAndAddressesForAuthority( + authority: PublicKey + ): Promise[]>; + getUserAccountsForAuthority(authority: PublicKey): Promise; + getReferredUserStatsAccountsByReferrer( + referrer: PublicKey + ): Promise; + getReferrerNameAccountsForAuthority( + authority: PublicKey + ): Promise; + deleteUser( + subAccountId?: number, + txParams?: TxParams + ): Promise; + getUserDeletionIx( + userAccountPublicKey: PublicKey + ): Promise; + forceDeleteUser( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + txParams?: TxParams + ): Promise; + getForceDeleteUserIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount + ): Promise; + deleteSignedMsgUserOrders(txParams?: TxParams): Promise; + getSignedMsgUserOrdersDeletionIx( + authority: PublicKey + ): Promise; + + /** + * Checks if a SignedMsg User Orders account exists for the given authority. + * The account pubkey is derived using the program ID and authority as seeds. + * Makes an RPC call to check if the account exists on-chain. + * + * @param authority The authority public key to check for + * @returns Promise that resolves to true if the account exists, false otherwise + */ + isSignedMsgUserOrdersAccountInitialized( + authority: PublicKey + ): Promise; + + reclaimRent( + subAccountId?: number, + txParams?: TxParams + ): Promise; + getReclaimRentIx( + userAccountPublicKey: PublicKey + ): Promise; + getUser(subAccountId?: number, authority?: PublicKey): IUser; + hasUser(subAccountId?: number, authority?: PublicKey): boolean; + getUsers(): IUser[]; + getUserStats(): IUserStats; + fetchReferrerNameAccount( + name: string + ): Promise; + getUserStatsAccountPublicKey(): PublicKey; + getUserAccountPublicKey( + subAccountId?: number, + authority?: PublicKey + ): Promise; + getUserAccount( + subAccountId?: number, + authority?: PublicKey + ): UserAccount | undefined; + + /** + * Forces a fetch to rpc before returning accounts. Useful for anchor tests. + * @param subAccountId + */ + forceGetUserAccount( + subAccountId?: number, + authority?: PublicKey + ): Promise; + + getUserAccountAndSlot( + subAccountId?: number, + authority?: PublicKey + ): DataAndSlot | undefined; + getSpotPosition( + marketIndex: number, + subAccountId?: number + ): SpotPosition | undefined; + getQuoteAssetTokenAmount(): BN; + + /** + * Returns the token amount for a given market. The spot market precision is based on the token mint decimals. + * Positive if it is a deposit, negative if it is a borrow. + * @param marketIndex + */ + getTokenAmount(marketIndex: number): BN; + + /** + * Converts an amount to the spot precision for a given market. The spot market precision is based on the token mint decimals. + * @param marketIndex + * @param amount + */ + convertToSpotPrecision(marketIndex: number, amount: BN | number): BN; + + /** + * Converts an amount to the perp precision. The perp market precision is {@link BASE_PRECISION} (1e9). + * @param amount + */ + convertToPerpPrecision(amount: BN | number): BN; + + /** + * Converts an amount to the price precision. The perp market precision is {@link PRICE_PRECISION} (1e6). + * @param amount + */ + convertToPricePrecision(amount: BN | number): BN; + + /** + * Each drift instruction must include perp and sport market accounts in the ix remaining accounts. + * Use this function to force a subset of markets to be included in the remaining accounts for every ix + * + * @param perpMarketIndexes + * @param spotMarketIndexes + */ + mustIncludeMarketsInIx(params: { + perpMarketIndexes: number[]; + spotMarketIndexes: number[]; + }): void; + + getRemainingAccounts(params: RemainingAccountParams): AccountMeta[]; + addPerpMarketToRemainingAccountMaps( + marketIndex: number, + writable: boolean, + oracleAccountMap: Map, + spotMarketAccountMap: Map, + perpMarketAccountMap: Map + ): void; + addSpotMarketToRemainingAccountMaps( + marketIndex: number, + writable: boolean, + oracleAccountMap: Map, + spotMarketAccountMap: Map + ): void; + getRemainingAccountMapsForUsers(userAccounts: UserAccount[]): { + oracleAccountMap: Map; + spotMarketAccountMap: Map; + perpMarketAccountMap: Map; + }; + getOrder(orderId: number, subAccountId?: number): Order | undefined; + getOrderByUserId( + userOrderId: number, + subAccountId?: number + ): Order | undefined; + + /** + * Get the associated token address for the given spot market + * @param marketIndex + * @param useNative + * @param tokenProgram + */ + getAssociatedTokenAccount( + marketIndex: number, + useNative?: boolean, + tokenProgram?: PublicKey + ): Promise; + + createAssociatedTokenAccountIdempotentInstruction( + account: PublicKey, + payer: PublicKey, + owner: PublicKey, + mint: PublicKey, + tokenProgram?: PublicKey + ): TransactionInstruction; + getDepositTxnIx( + amount: BN, + marketIndex: number, + associatedTokenAccount: PublicKey, + subAccountId?: number, + reduceOnly?: boolean + ): Promise; + createDepositTxn( + amount: BN, + marketIndex: number, + associatedTokenAccount: PublicKey, + subAccountId?: number, + reduceOnly?: boolean, + txParams?: TxParams, + initSwiftAccount?: boolean + ): Promise; + + /** + * Deposit funds into the given spot market + * + * @param amount to deposit + * @param marketIndex spot market index to deposit into + * @param associatedTokenAccount can be the wallet public key if using native sol + * @param subAccountId subaccountId to deposit + * @param reduceOnly if true, deposit must not increase account risk + */ + deposit( + amount: BN, + marketIndex: number, + associatedTokenAccount: PublicKey, + subAccountId?: number, + reduceOnly?: boolean, + txParams?: TxParams, + initSwiftAccount?: boolean + ): Promise; + + getDepositInstruction( + amount: BN, + marketIndex: number, + userTokenAccount: PublicKey, + subAccountId?: number, + reduceOnly?: boolean, + userInitialized?: boolean + ): Promise; + getWrappedSolAccountCreationIxs( + amount: BN, + includeRent?: boolean + ): Promise<{ + ixs: TransactionInstruction[]; + /** @deprecated - this array is always going to be empty, in the current implementation */ signers: Signer[]; + pubkey: PublicKey; + }>; + getTokenProgramForSpotMarket(spotMarketAccount: SpotMarketAccount): PublicKey; + isToken2022(spotMarketAccount: SpotMarketAccount): boolean; + isTransferHook(spotMarketAccount: SpotMarketAccount): boolean; + addTokenMintToRemainingAccounts( + spotMarketAccount: SpotMarketAccount, + remainingAccounts: AccountMeta[] + ): void; + addExtraAccountMetasToRemainingAccounts( + mint: PublicKey, + remainingAccounts: AccountMeta[] + ): Promise; + getAssociatedTokenAccountCreationIx( + tokenMintAddress: PublicKey, + associatedTokenAddress: PublicKey, + tokenProgram: PublicKey + ): TransactionInstruction; + createInitializeUserAccountAndDepositCollateralIxs( + amount: BN, + userTokenAccount: PublicKey, + marketIndex?: number, + subAccountId?: number, + name?: string, + fromSubAccountId?: number, + referrerInfo?: ReferrerInfo, + donateAmount?: BN, + customMaxMarginRatio?: number, + poolId?: number + ): Promise<{ + ixs: TransactionInstruction[]; + userAccountPublicKey: PublicKey; + }>; + createInitializeUserAccountAndDepositCollateral( + amount: BN, + userTokenAccount: PublicKey, + marketIndex?: number, + subAccountId?: number, + name?: string, + fromSubAccountId?: number, + referrerInfo?: ReferrerInfo, + donateAmount?: BN, + txParams?: TxParams, + customMaxMarginRatio?: number, + poolId?: number + ): Promise<[Transaction | VersionedTransaction, PublicKey]>; + + /** + * Creates the User account for a user, and deposits some initial collateral + * @param amount + * @param userTokenAccount + * @param marketIndex + * @param subAccountId + * @param name + * @param fromSubAccountId + * @param referrerInfo + * @param donateAmount + * @param txParams + * @returns + */ + initializeUserAccountAndDepositCollateral( + amount: BN, + userTokenAccount: PublicKey, + marketIndex?: number, + subAccountId?: number, + name?: string, + fromSubAccountId?: number, + referrerInfo?: ReferrerInfo, + donateAmount?: BN, + txParams?: TxParams, + customMaxMarginRatio?: number, + poolId?: number + ): Promise<[TransactionSignature, PublicKey]>; + + initializeUserAccountForDevnet( + subAccountId?: number, + name?: string, + marketIndex?: number, + tokenFaucet?: TokenFaucet, + amount?: BN, + referrerInfo?: ReferrerInfo, + txParams?: TxParams + ): Promise<[TransactionSignature, PublicKey]>; + getWithdrawalIxs( + amount: BN, + marketIndex: number, + associatedTokenAddress: PublicKey, + reduceOnly?: boolean, + subAccountId?: number, + updateFuel?: boolean + ): Promise; + + /** + * Withdraws from a user account. If deposit doesn't already exist, creates a borrow + * @param amount + * @param marketIndex + * @param associatedTokenAddress - the token account to withdraw to. can be the wallet public key if using native sol + * @param reduceOnly + */ + withdraw( + amount: BN, + marketIndex: number, + associatedTokenAddress: PublicKey, + reduceOnly?: boolean, + subAccountId?: number, + txParams?: TxParams, + updateFuel?: boolean + ): Promise; + + withdrawAllDustPositions( + subAccountId?: number, + txParams?: TxParams, + opts?: { dustPositionCountCallback?: (count: number) => void } + ): Promise; + getWithdrawIx( + amount: BN, + marketIndex: number, + userTokenAccount: PublicKey, + reduceOnly?: boolean, + subAccountId?: number + ): Promise; + + /** + * Withdraws from the fromSubAccount and deposits into the toSubAccount + * @param amount + * @param marketIndex + * @param fromSubAccountId + * @param toSubAccountId + * @param txParams + */ + transferDeposit( + amount: BN, + marketIndex: number, + fromSubAccountId: number, + toSubAccountId: number, + txParams?: TxParams + ): Promise; + + getTransferDepositIx( + amount: BN, + marketIndex: number, + fromSubAccountId: number, + toSubAccountId: number + ): Promise; + transferPools( + depositFromMarketIndex: number, + depositToMarketIndex: number, + borrowFromMarketIndex: number, + borrowToMarketIndex: number, + depositAmount: BN | undefined, + borrowAmount: BN | undefined, + fromSubAccountId: number, + toSubAccountId: number, + txParams?: TxParams + ): Promise; + getTransferPoolsIx( + depositFromMarketIndex: number, + depositToMarketIndex: number, + borrowFromMarketIndex: number, + borrowToMarketIndex: number, + depositAmount: BN | undefined, + borrowAmount: BN | undefined, + fromSubAccountId: number, + toSubAccountId: number, + isToNewSubAccount?: boolean + ): Promise; + transferPerpPosition( + fromSubAccountId: number, + toSubAccountId: number, + marketIndex: number, + amount: BN, + txParams?: TxParams + ): Promise; + getTransferPerpPositionIx( + fromSubAccountId: number, + toSubAccountId: number, + marketIndex: number, + amount: BN + ): Promise; + updateSpotMarketCumulativeInterest( + marketIndex: number, + txParams?: TxParams + ): Promise; + updateSpotMarketCumulativeInterestIx( + marketIndex: number + ): Promise; + settleLP( + settleeUserAccountPublicKey: PublicKey, + marketIndex: number, + txParams?: TxParams + ): Promise; + settleLPIx( + settleeUserAccountPublicKey: PublicKey, + marketIndex: number + ): Promise; + removePerpLpShares( + marketIndex: number, + sharesToBurn?: BN, + txParams?: TxParams, + subAccountId?: number + ): Promise; + removePerpLpSharesInExpiringMarket( + marketIndex: number, + userAccountPublicKey: PublicKey, + sharesToBurn?: BN, + txParams?: TxParams + ): Promise; + getRemovePerpLpSharesInExpiringMarket( + marketIndex: number, + userAccountPublicKey: PublicKey, + sharesToBurn?: BN + ): Promise; + getRemovePerpLpSharesIx( + marketIndex: number, + sharesToBurn?: BN, + subAccountId?: number + ): Promise; + addPerpLpShares( + amount: BN, + marketIndex: number, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getAddPerpLpSharesIx( + amount: BN, + marketIndex: number, + subAccountId?: number + ): Promise; + getQuoteValuePerLpShare(marketIndex: number): BN; + + /** + * @deprecated use {@link placePerpOrder} or {@link placeAndTakePerpOrder} instead + */ + openPosition( + direction: PositionDirection, + amount: BN, + marketIndex: number, + limitPrice?: BN, + subAccountId?: number + ): Promise; + + sendSignedTx( + tx: Transaction | VersionedTransaction, + opts?: ConfirmOptions + ): Promise; + prepareMarketOrderTxs( + orderParams: OptionalOrderParams, + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + makerInfo?: MakerInfo | MakerInfo[], + txParams?: TxParams, + bracketOrdersParams?: OptionalOrderParams[], + referrerInfo?: ReferrerInfo, + cancelExistingOrders?: boolean, + settlePnl?: boolean + ): Promise<{ + cancelExistingOrdersTx?: Transaction | VersionedTransaction; + settlePnlTx?: Transaction | VersionedTransaction; + fillTx?: Transaction | VersionedTransaction; + marketOrderTx: Transaction | VersionedTransaction; + }>; + + /** + * Sends a market order and returns a signed tx which can fill the order against the vamm, which the caller can use to fill their own order if required. + * @param orderParams + * @param userAccountPublicKey + * @param userAccount + * @param makerInfo + * @param txParams + * @param bracketOrdersParams + * @param cancelExistingOrders - Builds and returns an extra transaciton to cancel the existing orders in the same perp market. Intended use is to auto-cancel TP/SL orders when closing a position. Ignored if orderParams.marketType is not MarketType.PERP + * @returns + */ + sendMarketOrderAndGetSignedFillTx( + orderParams: OptionalOrderParams, + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + makerInfo?: MakerInfo | MakerInfo[], + txParams?: TxParams, + bracketOrdersParams?: OptionalOrderParams[], + referrerInfo?: ReferrerInfo, + cancelExistingOrders?: boolean, + settlePnl?: boolean + ): Promise<{ + txSig: TransactionSignature; + signedFillTx?: Transaction; + signedCancelExistingOrdersTx?: Transaction; + signedSettlePnlTx?: Transaction; + }>; + + placePerpOrder( + orderParams: OptionalOrderParams, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getPlacePerpOrderIx( + orderParams: OptionalOrderParams, + subAccountId?: number, + depositToTradeArgs?: { + isMakingNewAccount: boolean; + depositMarketIndex: number; + } + ): Promise; + updateAMMs( + marketIndexes: number[], + txParams?: TxParams + ): Promise; + getUpdateAMMsIx(marketIndexes: number[]): Promise; + settleExpiredMarket( + marketIndex: number, + txParams?: TxParams + ): Promise; + getSettleExpiredMarketIx( + marketIndex: number + ): Promise; + settleExpiredMarketPoolsToRevenuePool( + marketIndex: number, + txParams?: TxParams + ): Promise; + getSettleExpiredMarketPoolsToRevenuePoolIx( + perpMarketIndex: number + ): Promise; + cancelOrder( + orderId?: number, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getCancelOrderIx( + orderId?: number, + subAccountId?: number + ): Promise; + cancelOrderByUserId( + userOrderId: number, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getCancelOrderByUserIdIx( + userOrderId: number, + subAccountId?: number + ): Promise; + cancelOrdersByIds( + orderIds?: number[], + txParams?: TxParams, + subAccountId?: number + ): Promise; + getCancelOrdersByIdsIx( + orderIds?: number[], + subAccountId?: number + ): Promise; + cancelOrders( + marketType?: MarketType, + marketIndex?: number, + direction?: PositionDirection, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getCancelOrdersIx( + marketType: MarketType | null, + marketIndex: number | null, + direction: PositionDirection | null, + subAccountId?: number + ): Promise; + cancelAndPlaceOrders( + cancelOrderParams: { + marketType?: MarketType; + marketIndex?: number; + direction?: PositionDirection; + }, + placeOrderParams: OrderParams[], + txParams?: TxParams, + subAccountId?: number + ): Promise; + placeOrders( + params: OrderParams[], + txParams?: TxParams, + subAccountId?: number, + optionalIxs?: TransactionInstruction[] + ): Promise; + preparePlaceOrdersTx( + params: OrderParams[], + txParams?: TxParams, + subAccountId?: number, + optionalIxs?: TransactionInstruction[] + ): Promise<{ + placeOrdersTx: Transaction | VersionedTransaction; + }>; + getPlaceOrdersIx( + params: OptionalOrderParams[], + subAccountId?: number + ): Promise; + fillPerpOrder( + userAccountPublicKey: PublicKey, + user: UserAccount, + order?: Pick, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + fillerSubAccountId?: number, + fillerAuthority?: PublicKey + ): Promise; + getFillPerpOrderIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + order: Pick, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + fillerSubAccountId?: number, + isSignedMsg?: boolean, + fillerAuthority?: PublicKey + ): Promise; + getRevertFillIx(fillerPublicKey?: PublicKey): Promise; + placeSpotOrder( + orderParams: OptionalOrderParams, + txParams?: TxParams, + subAccountId?: number + ): Promise; + preparePlaceSpotOrderTx( + orderParams: OptionalOrderParams, + txParams?: TxParams, + subAccountId?: number + ): Promise<{ + placeSpotOrderTx: Transaction | VersionedTransaction; + }>; + getPlaceSpotOrderIx( + orderParams: OptionalOrderParams, + subAccountId?: number + ): Promise; + fillSpotOrder( + userAccountPublicKey: PublicKey, + user: UserAccount, + order?: Pick, + fulfillmentConfig?: + | SerumV3FulfillmentConfigAccount + | PhoenixV1FulfillmentConfigAccount + | OpenbookV2FulfillmentConfigAccount, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + txParams?: TxParams + ): Promise; + getFillSpotOrderIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + order?: Pick, + fulfillmentConfig?: + | SerumV3FulfillmentConfigAccount + | PhoenixV1FulfillmentConfigAccount + | OpenbookV2FulfillmentConfigAccount, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + fillerPublicKey?: PublicKey + ): Promise; + addSpotFulfillmentAccounts( + marketIndex: number, + remainingAccounts: AccountMeta[], + fulfillmentConfig?: + | SerumV3FulfillmentConfigAccount + | PhoenixV1FulfillmentConfigAccount + | OpenbookV2FulfillmentConfigAccount + ): void; + addSerumRemainingAccounts( + marketIndex: number, + remainingAccounts: AccountMeta[], + fulfillmentConfig: SerumV3FulfillmentConfigAccount + ): void; + addPhoenixRemainingAccounts( + marketIndex: number, + remainingAccounts: AccountMeta[], + fulfillmentConfig: PhoenixV1FulfillmentConfigAccount + ): void; + addOpenbookRemainingAccounts( + marketIndex: number, + remainingAccounts: AccountMeta[], + fulfillmentConfig: OpenbookV2FulfillmentConfigAccount + ): void; + + /** + * Swap tokens in drift account using jupiter + * @param jupiterClient jupiter client to find routes and jupiter instructions + * @param outMarketIndex the market index of the token you're buying + * @param inMarketIndex the market index of the token you're selling + * @param outAssociatedTokenAccount the token account to receive the token being sold on jupiter + * @param inAssociatedTokenAccount the token account to + * @param amount the amount of TokenIn, regardless of swapMode + * @param slippageBps the max slippage passed to jupiter api + * @param swapMode jupiter swapMode (ExactIn or ExactOut), default is ExactIn + * @param route the jupiter route to use for the swap + * @param reduceOnly specify if In or Out token on the drift account must reduceOnly, checked at end of swap + * @param v6 pass in the quote response from Jupiter quote's API (deprecated, use quote instead) + * @param quote pass in the quote response from Jupiter quote's API + * @param txParams + */ + swap({ + jupiterClient, + outMarketIndex, + inMarketIndex, + outAssociatedTokenAccount, + inAssociatedTokenAccount, + amount, + slippageBps, + swapMode, + reduceOnly, + txParams, + v6, + quote, + onlyDirectRoutes, + }: { + jupiterClient: JupiterClient; + outMarketIndex: number; + inMarketIndex: number; + outAssociatedTokenAccount?: PublicKey; + inAssociatedTokenAccount?: PublicKey; + amount: BN; + slippageBps?: number; + swapMode?: SwapMode; + reduceOnly?: SwapReduceOnly; + txParams?: TxParams; + onlyDirectRoutes?: boolean; + v6?: { + quote?: QuoteResponse; + }; + quote?: QuoteResponse; + }): Promise; + + getJupiterSwapIxV6({ + jupiterClient, + outMarketIndex, + inMarketIndex, + outAssociatedTokenAccount, + inAssociatedTokenAccount, + amount, + slippageBps, + swapMode, + onlyDirectRoutes, + quote, + reduceOnly, + userAccountPublicKey, + }: { + jupiterClient: JupiterClient; + outMarketIndex: number; + inMarketIndex: number; + outAssociatedTokenAccount?: PublicKey; + inAssociatedTokenAccount?: PublicKey; + amount: BN; + slippageBps?: number; + swapMode?: SwapMode; + onlyDirectRoutes?: boolean; + quote?: QuoteResponse; + reduceOnly?: SwapReduceOnly; + userAccountPublicKey?: PublicKey; + }): Promise<{ + ixs: TransactionInstruction[]; + lookupTables: AddressLookupTableAccount[]; + }>; + + /** + * Get the drift begin_swap and end_swap instructions + * + * @param outMarketIndex the market index of the token you're buying + * @param inMarketIndex the market index of the token you're selling + * @param amountIn the amount of the token to sell + * @param inTokenAccount the token account to move the tokens being sold + * @param outTokenAccount the token account to receive the tokens being bought + * @param limitPrice the limit price of the swap + * @param reduceOnly + * @param userAccountPublicKey optional, specify a custom userAccountPublicKey to use instead of getting the current user account; can be helpful if the account is being created within the current tx + */ + getSwapIx({ + outMarketIndex, + inMarketIndex, + amountIn, + inTokenAccount, + outTokenAccount, + limitPrice, + reduceOnly, + userAccountPublicKey, + }: { + outMarketIndex: number; + inMarketIndex: number; + amountIn: BN; + inTokenAccount: PublicKey; + outTokenAccount: PublicKey; + limitPrice?: BN; + reduceOnly?: SwapReduceOnly; + userAccountPublicKey?: PublicKey; + }): Promise<{ + beginSwapIx: TransactionInstruction; + endSwapIx: TransactionInstruction; + }>; + + stakeForMSOL(params: { amount: BN }): Promise; + getStakeForMSOLIx({ + amount, + userAccountPublicKey, + }: { + amount: BN; + userAccountPublicKey?: PublicKey; + }): Promise; + triggerOrder( + userAccountPublicKey: PublicKey, + user: UserAccount, + order: Order, + txParams?: TxParams, + fillerPublicKey?: PublicKey + ): Promise; + getTriggerOrderIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + order: Order, + fillerPublicKey?: PublicKey + ): Promise; + forceCancelOrders( + userAccountPublicKey: PublicKey, + user: UserAccount, + txParams?: TxParams, + fillerPublicKey?: PublicKey + ): Promise; + getForceCancelOrdersIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + fillerPublicKey?: PublicKey + ): Promise; + updateUserIdle( + userAccountPublicKey: PublicKey, + user: UserAccount, + txParams?: TxParams, + fillerPublicKey?: PublicKey + ): Promise; + getUpdateUserIdleIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + fillerPublicKey?: PublicKey + ): Promise; + logUserBalances( + userAccountPublicKey: PublicKey, + txParams?: TxParams + ): Promise; + getLogUserBalancesIx( + userAccountPublicKey: PublicKey + ): Promise; + updateUserFuelBonus( + userAccountPublicKey: PublicKey, + user: UserAccount, + userAuthority: PublicKey, + txParams?: TxParams + ): Promise; + getUpdateUserFuelBonusIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + userAuthority: PublicKey + ): Promise; + updateUserStatsReferrerStatus( + userAuthority: PublicKey, + txParams?: TxParams + ): Promise; + getUpdateUserStatsReferrerStatusIx( + userAuthority: PublicKey + ): Promise; + updateUserOpenOrdersCount( + userAccountPublicKey: PublicKey, + user: UserAccount, + txParams?: TxParams, + fillerPublicKey?: PublicKey + ): Promise; + getUpdateUserOpenOrdersCountIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + fillerPublicKey?: PublicKey + ): Promise; + placeAndTakePerpOrder( + orderParams: OptionalOrderParams, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + successCondition?: PlaceAndTakeOrderSuccessCondition, + auctionDurationPercentage?: number, + txParams?: TxParams, + subAccountId?: number + ): Promise; + preparePlaceAndTakePerpOrderWithAdditionalOrders( + orderParams: OptionalOrderParams, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + bracketOrdersParams?: OptionalOrderParams[], + txParams?: TxParams, + subAccountId?: number, + cancelExistingOrders?: boolean, + settlePnl?: boolean, + exitEarlyIfSimFails?: boolean, + auctionDurationPercentage?: number, + optionalIxs?: TransactionInstruction[] + ): Promise<{ + placeAndTakeTx: Transaction | VersionedTransaction; + cancelExistingOrdersTx: Transaction | VersionedTransaction; + settlePnlTx: Transaction | VersionedTransaction; + }>; + placeAndTakePerpWithAdditionalOrders( + orderParams: OptionalOrderParams, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + bracketOrdersParams?: OptionalOrderParams[], + txParams?: TxParams, + subAccountId?: number, + cancelExistingOrders?: boolean, + settlePnl?: boolean, + exitEarlyIfSimFails?: boolean + ): Promise<{ + txSig: TransactionSignature; + signedCancelExistingOrdersTx?: Transaction; + signedSettlePnlTx?: Transaction; + }>; + getPlaceAndTakePerpOrderIx( + orderParams: OptionalOrderParams, + makerInfo?: MakerInfo | MakerInfo[], + referrerInfo?: ReferrerInfo, + successCondition?: PlaceAndTakeOrderSuccessCondition, + auctionDurationPercentage?: number, + subAccountId?: number + ): Promise; + placeAndMakePerpOrder( + orderParams: OptionalOrderParams, + takerInfo: TakerInfo, + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getPlaceAndMakePerpOrderIx( + orderParams: OptionalOrderParams, + takerInfo: TakerInfo, + referrerInfo?: ReferrerInfo, + subAccountId?: number + ): Promise; + signSignedMsgOrderParamsMessage( + orderParamsMessage: + | SignedMsgOrderParamsMessage + | SignedMsgOrderParamsDelegateMessage, + delegateSigner?: boolean + ): SignedMsgOrderParams; + + /* + * Borsh encode signedMsg taker order params + */ + encodeSignedMsgOrderParamsMessage( + orderParamsMessage: + | SignedMsgOrderParamsMessage + | SignedMsgOrderParamsDelegateMessage, + delegateSigner?: boolean + ): Buffer; + + /* + * Decode signedMsg taker order params from borsh buffer + */ + decodeSignedMsgOrderParamsMessage( + encodedMessage: Buffer, + delegateSigner?: boolean + ): SignedMsgOrderParamsMessage | SignedMsgOrderParamsDelegateMessage; + + signMessage(message: Uint8Array, keypair?: Keypair): Buffer; + placeSignedMsgTakerOrder( + signedSignedMsgOrderParams: SignedMsgOrderParams, + marketIndex: number, + takerInfo: { + taker: PublicKey; + takerStats: PublicKey; + takerUserAccount: UserAccount; + signingAuthority: PublicKey; + }, + precedingIxs?: TransactionInstruction[], + overrideCustomIxIndex?: number, + txParams?: TxParams + ): Promise; + getPlaceSignedMsgTakerPerpOrderIxs( + signedSignedMsgOrderParams: SignedMsgOrderParams, + marketIndex: number, + takerInfo: { + taker: PublicKey; + takerStats: PublicKey; + takerUserAccount: UserAccount; + signingAuthority: PublicKey; + }, + precedingIxs?: TransactionInstruction[], + overrideCustomIxIndex?: number + ): Promise; + placeAndMakeSignedMsgPerpOrder( + signedSignedMsgOrderParams: SignedMsgOrderParams, + signedMsgOrderUuid: Uint8Array, + takerInfo: { + taker: PublicKey; + takerStats: PublicKey; + takerUserAccount: UserAccount; + signingAuthority: PublicKey; + }, + orderParams: OptionalOrderParams, + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + subAccountId?: number, + precedingIxs?: TransactionInstruction[], + overrideCustomIxIndex?: number + ): Promise; + getPlaceAndMakeSignedMsgPerpOrderIxs( + signedSignedMsgOrderParams: SignedMsgOrderParams, + signedMsgOrderUuid: Uint8Array, + takerInfo: { + taker: PublicKey; + takerStats: PublicKey; + takerUserAccount: UserAccount; + signingAuthority: PublicKey; + }, + orderParams: OptionalOrderParams, + referrerInfo?: ReferrerInfo, + subAccountId?: number, + precedingIxs?: TransactionInstruction[], + overrideCustomIxIndex?: number + ): Promise; + preparePlaceAndTakeSpotOrder( + orderParams: OptionalOrderParams, + fulfillmentConfig?: SerumV3FulfillmentConfigAccount, + makerInfo?: MakerInfo, + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + subAccountId?: number + ): Promise<{ + placeAndTakeSpotOrderTx: Transaction | VersionedTransaction; + }>; + placeAndTakeSpotOrder( + orderParams: OptionalOrderParams, + fulfillmentConfig?: SerumV3FulfillmentConfigAccount, + makerInfo?: MakerInfo, + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getPlaceAndTakeSpotOrderIx( + orderParams: OptionalOrderParams, + fulfillmentConfig?: SerumV3FulfillmentConfigAccount, + makerInfo?: MakerInfo, + referrerInfo?: ReferrerInfo, + subAccountId?: number + ): Promise; + placeAndMakeSpotOrder( + orderParams: OptionalOrderParams, + takerInfo: TakerInfo, + fulfillmentConfig?: SerumV3FulfillmentConfigAccount, + referrerInfo?: ReferrerInfo, + txParams?: TxParams, + subAccountId?: number + ): Promise; + getPlaceAndMakeSpotOrderIx( + orderParams: OptionalOrderParams, + takerInfo: TakerInfo, + fulfillmentConfig?: SerumV3FulfillmentConfigAccount, + referrerInfo?: ReferrerInfo, + subAccountId?: number + ): Promise; + + /** + * @deprecated use {@link placePerpOrder} or {@link placeAndTakePerpOrder} instead + */ + closePosition( + marketIndex: number, + limitPrice?: BN, + subAccountId?: number + ): Promise; + + /** + * Modifies an open order by closing it and replacing it with a new order. + * @deprecated use modifyOrder instead + * @param orderId: The open order to modify + * @param newBaseAmount: The new base amount for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @param newLimitPice: The new limit price for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @param newOraclePriceOffset: The new oracle price offset for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @returns + */ + modifyPerpOrder( + orderId: number, + newBaseAmount?: BN, + newLimitPrice?: BN, + newOraclePriceOffset?: number + ): Promise; + + /** + * Modifies an open order by closing it and replacing it with a new order. + * @deprecated use modifyOrderByUserOrderId instead + * @param userOrderId: The open order to modify + * @param newBaseAmount: The new base amount for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @param newLimitPice: The new limit price for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @param newOraclePriceOffset: The new oracle price offset for the order. One of [newBaseAmount|newLimitPrice|newOraclePriceOffset] must be provided. + * @returns + */ + modifyPerpOrderByUserOrderId( + userOrderId: number, + newBaseAmount?: BN, + newLimitPrice?: BN, + newOraclePriceOffset?: number + ): Promise; + + /** + * Modifies an open order (spot or perp) by closing it and replacing it with a new order. + * @param orderParams.orderId: The open order to modify + * @param orderParams.newDirection: The new direction for the order + * @param orderParams.newBaseAmount: The new base amount for the order + * @param orderParams.newLimitPice: The new limit price for the order + * @param orderParams.newOraclePriceOffset: The new oracle price offset for the order + * @param orderParams.newTriggerPrice: Optional - Thew new trigger price for the order. + * @param orderParams.auctionDuration: + * @param orderParams.auctionStartPrice: + * @param orderParams.auctionEndPrice: + * @param orderParams.reduceOnly: + * @param orderParams.postOnly: + * @param orderParams.bitFlags: + * @param orderParams.policy: + * @param orderParams.maxTs: + * @returns + */ + modifyOrder( + orderParams: { + orderId: number; + newDirection?: PositionDirection; + newBaseAmount?: BN; + newLimitPrice?: BN; + newOraclePriceOffset?: number; + newTriggerPrice?: BN; + newTriggerCondition?: OrderTriggerCondition; + auctionDuration?: number; + auctionStartPrice?: BN; + auctionEndPrice?: BN; + reduceOnly?: boolean; + postOnly?: boolean; + bitFlags?: number; + maxTs?: BN; + policy?: number; + }, + txParams?: TxParams, + subAccountId?: number + ): Promise; + + getModifyOrderIx( + orderParams: { + orderId: number; + newDirection?: PositionDirection; + newBaseAmount?: BN; + newLimitPrice?: BN; + newOraclePriceOffset?: number; + newTriggerPrice?: BN; + newTriggerCondition?: OrderTriggerCondition; + auctionDuration?: number; + auctionStartPrice?: BN; + auctionEndPrice?: BN; + reduceOnly?: boolean; + postOnly?: boolean; + bitFlags?: number; + maxTs?: BN; + policy?: number; + }, + subAccountId?: number + ): Promise; + + /** + * Modifies an open order by closing it and replacing it with a new order. + * @param orderParams.userOrderId: The open order to modify + * @param orderParams.newDirection: The new direction for the order + * @param orderParams.newBaseAmount: The new base amount for the order + * @param orderParams.newLimitPice: The new limit price for the order + * @param orderParams.newOraclePriceOffset: The new oracle price offset for the order + * @param orderParams.newTriggerPrice: Optional - Thew new trigger price for the order. + * @param orderParams.auctionDuration: Only required if order type changed to market from something else + * @param orderParams.auctionStartPrice: Only required if order type changed to market from something else + * @param orderParams.auctionEndPrice: Only required if order type changed to market from something else + * @param orderParams.reduceOnly: + * @param orderParams.postOnly: + * @param orderParams.bitFlags: + * @param orderParams.policy: + * @param orderParams.maxTs: + * @returns + */ + modifyOrderByUserOrderId( + orderParams: { + userOrderId: number; + newDirection?: PositionDirection; + newBaseAmount?: BN; + newLimitPrice?: BN; + newOraclePriceOffset?: number; + newTriggerPrice?: BN; + newTriggerCondition?: OrderTriggerCondition; + auctionDuration?: number; + auctionStartPrice?: BN; + auctionEndPrice?: BN; + reduceOnly?: boolean; + postOnly?: boolean; + bitFlags?: number; + policy?: ModifyOrderPolicy; + maxTs?: BN; + }, + txParams?: TxParams, + subAccountId?: number + ): Promise; + + getModifyOrderByUserIdIx( + orderParams: { + userOrderId: number; + newDirection?: PositionDirection; + newBaseAmount?: BN; + newLimitPrice?: BN; + newOraclePriceOffset?: number; + newTriggerPrice?: BN; + newTriggerCondition?: OrderTriggerCondition; + auctionDuration?: number; + auctionStartPrice?: BN; + auctionEndPrice?: BN; + reduceOnly?: boolean; + postOnly?: boolean; + bitFlags?: number; + policy?: ModifyOrderPolicy; + maxTs?: BN; + txParams?: TxParams; + }, + subAccountId?: number + ): Promise; + settlePNLs( + users: { + settleeUserAccountPublicKey: PublicKey; + settleeUserAccount: UserAccount; + }[], + marketIndexes: number[], + opts?: { + filterInvalidMarkets?: boolean; + }, + txParams?: TxParams + ): Promise; + getSettlePNLsIxs( + users: { + settleeUserAccountPublicKey: PublicKey; + settleeUserAccount: UserAccount; + }[], + marketIndexes: number[] + ): Promise; + settlePNL( + settleeUserAccountPublicKey: PublicKey, + settleeUserAccount: UserAccount, + marketIndex: number, + txParams?: TxParams, + optionalIxs?: TransactionInstruction[] + ): Promise; + settlePNLIx( + settleeUserAccountPublicKey: PublicKey, + settleeUserAccount: UserAccount, + marketIndex: number + ): Promise; + settleMultiplePNLs( + settleeUserAccountPublicKey: PublicKey, + settleeUserAccount: UserAccount, + marketIndexes: number[], + mode: SettlePnlMode, + txParams?: TxParams + ): Promise; + settleMultiplePNLsMultipleTxs( + settleeUserAccountPublicKey: PublicKey, + settleeUserAccount: UserAccount, + marketIndexes: number[], + mode: SettlePnlMode, + txParams?: TxParams, + optionalIxs?: TransactionInstruction[] + ): Promise; + settleMultiplePNLsIx( + settleeUserAccountPublicKey: PublicKey, + settleeUserAccount: UserAccount, + marketIndexes: number[], + mode: SettlePnlMode + ): Promise; + getSetUserStatusToBeingLiquidatedIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount + ): Promise; + setUserStatusToBeingLiquidated( + userAccountPublicKey: PublicKey, + userAccount: UserAccount + ): Promise; + liquidatePerp( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + maxBaseAssetAmount: BN, + limitPrice?: BN, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getLiquidatePerpIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + maxBaseAssetAmount: BN, + limitPrice?: BN, + liquidatorSubAccountId?: number + ): Promise; + liquidatePerpWithFill( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + makerInfos: MakerInfo[], + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getLiquidatePerpWithFillIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + makerInfos: MakerInfo[], + liquidatorSubAccountId?: number + ): Promise; + liquidateSpot( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + assetMarketIndex: number, + liabilityMarketIndex: number, + maxLiabilityTransfer: BN, + limitPrice?: BN, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getLiquidateSpotIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + assetMarketIndex: number, + liabilityMarketIndex: number, + maxLiabilityTransfer: BN, + limitPrice?: BN, + liquidatorSubAccountId?: number + ): Promise; + getJupiterLiquidateSpotWithSwapIxV6(params: { + jupiterClient: JupiterClient; + liabilityMarketIndex: number; + assetMarketIndex: number; + swapAmount: BN; + assetTokenAccount?: PublicKey; + liabilityTokenAccount?: PublicKey; + slippageBps?: number; + swapMode?: SwapMode; + onlyDirectRoutes?: boolean; + quote?: QuoteResponse; + userAccount: UserAccount; + userAccountPublicKey: PublicKey; + userStatsAccountPublicKey: PublicKey; + liquidatorSubAccountId?: number; + maxAccounts?: number; + }): Promise<{ + ixs: TransactionInstruction[]; + lookupTables: AddressLookupTableAccount[]; + }>; + + /** + * Get the drift liquidate_spot_with_swap instructions + * + * @param liabilityMarketIndex the market index of the token you're buying + * @param assetMarketIndex the market index of the token you're selling + * @param amountIn the amount of the token to sell + * @param assetTokenAccount the token account to move the tokens being sold + * @param liabilityTokenAccount the token account to receive the tokens being bought + * @param userAccount + * @param userAccountPublicKey + * @param userStatsAccountPublicKey + */ + getLiquidateSpotWithSwapIx(params: { + liabilityMarketIndex: number; + assetMarketIndex: number; + swapAmount: BN; + assetTokenAccount: PublicKey; + liabilityTokenAccount: PublicKey; + userAccount: UserAccount; + userAccountPublicKey: PublicKey; + userStatsAccountPublicKey: PublicKey; + liquidatorSubAccountId?: number; + }): Promise<{ + beginSwapIx: TransactionInstruction; + endSwapIx: TransactionInstruction; + }>; + + getInsuranceFundSwapIx(params: { + inMarketIndex: number; + outMarketIndex: number; + amountIn: BN; + inTokenAccount: PublicKey; + outTokenAccount: PublicKey; + }): Promise<{ + beginSwapIx: TransactionInstruction; + endSwapIx: TransactionInstruction; + }>; + liquidateBorrowForPerpPnl( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + perpMarketIndex: number, + liabilityMarketIndex: number, + maxLiabilityTransfer: BN, + limitPrice?: BN, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getLiquidateBorrowForPerpPnlIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + perpMarketIndex: number, + liabilityMarketIndex: number, + maxLiabilityTransfer: BN, + limitPrice?: BN, + liquidatorSubAccountId?: number + ): Promise; + liquidatePerpPnlForDeposit( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + perpMarketIndex: number, + assetMarketIndex: number, + maxPnlTransfer: BN, + limitPrice?: BN, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getLiquidatePerpPnlForDepositIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + perpMarketIndex: number, + assetMarketIndex: number, + maxPnlTransfer: BN, + limitPrice?: BN, + liquidatorSubAccountId?: number + ): Promise; + resolvePerpBankruptcy( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getResolvePerpBankruptcyIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + liquidatorSubAccountId?: number + ): Promise; + resolveSpotBankruptcy( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + txParams?: TxParams, + liquidatorSubAccountId?: number + ): Promise; + getResolveSpotBankruptcyIx( + userAccountPublicKey: PublicKey, + userAccount: UserAccount, + marketIndex: number, + liquidatorSubAccountId?: number + ): Promise; + updateFundingRate( + perpMarketIndex: number, + oracle: PublicKey, + txParams?: TxParams + ): Promise; + getUpdateFundingRateIx( + perpMarketIndex: number, + oracle: PublicKey + ): Promise; + updatePrelaunchOracle( + perpMarketIndex: number, + txParams?: TxParams + ): Promise; + getUpdatePrelaunchOracleIx( + perpMarketIndex: number + ): Promise; + updatePerpBidAskTwap( + perpMarketIndex: number, + makers: [PublicKey, PublicKey][], + txParams?: TxParams + ): Promise; + getUpdatePerpBidAskTwapIx( + perpMarketIndex: number, + makers: [PublicKey, PublicKey][] + ): Promise; + settleFundingPayment( + userAccountPublicKey: PublicKey, + txParams?: TxParams + ): Promise; + getSettleFundingPaymentIx( + userAccountPublicKey: PublicKey + ): Promise; + triggerEvent(eventName: keyof DriftClientAccountEvents, data?: any): void; + getOracleDataForPerpMarket(marketIndex: number): OraclePriceData; + getMMOracleDataForPerpMarket(marketIndex: number): OraclePriceData; + getOracleDataForSpotMarket(marketIndex: number): OraclePriceData; + initializeInsuranceFundStake( + marketIndex: number, + txParams?: TxParams + ): Promise; + getInitializeInsuranceFundStakeIx( + marketIndex: number + ): Promise; + getAddInsuranceFundStakeIx( + marketIndex: number, + amount: BN, + collateralAccountPublicKey: PublicKey + ): Promise; + + /** + * Add to an insurance fund stake and optionally initialize the account + */ + addInsuranceFundStake(params: { + /** + * Spot market index + */ + marketIndex: number; + amount: BN; + /** + * The account where the funds to stake come from. Usually an associated token account + */ + collateralAccountPublicKey: PublicKey; + /** + * Add instructions to initialize the staking account -- required if its the first time the currrent authority has staked in this market + */ + initializeStakeAccount?: boolean; + /** + * Optional -- withdraw from current subaccount to fund stake amount, instead of wallet balance + */ + fromSubaccount?: boolean; + txParams?: TxParams; + }): Promise; + + /** + * Get instructions to add to an insurance fund stake and optionally initialize the account + */ + getAddInsuranceFundStakeIxs(params: { + /** + * Spot market index + */ + marketIndex: number; + amount: BN; + /** + * The account where the funds to stake come from. Usually an associated token account + */ + collateralAccountPublicKey: PublicKey; + /** + * Add instructions to initialize the staking account -- required if its the first time the currrent authority has staked in this market + */ + initializeStakeAccount?: boolean; + /** + * Optional -- withdraw from current subaccount to fund stake amount, instead of wallet balance + */ + fromSubaccount?: boolean; + }): Promise; + + requestRemoveInsuranceFundStake( + marketIndex: number, + amount: BN, + txParams?: TxParams + ): Promise; + cancelRequestRemoveInsuranceFundStake( + marketIndex: number, + txParams?: TxParams + ): Promise; + removeInsuranceFundStake( + marketIndex: number, + collateralAccountPublicKey: PublicKey, + txParams?: TxParams + ): Promise; + updateUserQuoteAssetInsuranceStake( + authority: PublicKey, + txParams?: TxParams + ): Promise; + getUpdateUserQuoteAssetInsuranceStakeIx( + authority: PublicKey + ): Promise; + updateUserGovTokenInsuranceStake( + authority: PublicKey, + txParams?: TxParams, + env?: DriftEnv + ): Promise; + getUpdateUserGovTokenInsuranceStakeIx( + authority: PublicKey + ): Promise; + getUpdateUserGovTokenInsuranceStakeDevnetIx( + authority: PublicKey, + amount?: BN + ): Promise; + settleRevenueToInsuranceFund( + spotMarketIndex: number, + txParams?: TxParams + ): Promise; + getSettleRevenueToInsuranceFundIx( + spotMarketIndex: number + ): Promise; + resolvePerpPnlDeficit( + spotMarketIndex: number, + perpMarketIndex: number, + txParams?: TxParams + ): Promise; + getResolvePerpPnlDeficitIx( + spotMarketIndex: number, + perpMarketIndex: number + ): Promise; + getDepositIntoSpotMarketRevenuePoolIx( + marketIndex: number, + amount: BN, + userTokenAccountPublicKey: PublicKey + ): Promise; + + /** + * This ix will donate your funds to drift revenue pool. It does not deposit into your user account + * @param marketIndex + * @param amount + * @param userTokenAccountPublicKey + * @returns + */ + depositIntoSpotMarketRevenuePool( + marketIndex: number, + amount: BN, + userTokenAccountPublicKey: PublicKey + ): Promise; + + getPerpMarketExtendedInfo(marketIndex: number): PerpMarketExtendedInfo; + + /** + * Calculates taker / maker fee (as a percentage, e.g. .001 = 10 basis points) for particular marketType + * @param marketType + * @param positionMarketIndex + * @returns : {takerFee: number, makerFee: number} Precision None + */ + getMarketFees( + marketType: MarketType, + marketIndex?: number, + user?: IUser, + enteringHighLeverageMode?: boolean + ): { takerFee: number; makerFee: number }; + + /** + * Returns the market index and type for a given market name + * E.g. "SOL-PERP" -> { marketIndex: 0, marketType: MarketType.PERP } + * + * @param name + */ + getMarketIndexAndType( + name: string + ): { marketIndex: number; marketType: MarketType } | undefined; + + getReceiverProgram(): Program; + getSwitchboardOnDemandProgram(): Promise>; + postPythPullOracleUpdateAtomic( + vaaString: string, + feedId: string + ): Promise; + postMultiPythPullOracleUpdatesAtomic( + vaaString: string, + feedIds: string[] + ): Promise; + getPostPythPullOracleUpdateAtomicIxs( + vaaString: string, + feedIds: string | string[], + numSignatures?: number + ): Promise; + updatePythPullOracle( + vaaString: string, + feedId: string + ): Promise; + getUpdatePythPullOracleIxs( + params: { + merklePriceUpdate: { + message: Buffer; + proof: number[][]; + }; + }, + feedId: string, + encodedVaaAddress: PublicKey + ): Promise; + postPythLazerOracleUpdate( + feedIds: number[], + pythMessageHex: string + ): Promise; + getPostPythLazerOracleUpdateIxs( + feedIds: number[], + pythMessageHex: string, + precedingIxs?: TransactionInstruction[], + overrideCustomIxIndex?: number + ): Promise; + getPostManySwitchboardOnDemandUpdatesAtomicIxs( + feeds: PublicKey[], + recentSlothash?: Slothash, + numSignatures?: number + ): Promise; + + // @deprecated use getPostManySwitchboardOnDemandUpdatesAtomicIxs instead. This function no longer returns the required ixs due to upstream sdk changes. + getPostSwitchboardOnDemandUpdateAtomicIx( + feed: PublicKey, + recentSlothash?: Slothash, + numSignatures?: number + ): Promise; + + postSwitchboardOnDemandUpdate( + feed: PublicKey, + recentSlothash?: Slothash, + numSignatures?: number + ): Promise; + enableUserHighLeverageMode( + subAccountId: number, + txParams?: TxParams + ): Promise; + getEnableHighLeverageModeIx( + subAccountId: number, + depositToTradeArgs?: { + isMakingNewAccount: boolean; + depositMarketIndex: number; + orderMarketIndex: number; + } + ): Promise; + disableUserHighLeverageMode( + user: PublicKey, + userAccount?: UserAccount, + txParams?: TxParams + ): Promise; + getDisableHighLeverageModeIx( + user: PublicKey, + userAccount?: UserAccount + ): Promise; + fetchHighLeverageModeConfig(): Promise; + fetchProtectedMakerModeConfig(): Promise; + updateUserProtectedMakerOrders( + subAccountId: number, + protectedOrders: boolean, + authority?: PublicKey, + txParams?: TxParams + ): Promise; + getUpdateUserProtectedMakerOrdersIx( + subAccountId: number, + protectedOrders: boolean, + authority?: PublicKey + ): Promise; + getPauseSpotMarketDepositWithdrawIx( + spotMarketIndex: number + ): Promise; + pauseSpotMarketDepositWithdraw( + spotMarketIndex: number, + txParams?: TxParams + ): Promise; + updateMmOracleNative( + marketIndex: number, + oraclePrice: BN, + oracleSequenceId: BN + ): Promise; + getUpdateMmOracleNativeIx( + marketIndex: number, + oraclePrice: BN, + oracleSequenceId: BN + ): Promise; + updateAmmSpreadAdjustmentNative( + marketIndex: number, + ammSpreadAdjustment: number + ): Promise; + getUpdateAmmSpreadAdjustmentNativeIx( + marketIndex: number, + ammSpreadAdjustment: number + ): TransactionInstruction; + + /** + * Send a transaction. + * + * @param tx + * @param additionalSigners + * @param opts :: Will fallback to DriftClient's opts if not provided + * @param preSigned + * @returns + */ + sendTransaction( + tx: Transaction | VersionedTransaction, + additionalSigners?: Signer[], + opts?: ConfirmOptions, + preSigned?: boolean + ): Promise; + + buildTransaction( + instructions: TransactionInstruction | TransactionInstruction[], + txParams?: TxParams, + txVersion?: TransactionVersion, + lookupTables?: AddressLookupTableAccount[], + forceVersionedTransaction?: boolean, + recentBlockhash?: BlockhashWithExpiryBlockHeight, + optionalIxs?: TransactionInstruction[] + ): Promise; + buildBulkTransactions( + instructions: (TransactionInstruction | TransactionInstruction[])[], + txParams?: TxParams, + txVersion?: TransactionVersion, + lookupTables?: AddressLookupTableAccount[], + forceVersionedTransaction?: boolean + ): Promise<(Transaction | VersionedTransaction)[]>; + buildTransactionsMap( + instructionsMap: Record< + string, + TransactionInstruction | TransactionInstruction[] + >, + txParams?: TxParams, + txVersion?: TransactionVersion, + lookupTables?: AddressLookupTableAccount[], + forceVersionedTransaction?: boolean + ): ReturnType; + buildAndSignTransactionsMap( + instructionsMap: Record< + string, + TransactionInstruction | TransactionInstruction[] + >, + txParams?: TxParams, + txVersion?: TransactionVersion, + lookupTables?: AddressLookupTableAccount[], + forceVersionedTransaction?: boolean + ): ReturnType; +} diff --git a/sdk/src/driftClientConfig.ts b/sdk/src/driftClientConfig.ts index e833bd54e4..07201c51d5 100644 --- a/sdk/src/driftClientConfig.ts +++ b/sdk/src/driftClientConfig.ts @@ -7,8 +7,8 @@ import { } from '@solana/web3.js'; import { IWallet, TxParams } from './types'; import { OracleInfo } from './oracles/types'; -import { BulkAccountLoader } from './accounts/bulkAccountLoader'; -import { DriftEnv } from './config'; +import { BulkAccountLoader } from './accounts/bulkAccountLoader/bulkAccountLoader'; +import { DriftEnv } from './config/types'; import { TxSender } from './tx/types'; import { TxHandler, TxHandlerConfig } from './tx/txHandler'; import { DelistedMarketSetting, GrpcConfigs } from './accounts/types'; diff --git a/sdk/src/events/types.ts b/sdk/src/events/types.ts index 3c4c92548c..2671344ceb 100644 --- a/sdk/src/events/types.ts +++ b/sdk/src/events/types.ts @@ -21,7 +21,7 @@ import { FuelSeasonRecord, InsuranceFundSwapRecord, TransferProtocolIfSharesToRevenuePoolRecord, -} from '../index'; +} from '../types'; import { EventEmitter } from 'events'; export type EventSubscriptionOptions = { diff --git a/sdk/src/index.ts b/sdk/src/index.ts index cd39f6abe3..aa09c8c4e4 100644 --- a/sdk/src/index.ts +++ b/sdk/src/index.ts @@ -9,35 +9,36 @@ export * from './oracles/strictOraclePrice'; export * from './types'; export * from './constants/perpMarkets'; export * from './accounts/fetch'; -export * from './accounts/webSocketDriftClientAccountSubscriber'; -export * from './accounts/webSocketInsuranceFundStakeAccountSubscriber'; -export * from './accounts/webSocketHighLeverageModeConfigAccountSubscriber'; -export * from './accounts/bulkAccountLoader'; +export * from './accounts/driftClientAccount/webSocketDriftClientAccountSubscriber'; +export * from './accounts/insuranceFundStakeAccount/webSocketInsuranceFundStakeAccountSubscriber'; +export * from './accounts/highLeverageModeConfigAccount/webSocketHighLeverageModeConfigAccountSubscriber'; +export * from './accounts/bulkAccountLoader/bulkAccountLoader'; export * from './accounts/bulkUserSubscription'; export * from './accounts/bulkUserStatsSubscription'; -export { CustomizedCadenceBulkAccountLoader } from './accounts/customizedCadenceBulkAccountLoader'; -export * from './accounts/pollingDriftClientAccountSubscriber'; -export * from './accounts/pollingOracleAccountSubscriber'; -export * from './accounts/pollingTokenAccountSubscriber'; -export * from './accounts/pollingUserAccountSubscriber'; -export * from './accounts/pollingUserStatsAccountSubscriber'; -export * from './accounts/pollingInsuranceFundStakeAccountSubscriber'; -export * from './accounts/pollingHighLeverageModeConfigAccountSubscriber'; -export * from './accounts/basicUserAccountSubscriber'; -export * from './accounts/oneShotUserAccountSubscriber'; +export { CustomizedCadenceBulkAccountLoader } from './accounts/bulkAccountLoader/customizedCadenceBulkAccountLoader'; +export * from './accounts/driftClientAccount/pollingDriftClientAccountSubscriber'; +export * from './accounts/oracleAccount/pollingOracleAccountSubscriber'; +export * from './accounts/tokenAccount/pollingTokenAccountSubscriber'; +export * from './accounts/userAccount/pollingUserAccountSubscriber'; +export * from './accounts/userStatsAccount/pollingUserStatsAccountSubscriber'; +export * from './accounts/insuranceFundStakeAccount/pollingInsuranceFundStakeAccountSubscriber'; +export * from './accounts/highLeverageModeConfigAccount/pollingHighLeverageModeConfigAccountSubscriber'; +export * from './accounts/userAccount/basicUserAccountSubscriber'; +export * from './accounts/userAccount/oneShotUserAccountSubscriber'; export * from './accounts/types'; export * from './addresses/pda'; export * from './adminClient'; export * from './assert/assert'; export * from './testClient'; export * from './user'; -export * from './userConfig'; +export * from './user/types'; export * from './userStats'; export * from './userName'; export * from './userStatsConfig'; export * from './decode/user'; export * from './decode/customCoder'; export * from './driftClient'; +export * from './driftClient/types'; export * from './factory/oracleClient'; export * from './factory/bigNum'; export * from './events/types'; @@ -76,7 +77,11 @@ export * from './keypair'; export * from './types'; export * from './math/utils'; export * from './math/fuel'; + +/** Config */ export * from './config'; +export * from './config/types'; + export * from './constants/numericConstants'; export * from './serum/serumSubscriber'; export * from './serum/serumFulfillmentConfigMap'; @@ -109,16 +114,24 @@ export * from './util/pythOracleUtils'; export * from './math/spotBalance'; export * from './constants/spotMarkets'; export * from './driftClientConfig'; + +/** DLOB */ export * from './dlob/DLOB'; export * from './dlob/DLOBNode'; export * from './dlob/NodeList'; export * from './dlob/DLOBSubscriber'; export * from './dlob/types'; export * from './dlob/orderBookLevels'; +export * from './dlob/utils'; + +/** UserMap */ export * from './userMap/userMap'; export * from './userMap/referrerMap'; export * from './userMap/userStatsMap'; export * from './userMap/userMapConfig'; +export * from './userMap/events'; +export * from './userMap/types'; + export * from './math/bankruptcy'; export * from './orderSubscriber'; export * from './orderSubscriber/types'; diff --git a/sdk/src/math/amm.ts b/sdk/src/math/amm.ts index cf46acfd73..ed26de9be7 100644 --- a/sdk/src/math/amm.ts +++ b/sdk/src/math/amm.ts @@ -24,7 +24,7 @@ import { } from '../types'; import { assert } from '../assert/assert'; import { squareRootBN, sigNum, clampBN } from './utils'; -import { standardizeBaseAssetAmount } from './orders'; +import { standardizeBaseAssetAmount } from './utils'; import { OraclePriceData } from '../oracles/types'; import { diff --git a/sdk/src/math/insurance.ts b/sdk/src/math/insurance.ts index 093a780073..db846e0e4f 100644 --- a/sdk/src/math/insurance.ts +++ b/sdk/src/math/insurance.ts @@ -1,6 +1,7 @@ import { PERCENTAGE_PRECISION, ZERO } from '../constants/numericConstants'; -import { BN, SpotMarketAccount, SpotBalanceType } from '../index'; +import { SpotMarketAccount, SpotBalanceType } from '../types'; import { getTokenAmount } from '../math/spotBalance'; +import { BN } from '@coral-xyz/anchor'; export function nextRevenuePoolSettleApr( spotMarket: SpotMarketAccount, diff --git a/sdk/src/math/margin.ts b/sdk/src/math/margin.ts index cba701015e..26fa69e3df 100644 --- a/sdk/src/math/margin.ts +++ b/sdk/src/math/margin.ts @@ -15,8 +15,7 @@ import { BN } from '@coral-xyz/anchor'; import { OraclePriceData } from '../oracles/types'; import { calculateMarketMarginRatio } from './market'; import { calculateScaledInitialAssetWeight } from './spotBalance'; -import { DriftClient } from '../driftClient'; -import { OneShotUserAccountSubscriber } from '../accounts/oneShotUserAccountSubscriber'; +import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; import { PerpMarketAccount, PerpPosition, @@ -27,6 +26,7 @@ import { PublicKey } from '@solana/web3.js'; import { User } from '../user'; import { isVariant } from '../types'; import { assert } from '../assert/assert'; +import { IDriftClient } from '../driftClient/types'; export function calculateSizePremiumLiabilityWeight( size: BN, // AMM_RESERVE_PRECISION @@ -216,7 +216,7 @@ export function calculatePerpLiabilityValue( * @returns */ export function calculateMarginUSDCRequiredForTrade( - driftClient: DriftClient, + driftClient: IDriftClient, targetMarketIndex: number, baseSize: BN, userMaxMarginRatio?: number, @@ -256,7 +256,7 @@ export function calculateMarginUSDCRequiredForTrade( * Returns collateral required in the precision of the target collateral market. */ export function calculateCollateralDepositRequiredForTrade( - driftClient: DriftClient, + driftClient: IDriftClient, targetMarketIndex: number, baseSize: BN, collateralIndex: number, @@ -298,7 +298,7 @@ export function calculateCollateralDepositRequiredForTrade( } export function calculateCollateralValueOfDeposit( - driftClient: DriftClient, + driftClient: IDriftClient, collateralIndex: number, baseSize: BN ): BN { @@ -345,7 +345,7 @@ export function calculateLiquidationPrice( } export function calculateUserMaxPerpOrderSize( - driftClient: DriftClient, + driftClient: IDriftClient, userAccountKey: PublicKey, userAccount: UserAccount, targetMarketIndex: number, diff --git a/sdk/src/math/market.ts b/sdk/src/math/market.ts index 26857777c6..12e4a37a5c 100644 --- a/sdk/src/math/market.ts +++ b/sdk/src/math/market.ts @@ -32,7 +32,7 @@ import { FUNDING_RATE_PRECISION, } from '../constants/numericConstants'; import { getTokenAmount } from './spotBalance'; -import { DLOB } from '../dlob/DLOB'; +import { IDLOB } from '../dlob/types'; import { assert } from '../assert/assert'; /** @@ -299,7 +299,7 @@ export function calculateNetUserPnlImbalance( export function calculateAvailablePerpLiquidity( market: PerpMarketAccount, oraclePriceData: OraclePriceData, - dlob: DLOB, + dlob: IDLOB, slot: number ): { bids: BN; asks: BN } { let [bids, asks] = calculateMarketOpenBidAsk( diff --git a/sdk/src/math/oracles.ts b/sdk/src/math/oracles.ts index bfbd88702c..8873c66150 100644 --- a/sdk/src/math/oracles.ts +++ b/sdk/src/math/oracles.ts @@ -1,4 +1,11 @@ -import { AMM, OracleGuardRails, isVariant } from '../types'; +import { + AMM, + HistoricalOracleData, + OracleGuardRails, + OracleSource, + PerpMarketAccount, + isVariant, +} from '../types'; import { OraclePriceData } from '../oracles/types'; import { BID_ASK_SPREAD_PRECISION, @@ -9,13 +16,8 @@ import { FIVE_MINUTE, PERCENTAGE_PRECISION, } from '../constants/numericConstants'; -import { - BN, - HistoricalOracleData, - OracleSource, - PerpMarketAccount, -} from '../index'; import { assert } from '../assert/assert'; +import { BN } from '@coral-xyz/anchor'; export function oraclePriceBands( market: PerpMarketAccount, diff --git a/sdk/src/math/orders.ts b/sdk/src/math/orders.ts index 7be65e58ce..c829a673a4 100644 --- a/sdk/src/math/orders.ts +++ b/sdk/src/math/orders.ts @@ -1,4 +1,3 @@ -import { User } from '../user'; import { isOneOfVariant, isVariant, @@ -21,8 +20,10 @@ import { calculateMaxBaseAssetAmountToTrade, calculateUpdatedAMM, } from './amm'; +import { standardizeBaseAssetAmount } from './utils'; +import { IUser } from '../user/types'; -export function isOrderRiskIncreasing(user: User, order: Order): boolean { +export function isOrderRiskIncreasing(user: IUser, order: Order): boolean { if (!isVariant(order.status, 'open')) { return false; } @@ -61,7 +62,7 @@ export function isOrderRiskIncreasing(user: User, order: Order): boolean { } export function isOrderRiskIncreasingInSameDirection( - user: User, + user: IUser, order: Order ): boolean { if (!isVariant(order.status, 'open')) { @@ -93,7 +94,7 @@ export function isOrderRiskIncreasingInSameDirection( return false; } -export function isOrderReduceOnly(user: User, order: Order): boolean { +export function isOrderReduceOnly(user: IUser, order: Order): boolean { if (!isVariant(order.status, 'open')) { return false; } @@ -121,14 +122,6 @@ export function isOrderReduceOnly(user: User, order: Order): boolean { return true; } -export function standardizeBaseAssetAmount( - baseAssetAmount: BN, - stepSize: BN -): BN { - const remainder = baseAssetAmount.mod(stepSize); - return baseAssetAmount.sub(remainder); -} - export function standardizePrice( price: BN, tickSize: BN, diff --git a/sdk/src/math/utils.ts b/sdk/src/math/utils.ts index fcebbdb78d..e5ad56b67a 100644 --- a/sdk/src/math/utils.ts +++ b/sdk/src/math/utils.ts @@ -119,3 +119,11 @@ export function numberToSafeBN(number: number, precision: BN): BN { } } } + +export function standardizeBaseAssetAmount( + baseAssetAmount: BN, + stepSize: BN +): BN { + const remainder = baseAssetAmount.mod(stepSize); + return baseAssetAmount.sub(remainder); +} diff --git a/sdk/src/openbook/openbookV2Subscriber.ts b/sdk/src/openbook/openbookV2Subscriber.ts index 39348252ca..696862dfae 100644 --- a/sdk/src/openbook/openbookV2Subscriber.ts +++ b/sdk/src/openbook/openbookV2Subscriber.ts @@ -1,5 +1,5 @@ import { Connection, Keypair, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from '../accounts/bulkAccountLoader'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; import { PRICE_PRECISION } from '../constants/numericConstants'; import { AnchorProvider, BN, Idl, Program, Wallet } from '@coral-xyz/anchor'; import { L2Level, L2OrderBookGenerator } from '../dlob/orderBookLevels'; diff --git a/sdk/src/orderSubscriber/OrderSubscriber.ts b/sdk/src/orderSubscriber/OrderSubscriber.ts index 2c0b95bb69..26d44341c6 100644 --- a/sdk/src/orderSubscriber/OrderSubscriber.ts +++ b/sdk/src/orderSubscriber/OrderSubscriber.ts @@ -1,4 +1,4 @@ -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { UserAccount } from '../types'; import { getNonIdleUserFilter, @@ -8,20 +8,24 @@ import { import { Commitment, PublicKey, RpcResponseAndContext } from '@solana/web3.js'; import { Buffer } from 'buffer'; import { DLOB } from '../dlob/DLOB'; -import { OrderSubscriberConfig, OrderSubscriberEvents } from './types'; +import { + IOrderSubscriber, + OrderSubscriberConfig, + OrderSubscriberEvents, +} from './types'; import { PollingSubscription } from './PollingSubscription'; import { WebsocketSubscription } from './WebsocketSubscription'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { calculateOrderBaseAssetAmount, ZERO } from '../index'; -import { BN } from '@coral-xyz/anchor'; -import { ProtectMakerParamsMap } from '../dlob/types'; import { decodeUser } from '../decode/user'; import { grpcSubscription } from './grpcSubscription'; import { isUserProtectedMaker } from '../math/userStatus'; +import { BN } from '@coral-xyz/anchor'; +import { ProtectMakerParamsMap } from '../dlob/types'; -export class OrderSubscriber { - driftClient: DriftClient; +export class OrderSubscriber implements IOrderSubscriber { + driftClient: IDriftClient; usersAccounts = new Map(); subscription: PollingSubscription | WebsocketSubscription | grpcSubscription; commitment: Commitment; diff --git a/sdk/src/orderSubscriber/PollingSubscription.ts b/sdk/src/orderSubscriber/PollingSubscription.ts index cc6c8a0cf2..e19dd67764 100644 --- a/sdk/src/orderSubscriber/PollingSubscription.ts +++ b/sdk/src/orderSubscriber/PollingSubscription.ts @@ -1,7 +1,7 @@ -import { OrderSubscriber } from './OrderSubscriber'; +import { IOrderSubscriber } from './types'; export class PollingSubscription { - private orderSubscriber: OrderSubscriber; + private orderSubscriber: IOrderSubscriber; private frequency: number; intervalId?: ReturnType; @@ -10,7 +10,7 @@ export class PollingSubscription { orderSubscriber, frequency, }: { - orderSubscriber: OrderSubscriber; + orderSubscriber: IOrderSubscriber; frequency: number; }) { this.orderSubscriber = orderSubscriber; diff --git a/sdk/src/orderSubscriber/WebsocketSubscription.ts b/sdk/src/orderSubscriber/WebsocketSubscription.ts index ade8efc6ae..769fc474bf 100644 --- a/sdk/src/orderSubscriber/WebsocketSubscription.ts +++ b/sdk/src/orderSubscriber/WebsocketSubscription.ts @@ -1,12 +1,12 @@ -import { OrderSubscriber } from './OrderSubscriber'; import { getNonIdleUserFilter, getUserFilter } from '../memcmp'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { UserAccount } from '../types'; import { Commitment, Context, PublicKey } from '@solana/web3.js'; import { ResubOpts } from '../accounts/types'; +import { IOrderSubscriber } from './types'; export class WebsocketSubscription { - private orderSubscriber: OrderSubscriber; + private orderSubscriber: IOrderSubscriber; private commitment: Commitment; private skipInitialLoad: boolean; private resubOpts?: ResubOpts; @@ -25,7 +25,7 @@ export class WebsocketSubscription { resyncIntervalMs, decoded = true, }: { - orderSubscriber: OrderSubscriber; + orderSubscriber: IOrderSubscriber; commitment: Commitment; skipInitialLoad?: boolean; resubOpts?: ResubOpts; diff --git a/sdk/src/orderSubscriber/grpcSubscription.ts b/sdk/src/orderSubscriber/grpcSubscription.ts index 41101435ab..da4d7d4e6d 100644 --- a/sdk/src/orderSubscriber/grpcSubscription.ts +++ b/sdk/src/orderSubscriber/grpcSubscription.ts @@ -1,13 +1,13 @@ import { Context, PublicKey } from '@solana/web3.js'; import { Buffer } from 'buffer'; -import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber'; -import { OrderSubscriber } from './OrderSubscriber'; +import { grpcProgramAccountSubscriber } from '../accounts/programAccount/grpcProgramAccountSubscriber'; import { GrpcConfigs, ResubOpts } from '../accounts/types'; import { UserAccount } from '../types'; import { getUserFilter, getNonIdleUserFilter } from '../memcmp'; +import { IOrderSubscriber } from './types'; export class grpcSubscription { - private orderSubscriber: OrderSubscriber; + private orderSubscriber: IOrderSubscriber; private skipInitialLoad: boolean; private resubOpts?: ResubOpts; private resyncIntervalMs?: number; @@ -28,7 +28,7 @@ export class grpcSubscription { decoded = true, }: { grpcConfigs: GrpcConfigs; - orderSubscriber: OrderSubscriber; + orderSubscriber: IOrderSubscriber; skipInitialLoad?: boolean; resubOpts?: ResubOpts; resyncIntervalMs?: number; diff --git a/sdk/src/orderSubscriber/types.ts b/sdk/src/orderSubscriber/types.ts index 4e441e0cbf..0315c5b595 100644 --- a/sdk/src/orderSubscriber/types.ts +++ b/sdk/src/orderSubscriber/types.ts @@ -1,10 +1,14 @@ import { Commitment, PublicKey } from '@solana/web3.js'; import { Order, UserAccount } from '../types'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { GrpcConfigs } from '../accounts/types'; +import { Buffer } from 'buffer'; +import StrictEventEmitter from 'strict-event-emitter-types'; +import { EventEmitter } from 'events'; +import { ProtectMakerParamsMap, IDLOB } from '../dlob/types'; export type OrderSubscriberConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; subscriptionConfig: | { type: 'polling'; @@ -53,3 +57,40 @@ export interface OrderSubscriberEvents { dataType: 'raw' | 'decoded' | 'buffer' ) => void; } + +export interface IOrderSubscriber { + driftClient: IDriftClient; + usersAccounts: Map; + commitment: Commitment; + eventEmitter: StrictEventEmitter; + fetchPromise?: Promise; + fetchPromiseResolver: () => void; + mostRecentSlot: number; + decodeFn: (name: string, data: Buffer) => UserAccount; + decodeData?: boolean; + fetchAllNonIdleUsers?: boolean; + + subscribe(): Promise; + + fetch(): Promise; + + tryUpdateUserAccount( + key: string, + dataType: 'raw' | 'decoded' | 'buffer', + data: string[] | UserAccount | Buffer, + slot: number + ): void; + + getDLOB( + slot: number, + protectedMakerParamsMap?: ProtectMakerParamsMap + ): Promise; + + getSlot(): number; + + addPubkey(userAccountPublicKey: PublicKey): Promise; + + mustGetUserAccount(key: string): Promise; + + unsubscribe(): Promise; +} diff --git a/sdk/src/phoenix/phoenixSubscriber.ts b/sdk/src/phoenix/phoenixSubscriber.ts index aafcc43190..8a729de09c 100644 --- a/sdk/src/phoenix/phoenixSubscriber.ts +++ b/sdk/src/phoenix/phoenixSubscriber.ts @@ -1,5 +1,5 @@ import { Connection, PublicKey, SYSVAR_CLOCK_PUBKEY } from '@solana/web3.js'; -import { BulkAccountLoader } from '../accounts/bulkAccountLoader'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; import { Client, deserializeClockData, diff --git a/sdk/src/serum/serumSubscriber.ts b/sdk/src/serum/serumSubscriber.ts index 9806afea9b..f2b0d81a56 100644 --- a/sdk/src/serum/serumSubscriber.ts +++ b/sdk/src/serum/serumSubscriber.ts @@ -1,5 +1,5 @@ import { Connection, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from '../accounts/bulkAccountLoader'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; import { Market, Orderbook } from '@project-serum/serum'; import { SerumMarketSubscriberConfig } from './types'; import { BN } from '@coral-xyz/anchor'; diff --git a/sdk/src/serum/types.ts b/sdk/src/serum/types.ts index d42b37b0c6..88e0c0b910 100644 --- a/sdk/src/serum/types.ts +++ b/sdk/src/serum/types.ts @@ -1,5 +1,5 @@ import { Connection, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from '../accounts/bulkAccountLoader'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; export type SerumMarketSubscriberConfig = { connection: Connection; diff --git a/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts b/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts index ece3be3b92..c2ab64dd59 100644 --- a/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts +++ b/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts @@ -1,5 +1,5 @@ import { Commitment, Context, PublicKey } from '@solana/web3.js'; -import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber'; +import { grpcProgramAccountSubscriber } from '../accounts/programAccount/grpcProgramAccountSubscriber'; import { GrpcConfigs, ResubOpts } from '../accounts/types'; import { SignedMsgUserOrdersAccount } from '../types'; import { getSignedMsgUserOrdersFilter } from '../memcmp'; diff --git a/sdk/src/swift/signedMsgUserAccountSubscriber.ts b/sdk/src/swift/signedMsgUserAccountSubscriber.ts index 6575b5b309..840a936ef0 100644 --- a/sdk/src/swift/signedMsgUserAccountSubscriber.ts +++ b/sdk/src/swift/signedMsgUserAccountSubscriber.ts @@ -1,5 +1,5 @@ import { getSignedMsgUserOrdersFilter } from '../memcmp'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { SignedMsgOrderId, SignedMsgUserOrdersAccount } from '../types'; import { Commitment, Context, PublicKey } from '@solana/web3.js'; import { ResubOpts } from '../accounts/types'; diff --git a/sdk/src/swift/swiftOrderSubscriber.ts b/sdk/src/swift/swiftOrderSubscriber.ts index bab3032795..25bd7ea887 100644 --- a/sdk/src/swift/swiftOrderSubscriber.ts +++ b/sdk/src/swift/swiftOrderSubscriber.ts @@ -2,8 +2,8 @@ import { DevnetPerpMarkets, MainnetPerpMarkets, } from '../constants/perpMarkets'; -import { DriftClient } from '../driftClient'; -import { DriftEnv } from '../config'; +import { IDriftClient } from '../driftClient/types'; +import { DriftEnv } from '../config/types'; import { getUserAccountPublicKey, getUserStatsAccountPublicKey, @@ -28,7 +28,7 @@ export interface AccountGetter { } export type SwiftOrderSubscriberConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; userAccountGetter?: AccountGetter; driftEnv: DriftEnv; endpoint?: string; @@ -45,7 +45,7 @@ export class SwiftOrderSubscriber { private heartbeatTimeout: ReturnType | null = null; private readonly heartbeatIntervalMs = 60000; private ws: WebSocket | null = null; - private driftClient: DriftClient; + private driftClient: IDriftClient; public userAccountGetter?: AccountGetter; // In practice, this for now is just an OrderSubscriber or a UserMap public onOrder: ( orderMessageRaw: any, diff --git a/sdk/src/testClient.ts b/sdk/src/testClient.ts index 33af3b4831..9c73f3a6b5 100644 --- a/sdk/src/testClient.ts +++ b/sdk/src/testClient.ts @@ -1,7 +1,7 @@ import { AdminClient } from './adminClient'; import { ConfirmOptions, Signer, Transaction } from '@solana/web3.js'; import { TxSigAndSlot } from './tx/types'; -import { PollingDriftClientAccountSubscriber } from './accounts/pollingDriftClientAccountSubscriber'; +import { PollingDriftClientAccountSubscriber } from './accounts/driftClientAccount/pollingDriftClientAccountSubscriber'; import { DriftClientConfig } from './driftClientConfig'; export class TestClient extends AdminClient { diff --git a/sdk/src/user.ts b/sdk/src/user/index.ts similarity index 98% rename from sdk/src/user.ts rename to sdk/src/user/index.ts index 215d0450fd..5bf7d26a29 100644 --- a/sdk/src/user.ts +++ b/sdk/src/user/index.ts @@ -1,7 +1,6 @@ import { PublicKey } from '@solana/web3.js'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; -import { DriftClient } from './driftClient'; import { HealthComponent, HealthComponents, @@ -14,12 +13,12 @@ import { UserAccount, UserStatus, UserStatsAccount, -} from './types'; +} from '../types'; import { calculateEntryPrice, calculateUnsettledFundingPnl, positionIsAvailable, -} from './math/position'; +} from '../math/position'; import { AMM_RESERVE_PRECISION, AMM_RESERVE_PRECISION_EXP, @@ -40,41 +39,43 @@ import { TWO, ZERO, FUEL_START_TS, -} from './constants/numericConstants'; +} from '../constants/numericConstants'; import { DataAndSlot, UserAccountEvents, UserAccountSubscriber, -} from './accounts/types'; -import { BigNum } from './factory/bigNum'; +} from '../accounts/types'; +import { BigNum } from '../factory/bigNum'; import { BN } from '@coral-xyz/anchor'; -import { calculateBaseAssetValue, calculatePositionPNL } from './math/position'; +import { + calculateBaseAssetValue, + calculatePositionPNL, +} from '../math/position'; import { calculateMarketMarginRatio, calculateReservePrice, calculateUnrealizedAssetWeight, -} from './math/market'; +} from '../math/market'; import { calculatePerpLiabilityValue, calculateWorstCasePerpLiabilityValue, -} from './math/margin'; -import { calculateSpotMarketMarginRatio } from './math/spotMarket'; -import { divCeil, sigNum } from './math/utils'; +} from '../math/margin'; +import { calculateSpotMarketMarginRatio } from '../math/spotMarket'; +import { divCeil, sigNum } from '../math/utils'; import { getBalance, getSignedTokenAmount, getStrictTokenValue, getTokenValue, -} from './math/spotBalance'; -import { getUser30dRollingVolumeEstimate } from './math/trade'; +} from '../math/spotBalance'; +import { getUser30dRollingVolumeEstimate } from '../math/trade'; import { MarketType, PositionDirection, SpotBalanceType, SpotMarketAccount, -} from './types'; -import { standardizeBaseAssetAmount } from './math/orders'; -import { UserStats } from './userStats'; +} from '../types'; +import { standardizeBaseAssetAmount } from '../math/utils'; import { calculateAssetWeight, calculateLiabilityWeight, @@ -82,35 +83,47 @@ import { getSpotAssetValue, getSpotLiabilityValue, getTokenAmount, -} from './math/spotBalance'; -import { calculateMarketOpenBidAsk } from './math/amm'; +} from '../math/spotBalance'; +import { calculateMarketOpenBidAsk } from '../math/amm'; import { calculateBaseAssetValueWithOracle, calculateCollateralDepositRequiredForTrade, calculateMarginUSDCRequiredForTrade, calculateWorstCaseBaseAssetAmount, -} from './math/margin'; -import { OraclePriceData } from './oracles/types'; -import { UserConfig } from './userConfig'; -import { PollingUserAccountSubscriber } from './accounts/pollingUserAccountSubscriber'; -import { WebSocketUserAccountSubscriber } from './accounts/webSocketUserAccountSubscriber'; +} from '../math/margin'; +import { OraclePriceData } from '../oracles/types'; +import { UserSubscriptionConfig } from './types'; +import { PollingUserAccountSubscriber } from '../accounts/userAccount/pollingUserAccountSubscriber'; +import { WebSocketUserAccountSubscriber } from '../accounts/userAccount/webSocketUserAccountSubscriber'; import { calculateWeightedTokenValue, getWorstCaseTokenAmounts, isSpotPositionAvailable, -} from './math/spotPosition'; +} from '../math/spotPosition'; import { calculateLiveOracleTwap, getMultipleBetweenOracleSources, -} from './math/oracles'; -import { getPerpMarketTierNumber, getSpotMarketTierNumber } from './math/tiers'; -import { StrictOraclePrice } from './oracles/strictOraclePrice'; - -import { calculateSpotFuelBonus, calculatePerpFuelBonus } from './math/fuel'; -import { grpcUserAccountSubscriber } from './accounts/grpcUserAccountSubscriber'; +} from '../math/oracles'; +import { + getPerpMarketTierNumber, + getSpotMarketTierNumber, +} from '../math/tiers'; +import { StrictOraclePrice } from '../oracles/strictOraclePrice'; + +import { calculateSpotFuelBonus, calculatePerpFuelBonus } from '../math/fuel'; +import { grpcUserAccountSubscriber } from '../accounts/userAccount/grpcUserAccountSubscriber'; +import { IUserStats } from '../userStats/types'; +import { IUser } from './types'; +import { IDriftClient } from '../driftClient/types'; + +export type UserConfig = { + accountSubscription?: UserSubscriptionConfig; + driftClient: IDriftClient; + userAccountPublicKey: PublicKey; +}; -export class User { - driftClient: DriftClient; +export class User implements IUser { + driftClient: IDriftClient; userAccountPublicKey: PublicKey; accountSubscriber: UserAccountSubscriber; _isSubscribed = false; @@ -935,7 +948,7 @@ export class User { now: BN, includeSettled = true, includeUnsettled = true, - givenUserStats?: UserStats + givenUserStats?: IUserStats ): { depositFuel: BN; borrowFuel: BN; diff --git a/sdk/src/user/types.ts b/sdk/src/user/types.ts new file mode 100644 index 0000000000..dfba936f50 --- /dev/null +++ b/sdk/src/user/types.ts @@ -0,0 +1,754 @@ +import { Commitment, PublicKey } from '@solana/web3.js'; +import { EventEmitter } from 'events'; +import StrictEventEmitter from 'strict-event-emitter-types'; +import { + HealthComponent, + HealthComponents, + MarginCategory, + Order, + PerpPosition, + SpotPosition, + UserAccount, + UserStatus, + MarketType, + PositionDirection, + SpotMarketAccount, + PerpMarketAccount, + FeeTier, +} from '../types'; +import { + DataAndSlot, + GrpcConfigs, + UserAccountEvents, + UserAccountSubscriber, +} from '../accounts/types'; +import { BN } from '@coral-xyz/anchor'; +import { OraclePriceData } from '../oracles/types'; +import { StrictOraclePrice } from '../oracles/strictOraclePrice'; +import { IUserStats } from '../userStats/types'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; + +export type UserSubscriptionConfig = + | { + type: 'grpc'; + resubTimeoutMs?: number; + logResubMessages?: boolean; + grpcConfigs: GrpcConfigs; + } + | { + type: 'websocket'; + resubTimeoutMs?: number; + logResubMessages?: boolean; + commitment?: Commitment; + } + | { + type: 'polling'; + accountLoader: BulkAccountLoader; + } + | { + type: 'custom'; + userAccountSubscriber: UserAccountSubscriber; + }; + +export interface IUser { + userAccountPublicKey: PublicKey; + accountSubscriber: UserAccountSubscriber; + eventEmitter: StrictEventEmitter; + isSubscribed: boolean; + + /** + * Subscribe to User state accounts + * @returns SusbcriptionSuccess result + */ + subscribe(userAccount?: UserAccount): Promise; + + /** + * Forces the accountSubscriber to fetch account updates from rpc + */ + fetchAccounts(): Promise; + + unsubscribe(): Promise; + + getUserAccount(): UserAccount; + + forceGetUserAccount(): Promise; + + getUserAccountAndSlot(): DataAndSlot | undefined; + + getPerpPositionForUserAccount( + userAccount: UserAccount, + marketIndex: number + ): PerpPosition | undefined; + + /** + * Gets the user's current position for a given perp market. If the user has no position returns undefined + * @param marketIndex + * @returns userPerpPosition + */ + getPerpPosition(marketIndex: number): PerpPosition | undefined; + + getPerpPositionAndSlot( + marketIndex: number + ): DataAndSlot; + + getSpotPositionForUserAccount( + userAccount: UserAccount, + marketIndex: number + ): SpotPosition | undefined; + + /** + * Gets the user's current position for a given spot market. If the user has no position returns undefined + * @param marketIndex + * @returns userSpotPosition + */ + getSpotPosition(marketIndex: number): SpotPosition | undefined; + + getSpotPositionAndSlot( + marketIndex: number + ): DataAndSlot; + + getEmptySpotPosition(marketIndex: number): SpotPosition; + + /** + * Returns the token amount for a given market. The spot market precision is based on the token mint decimals. + * Positive if it is a deposit, negative if it is a borrow. + * + * @param marketIndex + */ + getTokenAmount(marketIndex: number): BN; + + getEmptyPosition(marketIndex: number): PerpPosition; + + getClonedPosition(position: PerpPosition): PerpPosition; + + getOrderForUserAccount( + userAccount: UserAccount, + orderId: number + ): Order | undefined; + + /** + * @param orderId + * @returns Order + */ + getOrder(orderId: number): Order | undefined; + + getOrderAndSlot(orderId: number): DataAndSlot; + + getOrderByUserIdForUserAccount( + userAccount: UserAccount, + userOrderId: number + ): Order | undefined; + + /** + * @param userOrderId + * @returns Order + */ + getOrderByUserOrderId(userOrderId: number): Order | undefined; + + getOrderByUserOrderIdAndSlot( + userOrderId: number + ): DataAndSlot; + + getOpenOrdersForUserAccount(userAccount?: UserAccount): Order[]; + + getOpenOrders(): Order[]; + + getOpenOrdersAndSlot(): DataAndSlot; + + getUserAccountPublicKey(): PublicKey; + + exists(): Promise; + + /** + * calculates the total open bids/asks in a perp market (including lps) + * @returns : open bids + * @returns : open asks + */ + getPerpBidAsks(marketIndex: number): [BN, BN]; + + /** + * calculates the open bids and asks for an lp + * optionally pass in lpShares to see what bid/asks a user *would* take on + * @returns : lp open bids + * @returns : lp open asks + */ + getLPBidAsks(marketIndex: number, lpShares?: BN): [BN, BN]; + + /** + * calculates the market position if the lp position was settled + * @returns : the settled userPosition + * @returns : the dust base asset amount (ie, < stepsize) + * @returns : pnl from settle + */ + getPerpPositionWithLPSettle( + marketIndex: number, + originalPosition?: PerpPosition, + burnLpShares?: boolean, + includeRemainderInBaseAmount?: boolean + ): [PerpPosition, BN, BN]; + + /** + * calculates Buying Power = free collateral / initial margin ratio + * @returns : Precision QUOTE_PRECISION + */ + getPerpBuyingPower( + marketIndex: number, + collateralBuffer?: BN, + enterHighLeverageMode?: boolean + ): BN; + + getPerpBuyingPowerFromFreeCollateralAndBaseAssetAmount( + marketIndex: number, + freeCollateral: BN, + baseAssetAmount: BN, + enterHighLeverageMode?: boolean + ): BN; + + /** + * calculates Free Collateral = Total collateral - margin requirement + * @returns : Precision QUOTE_PRECISION + */ + getFreeCollateral( + marginCategory?: MarginCategory, + enterHighLeverageMode?: boolean + ): BN; + + /** + * @returns The margin requirement of a certain type (Initial or Maintenance) in USDC. : QUOTE_PRECISION + */ + getMarginRequirement( + marginCategory: MarginCategory, + liquidationBuffer?: BN, + strict?: boolean, + includeOpenOrders?: boolean, + enteringHighLeverage?: boolean + ): BN; + + /** + * @returns The initial margin requirement in USDC. : QUOTE_PRECISION + */ + getInitialMarginRequirement(enterHighLeverageMode?: boolean): BN; + + /** + * @returns The maintenance margin requirement in USDC. : QUOTE_PRECISION + */ + getMaintenanceMarginRequirement(liquidationBuffer?: BN): BN; + + getActivePerpPositionsForUserAccount( + userAccount: UserAccount + ): PerpPosition[]; + + getActivePerpPositions(): PerpPosition[]; + + getActivePerpPositionsAndSlot(): DataAndSlot; + + getActiveSpotPositionsForUserAccount( + userAccount: UserAccount + ): SpotPosition[]; + + getActiveSpotPositions(): SpotPosition[]; + + getActiveSpotPositionsAndSlot(): DataAndSlot; + + /** + * calculates unrealized position price pnl + * @returns : Precision QUOTE_PRECISION + */ + getUnrealizedPNL( + withFunding?: boolean, + marketIndex?: number, + withWeightMarginCategory?: MarginCategory, + strict?: boolean, + liquidationBuffer?: BN + ): BN; + + /** + * calculates unrealized funding payment pnl + * @returns : Precision QUOTE_PRECISION + */ + getUnrealizedFundingPNL(marketIndex?: number): BN; + + getFuelBonus( + now: BN, + includeSettled?: boolean, + includeUnsettled?: boolean, + givenUserStats?: IUserStats + ): { + depositFuel: BN; + borrowFuel: BN; + positionFuel: BN; + takerFuel: BN; + makerFuel: BN; + insuranceFuel: BN; + }; + + getSpotMarketAssetAndLiabilityValue( + marketIndex?: number, + marginCategory?: MarginCategory, + liquidationBuffer?: BN, + includeOpenOrders?: boolean, + strict?: boolean, + now?: BN + ): { totalAssetValue: BN; totalLiabilityValue: BN }; + + getSpotMarketLiabilityValue( + marketIndex?: number, + marginCategory?: MarginCategory, + liquidationBuffer?: BN, + includeOpenOrders?: boolean, + strict?: boolean, + now?: BN + ): BN; + + getSpotLiabilityValue( + tokenAmount: BN, + strictOraclePrice: StrictOraclePrice, + spotMarketAccount: SpotMarketAccount, + marginCategory?: MarginCategory, + liquidationBuffer?: BN + ): BN; + + getSpotMarketAssetValue( + marketIndex?: number, + marginCategory?: MarginCategory, + includeOpenOrders?: boolean, + strict?: boolean, + now?: BN + ): BN; + + getSpotAssetValue( + tokenAmount: BN, + strictOraclePrice: StrictOraclePrice, + spotMarketAccount: SpotMarketAccount, + marginCategory?: MarginCategory + ): BN; + + getSpotPositionValue( + marketIndex: number, + marginCategory?: MarginCategory, + includeOpenOrders?: boolean, + strict?: boolean, + now?: BN + ): BN; + + getNetSpotMarketValue(withWeightMarginCategory?: MarginCategory): BN; + + /** + * calculates TotalCollateral: collateral + unrealized pnl + * @returns : Precision QUOTE_PRECISION + */ + getTotalCollateral( + marginCategory?: MarginCategory, + strict?: boolean, + includeOpenOrders?: boolean, + liquidationBuffer?: BN + ): BN; + + getLiquidationBuffer(): BN | undefined; + + /** + * calculates User Health by comparing total collateral and maint. margin requirement + * @returns : number (value from [0, 100]) + */ + getHealth(): number; + + calculateWeightedPerpPositionLiability( + perpPosition: PerpPosition, + marginCategory?: MarginCategory, + liquidationBuffer?: BN, + includeOpenOrders?: boolean, + strict?: boolean, + enteringHighLeverage?: boolean + ): BN; + + /** + * calculates position value of a single perp market in margin system + * @returns : Precision QUOTE_PRECISION + */ + getPerpMarketLiabilityValue( + marketIndex: number, + marginCategory?: MarginCategory, + liquidationBuffer?: BN, + includeOpenOrders?: boolean, + strict?: boolean + ): BN; + + /** + * calculates sum of position value across all positions in margin system + * @returns : Precision QUOTE_PRECISION + */ + getTotalPerpPositionLiability( + marginCategory?: MarginCategory, + liquidationBuffer?: BN, + includeOpenOrders?: boolean, + strict?: boolean, + enteringHighLeverage?: boolean + ): BN; + + /** + * calculates position value based on oracle + * @returns : Precision QUOTE_PRECISION + */ + getPerpPositionValue( + marketIndex: number, + oraclePriceData: OraclePriceData, + includeOpenOrders?: boolean + ): BN; + + /** + * calculates position liabiltiy value in margin system + * @returns : Precision QUOTE_PRECISION + */ + getPerpLiabilityValue( + marketIndex: number, + oraclePriceData: OraclePriceData, + includeOpenOrders?: boolean + ): BN; + + getPositionSide( + currentPosition: Pick + ): PositionDirection | undefined; + + /** + * calculates average exit price (optionally for closing up to 100% of position) + * @returns : Precision PRICE_PRECISION + */ + getPositionEstimatedExitPriceAndPnl( + position: PerpPosition, + amountToClose?: BN, + useAMMClose?: boolean + ): [BN, BN]; + + /** + * calculates current user leverage which is (total liability size) / (net asset value) + * @returns : Precision TEN_THOUSAND + */ + getLeverage(includeOpenOrders?: boolean): BN; + + calculateLeverageFromComponents({ + perpLiabilityValue, + perpPnl, + spotAssetValue, + spotLiabilityValue, + }: { + perpLiabilityValue: BN; + perpPnl: BN; + spotAssetValue: BN; + spotLiabilityValue: BN; + }): BN; + + getLeverageComponents( + includeOpenOrders?: boolean, + marginCategory?: MarginCategory + ): { + perpLiabilityValue: BN; + perpPnl: BN; + spotAssetValue: BN; + spotLiabilityValue: BN; + }; + + isDustDepositPosition(spotMarketAccount: SpotMarketAccount): boolean; + + getSpotMarketAccountsWithDustPosition(): SpotMarketAccount[]; + + getTotalLiabilityValue(marginCategory?: MarginCategory): BN; + + getTotalAssetValue(marginCategory?: MarginCategory): BN; + + getNetUsdValue(): BN; + + /** + * Calculates the all time P&L of the user. + * + * Net withdraws + Net spot market value + Net unrealized P&L - + */ + getTotalAllTimePnl(): BN; + + /** + * calculates max allowable leverage exceeding hitting requirement category + * for large sizes where imf factor activates, result is a lower bound + * @param marginCategory {Initial, Maintenance} + * @param isLp if calculating max leveraging for adding lp, need to add buffer + * @param enterHighLeverageMode can pass this as true to calculate max leverage if the user was to enter high leverage mode + * @returns : Precision TEN_THOUSAND + */ + getMaxLeverageForPerp( + perpMarketIndex: number, + _marginCategory?: MarginCategory, + isLp?: boolean, + enterHighLeverageMode?: boolean + ): BN; + + /** + * calculates max allowable leverage exceeding hitting requirement category + * @param spotMarketIndex + * @param direction + * @returns : Precision TEN_THOUSAND + */ + getMaxLeverageForSpot( + spotMarketIndex: number, + direction: PositionDirection + ): BN; + + /** + * calculates margin ratio: 1 / leverage + * @returns : Precision TEN_THOUSAND + */ + getMarginRatio(): BN; + + canBeLiquidated(): { + canBeLiquidated: boolean; + marginRequirement: BN; + totalCollateral: BN; + }; + + isBeingLiquidated(): boolean; + + hasStatus(status: UserStatus): boolean; + + isBankrupt(): boolean; + + isHighLeverageMode(marginCategory: MarginCategory): boolean; + + /** + * Checks if any user position cumulative funding differs from respective market cumulative funding + * @returns + */ + needsToSettleFundingPayment(): boolean; + + /** + * Calculate the liquidation price of a spot position + * @param marketIndex + * @returns Precision : PRICE_PRECISION + */ + spotLiquidationPrice(marketIndex: number, positionBaseSizeChange?: BN): BN; + + /** + * Calculate the liquidation price of a perp position, with optional parameter to calculate the liquidation price after a trade + * @param marketIndex + * @param positionBaseSizeChange // change in position size to calculate liquidation price for : Precision 10^9 + * @param estimatedEntryPrice + * @param marginCategory // allow Initial to be passed in if we are trying to calculate price for DLP de-risking + * @param includeOpenOrders + * @param offsetCollateral // allows calculating the liquidation price after this offset collateral is added to the user's account (e.g. : what will the liquidation price be for this position AFTER I deposit $x worth of collateral) + * @returns Precision : PRICE_PRECISION + */ + liquidationPrice( + marketIndex: number, + positionBaseSizeChange?: BN, + estimatedEntryPrice?: BN, + marginCategory?: MarginCategory, + includeOpenOrders?: boolean, + offsetCollateral?: BN, + enteringHighLeverage?: boolean + ): BN; + + calculateEntriesEffectOnFreeCollateral( + market: PerpMarketAccount, + oraclePrice: BN, + perpPosition: PerpPosition, + positionBaseSizeChange: BN, + estimatedEntryPrice: BN, + includeOpenOrders: boolean, + enteringHighLeverage?: boolean, + marginCategory?: MarginCategory + ): BN; + + calculateFreeCollateralDeltaForPerp( + market: PerpMarketAccount, + perpPosition: PerpPosition, + positionBaseSizeChange: BN, + oraclePrice: BN, + marginCategory?: MarginCategory, + includeOpenOrders?: boolean, + enteringHighLeverage?: boolean + ): BN | undefined; + + calculateFreeCollateralDeltaForSpot( + market: SpotMarketAccount, + signedTokenAmount: BN, + marginCategory?: MarginCategory + ): BN; + + /** + * Calculates the estimated liquidation price for a position after closing a quote amount of the position. + * @param positionMarketIndex + * @param closeQuoteAmount + * @returns : Precision PRICE_PRECISION + */ + liquidationPriceAfterClose( + positionMarketIndex: number, + closeQuoteAmount: BN, + estimatedEntryPrice?: BN + ): BN; + + getMarginUSDCRequiredForTrade( + targetMarketIndex: number, + baseSize: BN, + estEntryPrice?: BN + ): BN; + + getCollateralDepositRequiredForTrade( + targetMarketIndex: number, + baseSize: BN, + collateralIndex: number + ): BN; + + /** + * Separates the max trade size into two parts: + * - tradeSize: The maximum trade size for target direction + * - oppositeSideTradeSize: the trade size for closing the opposite direction + * @param targetMarketIndex + * @param tradeSide + * @param isLp + * @returns { tradeSize: BN, oppositeSideTradeSize: BN} : Precision QUOTE_PRECISION + */ + getMaxTradeSizeUSDCForPerp( + targetMarketIndex: number, + tradeSide: PositionDirection, + isLp?: boolean, + enterHighLeverageMode?: boolean + ): { tradeSize: BN; oppositeSideTradeSize: BN }; + + /** + * Get the maximum trade size for a given market, taking into account the user's current leverage, positions, collateral, etc. + * + * @param targetMarketIndex + * @param direction + * @param currentQuoteAssetValue + * @param currentSpotMarketNetValue + * @returns tradeSizeAllowed : Precision QUOTE_PRECISION + */ + getMaxTradeSizeUSDCForSpot( + targetMarketIndex: number, + direction: PositionDirection, + currentQuoteAssetValue?: BN, + currentSpotMarketNetValue?: BN + ): BN; + + /** + * Calculates the max amount of token that can be swapped from inMarket to outMarket + * Assumes swap happens at oracle price + * + * @param inMarketIndex + * @param outMarketIndex + * @param calculateSwap function to similate in to out swa + * @param iterationLimit how long to run appromixation before erroring out + */ + getMaxSwapAmount({ + inMarketIndex, + outMarketIndex, + calculateSwap, + iterationLimit, + }: { + inMarketIndex: number; + outMarketIndex: number; + calculateSwap?: (inAmount: BN) => BN; + iterationLimit?: number; + }): { inAmount: BN; outAmount: BN; leverage: BN }; + + cloneAndUpdateSpotPosition( + position: SpotPosition, + tokenAmount: BN, + market: SpotMarketAccount + ): SpotPosition; + + calculateSpotPositionFreeCollateralContribution( + spotPosition: SpotPosition, + strictOraclePrice: StrictOraclePrice + ): BN; + + calculateSpotPositionLeverageContribution( + spotPosition: SpotPosition, + strictOraclePrice: StrictOraclePrice + ): { + totalAssetValue: BN; + totalLiabilityValue: BN; + }; + + /** + * Estimates what the user leverage will be after swap + * @param inMarketIndex + * @param outMarketIndex + * @param inAmount + * @param outAmount + */ + accountLeverageAfterSwap({ + inMarketIndex, + outMarketIndex, + inAmount, + outAmount, + }: { + inMarketIndex: number; + outMarketIndex: number; + inAmount: BN; + outAmount: BN; + }): BN; + + /** + * Returns the leverage ratio for the account after adding (or subtracting) the given quote size to the given position + * @param targetMarketIndex + * @param: targetMarketType + * @param tradeQuoteAmount + * @param tradeSide + * @param includeOpenOrders + * @returns leverageRatio : Precision TEN_THOUSAND + */ + accountLeverageRatioAfterTrade( + targetMarketIndex: number, + targetMarketType: MarketType, + tradeQuoteAmount: BN, + tradeSide: PositionDirection, + includeOpenOrders?: boolean + ): BN; + + getUserFeeTier(marketType: MarketType, now?: BN): FeeTier; + + /** + * Calculates how much perp fee will be taken for a given sized trade + * @param quoteAmount + * @returns feeForQuote : Precision QUOTE_PRECISION + */ + calculateFeeForQuoteAmount( + quoteAmount: BN, + marketIndex?: number, + enteringHighLeverageMode?: boolean + ): BN; + + /** + * Calculates a user's max withdrawal amounts for a spot market. If reduceOnly is true, + * it will return the max withdrawal amount without opening a liability for the user + * @param marketIndex + * @returns withdrawalLimit : Precision is the token precision for the chosen SpotMarket + */ + getWithdrawalLimit(marketIndex: number, reduceOnly?: boolean): BN; + + canBypassWithdrawLimits(marketIndex: number): { + canBypass: boolean; + netDeposits: BN; + depositAmount: BN; + maxDepositAmount: BN; + }; + + canMakeIdle(slot: BN): boolean; + + getSafestTiers(): { perpTier: number; spotTier: number }; + + getPerpPositionHealth({ + marginCategory, + perpPosition, + oraclePriceData, + quoteOraclePriceData, + }: { + marginCategory: MarginCategory; + perpPosition: PerpPosition; + oraclePriceData?: OraclePriceData; + quoteOraclePriceData?: OraclePriceData; + }): HealthComponent; + + getHealthComponents({ + marginCategory, + }: { + marginCategory: MarginCategory; + }): HealthComponents; +} diff --git a/sdk/src/userConfig.ts b/sdk/src/userConfig.ts deleted file mode 100644 index f575ea2b58..0000000000 --- a/sdk/src/userConfig.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { DriftClient } from './driftClient'; -import { Commitment, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './accounts/bulkAccountLoader'; -import { GrpcConfigs, UserAccountSubscriber } from './accounts/types'; - -export type UserConfig = { - accountSubscription?: UserSubscriptionConfig; - driftClient: DriftClient; - userAccountPublicKey: PublicKey; -}; - -export type UserSubscriptionConfig = - | { - type: 'grpc'; - resubTimeoutMs?: number; - logResubMessages?: boolean; - grpcConfigs: GrpcConfigs; - } - | { - type: 'websocket'; - resubTimeoutMs?: number; - logResubMessages?: boolean; - commitment?: Commitment; - } - | { - type: 'polling'; - accountLoader: BulkAccountLoader; - } - | { - type: 'custom'; - userAccountSubscriber: UserAccountSubscriber; - }; diff --git a/sdk/src/userMap/PollingSubscription.ts b/sdk/src/userMap/PollingSubscription.ts index e398e61e08..1e53623e0f 100644 --- a/sdk/src/userMap/PollingSubscription.ts +++ b/sdk/src/userMap/PollingSubscription.ts @@ -1,7 +1,7 @@ -import { UserMap } from './userMap'; +import { IUserMap } from './types'; export class PollingSubscription { - private userMap: UserMap; + private userMap: IUserMap; private frequency: number; private skipInitialLoad: boolean; @@ -12,7 +12,7 @@ export class PollingSubscription { frequency, skipInitialLoad = false, }: { - userMap: UserMap; + userMap: IUserMap; frequency: number; skipInitialLoad?: boolean; includeIdle?: boolean; diff --git a/sdk/src/userMap/WebsocketSubscription.ts b/sdk/src/userMap/WebsocketSubscription.ts index f689cfb7d7..19832eb8e4 100644 --- a/sdk/src/userMap/WebsocketSubscription.ts +++ b/sdk/src/userMap/WebsocketSubscription.ts @@ -1,12 +1,12 @@ -import { UserMap } from './userMap'; import { getNonIdleUserFilter, getUserFilter } from '../memcmp'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { UserAccount } from '../types'; import { Commitment, Context, MemcmpFilter, PublicKey } from '@solana/web3.js'; import { ResubOpts } from '../accounts/types'; +import { IUserMap } from './types'; export class WebsocketSubscription { - private userMap: UserMap; + private userMap: IUserMap; private commitment: Commitment; private skipInitialLoad: boolean; private resubOpts?: ResubOpts; @@ -25,7 +25,7 @@ export class WebsocketSubscription { decodeFn, additionalFilters = undefined, }: { - userMap: UserMap; + userMap: IUserMap; commitment: Commitment; skipInitialLoad?: boolean; resubOpts?: ResubOpts; diff --git a/sdk/src/userMap/events.ts b/sdk/src/userMap/events.ts new file mode 100644 index 0000000000..522e693a4a --- /dev/null +++ b/sdk/src/userMap/events.ts @@ -0,0 +1,7 @@ +import { IUser } from '../user/types'; + +export interface UserEvents { + userUpdate: (payload: IUser) => void; + update: void; + error: (e: Error) => void; +} diff --git a/sdk/src/userMap/grpcSubscription.ts b/sdk/src/userMap/grpcSubscription.ts index a39f8a543c..d1df8b63f3 100644 --- a/sdk/src/userMap/grpcSubscription.ts +++ b/sdk/src/userMap/grpcSubscription.ts @@ -1,14 +1,14 @@ -import { UserMap } from './userMap'; import { getNonIdleUserFilter, getUserFilter } from '../memcmp'; -import { WebSocketProgramAccountSubscriber } from '../accounts/webSocketProgramAccountSubscriber'; +import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { UserAccount } from '../types'; import { Context, MemcmpFilter, PublicKey } from '@solana/web3.js'; import { GrpcConfigs, ResubOpts } from '../accounts/types'; -import { grpcProgramAccountSubscriber } from '../accounts/grpcProgramAccountSubscriber'; +import { grpcProgramAccountSubscriber } from '../accounts/programAccount/grpcProgramAccountSubscriber'; +import { IUserMap } from './types'; export class grpcSubscription { private grpcConfigs: GrpcConfigs; - private userMap: UserMap; + private userMap: IUserMap; private skipInitialLoad: boolean; private resubOpts?: ResubOpts; private includeIdle?: boolean; @@ -27,7 +27,7 @@ export class grpcSubscription { additionalFilters = undefined, }: { grpcConfigs: GrpcConfigs; - userMap: UserMap; + userMap: IUserMap; skipInitialLoad?: boolean; resubOpts?: ResubOpts; includeIdle?: boolean; diff --git a/sdk/src/userMap/types.ts b/sdk/src/userMap/types.ts new file mode 100644 index 0000000000..44b2b797f5 --- /dev/null +++ b/sdk/src/userMap/types.ts @@ -0,0 +1,105 @@ +import { IDriftClient } from '../driftClient/types'; +import { UserAccount, OrderRecord } from '../types'; +import { WrappedEvent } from '../events/types'; +import { DataAndSlot } from '../accounts/types'; +import { IDLOB, ProtectMakerParamsMap } from '../dlob/types'; +import { PublicKey } from '@solana/web3.js'; +import { UserAccountFilterCriteria as UserFilterCriteria } from './userMapConfig'; +import StrictEventEmitter from 'strict-event-emitter-types'; +import { EventEmitter } from 'events'; +import { UserEvents } from './events'; +import { IUser, UserSubscriptionConfig } from '../user/types'; + +export interface IUserMap { + driftClient: IDriftClient; + eventEmitter: StrictEventEmitter; + + subscribe(): Promise; + + addPubkey( + userAccountPublicKey: PublicKey, + userAccount?: UserAccount, + slot?: number, + accountSubscription?: UserSubscriptionConfig + ): Promise; + + has(key: string): boolean; + + /** + * gets the User for a particular userAccountPublicKey, if no User exists, undefined is returned + * @param key userAccountPublicKey to get User for + * @returns user User | undefined + */ + get(key: string): IUser | undefined; + + getWithSlot(key: string): DataAndSlot | undefined; + + /** + * gets the User for a particular userAccountPublicKey, if no User exists, new one is created + * @param key userAccountPublicKey to get User for + * @returns User + */ + mustGet( + key: string, + accountSubscription?: UserSubscriptionConfig + ): Promise; + + mustGetWithSlot( + key: string, + accountSubscription?: UserSubscriptionConfig + ): Promise>; + + mustGetUserAccount(key: string): Promise; + + /** + * gets the Authority for a particular userAccountPublicKey, if no User exists, undefined is returned + * @param key userAccountPublicKey to get User for + * @returns authority PublicKey | undefined + */ + getUserAuthority(key: string): PublicKey | undefined; + + /** + * implements the {@link DLOBSource} interface + * create a DLOB from all the subscribed users + * @param slot + */ + getDLOB( + slot: number, + protectedMakerParamsMap?: ProtectMakerParamsMap + ): Promise; + + updateWithOrderRecord(record: OrderRecord): Promise; + + updateWithEventRecord(record: WrappedEvent): Promise; + + values(): IterableIterator; + + valuesWithSlot(): IterableIterator>; + + entries(): IterableIterator<[string, IUser]>; + + entriesWithSlot(): IterableIterator<[string, DataAndSlot]>; + + size(): number; + + /** + * Returns a unique list of authorities for all users in the UserMap that meet the filter criteria + * @param filterCriteria: Users must meet these criteria to be included + * @returns + */ + getUniqueAuthorities(filterCriteria?: UserFilterCriteria): PublicKey[]; + + sync(): Promise; + + unsubscribe(): Promise; + + updateUserAccount( + key: string, + userAccount: UserAccount, + slot: number + ): Promise; + + updateLatestSlot(slot: number): void; + + getSlot(): number; +} diff --git a/sdk/src/userMap/userMap.ts b/sdk/src/userMap/userMap.ts index f022be058a..bdbb79cf3f 100644 --- a/sdk/src/userMap/userMap.ts +++ b/sdk/src/userMap/userMap.ts @@ -1,6 +1,5 @@ import { BN } from '@coral-xyz/anchor'; import { User } from '../user'; -import { DriftClient } from '../driftClient'; import { UserAccount, OrderRecord, @@ -15,9 +14,9 @@ import { } from '../types'; import { WrappedEvent } from '../events/types'; import { DLOB } from '../dlob/DLOB'; -import { UserSubscriptionConfig } from '../userConfig'; -import { DataAndSlot, UserEvents } from '../accounts/types'; -import { OneShotUserAccountSubscriber } from '../accounts/oneShotUserAccountSubscriber'; +import { UserSubscriptionConfig } from '../user/types'; +import { DataAndSlot } from '../accounts/types'; +import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; import { ProtectMakerParamsMap } from '../dlob/types'; import { @@ -45,41 +44,15 @@ import { decodeUser } from '../decode/user'; import { grpcSubscription } from './grpcSubscription'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; +import { UserEvents } from './events'; +import { IUserMap } from './types'; +import { IDriftClient } from '../driftClient/types'; const MAX_USER_ACCOUNT_SIZE_BYTES = 4376; -export interface UserMapInterface { - eventEmitter: StrictEventEmitter; - subscribe(): Promise; - unsubscribe(): Promise; - addPubkey( - userAccountPublicKey: PublicKey, - userAccount?: UserAccount, - slot?: number, - accountSubscription?: UserSubscriptionConfig - ): Promise; - has(key: string): boolean; - get(key: string): User | undefined; - getWithSlot(key: string): DataAndSlot | undefined; - mustGet( - key: string, - accountSubscription?: UserSubscriptionConfig - ): Promise; - mustGetWithSlot( - key: string, - accountSubscription?: UserSubscriptionConfig - ): Promise>; - getUserAuthority(key: string): PublicKey | undefined; - updateWithOrderRecord(record: OrderRecord): Promise; - values(): IterableIterator; - valuesWithSlot(): IterableIterator>; - entries(): IterableIterator<[string, User]>; - entriesWithSlot(): IterableIterator<[string, DataAndSlot]>; -} - -export class UserMap implements UserMapInterface { +export class UserMap implements IUserMap { private userMap = new Map>(); - driftClient: DriftClient; + driftClient: IDriftClient; eventEmitter: StrictEventEmitter; private connection: Connection; private commitment: Commitment; diff --git a/sdk/src/userMap/userMapConfig.ts b/sdk/src/userMap/userMapConfig.ts index afb980c3e7..31bd29fc9c 100644 --- a/sdk/src/userMap/userMapConfig.ts +++ b/sdk/src/userMap/userMapConfig.ts @@ -1,5 +1,5 @@ import { Commitment, Connection, MemcmpFilter } from '@solana/web3.js'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { GrpcConfigs } from '../accounts/types'; // passed into UserMap.getUniqueAuthorities to filter users @@ -19,7 +19,7 @@ export type SyncConfig = }; export type UserMapConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; // connection object to use specifically for the UserMap. If undefined, will use the driftClient's connection connection?: Connection; subscriptionConfig: diff --git a/sdk/src/userMap/userStatsMap.ts b/sdk/src/userMap/userStatsMap.ts index 8e9abee863..074ce3eedc 100644 --- a/sdk/src/userMap/userStatsMap.ts +++ b/sdk/src/userMap/userStatsMap.ts @@ -14,8 +14,8 @@ import { } from '../types'; import { UserStats } from '../userStats'; import { WrappedEvent } from '../events/types'; -import { BulkAccountLoader } from '../accounts/bulkAccountLoader'; -import { PollingUserStatsAccountSubscriber } from '../accounts/pollingUserStatsAccountSubscriber'; +import { BulkAccountLoader } from '../accounts/bulkAccountLoader/bulkAccountLoader'; +import { PollingUserStatsAccountSubscriber } from '../accounts/userStatsAccount/pollingUserStatsAccountSubscriber'; import { SyncConfig } from './userMapConfig'; import { getUserStatsFilter } from '../memcmp'; import { PublicKey } from '@solana/web3.js'; diff --git a/sdk/src/userStats.ts b/sdk/src/userStats/index.ts similarity index 80% rename from sdk/src/userStats.ts rename to sdk/src/userStats/index.ts index 8fdb30d2bf..e1b2fdc7c4 100644 --- a/sdk/src/userStats.ts +++ b/sdk/src/userStats/index.ts @@ -1,26 +1,33 @@ -import { DriftClient } from './driftClient'; import { PublicKey } from '@solana/web3.js'; -import { DataAndSlot, UserStatsAccountSubscriber } from './accounts/types'; -import { UserStatsConfig } from './userStatsConfig'; -import { PollingUserStatsAccountSubscriber } from './accounts/pollingUserStatsAccountSubscriber'; -import { WebSocketUserStatsAccountSubscriber } from './accounts/webSocketUserStatsAccountSubsriber'; -import { ReferrerInfo, SpotMarketAccount, UserStatsAccount } from './types'; +import { DataAndSlot, UserStatsAccountSubscriber } from '../accounts/types'; +import { UserStatsSubscriptionConfig } from '../userStatsConfig'; +import { PollingUserStatsAccountSubscriber } from '../accounts/userStatsAccount/pollingUserStatsAccountSubscriber'; +import { WebSocketUserStatsAccountSubscriber } from '../accounts/userStatsAccount/webSocketUserStatsAccountSubsriber'; +import { ReferrerInfo, SpotMarketAccount, UserStatsAccount } from '../types'; import { getUserAccountPublicKeySync, getUserStatsAccountPublicKey, -} from './addresses/pda'; -import { grpcUserStatsAccountSubscriber } from './accounts/grpcUserStatsAccountSubscriber'; -import { FUEL_START_TS } from './constants/numericConstants'; -import { ZERO } from './constants/numericConstants'; +} from '../addresses/pda'; +import { grpcUserStatsAccountSubscriber } from '../accounts/userStatsAccount/grpcUserStatsAccountSubscriber'; +import { FUEL_START_TS } from '../constants/numericConstants'; +import { ZERO } from '../constants/numericConstants'; import { GOV_SPOT_MARKET_INDEX, QUOTE_SPOT_MARKET_INDEX, -} from './constants/numericConstants'; +} from '../constants/numericConstants'; import { BN } from '@coral-xyz/anchor'; -import { calculateInsuranceFuelBonus } from './math/fuel'; +import { calculateInsuranceFuelBonus } from '../math/fuel'; +import { IDriftClient } from '../driftClient/types'; +import { IUserStats } from './types'; -export class UserStats { - driftClient: DriftClient; +export type UserStatsConfig = { + accountSubscription?: UserStatsSubscriptionConfig; + driftClient: IDriftClient; + userStatsAccountPublicKey: PublicKey; +}; + +export class UserStats implements IUserStats { + driftClient: IDriftClient; userStatsAccountPublicKey: PublicKey; accountSubscriber: UserStatsAccountSubscriber; isSubscribed: boolean; diff --git a/sdk/src/userStats/types.ts b/sdk/src/userStats/types.ts new file mode 100644 index 0000000000..3b8e9b0319 --- /dev/null +++ b/sdk/src/userStats/types.ts @@ -0,0 +1,23 @@ +import { BN } from '@coral-xyz/anchor'; +import { DataAndSlot, UserStatsAccountSubscriber } from '../accounts/types'; +import { UserStatsAccount } from '../types'; +import { ReferrerInfo } from '../types'; +import { PublicKey } from '@solana/web3.js'; + +export interface IUserStats { + userStatsAccountPublicKey: PublicKey; + accountSubscriber: UserStatsAccountSubscriber; + isSubscribed: boolean; + + subscribe(userStatsAccount?: UserStatsAccount): Promise; + fetchAccounts(): Promise; + unsubscribe(): Promise; + getAccountAndSlot(): DataAndSlot; + getAccount(): UserStatsAccount; + getInsuranceFuelBonus( + now: BN, + includeSettled?: boolean, + includeUnsettled?: boolean + ): BN; + getReferrerInfo(): ReferrerInfo | undefined; +} diff --git a/sdk/src/userStatsConfig.ts b/sdk/src/userStatsConfig.ts index 693de80e85..a1866a1182 100644 --- a/sdk/src/userStatsConfig.ts +++ b/sdk/src/userStatsConfig.ts @@ -1,14 +1,7 @@ -import { DriftClient } from './driftClient'; -import { Commitment, PublicKey } from '@solana/web3.js'; -import { BulkAccountLoader } from './accounts/bulkAccountLoader'; +import { Commitment } from '@solana/web3.js'; +import { BulkAccountLoader } from './accounts/bulkAccountLoader/bulkAccountLoader'; import { GrpcConfigs } from './accounts/types'; -export type UserStatsConfig = { - accountSubscription?: UserStatsSubscriptionConfig; - driftClient: DriftClient; - userStatsAccountPublicKey: PublicKey; -}; - export type UserStatsSubscriptionConfig = | { type: 'websocket'; diff --git a/sdk/tests/accounts/customizedCadenceBulkAccountLoader.test.ts b/sdk/tests/accounts/customizedCadenceBulkAccountLoader.test.ts index 9058ead1de..e032259e14 100644 --- a/sdk/tests/accounts/customizedCadenceBulkAccountLoader.test.ts +++ b/sdk/tests/accounts/customizedCadenceBulkAccountLoader.test.ts @@ -1,5 +1,5 @@ import { Connection, Keypair, PublicKey } from '@solana/web3.js'; -import { CustomizedCadenceBulkAccountLoader } from '../../src/accounts/customizedCadenceBulkAccountLoader'; +import { CustomizedCadenceBulkAccountLoader } from '../../src/accounts/bulkAccountLoader/customizedCadenceBulkAccountLoader'; import { expect } from 'chai'; describe('CustomizedCadenceBulkAccountLoader', () => { diff --git a/tests/admin.ts b/tests/admin.ts index 6faef7d2d6..c2563e0010 100644 --- a/tests/admin.ts +++ b/tests/admin.ts @@ -25,7 +25,7 @@ import { BankrunContextWrapper, Connection, } from '../sdk/src/bankrun/bankrunConnection'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; describe('admin', () => { const chProgram = anchor.workspace.Drift as Program; diff --git a/tests/adminDeposit.ts b/tests/adminDeposit.ts index 2eee301d8c..004a2669e4 100644 --- a/tests/adminDeposit.ts +++ b/tests/adminDeposit.ts @@ -19,7 +19,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; dotenv.config(); diff --git a/tests/assetTier.ts b/tests/assetTier.ts index 0c1797b4ba..b5f6ae4293 100644 --- a/tests/assetTier.ts +++ b/tests/assetTier.ts @@ -37,7 +37,7 @@ import { // sleep, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { ContractTier } from '../sdk'; diff --git a/tests/cancelAllOrders.ts b/tests/cancelAllOrders.ts index d3cd08fcdb..4a10f61255 100644 --- a/tests/cancelAllOrders.ts +++ b/tests/cancelAllOrders.ts @@ -19,7 +19,7 @@ import { mockOracleNoProgram, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { isVariant } from '../sdk'; diff --git a/tests/cappedSymFunding.ts b/tests/cappedSymFunding.ts index a95fa58e1e..a1c1350e2f 100644 --- a/tests/cappedSymFunding.ts +++ b/tests/cappedSymFunding.ts @@ -36,7 +36,7 @@ import { Program } from '@coral-xyz/anchor'; import { Keypair, PublicKey } from '@solana/web3.js'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function updateFundingRateHelper( diff --git a/tests/curve.ts b/tests/curve.ts index ff47909549..97f3e4a641 100644 --- a/tests/curve.ts +++ b/tests/curve.ts @@ -28,7 +28,7 @@ import { setFeedPriceNoProgram, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('AMM Curve', () => { diff --git a/tests/deleteInitializedSpotMarket.ts b/tests/deleteInitializedSpotMarket.ts index f66267e3e8..60cee45fb8 100644 --- a/tests/deleteInitializedSpotMarket.ts +++ b/tests/deleteInitializedSpotMarket.ts @@ -23,7 +23,7 @@ import { } from '../sdk'; import { PublicKey } from '@solana/web3.js'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('max deposit', () => { diff --git a/tests/depositIntoSpotMarketVault.ts b/tests/depositIntoSpotMarketVault.ts index 476d984613..5ef2b4cea1 100644 --- a/tests/depositIntoSpotMarketVault.ts +++ b/tests/depositIntoSpotMarketVault.ts @@ -24,7 +24,7 @@ import { } from './testHelpers'; import { SPOT_MARKET_BALANCE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw', () => { diff --git a/tests/driftClient.ts b/tests/driftClient.ts index 6271269e39..1f29bc9bc9 100644 --- a/tests/driftClient.ts +++ b/tests/driftClient.ts @@ -32,7 +32,7 @@ import { sleep, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('drift client', () => { diff --git a/tests/fillSpot.ts b/tests/fillSpot.ts index 2b141d1254..cbdef680d8 100644 --- a/tests/fillSpot.ts +++ b/tests/fillSpot.ts @@ -27,7 +27,7 @@ import { } from './testHelpers'; import { MARGIN_PRECISION, PostOnlyParams, ReferrerInfo, ZERO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('place and fill spot order', () => { diff --git a/tests/forceUserDelete.ts b/tests/forceUserDelete.ts index d224e6c7ec..e13b2efa84 100644 --- a/tests/forceUserDelete.ts +++ b/tests/forceUserDelete.ts @@ -26,7 +26,7 @@ import { import { NATIVE_MINT } from '@solana/spl-token'; import { QUOTE_PRECISION, ZERO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw', () => { diff --git a/tests/fuel.ts b/tests/fuel.ts index 4514836014..c15ce110ac 100644 --- a/tests/fuel.ts +++ b/tests/fuel.ts @@ -32,7 +32,7 @@ import { import { QUOTE_PRECISION, calculatePerpFuelBonus } from '../sdk/src'; import { MARGIN_PRECISION, PostOnlyParams, ReferrerInfo, ZERO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe("fuelin'", () => { diff --git a/tests/fuelSweep.ts b/tests/fuelSweep.ts index a6890c45d8..b38062c8ea 100644 --- a/tests/fuelSweep.ts +++ b/tests/fuelSweep.ts @@ -21,7 +21,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; dotenv.config(); diff --git a/tests/govStakeDevnet.ts b/tests/govStakeDevnet.ts index bd7de44653..6eb41ee14f 100644 --- a/tests/govStakeDevnet.ts +++ b/tests/govStakeDevnet.ts @@ -12,7 +12,7 @@ import { } from '../sdk/src'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; import { diff --git a/tests/highLeverageMode.ts b/tests/highLeverageMode.ts index 148c41ce92..70b5b48269 100644 --- a/tests/highLeverageMode.ts +++ b/tests/highLeverageMode.ts @@ -33,7 +33,7 @@ import { PERCENTAGE_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('max leverage order params', () => { diff --git a/tests/ifRebalance.ts b/tests/ifRebalance.ts index dcf4373dbf..14d6135d2b 100644 --- a/tests/ifRebalance.ts +++ b/tests/ifRebalance.ts @@ -39,7 +39,7 @@ import { import { NATIVE_MINT } from '@solana/spl-token'; import { DexInstructions, Market, OpenOrders } from '@project-serum/serum'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot swap', () => { diff --git a/tests/imbalancePerpPnl.ts b/tests/imbalancePerpPnl.ts index 84fbf8dd4b..7486effc5a 100644 --- a/tests/imbalancePerpPnl.ts +++ b/tests/imbalancePerpPnl.ts @@ -47,7 +47,7 @@ import { } from './testHelpers'; import { PERCENTAGE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function depositToFeePoolFromIF( diff --git a/tests/insuranceFundStake.ts b/tests/insuranceFundStake.ts index c90a1795ce..1ee2b8593d 100644 --- a/tests/insuranceFundStake.ts +++ b/tests/insuranceFundStake.ts @@ -43,7 +43,7 @@ import { } from './testHelpers'; import { ContractTier, PERCENTAGE_PRECISION, UserStatus } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper, asBN, diff --git a/tests/ksolver.ts b/tests/ksolver.ts index d3c1d338fc..5db4c24709 100644 --- a/tests/ksolver.ts +++ b/tests/ksolver.ts @@ -24,7 +24,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('AMM Curve', () => { diff --git a/tests/liquidateBorrowForPerpPnl.ts b/tests/liquidateBorrowForPerpPnl.ts index f04c9b1310..ad97045443 100644 --- a/tests/liquidateBorrowForPerpPnl.ts +++ b/tests/liquidateBorrowForPerpPnl.ts @@ -31,7 +31,7 @@ import { } from './testHelpers'; import { isVariant, UserStatus } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate borrow for perp pnl', () => { diff --git a/tests/liquidateMaxLps.ts b/tests/liquidateMaxLps.ts index 90d4c72190..30ee5b985c 100644 --- a/tests/liquidateMaxLps.ts +++ b/tests/liquidateMaxLps.ts @@ -24,7 +24,7 @@ import { } from './testHelpers'; import { PERCENTAGE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('max lp liq', () => { diff --git a/tests/liquidatePerp.ts b/tests/liquidatePerp.ts index ed4156bdbc..2df9deb212 100644 --- a/tests/liquidatePerp.ts +++ b/tests/liquidatePerp.ts @@ -31,7 +31,7 @@ import { } from './testHelpers'; import { PERCENTAGE_PRECISION, UserStatus } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate perp (no open orders)', () => { diff --git a/tests/liquidatePerpAndLp.ts b/tests/liquidatePerpAndLp.ts index 26edfcf242..c09de10331 100644 --- a/tests/liquidatePerpAndLp.ts +++ b/tests/liquidatePerpAndLp.ts @@ -33,7 +33,7 @@ import { } from './testHelpers'; import { PERCENTAGE_PRECISION, UserStatus } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate perp and lp', () => { diff --git a/tests/liquidatePerpPnlForDeposit.ts b/tests/liquidatePerpPnlForDeposit.ts index cb42c23adb..65c38af0a1 100644 --- a/tests/liquidatePerpPnlForDeposit.ts +++ b/tests/liquidatePerpPnlForDeposit.ts @@ -36,7 +36,7 @@ import { UserStatus, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate perp pnl for deposit', () => { diff --git a/tests/liquidatePerpWithFill.ts b/tests/liquidatePerpWithFill.ts index f4d0b61cd3..ed19633acb 100644 --- a/tests/liquidatePerpWithFill.ts +++ b/tests/liquidatePerpWithFill.ts @@ -28,7 +28,7 @@ import { } from './testHelpers'; import { OrderType, PERCENTAGE_PRECISION, PerpOperation } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate perp (no open orders)', () => { diff --git a/tests/liquidateSpot.ts b/tests/liquidateSpot.ts index 9b30c4bb27..e56dc6b736 100644 --- a/tests/liquidateSpot.ts +++ b/tests/liquidateSpot.ts @@ -34,7 +34,7 @@ import { } from './testHelpers'; import { PERCENTAGE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate spot', () => { diff --git a/tests/liquidateSpotSocialLoss.ts b/tests/liquidateSpotSocialLoss.ts index 0695db6b18..ca49933deb 100644 --- a/tests/liquidateSpotSocialLoss.ts +++ b/tests/liquidateSpotSocialLoss.ts @@ -29,7 +29,7 @@ import { } from './testHelpers'; import { isVariant, UserStatus, PERCENTAGE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('liquidate spot w/ social loss', () => { diff --git a/tests/liquidateSpotWithSwap.ts b/tests/liquidateSpotWithSwap.ts index f6966324ee..47abd36266 100644 --- a/tests/liquidateSpotWithSwap.ts +++ b/tests/liquidateSpotWithSwap.ts @@ -34,7 +34,7 @@ import { import { NATIVE_MINT } from '@solana/spl-token'; import { DexInstructions, Market, OpenOrders } from '@project-serum/serum'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot swap', () => { diff --git a/tests/liquidityProvider.ts b/tests/liquidityProvider.ts index c865579d36..6425b008d2 100644 --- a/tests/liquidityProvider.ts +++ b/tests/liquidityProvider.ts @@ -37,7 +37,7 @@ import { } from './testHelpers'; import { PerpPosition } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function adjustOraclePostSwap(baa, swapDirection, market, context) { diff --git a/tests/marketOrder.ts b/tests/marketOrder.ts index f7303296f2..5b9d6a2d95 100644 --- a/tests/marketOrder.ts +++ b/tests/marketOrder.ts @@ -35,7 +35,7 @@ import { getAssociatedTokenAddressSync, } from '@solana/spl-token'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('market order', () => { diff --git a/tests/marketOrderBaseAssetAmount.ts b/tests/marketOrderBaseAssetAmount.ts index e541222f97..f4494cbfa9 100644 --- a/tests/marketOrderBaseAssetAmount.ts +++ b/tests/marketOrderBaseAssetAmount.ts @@ -15,7 +15,7 @@ import { mockOracleNoProgram, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('market orders', () => { diff --git a/tests/maxDeposit.ts b/tests/maxDeposit.ts index 626ff2fdec..57ed8d5559 100644 --- a/tests/maxDeposit.ts +++ b/tests/maxDeposit.ts @@ -12,7 +12,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('max deposit', () => { diff --git a/tests/maxLeverageOrderParams.ts b/tests/maxLeverageOrderParams.ts index 4695105240..be8e08e954 100644 --- a/tests/maxLeverageOrderParams.ts +++ b/tests/maxLeverageOrderParams.ts @@ -31,7 +31,7 @@ import { PERCENTAGE_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('max leverage order params', () => { diff --git a/tests/modifyOrder.ts b/tests/modifyOrder.ts index 9f67eea3f2..a1f4ed90fc 100644 --- a/tests/modifyOrder.ts +++ b/tests/modifyOrder.ts @@ -20,7 +20,7 @@ import { } from './testHelpers'; import { OrderType, TWO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('modify orders', () => { diff --git a/tests/multipleMakerOrders.ts b/tests/multipleMakerOrders.ts index af5473510a..21aca163e5 100644 --- a/tests/multipleMakerOrders.ts +++ b/tests/multipleMakerOrders.ts @@ -26,7 +26,7 @@ import { } from './testHelpers'; import { ContractTier, MARGIN_PRECISION, OrderType } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('multiple maker orders', () => { diff --git a/tests/multipleSpotMakerOrders.ts b/tests/multipleSpotMakerOrders.ts index 411e79e474..f4bf461e5f 100644 --- a/tests/multipleSpotMakerOrders.ts +++ b/tests/multipleSpotMakerOrders.ts @@ -29,7 +29,7 @@ import { MARGIN_PRECISION, OrderType, SpotOperation } from '../sdk/src'; import { LAMPORTS_PER_SOL } from '@solana/web3.js'; import { ContractTier } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('multiple maker orders', () => { diff --git a/tests/openbookTest.ts b/tests/openbookTest.ts index 3d57b25d99..16e49c6c5f 100644 --- a/tests/openbookTest.ts +++ b/tests/openbookTest.ts @@ -12,7 +12,7 @@ import { } from '../sdk/src'; import openbookIDL from '../sdk/src/idl/openbook.json'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { createOpenOrdersAccount, diff --git a/tests/oracleDiffSources.ts b/tests/oracleDiffSources.ts index 3971f60370..e432fc0851 100644 --- a/tests/oracleDiffSources.ts +++ b/tests/oracleDiffSources.ts @@ -28,7 +28,7 @@ import { } from './testHelpers'; // import { PRICE_PRECISION, PEG_PRECISION, Wallet, DriftClient } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('oracle diff sources', () => { diff --git a/tests/oracleFillPriceGuardrails.ts b/tests/oracleFillPriceGuardrails.ts index dc0b5758ca..c6215322ba 100644 --- a/tests/oracleFillPriceGuardrails.ts +++ b/tests/oracleFillPriceGuardrails.ts @@ -31,7 +31,7 @@ import { PostOnlyParams, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('oracle fill guardrails', () => { diff --git a/tests/oracleOffsetOrders.ts b/tests/oracleOffsetOrders.ts index 2f498c2e5d..0037353532 100644 --- a/tests/oracleOffsetOrders.ts +++ b/tests/oracleOffsetOrders.ts @@ -30,7 +30,7 @@ import { } from './testHelpers'; import { calculateEntryPrice, PostOnlyParams } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('oracle offset', () => { diff --git a/tests/order.ts b/tests/order.ts index a7e8f1b45d..d603a268c1 100644 --- a/tests/order.ts +++ b/tests/order.ts @@ -47,7 +47,7 @@ import { ZERO, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; const enumsAreEqual = ( diff --git a/tests/ordersWithSpread.ts b/tests/ordersWithSpread.ts index b3d82dc518..e7b589bb27 100644 --- a/tests/ordersWithSpread.ts +++ b/tests/ordersWithSpread.ts @@ -34,7 +34,7 @@ import { PEG_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('amm spread: market order', () => { diff --git a/tests/overwritePerpAccounts.ts b/tests/overwritePerpAccounts.ts index 989558f399..fdbf3cac3a 100644 --- a/tests/overwritePerpAccounts.ts +++ b/tests/overwritePerpAccounts.ts @@ -18,7 +18,7 @@ import { overWritePerpMarket, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; import { diff --git a/tests/pauseDepositWithdraw.ts b/tests/pauseDepositWithdraw.ts index 830cf6d5d3..5360f124d0 100644 --- a/tests/pauseDepositWithdraw.ts +++ b/tests/pauseDepositWithdraw.ts @@ -36,7 +36,7 @@ import { SpotOperation, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw 22', () => { diff --git a/tests/pauseExchange.ts b/tests/pauseExchange.ts index 8ca04cd020..28d40955d2 100644 --- a/tests/pauseExchange.ts +++ b/tests/pauseExchange.ts @@ -19,7 +19,7 @@ import { initializeQuoteSpotMarket, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('Pause exchange', () => { diff --git a/tests/perpLpJit.ts b/tests/perpLpJit.ts index fce1546a06..6cd4aa53a8 100644 --- a/tests/perpLpJit.ts +++ b/tests/perpLpJit.ts @@ -36,7 +36,7 @@ import { // sleep, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; let lastOrderRecordsLength = 0; diff --git a/tests/perpLpRiskMitigation.ts b/tests/perpLpRiskMitigation.ts index 12b8037f31..22c8ecd0c3 100644 --- a/tests/perpLpRiskMitigation.ts +++ b/tests/perpLpRiskMitigation.ts @@ -35,7 +35,7 @@ import { // sleep, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function adjustOraclePostSwap(baa, swapDirection, market, context) { diff --git a/tests/phoenixTest.ts b/tests/phoenixTest.ts index 5d1bf8edbc..c8a0cbc9f3 100644 --- a/tests/phoenixTest.ts +++ b/tests/phoenixTest.ts @@ -45,7 +45,7 @@ import { deserializeMarketData, TokenConfig } from '@ellipsis-labs/phoenix-sdk'; import * as Phoenix from '@ellipsis-labs/phoenix-sdk'; import { assert } from 'chai'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { BankrunProvider } from 'anchor-bankrun'; import { diff --git a/tests/placeAndMakePerp.ts b/tests/placeAndMakePerp.ts index efdea60451..1b25409f71 100644 --- a/tests/placeAndMakePerp.ts +++ b/tests/placeAndMakePerp.ts @@ -27,7 +27,7 @@ import { } from './testHelpers'; import { PEG_PRECISION, PerpOperation, PostOnlyParams } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('place and make perp order', () => { diff --git a/tests/placeAndMakeSignedMsgBankrun.ts b/tests/placeAndMakeSignedMsgBankrun.ts index 173e1364c4..5e948e36fb 100644 --- a/tests/placeAndMakeSignedMsgBankrun.ts +++ b/tests/placeAndMakeSignedMsgBankrun.ts @@ -62,7 +62,7 @@ import { PostOnlyParams, } from '../sdk/src'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; import { nanoid } from 'nanoid'; diff --git a/tests/placeAndMakeSpotOrder.ts b/tests/placeAndMakeSpotOrder.ts index b5ec4cca97..22f4da8428 100644 --- a/tests/placeAndMakeSpotOrder.ts +++ b/tests/placeAndMakeSpotOrder.ts @@ -28,7 +28,7 @@ import { } from './testHelpers'; import { MARGIN_PRECISION, PostOnlyParams } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('place and make spot order', () => { diff --git a/tests/postOnly.ts b/tests/postOnly.ts index f680dedbaa..b9ae5e95b2 100644 --- a/tests/postOnly.ts +++ b/tests/postOnly.ts @@ -33,7 +33,7 @@ import { ZERO, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('post only', () => { diff --git a/tests/postOnlyAmmFulfillment.ts b/tests/postOnlyAmmFulfillment.ts index 388f0fc595..085177f220 100644 --- a/tests/postOnlyAmmFulfillment.ts +++ b/tests/postOnlyAmmFulfillment.ts @@ -33,7 +33,7 @@ import { } from './testHelpers'; import { convertToNumber, PostOnlyParams } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('post only maker order w/ amm fulfillments', () => { diff --git a/tests/prelisting.ts b/tests/prelisting.ts index 92f7a510af..e26889d75b 100644 --- a/tests/prelisting.ts +++ b/tests/prelisting.ts @@ -28,7 +28,7 @@ import { PostOnlyParams, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('prelisting', () => { diff --git a/tests/pyth.ts b/tests/pyth.ts index d437bf60e8..c9a066f020 100644 --- a/tests/pyth.ts +++ b/tests/pyth.ts @@ -29,7 +29,7 @@ import { QUOTE_SPOT_MARKET_INDEX, } from '../sdk/src'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function updateFundingRateHelper( diff --git a/tests/pythLazerBankrun.ts b/tests/pythLazerBankrun.ts index 7e1721bea9..fd0b976209 100644 --- a/tests/pythLazerBankrun.ts +++ b/tests/pythLazerBankrun.ts @@ -12,7 +12,7 @@ import { getPythLazerOraclePublicKey, isVariant, } from '../sdk/src'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { startAnchor } from 'solana-bankrun'; import { AccountInfo, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; diff --git a/tests/pythPull.ts b/tests/pythPull.ts index 5118651af6..14f333ce12 100644 --- a/tests/pythPull.ts +++ b/tests/pythPull.ts @@ -5,7 +5,7 @@ import { TestClient, getPythPullOraclePublicKey, } from '../sdk/src'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { startAnchor } from 'solana-bankrun'; import { AccountInfo, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; diff --git a/tests/referencePriceOffset.ts b/tests/referencePriceOffset.ts index 5bfa89007e..5e3b910150 100644 --- a/tests/referencePriceOffset.ts +++ b/tests/referencePriceOffset.ts @@ -30,7 +30,7 @@ import { placeAndFillVammTrade, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; import { diff --git a/tests/referrer.ts b/tests/referrer.ts index a310bcd24a..e712b2c98f 100644 --- a/tests/referrer.ts +++ b/tests/referrer.ts @@ -31,7 +31,7 @@ import { } from '../sdk/src'; import { decodeName } from '../sdk/src/userName'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('referrer', () => { diff --git a/tests/resizeSwiftUserOrderIds.ts b/tests/resizeSwiftUserOrderIds.ts index e6ffa6d425..2aaf0a9e69 100644 --- a/tests/resizeSwiftUserOrderIds.ts +++ b/tests/resizeSwiftUserOrderIds.ts @@ -25,7 +25,7 @@ import { } from './testHelpers'; import { PEG_PRECISION } from '../sdk/src'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; dotenv.config(); diff --git a/tests/roundInFavorBaseAsset.ts b/tests/roundInFavorBaseAsset.ts index c1a3b7dec0..5e57443d66 100644 --- a/tests/roundInFavorBaseAsset.ts +++ b/tests/roundInFavorBaseAsset.ts @@ -22,7 +22,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('round in favor', () => { diff --git a/tests/serumTest.ts b/tests/serumTest.ts index 7ede64540d..c683edb2bb 100644 --- a/tests/serumTest.ts +++ b/tests/serumTest.ts @@ -33,7 +33,7 @@ import { NATIVE_MINT } from '@solana/spl-token'; import { Market } from '@project-serum/serum'; import { getMarketOrderParams, ZERO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('serum spot market', () => { diff --git a/tests/signedMsgWsDelegates.ts b/tests/signedMsgWsDelegates.ts index 990be3bb75..90f9227a70 100644 --- a/tests/signedMsgWsDelegates.ts +++ b/tests/signedMsgWsDelegates.ts @@ -20,7 +20,7 @@ import { import { mockOracleNoProgram } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import dotenv from 'dotenv'; import { PYTH_STORAGE_DATA } from './pythLazerData'; diff --git a/tests/spotDepositWithdraw.ts b/tests/spotDepositWithdraw.ts index 71b412b9b6..f9565bf604 100644 --- a/tests/spotDepositWithdraw.ts +++ b/tests/spotDepositWithdraw.ts @@ -41,7 +41,7 @@ import { PRICE_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw', () => { diff --git a/tests/spotDepositWithdraw22.ts b/tests/spotDepositWithdraw22.ts index 5bcd5cf5f1..339fff0953 100644 --- a/tests/spotDepositWithdraw22.ts +++ b/tests/spotDepositWithdraw22.ts @@ -41,7 +41,7 @@ import { PRICE_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw 22', () => { diff --git a/tests/spotDepositWithdraw22TransferHooks.ts b/tests/spotDepositWithdraw22TransferHooks.ts index f01043172e..6466886fe7 100644 --- a/tests/spotDepositWithdraw22TransferHooks.ts +++ b/tests/spotDepositWithdraw22TransferHooks.ts @@ -51,7 +51,7 @@ import { resolveExtraAccountMeta, } from '@solana/spl-token'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { initializeExtraAccountMetaList } from './splTransferHookClient'; diff --git a/tests/spotMarketPoolIds.ts b/tests/spotMarketPoolIds.ts index 1395856599..1b2ce5c087 100644 --- a/tests/spotMarketPoolIds.ts +++ b/tests/spotMarketPoolIds.ts @@ -25,7 +25,7 @@ import { } from './testHelpers'; import { QUOTE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('spot deposit and withdraw', () => { diff --git a/tests/spotSwap.ts b/tests/spotSwap.ts index f60331cc4f..5aaa985c30 100644 --- a/tests/spotSwap.ts +++ b/tests/spotSwap.ts @@ -40,7 +40,7 @@ import { import { NATIVE_MINT } from '@solana/spl-token'; import { DexInstructions, Market, OpenOrders } from '@project-serum/serum'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { DRIFT_PROGRAM_ID } from '../sdk/src'; diff --git a/tests/spotSwap22.ts b/tests/spotSwap22.ts index a876a74504..de9b72a350 100644 --- a/tests/spotSwap22.ts +++ b/tests/spotSwap22.ts @@ -36,7 +36,7 @@ import { createTransferInstruction, } from '@solana/spl-token'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { DRIFT_PROGRAM_ID } from '../sdk/src'; diff --git a/tests/spotWithdrawUtil100.ts b/tests/spotWithdrawUtil100.ts index 25cf31c10d..17568581fb 100644 --- a/tests/spotWithdrawUtil100.ts +++ b/tests/spotWithdrawUtil100.ts @@ -46,7 +46,7 @@ import { import { NATIVE_MINT } from '@solana/spl-token'; import { ContractTier } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('test function when spot market at >= 100% util', () => { diff --git a/tests/stopLimits.ts b/tests/stopLimits.ts index 3bcae9d15a..2edd036a7b 100644 --- a/tests/stopLimits.ts +++ b/tests/stopLimits.ts @@ -33,7 +33,7 @@ import { getAssociatedTokenAddressSync, } from '@solana/spl-token'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('stop limit', () => { diff --git a/tests/subaccounts.ts b/tests/subaccounts.ts index 2f6f5c5cd2..79aac79eba 100644 --- a/tests/subaccounts.ts +++ b/tests/subaccounts.ts @@ -30,7 +30,7 @@ import { } from '../sdk'; import { PublicKey } from '@solana/web3.js'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('subaccounts', () => { diff --git a/tests/surgePricing.ts b/tests/surgePricing.ts index 4402201060..26f19bfaac 100644 --- a/tests/surgePricing.ts +++ b/tests/surgePricing.ts @@ -26,7 +26,7 @@ import { import { QUOTE_PRECISION, getUserAccountPublicKey } from '../sdk/src'; import { calculateInitUserFee } from '../sdk/src/math/state'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('surge pricing', () => { diff --git a/tests/switchOracle.ts b/tests/switchOracle.ts index 7cd425e8c4..6980a712ec 100644 --- a/tests/switchOracle.ts +++ b/tests/switchOracle.ts @@ -25,7 +25,7 @@ import { } from './testHelpers'; import { PRICE_PRECISION, PEG_PRECISION, Wallet, DriftClient } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('switch oracles', () => { diff --git a/tests/switchboardOnDemand.ts b/tests/switchboardOnDemand.ts index 81e04d65d2..278294639e 100644 --- a/tests/switchboardOnDemand.ts +++ b/tests/switchboardOnDemand.ts @@ -1,7 +1,7 @@ import * as anchor from '@coral-xyz/anchor'; import { Program } from '@coral-xyz/anchor'; import { AccountInfo, LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { initializeQuoteSpotMarket, mockUSDCMint } from './testHelpers'; import { OracleSource, TestClient } from '../sdk/src'; diff --git a/tests/switchboardTxCus.ts b/tests/switchboardTxCus.ts index fab886314d..abb4ffb23c 100644 --- a/tests/switchboardTxCus.ts +++ b/tests/switchboardTxCus.ts @@ -30,7 +30,7 @@ import { PostOnlyParams, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('switchboard place orders cus', () => { diff --git a/tests/testHelpers.ts b/tests/testHelpers.ts index df4e742abe..45d777eb99 100644 --- a/tests/testHelpers.ts +++ b/tests/testHelpers.ts @@ -58,7 +58,7 @@ import { BankrunConnection, } from '../sdk/src/bankrun/bankrunConnection'; import pythIDL from '../sdk/src/idl/pyth.json'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; export async function mockOracle( price: number = 50 * 10e7, diff --git a/tests/tokenFaucet.ts b/tests/tokenFaucet.ts index c18cf15699..a9afed75d4 100644 --- a/tests/tokenFaucet.ts +++ b/tests/tokenFaucet.ts @@ -12,7 +12,7 @@ import { unpackMint, } from '@solana/spl-token'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('token faucet', () => { diff --git a/tests/tradingLP.ts b/tests/tradingLP.ts index 565178183e..8755c2095b 100644 --- a/tests/tradingLP.ts +++ b/tests/tradingLP.ts @@ -21,7 +21,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; async function createNewUser( diff --git a/tests/transferPerpPosition.ts b/tests/transferPerpPosition.ts index d2471a94d9..0171ce29e0 100644 --- a/tests/transferPerpPosition.ts +++ b/tests/transferPerpPosition.ts @@ -21,7 +21,7 @@ import { } from './testHelpers'; import { BASE_PRECISION, OracleSource, PERCENTAGE_PRECISION } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; function getOpenInterest(driftClient: TestClient, marketIndex: number) { diff --git a/tests/transferPools.ts b/tests/transferPools.ts index a79d863601..08632c7e7c 100644 --- a/tests/transferPools.ts +++ b/tests/transferPools.ts @@ -26,7 +26,7 @@ import { } from './testHelpers'; import { QUOTE_PRECISION, ZERO } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; import { NATIVE_MINT } from '@solana/spl-token'; diff --git a/tests/triggerOrders.ts b/tests/triggerOrders.ts index 99bf5f71ab..e40473653a 100644 --- a/tests/triggerOrders.ts +++ b/tests/triggerOrders.ts @@ -35,7 +35,7 @@ import { ZERO, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('trigger orders', () => { diff --git a/tests/triggerSpotOrder.ts b/tests/triggerSpotOrder.ts index 0f9277e2c3..a8808c2106 100644 --- a/tests/triggerSpotOrder.ts +++ b/tests/triggerSpotOrder.ts @@ -32,7 +32,7 @@ import { PERCENTAGE_PRECISION, } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('trigger orders', () => { diff --git a/tests/userAccount.ts b/tests/userAccount.ts index 96384ba98a..6f2f00e26b 100644 --- a/tests/userAccount.ts +++ b/tests/userAccount.ts @@ -30,7 +30,7 @@ import { AMM_RESERVE_PRECISION, } from '../sdk/src'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('User Account', () => { diff --git a/tests/userDelegate.ts b/tests/userDelegate.ts index 80dafcb539..4ed2660898 100644 --- a/tests/userDelegate.ts +++ b/tests/userDelegate.ts @@ -24,7 +24,7 @@ import { import { assert } from 'chai'; import { Keypair } from '@solana/web3.js'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('user delegate', () => { diff --git a/tests/userOrderId.ts b/tests/userOrderId.ts index 9ed86fd4f4..7840e056d6 100644 --- a/tests/userOrderId.ts +++ b/tests/userOrderId.ts @@ -24,7 +24,7 @@ import { } from './testHelpers'; import { ContractTier, ExchangeStatus } from '../sdk'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('user order id', () => { diff --git a/tests/whitelist.ts b/tests/whitelist.ts index 66c5f15ead..f7bb7b3c3e 100644 --- a/tests/whitelist.ts +++ b/tests/whitelist.ts @@ -28,7 +28,7 @@ import { mockUserUSDCAccount, } from './testHelpers'; import { startAnchor } from 'solana-bankrun'; -import { TestBulkAccountLoader } from '../sdk/src/accounts/testBulkAccountLoader'; +import { TestBulkAccountLoader } from '../sdk/src/accounts/bulkAccountLoader/testBulkAccountLoader'; import { BankrunContextWrapper } from '../sdk/src/bankrun/bankrunConnection'; describe('whitelist', () => { From 220efd054666b9fc10874a5c1866491ebf76196f Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 30 Jul 2025 10:05:46 +0800 Subject: [PATCH 2/5] refactor(sdk): add lint for index imports --- .eslintrc.js | 11 ++++++++++- sdk/src/events/types.ts | 2 +- sdk/src/math/insurance.ts | 3 ++- sdk/src/math/oracles.ts | 9 ++------- sdk/src/orderSubscriber/OrderSubscriber.ts | 3 ++- sdk/tests/bn/test.ts | 3 ++- 6 files changed, 19 insertions(+), 12 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 60261693ed..f09b072302 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -37,7 +37,16 @@ module.exports = { // Restrict importing BN from bn.js "group": ["bn.js"], "message": "Import BN from @drift-labs/sdk instead", - } + }, + { + // Prevent imports from index files within the same package + group: [ + '**/index', + '**/index.ts', + ], + message: + 'Do not import from index file within the same package. Import directly from source files instead. This prevents barrel imports.', + }, ], }, ], diff --git a/sdk/src/events/types.ts b/sdk/src/events/types.ts index 3c4c92548c..2671344ceb 100644 --- a/sdk/src/events/types.ts +++ b/sdk/src/events/types.ts @@ -21,7 +21,7 @@ import { FuelSeasonRecord, InsuranceFundSwapRecord, TransferProtocolIfSharesToRevenuePoolRecord, -} from '../index'; +} from '../types'; import { EventEmitter } from 'events'; export type EventSubscriptionOptions = { diff --git a/sdk/src/math/insurance.ts b/sdk/src/math/insurance.ts index 093a780073..6524b5d86c 100644 --- a/sdk/src/math/insurance.ts +++ b/sdk/src/math/insurance.ts @@ -1,6 +1,7 @@ import { PERCENTAGE_PRECISION, ZERO } from '../constants/numericConstants'; -import { BN, SpotMarketAccount, SpotBalanceType } from '../index'; import { getTokenAmount } from '../math/spotBalance'; +import { BN } from '@coral-xyz/anchor'; +import { SpotBalanceType, SpotMarketAccount } from '../types'; export function nextRevenuePoolSettleApr( spotMarket: SpotMarketAccount, diff --git a/sdk/src/math/oracles.ts b/sdk/src/math/oracles.ts index bfbd88702c..a5a2153f06 100644 --- a/sdk/src/math/oracles.ts +++ b/sdk/src/math/oracles.ts @@ -1,4 +1,4 @@ -import { AMM, OracleGuardRails, isVariant } from '../types'; +import { AMM, HistoricalOracleData, OracleGuardRails, OracleSource, PerpMarketAccount, isVariant } from '../types'; import { OraclePriceData } from '../oracles/types'; import { BID_ASK_SPREAD_PRECISION, @@ -9,13 +9,8 @@ import { FIVE_MINUTE, PERCENTAGE_PRECISION, } from '../constants/numericConstants'; -import { - BN, - HistoricalOracleData, - OracleSource, - PerpMarketAccount, -} from '../index'; import { assert } from '../assert/assert'; +import { BN } from '@coral-xyz/anchor'; export function oraclePriceBands( market: PerpMarketAccount, diff --git a/sdk/src/orderSubscriber/OrderSubscriber.ts b/sdk/src/orderSubscriber/OrderSubscriber.ts index 2c0b95bb69..6ecb37234e 100644 --- a/sdk/src/orderSubscriber/OrderSubscriber.ts +++ b/sdk/src/orderSubscriber/OrderSubscriber.ts @@ -13,12 +13,13 @@ import { PollingSubscription } from './PollingSubscription'; import { WebsocketSubscription } from './WebsocketSubscription'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; -import { calculateOrderBaseAssetAmount, ZERO } from '../index'; import { BN } from '@coral-xyz/anchor'; import { ProtectMakerParamsMap } from '../dlob/types'; import { decodeUser } from '../decode/user'; import { grpcSubscription } from './grpcSubscription'; import { isUserProtectedMaker } from '../math/userStatus'; +import { calculateOrderBaseAssetAmount } from '../math/orders'; +import { ZERO } from '../constants/numericConstants'; export class OrderSubscriber { driftClient: DriftClient; diff --git a/sdk/tests/bn/test.ts b/sdk/tests/bn/test.ts index e4733dee6f..305e14d120 100644 --- a/sdk/tests/bn/test.ts +++ b/sdk/tests/bn/test.ts @@ -1,4 +1,3 @@ -import { BN, numberToSafeBN } from '../../src/index'; import { expect } from 'chai'; import { BigNum } from '../../src/factory/bigNum'; import { @@ -7,6 +6,8 @@ import { BASE_PRECISION_EXP, TEN_THOUSAND, } from '../../src/constants/numericConstants'; +import { BN } from '@coral-xyz/anchor'; +import { numberToSafeBN } from '../../src/math/utils'; // if you used the '@types/mocha' method to install mocha type definitions, uncomment the following line // import 'mocha'; From 70762faa64ec8eb8c90c33c59a105df1e4f4e103 Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 30 Jul 2025 10:41:26 +0800 Subject: [PATCH 3/5] refactor(sdk): consume IDriftClient --- .../auctionSubscriber/auctionSubscriber.ts | 4 +-- .../auctionSubscriberGrpc.ts | 4 +-- sdk/src/auctionSubscriber/types.ts | 4 +-- .../index.ts} | 24 +++++++++-------- sdk/src/dlob/DLOBSubscriber/types.ts | 27 +++++++++++++++++++ sdk/src/dlob/types.ts | 24 ----------------- sdk/src/math/superStake.ts | 10 +++---- .../openbookV2FulfillmentConfigMap.ts | 6 ++--- .../phoenix/phoenixFulfillmentConfigMap.ts | 6 ++--- sdk/src/serum/serumFulfillmentConfigMap.ts | 6 ++--- .../grpcSignedMsgUserAccountSubscriber.ts | 4 +-- .../swift/signedMsgUserAccountSubscriber.ts | 6 ++--- sdk/src/userMap/referrerMap.ts | 8 +++--- sdk/src/userMap/userStatsMap.ts | 8 +++--- 14 files changed, 73 insertions(+), 68 deletions(-) rename sdk/src/dlob/{DLOBSubscriber.ts => DLOBSubscriber/index.ts} (94%) create mode 100644 sdk/src/dlob/DLOBSubscriber/types.ts diff --git a/sdk/src/auctionSubscriber/auctionSubscriber.ts b/sdk/src/auctionSubscriber/auctionSubscriber.ts index 75b35965e1..f09f45e907 100644 --- a/sdk/src/auctionSubscriber/auctionSubscriber.ts +++ b/sdk/src/auctionSubscriber/auctionSubscriber.ts @@ -1,5 +1,4 @@ import { AuctionSubscriberConfig, AuctionSubscriberEvents } from './types'; -import { DriftClient } from '../driftClient'; import { getUserFilter, getUserWithAuctionFilter } from '../memcmp'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; @@ -7,9 +6,10 @@ import { UserAccount } from '../types'; import { ConfirmOptions, Context, PublicKey } from '@solana/web3.js'; import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { ResubOpts } from '../accounts/types'; +import { IDriftClient } from '../driftClient/types'; export class AuctionSubscriber { - private driftClient: DriftClient; + private driftClient: IDriftClient; private opts: ConfirmOptions; private resubOpts?: ResubOpts; diff --git a/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts b/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts index ca83f90e49..1a15818fc8 100644 --- a/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts +++ b/sdk/src/auctionSubscriber/auctionSubscriberGrpc.ts @@ -1,5 +1,4 @@ import { AuctionSubscriberConfig, AuctionSubscriberEvents } from './types'; -import { DriftClient } from '../driftClient'; import { getUserFilter, getUserWithAuctionFilter } from '../memcmp'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; @@ -8,9 +7,10 @@ import { ConfirmOptions, Context, PublicKey } from '@solana/web3.js'; import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/webSocketProgramAccountSubscriber'; import { GrpcConfigs, ResubOpts } from '../accounts/types'; import { grpcProgramAccountSubscriber } from '../accounts/programAccount/grpcProgramAccountSubscriber'; +import { IDriftClient } from '../driftClient/types'; export class AuctionSubscriberGrpc { - private driftClient: DriftClient; + private driftClient: IDriftClient; private opts: ConfirmOptions; private resubOpts?: ResubOpts; private grpcConfigs?: GrpcConfigs; diff --git a/sdk/src/auctionSubscriber/types.ts b/sdk/src/auctionSubscriber/types.ts index 8424d9a9b1..e64ae21163 100644 --- a/sdk/src/auctionSubscriber/types.ts +++ b/sdk/src/auctionSubscriber/types.ts @@ -1,10 +1,10 @@ import { GrpcConfigs } from '../accounts/types'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { UserAccount } from '../types'; import { ConfirmOptions, PublicKey } from '@solana/web3.js'; export type AuctionSubscriberConfig = { - driftClient: DriftClient; + driftClient: IDriftClient; opts?: ConfirmOptions; resubTimeoutMs?: number; logResubMessages?: boolean; diff --git a/sdk/src/dlob/DLOBSubscriber.ts b/sdk/src/dlob/DLOBSubscriber/index.ts similarity index 94% rename from sdk/src/dlob/DLOBSubscriber.ts rename to sdk/src/dlob/DLOBSubscriber/index.ts index 111d231dc6..9f0e010dc9 100644 --- a/sdk/src/dlob/DLOBSubscriber.ts +++ b/sdk/src/dlob/DLOBSubscriber/index.ts @@ -1,15 +1,17 @@ -import { DLOB } from './DLOB'; +import { DLOB } from '../DLOB'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import { - DLOBSource, - DLOBSubscriberEvents, - DLOBSubscriptionConfig, - IDLOB, + // IDLOB, ProtectMakerParamsMap, +} from '../types'; +import { + DLOBSubscriptionConfig, SlotSource, + DLOBSource, + DLOBSubscriberEvents, } from './types'; -import { isVariant, MarketType } from '../types'; +import { isVariant, MarketType } from '../../types'; import { DEFAULT_TOP_OF_BOOK_QUOTE_AMOUNTS, MAJORS_TOP_OF_BOOK_QUOTE_AMOUNTS, @@ -17,9 +19,9 @@ import { L2OrderBook, L2OrderBookGenerator, L3OrderBook, -} from './orderBookLevels'; -import { getProtectedMakerParamsMap } from '../math/protectedMakerParams'; -import { IDriftClient } from '../driftClient/types'; +} from '../orderBookLevels'; +import { getProtectedMakerParamsMap } from '../../math/protectedMakerParams'; +import { IDriftClient } from '../../driftClient/types'; export class DLOBSubscriber { driftClient: IDriftClient; @@ -27,7 +29,7 @@ export class DLOBSubscriber { slotSource: SlotSource; updateFrequency: number; intervalId?: ReturnType; - dlob: IDLOB; + dlob: DLOB; public eventEmitter: StrictEventEmitter; protectedMakerView: boolean; constructor(config: DLOBSubscriptionConfig) { @@ -70,7 +72,7 @@ export class DLOBSubscriber { ); } - public getDLOB(): IDLOB { + public getDLOB(): DLOB { return this.dlob; } diff --git a/sdk/src/dlob/DLOBSubscriber/types.ts b/sdk/src/dlob/DLOBSubscriber/types.ts new file mode 100644 index 0000000000..7122031370 --- /dev/null +++ b/sdk/src/dlob/DLOBSubscriber/types.ts @@ -0,0 +1,27 @@ +import { IDriftClient } from '../../driftClient/types'; +import { DLOB } from '../DLOB'; +import { ProtectMakerParamsMap } from '../types'; + +export type DLOBSubscriptionConfig = { + driftClient: IDriftClient; + dlobSource: DLOBSource; + slotSource: SlotSource; + updateFrequency: number; + protectedMakerView?: boolean; +}; + +export interface SlotSource { + getSlot(): number; +} + +export interface DLOBSource { + getDLOB( + slot: number, + protectedMakerParamsMap?: ProtectMakerParamsMap + ): Promise; +} + +export interface DLOBSubscriberEvents { + update: (dlob: DLOB) => void; + error: (e: Error) => void; +} diff --git a/sdk/src/dlob/types.ts b/sdk/src/dlob/types.ts index 0e05c17184..c97703f871 100644 --- a/sdk/src/dlob/types.ts +++ b/sdk/src/dlob/types.ts @@ -22,30 +22,6 @@ import { import { IDriftClient } from '../driftClient/types'; import { IUserMap } from '../userMap/types'; -export type DLOBSubscriptionConfig = { - driftClient: IDriftClient; - dlobSource: DLOBSource; - slotSource: SlotSource; - updateFrequency: number; - protectedMakerView?: boolean; -}; - -export interface DLOBSubscriberEvents { - update: (dlob: IDLOB) => void; - error: (e: Error) => void; -} - -export interface DLOBSource { - getDLOB( - slot: number, - protectedMakerParamsMap?: ProtectMakerParamsMap - ): Promise; -} - -export interface SlotSource { - getSlot(): number; -} - export type ProtectMakerParamsMap = { [marketType in MarketTypeStr]: Map; }; diff --git a/sdk/src/math/superStake.ts b/sdk/src/math/superStake.ts index 464c27000e..a17baa662c 100644 --- a/sdk/src/math/superStake.ts +++ b/sdk/src/math/superStake.ts @@ -5,7 +5,7 @@ import { TransactionInstruction, } from '@solana/web3.js'; import { JupiterClient, QuoteResponse } from '../jupiter/jupiterClient'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; import { getMarinadeFinanceProgram, getMarinadeMSolPrice } from '../marinade'; import { BN } from '@coral-xyz/anchor'; import { User } from '../user'; @@ -60,7 +60,7 @@ export async function findBestSuperStakeIxs({ marketIndex: number; amount: BN; jupiterClient: JupiterClient; - driftClient: DriftClient; + driftClient: IDriftClient; price?: number; userAccountPublicKey?: PublicKey; forceMarinade?: boolean; @@ -120,7 +120,7 @@ export async function findBestMSolSuperStakeIxs({ }: { amount: BN; jupiterClient: JupiterClient; - driftClient: DriftClient; + driftClient: IDriftClient; price?: number; userAccountPublicKey?: PublicKey; forceMarinade?: boolean; @@ -200,7 +200,7 @@ export async function findBestJitoSolSuperStakeIxs({ }: { amount: BN; jupiterClient: JupiterClient; - driftClient: DriftClient; + driftClient: IDriftClient; userAccountPublicKey?: PublicKey; onlyDirectRoutes?: boolean; jupiterQuote?: QuoteResponse; @@ -240,7 +240,7 @@ export async function findBestLstSuperStakeIxs({ lstMint: PublicKey; lstMarketIndex: number; jupiterClient: JupiterClient; - driftClient: DriftClient; + driftClient: IDriftClient; userAccountPublicKey?: PublicKey; onlyDirectRoutes?: boolean; jupiterQuote?: QuoteResponse; diff --git a/sdk/src/openbook/openbookV2FulfillmentConfigMap.ts b/sdk/src/openbook/openbookV2FulfillmentConfigMap.ts index 9c1b756477..6e163d88a1 100644 --- a/sdk/src/openbook/openbookV2FulfillmentConfigMap.ts +++ b/sdk/src/openbook/openbookV2FulfillmentConfigMap.ts @@ -1,12 +1,12 @@ import { PublicKey } from '@solana/web3.js'; import { OpenbookV2FulfillmentConfigAccount } from '../types'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; export class OpenbookV2FulfillmentConfigMap { - driftClient: DriftClient; + driftClient: IDriftClient; map = new Map(); - public constructor(driftClient: DriftClient) { + public constructor(driftClient: IDriftClient) { this.driftClient = driftClient; } diff --git a/sdk/src/phoenix/phoenixFulfillmentConfigMap.ts b/sdk/src/phoenix/phoenixFulfillmentConfigMap.ts index 0708cc1964..5fb42a6050 100644 --- a/sdk/src/phoenix/phoenixFulfillmentConfigMap.ts +++ b/sdk/src/phoenix/phoenixFulfillmentConfigMap.ts @@ -1,12 +1,12 @@ import { PublicKey } from '@solana/web3.js'; import { PhoenixV1FulfillmentConfigAccount } from '../types'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; export class PhoenixFulfillmentConfigMap { - driftClient: DriftClient; + driftClient: IDriftClient; map = new Map(); - public constructor(driftClient: DriftClient) { + public constructor(driftClient: IDriftClient) { this.driftClient = driftClient; } diff --git a/sdk/src/serum/serumFulfillmentConfigMap.ts b/sdk/src/serum/serumFulfillmentConfigMap.ts index 4d57f40a25..e963410ca1 100644 --- a/sdk/src/serum/serumFulfillmentConfigMap.ts +++ b/sdk/src/serum/serumFulfillmentConfigMap.ts @@ -1,12 +1,12 @@ import { PublicKey } from '@solana/web3.js'; import { SerumV3FulfillmentConfigAccount } from '../types'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; export class SerumFulfillmentConfigMap { - driftClient: DriftClient; + driftClient: IDriftClient; map = new Map(); - public constructor(driftClient: DriftClient) { + public constructor(driftClient: IDriftClient) { this.driftClient = driftClient; } diff --git a/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts b/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts index c2ab64dd59..9e3e723cbb 100644 --- a/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts +++ b/sdk/src/swift/grpcSignedMsgUserAccountSubscriber.ts @@ -4,7 +4,7 @@ import { GrpcConfigs, ResubOpts } from '../accounts/types'; import { SignedMsgUserOrdersAccount } from '../types'; import { getSignedMsgUserOrdersFilter } from '../memcmp'; import { SignedMsgUserOrdersAccountSubscriber } from './signedMsgUserAccountSubscriber'; -import { DriftClient } from '../driftClient'; +import { IDriftClient } from '../driftClient/types'; export class grpcSignedMsgUserOrdersAccountSubscriber extends SignedMsgUserOrdersAccountSubscriber { private grpcConfigs: GrpcConfigs; @@ -19,7 +19,7 @@ export class grpcSignedMsgUserOrdersAccountSubscriber extends SignedMsgUserOrder resyncIntervalMs, }: { grpcConfigs: GrpcConfigs; - driftClient: DriftClient; + driftClient: IDriftClient; commitment?: Commitment; resubOpts?: ResubOpts; decodeFn?: (name: string, data: Buffer) => SignedMsgUserOrdersAccount; diff --git a/sdk/src/swift/signedMsgUserAccountSubscriber.ts b/sdk/src/swift/signedMsgUserAccountSubscriber.ts index 840a936ef0..02d1714133 100644 --- a/sdk/src/swift/signedMsgUserAccountSubscriber.ts +++ b/sdk/src/swift/signedMsgUserAccountSubscriber.ts @@ -3,9 +3,9 @@ import { WebSocketProgramAccountSubscriber } from '../accounts/programAccount/we import { SignedMsgOrderId, SignedMsgUserOrdersAccount } from '../types'; import { Commitment, Context, PublicKey } from '@solana/web3.js'; import { ResubOpts } from '../accounts/types'; -import { DriftClient } from '../driftClient'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; +import { IDriftClient } from '../driftClient/types'; export interface SignedMsgUserOrdersAccountSubscriberEvents { onAccountUpdate: ( @@ -22,7 +22,7 @@ export interface SignedMsgUserOrdersAccountSubscriberEvents { } export class SignedMsgUserOrdersAccountSubscriber { - protected driftClient: DriftClient; + protected driftClient: IDriftClient; protected commitment: Commitment; protected resubOpts?: ResubOpts; protected resyncTimeoutId?: ReturnType; @@ -53,7 +53,7 @@ export class SignedMsgUserOrdersAccountSubscriber { decodeFn, resyncIntervalMs, }: { - driftClient: DriftClient; + driftClient: IDriftClient; commitment?: Commitment; resubOpts?: ResubOpts; decodeFn?: (name: string, data: Buffer) => SignedMsgUserOrdersAccount; diff --git a/sdk/src/userMap/referrerMap.ts b/sdk/src/userMap/referrerMap.ts index d244d32a91..6410d0089a 100644 --- a/sdk/src/userMap/referrerMap.ts +++ b/sdk/src/userMap/referrerMap.ts @@ -3,7 +3,6 @@ import { PublicKey, RpcResponseAndContext, } from '@solana/web3.js'; -import { DriftClient } from '../driftClient'; import { ReferrerInfo } from '../types'; import { getUserAccountPublicKeySync, @@ -15,6 +14,7 @@ import { getUserStatsIsReferredOrReferrerFilter, } from '../memcmp'; import { bs58 } from '@coral-xyz/anchor/dist/cjs/utils/bytes'; +import { IDriftClient } from '../driftClient/types'; const DEFAULT_PUBLIC_KEY = PublicKey.default.toBase58(); @@ -28,7 +28,7 @@ export class ReferrerMap { * Will be undefined if the referrer is not in the map yet. */ private referrerReferrerInfoMap = new Map(); - private driftClient: DriftClient; + private driftClient: IDriftClient; private parallelSync: boolean; private fetchPromise?: Promise; @@ -37,9 +37,9 @@ export class ReferrerMap { /** * Creates a new UserStatsMap instance. * - * @param {DriftClient} driftClient - The DriftClient instance. + * @param {IDriftClient} driftClient - The DriftClient instance. */ - constructor(driftClient: DriftClient, parallelSync?: boolean) { + constructor(driftClient: IDriftClient, parallelSync?: boolean) { this.driftClient = driftClient; this.parallelSync = parallelSync !== undefined ? parallelSync : true; } diff --git a/sdk/src/userMap/userStatsMap.ts b/sdk/src/userMap/userStatsMap.ts index 074ce3eedc..47b2df2ee9 100644 --- a/sdk/src/userMap/userStatsMap.ts +++ b/sdk/src/userMap/userStatsMap.ts @@ -1,4 +1,3 @@ -import { DriftClient } from '../driftClient'; import { getUserStatsAccountPublicKey } from '../addresses/pda'; import { OrderRecord, @@ -21,13 +20,14 @@ import { getUserStatsFilter } from '../memcmp'; import { PublicKey } from '@solana/web3.js'; import { UserMap } from './userMap'; +import { IDriftClient } from '../driftClient/types'; export class UserStatsMap { /** * map from authority pubkey to UserStats */ private userStatsMap = new Map(); - private driftClient: DriftClient; + private driftClient: IDriftClient; private bulkAccountLoader: BulkAccountLoader; private decode; private syncConfig: SyncConfig; @@ -38,11 +38,11 @@ export class UserStatsMap { /** * Creates a new UserStatsMap instance. * - * @param {DriftClient} driftClient - The DriftClient instance. + * @param {IDriftClient} driftClient - The DriftClient instance. * @param {BulkAccountLoader} [bulkAccountLoader] - If not provided, a new BulkAccountLoader with polling disabled will be created. */ constructor( - driftClient: DriftClient, + driftClient: IDriftClient, bulkAccountLoader?: BulkAccountLoader, syncConfig?: SyncConfig ) { From c1c317cc36858d4214bc629e197c2e6d5ecb424d Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 30 Jul 2025 10:54:59 +0800 Subject: [PATCH 4/5] refactor(sdk): consume IUser --- sdk/src/accounts/bulkUserSubscription.ts | 4 ++-- sdk/src/driftClient/index.ts | 12 ++++++------ sdk/src/math/bankruptcy.ts | 4 ++-- sdk/src/math/superStake.ts | 4 ++-- sdk/src/userMap/userMap.ts | 20 ++++++++++---------- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/sdk/src/accounts/bulkUserSubscription.ts b/sdk/src/accounts/bulkUserSubscription.ts index c0831c63fe..99a29c69d0 100644 --- a/sdk/src/accounts/bulkUserSubscription.ts +++ b/sdk/src/accounts/bulkUserSubscription.ts @@ -1,4 +1,4 @@ -import { User } from '../user'; +import { IUser } from '../user/types'; import { BulkAccountLoader } from './bulkAccountLoader/bulkAccountLoader'; import { PollingUserAccountSubscriber } from './userAccount/pollingUserAccountSubscriber'; @@ -7,7 +7,7 @@ import { PollingUserAccountSubscriber } from './userAccount/pollingUserAccountSu * @param accountLoader */ export async function bulkPollingUserSubscribe( - users: User[], + users: IUser[], accountLoader: BulkAccountLoader ): Promise { if (users.length === 0) { diff --git a/sdk/src/driftClient/index.ts b/sdk/src/driftClient/index.ts index 1bede7816e..ee01ad0e61 100644 --- a/sdk/src/driftClient/index.ts +++ b/sdk/src/driftClient/index.ts @@ -139,7 +139,7 @@ import { PollingDriftClientAccountSubscriber } from '../accounts/driftClientAcco import { WebSocketDriftClientAccountSubscriber } from '../accounts/driftClientAccount/webSocketDriftClientAccountSubscriber'; import { RetryTxSender } from '../tx/retryTxSender'; import { User } from '../user'; -import { UserSubscriptionConfig } from '../user/types'; +import { IUser, UserSubscriptionConfig } from '../user/types'; import { configs, DRIFT_ORACLE_RECEIVER_ID, @@ -217,7 +217,7 @@ export class DriftClient implements IDriftClient { env: DriftEnv; opts?: ConfirmOptions; useHotWalletAdmin?: boolean; - users = new Map(); + users = new Map(); userStats?: IUserStats; activeSubAccountId: number; userAccountSubscriptionConfig: UserSubscriptionConfig; @@ -479,7 +479,7 @@ export class DriftClient implements IDriftClient { subAccountId: number, accountSubscriptionConfig: UserSubscriptionConfig, authority?: PublicKey - ): User { + ): IUser { const userAccountPublicKey = getUserAccountPublicKeySync( this.program.programId, authority ?? this.authority, @@ -2019,7 +2019,7 @@ export class DriftClient implements IDriftClient { }); } - public getUser(subAccountId?: number, authority?: PublicKey): User { + public getUser(subAccountId?: number, authority?: PublicKey): IUser { subAccountId = subAccountId ?? this.activeSubAccountId; authority = authority ?? this.authority; const userMapKey = this.getUserMapKey(subAccountId, authority); @@ -2038,7 +2038,7 @@ export class DriftClient implements IDriftClient { return this.users.has(userMapKey); } - public getUsers(): User[] { + public getUsers(): IUser[] { // delegate users get added to the end return [...this.users.values()] .filter((acct) => @@ -9262,7 +9262,7 @@ export class DriftClient implements IDriftClient { public getMarketFees( marketType: MarketType, marketIndex?: number, - user?: User, + user?: IUser, enteringHighLeverageMode?: boolean ) { let feeTier; diff --git a/sdk/src/math/bankruptcy.ts b/sdk/src/math/bankruptcy.ts index 22cca5813b..3601051cae 100644 --- a/sdk/src/math/bankruptcy.ts +++ b/sdk/src/math/bankruptcy.ts @@ -1,9 +1,9 @@ import { ZERO } from '../constants/numericConstants'; import { hasOpenOrders } from './position'; import { isVariant } from '../types'; -import { User } from '../user'; +import { IUser } from '../user/types'; -export function isUserBankrupt(user: User): boolean { +export function isUserBankrupt(user: IUser): boolean { const userAccount = user.getUserAccount(); let hasLiability = false; for (const position of userAccount.spotPositions) { diff --git a/sdk/src/math/superStake.ts b/sdk/src/math/superStake.ts index a17baa662c..424e157140 100644 --- a/sdk/src/math/superStake.ts +++ b/sdk/src/math/superStake.ts @@ -8,11 +8,11 @@ import { JupiterClient, QuoteResponse } from '../jupiter/jupiterClient'; import { IDriftClient } from '../driftClient/types'; import { getMarinadeFinanceProgram, getMarinadeMSolPrice } from '../marinade'; import { BN } from '@coral-xyz/anchor'; -import { User } from '../user'; import { DepositRecord, isVariant } from '../types'; import { LAMPORTS_PRECISION, ZERO } from '../constants/numericConstants'; import fetch from 'node-fetch'; import { checkSameDate } from './utils'; +import { IUser } from '../user/types'; export type BSOL_STATS_API_RESPONSE = { success: boolean; @@ -423,7 +423,7 @@ export async function calculateSolEarned({ depositRecords, }: { marketIndex: number; - user: User; + user: IUser; depositRecords: DepositRecord[]; }): Promise { const now = Date.now() / 1000; diff --git a/sdk/src/userMap/userMap.ts b/sdk/src/userMap/userMap.ts index bdbb79cf3f..a223042f25 100644 --- a/sdk/src/userMap/userMap.ts +++ b/sdk/src/userMap/userMap.ts @@ -14,7 +14,7 @@ import { } from '../types'; import { WrappedEvent } from '../events/types'; import { DLOB } from '../dlob/DLOB'; -import { UserSubscriptionConfig } from '../user/types'; +import { IUser, UserSubscriptionConfig } from '../user/types'; import { DataAndSlot } from '../accounts/types'; import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; import { ProtectMakerParamsMap } from '../dlob/types'; @@ -51,7 +51,7 @@ import { IDriftClient } from '../driftClient/types'; const MAX_USER_ACCOUNT_SIZE_BYTES = 4376; export class UserMap implements IUserMap { - private userMap = new Map>(); + private userMap = new Map>(); driftClient: IDriftClient; eventEmitter: StrictEventEmitter; private connection: Connection; @@ -208,10 +208,10 @@ export class UserMap implements IUserMap { * @param key userAccountPublicKey to get User for * @returns user User | undefined */ - public get(key: string): User | undefined { + public get(key: string): IUser | undefined { return this.userMap.get(key)?.data; } - public getWithSlot(key: string): DataAndSlot | undefined { + public getWithSlot(key: string): DataAndSlot | undefined { return this.userMap.get(key); } @@ -223,7 +223,7 @@ export class UserMap implements IUserMap { public async mustGet( key: string, accountSubscription?: UserSubscriptionConfig - ): Promise { + ): Promise { if (!this.has(key)) { await this.addPubkey( new PublicKey(key), @@ -237,7 +237,7 @@ export class UserMap implements IUserMap { public async mustGetWithSlot( key: string, accountSubscription?: UserSubscriptionConfig - ): Promise> { + ): Promise> { if (!this.has(key)) { await this.addPubkey( new PublicKey(key), @@ -323,21 +323,21 @@ export class UserMap implements IUserMap { } } - public *values(): IterableIterator { + public *values(): IterableIterator { for (const dataAndSlot of this.userMap.values()) { yield dataAndSlot.data; } } - public valuesWithSlot(): IterableIterator> { + public valuesWithSlot(): IterableIterator> { return this.userMap.values(); } - public *entries(): IterableIterator<[string, User]> { + public *entries(): IterableIterator<[string, IUser]> { for (const [key, dataAndSlot] of this.userMap.entries()) { yield [key, dataAndSlot.data]; } } - public entriesWithSlot(): IterableIterator<[string, DataAndSlot]> { + public entriesWithSlot(): IterableIterator<[string, DataAndSlot]> { return this.userMap.entries(); } From 96e4d105e2c9c1a1ccfb0a9478e2c4a459bf534f Mon Sep 17 00:00:00 2001 From: Chester Sim Date: Wed, 30 Jul 2025 12:23:09 +0800 Subject: [PATCH 5/5] refactor(sdk): consume IUserStats, IDLOB, IUserMap, IOrderSubscriber --- sdk/src/accounts/bulkUserStatsSubscription.ts | 4 ++-- sdk/src/dlob/DLOBSubscriber/index.ts | 5 +++-- sdk/src/dlob/DLOBSubscriber/types.ts | 7 +++---- sdk/src/math/trade.ts | 6 +++--- sdk/src/orderSubscriber/OrderSubscriber.ts | 6 +++--- sdk/src/userMap/userMap.ts | 4 ++-- sdk/src/userMap/userStatsMap.ts | 15 ++++++++------- 7 files changed, 24 insertions(+), 23 deletions(-) diff --git a/sdk/src/accounts/bulkUserStatsSubscription.ts b/sdk/src/accounts/bulkUserStatsSubscription.ts index c2ebe62877..d22eb36887 100644 --- a/sdk/src/accounts/bulkUserStatsSubscription.ts +++ b/sdk/src/accounts/bulkUserStatsSubscription.ts @@ -1,4 +1,4 @@ -import { UserStats } from '../userStats'; +import { IUserStats } from '../userStats/types'; import { BulkAccountLoader } from './bulkAccountLoader/bulkAccountLoader'; import { PollingUserStatsAccountSubscriber } from './userStatsAccount/pollingUserStatsAccountSubscriber'; @@ -7,7 +7,7 @@ import { PollingUserStatsAccountSubscriber } from './userStatsAccount/pollingUse * @param accountLoader */ export async function bulkPollingUserStatsSubscribe( - userStats: UserStats[], + userStats: IUserStats[], accountLoader: BulkAccountLoader ): Promise { if (userStats.length === 0) { diff --git a/sdk/src/dlob/DLOBSubscriber/index.ts b/sdk/src/dlob/DLOBSubscriber/index.ts index 9f0e010dc9..d5b7011cfd 100644 --- a/sdk/src/dlob/DLOBSubscriber/index.ts +++ b/sdk/src/dlob/DLOBSubscriber/index.ts @@ -2,6 +2,7 @@ import { DLOB } from '../DLOB'; import { EventEmitter } from 'events'; import StrictEventEmitter from 'strict-event-emitter-types'; import { + IDLOB, // IDLOB, ProtectMakerParamsMap, } from '../types'; @@ -29,7 +30,7 @@ export class DLOBSubscriber { slotSource: SlotSource; updateFrequency: number; intervalId?: ReturnType; - dlob: DLOB; + dlob: IDLOB; public eventEmitter: StrictEventEmitter; protectedMakerView: boolean; constructor(config: DLOBSubscriptionConfig) { @@ -72,7 +73,7 @@ export class DLOBSubscriber { ); } - public getDLOB(): DLOB { + public getDLOB(): IDLOB { return this.dlob; } diff --git a/sdk/src/dlob/DLOBSubscriber/types.ts b/sdk/src/dlob/DLOBSubscriber/types.ts index 7122031370..3040d45f19 100644 --- a/sdk/src/dlob/DLOBSubscriber/types.ts +++ b/sdk/src/dlob/DLOBSubscriber/types.ts @@ -1,6 +1,5 @@ import { IDriftClient } from '../../driftClient/types'; -import { DLOB } from '../DLOB'; -import { ProtectMakerParamsMap } from '../types'; +import { IDLOB, ProtectMakerParamsMap } from '../types'; export type DLOBSubscriptionConfig = { driftClient: IDriftClient; @@ -18,10 +17,10 @@ export interface DLOBSource { getDLOB( slot: number, protectedMakerParamsMap?: ProtectMakerParamsMap - ): Promise; + ): Promise; } export interface DLOBSubscriberEvents { - update: (dlob: DLOB) => void; + update: (dlob: IDLOB) => void; error: (e: Error) => void; } diff --git a/sdk/src/math/trade.ts b/sdk/src/math/trade.ts index aeb9272ed7..f11fada280 100644 --- a/sdk/src/math/trade.ts +++ b/sdk/src/math/trade.ts @@ -32,10 +32,10 @@ import { import { squareRootBN } from './utils'; import { isVariant } from '../types'; import { OraclePriceData } from '../oracles/types'; -import { DLOB } from '../dlob/DLOB'; import { PublicKey } from '@solana/web3.js'; import { Orderbook } from '@project-serum/serum'; import { L2OrderBook } from '../dlob/orderBookLevels'; +import { IDLOB } from '../dlob/types'; const MAXPCT = new BN(1000); //percentage units are [0,1000] => [0,1] @@ -388,7 +388,7 @@ export function calculateEstimatedPerpEntryPrice( direction: PositionDirection, market: PerpMarketAccount, oraclePriceData: OraclePriceData, - dlob: DLOB, + dlob: IDLOB, slot: number, usersToSkip = new Map() ): { @@ -691,7 +691,7 @@ export function calculateEstimatedSpotEntryPrice( direction: PositionDirection, market: SpotMarketAccount, oraclePriceData: OraclePriceData, - dlob: DLOB, + dlob: IDLOB, serumBids: Orderbook, serumAsks: Orderbook, slot: number, diff --git a/sdk/src/orderSubscriber/OrderSubscriber.ts b/sdk/src/orderSubscriber/OrderSubscriber.ts index 4f581c69b4..0dafede77c 100644 --- a/sdk/src/orderSubscriber/OrderSubscriber.ts +++ b/sdk/src/orderSubscriber/OrderSubscriber.ts @@ -18,7 +18,7 @@ import { WebsocketSubscription } from './WebsocketSubscription'; import StrictEventEmitter from 'strict-event-emitter-types'; import { EventEmitter } from 'events'; import { BN } from '@coral-xyz/anchor'; -import { ProtectMakerParamsMap } from '../dlob/types'; +import { IDLOB, ProtectMakerParamsMap } from '../dlob/types'; import { decodeUser } from '../decode/user'; import { grpcSubscription } from './grpcSubscription'; import { isUserProtectedMaker } from '../math/userStatus'; @@ -241,14 +241,14 @@ export class OrderSubscriber implements IOrderSubscriber { * caller to extend the DLOB Subscriber with a custom DLOB type. * @returns New, empty DLOB object. */ - protected createDLOB(protectedMakerParamsMap?: ProtectMakerParamsMap): DLOB { + protected createDLOB(protectedMakerParamsMap?: ProtectMakerParamsMap): IDLOB { return new DLOB(protectedMakerParamsMap); } public async getDLOB( slot: number, protectedMakerParamsMap?: ProtectMakerParamsMap - ): Promise { + ): Promise { const dlob = this.createDLOB(protectedMakerParamsMap); for (const [key, { userAccount }] of this.usersAccounts.entries()) { const protectedMaker = isUserProtectedMaker(userAccount); diff --git a/sdk/src/userMap/userMap.ts b/sdk/src/userMap/userMap.ts index a223042f25..434dc7f15a 100644 --- a/sdk/src/userMap/userMap.ts +++ b/sdk/src/userMap/userMap.ts @@ -17,7 +17,7 @@ import { DLOB } from '../dlob/DLOB'; import { IUser, UserSubscriptionConfig } from '../user/types'; import { DataAndSlot } from '../accounts/types'; import { OneShotUserAccountSubscriber } from '../accounts/userAccount/oneShotUserAccountSubscriber'; -import { ProtectMakerParamsMap } from '../dlob/types'; +import { IDLOB, ProtectMakerParamsMap } from '../dlob/types'; import { Commitment, @@ -275,7 +275,7 @@ export class UserMap implements IUserMap { public async getDLOB( slot: number, protectedMakerParamsMap?: ProtectMakerParamsMap - ): Promise { + ): Promise { const dlob = new DLOB(protectedMakerParamsMap); await dlob.initFromUserMap(this, slot); return dlob; diff --git a/sdk/src/userMap/userStatsMap.ts b/sdk/src/userMap/userStatsMap.ts index 47b2df2ee9..be62793051 100644 --- a/sdk/src/userMap/userStatsMap.ts +++ b/sdk/src/userMap/userStatsMap.ts @@ -19,14 +19,15 @@ import { SyncConfig } from './userMapConfig'; import { getUserStatsFilter } from '../memcmp'; import { PublicKey } from '@solana/web3.js'; -import { UserMap } from './userMap'; import { IDriftClient } from '../driftClient/types'; +import { IUserStats } from '../userStats/types'; +import { IUserMap } from './types'; export class UserStatsMap { /** * map from authority pubkey to UserStats */ - private userStatsMap = new Map(); + private userStatsMap = new Map(); private driftClient: IDriftClient; private bulkAccountLoader: BulkAccountLoader; private decode; @@ -108,7 +109,7 @@ export class UserStatsMap { this.userStatsMap.set(authority.toString(), userStat); } - public async updateWithOrderRecord(record: OrderRecord, userMap: UserMap) { + public async updateWithOrderRecord(record: OrderRecord, userMap: IUserMap) { const user = await userMap.mustGet(record.user.toString()); if (!this.has(user.getUserAccount().authority.toString())) { await this.addUserStat(user.getUserAccount().authority, undefined, false); @@ -117,7 +118,7 @@ export class UserStatsMap { public async updateWithEventRecord( record: WrappedEvent, - userMap?: UserMap + userMap?: IUserMap ) { if (record.eventType === 'DepositRecord') { const depositRecord = record as DepositRecord; @@ -186,7 +187,7 @@ export class UserStatsMap { return this.userStatsMap.has(authorityPublicKey); } - public get(authorityPublicKey: string): UserStats { + public get(authorityPublicKey: string): IUserStats { return this.userStatsMap.get(authorityPublicKey); } @@ -196,7 +197,7 @@ export class UserStatsMap { * @param authorityPublicKey * @returns */ - public async mustGet(authorityPublicKey: string): Promise { + public async mustGet(authorityPublicKey: string): Promise { if (!this.has(authorityPublicKey)) { await this.addUserStat( new PublicKey(authorityPublicKey), @@ -207,7 +208,7 @@ export class UserStatsMap { return this.get(authorityPublicKey); } - public values(): IterableIterator { + public values(): IterableIterator { return this.userStatsMap.values(); }