@haven-fi/solauto-sdk 1.0.299 → 1.0.301

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 (39) hide show
  1. package/dist/clients/solautoMarginfiClient.d.ts.map +1 -1
  2. package/dist/clients/solautoMarginfiClient.js +3 -3
  3. package/dist/constants/marginfiAccounts.d.ts.map +1 -1
  4. package/dist/constants/marginfiAccounts.js +69 -13
  5. package/dist/constants/pythConstants.d.ts +2 -2
  6. package/dist/constants/pythConstants.js +2 -2
  7. package/dist/constants/switchboardConstants.d.ts +4 -0
  8. package/dist/constants/switchboardConstants.d.ts.map +1 -0
  9. package/dist/constants/switchboardConstants.js +35 -0
  10. package/dist/constants/tokenConstants.d.ts +9 -2
  11. package/dist/constants/tokenConstants.d.ts.map +1 -1
  12. package/dist/constants/tokenConstants.js +54 -16
  13. package/dist/idls/switchboard.json +1 -0
  14. package/dist/transactions/transactionUtils.d.ts.map +1 -1
  15. package/dist/transactions/transactionUtils.js +1 -1
  16. package/dist/utils/generalUtils.d.ts +5 -2
  17. package/dist/utils/generalUtils.d.ts.map +1 -1
  18. package/dist/utils/generalUtils.js +54 -7
  19. package/dist/utils/marginfiUtils.d.ts +4 -4
  20. package/dist/utils/marginfiUtils.d.ts.map +1 -1
  21. package/dist/utils/marginfiUtils.js +16 -12
  22. package/dist/utils/solauto/generalUtils.d.ts +3 -3
  23. package/dist/utils/solauto/generalUtils.d.ts.map +1 -1
  24. package/dist/utils/solauto/generalUtils.js +4 -4
  25. package/local/createFeeAccounts.ts +52 -0
  26. package/local/shared.ts +1 -1
  27. package/package.json +5 -2
  28. package/src/clients/solautoMarginfiClient.ts +3 -0
  29. package/src/constants/marginfiAccounts.ts +70 -13
  30. package/src/constants/pythConstants.ts +4 -4
  31. package/src/constants/switchboardConstants.ts +10 -0
  32. package/src/constants/tokenConstants.ts +55 -15
  33. package/src/idls/switchboard.json +1 -0
  34. package/src/transactions/transactionUtils.ts +1 -0
  35. package/src/utils/generalUtils.ts +93 -10
  36. package/src/utils/marginfiUtils.ts +20 -8
  37. package/src/utils/solauto/generalUtils.ts +6 -3
  38. package/tests/transactions/solautoMarginfi.ts +1 -1
  39. package/tests/unit/rebalanceCalculations.ts +6 -2
@@ -1,4 +1,4 @@
1
- import { PublicKey } from "@solana/web3.js";
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
2
  import { MaybeRpcAccount, Umi, PublicKey as UmiPublicKey } from "@metaplex-foundation/umi";
3
3
  export declare function consoleLog(...args: any[]): void;
4
4
  export declare function generateRandomU8(): number;
@@ -7,7 +7,10 @@ export declare function currentUnixSeconds(): number;
7
7
  export declare function getSolanaAccountCreated(umi: Umi, pk: PublicKey): Promise<boolean>;
8
8
  export declare function rpcAccountCreated(account: MaybeRpcAccount): boolean;
9
9
  export declare function arraysAreEqual(arrayA: number[], arrayB: number[]): boolean;
10
- export declare function fetchTokenPrices(mints: PublicKey[]): Promise<number[]>;
10
+ export declare function zip<T, U>(list1: T[], list2: U[]): [T, U][];
11
+ export declare function fetchTokenPrices(conn: Connection, mints: PublicKey[]): Promise<number[]>;
12
+ export declare function getPythPrices(mints: PublicKey[]): Promise<number[]>;
13
+ export declare function getSwitchboardPrices(conn: Connection, mints: PublicKey[]): Promise<number[]>;
11
14
  export declare function safeGetPrice(mint: PublicKey | UmiPublicKey | undefined): number | undefined;
12
15
  export type ErrorsToThrow = Array<new (...args: any[]) => Error>;
13
16
  export declare function retryWithExponentialBackoff<T>(fn: (attemptNum: number, prevErr?: Error) => Promise<T>, retries?: number, delay?: number, errorsToThrow?: ErrorsToThrow): Promise<T>;
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AACD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAsD5E;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../src/utils/generalUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,SAAS,EAGV,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,eAAe,EAEf,GAAG,EACH,SAAS,IAAI,YAAY,EAC1B,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAI/C;AACD,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAO1C;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,GAAG,EACR,EAAE,EAAE,SAAS,GACZ,OAAO,CAAC,OAAO,CAAC,CAKlB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAEnE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAU1E;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAS1D;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,GACjB,OAAO,CAAC,MAAM,EAAE,CAAC,CAqCnB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,SAAS,EAAE,qBAoCrD;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,qBA8BnB;AAED,wBAAgB,YAAY,CAC1B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GACzC,MAAM,GAAG,SAAS,CAKpB;AAED,MAAM,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC,CAAC;AAEjE,wBAAgB,2BAA2B,CAAC,CAAC,EAC3C,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,EACvD,OAAO,GAAE,MAAU,EACnB,KAAK,GAAE,MAAY,EACnB,aAAa,CAAC,EAAE,aAAa,GAC5B,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
@@ -1,4 +1,7 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
6
  exports.consoleLog = consoleLog;
4
7
  exports.generateRandomU8 = generateRandomU8;
@@ -7,13 +10,21 @@ exports.currentUnixSeconds = currentUnixSeconds;
7
10
  exports.getSolanaAccountCreated = getSolanaAccountCreated;
8
11
  exports.rpcAccountCreated = rpcAccountCreated;
9
12
  exports.arraysAreEqual = arraysAreEqual;
13
+ exports.zip = zip;
10
14
  exports.fetchTokenPrices = fetchTokenPrices;
15
+ exports.getPythPrices = getPythPrices;
16
+ exports.getSwitchboardPrices = getSwitchboardPrices;
11
17
  exports.safeGetPrice = safeGetPrice;
12
18
  exports.retryWithExponentialBackoff = retryWithExponentialBackoff;
19
+ const web3_js_1 = require("@solana/web3.js");
13
20
  const umi_1 = require("@metaplex-foundation/umi");
14
21
  const pythConstants_1 = require("../constants/pythConstants");
15
22
  const numberUtils_1 = require("./numberUtils");
16
23
  const solautoConstants_1 = require("../constants/solautoConstants");
24
+ const on_demand_1 = require("@switchboard-xyz/on-demand");
25
+ const anchor_1 = require("@coral-xyz/anchor");
26
+ const switchboard_json_1 = __importDefault(require("../idls/switchboard.json"));
27
+ const switchboardConstants_1 = require("../constants/switchboardConstants");
17
28
  function consoleLog(...args) {
18
29
  if (globalThis.LOCAL_TEST) {
19
30
  console.log(...args);
@@ -53,12 +64,39 @@ function arraysAreEqual(arrayA, arrayB) {
53
64
  }
54
65
  return true;
55
66
  }
56
- async function fetchTokenPrices(mints) {
67
+ function zip(list1, list2) {
68
+ const minLength = Math.min(list1.length, list2.length);
69
+ const result = [];
70
+ for (let i = 0; i < minLength; i++) {
71
+ result.push([list1[i], list2[i]]);
72
+ }
73
+ return result;
74
+ }
75
+ async function fetchTokenPrices(conn, mints) {
57
76
  const currentTime = currentUnixSeconds();
58
77
  if (!mints.some((mint) => !(mint.toString() in solautoConstants_1.PRICES) ||
59
78
  currentTime - solautoConstants_1.PRICES[mint.toString()].time > 3)) {
60
79
  return mints.map((mint) => solautoConstants_1.PRICES[mint.toString()].price);
61
80
  }
81
+ const pythMints = mints.filter((x) => x.toString() in pythConstants_1.PYTH_PRICE_FEED_IDS);
82
+ const switchboardMints = mints.filter((x) => x.toString() in switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS);
83
+ const [pythData, switchboardData] = await Promise.all([
84
+ zip(pythMints, await getPythPrices(pythMints)),
85
+ zip(switchboardMints, await getSwitchboardPrices(conn, switchboardMints)),
86
+ ]);
87
+ const prices = mints.map((mint) => {
88
+ const item = [...pythData, ...switchboardData].find((data) => data[0].equals(mint));
89
+ return item ? item[1] : 0;
90
+ });
91
+ for (var i = 0; i < mints.length; i++) {
92
+ solautoConstants_1.PRICES[mints[i].toString()] = {
93
+ price: prices[i],
94
+ time: currentUnixSeconds(),
95
+ };
96
+ }
97
+ return prices;
98
+ }
99
+ async function getPythPrices(mints) {
62
100
  const priceFeedIds = mints.map((mint) => pythConstants_1.PYTH_PRICE_FEED_IDS[mint.toString()]);
63
101
  const getReq = async () => await fetch(`https://hermes.pyth.network/v2/updates/price/latest?${priceFeedIds.map((x) => `ids%5B%5D=${x}`).join("&")}`);
64
102
  const prices = await retryWithExponentialBackoff(async () => {
@@ -81,14 +119,23 @@ async function fetchTokenPrices(mints) {
81
119
  });
82
120
  return prices;
83
121
  }, 5, 200);
84
- for (var i = 0; i < mints.length; i++) {
85
- solautoConstants_1.PRICES[mints[i].toString()] = {
86
- price: prices[i],
87
- time: currentUnixSeconds(),
88
- };
89
- }
90
122
  return prices;
91
123
  }
124
+ async function getSwitchboardPrices(conn, mints) {
125
+ const dummyWallet = {
126
+ publicKey: new web3_js_1.PublicKey("11111111111111111111111111111111"),
127
+ signTransaction: async (tx) => tx,
128
+ signAllTransactions: async (txs) => txs,
129
+ };
130
+ const provider = new anchor_1.AnchorProvider(conn, dummyWallet, anchor_1.AnchorProvider.defaultOptions());
131
+ const program = new anchor_1.Program(switchboard_json_1.default, provider);
132
+ const results = await Promise.all(mints.map(async (mint) => {
133
+ const feed = new on_demand_1.PullFeed(program, new web3_js_1.PublicKey(switchboardConstants_1.SWITCHBOARD_PRICE_FEED_IDS[mint.toString()]));
134
+ const result = await feed.loadData();
135
+ return Number(result.result.value) / Math.pow(10, 18);
136
+ }));
137
+ return results;
138
+ }
92
139
  function safeGetPrice(mint) {
93
140
  if (mint && mint?.toString() in solautoConstants_1.PRICES) {
94
141
  return solautoConstants_1.PRICES[mint.toString()].price;
@@ -1,4 +1,4 @@
1
- import { PublicKey } from "@solana/web3.js";
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
2
  import { Umi } from "@metaplex-foundation/umi";
3
3
  import { Bank, MarginfiAccount } from "../marginfi-sdk";
4
4
  import { MarginfiAssetAccounts } from "../types/accounts";
@@ -9,14 +9,14 @@ interface AllMarginfiAssetAccounts extends MarginfiAssetAccounts {
9
9
  }
10
10
  export declare function findMarginfiAccounts(bank: PublicKey): AllMarginfiAssetAccounts;
11
11
  export declare function calcMaxLtvAndLiqThreshold(supplyBank: Bank, debtBank: Bank, supplyPrice: number): [number, number];
12
- export declare function getMaxLtvAndLiqThreshold(umi: Umi, marginfiGroup: PublicKey, supply: {
12
+ export declare function getMaxLtvAndLiqThreshold(conn: Connection, umi: Umi, marginfiGroup: PublicKey, supply: {
13
13
  mint: PublicKey;
14
14
  bank?: Bank | null;
15
15
  }, debt: {
16
16
  mint: PublicKey;
17
17
  bank?: Bank | null;
18
18
  }, supplyPrice?: number): Promise<[number, number]>;
19
- export declare function getAllMarginfiAccountsByAuthority(umi: Umi, authority: PublicKey, compatibleWithSolauto?: boolean): Promise<{
19
+ export declare function getAllMarginfiAccountsByAuthority(conn: Connection, umi: Umi, authority: PublicKey, compatibleWithSolauto?: boolean): Promise<{
20
20
  marginfiAccount: PublicKey;
21
21
  supplyMint?: PublicKey;
22
22
  debtMint?: PublicKey;
@@ -30,7 +30,7 @@ type BanksCache = {
30
30
  [mint: string]: Bank;
31
31
  };
32
32
  };
33
- export declare function getMarginfiAccountPositionState(umi: Umi, protocolAccount: {
33
+ export declare function getMarginfiAccountPositionState(conn: Connection, umi: Umi, protocolAccount: {
34
34
  pk: PublicKey;
35
35
  data?: MarginfiAccount;
36
36
  }, marginfiGroup?: PublicKey, supply?: BankSelection, debt?: BankSelection, livePositionUpdates?: LivePositionUpdates): Promise<PositionState | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAGJ,eAAe,EAGhB,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,SAAS,GAAG,wBAAwB,CAY9E;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwC3B;AAED,wBAAsB,iCAAiC,CACrD,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CAwDA;AA6DD,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,KAAK,UAAU,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhE,wBAAsB,+BAA+B,CACnD,GAAG,EAAE,GAAG,EACR,eAAe,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,EAC1D,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA0LpC;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,oBAU7C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgB3B"}
1
+ {"version":3,"file":"marginfiUtils.d.ts","sourceRoot":"","sources":["../../src/utils/marginfiUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAa,GAAG,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,EACL,IAAI,EAGJ,eAAe,EAGhB,MAAM,iBAAiB,CAAC;AAiBzB,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAsB,MAAM,cAAc,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,UAAU,wBAAyB,SAAQ,qBAAqB;IAC9D,IAAI,EAAE,SAAS,CAAC;CACjB;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,SAAS,GACd,wBAAwB,CAY1B;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,WAAW,EAAE,MAAM,GAClB,CAAC,MAAM,EAAE,MAAM,CAAC,CA6BlB;AAED,wBAAsB,wBAAwB,CAC5C,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,GAAG,EACR,aAAa,EAAE,SAAS,EACxB,MAAM,EAAE;IACN,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,IAAI,EAAE;IACJ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;CACpB,EACD,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwC3B;AAED,wBAAsB,iCAAiC,CACrD,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,qBAAqB,CAAC,EAAE,OAAO,GAC9B,OAAO,CACR;IAAE,eAAe,EAAE,SAAS,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,CAC/E,CAuDA;AAgED,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,UAAU,CAAC,EAAE,UAAU,CAAC;CACzB;AAED,KAAK,UAAU,GAAG;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,CAAC;AAEhE,wBAAsB,+BAA+B,CACnD,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,GAAG,EACR,eAAe,EAAE;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,EAC1D,aAAa,CAAC,EAAE,SAAS,EACzB,MAAM,CAAC,EAAE,aAAa,EACtB,IAAI,CAAC,EAAE,aAAa,EACpB,mBAAmB,CAAC,EAAE,mBAAmB,GACxC,OAAO,CAAC,aAAa,GAAG,SAAS,CAAC,CA+LpC;AA+DD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,oBAU7C;AAED,wBAAsB,sBAAsB,CAC1C,IAAI,EAAE,IAAI,GACT,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAgB3B"}
@@ -42,7 +42,7 @@ function calcMaxLtvAndLiqThreshold(supplyBank, debtBank, supplyPrice) {
42
42
  }
43
43
  return [maxLtv, liqThreshold];
44
44
  }
45
- async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supplyPrice) {
45
+ async function getMaxLtvAndLiqThreshold(conn, umi, marginfiGroup, supply, debt, supplyPrice) {
46
46
  if (!supply.bank && supply.mint.equals(web3_js_1.PublicKey.default)) {
47
47
  return [0, 0];
48
48
  }
@@ -54,7 +54,7 @@ async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supply
54
54
  debt.bank = await (0, marginfi_sdk_1.safeFetchBank)(umi, (0, umi_1.publicKey)(marginfiAccounts_1.MARGINFI_ACCOUNTS[marginfiGroup.toString()][debt.mint.toString()].bank), { commitment: "confirmed" });
55
55
  }
56
56
  if (!supplyPrice) {
57
- const [price] = await (0, generalUtils_1.fetchTokenPrices)([
57
+ const [price] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
58
58
  (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supply.bank.mint),
59
59
  ]);
60
60
  supplyPrice = price;
@@ -64,7 +64,7 @@ async function getMaxLtvAndLiqThreshold(umi, marginfiGroup, supply, debt, supply
64
64
  }
65
65
  return calcMaxLtvAndLiqThreshold(supply.bank, debt.bank, supplyPrice);
66
66
  }
67
- async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithSolauto) {
67
+ async function getAllMarginfiAccountsByAuthority(conn, umi, authority, compatibleWithSolauto) {
68
68
  const marginfiAccounts = await umi.rpc.getProgramAccounts(marginfi_sdk_1.MARGINFI_PROGRAM_ID, {
69
69
  commitment: "confirmed",
70
70
  dataSlice: {
@@ -86,7 +86,9 @@ async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithS
86
86
  if (compatibleWithSolauto) {
87
87
  const positionStates = await Promise.all(marginfiAccounts.map(async (x) => ({
88
88
  publicKey: x.publicKey,
89
- state: await getMarginfiAccountPositionState(umi, { pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey) }),
89
+ state: await getMarginfiAccountPositionState(conn, umi, {
90
+ pk: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey),
91
+ }),
90
92
  })));
91
93
  return positionStates
92
94
  .sort((a, b) => (0, numberUtils_1.fromBaseUnit)(b.state?.netWorth.baseAmountUsdValue ?? BigInt(0), generalAccounts_1.USD_DECIMALS) -
@@ -104,12 +106,14 @@ async function getAllMarginfiAccountsByAuthority(umi, authority, compatibleWithS
104
106
  }));
105
107
  }
106
108
  }
107
- async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
109
+ async function getTokenUsage(conn, bank, isAsset, shares, amountUsedAdjustment) {
108
110
  let amountUsed = 0;
109
111
  let amountCanBeUsed = 0;
110
112
  let marketPrice = 0;
111
113
  if (bank !== null) {
112
- [marketPrice] = await (0, generalUtils_1.fetchTokenPrices)([(0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.mint)]);
114
+ [marketPrice] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
115
+ (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(bank.mint),
116
+ ]);
113
117
  const [assetShareValue, liabilityShareValue] = await getUpToDateShareValues(bank);
114
118
  const shareValue = isAsset ? assetShareValue : liabilityShareValue;
115
119
  amountUsed = shares * shareValue + Number(amountUsedAdjustment ?? 0);
@@ -143,7 +147,7 @@ async function getTokenUsage(bank, isAsset, shares, amountUsedAdjustment) {
143
147
  padding: new Uint8Array([]),
144
148
  };
145
149
  }
146
- async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGroup, supply, debt, livePositionUpdates) {
150
+ async function getMarginfiAccountPositionState(conn, umi, protocolAccount, marginfiGroup, supply, debt, livePositionUpdates) {
147
151
  let marginfiAccount = protocolAccount.data ??
148
152
  (await (0, marginfi_sdk_1.safeFetchMarginfiAccount)(umi, (0, umi_1.publicKey)(protocolAccount.pk), {
149
153
  commitment: "confirmed",
@@ -186,7 +190,7 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
186
190
  if (!supply.mint) {
187
191
  supply.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint);
188
192
  }
189
- supplyUsage = await getTokenUsage(supplyBank, true, (0, numberUtils_1.bytesToI80F48)(supplyBalances[0].assetShares.value), livePositionUpdates?.supplyAdjustment);
193
+ supplyUsage = await getTokenUsage(conn, supplyBank, true, (0, numberUtils_1.bytesToI80F48)(supplyBalances[0].assetShares.value), livePositionUpdates?.supplyAdjustment);
190
194
  }
191
195
  if (debtBalances.length > 0) {
192
196
  if (debtBank === null) {
@@ -197,7 +201,7 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
197
201
  if (!debt.mint) {
198
202
  debt.mint = (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(debtBank.mint);
199
203
  }
200
- debtUsage = await getTokenUsage(debtBank, false, (0, numberUtils_1.bytesToI80F48)(debtBalances[0].liabilityShares.value), livePositionUpdates?.debtAdjustment);
204
+ debtUsage = await getTokenUsage(conn, debtBank, false, (0, numberUtils_1.bytesToI80F48)(debtBalances[0].liabilityShares.value), livePositionUpdates?.debtAdjustment);
201
205
  }
202
206
  }
203
207
  if (supplyBank === null) {
@@ -208,17 +212,17 @@ async function getMarginfiAccountPositionState(umi, protocolAccount, marginfiGro
208
212
  return undefined;
209
213
  }
210
214
  if (!supplyUsage) {
211
- supplyUsage = await getTokenUsage(supplyBank, true, 0, livePositionUpdates?.supplyAdjustment);
215
+ supplyUsage = await getTokenUsage(conn, supplyBank, true, 0, livePositionUpdates?.supplyAdjustment);
212
216
  }
213
217
  if (constants_1.TOKEN_INFO[supplyBank.mint.toString()].isStableCoin &&
214
218
  (debtBank === null || constants_1.TOKEN_INFO[debtBank.mint.toString()].isStableCoin)) {
215
219
  return undefined;
216
220
  }
217
221
  if (!debtUsage) {
218
- debtUsage = await getTokenUsage(debtBank, false, 0, livePositionUpdates?.debtAdjustment);
222
+ debtUsage = await getTokenUsage(conn, debtBank, false, 0, livePositionUpdates?.debtAdjustment);
219
223
  }
220
224
  const supplyPrice = (0, generalUtils_1.safeGetPrice)(supply.mint);
221
- let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
225
+ let [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(conn, umi, marginfiGroup ?? new web3_js_1.PublicKey(marginfiAccounts_1.DEFAULT_MARGINFI_GROUP), {
222
226
  mint: (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(supplyBank.mint),
223
227
  bank: supplyBank,
224
228
  }, {
@@ -1,4 +1,4 @@
1
- import { PublicKey } from "@solana/web3.js";
1
+ import { Connection, PublicKey } from "@solana/web3.js";
2
2
  import { Program, Umi } from "@metaplex-foundation/umi";
3
3
  import { AutomationSettings, DCASettings, DCASettingsInpArgs, PositionState, PositionType, SolautoSettingsParameters, SolautoSettingsParametersInpArgs, TokenType } from "../../generated";
4
4
  import { RebalanceAction, SolautoPositionDetails } from "../../types/solauto";
@@ -12,8 +12,8 @@ export declare function eligibleForRefresh(positionState: PositionState, positio
12
12
  export declare function getSolautoManagedPositions(umi: Umi, authority?: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
13
13
  export declare function getAllReferralStates(umi: Umi): Promise<PublicKey[]>;
14
14
  export declare function getReferralsByUser(umi: Umi, user: PublicKey): Promise<PublicKey[]>;
15
- export declare function getAllPositionsByAuthority(umi: Umi, user: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
16
- export declare function positionStateWithLatestPrices(state: PositionState, supplyPrice?: number, debtPrice?: number): Promise<PositionState>;
15
+ export declare function getAllPositionsByAuthority(conn: Connection, umi: Umi, user: PublicKey, positionTypeFilter?: PositionType): Promise<SolautoPositionDetails[]>;
16
+ export declare function positionStateWithLatestPrices(conn: Connection, state: PositionState, supplyPrice?: number, debtPrice?: number): Promise<PositionState>;
17
17
  interface AssetProps {
18
18
  mint: PublicKey;
19
19
  price?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"generalUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/solauto/generalUtils.ts"],"names":[],"mappings":"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"}
@@ -225,7 +225,7 @@ async function getReferralsByUser(umi, user) {
225
225
  });
226
226
  return accounts.map((x) => (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(x.publicKey));
227
227
  }
228
- async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
228
+ async function getAllPositionsByAuthority(conn, umi, user, positionTypeFilter) {
229
229
  const solautoCompatiblePositions = await Promise.all([
230
230
  (async () => {
231
231
  const solautoManagedPositions = await getSolautoManagedPositions(umi, user, positionTypeFilter);
@@ -238,7 +238,7 @@ async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
238
238
  if (positionTypeFilter === generated_1.PositionType.SafeLoan) {
239
239
  return [];
240
240
  }
241
- let marginfiPositions = await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(umi, user, true);
241
+ let marginfiPositions = await (0, marginfiUtils_1.getAllMarginfiAccountsByAuthority)(conn, umi, user, true);
242
242
  marginfiPositions = marginfiPositions.filter((x) => x.supplyMint &&
243
243
  (x.debtMint.equals(web3_js_1.PublicKey.default) ||
244
244
  constants_1.ALL_SUPPORTED_TOKENS.includes(x.debtMint.toString())));
@@ -256,9 +256,9 @@ async function getAllPositionsByAuthority(umi, user, positionTypeFilter) {
256
256
  ]);
257
257
  return solautoCompatiblePositions.flat();
258
258
  }
259
- async function positionStateWithLatestPrices(state, supplyPrice, debtPrice) {
259
+ async function positionStateWithLatestPrices(conn, state, supplyPrice, debtPrice) {
260
260
  if (!supplyPrice || !debtPrice) {
261
- [supplyPrice, debtPrice] = await (0, generalUtils_1.fetchTokenPrices)([
261
+ [supplyPrice, debtPrice] = await (0, generalUtils_1.fetchTokenPrices)(conn, [
262
262
  (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.supply.mint),
263
263
  (0, umi_web3js_adapters_1.toWeb3JsPublicKey)(state.debt.mint),
264
264
  ]);
@@ -0,0 +1,52 @@
1
+ import { PublicKey } from "@solana/web3.js";
2
+ import { ALL_SUPPORTED_TOKENS, SOLAUTO_FEES_WALLET } from "../src/constants";
3
+ import {
4
+ buildHeliusApiUrl,
5
+ createAssociatedTokenAccountUmiIx,
6
+ getSolanaRpcConnection,
7
+ getTokenAccount,
8
+ sendSingleOptimizedTransaction,
9
+ zip,
10
+ } from "../src/utils";
11
+ import { getSecretKey } from "./shared";
12
+ import {
13
+ createSignerFromKeypair,
14
+ publicKey,
15
+ signerIdentity,
16
+ transactionBuilder,
17
+ } from "@metaplex-foundation/umi";
18
+
19
+ async function create() {
20
+ let [connection, umi] = getSolanaRpcConnection(
21
+ buildHeliusApiUrl(process.env.HELIUS_API_KEY!)
22
+ );
23
+
24
+ const secretKey = getSecretKey("solauto-auth");
25
+ const signerKeypair = umi.eddsa.createKeypairFromSecretKey(secretKey);
26
+ const signer = createSignerFromKeypair(umi, signerKeypair);
27
+
28
+ umi = umi.use(signerIdentity(signer));
29
+
30
+ const tokenAccounts = await umi.rpc.getAccounts(
31
+ ALL_SUPPORTED_TOKENS.map((x) =>
32
+ publicKey(getTokenAccount(SOLAUTO_FEES_WALLET, new PublicKey(x)))
33
+ )
34
+ );
35
+
36
+ for (const accounts of zip(tokenAccounts, ALL_SUPPORTED_TOKENS)) {
37
+ if (!accounts[0].exists) {
38
+ const tx = createAssociatedTokenAccountUmiIx(
39
+ signer,
40
+ SOLAUTO_FEES_WALLET,
41
+ new PublicKey(accounts[1])
42
+ );
43
+ await sendSingleOptimizedTransaction(
44
+ umi,
45
+ connection,
46
+ transactionBuilder().add(tx)
47
+ );
48
+ }
49
+ }
50
+ }
51
+
52
+ create();
package/local/shared.ts CHANGED
@@ -21,7 +21,7 @@ export function getSecretKey(keypairFilename: string = "id"): Uint8Array {
21
21
  );
22
22
  }
23
23
 
24
- const keypair = Keypair.fromSecretKey(getSecretKey());
24
+ const keypair = Keypair.fromSecretKey(getSecretKey("solauto-auth"));
25
25
  const [connection, _] = getSolanaRpcConnection(buildHeliusApiUrl(process.env.HELIUS_API_KEY ?? ""));
26
26
 
27
27
  async function createAndSendV0Tx(txInstructions: TransactionInstruction[]) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haven-fi/solauto-sdk",
3
- "version": "1.0.299",
3
+ "version": "1.0.301",
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",
@@ -12,9 +12,11 @@
12
12
  "test:unit": "ts-mocha -p ./tsconfig.json -t 1000000 tests/unit/**/*.ts",
13
13
  "test:all": "pnpm test:unit && pnpm test:txs",
14
14
  "update-lut:solauto": "npx ts-node local/updateSolautoLUT.ts",
15
- "update-lut:marginfi": "npx ts-node local/updateMarginfiLUT.ts"
15
+ "update-lut:marginfi": "npx ts-node local/updateMarginfiLUT.ts",
16
+ "create-fee-accounts": "npx ts-node local/createFeeAccounts.ts"
16
17
  },
17
18
  "dependencies": {
19
+ "@coral-xyz/anchor": "^0.30.1",
18
20
  "@jup-ag/api": "^6.0.24",
19
21
  "@metaplex-foundation/umi": "^0.9.1",
20
22
  "@metaplex-foundation/umi-bundle-defaults": "^0.9.1",
@@ -22,6 +24,7 @@
22
24
  "@metaplex-foundation/umi-web3js-adapters": "^0.9.1",
23
25
  "@solana/spl-token": "^0.4.0",
24
26
  "@solana/web3.js": "^1.95.4",
27
+ "@switchboard-xyz/on-demand": "^1.2.51",
25
28
  "bs58": "^5.0.0",
26
29
  "cross-fetch": "^4.0.0",
27
30
  "rpc-websockets": "7.11.0"
@@ -159,6 +159,7 @@ export class SolautoMarginfiClient extends SolautoClient {
159
159
  async setIntermediaryMarginfiDetails() {
160
160
  const existingMarginfiAccounts = (
161
161
  await getAllMarginfiAccountsByAuthority(
162
+ this.connection,
162
163
  this.umi,
163
164
  toWeb3JsPublicKey(this.signer.publicKey),
164
165
  false
@@ -227,6 +228,7 @@ export class SolautoMarginfiClient extends SolautoClient {
227
228
  return [0, 0];
228
229
  } else {
229
230
  const [maxLtv, liqThreshold] = await getMaxLtvAndLiqThreshold(
231
+ this.connection,
230
232
  this.umi,
231
233
  this.marginfiGroup,
232
234
  {
@@ -676,6 +678,7 @@ export class SolautoMarginfiClient extends SolautoClient {
676
678
  !toWeb3JsPublicKey(this.signer.publicKey).equals(this.authority));
677
679
 
678
680
  const freshState = await getMarginfiAccountPositionState(
681
+ this.connection,
679
682
  this.umi,
680
683
  { pk: this.marginfiAccountPk },
681
684
  this.marginfiGroup,
@@ -2,12 +2,15 @@ import { NATIVE_MINT } from "@solana/spl-token";
2
2
  import * as tokens from "./tokenConstants";
3
3
  import { MarginfiAssetAccounts } from "../types/accounts";
4
4
  import { PublicKey } from "@solana/web3.js";
5
+ import { SWITCHBOARD_PRICE_FEED_IDS } from "./switchboardConstants";
5
6
 
6
7
  export const DEFAULT_MARGINFI_GROUP =
7
8
  "4qp6Fx6tnZkY5Wropq9wUYgtFxXKwE6viZxFHg3rdAG8";
8
9
 
9
10
  export const DEFAULT_PUBKEY = PublicKey.default.toString();
10
11
 
12
+ const USDC_PRICE_ORACLE = "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX";
13
+
11
14
  export const MARGINFI_ACCOUNTS: {
12
15
  [group: string]: { [token: string]: MarginfiAssetAccounts };
13
16
  } = {
@@ -48,24 +51,24 @@ export const MARGINFI_ACCOUNTS: {
48
51
  vaultAuthority: "AEZb1XH5bfLwqk3hBKDuLfWyJKdLTgDPCkgn64BJKcvV",
49
52
  priceOracle: "DCNeMcAZGU7pAsqu5q2xMKerq35BnUuTkagt1dkR1xB",
50
53
  },
54
+ [tokens.H_SOL]: {
55
+ bank: "GJCi1uj3kYPZ64puA5sLUiCQfFapxT2xnREzrbDzFkYY",
56
+ liquidityVault: "8M97jkdr4rJtPnQ4yQ9stD6qVwaUvjrBdDPDbHJnPJLf",
57
+ vaultAuthority: "8x7mgTn5RvHR8Tn3CJqexSuQwrs6MLEy8csuXCDVvvpt",
58
+ priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.H_SOL.toString()],
59
+ },
60
+ [tokens.JUP_SOL]: {
61
+ bank: "8LaUZadNqtzuCG7iCvZd7d5cbquuYfv19KjAg6GPuuCb",
62
+ liquidityVault: "B1zjqKPoYp9bTMhzFADaAvjyGb49FMitLpi6P3Pa3YR6",
63
+ vaultAuthority: "93Qqsge2jHVsWLd8vas4cWghrsZJooMUr5JKN5DtcfMX",
64
+ priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.JUP_SOL.toString()],
65
+ },
51
66
  [tokens.JUP]: {
52
67
  bank: "Guu5uBc8k1WK1U2ihGosNaCy57LSgCkpWAabtzQqrQf8",
53
68
  liquidityVault: "4w49W4fNDn778wsBa6TNq9hvebZKU17ymsptrEZ8zrsm",
54
69
  vaultAuthority: "2MBwwAhL3c73Jy7HkWd9ofzh1bU39JBabrZCFQR2tUof",
55
70
  priceOracle: "7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5",
56
71
  },
57
- [tokens.BONK]: {
58
- bank: "DeyH7QxWvnbbaVB4zFrf4hoq7Q8z1ZT14co42BGwGtfM",
59
- liquidityVault: "7FdQsXmCW3N5JQbknj3F9Yqq73er9VZJjGhEEMS8Ct2A",
60
- vaultAuthority: "26kcZkdjJc94PdhqiLiEaGiLCYgAVVUfpDaZyK4cqih3",
61
- priceOracle: "DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX",
62
- },
63
- [tokens.WIF]: {
64
- bank: "9dpu8KL5ABYiD3WP2Cnajzg1XaotcJvZspv29Y1Y3tn1",
65
- liquidityVault: "4kT3EXc5dDVndUU9mV6EH3Jh3CSEvpcCZjuMkwqrtxUy",
66
- vaultAuthority: "9gNrvvZ9RuTyRWooiEEypwcXU6kyXW8yWuhXU8tWUH5L",
67
- priceOracle: "6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT",
68
- },
69
72
  [tokens.JTO]: {
70
73
  bank: "EdB7YADw4XUt6wErT8kHGCUok4mnTpWGzPUU9rWDebzb",
71
74
  liquidityVault: "3bY1DEkXodGmPMG5f7ABA12228MBG5JdAAKf5cgkB6G1",
@@ -106,7 +109,7 @@ export const MARGINFI_ACCOUNTS: {
106
109
  bank: "2s37akK2eyBbp8DZgCm7RtsaEz8eJP3Nxd4urLHQv7yB",
107
110
  liquidityVault: "7jaiZR5Sk8hdYN9MxTpczTcwbWpb5WEoxSANuUwveuat",
108
111
  vaultAuthority: "3uxNepDbmkDNq6JhRja5Z8QwbTrfmkKP8AKZV5chYDGG",
109
- priceOracle: "Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX",
112
+ priceOracle: USDC_PRICE_ORACLE,
110
113
  },
111
114
  [tokens.USDT]: {
112
115
  bank: "HmpMfL8942u22htC4EMiWgLX931g3sacXFR6KjuLgKLV",
@@ -114,6 +117,60 @@ export const MARGINFI_ACCOUNTS: {
114
117
  vaultAuthority: "9r6z6KgkEytHCdQWNxvDQH98PsfU98f1m5PCg47mY2XE",
115
118
  priceOracle: "HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM",
116
119
  },
120
+ [tokens.BONK]: {
121
+ bank: "DeyH7QxWvnbbaVB4zFrf4hoq7Q8z1ZT14co42BGwGtfM",
122
+ liquidityVault: "7FdQsXmCW3N5JQbknj3F9Yqq73er9VZJjGhEEMS8Ct2A",
123
+ vaultAuthority: "26kcZkdjJc94PdhqiLiEaGiLCYgAVVUfpDaZyK4cqih3",
124
+ priceOracle: "DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX",
125
+ },
126
+ [tokens.WIF]: {
127
+ bank: "9dpu8KL5ABYiD3WP2Cnajzg1XaotcJvZspv29Y1Y3tn1",
128
+ liquidityVault: "4kT3EXc5dDVndUU9mV6EH3Jh3CSEvpcCZjuMkwqrtxUy",
129
+ vaultAuthority: "9gNrvvZ9RuTyRWooiEEypwcXU6kyXW8yWuhXU8tWUH5L",
130
+ priceOracle: "6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT",
131
+ },
132
+ },
133
+ ["DQ2jqDJw9uzTwttf6h6r217BQ7kws3jZbJXDkfbCJa1q"]: {
134
+ [tokens.POPCAT]: {
135
+ bank: "845oEvt1oduoBj5zQxTr21cWWaUVnRjGerJuW3yMo2nn",
136
+ liquidityVault: "At6R64ip51zay4dT6k1WnVGETSMcaiY5vggD5DVTgxri",
137
+ vaultAuthority: "dNraDCWb5usDSoW4kD1Mi2E9WsNu6EABcQZqnrDfjNb",
138
+ priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.POPCAT.toString()],
139
+ },
140
+ [tokens.USDC]: {
141
+ bank: "EXrnNVfLagt3j4hCHSD9WqK75o6dkZBtjpnrSrSC78MA",
142
+ liquidityVault: "D9HSUYz3Rg2cTH65dUPaQS1MYxofNTeLecsAjiBgVPur",
143
+ vaultAuthority: "5ivKgJnxQ9CewJcKYSPQUiQFdfJki6YS87FqohnMSsFM",
144
+ priceOracle: USDC_PRICE_ORACLE,
145
+ },
146
+ },
147
+ ["EpzY5EYF1A5eFDRfjtsPXSYMPmEx1FXKaXPnouTMF4dm"]: {
148
+ [tokens.RETARDIO]: {
149
+ bank: "3J5rKmCi7JXG6qmiobFJyAidVTnnNAMGj4jomfBxKGRM",
150
+ liquidityVault: "863K9YPVT3xbUGFZevrQJLqMux3UdRkwNQ6usAp4hJyy",
151
+ vaultAuthority: "Qsv2rnNRdv59AwRU3YmGPMCTdKT41CDAKyYAr4srCJR",
152
+ priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.RETARDIO.toString()],
153
+ },
154
+ [tokens.USDC]: {
155
+ bank: "6cgYhBFWCc5sNHxkvSRhd5H9AdAHR41zKwuF37HmLry5",
156
+ liquidityVault: "7orVfNL5ZjqvdSaDgYLgBk4i5B3AnwFXNqqAvJbx6DFy",
157
+ vaultAuthority: "G4Azxk4PYtNRmDZkJppYo3rNAinkZXzYpQPG5dVDh4Nj",
158
+ priceOracle: USDC_PRICE_ORACLE,
159
+ },
160
+ },
161
+ ["G1rt3EpQ43K3bY457rhukQGRAo2QxydFAGRKqnjKzyr5"]: {
162
+ [tokens.BILLY]: {
163
+ bank: "Dj3PndQ3j1vuga5ApiFWWAfQ4h3wBtgS2SeLZBT2LD4g",
164
+ liquidityVault: "BRcRMDVPBQzXNXWtSS6bNotcGxhVsxfiAt1qf8nFVUpx",
165
+ vaultAuthority: "36SgFh1qBRyj1PEhsn7Kg9Sfwbrn7rHP7kvTM5o5n6AL",
166
+ priceOracle: SWITCHBOARD_PRICE_FEED_IDS[tokens.BILLY.toString()],
167
+ },
168
+ [tokens.USDC]: {
169
+ bank: "A7vBgCowCYeja7GTc3pyqUBdC9Gkue2gWaMjGZW38meM",
170
+ liquidityVault: "DBGhZ8TJTG2Pacdva27zY9etaro24o1tTA3LToSjYHbx",
171
+ vaultAuthority: "Cg6BCqkGny7A2AXCV8rikhHXM82wqqfzmdsTobEeTQkH",
172
+ priceOracle: USDC_PRICE_ORACLE,
173
+ },
117
174
  },
118
175
  };
119
176
 
@@ -17,10 +17,6 @@ export const PYTH_PRICE_FEED_IDS = {
17
17
  "0xf51570985c642c49c2d6e50156390fdba80bb6d5f7fa389d2f012ced4f7d208f",
18
18
  [tokens.JUP]:
19
19
  "0x0a0408d619e9380abad35060f9192039ed5042fa6f82301d0e48bb52be830996",
20
- [tokens.BONK]:
21
- "0x72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419",
22
- [tokens.WIF]:
23
- "0x4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc",
24
20
  [tokens.JTO]:
25
21
  "0xb43660a5f790c69354b0729a5ef9d50d68f1df92107540210b9cccba1f947cc2",
26
22
  [tokens.JLP]:
@@ -37,4 +33,8 @@ export const PYTH_PRICE_FEED_IDS = {
37
33
  "0xeaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a",
38
34
  [tokens.USDT]:
39
35
  "0x2b89b9dc8fdf9f34709a5b106b472f0f39bb6ca9ce04b0fd7f2e971688e2e53b",
36
+ [tokens.BONK]:
37
+ "0x72b021217ca3fe68922a19aaf990109cb9d84e9ad004b4d2025ad6f529314419",
38
+ [tokens.WIF]:
39
+ "0x4ca4beeca86f0d164160323817a4e42b10010a724c2217c6ee41b54cd4cc61fc",
40
40
  };
@@ -0,0 +1,10 @@
1
+ import * as tokens from "./tokenConstants";
2
+
3
+ // https://beta.ondemand.switchboard.xyz/solana/mainnet
4
+ export const SWITCHBOARD_PRICE_FEED_IDS: { [key: string]: string } = {
5
+ [tokens.JUP_SOL]: "HX5WM3qzogAfRCjBUWwnniLByMfFrjm1b5yo4KoWGR27",
6
+ [tokens.H_SOL]: "1snBjCaHejZqQsAqkELAKNaqUrDNNCr7zmNX6qaQCzg",
7
+ [tokens.POPCAT]: "FTcFqwCjAgv2VMaowQ9XSBcesVzFzZkaju25nKio6bki",
8
+ [tokens.RETARDIO]: "EvPXnpMoyrj4B6P55LDP2VpSLkTBWom2SqL4486ToNhM",
9
+ [tokens.BILLY]: "uBe4er4VSMgYvBNwSbFctSShRXNPkCfaPh7zHMBFeBi",
10
+ };