@haven-fi/solauto-sdk 1.0.9 → 1.0.10

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 (37) hide show
  1. package/dist/clients/solautoClient.d.ts +3 -3
  2. package/dist/clients/solautoClient.d.ts.map +1 -1
  3. package/dist/clients/solautoClient.js +15 -46
  4. package/dist/clients/solautoMarginfiClient.d.ts +1 -1
  5. package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
  6. package/dist/clients/solautoMarginfiClient.js +4 -5
  7. package/dist/constants/solautoConstants.d.ts +0 -3
  8. package/dist/constants/solautoConstants.d.ts.map +1 -1
  9. package/dist/constants/solautoConstants.js +1 -8
  10. package/dist/transactions/transactionUtils.d.ts +2 -2
  11. package/dist/transactions/transactionUtils.d.ts.map +1 -1
  12. package/dist/transactions/transactionUtils.js +9 -10
  13. package/dist/transactions/transactionsManager.d.ts.map +1 -1
  14. package/dist/transactions/transactionsManager.js +6 -7
  15. package/dist/utils/generalUtils.d.ts +2 -2
  16. package/dist/utils/generalUtils.d.ts.map +1 -1
  17. package/dist/utils/generalUtils.js +3 -3
  18. package/dist/utils/marginfiUtils.d.ts +4 -3
  19. package/dist/utils/marginfiUtils.d.ts.map +1 -1
  20. package/dist/utils/marginfiUtils.js +17 -16
  21. package/dist/utils/solanaUtils.d.ts +6 -7
  22. package/dist/utils/solanaUtils.d.ts.map +1 -1
  23. package/dist/utils/solanaUtils.js +20 -21
  24. package/dist/utils/solauto/generalUtils.d.ts +4 -4
  25. package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
  26. package/dist/utils/solauto/generalUtils.js +50 -7
  27. package/package.json +1 -1
  28. package/src/clients/solautoClient.ts +39 -73
  29. package/src/clients/solautoMarginfiClient.ts +5 -8
  30. package/src/constants/solautoConstants.ts +1 -11
  31. package/src/transactions/transactionUtils.ts +11 -11
  32. package/src/transactions/transactionsManager.ts +11 -7
  33. package/src/utils/generalUtils.ts +5 -5
  34. package/src/utils/marginfiUtils.ts +28 -12
  35. package/src/utils/solanaUtils.ts +28 -23
  36. package/src/utils/solauto/generalUtils.ts +91 -14
  37. package/tests/transactions/solautoMarginfi.ts +2 -1
@@ -10,16 +10,15 @@ const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters"
10
10
  const web3_js_1 = require("@solana/web3.js");
11
11
  const spl_token_1 = require("@solana/spl-token");
12
12
  const accountUtils_1 = require("./accountUtils");
13
- const solautoConstants_1 = require("../constants/solautoConstants");
14
13
  const generalUtils_1 = require("./generalUtils");
15
14
  const marginfi_sdk_1 = require("../marginfi-sdk");
16
- async function currentUnixSecondsSolana() {
15
+ async function currentUnixSecondsSolana(umi) {
17
16
  return await (0, generalUtils_1.retryWithExponentialBackoff)(async () => {
18
- const blockTime = await solautoConstants_1.CONNECTION.getBlockTime(await solautoConstants_1.CONNECTION.getSlot());
17
+ const blockTime = await umi.rpc.getBlockTime(await umi.rpc.getSlot());
19
18
  if (blockTime === null) {
20
19
  throw new Error("Unable to retrieve block time");
21
20
  }
22
- return blockTime;
21
+ return Number(blockTime);
23
22
  });
24
23
  }
25
24
  exports.currentUnixSecondsSolana = currentUnixSecondsSolana;
@@ -63,8 +62,8 @@ function splTokenTransferUmiIx(signer, fromTa, toTa, authority, amount) {
63
62
  return getWrappedInstruction(signer, (0, spl_token_1.createTransferInstruction)(fromTa, toTa, authority, amount));
64
63
  }
65
64
  exports.splTokenTransferUmiIx = splTokenTransferUmiIx;
66
- async function getAdressLookupInputs(lookupTableAddresses) {
67
- const addressLookupTableAccountInfos = await solautoConstants_1.UMI.rpc.getAccounts(lookupTableAddresses.map((key) => (0, umi_1.publicKey)(key)));
65
+ async function getAdressLookupInputs(umi, lookupTableAddresses) {
66
+ const addressLookupTableAccountInfos = await umi.rpc.getAccounts(lookupTableAddresses.map((key) => (0, umi_1.publicKey)(key)));
68
67
  return addressLookupTableAccountInfos.reduce((acc, accountInfo, index) => {
69
68
  const addressLookupTableAddress = lookupTableAddresses[index];
70
69
  if (accountInfo.exists) {
@@ -119,8 +118,8 @@ function assembleFinalTransaction(signer, tx, computeUnitPrice, computeUnitLimit
119
118
  return tx;
120
119
  }
121
120
  exports.assembleFinalTransaction = assembleFinalTransaction;
122
- async function simulateTransaction(transaction) {
123
- const simulationResult = await solautoConstants_1.CONNECTION.simulateTransaction(transaction, {
121
+ async function simulateTransaction(connection, transaction) {
122
+ const simulationResult = await connection.simulateTransaction(transaction, {
124
123
  sigVerify: true,
125
124
  });
126
125
  if (simulationResult.value.err) {
@@ -131,10 +130,10 @@ async function simulateTransaction(transaction) {
131
130
  }
132
131
  return simulationResult;
133
132
  }
134
- async function getComputeUnitPriceEstimate(tx, attemptNum) {
135
- const web3Transaction = (0, umi_web3js_adapters_1.toWeb3JsTransaction)((await tx.setLatestBlockhash(solautoConstants_1.UMI, { commitment: "finalized" })).build(solautoConstants_1.UMI));
133
+ async function getComputeUnitPriceEstimate(umi, tx, attemptNum) {
134
+ const web3Transaction = (0, umi_web3js_adapters_1.toWeb3JsTransaction)((await tx.setLatestBlockhash(umi, { commitment: "finalized" })).build(umi));
136
135
  const serializedTransaction = bs58_1.default.encode(web3Transaction.serialize());
137
- const resp = await solautoConstants_1.UMI.rpc.call("getPriorityFeeEstimate", [
136
+ const resp = await umi.rpc.call("getPriorityFeeEstimate", [
138
137
  {
139
138
  transaction: serializedTransaction,
140
139
  options: { priorityLevel: attemptNum && attemptNum > 0 ? "VeryHigh" : "High" },
@@ -144,24 +143,24 @@ async function getComputeUnitPriceEstimate(tx, attemptNum) {
144
143
  return feeEstimate;
145
144
  }
146
145
  exports.getComputeUnitPriceEstimate = getComputeUnitPriceEstimate;
147
- async function sendSingleOptimizedTransaction(client, tx, simulateOnly, attemptNum) {
148
- client.log("Sending single optimized transaction...");
149
- client.log("Instructions: ", tx.getInstructions().length);
150
- client.log("Serialized transaction size: ", tx.getTransactionSize(solautoConstants_1.UMI));
151
- const feeEstimate = await getComputeUnitPriceEstimate(tx, attemptNum);
152
- client.log("Compute unit price: ", feeEstimate);
153
- const simulationResult = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await simulateTransaction((0, umi_web3js_adapters_1.toWeb3JsTransaction)(await (await assembleFinalTransaction(client.signer, tx, feeEstimate, 1400000).setLatestBlockhash(solautoConstants_1.UMI)).buildAndSign(solautoConstants_1.UMI))));
146
+ async function sendSingleOptimizedTransaction(umi, connection, tx, simulateOnly, attemptNum) {
147
+ console.log("Sending single optimized transaction...");
148
+ console.log("Instructions: ", tx.getInstructions().length);
149
+ console.log("Serialized transaction size: ", tx.getTransactionSize(umi));
150
+ const feeEstimate = await getComputeUnitPriceEstimate(umi, tx, attemptNum);
151
+ console.log("Compute unit price: ", feeEstimate);
152
+ const simulationResult = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await simulateTransaction(connection, (0, umi_web3js_adapters_1.toWeb3JsTransaction)(await (await assembleFinalTransaction(umi.identity, tx, feeEstimate, 1400000).setLatestBlockhash(umi)).buildAndSign(umi))));
154
153
  const computeUnitLimit = Math.round(simulationResult.value.unitsConsumed * 1.15);
155
- client.log("Compute unit limit: ", computeUnitLimit);
154
+ console.log("Compute unit limit: ", computeUnitLimit);
156
155
  if (!simulateOnly) {
157
- const result = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await assembleFinalTransaction(client.signer, tx, feeEstimate, computeUnitLimit).sendAndConfirm(solautoConstants_1.UMI, {
156
+ const result = await (0, generalUtils_1.retryWithExponentialBackoff)(async () => await assembleFinalTransaction(umi.identity, tx, feeEstimate, computeUnitLimit).sendAndConfirm(umi, {
158
157
  send: {
159
158
  skipPreflight: true,
160
159
  commitment: "finalized",
161
160
  },
162
161
  confirm: { commitment: "finalized" },
163
162
  }));
164
- client.log(`https://solscan.io/tx/${bs58_1.default.encode(result.signature)}`);
163
+ console.log(`https://solscan.io/tx/${bs58_1.default.encode(result.signature)}`);
165
164
  if (result.result.value.err !== null) {
166
165
  throw new Error(result.result.value.err.toString());
167
166
  }
@@ -1,4 +1,4 @@
1
- import { PublicKey } from "@metaplex-foundation/umi";
1
+ import { PublicKey, Umi } from "@metaplex-foundation/umi";
2
2
  import { AutomationSettings, DCASettings, DCASettingsInpArgs, FeeType, LendingPlatform, PositionState, SolautoSettingsParameters, SolautoSettingsParametersInpArgs } from "../../generated";
3
3
  export declare function nextAutomationPeriodTimestamp(automation: AutomationSettings): number;
4
4
  export declare function eligibleForNextAutomationPeriod(automation: AutomationSettings): boolean;
@@ -14,13 +14,13 @@ export declare function maxRepayFrom(maxLtvBps: number, liqThresholdBps: number)
14
14
  export declare function maxRepayTo(maxLtvBps: number, liqThresholdBps: number): number;
15
15
  export declare function eligibileForRebalance(positionState: PositionState, positionSettings: SolautoSettingsParameters, positionDca: DCASettings): boolean;
16
16
  export declare function eligibleForRefresh(positionState: PositionState, positionSettings: SolautoSettingsParameters): boolean;
17
- export declare function getSolautoManagedPositions(authority?: PublicKey): Promise<{
17
+ export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey): Promise<{
18
18
  authority: PublicKey;
19
19
  positionId: number;
20
20
  lendingPlatform: LendingPlatform;
21
21
  }[]>;
22
- export declare function getAllReferralStates(): Promise<PublicKey[]>;
23
- export declare function getReferralsByUser(user: PublicKey): Promise<PublicKey[]>;
22
+ export declare function getAllReferralStates(umi: Umi): Promise<PublicKey[]>;
23
+ export declare function getReferralsByUser(umi: Umi, user: PublicKey): Promise<PublicKey[]>;
24
24
  type PositionAdjustment = {
25
25
  type: "supply";
26
26
  value: bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,aAAa,EAEb,yBAAyB,EACzB,gCAAgC,EAIjC,MAAM,iBAAiB,CAAC;AAwBzB,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAKR;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAET;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,EAC9B,oBAAoB,EAAE,MAAM,UAY7B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,yBAAyB,EACnC,kBAAkB,EAAE,MAAM,GACzB,yBAAyB,CAgB3B;AAED,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAYA;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,MAAM,CAER;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAEtE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAEpE;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,yBAAyB,EAC3C,WAAW,EAAE,WAAW,GACvB,OAAO,CA+BT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,yBAAyB,GAC1C,OAAO,CAMT;AAED,wBAAsB,0BAA0B,CAC9C,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CACR;IACE,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,EAAE,CACJ,CAkDA;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC,CAejE;AAED,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AAED,KAAK,kBAAkB,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,gCAAgC,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE/C,qBAAa,mBAAmB;IACvB,gBAAgB,EAAE,MAAM,CAAa;IACrC,cAAc,EAAE,MAAM,CAAa;IACnC,uBAAuB,EAAE,MAAM,CAAa;IAC5C,QAAQ,EAAE,yBAAyB,GAAG,SAAS,CAAa;IAC5D,SAAS,EAAE,WAAW,GAAG,SAAS,CAAa;IAEtD,GAAG,CAAC,MAAM,EAAE,kBAAkB;IAyD9B,KAAK;IAQL,UAAU,IAAI,OAAO;CAQtB"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,SAAS,EAAE,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAC5E,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,kBAAkB,EAClB,OAAO,EACP,eAAe,EACf,aAAa,EAEb,yBAAyB,EACzB,gCAAgC,EAIjC,MAAM,iBAAiB,CAAC;AA6BzB,wBAAgB,6BAA6B,CAC3C,UAAU,EAAE,kBAAkB,GAC7B,MAAM,CAKR;AAED,wBAAgB,+BAA+B,CAC7C,UAAU,EAAE,kBAAkB,GAC7B,OAAO,CAET;AAED,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,kBAAkB,EAC9B,oBAAoB,EAAE,MAAM,UAY7B;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,yBAAyB,EACnC,kBAAkB,EAAE,MAAM,GACzB,yBAAyB,CAgB3B;AAED,wBAAgB,iBAAiB,CAC/B,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,OAAO,GACf;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf,CAYA;AAED,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,MAAM,GACtB,MAAM,CAER;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKtE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,UAKpE;AAED,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,yBAAyB,EAC3C,WAAW,EAAE,WAAW,GACvB,OAAO,CA+BT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,gBAAgB,EAAE,yBAAyB,GAC1C,OAAO,CAST;AAED,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,GAAG,EACR,SAAS,CAAC,EAAE,SAAS,GACpB,OAAO,CACR;IACE,SAAS,EAAE,SAAS,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;CAClC,EAAE,CACJ,CAkDA;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAezE;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,GAAG,EACR,IAAI,EAAE,SAAS,GACd,OAAO,CAAC,SAAS,EAAE,CAAC,CA2BtB;AA4DD,KAAK,kBAAkB,GACnB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,gCAAgC,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,kBAAkB,CAAA;CAAE,CAAC;AAE/C,qBAAa,mBAAmB;IACvB,gBAAgB,EAAE,MAAM,CAAa;IACrC,cAAc,EAAE,MAAM,CAAa;IACnC,uBAAuB,EAAE,MAAM,CAAa;IAC5C,QAAQ,EAAE,yBAAyB,GAAG,SAAS,CAAa;IAC5D,SAAS,EAAE,WAAW,GAAG,SAAS,CAAa;IAEtD,GAAG,CAAC,MAAM,EAAE,kBAAkB;IAyD9B,KAAK;IAQL,UAAU,IAAI,OAAO;CAQtB"}
@@ -8,6 +8,8 @@ const numberUtils_1 = require("../numberUtils");
8
8
  const solautoConstants_1 = require("../../constants/solautoConstants");
9
9
  const accountUtils_1 = require("../accountUtils");
10
10
  const umi_web3js_adapters_1 = require("@metaplex-foundation/umi-web3js-adapters");
11
+ const constants_1 = require("../../constants");
12
+ const marginfiUtils_1 = require("../marginfiUtils");
11
13
  function newPeriodsPassed(automation, currentUnixTimestamp) {
12
14
  return Math.min(automation.targetPeriods, automation.periodsPassed +
13
15
  Math.floor((currentUnixTimestamp - Number(automation.unixStartDate)) /
@@ -95,18 +97,19 @@ function eligibleForRefresh(positionState, positionSettings) {
95
97
  return eligibleForNextAutomationPeriod(positionSettings.automation);
96
98
  }
97
99
  else {
98
- return (0, generalUtils_1.currentUnixSeconds)() - Number(positionState.lastUpdated) > 60 * 60 * 24 * 7;
100
+ return ((0, generalUtils_1.currentUnixSeconds)() - Number(positionState.lastUpdated) >
101
+ 60 * 60 * 24 * 7);
99
102
  }
100
103
  }
101
104
  exports.eligibleForRefresh = eligibleForRefresh;
102
- async function getSolautoManagedPositions(authority) {
105
+ async function getSolautoManagedPositions(umi, authority) {
103
106
  // bump: [u8; 1]
104
107
  // position_id: [u8; 1]
105
108
  // self_managed: u8 - (1 for true, 0 for false)
106
109
  // padding: [u8; 5]
107
110
  // authority: Pubkey
108
111
  // lending_platform: u8
109
- const accounts = await solautoConstants_1.UMI.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
112
+ const accounts = await umi.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
110
113
  commitment: "finalized",
111
114
  dataSlice: {
112
115
  offset: 0,
@@ -147,8 +150,8 @@ async function getSolautoManagedPositions(authority) {
147
150
  });
148
151
  }
149
152
  exports.getSolautoManagedPositions = getSolautoManagedPositions;
150
- async function getAllReferralStates() {
151
- const accounts = await solautoConstants_1.UMI.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
153
+ async function getAllReferralStates(umi) {
154
+ const accounts = await umi.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
152
155
  commitment: "finalized",
153
156
  dataSlice: {
154
157
  offset: 0,
@@ -163,13 +166,13 @@ async function getAllReferralStates() {
163
166
  return accounts.map((x) => x.publicKey);
164
167
  }
165
168
  exports.getAllReferralStates = getAllReferralStates;
166
- async function getReferralsByUser(user) {
169
+ async function getReferralsByUser(umi, user) {
167
170
  // bump: [u8; 1],
168
171
  // padding: [u8; 7],
169
172
  // authority: Pubkey,
170
173
  // referred_by_state: Pubkey,
171
174
  const userReferralState = await (0, accountUtils_1.getReferralState)((0, umi_web3js_adapters_1.toWeb3JsPublicKey)(user));
172
- const accounts = await solautoConstants_1.UMI.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
175
+ const accounts = await umi.rpc.getProgramAccounts(generated_1.SOLAUTO_PROGRAM_ID, {
173
176
  commitment: "finalized",
174
177
  dataSlice: {
175
178
  offset: 0,
@@ -190,6 +193,46 @@ async function getReferralsByUser(user) {
190
193
  return accounts.map((x) => x.publicKey);
191
194
  }
192
195
  exports.getReferralsByUser = getReferralsByUser;
196
+ async function positionStateWithLatestPrices(umi, state, protocolAccount, lendingPlatform) {
197
+ if ((0, generalUtils_1.currentUnixSeconds)() - Number(state.lastUpdated) > 60 * 60 * 24 * 7) {
198
+ if (lendingPlatform === generated_1.LendingPlatform.Marginfi) {
199
+ return await (0, marginfiUtils_1.getMarginfiAccountPositionState)(umi, (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.supply.mint), (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint), (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(protocolAccount));
200
+ }
201
+ else {
202
+ throw new Error("Lending platorm not yet supported");
203
+ }
204
+ }
205
+ const [supplyPrice, debtPrice] = await (0, generalUtils_1.getTokenPrices)([
206
+ (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.supply.mint),
207
+ (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint),
208
+ ]);
209
+ const supplyUsd = (0, numberUtils_1.fromBaseUnit)(state.supply.amountUsed.baseUnit, state.supply.decimals) *
210
+ supplyPrice;
211
+ const debtUsd = (0, numberUtils_1.fromBaseUnit)(state.debt.amountUsed.baseUnit, state.debt.decimals) *
212
+ debtPrice;
213
+ return {
214
+ ...state,
215
+ liqUtilizationRateBps: (0, numberUtils_1.getLiqUtilzationRateBps)(supplyUsd, debtUsd, state.liqThresholdBps),
216
+ netWorth: {
217
+ ...state.netWorth,
218
+ baseAmountUsdValue: (0, numberUtils_1.toBaseUnit)(supplyUsd - debtUsd, constants_1.USD_DECIMALS),
219
+ },
220
+ supply: {
221
+ ...state.supply,
222
+ amountUsed: {
223
+ ...state.supply.amountUsed,
224
+ baseAmountUsdValue: (0, numberUtils_1.toBaseUnit)(supplyUsd, constants_1.USD_DECIMALS),
225
+ },
226
+ },
227
+ debt: {
228
+ ...state.debt,
229
+ amountUsed: {
230
+ ...state.debt.amountUsed,
231
+ baseAmountUsdValue: (0, numberUtils_1.toBaseUnit)(debtUsd, constants_1.USD_DECIMALS),
232
+ },
233
+ },
234
+ };
235
+ }
193
236
  class LivePositionUpdates {
194
237
  constructor() {
195
238
  this.supplyAdjustment = BigInt(0);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.9",
3
+ "version": "1.0.10",
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,5 +1,9 @@
1
1
  import "rpc-websockets/dist/lib/client";
2
- import { AddressLookupTableProgram, PublicKey } from "@solana/web3.js";
2
+ import {
3
+ AddressLookupTableProgram,
4
+ Connection,
5
+ PublicKey,
6
+ } from "@solana/web3.js";
3
7
  import {
4
8
  Signer,
5
9
  TransactionBuilder,
@@ -13,7 +17,10 @@ import {
13
17
  some,
14
18
  } from "@metaplex-foundation/umi";
15
19
  import { toWeb3JsPublicKey } from "@metaplex-foundation/umi-web3js-adapters";
16
- import { WalletAdapter, walletAdapterIdentity } from "@metaplex-foundation/umi-signer-wallet-adapters";
20
+ import {
21
+ WalletAdapter,
22
+ walletAdapterIdentity,
23
+ } from "@metaplex-foundation/umi-signer-wallet-adapters";
17
24
  import {
18
25
  DCASettings,
19
26
  DCASettingsInpArgs,
@@ -29,6 +36,7 @@ import {
29
36
  cancelDCA,
30
37
  claimReferralFees,
31
38
  closePosition,
39
+ createSolautoProgram,
32
40
  safeFetchReferralState,
33
41
  safeFetchSolautoPosition,
34
42
  updatePosition,
@@ -39,10 +47,7 @@ import {
39
47
  getSolautoPositionAccount,
40
48
  getTokenAccount,
41
49
  } from "../utils/accountUtils";
42
- import {
43
- SOLAUTO_FEES_WALLET,
44
- USD_DECIMALS,
45
- } from "../constants/generalAccounts";
50
+ import { SOLAUTO_FEES_WALLET } from "../constants/generalAccounts";
46
51
  import { JupSwapDetails } from "../utils/jupiterUtils";
47
52
  import {
48
53
  getWrappedInstruction,
@@ -50,18 +55,10 @@ import {
50
55
  } from "../utils/solanaUtils";
51
56
  import { FlashLoanDetails } from "../utils/solauto/rebalanceUtils";
52
57
  import { NATIVE_MINT } from "@solana/spl-token";
53
- import {
54
- CONNECTION,
55
- MIN_POSITION_STATE_FRESHNESS_SECS,
56
- UMI,
57
- } from "../constants/solautoConstants";
58
- import { currentUnixSeconds, getTokenPrices } from "../utils/generalUtils";
58
+ import { MIN_POSITION_STATE_FRESHNESS_SECS } from "../constants/solautoConstants";
59
+ import { currentUnixSeconds } from "../utils/generalUtils";
59
60
  import { LivePositionUpdates } from "../utils/solauto/generalUtils";
60
- import {
61
- fromBaseUnit,
62
- getLiqUtilzationRateBps,
63
- toBaseUnit,
64
- } from "../utils/numberUtils";
61
+ import { createUmi } from "@metaplex-foundation/umi-bundle-defaults";
65
62
 
66
63
  export interface SolautoClientArgs {
67
64
  authority?: PublicKey;
@@ -80,6 +77,7 @@ export abstract class SolautoClient {
80
77
  public localTest: boolean;
81
78
 
82
79
  public umi!: Umi;
80
+ public connection!: Connection;
83
81
  public lendingPlatform!: LendingPlatform;
84
82
 
85
83
  public authority!: PublicKey;
@@ -120,15 +118,32 @@ export abstract class SolautoClient {
120
118
  this.localTest = Boolean(localTest);
121
119
  }
122
120
 
123
- async initialize(args: SolautoClientArgs, lendingPlatform: LendingPlatform) {
124
- this.umi = UMI;
121
+ async baseInitialize(
122
+ args: SolautoClientArgs,
123
+ lendingPlatform: LendingPlatform,
124
+ heliusApiKey: string
125
+ ) {
126
+ this.connection = new Connection(
127
+ `https://mainnet.helius-rpc.com/?api-key=${heliusApiKey}`,
128
+ "finalized"
129
+ );
130
+ this.umi = createUmi(this.connection).use({
131
+ install(umi) {
132
+ umi.programs.add(createSolautoProgram(), false);
133
+ },
134
+ });
125
135
  if (!args.signer && !args.wallet) {
126
136
  throw new Error("Signer or wallet must be provided");
127
137
  }
128
- this.umi = UMI.use(args.signer ? signerIdentity(args.signer) : walletAdapterIdentity(args.wallet!, true));
129
-
138
+ this.umi = this.umi.use(
139
+ args.signer
140
+ ? signerIdentity(args.signer)
141
+ : walletAdapterIdentity(args.wallet!, true)
142
+ );
143
+
130
144
  this.signer = this.umi.identity;
131
- this.authority = args.authority ?? toWeb3JsPublicKey(this.umi.identity.publicKey);
145
+ this.authority =
146
+ args.authority ?? toWeb3JsPublicKey(this.umi.identity.publicKey);
132
147
 
133
148
  this.positionId = args.positionId;
134
149
  this.selfManaged = this.positionId === 0;
@@ -282,7 +297,7 @@ export abstract class SolautoClient {
282
297
 
283
298
  async fetchExistingAuthorityLutAccounts(): Promise<PublicKey[]> {
284
299
  const lookupTable = this.authorityLutAddress
285
- ? await CONNECTION.getAddressLookupTable(this.authorityLutAddress)
300
+ ? await this.connection.getAddressLookupTable(this.authorityLutAddress)
286
301
  : null;
287
302
  if (lookupTable === null) {
288
303
  this.authorityLutAddress = undefined;
@@ -312,7 +327,7 @@ export abstract class SolautoClient {
312
327
  AddressLookupTableProgram.createLookupTable({
313
328
  authority: this.authority,
314
329
  payer: toWeb3JsPublicKey(this.signer.publicKey),
315
- recentSlot: await CONNECTION.getSlot({ commitment: "finalized" }),
330
+ recentSlot: await this.umi.rpc.getSlot({ commitment: "finalized" }),
316
331
  });
317
332
  this.authorityLutAddress = lookupTableAddress;
318
333
  tx = tx.add(getWrappedInstruction(this.signer, createLookupTableInst));
@@ -626,55 +641,6 @@ export abstract class SolautoClient {
626
641
  limitGapBps?: number
627
642
  ): TransactionBuilder;
628
643
 
629
- async positionStateWithLatestPrices(): Promise<PositionState | undefined> {
630
- if (!this.solautoPositionData) {
631
- return undefined;
632
- }
633
-
634
- const state = this.solautoPositionState ?? this.solautoPositionData.state;
635
- if (currentUnixSeconds() - Number(state.lastUpdated) > 60 * 60 * 24 * 7) {
636
- return this.getFreshPositionState();
637
- }
638
-
639
- const [supplyPrice, debtPrice] = await getTokenPrices([
640
- toWeb3JsPublicKey(state.supply.mint),
641
- toWeb3JsPublicKey(state.debt.mint),
642
- ]);
643
-
644
- const supplyUsd =
645
- fromBaseUnit(state.supply.amountUsed.baseUnit, state.supply.decimals) *
646
- supplyPrice;
647
- const debtUsd =
648
- fromBaseUnit(state.debt.amountUsed.baseUnit, state.debt.decimals) *
649
- debtPrice;
650
- return {
651
- ...state,
652
- liqUtilizationRateBps: getLiqUtilzationRateBps(
653
- supplyUsd,
654
- debtUsd,
655
- state.liqThresholdBps
656
- ),
657
- netWorth: {
658
- ...state.netWorth,
659
- baseAmountUsdValue: toBaseUnit(supplyUsd - debtUsd, USD_DECIMALS),
660
- },
661
- supply: {
662
- ...state.supply,
663
- amountUsed: {
664
- ...state.supply.amountUsed,
665
- baseAmountUsdValue: toBaseUnit(supplyUsd, USD_DECIMALS),
666
- },
667
- },
668
- debt: {
669
- ...state.debt,
670
- amountUsed: {
671
- ...state.debt.amountUsed,
672
- baseAmountUsdValue: toBaseUnit(debtUsd, USD_DECIMALS),
673
- },
674
- },
675
- };
676
- }
677
-
678
644
  async getFreshPositionState(): Promise<PositionState | undefined> {
679
645
  if (
680
646
  Boolean(this.solautoPositionState) &&
@@ -98,12 +98,12 @@ export class SolautoMarginfiClient extends SolautoClient {
98
98
  public intermediaryMarginfiAccountPk!: PublicKey;
99
99
  public intermediaryMarginfiAccount?: MarginfiAccount;
100
100
 
101
- async initialize(args: SolautoMarginfiClientArgs) {
101
+ async initialize(args: SolautoMarginfiClientArgs, heliusApiKey: string) {
102
102
  if (args.marginfiAccount) {
103
103
  this.marginfiAccount = args.marginfiAccount;
104
104
  }
105
105
 
106
- await super.initialize(args, LendingPlatform.Marginfi);
106
+ await this.baseInitialize(args, LendingPlatform.Marginfi, heliusApiKey);
107
107
 
108
108
  this.marginfiAccountSeedIdx = args.marginfiAccountSeedIdx;
109
109
  this.marginfiAccount =
@@ -135,6 +135,7 @@ export class SolautoMarginfiClient extends SolautoClient {
135
135
  })!;
136
136
 
137
137
  const existingMarginfiAccounts = await getAllMarginfiAccountsByAuthority(
138
+ this.umi,
138
139
  toWeb3JsPublicKey(this.signer.publicKey)
139
140
  );
140
141
  const emptyMarginfiAccounts = existingMarginfiAccounts.filter(
@@ -481,15 +482,11 @@ export class SolautoMarginfiClient extends SolautoClient {
481
482
  return state;
482
483
  }
483
484
 
484
- const marginfiAccount = await safeFetchMarginfiAccount(
485
- this.umi,
486
- publicKey(this.marginfiAccountPk)
487
- );
488
-
489
485
  const freshState = await getMarginfiAccountPositionState(
486
+ this.umi,
490
487
  this.supplyLiquidityMint,
491
488
  this.debtLiquidityMint,
492
- marginfiAccount,
489
+ this.marginfiAccountPk,
493
490
  this.livePositionUpdates
494
491
  );
495
492
  this.log(freshState);
@@ -12,7 +12,7 @@ import {
12
12
  TOKEN_PROGRAM_ID,
13
13
  } from "@solana/spl-token";
14
14
  // import { JitoRpcConnection } from "jito-ts";
15
- import { createSolautoProgram, SOLAUTO_PROGRAM_ID } from "../generated";
15
+ import { SOLAUTO_PROGRAM_ID } from "../generated";
16
16
  import { SOLAUTO_MANAGER } from "./generalAccounts";
17
17
 
18
18
  export const DEFAULT_RISK_AVERSION_BPS = 1500;
@@ -20,21 +20,11 @@ export const DEFAULT_LIMIT_GAP_BPS = 1000;
20
20
  export const MIN_POSITION_STATE_FRESHNESS_SECS = 5;
21
21
  export const MAX_REPAY_GAP_BPS = 100;
22
22
 
23
- export const CONNECTION = new Connection(
24
- `https://mainnet.helius-rpc.com/?api-key=${process.env.HELIUS_API_KEY}`,
25
- "finalized"
26
- );
27
-
28
23
  // export const JITO_BLOCK_ENGINE = "ny.mainnet.block-engine.jito.wtf";
29
24
  // export const JITO_CONNECTION = new JitoRpcConnection(
30
25
  // `https://${JITO_BLOCK_ENGINE}`,
31
26
  // "finalized"
32
27
  // );
33
- export const UMI = createUmi(CONNECTION).use({
34
- install(umi) {
35
- umi.programs.add(createSolautoProgram(), false);
36
- },
37
- });
38
28
 
39
29
  export const PRICES: { [key: string]: { price: number; time: number; } } = {};
40
30
 
@@ -1,6 +1,7 @@
1
1
  import {
2
2
  Signer,
3
3
  TransactionBuilder,
4
+ Umi,
4
5
  publicKey,
5
6
  transactionBuilder,
6
7
  } from "@metaplex-foundation/umi";
@@ -39,7 +40,6 @@ import {
39
40
  rpcAccountCreated,
40
41
  } from "../utils/generalUtils";
41
42
  import { SolautoMarginfiClient } from "../clients/solautoMarginfiClient";
42
- import { UMI } from "../constants/solautoConstants";
43
43
  import { uint8ArrayToBigInt } from "../utils/numberUtils";
44
44
  import {
45
45
  eligibileForRebalance,
@@ -121,7 +121,7 @@ async function transactionChoresBefore(
121
121
  undefined
122
122
  );
123
123
  if (wSolUsage !== undefined) {
124
- if (!getSolanaAccountCreated(wSolUsage.wSolTokenAccount)) {
124
+ if (!getSolanaAccountCreated(client.umi, wSolUsage.wSolTokenAccount)) {
125
125
  client.log(`Closing signer wSol TA`);
126
126
  chores = chores.add(
127
127
  closeTokenAccountUmiIx(
@@ -150,7 +150,7 @@ async function transactionChoresBefore(
150
150
  if (amountToTransfer > 0) {
151
151
  const amount =
152
152
  amountToTransfer +
153
- (await UMI.rpc.getRent(TOKEN_ACCOUNT_SIZE)).basisPoints;
153
+ (await client.umi.rpc.getRent(TOKEN_ACCOUNT_SIZE)).basisPoints;
154
154
  client.log(`Transferring ${amount} lamports to signer wSol TA`);
155
155
  chores = chores.add(
156
156
  systemTransferUmiIx(client.signer, wSolUsage.wSolTokenAccount, amount)
@@ -183,7 +183,7 @@ async function transactionChoresBefore(
183
183
  continue;
184
184
  }
185
185
 
186
- if (!getSolanaAccountCreated(tokenAccount)) {
186
+ if (!getSolanaAccountCreated(client.umi, tokenAccount)) {
187
187
  chores = chores.add(
188
188
  createAssociatedTokenAccountUmiIx(
189
189
  client.signer,
@@ -229,7 +229,7 @@ export async function rebalanceChoresBefore(
229
229
  ];
230
230
 
231
231
  const [referredBySupplyTa, solautoFeesSupplyTa, intermediaryMarginfiAccount] =
232
- await UMI.rpc.getAccounts(
232
+ await client.umi.rpc.getAccounts(
233
233
  accountsNeeded.map((x) => publicKey(x ?? PublicKey.default))
234
234
  );
235
235
 
@@ -482,12 +482,12 @@ export async function buildSolautoRebalanceTransaction(
482
482
  }
483
483
 
484
484
  export async function convertReferralFeesToDestination(
485
+ umi: Umi,
485
486
  referralState: ReferralState,
486
487
  tokenAccount: SplTokenAccount,
487
- signer: Signer
488
488
  ): Promise<[TransactionBuilder, string[]]> {
489
489
  const { lookupTableAddresses, setupInstructions, swapIx } =
490
- await getJupSwapTransaction(signer, {
490
+ await getJupSwapTransaction(umi.identity, {
491
491
  amount: tokenAccount.amount,
492
492
  destinationWallet: toWeb3JsPublicKey(referralState.publicKey),
493
493
  inputMint: tokenAccount.mint,
@@ -499,12 +499,12 @@ export async function convertReferralFeesToDestination(
499
499
  let tx = transactionBuilder()
500
500
  .add(setupInstructions)
501
501
  .add(
502
- convertReferralFees(UMI, {
503
- signer,
502
+ convertReferralFees(umi, {
503
+ signer: umi.identity,
504
504
  intermediaryTa: publicKey(
505
505
  getTokenAccount(
506
- toWeb3JsPublicKey(signer.publicKey),
507
- toWeb3JsPublicKey(referralState.destFeesMint)
506
+ toWeb3JsPublicKey(umi.identity.publicKey),
507
+ tokenAccount.mint
508
508
  )
509
509
  ),
510
510
  ixsSysvar: publicKey(SYSVAR_INSTRUCTIONS_PUBKEY),
@@ -9,7 +9,6 @@ import {
9
9
  getAdressLookupInputs,
10
10
  sendSingleOptimizedTransaction,
11
11
  } from "../utils/solanaUtils";
12
- import { UMI } from "../constants/solautoConstants";
13
12
  import { retryWithExponentialBackoff } from "../utils/generalUtils";
14
13
  import { getTransactionChores } from "./transactionUtils";
15
14
  // import { sendJitoBundledTransactions } from "../utils/jitoUtils";
@@ -35,7 +34,10 @@ class LookupTables {
35
34
  (x) => !currentCacheAddresses.includes(x)
36
35
  );
37
36
  if (missingAddresses) {
38
- const additionalInputs = await getAdressLookupInputs(missingAddresses);
37
+ const additionalInputs = await getAdressLookupInputs(
38
+ this.client.umi,
39
+ missingAddresses
40
+ );
39
41
  this.cache.push(...additionalInputs);
40
42
  }
41
43
 
@@ -110,7 +112,7 @@ class TransactionSet {
110
112
  ...item.lookupTableAddresses,
111
113
  ])
112
114
  )
113
- .fitsInOneTransaction(UMI);
115
+ .fitsInOneTransaction(this.client.umi);
114
116
  }
115
117
 
116
118
  add(...items: TransactionItem[]) {
@@ -202,9 +204,9 @@ export class TransactionsManager {
202
204
  const transaction = item.tx.setAddressLookupTables(
203
205
  await this.lookupTables.getLutInputs(item.lookupTableAddresses)
204
206
  );
205
- if (!transaction.fitsInOneTransaction(UMI)) {
207
+ if (!transaction.fitsInOneTransaction(this.client.umi)) {
206
208
  throw new Error(
207
- `Transaction exceeds max transaction size (${transaction.getTransactionSize(UMI)})`
209
+ `Transaction exceeds max transaction size (${transaction.getTransactionSize(this.client.umi)})`
208
210
  );
209
211
  } else {
210
212
  let newSet = new TransactionSet(this.client, this.lookupTables, [item]);
@@ -246,7 +248,8 @@ export class TransactionsManager {
246
248
  await retryWithExponentialBackoff(
247
249
  async (attemptNum) =>
248
250
  await sendSingleOptimizedTransaction(
249
- this.client,
251
+ this.client.umi,
252
+ this.client.connection,
250
253
  updateLookupTable.updateLutTx,
251
254
  this.simulateOnly,
252
255
  attemptNum
@@ -353,7 +356,8 @@ export class TransactionsManager {
353
356
  } else {
354
357
  this.updateStatus(itemSet.name(), TransactionStatus.Processing);
355
358
  const txSig = await sendSingleOptimizedTransaction(
356
- this.client,
359
+ this.client.umi,
360
+ this.client.connection,
357
361
  tx,
358
362
  this.simulateOnly,
359
363
  attemptNum