@haven-fi/solauto-sdk 1.0.684 → 1.0.686

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.
Files changed (57) hide show
  1. package/README.md +10 -9
  2. package/dist/constants/solautoConstants.d.ts +1 -0
  3. package/dist/constants/solautoConstants.d.ts.map +1 -1
  4. package/dist/constants/solautoConstants.js +2 -1
  5. package/dist/services/rebalance/rebalanceTxBuilder.js +1 -1
  6. package/dist/services/solauto/solautoClient.d.ts +8 -0
  7. package/dist/services/solauto/solautoClient.d.ts.map +1 -1
  8. package/dist/services/solauto/solautoClient.js +12 -0
  9. package/dist/services/transactions/index.d.ts +3 -2
  10. package/dist/services/transactions/index.d.ts.map +1 -1
  11. package/dist/services/transactions/index.js +2 -1
  12. package/dist/services/transactions/manager/clientTransactionsManager.d.ts +10 -0
  13. package/dist/services/transactions/manager/clientTransactionsManager.d.ts.map +1 -0
  14. package/dist/services/transactions/manager/clientTransactionsManager.js +75 -0
  15. package/dist/services/transactions/manager/index.d.ts +3 -0
  16. package/dist/services/transactions/manager/index.d.ts.map +1 -0
  17. package/dist/services/transactions/manager/index.js +18 -0
  18. package/dist/services/transactions/manager/transactionsManager.d.ts +64 -0
  19. package/dist/services/transactions/manager/transactionsManager.d.ts.map +1 -0
  20. package/dist/services/transactions/{transactionsManager.js → manager/transactionsManager.js} +21 -211
  21. package/dist/services/transactions/types/index.d.ts +4 -0
  22. package/dist/services/transactions/types/index.d.ts.map +1 -0
  23. package/dist/services/transactions/types/index.js +19 -0
  24. package/dist/services/transactions/types/lookupTables.d.ts +10 -0
  25. package/dist/services/transactions/types/lookupTables.d.ts.map +1 -0
  26. package/dist/services/transactions/types/lookupTables.js +25 -0
  27. package/dist/services/transactions/types/transactionItem.d.ts +16 -0
  28. package/dist/services/transactions/types/transactionItem.d.ts.map +1 -0
  29. package/dist/services/transactions/types/transactionItem.js +31 -0
  30. package/dist/services/transactions/types/transactionSet.d.ts +20 -0
  31. package/dist/services/transactions/types/transactionSet.d.ts.map +1 -0
  32. package/dist/services/transactions/types/transactionSet.js +79 -0
  33. package/dist/solautoPosition/positionUtils.js +1 -1
  34. package/dist/utils/instructionUtils.d.ts.map +1 -1
  35. package/dist/utils/instructionUtils.js +3 -3
  36. package/dist/utils/switchboardUtils.d.ts +1 -0
  37. package/dist/utils/switchboardUtils.d.ts.map +1 -1
  38. package/dist/utils/switchboardUtils.js +10 -0
  39. package/local/txSandbox.ts +18 -24
  40. package/package.json +3 -1
  41. package/src/constants/solautoConstants.ts +2 -0
  42. package/src/services/rebalance/rebalanceTxBuilder.ts +1 -1
  43. package/src/services/solauto/solautoClient.ts +38 -0
  44. package/src/services/transactions/index.ts +3 -2
  45. package/src/services/transactions/manager/clientTransactionsManager.ts +141 -0
  46. package/src/services/transactions/manager/index.ts +2 -0
  47. package/src/services/transactions/{transactionsManager.ts → manager/transactionsManager.ts} +46 -354
  48. package/src/services/transactions/types/index.ts +3 -0
  49. package/src/services/transactions/types/lookupTables.ts +37 -0
  50. package/src/services/transactions/types/transactionItem.ts +43 -0
  51. package/src/services/transactions/types/transactionSet.ts +114 -0
  52. package/src/solautoPosition/positionUtils.ts +1 -1
  53. package/src/utils/instructionUtils.ts +6 -3
  54. package/src/utils/switchboardUtils.ts +17 -2
  55. package/tests/transactions/shared.ts +7 -4
  56. package/dist/services/transactions/transactionsManager.d.ts +0 -68
  57. package/dist/services/transactions/transactionsManager.d.ts.map +0 -1
@@ -0,0 +1,4 @@
1
+ export * from "./lookupTables";
2
+ export * from "./transactionItem";
3
+ export * from "./transactionSet";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./lookupTables"), exports);
18
+ __exportStar(require("./transactionItem"), exports);
19
+ __exportStar(require("./transactionSet"), exports);
@@ -0,0 +1,10 @@
1
+ import { AddressLookupTableInput, Umi } from "@metaplex-foundation/umi";
2
+ export declare class LookupTables {
3
+ defaultLuts: string[];
4
+ private umi;
5
+ cache: AddressLookupTableInput[];
6
+ constructor(defaultLuts: string[], umi: Umi);
7
+ getLutInputs(additionalAddresses?: string[]): Promise<AddressLookupTableInput[]>;
8
+ reset(): void;
9
+ }
10
+ //# sourceMappingURL=lookupTables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lookupTables.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/types/lookupTables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAGxE,qBAAa,YAAY;IAId,WAAW,EAAE,MAAM,EAAE;IAC5B,OAAO,CAAC,GAAG;IAJb,KAAK,EAAE,uBAAuB,EAAE,CAAM;gBAG7B,WAAW,EAAE,MAAM,EAAE,EACpB,GAAG,EAAE,GAAG;IAGZ,YAAY,CAChB,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAkBrC,KAAK;CAKN"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LookupTables = void 0;
4
+ const utils_1 = require("../../../utils");
5
+ class LookupTables {
6
+ constructor(defaultLuts, umi) {
7
+ this.defaultLuts = defaultLuts;
8
+ this.umi = umi;
9
+ this.cache = [];
10
+ }
11
+ async getLutInputs(additionalAddresses) {
12
+ const addresses = [...this.defaultLuts, ...(additionalAddresses ?? [])];
13
+ const currentCacheAddresses = this.cache.map((x) => x.publicKey.toString());
14
+ const missingAddresses = addresses.filter((x) => !currentCacheAddresses.includes(x));
15
+ if (missingAddresses) {
16
+ const additionalInputs = await (0, utils_1.getAddressLookupInputs)(this.umi, missingAddresses);
17
+ this.cache.push(...additionalInputs);
18
+ }
19
+ return this.cache;
20
+ }
21
+ reset() {
22
+ this.cache = this.cache.filter((x) => this.defaultLuts.includes(x.publicKey.toString()));
23
+ }
24
+ }
25
+ exports.LookupTables = LookupTables;
@@ -0,0 +1,16 @@
1
+ import { TransactionBuilder } from "@metaplex-foundation/umi";
2
+ import { TransactionItemInputs } from "../../../types";
3
+ export declare class TransactionItem {
4
+ fetchTx: (attemptNum: number, prevError?: Error) => Promise<TransactionItemInputs | undefined>;
5
+ name?: string | undefined;
6
+ oracleInteractor?: boolean | undefined;
7
+ lookupTableAddresses: string[];
8
+ tx?: TransactionBuilder;
9
+ initialized: boolean;
10
+ orderPrio: number;
11
+ constructor(fetchTx: (attemptNum: number, prevError?: Error) => Promise<TransactionItemInputs | undefined>, name?: string | undefined, oracleInteractor?: boolean | undefined);
12
+ initialize(): Promise<void>;
13
+ refetch(attemptNum: number, prevError?: Error): Promise<void>;
14
+ uniqueAccounts(): string[];
15
+ }
16
+ //# sourceMappingURL=transactionItem.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionItem.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/types/transactionItem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAEvD,qBAAa,eAAe;IAOjB,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,KAAK,KACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC;IACxC,IAAI,CAAC,EAAE,MAAM;IACb,gBAAgB,CAAC,EAAE,OAAO;IAXnC,oBAAoB,EAAG,MAAM,EAAE,CAAC;IAChC,EAAE,CAAC,EAAE,kBAAkB,CAAC;IACxB,WAAW,EAAE,OAAO,CAAS;IAC7B,SAAS,EAAE,MAAM,CAAK;gBAGb,OAAO,EAAE,CACd,UAAU,EAAE,MAAM,EAClB,SAAS,CAAC,EAAE,KAAK,KACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,EACxC,IAAI,CAAC,EAAE,MAAM,YAAA,EACb,gBAAgB,CAAC,EAAE,OAAO,YAAA;IAG7B,UAAU;IAKV,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK;IAOnD,cAAc,IAAI,MAAM,EAAE;CAY3B"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionItem = void 0;
4
+ class TransactionItem {
5
+ constructor(fetchTx, name, oracleInteractor) {
6
+ this.fetchTx = fetchTx;
7
+ this.name = name;
8
+ this.oracleInteractor = oracleInteractor;
9
+ this.initialized = false;
10
+ this.orderPrio = 0;
11
+ }
12
+ async initialize() {
13
+ await this.refetch(0);
14
+ this.initialized = true;
15
+ }
16
+ async refetch(attemptNum, prevError) {
17
+ const resp = await this.fetchTx(attemptNum, prevError);
18
+ this.tx = resp?.tx;
19
+ this.lookupTableAddresses = resp?.lookupTableAddresses ?? [];
20
+ this.orderPrio = resp?.orderPrio ?? 0;
21
+ }
22
+ uniqueAccounts() {
23
+ return Array.from(new Set(this.tx.getInstructions()
24
+ .map((x) => [
25
+ x.programId.toString(),
26
+ ...x.keys.map((y) => y.pubkey.toString()),
27
+ ])
28
+ .flat()));
29
+ }
30
+ }
31
+ exports.TransactionItem = TransactionItem;
@@ -0,0 +1,20 @@
1
+ import { AddressLookupTableInput, TransactionBuilder } from "@metaplex-foundation/umi";
2
+ import { TxHandler } from "../../solauto";
3
+ import { LookupTables } from "./lookupTables";
4
+ import { TransactionItem } from "./transactionItem";
5
+ export declare class TransactionSet {
6
+ private txHandler;
7
+ lookupTables: LookupTables;
8
+ items: TransactionItem[];
9
+ constructor(txHandler: TxHandler, lookupTables: LookupTables, items?: TransactionItem[]);
10
+ lutInputs(): Promise<AddressLookupTableInput[]>;
11
+ fitsWith(item: TransactionItem): Promise<boolean>;
12
+ add(...items: TransactionItem[]): void;
13
+ prepend(...items: TransactionItem[]): void;
14
+ reset(): Promise<void>;
15
+ refetchAll(attemptNum: number, prevError?: Error): Promise<void>;
16
+ getSingleTransaction(): Promise<TransactionBuilder>;
17
+ lutAddresses(): string[];
18
+ name(): string;
19
+ }
20
+ //# sourceMappingURL=transactionSet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transactionSet.d.ts","sourceRoot":"","sources":["../../../../src/services/transactions/types/transactionSet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EAEvB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAMpD,qBAAa,cAAc;IAEvB,OAAO,CAAC,SAAS;IACV,YAAY,EAAE,YAAY;IAC1B,KAAK,EAAE,eAAe,EAAE;gBAFvB,SAAS,EAAE,SAAS,EACrB,YAAY,EAAE,YAAY,EAC1B,KAAK,GAAE,eAAe,EAAO;IAGhC,SAAS,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAY/C,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IA4BvD,GAAG,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE;IAM/B,OAAO,CAAC,GAAG,KAAK,EAAE,eAAe,EAAE;IAM7B,KAAK;IAIL,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,KAAK;IAMhD,oBAAoB,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAUzD,YAAY,IAAI,MAAM,EAAE;IAMxB,IAAI,IAAI,MAAM;CAef"}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionSet = void 0;
4
+ const umi_1 = require("@metaplex-foundation/umi");
5
+ const utils_1 = require("../../../utils");
6
+ const constants_1 = require("../../../constants");
7
+ const MAX_SUPPORTED_ACCOUNT_LOCKS = 64;
8
+ class TransactionSet {
9
+ constructor(txHandler, lookupTables, items = []) {
10
+ this.txHandler = txHandler;
11
+ this.lookupTables = lookupTables;
12
+ this.items = items;
13
+ }
14
+ async lutInputs() {
15
+ const lutInputs = await this.lookupTables.getLutInputs(this.lutAddresses());
16
+ return lutInputs.filter((lut, index, self) => index ===
17
+ self.findIndex((item) => item.publicKey.toString() === lut.publicKey.toString()));
18
+ }
19
+ async fitsWith(item) {
20
+ if (!item.tx) {
21
+ return true;
22
+ }
23
+ const accountLocks = Array.from(new Set([
24
+ ...this.items.map((x) => x.uniqueAccounts()),
25
+ ...item.uniqueAccounts(),
26
+ ])).length;
27
+ if (accountLocks > MAX_SUPPORTED_ACCOUNT_LOCKS) {
28
+ return false;
29
+ }
30
+ const singleTx = await this.getSingleTransaction();
31
+ const tx = (0, utils_1.addTxOptimizations)(this.txHandler.umi, singleTx, 1, 1)
32
+ .add(item.tx)
33
+ .setAddressLookupTables(await this.lookupTables.getLutInputs([
34
+ ...this.lutAddresses(),
35
+ ...item.lookupTableAddresses,
36
+ ]));
37
+ return tx.fitsInOneTransaction(this.txHandler.umi);
38
+ }
39
+ add(...items) {
40
+ this.items.push(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
41
+ }
42
+ prepend(...items) {
43
+ this.items.unshift(...items.filter((x) => x.tx && x.tx.getInstructions().length > 0));
44
+ }
45
+ async reset() {
46
+ await this.txHandler.resetLiveTxUpdates();
47
+ }
48
+ async refetchAll(attemptNum, prevError) {
49
+ for (const item of this.items) {
50
+ await item.refetch(attemptNum, prevError);
51
+ }
52
+ }
53
+ async getSingleTransaction() {
54
+ const transactions = this.items
55
+ .filter((x) => x.tx && x.tx.getInstructions().length > 0)
56
+ .map((x) => x.tx);
57
+ return (0, umi_1.transactionBuilder)()
58
+ .add(transactions)
59
+ .setAddressLookupTables(await this.lutInputs());
60
+ }
61
+ lutAddresses() {
62
+ return Array.from(new Set(this.items.map((x) => x.lookupTableAddresses).flat()));
63
+ }
64
+ name() {
65
+ let names = this.items
66
+ .filter((x) => x.tx && Boolean(x.name))
67
+ .map((x) => x.name.toLowerCase());
68
+ if (names.length > 1) {
69
+ names = names.filter((x) => x !== constants_1.CHORES_TX_NAME);
70
+ }
71
+ if (names.length >= 3) {
72
+ return [names.slice(0, -1).join(", "), names[names.length - 1]].join(", and ");
73
+ }
74
+ else {
75
+ return names.join(" & ");
76
+ }
77
+ }
78
+ }
79
+ exports.TransactionSet = TransactionSet;
@@ -115,7 +115,7 @@ function createFakePositionState(supply, debt, maxLtvBps, liqThresholdBps) {
115
115
  },
116
116
  maxLtvBps,
117
117
  liqThresholdBps,
118
- lastRefreshed: BigInt((0, utils_1.currentUnixSeconds)()),
118
+ lastRefreshed: BigInt((0, utils_1.currentUnixSeconds)() - 100),
119
119
  padding1: [],
120
120
  padding2: [],
121
121
  padding: [],
@@ -1 +1 @@
1
- {"version":3,"file":"instructionUtils.d.ts","sourceRoot":"","sources":["../../src/utils/instructionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,aAAa,EAEb,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,gCAAgC,EAC/C,GAAG,CAAC,EAAE,kBAAkB,mBAQzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,mBAOzD;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,CAAC,gCAAgC,CAAC,EAC5D,GAAG,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,mBAY1C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,mBAOrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAUpE;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAUnE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,mBAcrE;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,mBAclE;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,mBAWrC;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,SAAS,EACtB,qBAAqB,EAAE,MAAM,qBAyC9B"}
1
+ {"version":3,"file":"instructionUtils.d.ts","sourceRoot":"","sources":["../../src/utils/instructionUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAsB,MAAM,0BAA0B,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,gCAAgC,EACjC,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,aAAa,EAEb,eAAe,EAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,aAAa,EACrB,aAAa,EAAE,gCAAgC,EAC/C,GAAG,CAAC,EAAE,kBAAkB,mBAQzB;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,mBAOzD;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,QAAQ,EAAE,gBAAgB,CAAC,gCAAgC,CAAC,EAC5D,GAAG,EAAE,gBAAgB,CAAC,kBAAkB,CAAC,mBAY1C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,mBAOrD;AAED,wBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAUpE;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAWnE;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,mBAerE;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,mBAclE;AAED,wBAAgB,SAAS,CACvB,MAAM,EAAE,aAAa,EACrB,2BAA2B,CAAC,EAAE,MAAM,mBAYrC;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,SAAS,EACtB,qBAAqB,EAAE,MAAM,qBAyC9B"}
@@ -51,7 +51,7 @@ function borrow(client, baseUnitAmount) {
51
51
  __kind: "Borrow",
52
52
  fields: [baseUnitAmount],
53
53
  }),
54
- }), "borrow");
54
+ }), "borrow", true);
55
55
  }
56
56
  function withdraw(client, amount) {
57
57
  return new services_1.TransactionItem(async () => ({
@@ -63,7 +63,7 @@ function withdraw(client, amount) {
63
63
  : { __kind: "Some", fields: [amount] },
64
64
  ],
65
65
  }),
66
- }), "withdraw");
66
+ }), "withdraw", true);
67
67
  }
68
68
  function repay(client, amount) {
69
69
  return new services_1.TransactionItem(async () => ({
@@ -78,7 +78,7 @@ function repay(client, amount) {
78
78
  }), "repay");
79
79
  }
80
80
  function rebalance(client, targetLiqUtilizationRateBps) {
81
- return new services_1.TransactionItem(async (attemptNum, prevError) => await new services_1.RebalanceTxBuilder(client, targetLiqUtilizationRateBps, attemptNum > 2 && prevError instanceof services_1.TransactionTooLargeError).buildRebalanceTx(attemptNum), "rebalance");
81
+ return new services_1.TransactionItem(async (attemptNum, prevError) => await new services_1.RebalanceTxBuilder(client, targetLiqUtilizationRateBps, attemptNum > 2 && prevError instanceof services_1.TransactionTooLargeError).buildRebalanceTx(attemptNum), "rebalance", true);
82
82
  }
83
83
  function swapThenDeposit(client, depositMint, depositAmountBaseUnit) {
84
84
  return [
@@ -9,4 +9,5 @@ export declare function getSwitchboardFeedData(conn: Connection, mints: PublicKe
9
9
  price: number;
10
10
  stale: boolean;
11
11
  }[]>;
12
+ export declare function isSwitchboardMint(mint: PublicKey | string): boolean;
12
13
  //# sourceMappingURL=switchboardUtils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAIjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CAsB5C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAuB/D"}
1
+ {"version":3,"file":"switchboardUtils.d.ts","sourceRoot":"","sources":["../../src/utils/switchboardUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,MAAM,EAAsB,MAAM,0BAA0B,CAAC;AAGtE,OAAO,KAAK,QAAQ,MAAM,4BAA4B,CAAC;AAIvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAOjD,wBAAgB,WAAW,CACzB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,SAAS,EACf,MAAM,CAAC,EAAE,SAAS,qBAuBnB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,qBAAqB,GAAG,SAAS,CAAC,CA6B5C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,EAAE,CAAC,CAuB/D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,WAEzD"}
@@ -29,6 +29,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
29
29
  exports.getPullFeed = getPullFeed;
30
30
  exports.buildSwbSubmitResponseTx = buildSwbSubmitResponseTx;
31
31
  exports.getSwitchboardFeedData = getSwitchboardFeedData;
32
+ exports.isSwitchboardMint = isSwitchboardMint;
32
33
  const web3_js_1 = require("@solana/web3.js");
33
34
  const umi_1 = require("@metaplex-foundation/umi");
34
35
  const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
@@ -58,6 +59,12 @@ async function buildSwbSubmitResponseTx(conn, signer, mint) {
58
59
  if (!pullIx) {
59
60
  throw new Error("Unable to fetch SWB crank IX");
60
61
  }
62
+ const price = responses[0].value.toNumber();
63
+ constants_1.PRICES[mint.toString()] = {
64
+ realtimePrice: price,
65
+ emaPrice: price,
66
+ time: (0, generalUtils_1.currentUnixSeconds)(),
67
+ };
61
68
  return {
62
69
  tx: (0, umi_1.transactionBuilder)([(0, solanaUtils_1.getWrappedInstruction)(signer, pullIx)]),
63
70
  lookupTableAddresses: responses
@@ -79,3 +86,6 @@ async function getSwitchboardFeedData(conn, mints) {
79
86
  }));
80
87
  return results;
81
88
  }
89
+ function isSwitchboardMint(mint) {
90
+ return Object.keys(constants_1.SWITCHBOARD_PRICE_FEED_IDS).includes(mint.toString());
91
+ }
@@ -2,6 +2,7 @@ import { Keypair, PublicKey } from "@solana/web3.js";
2
2
  import { createSignerFromKeypair } from "@metaplex-foundation/umi";
3
3
  import { fromWeb3JsKeypair } from "@metaplex-foundation/umi-web3js-adapters";
4
4
  import {
5
+ ClientTransactionsManager,
5
6
  consoleLog,
6
7
  getBatches,
7
8
  getClient,
@@ -18,11 +19,10 @@ import {
18
19
  SOLAUTO_TEST_PROGRAM,
19
20
  SolautoClient,
20
21
  TransactionItem,
21
- TransactionsManager,
22
22
  } from "../src";
23
23
  import { getSecretKey } from "./shared";
24
24
 
25
- const payForTransaction = true;
25
+ const payForTransaction = false;
26
26
  const testProgram = false;
27
27
  const lpEnv: ProgramEnv = "Prod";
28
28
 
@@ -46,9 +46,9 @@ export async function main() {
46
46
  lpEnv,
47
47
  });
48
48
 
49
- await client.initialize({
50
- positionId: 3,
51
- authority: new PublicKey("61rtn5tzVkesapo6Cz83SPoShUfAePSxJsqniuF2wRKC"),
49
+ await client.initializeExistingSolautoPosition({
50
+ positionId: 1,
51
+ authority: new PublicKey("5UqsR2PGzbP8pGPbXEeXx86Gjz2N2UFBAuFZUSVydAEe"),
52
52
  // lpUserAccount: new PublicKey(
53
53
  // "GEokw9jqbh6d1xUNA3qaeYFFetbSR5Y1nt7C3chwwgSz"
54
54
  // ),
@@ -56,16 +56,13 @@ export async function main() {
56
56
 
57
57
  const transactionItems = [rebalance(client)];
58
58
 
59
- const txManager = new TransactionsManager(
60
- client,
61
- undefined,
62
- payForTransaction ? "normal" : "only-simulate",
63
- PriorityFeeSetting.High,
64
- true,
65
- undefined,
66
- { totalRetries: 5 }
67
- );
68
- const statuses = await txManager.clientSend(transactionItems);
59
+ const txManager = new ClientTransactionsManager({
60
+ txHandler: client,
61
+ txRunType: payForTransaction ? "normal" : "only-simulate",
62
+ priorityFeeSetting: PriorityFeeSetting.Default,
63
+ retryConfig: { totalRetries: 5 },
64
+ });
65
+ const statuses = await txManager.send(transactionItems);
69
66
  consoleLog(statuses);
70
67
  }
71
68
 
@@ -104,15 +101,12 @@ async function refreshAll() {
104
101
  const txBatches = getBatches(transactionItems, 15);
105
102
 
106
103
  for (const batch of txBatches) {
107
- const txManager = new TransactionsManager(
108
- client!,
109
- undefined,
110
- payForTransaction ? "normal" : "only-simulate",
111
- PriorityFeeSetting.High,
112
- true,
113
- undefined,
114
- { totalRetries: 5 }
115
- );
104
+ const txManager = new ClientTransactionsManager({
105
+ txHandler: client!,
106
+ txRunType: payForTransaction ? "normal" : "only-simulate",
107
+ priorityFeeSetting: PriorityFeeSetting.Default,
108
+ retryConfig: { totalRetries: 5 },
109
+ });
116
110
  const statuses = await txManager.send(batch);
117
111
  consoleLog(statuses);
118
112
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.684",
3
+ "version": "1.0.686",
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",
@@ -23,12 +23,14 @@
23
23
  "@switchboard-xyz/common": "=3.0.12",
24
24
  "@switchboard-xyz/on-demand": "=1.2.51",
25
25
  "axios": "^1.7.8",
26
+ "big.js": "^6.2.2",
26
27
  "bs58": "^5.0.0",
27
28
  "cross-fetch": "^4.0.0",
28
29
  "dotenv": "^16.4.7",
29
30
  "rpc-websockets": "7.11.0"
30
31
  },
31
32
  "devDependencies": {
33
+ "@types/big.js": "^6.2.2",
32
34
  "@types/chai": "^4.3.0",
33
35
  "@types/mocha": "^9.1.1",
34
36
  "@types/node": "^20.16.11",
@@ -31,6 +31,8 @@ export const REFERRER_PERCENTAGE = 0.15;
31
31
 
32
32
  export const PRICES: { [key: string]: { realtimePrice: number; emaPrice: number; time: number } } = {};
33
33
 
34
+ export const CHORES_TX_NAME = "account chores";
35
+
34
36
  export const JITO_TIP_ACCOUNTS = [
35
37
  "96gYZGLnJYVFmbjzopPSU6QiEV5fGqZNyN9nmNhvrZU5",
36
38
  "HFqU5x63VTqvQss8hp11i4wVV8bD44PvwucfZ2bU7gRe",
@@ -311,7 +311,7 @@ export class RebalanceTxBuilder {
311
311
  );
312
312
  consoleLog("Liq utilization rate diff:", utilizationRateDiff);
313
313
 
314
- if (utilizationRateDiff >= 10) {
314
+ if (utilizationRateDiff >= 5) {
315
315
  consoleLog("Refreshing before rebalance");
316
316
  return true;
317
317
  }
@@ -48,6 +48,26 @@ export interface SolautoClientArgs extends ReferralStateManagerArgs {
48
48
  lpUserAccount?: PublicKey;
49
49
  }
50
50
 
51
+ export type ExistingSolautoPositionArgs = Required<
52
+ Pick<SolautoClientArgs, "positionId">
53
+ > &
54
+ Partial<Pick<SolautoClientArgs, "authority">>;
55
+
56
+ export type NewSolautoPositionArgs = Required<
57
+ Pick<
58
+ SolautoClientArgs,
59
+ "positionId" | "supplyMint" | "debtMint" | "lpPoolAccount"
60
+ >
61
+ >;
62
+
63
+ export type ExistingSelfManagedPositionArgs = Required<
64
+ Pick<SolautoClientArgs, "lpUserAccount">
65
+ >;
66
+
67
+ export type NewSelfManagedPositionArgs = Required<
68
+ Pick<SolautoClientArgs, "supplyMint" | "debtMint" | "lpPoolAccount">
69
+ >;
70
+
51
71
  export abstract class SolautoClient extends ReferralStateManager {
52
72
  public lendingPlatform!: LendingPlatform;
53
73
  public lpEnv!: ProgramEnv;
@@ -73,6 +93,24 @@ export abstract class SolautoClient extends ReferralStateManager {
73
93
  private signerSupplyBalance: bigint | undefined;
74
94
  private signerDebtBalance: bigint | undefined;
75
95
 
96
+ async initializeExistingSolautoPosition(args: ExistingSolautoPositionArgs) {
97
+ await this.initialize(args);
98
+ }
99
+
100
+ async initializeNewSolautoPosition(args: NewSolautoPositionArgs) {
101
+ await this.initialize(args);
102
+ }
103
+
104
+ async initializeExistingSelfManagedPosition(
105
+ args: ExistingSelfManagedPositionArgs
106
+ ) {
107
+ await this.initialize(args);
108
+ }
109
+
110
+ async initializeNewSelfManagedPosition(args: NewSelfManagedPositionArgs) {
111
+ await this.initialize(args);
112
+ }
113
+
76
114
  async initialize(args: SolautoClientArgs) {
77
115
  await super.initialize(args);
78
116
 
@@ -1,2 +1,3 @@
1
- export * from './transactionsManager';
2
- export * from './transactionUtils';
1
+ export * from "./manager";
2
+ export * from "./types";
3
+ export * from "./transactionUtils";
@@ -0,0 +1,141 @@
1
+ import {
2
+ transactionBuilder,
3
+ TransactionBuilder,
4
+ } from "@metaplex-foundation/umi";
5
+ import { SolautoClient } from "../../solauto";
6
+ import { TransactionsManager } from "./transactionsManager";
7
+ import {
8
+ buildSwbSubmitResponseTx,
9
+ isSwitchboardMint,
10
+ retryWithExponentialBackoff,
11
+ } from "../../../utils";
12
+ import { TransactionItem } from "../types";
13
+ import { getTransactionChores } from "../transactionUtils";
14
+ import { CHORES_TX_NAME } from "../../../constants";
15
+
16
+ export class ClientTransactionsManager extends TransactionsManager<SolautoClient> {
17
+ private async updateLut(tx: TransactionBuilder, newLut: boolean) {
18
+ const lutInputs = await this.lookupTables.getLutInputs();
19
+ const updateLutTxName = `${newLut ? "create" : "update"} lookup table`;
20
+ await retryWithExponentialBackoff(
21
+ async (attemptNum, prevError) =>
22
+ await this.sendTransaction(
23
+ tx.setAddressLookupTables(lutInputs),
24
+ updateLutTxName,
25
+ attemptNum,
26
+ this.getUpdatedPriorityFeeSetting(prevError, attemptNum),
27
+ "skip-simulation"
28
+ ),
29
+ this.signableRetries,
30
+ 150,
31
+ this.errorsToThrow
32
+ );
33
+ await this.txHandler.refetchReferralState();
34
+ }
35
+
36
+ private async addSwbOraclePullTxs(txs: TransactionItem[]) {
37
+ const switchboardMints = [
38
+ ...(isSwitchboardMint(this.txHandler.pos.supplyMint)
39
+ ? [this.txHandler.pos.supplyMint]
40
+ : []),
41
+ ...(isSwitchboardMint(this.txHandler.pos.debtMint)
42
+ ? [this.txHandler.pos.debtMint]
43
+ : []),
44
+ ];
45
+
46
+ if (txs.find((x) => x.oracleInteractor) && switchboardMints.length) {
47
+ this.txHandler.log("Requires oracle update(s)...");
48
+ const txs = switchboardMints.map(
49
+ (x) =>
50
+ new TransactionItem(
51
+ async () =>
52
+ buildSwbSubmitResponseTx(
53
+ this.txHandler.connection,
54
+ this.txHandler.signer,
55
+ x
56
+ ),
57
+ this.updateOracleTxName
58
+ )
59
+ );
60
+ txs.unshift(...txs);
61
+ }
62
+ }
63
+
64
+ private async addChoreTxs(
65
+ txs: TransactionItem[],
66
+ updateLutTx?: TransactionBuilder
67
+ ) {
68
+ let [choresBefore, choresAfter] = await getTransactionChores(
69
+ this.txHandler,
70
+ transactionBuilder().add(
71
+ txs
72
+ .filter((x) => x.tx && x.tx.getInstructions().length > 0)
73
+ .map((x) => x.tx!)
74
+ )
75
+ );
76
+
77
+ if (updateLutTx) {
78
+ choresBefore.prepend(updateLutTx);
79
+ }
80
+
81
+ if (choresBefore.getInstructions().length) {
82
+ const chore = new TransactionItem(
83
+ async () => ({ tx: choresBefore }),
84
+ CHORES_TX_NAME
85
+ );
86
+ await chore.initialize();
87
+ txs.unshift(chore);
88
+ this.txHandler.log(
89
+ "Chores before: ",
90
+ choresBefore.getInstructions().length
91
+ );
92
+ }
93
+
94
+ if (choresAfter.getInstructions().length) {
95
+ const chore = new TransactionItem(
96
+ async () => ({ tx: choresAfter }),
97
+ CHORES_TX_NAME
98
+ );
99
+ await chore.initialize();
100
+ txs.push(chore);
101
+ this.txHandler.log(
102
+ "Chores after: ",
103
+ choresAfter.getInstructions().length
104
+ );
105
+ }
106
+ }
107
+
108
+ public async send(transactions: TransactionItem[]) {
109
+ const items = [...transactions];
110
+ const client = this.txHandler as SolautoClient;
111
+
112
+ const updateLut = await client.updateLookupTable();
113
+
114
+ if (updateLut && (updateLut?.new || updateLut.accountsToAdd.length > 4)) {
115
+ await this.updateLut(updateLut.tx, updateLut.new);
116
+ }
117
+ this.lookupTables.defaultLuts = client.defaultLookupTables();
118
+
119
+ await this.addSwbOraclePullTxs(items);
120
+
121
+ for (const item of items) {
122
+ await item.initialize();
123
+ }
124
+
125
+ await this.addChoreTxs(
126
+ items,
127
+ updateLut && !updateLut?.new ? updateLut.tx : undefined
128
+ );
129
+
130
+ const result = await super.send(items).catch((e) => {
131
+ client.resetLiveTxUpdates(false);
132
+ throw e;
133
+ });
134
+
135
+ if (this.txRunType !== "only-simulate") {
136
+ await client.resetLiveTxUpdates();
137
+ }
138
+
139
+ return result;
140
+ }
141
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./transactionsManager";
2
+ export * from "./clientTransactionsManager";