@haven-fi/solauto-sdk 1.0.82 → 1.0.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  export * from './solautoMarginfiClient';
2
2
  export * from './solautoClient';
3
3
  export * from './referralStateManager';
4
+ export * from './txHandler';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/clients/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC"}
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./solautoMarginfiClient"), exports);
18
18
  __exportStar(require("./solautoClient"), exports);
19
19
  __exportStar(require("./referralStateManager"), exports);
20
+ __exportStar(require("./txHandler"), exports);
@@ -2,21 +2,25 @@ import { PublicKey } from "@solana/web3.js";
2
2
  import { Signer, TransactionBuilder, Umi } from "@metaplex-foundation/umi";
3
3
  import { WalletAdapter } from "@metaplex-foundation/umi-signer-wallet-adapters";
4
4
  import { ReferralState } from "../generated";
5
+ import { TxHandler } from "./txHandler";
5
6
  interface ReferralStateManagerArgs {
6
7
  referralAuthority?: PublicKey;
7
8
  signer?: Signer;
8
9
  wallet?: WalletAdapter;
9
10
  }
10
- export declare class ReferralStateManager {
11
+ export declare class ReferralStateManager extends TxHandler {
12
+ localTest?: boolean | undefined;
11
13
  umi: Umi;
12
14
  signer: Signer;
13
15
  referralAuthority: PublicKey;
14
16
  referralState: PublicKey;
15
17
  referralStateData: ReferralState | null;
16
- constructor(heliusApiKey: string);
18
+ constructor(heliusApiKey: string, localTest?: boolean | undefined);
17
19
  initialize(args: ReferralStateManagerArgs): Promise<void>;
20
+ defaultLookupTables(): string[];
18
21
  updateReferralStatesIx(destFeesMint?: PublicKey, referredBy?: PublicKey, lookupTable?: PublicKey): TransactionBuilder;
19
22
  claimReferralFeesIx(destFeesMint?: PublicKey): TransactionBuilder;
23
+ resetLiveTxUpdates(): Promise<void>;
20
24
  }
21
25
  export {};
22
26
  //# sourceMappingURL=referralStateManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"referralStateManager.d.ts","sourceRoot":"","sources":["../../src/clients/referralStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAa,MAAM,EAAkB,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAEtG,OAAO,EAAE,aAAa,EAAyB,MAAM,iDAAiD,CAAC;AACvG,OAAO,EAA2C,aAAa,EAAgD,MAAM,cAAc,CAAC;AAGpI,UAAU,wBAAwB;IAC9B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,qBAAa,oBAAoB;IACtB,GAAG,EAAG,GAAG,CAAC;IACV,MAAM,EAAG,MAAM,CAAC;IAEhB,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAC1B,iBAAiB,EAAG,aAAa,GAAG,IAAI,CAAC;gBAEpC,YAAY,EAAE,MAAM;IAS1B,UAAU,CAAC,IAAI,EAAE,wBAAwB;IAe/C,sBAAsB,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAiBrH,mBAAmB,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,kBAAkB;CAwBpE"}
1
+ {"version":3,"file":"referralStateManager.d.ts","sourceRoot":"","sources":["../../src/clients/referralStateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAa,MAAM,EAAkB,kBAAkB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAEtG,OAAO,EAAE,aAAa,EAAyB,MAAM,iDAAiD,CAAC;AACvG,OAAO,EAA2C,aAAa,EAAgD,MAAM,cAAc,CAAC;AAEpI,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,UAAU,wBAAwB;IAC9B,iBAAiB,CAAC,EAAE,SAAS,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,aAAa,CAAC;CAC1B;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IAQN,SAAS,CAAC,EAAE,OAAO;IAPrD,GAAG,EAAG,GAAG,CAAC;IACV,MAAM,EAAG,MAAM,CAAC;IAEhB,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAC1B,iBAAiB,EAAG,aAAa,GAAG,IAAI,CAAC;gBAEpC,YAAY,EAAE,MAAM,EAAS,SAAS,CAAC,EAAE,OAAO,YAAA;IAStD,UAAU,CAAC,IAAI,EAAE,wBAAwB;IAe/C,mBAAmB,IAAI,MAAM,EAAE;IAI/B,sBAAsB,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAiBrH,mBAAmB,CAAC,YAAY,CAAC,EAAE,SAAS,GAAG,kBAAkB;IAwB3D,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;CAC5C"}
@@ -7,10 +7,12 @@ const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters"
7
7
  const umi_signer_wallet_adapters_1 = require("@metaplex-foundation/umi-signer-wallet-adapters");
8
8
  const generated_1 = require("../generated");
9
9
  const utils_1 = require("../utils");
10
- class ReferralStateManager {
11
- constructor(heliusApiKey) {
12
- const [_, umi] = (0, utils_1.getSolanaRpcConnection)(heliusApiKey);
13
- this.umi = umi.use({
10
+ const txHandler_1 = require("./txHandler");
11
+ class ReferralStateManager extends txHandler_1.TxHandler {
12
+ constructor(heliusApiKey, localTest) {
13
+ super(heliusApiKey, localTest);
14
+ this.localTest = localTest;
15
+ this.umi = this.umi.use({
14
16
  install(umi) {
15
17
  umi.programs.add((0, generated_1.createSolautoProgram)(), false);
16
18
  },
@@ -27,6 +29,9 @@ class ReferralStateManager {
27
29
  this.referralState = (0, utils_1.getReferralState)(args.referralAuthority ?? (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(this.signer.publicKey));
28
30
  this.referralStateData = await (0, generated_1.safeFetchReferralState)(this.umi, (0, umi_1.publicKey)(this.referralState));
29
31
  }
32
+ defaultLookupTables() {
33
+ return this.referralStateData?.lookupTable ? [this.referralStateData?.lookupTable.toString()] : [];
34
+ }
30
35
  updateReferralStatesIx(destFeesMint, referredBy, lookupTable) {
31
36
  return (0, generated_1.updateReferralStates)(this.umi, {
32
37
  signer: this.signer,
@@ -59,5 +64,6 @@ class ReferralStateManager {
59
64
  feesDestinationTa,
60
65
  });
61
66
  }
67
+ async resetLiveTxUpdates() { }
62
68
  }
63
69
  exports.ReferralStateManager = ReferralStateManager;
@@ -1,12 +1,13 @@
1
1
  import "rpc-websockets/dist/lib/client";
2
- import { Connection, PublicKey } from "@solana/web3.js";
3
- import { Signer, TransactionBuilder, Umi } from "@metaplex-foundation/umi";
2
+ import { PublicKey } from "@solana/web3.js";
3
+ import { Signer, TransactionBuilder } from "@metaplex-foundation/umi";
4
4
  import { WalletAdapter } from "@metaplex-foundation/umi-signer-wallet-adapters";
5
5
  import { DCASettings, DCASettingsInpArgs, LendingPlatform, PositionState, SolautoActionArgs, SolautoPosition, SolautoRebalanceTypeArgs, SolautoSettingsParameters, SolautoSettingsParametersInpArgs, UpdatePositionDataArgs } from "../generated";
6
6
  import { JupSwapDetails } from "../utils/jupiterUtils";
7
7
  import { FlashLoanDetails } from "../utils/solauto/rebalanceUtils";
8
8
  import { LivePositionUpdates } from "../utils/solauto/generalUtils";
9
9
  import { ReferralStateManager } from "./referralStateManager";
10
+ import { TxHandler } from "./txHandler";
10
11
  export interface SolautoClientArgs {
11
12
  authority?: PublicKey;
12
13
  positionId: number;
@@ -16,11 +17,8 @@ export interface SolautoClientArgs {
16
17
  debtMint?: PublicKey;
17
18
  referredByAuthority?: PublicKey;
18
19
  }
19
- export declare abstract class SolautoClient {
20
+ export declare abstract class SolautoClient extends TxHandler {
20
21
  localTest?: boolean | undefined;
21
- private heliusApiKey;
22
- umi: Umi;
23
- connection: Connection;
24
22
  lendingPlatform: LendingPlatform;
25
23
  authority: PublicKey;
26
24
  signer: Signer;
@@ -46,8 +44,8 @@ export declare abstract class SolautoClient {
46
44
  livePositionUpdates: LivePositionUpdates;
47
45
  constructor(heliusApiKey: string, localTest?: boolean | undefined);
48
46
  initialize(args: SolautoClientArgs, lendingPlatform: LendingPlatform): Promise<void>;
49
- log(...args: any[]): void;
50
- resetLivePositionUpdates(): Promise<void>;
47
+ resetLiveTxUpdates(): Promise<void>;
48
+ abstract protocolAccount(): PublicKey;
51
49
  defaultLookupTables(): string[];
52
50
  lutAccountsToAdd(): PublicKey[];
53
51
  fetchExistingAuthorityLutAccounts(): Promise<PublicKey[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"solautoClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoClient.ts"],"names":[],"mappings":"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"}
@@ -14,14 +14,13 @@ const solautoConstants_1 = require("../constants/solautoConstants");
14
14
  const generalUtils_1 = require("../utils/generalUtils");
15
15
  const generalUtils_2 = require("../utils/solauto/generalUtils");
16
16
  const referralStateManager_1 = require("./referralStateManager");
17
- class SolautoClient {
17
+ const txHandler_1 = require("./txHandler");
18
+ class SolautoClient extends txHandler_1.TxHandler {
18
19
  constructor(heliusApiKey, localTest) {
20
+ super(heliusApiKey, localTest);
19
21
  this.localTest = localTest;
20
22
  this.livePositionUpdates = new generalUtils_2.LivePositionUpdates();
21
- this.heliusApiKey = heliusApiKey;
22
- const [connection, umi] = (0, solanaUtils_1.getSolanaRpcConnection)(this.heliusApiKey);
23
- this.connection = connection;
24
- this.umi = umi.use({
23
+ this.umi = this.umi.use({
25
24
  install(umi) {
26
25
  umi.programs.add((0, generated_1.createSolautoProgram)(), false);
27
26
  },
@@ -91,12 +90,7 @@ class SolautoClient {
91
90
  ? this.solautoPositionData?.position?.dca
92
91
  : undefined);
93
92
  }
94
- log(...args) {
95
- if (this.localTest) {
96
- console.log(...args);
97
- }
98
- }
99
- async resetLivePositionUpdates() {
93
+ async resetLiveTxUpdates() {
100
94
  if (!this.solautoPositionData) {
101
95
  this.solautoPositionData = await (0, generated_1.safeFetchSolautoPosition)(this.umi, (0, umi_1.publicKey)(this.solautoPosition));
102
96
  }
@@ -114,7 +108,7 @@ class SolautoClient {
114
108
  this.livePositionUpdates.reset();
115
109
  }
116
110
  defaultLookupTables() {
117
- return [solautoConstants_1.SOLAUTO_LUT];
111
+ return [solautoConstants_1.SOLAUTO_LUT, ...(this.authorityLutAddress ? [this.authorityLutAddress.toString()] : [])];
118
112
  }
119
113
  lutAccountsToAdd() {
120
114
  return [
@@ -27,6 +27,7 @@ export declare class SolautoMarginfiClient extends SolautoClient {
27
27
  intermediaryMarginfiAccount?: MarginfiAccount;
28
28
  initialize(args: SolautoMarginfiClientArgs): Promise<void>;
29
29
  setIntermediaryMarginfiDetails(): Promise<void>;
30
+ protocolAccount(): PublicKey;
30
31
  defaultLookupTables(): string[];
31
32
  lutAccountsToAdd(): PublicKey[];
32
33
  marginfiAccountInitialize(): TransactionBuilder;
@@ -1 +1 @@
1
- {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAGL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAWnE,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IAkE1C,8BAA8B;IA0CpC,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAU/B,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,WAAW,EAAE,cAAc,EAC3B,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;IA2DrB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAoFlE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAiBlE"}
1
+ {"version":3,"file":"solautoMarginfiClient.d.ts","sourceRoot":"","sources":["../../src/clients/solautoMarginfiClient.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,MAAM,EACN,kBAAkB,EAMnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAA8B,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAM1D,OAAO,EACL,kBAAkB,EAElB,aAAa,EACb,iBAAiB,EACjB,wBAAwB,EACxB,gCAAgC,EAKjC,MAAM,cAAc,CAAC;AAGtB,OAAO,EAEL,eAAe,EAUhB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAWnE,MAAM,WAAW,yBAA0B,SAAQ,iBAAiB;IAClE,eAAe,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;IACrC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B;AAED,qBAAa,qBAAsB,SAAQ,aAAa;IACtD,OAAO,CAAC,WAAW,CAAkB;IAE9B,eAAe,EAAG,SAAS,CAAC;IAE5B,sBAAsB,EAAE,MAAM,CAAa;IAC3C,eAAe,EAAG,SAAS,GAAG,MAAM,CAAC;IACrC,iBAAiB,EAAG,SAAS,CAAC;IAC9B,aAAa,EAAG,SAAS,CAAC;IAE1B,sBAAsB,EAAG,qBAAqB,CAAC;IAC/C,oBAAoB,EAAG,qBAAqB,CAAC;IAE7C,iBAAiB,EAAG,SAAS,CAAC;IAC9B,eAAe,EAAG,SAAS,CAAC;IAG5B,iCAAiC,CAAC,EAAE,MAAM,CAAC;IAC3C,6BAA6B,EAAG,SAAS,CAAC;IAC1C,2BAA2B,CAAC,EAAE,eAAe,CAAC;IAE/C,UAAU,CAAC,IAAI,EAAE,yBAAyB;IAkE1C,8BAA8B;IA0CpC,eAAe,IAAI,SAAS;IAI5B,mBAAmB,IAAI,MAAM,EAAE;IAI/B,gBAAgB,IAAI,SAAS,EAAE;IAU/B,yBAAyB,IAAI,kBAAkB;IAS/C,YAAY,CACV,aAAa,CAAC,EAAE,gCAAgC,EAChD,GAAG,CAAC,EAAE,kBAAkB,GACvB,kBAAkB;IAMrB,OAAO,CAAC,sBAAsB;IA8C9B,OAAO,IAAI,kBAAkB;IAc7B,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,kBAAkB;IAUhE,OAAO,CAAC,6BAA6B;IAmErC,OAAO,CAAC,oCAAoC;IA0D5C,SAAS,CACP,aAAa,EAAE,GAAG,GAAG,GAAG,EACxB,WAAW,EAAE,cAAc,EAC3B,aAAa,EAAE,wBAAwB,EACvC,SAAS,CAAC,EAAE,gBAAgB,EAC5B,2BAA2B,CAAC,EAAE,MAAM,EACpC,WAAW,CAAC,EAAE,MAAM,GACnB,kBAAkB;IA2DrB,WAAW,CACT,gBAAgB,EAAE,gBAAgB,EAClC,uBAAuB,EAAE,SAAS,GACjC,kBAAkB;IA2BrB,UAAU,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,kBAAkB;IAoFlE,iCAAiC,IAAI,kBAAkB;IASjD,qBAAqB,IAAI,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC;CAiBlE"}
@@ -82,6 +82,9 @@ class SolautoMarginfiClient extends solautoClient_1.SolautoClient {
82
82
  this.intermediaryMarginfiAccount =
83
83
  emptyMarginfiAccounts.length > 0 ? emptyMarginfiAccounts[0] : undefined;
84
84
  }
85
+ protocolAccount() {
86
+ return this.marginfiAccountPk;
87
+ }
85
88
  defaultLookupTables() {
86
89
  return [marginfiAccounts_1.MARGINFI_ACCOUNTS_LOOKUP_TABLE, ...super.defaultLookupTables()];
87
90
  }
@@ -0,0 +1,13 @@
1
+ import { Umi } from "@metaplex-foundation/umi";
2
+ import { Connection } from "@solana/web3.js";
3
+ export declare abstract class TxHandler {
4
+ localTest?: boolean | undefined;
5
+ heliusApiKey: string;
6
+ umi: Umi;
7
+ connection: Connection;
8
+ constructor(heliusApiKey: string, localTest?: boolean | undefined);
9
+ log(...args: any[]): void;
10
+ abstract defaultLookupTables(): string[];
11
+ abstract resetLiveTxUpdates(): Promise<void>;
12
+ }
13
+ //# sourceMappingURL=txHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txHandler.d.ts","sourceRoot":"","sources":["../../src/clients/txHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,8BAAsB,SAAS;IAMpB,SAAS,CAAC,EAAE,OAAO;IALrB,YAAY,EAAG,MAAM,CAAC;IACtB,GAAG,EAAG,GAAG,CAAC;IACV,UAAU,EAAG,UAAU,CAAC;gBAEnB,YAAY,EAAE,MAAM,EACvB,SAAS,CAAC,EAAE,OAAO,YAAA;IAO5B,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAMzB,QAAQ,CAAC,mBAAmB,IAAI,MAAM,EAAE;IAExC,QAAQ,CAAC,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC;CAC7C"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TxHandler = void 0;
4
+ const utils_1 = require("../utils");
5
+ class TxHandler {
6
+ constructor(heliusApiKey, localTest) {
7
+ this.localTest = localTest;
8
+ this.heliusApiKey = heliusApiKey;
9
+ const [connection, umi] = (0, utils_1.getSolanaRpcConnection)(this.heliusApiKey);
10
+ this.connection = connection;
11
+ this.umi = umi;
12
+ }
13
+ log(...args) {
14
+ if (this.localTest) {
15
+ console.log(...args);
16
+ }
17
+ }
18
+ }
19
+ exports.TxHandler = TxHandler;
@@ -1 +1 @@
1
- {"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EASd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuMzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA8G7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA4BnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CACN;IACA,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACC,SAAS,CACZ,CA2HA;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,eAAe,GAC5B,OAAO,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CA8BzC"}
1
+ {"version":3,"file":"transactionUtils.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,kBAAkB,EAClB,GAAG,EAGJ,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAGL,OAAO,IAAI,eAAe,EAC3B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,aAAa,EASd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAuMzD,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,EACtB,sBAAsB,EAAE,MAAM,EAAE,GAC/B,OAAO,CAAC,kBAAkB,CAAC,CA8G7B;AAkLD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,aAAa,EACrB,EAAE,EAAE,kBAAkB,GACrB,OAAO,CAAC,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,CA4BnD;AAED,wBAAsB,gCAAgC,CACpD,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,EACpC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CACN;IACA,EAAE,EAAE,kBAAkB,CAAC;IACvB,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC,GACC,SAAS,CACZ,CAyHA;AAED,wBAAsB,gCAAgC,CACpD,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,eAAe,GAC5B,OAAO,CAAC,CAAC,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,CA8BzC"}
@@ -323,9 +323,7 @@ async function buildSolautoRebalanceTransaction(client, targetLiqUtilizationRate
323
323
  client.solautoPositionState = await client.getFreshPositionState();
324
324
  if (client.solautoPositionState?.supply.amountUsed.baseUnit === BigInt(0) ||
325
325
  (targetLiqUtilizationRateBps === undefined &&
326
- !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.livePositionUpdates.settings ??
327
- client.solautoPositionData?.position.settingParams, client.livePositionUpdates.activeDca ??
328
- client.solautoPositionData?.position.dca, (0, generalUtils_1.currentUnixSeconds)()))) {
326
+ !(0, generalUtils_2.eligibleForRebalance)(client.solautoPositionState, client.solautoPositionSettings(), client.solautoPositionActiveDca(), (0, generalUtils_1.currentUnixSeconds)()))) {
329
327
  client.log("Not eligible for a rebalance");
330
328
  return undefined;
331
329
  }
@@ -1,12 +1,13 @@
1
- import { AddressLookupTableInput, TransactionBuilder } from "@metaplex-foundation/umi";
1
+ import { AddressLookupTableInput, TransactionBuilder, Umi } from "@metaplex-foundation/umi";
2
2
  import { SolautoClient } from "../clients/solautoClient";
3
3
  import { ErrorsToThrow } from "../utils/generalUtils";
4
4
  import { PriorityFeeSetting } from "../types";
5
+ import { TxHandler } from "../clients";
5
6
  declare class LookupTables {
6
- private client;
7
7
  defaultLuts: string[];
8
+ private umi;
8
9
  cache: AddressLookupTableInput[];
9
- constructor(client: SolautoClient);
10
+ constructor(defaultLuts: string[], umi: Umi);
10
11
  getLutInputs(additionalAddresses: string[]): Promise<AddressLookupTableInput[]>;
11
12
  }
12
13
  export declare class TransactionItem {
@@ -26,10 +27,10 @@ export declare class TransactionItem {
26
27
  uniqueAccounts(): string[];
27
28
  }
28
29
  declare class TransactionSet {
29
- private client;
30
+ private txHandler;
30
31
  lookupTables: LookupTables;
31
32
  items: TransactionItem[];
32
- constructor(client: SolautoClient, lookupTables: LookupTables, items?: TransactionItem[]);
33
+ constructor(txHandler: TxHandler, lookupTables: LookupTables, items?: TransactionItem[]);
33
34
  fitsWith(item: TransactionItem): Promise<boolean>;
34
35
  add(...items: TransactionItem[]): void;
35
36
  refetchAll(attemptNum: number): Promise<void>;
@@ -49,19 +50,19 @@ export type TransactionManagerStatuses = {
49
50
  txSig?: string;
50
51
  }[];
51
52
  export declare class TransactionsManager {
52
- private client;
53
- private items;
53
+ private txHandler;
54
54
  private statusCallback?;
55
55
  private simulateOnly?;
56
56
  private mustBeAtomic?;
57
57
  private errorsToThrow?;
58
58
  private statuses;
59
59
  private lookupTables;
60
- constructor(client: SolautoClient, items: TransactionItem[], statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, simulateOnly?: boolean | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined);
60
+ constructor(txHandler: TxHandler, statusCallback?: ((statuses: TransactionManagerStatuses) => void) | undefined, simulateOnly?: boolean | undefined, mustBeAtomic?: boolean | undefined, errorsToThrow?: ErrorsToThrow | undefined);
61
61
  private assembleTransactionSets;
62
62
  updateStatus(name: string, status: TransactionStatus, txSig?: string): void;
63
63
  debugAccounts(itemSet: TransactionSet, tx: TransactionBuilder): Promise<void>;
64
- send(prioritySetting?: PriorityFeeSetting): Promise<void>;
64
+ sendWithClient(items: TransactionItem[], client: SolautoClient, prioritySetting?: PriorityFeeSetting): Promise<void>;
65
+ send(items: TransactionItem[], prioritySetting?: PriorityFeeSetting, initialized?: boolean): Promise<void>;
65
66
  }
66
67
  export {};
67
68
  //# sourceMappingURL=transactionsManager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transactionsManager.d.ts","sourceRoot":"","sources":["../../src/transactions/transactionsManager.ts"],"names":[],"mappings":"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"}
@@ -11,22 +11,20 @@ const generalUtils_1 = require("../utils/generalUtils");
11
11
  const transactionUtils_1 = require("./transactionUtils");
12
12
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
13
13
  class LookupTables {
14
- constructor(client) {
15
- this.client = client;
16
- this.defaultLuts = [];
14
+ constructor(defaultLuts, umi) {
15
+ this.defaultLuts = defaultLuts;
16
+ this.umi = umi;
17
17
  this.cache = [];
18
- this.defaultLuts = [...client.defaultLookupTables()];
19
18
  }
20
19
  async getLutInputs(additionalAddresses) {
21
20
  const addresses = [
22
21
  ...this.defaultLuts,
23
- this.client.authorityLutAddress.toString(),
24
22
  ...additionalAddresses,
25
23
  ];
26
24
  const currentCacheAddresses = this.cache.map((x) => x.publicKey.toString());
27
25
  const missingAddresses = addresses.filter((x) => !currentCacheAddresses.includes(x));
28
26
  if (missingAddresses) {
29
- const additionalInputs = await (0, solanaUtils_1.getAdressLookupInputs)(this.client.umi, missingAddresses);
27
+ const additionalInputs = await (0, solanaUtils_1.getAdressLookupInputs)(this.umi, missingAddresses);
30
28
  this.cache.push(...additionalInputs);
31
29
  }
32
30
  return this.cache;
@@ -56,8 +54,8 @@ class TransactionItem {
56
54
  }
57
55
  exports.TransactionItem = TransactionItem;
58
56
  class TransactionSet {
59
- constructor(client, lookupTables, items = []) {
60
- this.client = client;
57
+ constructor(txHandler, lookupTables, items = []) {
58
+ this.txHandler = txHandler;
61
59
  this.lookupTables = lookupTables;
62
60
  this.items = items;
63
61
  }
@@ -78,13 +76,13 @@ class TransactionSet {
78
76
  ...this.lutAddresses(),
79
77
  ...item.lookupTableAddresses,
80
78
  ]))
81
- .fitsInOneTransaction(this.client.umi);
79
+ .fitsInOneTransaction(this.txHandler.umi);
82
80
  }
83
81
  add(...items) {
84
82
  this.items.push(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
85
83
  }
86
84
  async refetchAll(attemptNum) {
87
- await this.client.resetLivePositionUpdates();
85
+ await this.txHandler.resetLiveTxUpdates();
88
86
  for (const item of this.items) {
89
87
  await item.refetch(attemptNum);
90
88
  }
@@ -120,19 +118,18 @@ var TransactionStatus;
120
118
  TransactionStatus["Successful"] = "Successful";
121
119
  })(TransactionStatus || (exports.TransactionStatus = TransactionStatus = {}));
122
120
  class TransactionsManager {
123
- constructor(client, items, statusCallback, simulateOnly, mustBeAtomic, errorsToThrow) {
124
- this.client = client;
125
- this.items = items;
121
+ constructor(txHandler, statusCallback, simulateOnly, mustBeAtomic, errorsToThrow) {
122
+ this.txHandler = txHandler;
126
123
  this.statusCallback = statusCallback;
127
124
  this.simulateOnly = simulateOnly;
128
125
  this.mustBeAtomic = mustBeAtomic;
129
126
  this.errorsToThrow = errorsToThrow;
130
127
  this.statuses = [];
131
- this.lookupTables = new LookupTables(client);
128
+ this.lookupTables = new LookupTables(this.txHandler.defaultLookupTables(), this.txHandler.umi);
132
129
  }
133
130
  async assembleTransactionSets(items) {
134
131
  let transactionSets = [];
135
- this.client.log(`Reassembling ${items.length} items`);
132
+ this.txHandler.log(`Reassembling ${items.length} items`);
136
133
  for (let i = 0; i < items.length;) {
137
134
  let item = items[i];
138
135
  i++;
@@ -140,11 +137,11 @@ class TransactionsManager {
140
137
  continue;
141
138
  }
142
139
  const transaction = item.tx.setAddressLookupTables(await this.lookupTables.getLutInputs(item.lookupTableAddresses));
143
- if (!transaction.fitsInOneTransaction(this.client.umi)) {
144
- throw new Error(`Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`);
140
+ if (!transaction.fitsInOneTransaction(this.txHandler.umi)) {
141
+ throw new Error(`Transaction exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`);
145
142
  }
146
143
  else {
147
- let newSet = new TransactionSet(this.client, this.lookupTables, [item]);
144
+ let newSet = new TransactionSet(this.txHandler, this.lookupTables, [item]);
148
145
  for (let j = i; j < items.length; j++) {
149
146
  if (await newSet.fitsWith(items[j])) {
150
147
  newSet.add(items[j]);
@@ -173,7 +170,7 @@ class TransactionsManager {
173
170
  this.statuses.push({ name, status, txSig });
174
171
  }
175
172
  }
176
- this.client.log(`${name} is ${status.toString().toLowerCase()}`);
173
+ this.txHandler.log(`${name} is ${status.toString().toLowerCase()}`);
177
174
  this.statusCallback?.(this.statuses);
178
175
  }
179
176
  // TODO remove me
@@ -183,28 +180,29 @@ class TransactionsManager {
183
180
  for (const ix of tx.getInstructions()) {
184
181
  const ixAccounts = ix.keys.map((x) => x.pubkey);
185
182
  const accountsNotInLut = ixAccounts.filter((x) => !lutAccounts.includes(x));
186
- this.client.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
183
+ this.txHandler.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
187
184
  if (accountsNotInLut.length > 0) {
188
- this.client.log(`${accountsNotInLut.length} accounts not in LUT:`);
185
+ this.txHandler.log(`${accountsNotInLut.length} accounts not in LUT:`);
189
186
  for (const key of accountsNotInLut) {
190
- this.client.log(key.toString());
187
+ this.txHandler.log(key.toString());
191
188
  }
192
189
  }
193
190
  }
194
191
  }
195
- async send(prioritySetting) {
196
- const updateLookupTable = await this.client.updateLookupTable();
192
+ async sendWithClient(items, client, prioritySetting) {
193
+ const updateLookupTable = await client.updateLookupTable();
197
194
  if (updateLookupTable &&
198
195
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
199
196
  updateLookupTable?.needsToBeIsolated) {
200
197
  this.updateStatus("update lookup table", TransactionStatus.Processing);
201
- await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, updateLookupTable.updateLutTx, this.simulateOnly, attemptNum), 3, 150, this.errorsToThrow);
198
+ await (0, generalUtils_1.retryWithExponentialBackoff)(async (attemptNum) => await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, updateLookupTable.updateLutTx, this.simulateOnly, attemptNum), 3, 150, this.errorsToThrow);
202
199
  this.updateStatus("update lookup table", TransactionStatus.Successful);
203
200
  }
204
- for (const item of this.items) {
201
+ this.lookupTables.defaultLuts = client.defaultLookupTables();
202
+ for (const item of items) {
205
203
  await item.initialize();
206
204
  }
207
- const [choresBefore, choresAfter] = await (0, transactionUtils_1.getTransactionChores)(this.client, (0, umi_1.transactionBuilder)().add(this.items
205
+ const [choresBefore, choresAfter] = await (0, transactionUtils_1.getTransactionChores)(client, (0, umi_1.transactionBuilder)().add(items
208
206
  .filter((x) => x.tx && x.tx.getInstructions().length > 0)
209
207
  .map((x) => x.tx)));
210
208
  if (updateLookupTable && !updateLookupTable.needsToBeIsolated) {
@@ -213,16 +211,27 @@ class TransactionsManager {
213
211
  if (choresBefore.getInstructions().length > 0) {
214
212
  const chore = new TransactionItem(async () => ({ tx: choresBefore }), "create account(s)");
215
213
  await chore.initialize();
216
- this.items.unshift(chore);
217
- this.client.log("Chores before: ", choresBefore.getInstructions().length);
214
+ items.unshift(chore);
215
+ this.txHandler.log("Chores before: ", choresBefore.getInstructions().length);
218
216
  }
219
217
  if (choresAfter.getInstructions().length > 0) {
220
218
  const chore = new TransactionItem(async () => ({ tx: choresAfter }));
221
219
  await chore.initialize();
222
- this.items.push(chore);
223
- this.client.log("Chores after: ", choresAfter.getInstructions().length);
220
+ items.push(chore);
221
+ this.txHandler.log("Chores after: ", choresAfter.getInstructions().length);
224
222
  }
225
- const itemSets = await this.assembleTransactionSets(this.items);
223
+ await this.send(items, prioritySetting, true);
224
+ if (!this.simulateOnly) {
225
+ await client.resetLiveTxUpdates();
226
+ }
227
+ }
228
+ async send(items, prioritySetting, initialized) {
229
+ if (!initialized) {
230
+ for (const item of items) {
231
+ await item.initialize();
232
+ }
233
+ }
234
+ const itemSets = await this.assembleTransactionSets(items);
226
235
  const statusesStartIdx = this.statuses.length;
227
236
  for (const itemSet of itemSets) {
228
237
  this.updateStatus(itemSet.name(), TransactionStatus.Queued);
@@ -258,7 +267,7 @@ class TransactionsManager {
258
267
  name: x.name(),
259
268
  status: TransactionStatus.Queued,
260
269
  })));
261
- this.client.log(this.statuses);
270
+ this.txHandler.log(this.statuses);
262
271
  itemSets.splice(i + 1, itemSets.length - i - 1, ...newItemSets.slice(1));
263
272
  }
264
273
  return newItemSets.length > 0 ? newItemSets[0] : undefined;
@@ -278,18 +287,15 @@ class TransactionsManager {
278
287
  }
279
288
  else {
280
289
  this.updateStatus(itemSet.name(), TransactionStatus.Processing);
281
- if (this.client.localTest) {
290
+ if (this.txHandler.localTest) {
282
291
  await this.debugAccounts(itemSet, tx);
283
292
  }
284
- const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.client.umi, this.client.connection, tx, this.simulateOnly, attemptNum, prioritySetting);
293
+ const txSig = await (0, solanaUtils_1.sendSingleOptimizedTransaction)(this.txHandler.umi, this.txHandler.connection, tx, this.simulateOnly, attemptNum, prioritySetting);
285
294
  this.updateStatus(itemSet.name(), TransactionStatus.Successful, txSig ? bs58_1.default.encode(txSig) : undefined);
286
295
  }
287
296
  }, 4, 150, this.errorsToThrow);
288
297
  }
289
298
  }
290
- if (!this.simulateOnly) {
291
- await this.client.resetLivePositionUpdates();
292
- }
293
299
  }
294
300
  }
295
301
  exports.TransactionsManager = TransactionsManager;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.82",
3
+ "version": "1.0.84",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "description": "Typescript SDK for the Solauto program on the Solana blockchain",
@@ -1,3 +1,4 @@
1
1
  export * from './solautoMarginfiClient';
2
2
  export * from './solautoClient';
3
- export * from './referralStateManager';
3
+ export * from './referralStateManager';
4
+ export * from './txHandler';
@@ -5,6 +5,7 @@ import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
5
5
  import { WalletAdapter, walletAdapterIdentity } from "@metaplex-foundation/umi-signer-wallet-adapters";
6
6
  import { claimReferralFees, createSolautoProgram, ReferralState, safeFetchReferralState, updateReferralStates } from "../generated";
7
7
  import { getReferralState, getSolanaRpcConnection, getTokenAccount } from "../utils";
8
+ import { TxHandler } from "./txHandler";
8
9
 
9
10
  interface ReferralStateManagerArgs {
10
11
  referralAuthority?: PublicKey;
@@ -12,7 +13,7 @@ interface ReferralStateManagerArgs {
12
13
  wallet?: WalletAdapter;
13
14
  }
14
15
 
15
- export class ReferralStateManager {
16
+ export class ReferralStateManager extends TxHandler {
16
17
  public umi!: Umi;
17
18
  public signer!: Signer;
18
19
 
@@ -20,9 +21,9 @@ export class ReferralStateManager {
20
21
  public referralState!: PublicKey;
21
22
  public referralStateData!: ReferralState | null;
22
23
 
23
- constructor(heliusApiKey: string) {
24
- const [_, umi] = getSolanaRpcConnection(heliusApiKey);
25
- this.umi = umi.use({
24
+ constructor(heliusApiKey: string, public localTest?: boolean) {
25
+ super(heliusApiKey, localTest)
26
+ this.umi = this.umi.use({
26
27
  install(umi) {
27
28
  umi.programs.add(createSolautoProgram(), false);
28
29
  },
@@ -44,6 +45,10 @@ export class ReferralStateManager {
44
45
  this.referralStateData = await safeFetchReferralState(this.umi, publicKey(this.referralState));
45
46
  }
46
47
 
48
+ defaultLookupTables(): string[] {
49
+ return this.referralStateData?.lookupTable ? [this.referralStateData?.lookupTable.toString()] : [];
50
+ }
51
+
47
52
  updateReferralStatesIx(destFeesMint?: PublicKey, referredBy?: PublicKey, lookupTable?: PublicKey): TransactionBuilder {
48
53
  return updateReferralStates(this.umi, {
49
54
  signer: this.signer,
@@ -85,4 +90,5 @@ export class ReferralStateManager {
85
90
  });
86
91
  }
87
92
 
93
+ async resetLiveTxUpdates(): Promise<void> { }
88
94
  }
@@ -52,7 +52,6 @@ import {
52
52
  splTokenTransferUmiIx,
53
53
  } from "../utils/solanaUtils";
54
54
  import { FlashLoanDetails } from "../utils/solauto/rebalanceUtils";
55
- import { NATIVE_MINT } from "@solana/spl-token";
56
55
  import {
57
56
  MIN_POSITION_STATE_FRESHNESS_SECS,
58
57
  SOLAUTO_LUT,
@@ -60,6 +59,7 @@ import {
60
59
  import { currentUnixSeconds } from "../utils/generalUtils";
61
60
  import { LivePositionUpdates } from "../utils/solauto/generalUtils";
62
61
  import { ReferralStateManager } from "./referralStateManager";
62
+ import { TxHandler } from "./txHandler";
63
63
 
64
64
  export interface SolautoClientArgs {
65
65
  authority?: PublicKey;
@@ -73,10 +73,7 @@ export interface SolautoClientArgs {
73
73
  referredByAuthority?: PublicKey;
74
74
  }
75
75
 
76
- export abstract class SolautoClient {
77
- private heliusApiKey!: string;
78
- public umi!: Umi;
79
- public connection!: Connection;
76
+ export abstract class SolautoClient extends TxHandler {
80
77
  public lendingPlatform!: LendingPlatform;
81
78
 
82
79
  public authority!: PublicKey;
@@ -114,10 +111,9 @@ export abstract class SolautoClient {
114
111
  heliusApiKey: string,
115
112
  public localTest?: boolean
116
113
  ) {
117
- this.heliusApiKey = heliusApiKey;
118
- const [connection, umi] = getSolanaRpcConnection(this.heliusApiKey);
119
- this.connection = connection;
120
- this.umi = umi.use({
114
+ super(heliusApiKey, localTest);
115
+
116
+ this.umi = this.umi.use({
121
117
  install(umi) {
122
118
  umi.programs.add(createSolautoProgram(), false);
123
119
  },
@@ -231,13 +227,7 @@ export abstract class SolautoClient {
231
227
  );
232
228
  }
233
229
 
234
- log(...args: any[]): void {
235
- if (this.localTest) {
236
- console.log(...args);
237
- }
238
- }
239
-
240
- async resetLivePositionUpdates() {
230
+ async resetLiveTxUpdates() {
241
231
  if (!this.solautoPositionData) {
242
232
  this.solautoPositionData = await safeFetchSolautoPosition(
243
233
  this.umi,
@@ -257,8 +247,10 @@ export abstract class SolautoClient {
257
247
  this.livePositionUpdates.reset();
258
248
  }
259
249
 
250
+ abstract protocolAccount(): PublicKey;
251
+
260
252
  defaultLookupTables(): string[] {
261
- return [SOLAUTO_LUT];
253
+ return [SOLAUTO_LUT, ...(this.authorityLutAddress ? [this.authorityLutAddress.toString()] : [])];
262
254
  }
263
255
 
264
256
  lutAccountsToAdd(): PublicKey[] {
@@ -34,7 +34,6 @@ import {
34
34
  import { getMarginfiAccountPDA, getTokenAccount } from "../utils/accountUtils";
35
35
  import { generateRandomU64 } from "../utils/generalUtils";
36
36
  import {
37
- Bank,
38
37
  MARGINFI_PROGRAM_ID,
39
38
  MarginfiAccount,
40
39
  lendingAccountBorrow,
@@ -194,6 +193,10 @@ export class SolautoMarginfiClient extends SolautoClient {
194
193
  emptyMarginfiAccounts.length > 0 ? emptyMarginfiAccounts[0] : undefined;
195
194
  }
196
195
 
196
+ protocolAccount(): PublicKey {
197
+ return this.marginfiAccountPk;
198
+ }
199
+
197
200
  defaultLookupTables(): string[] {
198
201
  return [MARGINFI_ACCOUNTS_LOOKUP_TABLE, ...super.defaultLookupTables()];
199
202
  }
@@ -0,0 +1,28 @@
1
+ import { Umi } from "@metaplex-foundation/umi";
2
+ import { Connection } from "@solana/web3.js";
3
+ import { getSolanaRpcConnection } from "../utils";
4
+
5
+
6
+ export abstract class TxHandler {
7
+ public heliusApiKey!: string;
8
+ public umi!: Umi;
9
+ public connection!: Connection;
10
+
11
+ constructor(heliusApiKey: string,
12
+ public localTest?: boolean) {
13
+ this.heliusApiKey = heliusApiKey;
14
+ const [connection, umi] = getSolanaRpcConnection(this.heliusApiKey);
15
+ this.connection = connection;
16
+ this.umi = umi;
17
+ }
18
+
19
+ log(...args: any[]): void {
20
+ if (this.localTest) {
21
+ console.log(...args);
22
+ }
23
+ }
24
+
25
+ abstract defaultLookupTables(): string[];
26
+
27
+ abstract resetLiveTxUpdates(): Promise<void>;
28
+ }
@@ -565,10 +565,8 @@ export async function buildSolautoRebalanceTransaction(
565
565
  (targetLiqUtilizationRateBps === undefined &&
566
566
  !eligibleForRebalance(
567
567
  client.solautoPositionState!,
568
- client.livePositionUpdates.settings ??
569
- client.solautoPositionData?.position.settingParams!,
570
- client.livePositionUpdates.activeDca ??
571
- client.solautoPositionData?.position.dca!,
568
+ client.solautoPositionSettings()!,
569
+ client.solautoPositionActiveDca()!,
572
570
  currentUnixSeconds()
573
571
  ))
574
572
  ) {
@@ -3,6 +3,7 @@ import {
3
3
  AddressLookupTableInput,
4
4
  transactionBuilder,
5
5
  TransactionBuilder,
6
+ Umi,
6
7
  } from "@metaplex-foundation/umi";
7
8
  import { SolautoClient } from "../clients/solautoClient";
8
9
  import {
@@ -15,14 +16,14 @@ import {
15
16
  } from "../utils/generalUtils";
16
17
  import { getTransactionChores } from "./transactionUtils";
17
18
  import { PriorityFeeSetting } from "../types";
19
+ import { Connection, PublicKey } from "@solana/web3.js";
20
+ import { TxHandler } from "../clients";
18
21
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
19
22
 
20
23
  class LookupTables {
21
- defaultLuts: string[] = [];
22
24
  cache: AddressLookupTableInput[] = [];
23
25
 
24
- constructor(private client: SolautoClient) {
25
- this.defaultLuts = [...client.defaultLookupTables()];
26
+ constructor(public defaultLuts: string[], private umi: Umi) {
26
27
  }
27
28
 
28
29
  async getLutInputs(
@@ -30,7 +31,6 @@ class LookupTables {
30
31
  ): Promise<AddressLookupTableInput[]> {
31
32
  const addresses = [
32
33
  ...this.defaultLuts,
33
- this.client.authorityLutAddress!.toString(),
34
34
  ...additionalAddresses,
35
35
  ];
36
36
  const currentCacheAddresses = this.cache.map((x) => x.publicKey.toString());
@@ -40,7 +40,7 @@ class LookupTables {
40
40
  );
41
41
  if (missingAddresses) {
42
42
  const additionalInputs = await getAdressLookupInputs(
43
- this.client.umi,
43
+ this.umi,
44
44
  missingAddresses
45
45
  );
46
46
  this.cache.push(...additionalInputs);
@@ -61,7 +61,7 @@ export class TransactionItem {
61
61
  { tx: TransactionBuilder; lookupTableAddresses?: string[] } | undefined
62
62
  >,
63
63
  public name?: string
64
- ) {}
64
+ ) { }
65
65
 
66
66
  async initialize() {
67
67
  await this.refetch(0);
@@ -89,10 +89,10 @@ export class TransactionItem {
89
89
 
90
90
  class TransactionSet {
91
91
  constructor(
92
- private client: SolautoClient,
92
+ private txHandler: TxHandler,
93
93
  public lookupTables: LookupTables,
94
94
  public items: TransactionItem[] = []
95
- ) {}
95
+ ) { }
96
96
 
97
97
  async fitsWith(item: TransactionItem): Promise<boolean> {
98
98
  if (!item.tx) {
@@ -117,7 +117,7 @@ class TransactionSet {
117
117
  ...item.lookupTableAddresses,
118
118
  ])
119
119
  )
120
- .fitsInOneTransaction(this.client.umi);
120
+ .fitsInOneTransaction(this.txHandler.umi);
121
121
  }
122
122
 
123
123
  add(...items: TransactionItem[]) {
@@ -127,7 +127,7 @@ class TransactionSet {
127
127
  }
128
128
 
129
129
  async refetchAll(attemptNum: number) {
130
- await this.client.resetLivePositionUpdates();
130
+ await this.txHandler.resetLiveTxUpdates();
131
131
  for (const item of this.items) {
132
132
  await item.refetch(attemptNum);
133
133
  }
@@ -183,23 +183,22 @@ export class TransactionsManager {
183
183
  private lookupTables: LookupTables;
184
184
 
185
185
  constructor(
186
- private client: SolautoClient,
187
- private items: TransactionItem[],
186
+ private txHandler: TxHandler,
188
187
  private statusCallback?: (statuses: TransactionManagerStatuses) => void,
189
188
  private simulateOnly?: boolean,
190
189
  private mustBeAtomic?: boolean,
191
190
  private errorsToThrow?: ErrorsToThrow
192
191
  ) {
193
- this.lookupTables = new LookupTables(client);
192
+ this.lookupTables = new LookupTables(this.txHandler.defaultLookupTables(), this.txHandler.umi);
194
193
  }
195
194
 
196
195
  private async assembleTransactionSets(
197
196
  items: TransactionItem[]
198
197
  ): Promise<TransactionSet[]> {
199
198
  let transactionSets: TransactionSet[] = [];
200
- this.client.log(`Reassembling ${items.length} items`);
199
+ this.txHandler.log(`Reassembling ${items.length} items`);
201
200
 
202
- for (let i = 0; i < items.length; ) {
201
+ for (let i = 0; i < items.length;) {
203
202
  let item = items[i];
204
203
  i++;
205
204
 
@@ -210,12 +209,12 @@ export class TransactionsManager {
210
209
  const transaction = item.tx.setAddressLookupTables(
211
210
  await this.lookupTables.getLutInputs(item.lookupTableAddresses)
212
211
  );
213
- if (!transaction.fitsInOneTransaction(this.client.umi)) {
212
+ if (!transaction.fitsInOneTransaction(this.txHandler.umi)) {
214
213
  throw new Error(
215
- `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`
214
+ `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.txHandler.umi)})`
216
215
  );
217
216
  } else {
218
- let newSet = new TransactionSet(this.client, this.lookupTables, [item]);
217
+ let newSet = new TransactionSet(this.txHandler, this.lookupTables, [item]);
219
218
  for (let j = i; j < items.length; j++) {
220
219
  if (await newSet.fitsWith(items[j])) {
221
220
  newSet.add(items[j]);
@@ -243,7 +242,7 @@ export class TransactionsManager {
243
242
  this.statuses.push({ name, status, txSig });
244
243
  }
245
244
  }
246
- this.client.log(`${name} is ${status.toString().toLowerCase()}`);
245
+ this.txHandler.log(`${name} is ${status.toString().toLowerCase()}`);
247
246
  this.statusCallback?.(this.statuses);
248
247
  }
249
248
 
@@ -256,18 +255,18 @@ export class TransactionsManager {
256
255
  const accountsNotInLut = ixAccounts.filter(
257
256
  (x) => !lutAccounts.includes(x)
258
257
  );
259
- this.client.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
258
+ this.txHandler.log(`Program ${ix.programId}, data len: ${ix.data.length}, LUT accounts data: ${ix.keys.filter((x) => lutAccounts.includes(x.pubkey)).length * 3}`);
260
259
  if (accountsNotInLut.length > 0) {
261
- this.client.log(`${accountsNotInLut.length} accounts not in LUT:`);
260
+ this.txHandler.log(`${accountsNotInLut.length} accounts not in LUT:`);
262
261
  for (const key of accountsNotInLut) {
263
- this.client.log(key.toString());
262
+ this.txHandler.log(key.toString());
264
263
  }
265
264
  }
266
265
  }
267
266
  }
268
267
 
269
- async send(prioritySetting?: PriorityFeeSetting) {
270
- const updateLookupTable = await this.client.updateLookupTable();
268
+ async sendWithClient(items: TransactionItem[], client: SolautoClient, prioritySetting?: PriorityFeeSetting) {
269
+ const updateLookupTable = await client.updateLookupTable();
271
270
  if (
272
271
  updateLookupTable &&
273
272
  updateLookupTable.updateLutTx.getInstructions().length > 0 &&
@@ -277,8 +276,8 @@ export class TransactionsManager {
277
276
  await retryWithExponentialBackoff(
278
277
  async (attemptNum) =>
279
278
  await sendSingleOptimizedTransaction(
280
- this.client.umi,
281
- this.client.connection,
279
+ this.txHandler.umi,
280
+ this.txHandler.connection,
282
281
  updateLookupTable.updateLutTx,
283
282
  this.simulateOnly,
284
283
  attemptNum
@@ -290,14 +289,16 @@ export class TransactionsManager {
290
289
  this.updateStatus("update lookup table", TransactionStatus.Successful);
291
290
  }
292
291
 
293
- for (const item of this.items) {
292
+ this.lookupTables.defaultLuts = client.defaultLookupTables();
293
+
294
+ for (const item of items) {
294
295
  await item.initialize();
295
296
  }
296
297
 
297
298
  const [choresBefore, choresAfter] = await getTransactionChores(
298
- this.client,
299
+ client,
299
300
  transactionBuilder().add(
300
- this.items
301
+ items
301
302
  .filter((x) => x.tx && x.tx.getInstructions().length > 0)
302
303
  .map((x) => x.tx!)
303
304
  )
@@ -311,17 +312,31 @@ export class TransactionsManager {
311
312
  "create account(s)"
312
313
  );
313
314
  await chore.initialize();
314
- this.items.unshift(chore);
315
- this.client.log("Chores before: ", choresBefore.getInstructions().length);
315
+ items.unshift(chore);
316
+ this.txHandler.log("Chores before: ", choresBefore.getInstructions().length);
316
317
  }
317
318
  if (choresAfter.getInstructions().length > 0) {
318
319
  const chore = new TransactionItem(async () => ({ tx: choresAfter }));
319
320
  await chore.initialize();
320
- this.items.push(chore);
321
- this.client.log("Chores after: ", choresAfter.getInstructions().length);
321
+ items.push(chore);
322
+ this.txHandler.log("Chores after: ", choresAfter.getInstructions().length);
322
323
  }
323
324
 
324
- const itemSets = await this.assembleTransactionSets(this.items);
325
+ await this.send(items, prioritySetting, true);
326
+
327
+ if (!this.simulateOnly) {
328
+ await client.resetLiveTxUpdates();
329
+ }
330
+ }
331
+
332
+ async send(items: TransactionItem[], prioritySetting?: PriorityFeeSetting, initialized?: boolean) {
333
+ if (!initialized) {
334
+ for (const item of items) {
335
+ await item.initialize();
336
+ }
337
+ }
338
+
339
+ const itemSets = await this.assembleTransactionSets(items);
325
340
  const statusesStartIdx = this.statuses.length;
326
341
  for (const itemSet of itemSets) {
327
342
  this.updateStatus(itemSet.name(), TransactionStatus.Queued);
@@ -366,7 +381,7 @@ export class TransactionsManager {
366
381
  status: TransactionStatus.Queued,
367
382
  }))
368
383
  );
369
- this.client.log(this.statuses);
384
+ this.txHandler.log(this.statuses);
370
385
  itemSets.splice(
371
386
  i + 1,
372
387
  itemSets.length - i - 1,
@@ -393,13 +408,13 @@ export class TransactionsManager {
393
408
  } else {
394
409
  this.updateStatus(itemSet.name(), TransactionStatus.Processing);
395
410
 
396
- if (this.client.localTest) {
411
+ if (this.txHandler.localTest) {
397
412
  await this.debugAccounts(itemSet, tx);
398
413
  }
399
414
 
400
415
  const txSig = await sendSingleOptimizedTransaction(
401
- this.client.umi,
402
- this.client.connection,
416
+ this.txHandler.umi,
417
+ this.txHandler.connection,
403
418
  tx,
404
419
  this.simulateOnly,
405
420
  attemptNum,
@@ -418,9 +433,5 @@ export class TransactionsManager {
418
433
  );
419
434
  }
420
435
  }
421
-
422
- if (!this.simulateOnly) {
423
- await this.client.resetLivePositionUpdates();
424
- }
425
436
  }
426
437
  }
@@ -66,19 +66,19 @@ describe("Solauto Marginfi tests", async () => {
66
66
  // }, "open position")
67
67
  // );
68
68
 
69
- // const initialSupplyUsd = 150;
70
- // transactionItems.push(
71
- // new TransactionItem(async () => {
72
- // const [supplyPrice] = await getTokenPrices([supply]);
73
- // return {
74
- // tx: client.protocolInteraction(
75
- // solautoAction("Deposit", [
76
- // toBaseUnit(initialSupplyUsd / supplyPrice, supplyDecimals),
77
- // ])
78
- // ),
79
- // };
80
- // }, "deposit")
81
- // );
69
+ // const initialSupplyUsd = 150;
70
+ // transactionItems.push(
71
+ // new TransactionItem(async () => {
72
+ // const [supplyPrice] = await getTokenPrices([supply]);
73
+ // return {
74
+ // tx: client.protocolInteraction(
75
+ // solautoAction("Deposit", [
76
+ // toBaseUnit(initialSupplyUsd / supplyPrice, supplyDecimals),
77
+ // ])
78
+ // ),
79
+ // };
80
+ // }, "deposit")
81
+ // );
82
82
  // }
83
83
 
84
84
  // const maxLtvBps = client.solautoPositionState!.maxLtvBps;
@@ -118,7 +118,7 @@ describe("Solauto Marginfi tests", async () => {
118
118
  // };
119
119
  // }, "deposit")
120
120
  // );
121
-
121
+
122
122
  transactionItems.push(
123
123
  new TransactionItem(
124
124
  async (attemptNum) =>
@@ -156,10 +156,9 @@ describe("Solauto Marginfi tests", async () => {
156
156
 
157
157
  await new TransactionsManager(
158
158
  client,
159
- transactionItems,
160
159
  undefined,
161
160
  !payForTransactions,
162
161
  useJitoBundle
163
- ).send();
162
+ ).sendWithClient(transactionItems, client);
164
163
  });
165
164
  });