@sonarwatch/portfolio-plugins 0.4.46 → 0.5.0

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 (126) hide show
  1. package/CHANGELOG.md +9 -1
  2. package/package.json +2 -2
  3. package/src/Cache.d.ts +78 -0
  4. package/src/Cache.js +300 -0
  5. package/src/Cache.js.map +1 -0
  6. package/src/Fetcher.d.ts +31 -0
  7. package/src/Fetcher.js +81 -0
  8. package/src/Fetcher.js.map +1 -0
  9. package/src/Job.d.ts +6 -0
  10. package/src/Job.js +3 -0
  11. package/src/Job.js.map +1 -0
  12. package/src/index.d.ts +5 -3
  13. package/src/index.js +4 -0
  14. package/src/index.js.map +1 -1
  15. package/src/memoryDriver.d.ts +5 -0
  16. package/src/memoryDriver.js +55 -0
  17. package/src/memoryDriver.js.map +1 -0
  18. package/src/overlayDriver.d.ts +6 -0
  19. package/src/overlayDriver.js +96 -0
  20. package/src/overlayDriver.js.map +1 -0
  21. package/src/platforms.d.ts +1 -0
  22. package/src/platforms.js +6 -1
  23. package/src/platforms.js.map +1 -1
  24. package/src/plugins/drift/constants.d.ts +4 -0
  25. package/src/plugins/drift/constants.js +8 -0
  26. package/src/plugins/drift/constants.js.map +1 -0
  27. package/src/plugins/drift/filters.d.ts +3 -0
  28. package/src/plugins/drift/filters.js +23 -0
  29. package/src/plugins/drift/filters.js.map +1 -0
  30. package/src/plugins/drift/helpers.d.ts +20 -0
  31. package/src/plugins/drift/helpers.js +116 -0
  32. package/src/plugins/drift/helpers.js.map +1 -0
  33. package/src/plugins/drift/index.d.ts +4 -0
  34. package/src/plugins/drift/index.js +11 -0
  35. package/src/plugins/drift/index.js.map +1 -0
  36. package/src/plugins/drift/spotMarketsJob.d.ts +3 -0
  37. package/src/plugins/drift/spotMarketsJob.js +37 -0
  38. package/src/plugins/drift/spotMarketsJob.js.map +1 -0
  39. package/src/plugins/drift/spotPositionsFetcher.d.ts +3 -0
  40. package/src/plugins/drift/spotPositionsFetcher.js +142 -0
  41. package/src/plugins/drift/spotPositionsFetcher.js.map +1 -0
  42. package/src/plugins/drift/struct.d.ts +244 -0
  43. package/src/plugins/drift/struct.js +248 -0
  44. package/src/plugins/drift/struct.js.map +1 -0
  45. package/src/plugins/drift/types.d.ts +5 -0
  46. package/src/plugins/drift/types.js +3 -0
  47. package/src/plugins/drift/types.js.map +1 -0
  48. package/src/plugins/foo/index.d.ts +2 -1
  49. package/src/plugins/foo/index.js.map +1 -1
  50. package/src/plugins/foo/marketsJob.d.ts +1 -1
  51. package/src/plugins/foo/marketsJob.js.map +1 -1
  52. package/src/plugins/foo/positionFetcher.d.ts +1 -1
  53. package/src/plugins/foo/positionFetcher.js.map +1 -1
  54. package/src/plugins/marginfi/fetcherExecutor.d.ts +1 -1
  55. package/src/plugins/marginfi/fetcherExecutor.js +59 -37
  56. package/src/plugins/marginfi/fetcherExecutor.js.map +1 -1
  57. package/src/plugins/marginfi/index.d.ts +2 -1
  58. package/src/plugins/marginfi/index.js.map +1 -1
  59. package/src/plugins/marginfi/jobExecutor.d.ts +1 -1
  60. package/src/plugins/marginfi/jobExecutor.js.map +1 -1
  61. package/src/plugins/marinade/index.d.ts +1 -1
  62. package/src/plugins/marinade/ticketsFetcher.d.ts +1 -1
  63. package/src/plugins/marinade/ticketsFetcher.js.map +1 -1
  64. package/src/plugins/meteora/index.d.ts +2 -1
  65. package/src/plugins/meteora/index.js.map +1 -1
  66. package/src/plugins/meteora/poolsJob.d.ts +1 -1
  67. package/src/plugins/meteora/poolsJob.js.map +1 -1
  68. package/src/plugins/meteora/vaultsJob.d.ts +1 -1
  69. package/src/plugins/meteora/vaultsJob.js.map +1 -1
  70. package/src/plugins/orca/clmmPositionsFetcher.d.ts +1 -1
  71. package/src/plugins/orca/clmmPositionsFetcher.js.map +1 -1
  72. package/src/plugins/orca/index.d.ts +2 -1
  73. package/src/plugins/orca/index.js +0 -1
  74. package/src/plugins/orca/index.js.map +1 -1
  75. package/src/plugins/orca/lpTokensJob.d.ts +1 -1
  76. package/src/plugins/orca/lpTokensJob.js.map +1 -1
  77. package/src/plugins/orca/whirlpoolsJob.d.ts +1 -1
  78. package/src/plugins/orca/whirlpoolsJob.js.map +1 -1
  79. package/src/plugins/raydium/clmmPositionsFetcher.d.ts +1 -1
  80. package/src/plugins/raydium/clmmPositionsFetcher.js.map +1 -1
  81. package/src/plugins/raydium/index.d.ts +2 -1
  82. package/src/plugins/raydium/index.js.map +1 -1
  83. package/src/plugins/raydium/lpTokensJob.d.ts +1 -1
  84. package/src/plugins/raydium/lpTokensJob.js.map +1 -1
  85. package/src/plugins/solend/index.d.ts +2 -1
  86. package/src/plugins/solend/index.js.map +1 -1
  87. package/src/plugins/solend/marketsJob.d.ts +1 -1
  88. package/src/plugins/solend/marketsJob.js.map +1 -1
  89. package/src/plugins/solend/obligationsFetcher.d.ts +1 -1
  90. package/src/plugins/solend/obligationsFetcher.js +47 -9
  91. package/src/plugins/solend/obligationsFetcher.js.map +1 -1
  92. package/src/plugins/solend/reservesJob.d.ts +1 -1
  93. package/src/plugins/solend/reservesJob.js +1 -1
  94. package/src/plugins/solend/reservesJob.js.map +1 -1
  95. package/src/plugins/solend/types.d.ts +3 -0
  96. package/src/plugins/tensor/index.d.ts +1 -1
  97. package/src/plugins/tensor/index.js +1 -1
  98. package/src/plugins/tensor/index.js.map +1 -1
  99. package/src/plugins/tensor/tensorFetcher.d.ts +1 -1
  100. package/src/plugins/tensor/tensorFetcher.js.map +1 -1
  101. package/src/plugins/thala/index.d.ts +2 -1
  102. package/src/plugins/thala/index.js.map +1 -1
  103. package/src/plugins/thala/lpTokensJob.d.ts +1 -1
  104. package/src/plugins/thala/lpTokensJob.js.map +1 -1
  105. package/src/plugins/thala/stabilityPoolFetcher.d.ts +1 -1
  106. package/src/plugins/thala/stabilityPoolFetcher.js.map +1 -1
  107. package/src/plugins/thala/stakingAprJob.d.ts +1 -1
  108. package/src/plugins/thala/stakingAprJob.js.map +1 -1
  109. package/src/plugins/thala/vaultsFetcher.d.ts +1 -1
  110. package/src/plugins/thala/vaultsFetcher.js.map +1 -1
  111. package/src/plugins/thala/vaultsRatesJob.d.ts +1 -1
  112. package/src/plugins/thala/vaultsRatesJob.js.map +1 -1
  113. package/src/plugins/tokens/fetchers/aptos.d.ts +1 -1
  114. package/src/plugins/tokens/fetchers/aptos.js.map +1 -1
  115. package/src/plugins/tokens/fetchers/solana-native.d.ts +1 -1
  116. package/src/plugins/tokens/fetchers/solana-native.js.map +1 -1
  117. package/src/plugins/tokens/fetchers/solana.d.ts +1 -1
  118. package/src/plugins/tokens/fetchers/solana.js.map +1 -1
  119. package/src/plugins/tokens/index.d.ts +2 -1
  120. package/src/plugins/tokens/index.js.map +1 -1
  121. package/src/plugins/tokens/jobExecutorGenerator.d.ts +2 -1
  122. package/src/plugins/tokens/jobExecutorGenerator.js.map +1 -1
  123. package/src/utils/misc/getFetchersByAddressSystem.d.ts +2 -1
  124. package/src/utils/misc/getFetchersByAddressSystem.js.map +1 -1
  125. package/src/utils/misc/getImagefromUri.d.ts +2 -1
  126. package/src/utils/misc/getImagefromUri.js.map +1 -1
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const unstorage_1 = require("unstorage");
4
+ const DRIVER_NAME = 'memory';
5
+ exports.default = (0, unstorage_1.defineDriver)((opts = {}) => {
6
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
+ const data = new Map();
8
+ const timeouts = new Map();
9
+ const { ttl } = opts;
10
+ return {
11
+ name: DRIVER_NAME,
12
+ options: opts,
13
+ hasItem(key) {
14
+ return data.has(key);
15
+ },
16
+ getItem(key) {
17
+ return data.get(key) || null;
18
+ },
19
+ getItemRaw(key) {
20
+ return data.get(key) || null;
21
+ },
22
+ setItem(key, value) {
23
+ // Clear previous timeout
24
+ const prevTimeout = timeouts.get(key);
25
+ if (prevTimeout)
26
+ clearTimeout(prevTimeout);
27
+ timeouts.delete(key);
28
+ // Set new timout
29
+ if (ttl) {
30
+ const timeout = setTimeout(() => {
31
+ data.delete(key);
32
+ }, ttl);
33
+ timeouts.set(key, timeout);
34
+ }
35
+ // Set item
36
+ data.set(key, value);
37
+ },
38
+ setItemRaw(key, value) {
39
+ data.set(key, value);
40
+ },
41
+ removeItem(key) {
42
+ data.delete(key);
43
+ },
44
+ getKeys() {
45
+ return Array.from(data.keys());
46
+ },
47
+ clear() {
48
+ data.clear();
49
+ },
50
+ dispose() {
51
+ data.clear();
52
+ },
53
+ };
54
+ });
55
+ //# sourceMappingURL=memoryDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoryDriver.js","sourceRoot":"","sources":["../../../../packages/plugins/src/memoryDriver.ts"],"names":[],"mappings":";;AAAA,yCAAyC;AAEzC,MAAM,WAAW,GAAG,QAAQ,CAAC;AAM7B,kBAAe,IAAA,wBAAY,EAAC,CAAC,OAA6B,EAAE,EAAE,EAAE;IAC9D,8DAA8D;IAC9D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACnD,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACrB,OAAO;QACL,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,IAAI;QACb,OAAO,CAAC,GAAG;YACT,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,OAAO,CAAC,GAAG;YACT,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QAC/B,CAAC;QACD,UAAU,CAAC,GAAG;YACZ,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC;QAC/B,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,KAAK;YAChB,yBAAyB;YACzB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACtC,IAAI,WAAW;gBAAE,YAAY,CAAC,WAAW,CAAC,CAAC;YAC3C,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAErB,iBAAiB;YACjB,IAAI,GAAG,EAAE;gBACP,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC9B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC,EAAE,GAAG,CAAC,CAAC;gBACR,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;aAC5B;YAED,WAAW;YACX,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,KAAK;YACnB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,UAAU,CAAC,GAAG;YACZ,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO;YACL,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,KAAK;YACH,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;QACD,OAAO;YACL,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { Driver } from 'unstorage';
2
+ export interface OverlayStorageOptions {
3
+ layers: Driver[];
4
+ }
5
+ declare const _default: (opts: OverlayStorageOptions) => Driver;
6
+ export default _default;
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const unstorage_1 = require("unstorage");
13
+ const OVERLAY_REMOVED = '__OVERLAY_REMOVED__';
14
+ const DRIVER_NAME = 'overlay';
15
+ exports.default = (0, unstorage_1.defineDriver)((options) => ({
16
+ name: DRIVER_NAME,
17
+ options,
18
+ hasItem(key, opts) {
19
+ var _a;
20
+ return __awaiter(this, void 0, void 0, function* () {
21
+ for (const layer of options.layers) {
22
+ if (yield layer.hasItem(key, opts)) {
23
+ if (layer === options.layers[0]) {
24
+ if ((yield ((_a = options.layers[0]) === null || _a === void 0 ? void 0 : _a.getItem(key))) === OVERLAY_REMOVED) {
25
+ return false;
26
+ }
27
+ }
28
+ return true;
29
+ }
30
+ }
31
+ return false;
32
+ });
33
+ },
34
+ getItem(key) {
35
+ return __awaiter(this, void 0, void 0, function* () {
36
+ for (const layer of options.layers) {
37
+ let value;
38
+ try {
39
+ value = yield layer.getItem(key);
40
+ }
41
+ catch (error) {
42
+ value = null;
43
+ }
44
+ if (value === OVERLAY_REMOVED) {
45
+ return null;
46
+ }
47
+ if (value !== null && value !== 'null') {
48
+ return value;
49
+ }
50
+ }
51
+ return null;
52
+ });
53
+ },
54
+ // TODO: Support native meta
55
+ // async getMeta (key) {},
56
+ setItem(key, value, opts) {
57
+ var _a, _b;
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ yield ((_b = (_a = options.layers[0]) === null || _a === void 0 ? void 0 : _a.setItem) === null || _b === void 0 ? void 0 : _b.call(_a, key, value, opts));
60
+ });
61
+ },
62
+ removeItem(key, opts) {
63
+ var _a, _b;
64
+ return __awaiter(this, void 0, void 0, function* () {
65
+ yield ((_b = (_a = options.layers[0]) === null || _a === void 0 ? void 0 : _a.setItem) === null || _b === void 0 ? void 0 : _b.call(_a, key, OVERLAY_REMOVED, opts));
66
+ });
67
+ },
68
+ getKeys(base, opts) {
69
+ return __awaiter(this, void 0, void 0, function* () {
70
+ const allKeys = yield Promise.all(options.layers.map((layer) => __awaiter(this, void 0, void 0, function* () {
71
+ const keys = yield layer.getKeys(base, opts);
72
+ return keys.map((key) => (0, unstorage_1.normalizeKey)(key));
73
+ })));
74
+ const uniqueKeys = Array.from(new Set(allKeys.flat()));
75
+ const existingKeys = yield Promise.all(uniqueKeys.map((key) => __awaiter(this, void 0, void 0, function* () {
76
+ var _a;
77
+ if ((yield ((_a = options.layers[0]) === null || _a === void 0 ? void 0 : _a.getItem(key))) === OVERLAY_REMOVED) {
78
+ return false;
79
+ }
80
+ return key;
81
+ })));
82
+ return existingKeys.filter(Boolean);
83
+ });
84
+ },
85
+ dispose() {
86
+ return __awaiter(this, void 0, void 0, function* () {
87
+ // TODO: Graceful error handling
88
+ yield Promise.all(options.layers.map((layer) => __awaiter(this, void 0, void 0, function* () {
89
+ if (layer.dispose) {
90
+ yield layer.dispose();
91
+ }
92
+ })));
93
+ });
94
+ },
95
+ }));
96
+ //# sourceMappingURL=overlayDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"overlayDriver.js","sourceRoot":"","sources":["../../../../packages/plugins/src/overlayDriver.ts"],"names":[],"mappings":"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"}
@@ -10,3 +10,4 @@ export declare const raydiumPlatform: Platform;
10
10
  export declare const solendPlatform: Platform;
11
11
  export declare const orcaPlatform: Platform;
12
12
  export declare const meteoraPlatform: Platform;
13
+ export declare const driftPlatform: Platform;
package/src/platforms.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.meteoraPlatform = exports.orcaPlatform = exports.solendPlatform = exports.raydiumPlatform = exports.thalaPlatform = exports.tensorPlatform = exports.marginfiPlatform = exports.walletTokensPlatform = exports.walletNftsPlatform = exports.aavePlatform = exports.marinadePlatform = void 0;
3
+ exports.driftPlatform = exports.meteoraPlatform = exports.orcaPlatform = exports.solendPlatform = exports.raydiumPlatform = exports.thalaPlatform = exports.tensorPlatform = exports.marginfiPlatform = exports.walletTokensPlatform = exports.walletNftsPlatform = exports.aavePlatform = exports.marinadePlatform = void 0;
4
4
  exports.marinadePlatform = {
5
5
  id: 'marinade',
6
6
  name: 'Marinade',
@@ -56,4 +56,9 @@ exports.meteoraPlatform = {
56
56
  name: 'Meteora',
57
57
  image: 'https://beta.sonar.watch/img/platforms/meteora.png',
58
58
  };
59
+ exports.driftPlatform = {
60
+ id: 'drift',
61
+ name: 'Drift',
62
+ image: 'https://beta.sonar.watch/img/platforms/drift.png',
63
+ };
59
64
  //# sourceMappingURL=platforms.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../../packages/plugins/src/platforms.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAa;IACxC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,qDAAqD;CAC7D,CAAC;AACW,QAAA,YAAY,GAAa;IACpC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,iDAAiD;CACzD,CAAC;AACW,QAAA,kBAAkB,GAAa;IAC1C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,wDAAwD;CAChE,CAAC;AACW,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,0DAA0D;CAClE,CAAC;AACW,QAAA,gBAAgB,GAAa;IACxC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,qDAAqD;CAC7D,CAAC;AACW,QAAA,cAAc,GAAa;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,mDAAmD;CAC3D,CAAC;AACW,QAAA,aAAa,GAAa;IACrC,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,kDAAkD;CAC1D,CAAC;AACW,QAAA,eAAe,GAAa;IACvC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,oDAAoD;CAC5D,CAAC;AACW,QAAA,cAAc,GAAa;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,mDAAmD;CAC3D,CAAC;AACW,QAAA,YAAY,GAAa;IACpC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,iDAAiD;CACzD,CAAC;AACW,QAAA,eAAe,GAAa;IACvC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,oDAAoD;CAC5D,CAAC"}
1
+ {"version":3,"file":"platforms.js","sourceRoot":"","sources":["../../../../packages/plugins/src/platforms.ts"],"names":[],"mappings":";;;AAEa,QAAA,gBAAgB,GAAa;IACxC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,qDAAqD;CAC7D,CAAC;AACW,QAAA,YAAY,GAAa;IACpC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,iDAAiD;CACzD,CAAC;AACW,QAAA,kBAAkB,GAAa;IAC1C,EAAE,EAAE,aAAa;IACjB,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,wDAAwD;CAChE,CAAC;AACW,QAAA,oBAAoB,GAAa;IAC5C,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,0DAA0D;CAClE,CAAC;AACW,QAAA,gBAAgB,GAAa;IACxC,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,qDAAqD;CAC7D,CAAC;AACW,QAAA,cAAc,GAAa;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,mDAAmD;CAC3D,CAAC;AACW,QAAA,aAAa,GAAa;IACrC,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,kDAAkD;CAC1D,CAAC;AACW,QAAA,eAAe,GAAa;IACvC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,oDAAoD;CAC5D,CAAC;AACW,QAAA,cAAc,GAAa;IACtC,EAAE,EAAE,QAAQ;IACZ,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,mDAAmD;CAC3D,CAAC;AACW,QAAA,YAAY,GAAa;IACpC,EAAE,EAAE,MAAM;IACV,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,iDAAiD;CACzD,CAAC;AACW,QAAA,eAAe,GAAa;IACvC,EAAE,EAAE,SAAS;IACb,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,oDAAoD;CAC5D,CAAC;AACW,QAAA,aAAa,GAAa;IACrC,EAAE,EAAE,OAAO;IACX,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,kDAAkD;CAC1D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { PublicKey } from '@solana/web3.js';
2
+ export declare const platformId = "drift";
3
+ export declare const prefixSpotMarkets: string;
4
+ export declare const DriftProgram: PublicKey;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DriftProgram = exports.prefixSpotMarkets = exports.platformId = void 0;
4
+ const web3_js_1 = require("@solana/web3.js");
5
+ exports.platformId = 'drift';
6
+ exports.prefixSpotMarkets = `${exports.platformId}-spotMarkets`;
7
+ exports.DriftProgram = new web3_js_1.PublicKey('dRiftyHA39MWEi3m9aunc5MzRF1JYuBsbn6VPcn33UH');
8
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/constants.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAE/B,QAAA,UAAU,GAAG,OAAO,CAAC;AACrB,QAAA,iBAAiB,GAAG,GAAG,kBAAU,cAAc,CAAC;AAEhD,QAAA,YAAY,GAAG,IAAI,mBAAS,CACvC,6CAA6C,CAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { GetProgramAccountsFilter } from '@solana/web3.js';
2
+ export declare const accountsFilter: (owner: string) => GetProgramAccountsFilter[];
3
+ export declare const marketFilter: GetProgramAccountsFilter[];
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.marketFilter = exports.accountsFilter = void 0;
4
+ const struct_1 = require("./struct");
5
+ const accountsFilter = (owner) => [
6
+ {
7
+ memcmp: {
8
+ offset: 0,
9
+ bytes: 'TfwwBiNJtao',
10
+ },
11
+ },
12
+ {
13
+ memcmp: {
14
+ offset: 8,
15
+ bytes: owner,
16
+ },
17
+ },
18
+ ];
19
+ exports.accountsFilter = accountsFilter;
20
+ exports.marketFilter = [
21
+ { dataSize: struct_1.spotMarketStruct.byteSize },
22
+ ];
23
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/filters.ts"],"names":[],"mappings":";;;AACA,qCAA4C;AAErC,MAAM,cAAc,GAAG,CAAC,KAAa,EAA8B,EAAE,CAAC;IAC3E;QACE,MAAM,EAAE;YACN,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,aAAa;SACrB;KACF;IACD;QACE,MAAM,EAAE;YACN,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,KAAK;SACb;KACF;CACF,CAAC;AAbW,QAAA,cAAc,kBAazB;AAEW,QAAA,YAAY,GAA+B;IACtD,EAAE,QAAQ,EAAE,yBAAgB,CAAC,QAAQ,EAAE;CACxC,CAAC"}
@@ -0,0 +1,20 @@
1
+ import BigNumber from 'bignumber.js';
2
+ import { SpotBalanceType, SpotMarket, SpotPosition } from './struct';
3
+ export declare const ZERO: BigNumber;
4
+ export declare const ONE: BigNumber;
5
+ export declare const TEN: BigNumber;
6
+ export declare const QUOTE_SPOT_MARKET_INDEX = 0;
7
+ export declare const SPOT_MARKET_UTILIZATION_PRECISION_EXP: BigNumber;
8
+ export declare const SPOT_MARKET_UTILIZATION_PRECISION: BigNumber;
9
+ export declare const PERCENTAGE_PRECISION_EXP: BigNumber;
10
+ export declare const PERCENTAGE_PRECISION: BigNumber;
11
+ export declare const CONCENTRATION_PRECISION: BigNumber;
12
+ export declare const divCeil: (a: BigNumber, b: BigNumber) => BigNumber;
13
+ export declare function getTokenAmount(scaleBalance: BigNumber, spotMarket: SpotMarket, balanceType: SpotBalanceType): BigNumber;
14
+ export declare function getSignedTokenAmount(tokenAmount: BigNumber, balanceType: SpotBalanceType): BigNumber;
15
+ export declare function calculateUtilization(bank: SpotMarket, delta?: BigNumber): BigNumber;
16
+ export declare function calculateBorrowRate(bank: SpotMarket): BigNumber;
17
+ export declare function calculateDepositRate(bank: SpotMarket): BigNumber;
18
+ export declare function calculateInterestRate(bank: SpotMarket, delta?: BigNumber): BigNumber;
19
+ export declare function isSpotPositionAvailable(position: SpotPosition): boolean;
20
+ export declare function decodeName(bytes: number[]): string;
@@ -0,0 +1,116 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.decodeName = exports.isSpotPositionAvailable = exports.calculateInterestRate = exports.calculateDepositRate = exports.calculateBorrowRate = exports.calculateUtilization = exports.getSignedTokenAmount = exports.getTokenAmount = exports.divCeil = exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION = exports.PERCENTAGE_PRECISION_EXP = exports.SPOT_MARKET_UTILIZATION_PRECISION = exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = exports.QUOTE_SPOT_MARKET_INDEX = exports.TEN = exports.ONE = exports.ZERO = void 0;
7
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
8
+ const struct_1 = require("./struct");
9
+ exports.ZERO = new bignumber_js_1.default(0);
10
+ exports.ONE = new bignumber_js_1.default(1);
11
+ exports.TEN = new bignumber_js_1.default(10);
12
+ exports.QUOTE_SPOT_MARKET_INDEX = 0;
13
+ exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP = new bignumber_js_1.default(6);
14
+ exports.SPOT_MARKET_UTILIZATION_PRECISION = new bignumber_js_1.default(10).pow(exports.SPOT_MARKET_UTILIZATION_PRECISION_EXP);
15
+ exports.PERCENTAGE_PRECISION_EXP = new bignumber_js_1.default(6);
16
+ exports.PERCENTAGE_PRECISION = new bignumber_js_1.default(10).pow(exports.PERCENTAGE_PRECISION_EXP);
17
+ exports.CONCENTRATION_PRECISION = exports.PERCENTAGE_PRECISION;
18
+ const divCeil = (a, b) => {
19
+ const quotient = a.div(b);
20
+ const remainder = a.mod(b);
21
+ if (remainder.gt(exports.ZERO)) {
22
+ return quotient.plus(exports.ONE);
23
+ }
24
+ return quotient;
25
+ };
26
+ exports.divCeil = divCeil;
27
+ function getTokenAmount(scaleBalance, spotMarket, balanceType) {
28
+ const precisionDecrease = exports.TEN.pow(new bignumber_js_1.default(19 - spotMarket.decimals));
29
+ if (balanceType === struct_1.SpotBalanceType.Deposit) {
30
+ return scaleBalance
31
+ .multipliedBy(spotMarket.cumulativeDepositInterest)
32
+ .div(precisionDecrease.toNumber());
33
+ }
34
+ return (0, exports.divCeil)(scaleBalance.multipliedBy(spotMarket.cumulativeBorrowInterest), precisionDecrease);
35
+ }
36
+ exports.getTokenAmount = getTokenAmount;
37
+ function getSignedTokenAmount(tokenAmount, balanceType) {
38
+ if (balanceType === struct_1.SpotBalanceType.Deposit) {
39
+ return tokenAmount;
40
+ }
41
+ return tokenAmount.abs().negated();
42
+ }
43
+ exports.getSignedTokenAmount = getSignedTokenAmount;
44
+ function calculateUtilization(bank, delta = exports.ZERO) {
45
+ let tokenDepositAmount = getTokenAmount(bank.depositBalance, bank, struct_1.SpotBalanceType.Deposit);
46
+ let tokenBorrowAmount = getTokenAmount(bank.borrowBalance, bank, struct_1.SpotBalanceType.Borrow);
47
+ if (delta.gt(exports.ZERO)) {
48
+ tokenDepositAmount = tokenDepositAmount.plus(delta);
49
+ }
50
+ else if (delta.lt(exports.ZERO)) {
51
+ tokenBorrowAmount = tokenBorrowAmount.plus(delta.abs());
52
+ }
53
+ let utilization;
54
+ if (tokenBorrowAmount.eq(exports.ZERO) && tokenDepositAmount.eq(exports.ZERO)) {
55
+ utilization = exports.ZERO;
56
+ }
57
+ else if (tokenDepositAmount.eq(exports.ZERO)) {
58
+ utilization = exports.SPOT_MARKET_UTILIZATION_PRECISION;
59
+ }
60
+ else {
61
+ utilization = tokenBorrowAmount
62
+ .multipliedBy(exports.SPOT_MARKET_UTILIZATION_PRECISION)
63
+ .div(tokenDepositAmount);
64
+ }
65
+ return utilization;
66
+ }
67
+ exports.calculateUtilization = calculateUtilization;
68
+ function calculateBorrowRate(bank) {
69
+ return calculateInterestRate(bank).div(exports.SPOT_MARKET_UTILIZATION_PRECISION);
70
+ }
71
+ exports.calculateBorrowRate = calculateBorrowRate;
72
+ function calculateDepositRate(bank) {
73
+ const utilization = calculateUtilization(bank);
74
+ const borrowRate = calculateBorrowRate(bank);
75
+ const depositRate = borrowRate
76
+ .multipliedBy(exports.PERCENTAGE_PRECISION.minus(new bignumber_js_1.default(bank.insuranceFund.totalFactor)))
77
+ .multipliedBy(utilization)
78
+ .div(exports.SPOT_MARKET_UTILIZATION_PRECISION)
79
+ .div(exports.SPOT_MARKET_UTILIZATION_PRECISION) // Not sure why but this fixes a precision issue, give 0.0X numbers
80
+ .div(exports.PERCENTAGE_PRECISION);
81
+ return depositRate;
82
+ }
83
+ exports.calculateDepositRate = calculateDepositRate;
84
+ function calculateInterestRate(bank, delta = exports.ZERO) {
85
+ const utilization = calculateUtilization(bank, delta);
86
+ let interestRate;
87
+ if (utilization.gt(new bignumber_js_1.default(bank.optimalUtilization))) {
88
+ const surplusUtilization = utilization.minus(new bignumber_js_1.default(bank.optimalUtilization));
89
+ const borrowRateSlope = new bignumber_js_1.default(bank.maxBorrowRate - bank.optimalBorrowRate)
90
+ .multipliedBy(exports.SPOT_MARKET_UTILIZATION_PRECISION)
91
+ .div(exports.SPOT_MARKET_UTILIZATION_PRECISION.minus(new bignumber_js_1.default(bank.optimalUtilization)));
92
+ interestRate = new bignumber_js_1.default(bank.optimalBorrowRate).plus(surplusUtilization
93
+ .multipliedBy(borrowRateSlope)
94
+ .div(exports.SPOT_MARKET_UTILIZATION_PRECISION));
95
+ }
96
+ else {
97
+ const borrowRateSlope = new bignumber_js_1.default(bank.optimalBorrowRate)
98
+ .multipliedBy(exports.SPOT_MARKET_UTILIZATION_PRECISION)
99
+ .div(new bignumber_js_1.default(bank.optimalUtilization));
100
+ interestRate = utilization
101
+ .multipliedBy(borrowRateSlope)
102
+ .div(exports.SPOT_MARKET_UTILIZATION_PRECISION);
103
+ }
104
+ return interestRate;
105
+ }
106
+ exports.calculateInterestRate = calculateInterestRate;
107
+ function isSpotPositionAvailable(position) {
108
+ return position.scaledBalance.eq(exports.ZERO) && position.openOrders === 0;
109
+ }
110
+ exports.isSpotPositionAvailable = isSpotPositionAvailable;
111
+ function decodeName(bytes) {
112
+ const buffer = Buffer.from(bytes);
113
+ return buffer.toString('utf8').trim();
114
+ }
115
+ exports.decodeName = decodeName;
116
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { Fetcher } from '../../Fetcher';
2
+ import { Job } from '../../Job';
3
+ export declare const jobs: Job[];
4
+ export declare const fetchers: Fetcher[];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.fetchers = exports.jobs = void 0;
7
+ const spotMarketsJob_1 = __importDefault(require("./spotMarketsJob"));
8
+ const spotPositionsFetcher_1 = __importDefault(require("./spotPositionsFetcher"));
9
+ exports.jobs = [spotMarketsJob_1.default];
10
+ exports.fetchers = [spotPositionsFetcher_1.default];
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/index.ts"],"names":[],"mappings":";;;;;;AAEA,sEAA8C;AAC9C,kFAA0D;AAE7C,QAAA,IAAI,GAAU,CAAC,wBAAc,CAAC,CAAC;AAC/B,QAAA,QAAQ,GAAc,CAAC,8BAAoB,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Job } from '../../Job';
2
+ declare const job: Job;
3
+ export default job;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
13
+ const constants_1 = require("./constants");
14
+ const solana_1 = require("../../utils/solana");
15
+ const struct_1 = require("./struct");
16
+ const filters_1 = require("./filters");
17
+ const clients_1 = require("../../utils/clients");
18
+ const helpers_1 = require("./helpers");
19
+ const executor = (cache) => __awaiter(void 0, void 0, void 0, function* () {
20
+ const client = (0, clients_1.getClientSolana)();
21
+ const spotMarketsAccount = yield (0, solana_1.getParsedProgramAccounts)(client, struct_1.spotMarketStruct, constants_1.DriftProgram, filters_1.marketFilter);
22
+ if (!spotMarketsAccount)
23
+ return;
24
+ for (let index = 0; index < spotMarketsAccount.length; index++) {
25
+ const spotMarketAccount = spotMarketsAccount[index];
26
+ const depositApr = (0, helpers_1.calculateDepositRate)(spotMarketAccount).toNumber();
27
+ const borrowApr = (0, helpers_1.calculateBorrowRate)(spotMarketAccount).toNumber();
28
+ yield cache.setItem(spotMarketsAccount[index].marketIndex.toString(), Object.assign(Object.assign({}, spotMarketAccount), { depositApr,
29
+ borrowApr }), { prefix: constants_1.prefixSpotMarkets, networkId: portfolio_core_1.NetworkId.solana });
30
+ }
31
+ });
32
+ const job = {
33
+ id: `${constants_1.platformId}-spotMarkets`,
34
+ executor,
35
+ };
36
+ exports.default = job;
37
+ //# sourceMappingURL=spotMarketsJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotMarketsJob.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/spotMarketsJob.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+DAAuD;AACvD,2CAA0E;AAC1E,+CAA8D;AAC9D,qCAA4C;AAC5C,uCAAyC;AACzC,iDAAsD;AACtD,uCAAsE;AAKtE,MAAM,QAAQ,GAAgB,CAAO,KAAY,EAAE,EAAE;IACnD,MAAM,MAAM,GAAG,IAAA,yBAAe,GAAE,CAAC;IACjC,MAAM,kBAAkB,GAAG,MAAM,IAAA,iCAAwB,EACvD,MAAM,EACN,yBAAgB,EAChB,wBAAY,EACZ,sBAAY,CACb,CAAC;IACF,IAAI,CAAC,kBAAkB;QAAE,OAAO;IAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAC9D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,IAAA,8BAAoB,EAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;QACtE,MAAM,SAAS,GAAG,IAAA,6BAAmB,EAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE,CAAC;QACpE,MAAM,KAAK,CAAC,OAAO,CACjB,kBAAkB,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,QAAQ,EAAE,kCAE3C,iBAAiB,KACpB,UAAU;YACV,SAAS,KAEX,EAAE,MAAM,EAAE,6BAAiB,EAAE,SAAS,EAAE,0BAAS,CAAC,MAAM,EAAE,CAC3D,CAAC;KACH;AACH,CAAC,CAAA,CAAC;AAEF,MAAM,GAAG,GAAQ;IACf,EAAE,EAAE,GAAG,sBAAU,cAAc;IAC/B,QAAQ;CACT,CAAC;AACF,kBAAe,GAAG,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Fetcher } from '../../Fetcher';
2
+ declare const fetcher: Fetcher;
3
+ export default fetcher;
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ const portfolio_core_1 = require("@sonarwatch/portfolio-core");
16
+ const bignumber_js_1 = __importDefault(require("bignumber.js"));
17
+ const constants_1 = require("./constants");
18
+ const struct_1 = require("./struct");
19
+ const filters_1 = require("./filters");
20
+ const helpers_1 = require("./helpers");
21
+ const solana_1 = require("../../utils/solana");
22
+ const clients_1 = require("../../utils/clients");
23
+ const tokenPriceToAssetToken_1 = __importDefault(require("../../utils/misc/tokenPriceToAssetToken"));
24
+ const runInBatch_1 = __importDefault(require("../../utils/misc/runInBatch"));
25
+ const executor = (owner, cache) => __awaiter(void 0, void 0, void 0, function* () {
26
+ const client = (0, clients_1.getClientSolana)();
27
+ const userAccounts = yield (0, solana_1.getParsedProgramAccounts)(client, struct_1.userAccountStruct, constants_1.DriftProgram, (0, filters_1.accountsFilter)(owner));
28
+ if (!userAccounts)
29
+ return [];
30
+ const spotMarketIndexes = new Set();
31
+ for (const userAccount of userAccounts) {
32
+ for (const spotPosition of userAccount.spotPositions) {
33
+ spotMarketIndexes.add(spotPosition.marketIndex.toString());
34
+ }
35
+ }
36
+ const spotMarketsItems = yield cache.getItems(Array.from(spotMarketIndexes), {
37
+ prefix: constants_1.prefixSpotMarkets,
38
+ networkId: portfolio_core_1.NetworkId.solana,
39
+ });
40
+ if (!spotMarketsItems)
41
+ return [];
42
+ const spotMarketByIndex = new Map();
43
+ const tokensMints = new Set();
44
+ for (const spotMarketItem of spotMarketsItems) {
45
+ if (!spotMarketItem)
46
+ continue;
47
+ spotMarketByIndex.set(spotMarketItem.marketIndex, spotMarketItem);
48
+ tokensMints.add(spotMarketItem.mint.toString());
49
+ }
50
+ const tokenPriceResults = yield (0, runInBatch_1.default)([...tokensMints].map((mint) => () => cache.getTokenPrice(mint.toString(), portfolio_core_1.NetworkId.solana)));
51
+ const tokenPrices = new Map();
52
+ tokenPriceResults.forEach((r) => {
53
+ if (r.status === 'rejected')
54
+ return;
55
+ if (!r.value)
56
+ return;
57
+ tokenPrices.set(r.value.address, r.value);
58
+ });
59
+ const elements = [];
60
+ // One user can have multiple sub-account
61
+ for (const userAccount of userAccounts) {
62
+ const borrowedAssets = [];
63
+ const borrowedYields = [];
64
+ const suppliedAssets = [];
65
+ const suppliedYields = [];
66
+ const rewardAssets = [];
67
+ const marketIndexRef = 0;
68
+ // Each account has up to 8 SpotPositions
69
+ for (const spotPosition of userAccount.spotPositions) {
70
+ const countForBase = marketIndexRef === undefined ||
71
+ spotPosition.marketIndex === marketIndexRef;
72
+ const countForQuote = marketIndexRef === undefined || marketIndexRef === 0;
73
+ if ((0, helpers_1.isSpotPositionAvailable)(spotPosition) ||
74
+ (!countForBase && !countForQuote)) {
75
+ continue;
76
+ }
77
+ const spotMarket = spotMarketByIndex.get(spotPosition.marketIndex);
78
+ if (!spotMarket)
79
+ continue;
80
+ const tokenPrice = tokenPrices.get(spotMarket.mint.toString());
81
+ if (!tokenPrice || tokenPrice === null)
82
+ continue;
83
+ let tokenAmount = new bignumber_js_1.default(0);
84
+ if (spotMarket.marketIndex !== 0 &&
85
+ spotPosition.balanceType === struct_1.SpotBalanceType.Deposit) {
86
+ tokenAmount = (0, helpers_1.getTokenAmount)(spotPosition.scaledBalance, spotMarket, spotPosition.balanceType);
87
+ }
88
+ else {
89
+ tokenAmount = (0, helpers_1.getSignedTokenAmount)((0, helpers_1.getTokenAmount)(spotPosition.scaledBalance, spotMarket, spotPosition.balanceType), spotPosition.balanceType);
90
+ }
91
+ if (spotPosition.balanceType === struct_1.SpotBalanceType.Deposit) {
92
+ suppliedAssets.push((0, tokenPriceToAssetToken_1.default)(spotMarket.mint.toString(), tokenAmount.div(Math.pow(10, tokenPrice.decimals)).toNumber(), portfolio_core_1.NetworkId.solana, tokenPrice));
93
+ suppliedYields.push([
94
+ {
95
+ apr: spotMarket.depositApr,
96
+ apy: (0, portfolio_core_1.aprToApy)(spotMarket.depositApr),
97
+ },
98
+ ]);
99
+ }
100
+ else if (spotPosition.balanceType === struct_1.SpotBalanceType.Borrow) {
101
+ borrowedAssets.push((0, tokenPriceToAssetToken_1.default)(spotMarket.mint.toString(), tokenAmount
102
+ .div(Math.pow(10, tokenPrice.decimals))
103
+ .abs()
104
+ .toNumber(), portfolio_core_1.NetworkId.solana, tokenPrice));
105
+ borrowedYields.push([
106
+ {
107
+ apr: spotMarket.borrowApr,
108
+ apy: (0, portfolio_core_1.aprToApy)(spotMarket.borrowApr),
109
+ },
110
+ ]);
111
+ }
112
+ }
113
+ const { borrowedValue, collateralRatio, suppliedValue, value } = (0, portfolio_core_1.getElementLendingValues)(suppliedAssets, borrowedAssets, rewardAssets);
114
+ elements.push({
115
+ type: portfolio_core_1.PortfolioElementType.borrowlend,
116
+ networkId: portfolio_core_1.NetworkId.solana,
117
+ platformId: constants_1.platformId,
118
+ label: 'Lending',
119
+ value,
120
+ data: {
121
+ borrowedAssets,
122
+ borrowedValue,
123
+ borrowedYields,
124
+ suppliedAssets,
125
+ suppliedValue,
126
+ suppliedYields,
127
+ collateralRatio,
128
+ rewardAssets,
129
+ value,
130
+ },
131
+ name: (0, helpers_1.decodeName)(userAccount.name),
132
+ });
133
+ }
134
+ return elements;
135
+ });
136
+ const fetcher = {
137
+ id: `${constants_1.platformId}-spotPositions`,
138
+ networkId: portfolio_core_1.NetworkId.solana,
139
+ executor,
140
+ };
141
+ exports.default = fetcher;
142
+ //# sourceMappingURL=spotPositionsFetcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spotPositionsFetcher.js","sourceRoot":"","sources":["../../../../../../packages/plugins/src/plugins/drift/spotPositionsFetcher.ts"],"names":[],"mappings":"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"}