@kasufinance/kasu-sdk 2.6.0 → 2.7.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 (122) hide show
  1. package/README.md +128 -3
  2. package/dist/bundle.cjs.js +1119 -254
  3. package/dist/bundle.esm.js +1109 -255
  4. package/dist/domain/index.d.ts +3 -2
  5. package/dist/domain/index.js +2 -2
  6. package/dist/domain/index.js.map +1 -1
  7. package/dist/domain/requests.d.ts +42 -4
  8. package/dist/domain/requests.js +20 -4
  9. package/dist/domain/requests.js.map +1 -1
  10. package/dist/domain/wallet-errors.d.ts +63 -8
  11. package/dist/domain/wallet-errors.js +115 -16
  12. package/dist/domain/wallet-errors.js.map +1 -1
  13. package/dist/facade/deposits.js +2 -1
  14. package/dist/facade/deposits.js.map +1 -1
  15. package/dist/facade/flows.d.ts +95 -0
  16. package/dist/facade/flows.js +116 -0
  17. package/dist/facade/flows.js.map +1 -0
  18. package/dist/facade/index.d.ts +3 -0
  19. package/dist/facade/index.js +3 -0
  20. package/dist/facade/index.js.map +1 -1
  21. package/dist/facade/kasu.d.ts +6 -2
  22. package/dist/facade/kasu.js +28 -3
  23. package/dist/facade/kasu.js.map +1 -1
  24. package/dist/facade/read-only.d.ts +12 -0
  25. package/dist/facade/read-only.js +13 -0
  26. package/dist/facade/read-only.js.map +1 -0
  27. package/dist/flows/deposit-flow.d.ts +301 -0
  28. package/dist/flows/deposit-flow.js +358 -0
  29. package/dist/flows/deposit-flow.js.map +1 -0
  30. package/dist/flows/flow.d.ts +72 -0
  31. package/dist/flows/flow.js +110 -0
  32. package/dist/flows/flow.js.map +1 -0
  33. package/dist/flows/index.d.ts +19 -0
  34. package/dist/flows/index.js +17 -0
  35. package/dist/flows/index.js.map +1 -0
  36. package/dist/flows/observable.d.ts +59 -0
  37. package/dist/flows/observable.js +81 -0
  38. package/dist/flows/observable.js.map +1 -0
  39. package/dist/flows/withdraw-flow.d.ts +99 -0
  40. package/dist/flows/withdraw-flow.js +83 -0
  41. package/dist/flows/withdraw-flow.js.map +1 -0
  42. package/dist/index.d.ts +1 -0
  43. package/dist/index.js +6 -0
  44. package/dist/index.js.map +1 -1
  45. package/dist/services/DataService/data-service.js +0 -1
  46. package/dist/services/DataService/data-service.js.map +1 -1
  47. package/package.json +8 -2
  48. package/src/domain/index.ts +7 -1
  49. package/src/domain/requests.ts +57 -4
  50. package/src/domain/wallet-errors.ts +135 -18
  51. package/src/facade/deposits.ts +2 -3
  52. package/src/facade/flows.ts +172 -0
  53. package/src/facade/index.ts +8 -0
  54. package/src/facade/kasu.ts +43 -3
  55. package/src/facade/read-only.ts +13 -0
  56. package/src/flows/deposit-flow.ts +775 -0
  57. package/src/flows/flow.ts +108 -0
  58. package/src/flows/index.ts +45 -0
  59. package/src/flows/observable.ts +97 -0
  60. package/src/flows/withdraw-flow.ts +210 -0
  61. package/src/index.ts +7 -0
  62. package/src/services/DataService/data-service.ts +0 -1
  63. package/dist/domain/au-minimum.test.d.ts +0 -1
  64. package/dist/domain/au-minimum.test.js +0 -202
  65. package/dist/domain/au-minimum.test.js.map +0 -1
  66. package/dist/domain/deposit-bounds.test.d.ts +0 -1
  67. package/dist/domain/deposit-bounds.test.js +0 -135
  68. package/dist/domain/deposit-bounds.test.js.map +0 -1
  69. package/dist/domain/loan-contract.test.d.ts +0 -1
  70. package/dist/domain/loan-contract.test.js +0 -255
  71. package/dist/domain/loan-contract.test.js.map +0 -1
  72. package/dist/domain/partners.test.d.ts +0 -1
  73. package/dist/domain/partners.test.js +0 -53
  74. package/dist/domain/partners.test.js.map +0 -1
  75. package/dist/domain/pools.test.d.ts +0 -1
  76. package/dist/domain/pools.test.js +0 -184
  77. package/dist/domain/pools.test.js.map +0 -1
  78. package/dist/domain/rates.test.d.ts +0 -1
  79. package/dist/domain/rates.test.js +0 -181
  80. package/dist/domain/rates.test.js.map +0 -1
  81. package/dist/domain/requests.test.d.ts +0 -1
  82. package/dist/domain/requests.test.js +0 -470
  83. package/dist/domain/requests.test.js.map +0 -1
  84. package/dist/domain/settlement.test.d.ts +0 -1
  85. package/dist/domain/settlement.test.js +0 -152
  86. package/dist/domain/settlement.test.js.map +0 -1
  87. package/dist/domain/tranche-display-name.test.d.ts +0 -1
  88. package/dist/domain/tranche-display-name.test.js +0 -58
  89. package/dist/domain/tranche-display-name.test.js.map +0 -1
  90. package/dist/domain/tranches.test.d.ts +0 -1
  91. package/dist/domain/tranches.test.js +0 -206
  92. package/dist/domain/tranches.test.js.map +0 -1
  93. package/dist/domain/wallet-errors.test.d.ts +0 -1
  94. package/dist/domain/wallet-errors.test.js +0 -71
  95. package/dist/domain/wallet-errors.test.js.map +0 -1
  96. package/dist/facade/config.test.d.ts +0 -1
  97. package/dist/facade/config.test.js +0 -216
  98. package/dist/facade/config.test.js.map +0 -1
  99. package/dist/facade/facade.test.d.ts +0 -1
  100. package/dist/facade/facade.test.js +0 -278
  101. package/dist/facade/facade.test.js.map +0 -1
  102. package/dist/services/Locking/calculate-apy.test.d.ts +0 -1
  103. package/dist/services/Locking/calculate-apy.test.js +0 -41
  104. package/dist/services/Locking/calculate-apy.test.js.map +0 -1
  105. package/dist/tests/sample.test.d.ts +0 -1
  106. package/dist/tests/sample.test.js +0 -59
  107. package/dist/tests/sample.test.js.map +0 -1
  108. package/src/domain/au-minimum.test.ts +0 -371
  109. package/src/domain/deposit-bounds.test.ts +0 -200
  110. package/src/domain/loan-contract.test.ts +0 -343
  111. package/src/domain/partners.test.ts +0 -83
  112. package/src/domain/pools.test.ts +0 -260
  113. package/src/domain/rates.test.ts +0 -254
  114. package/src/domain/requests.test.ts +0 -653
  115. package/src/domain/settlement.test.ts +0 -198
  116. package/src/domain/tranche-display-name.test.ts +0 -96
  117. package/src/domain/tranches.test.ts +0 -300
  118. package/src/domain/wallet-errors.test.ts +0 -100
  119. package/src/facade/config.test.ts +0 -265
  120. package/src/facade/facade.test.ts +0 -374
  121. package/src/services/Locking/calculate-apy.test.ts +0 -52
  122. package/src/tests/sample.test.ts +0 -63
@@ -1 +0,0 @@
1
- export {};
@@ -1,278 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { NO_DIRECTUS_URL_MESSAGE } from '../services/DataService/directus-client';
11
- import { UserRequestStatus } from '../services/UserLending/subgraph-types';
12
- import { CHAIN_CONFIGS } from './chain-configs';
13
- import { DepositsFacade } from './deposits';
14
- import { Kasu } from './kasu';
15
- import { StrategiesFacade } from './strategies';
16
- import { PortfolioFacade } from './user-portfolio';
17
- // ---------------------------------------------------------------------------
18
- // Chain configs
19
- // ---------------------------------------------------------------------------
20
- describe('CHAIN_CONFIGS', () => {
21
- it('should have base, xdc, and plume entries', () => {
22
- expect(CHAIN_CONFIGS).toHaveProperty('base');
23
- expect(CHAIN_CONFIGS).toHaveProperty('xdc');
24
- expect(CHAIN_CONFIGS).toHaveProperty('plume');
25
- });
26
- it('base should be a full deployment', () => {
27
- const base = CHAIN_CONFIGS.base;
28
- expect(base.chainId).toBe(8453);
29
- expect(base.isLiteDeployment).toBe(false);
30
- expect(base.contracts.KSUToken).toBeDefined();
31
- expect(base.contracts.KasuNFTs).toBeDefined();
32
- });
33
- it('xdc should be a lite deployment without KSU token', () => {
34
- const xdc = CHAIN_CONFIGS.xdc;
35
- expect(xdc.chainId).toBe(50);
36
- expect(xdc.isLiteDeployment).toBe(true);
37
- expect(xdc.contracts.KSUToken).toBeUndefined();
38
- expect(xdc.contracts.KasuNFTs).toBeUndefined();
39
- });
40
- it('plume should be a lite deployment', () => {
41
- const plume = CHAIN_CONFIGS.plume;
42
- expect(plume.chainId).toBe(98866);
43
- expect(plume.isLiteDeployment).toBe(true);
44
- });
45
- it('all chains should have required contract addresses', () => {
46
- for (const [, config] of Object.entries(CHAIN_CONFIGS)) {
47
- expect(config.contracts.LendingPoolManager).toBeDefined();
48
- expect(config.contracts.UserManager).toBeDefined();
49
- expect(config.contracts.KasuAllowList).toBeDefined();
50
- expect(config.contracts.SystemVariables).toBeDefined();
51
- expect(config.subgraphUrl).toContain('goldsky.com');
52
- }
53
- });
54
- it('plume points at the LEGACY goldsky project its frozen history is on', () => {
55
- // Plume was indexed before the live chains moved to the current
56
- // project; the same path under that project returns HTTP 404, so the
57
- // retired deployment's history is only readable at this spelling —
58
- // note the `/gn` suffix the current project's URLs do not carry.
59
- const projectOf = (url) => { var _a; return (_a = url.split('/')[5]) !== null && _a !== void 0 ? _a : ''; };
60
- expect(projectOf(CHAIN_CONFIGS.plume.subgraphUrl)).not.toBe(projectOf(CHAIN_CONFIGS.base.subgraphUrl));
61
- expect(CHAIN_CONFIGS.plume.subgraphUrl.endsWith('/gn')).toBe(true);
62
- });
63
- it('xdc should have poolMetadataMapping', () => {
64
- const mapping = CHAIN_CONFIGS.xdc.poolMetadataMapping;
65
- expect(mapping).toBeDefined();
66
- expect(Object.keys(mapping !== null && mapping !== void 0 ? mapping : {}).length).toBeGreaterThan(0);
67
- });
68
- });
69
- // ---------------------------------------------------------------------------
70
- // Kasu.create()
71
- // ---------------------------------------------------------------------------
72
- describe('Kasu.create()', () => {
73
- // Mock provider — enough to construct the SDK without network calls
74
- const mockProvider = {
75
- getNetwork: jest.fn().mockResolvedValue({ chainId: 8453, name: 'base' }),
76
- call: jest.fn(),
77
- estimateGas: jest.fn(),
78
- getBlockNumber: jest.fn(),
79
- getBlock: jest.fn(),
80
- getTransaction: jest.fn(),
81
- getTransactionReceipt: jest.fn(),
82
- getLogs: jest.fn(),
83
- on: jest.fn(),
84
- once: jest.fn(),
85
- off: jest.fn(),
86
- removeAllListeners: jest.fn(),
87
- _isProvider: true,
88
- };
89
- it('should create an instance from a chain name', () => {
90
- const kasu = Kasu.create({
91
- chain: 'base',
92
- signerOrProvider: mockProvider,
93
- });
94
- expect(kasu).toBeInstanceOf(Kasu);
95
- expect(kasu.strategies).toBeInstanceOf(StrategiesFacade);
96
- expect(kasu.deposits).toBeInstanceOf(DepositsFacade);
97
- expect(kasu.portfolio).toBeInstanceOf(PortfolioFacade);
98
- });
99
- it('should expose chainConfig for the selected chain', () => {
100
- const kasu = Kasu.create({
101
- chain: 'xdc',
102
- signerOrProvider: mockProvider,
103
- });
104
- expect(kasu.chainConfig.chainId).toBe(50);
105
- expect(kasu.isLiteDeployment).toBe(true);
106
- });
107
- it('should accept a custom ChainConfigEntry', () => {
108
- const custom = Object.assign(Object.assign({}, CHAIN_CONFIGS.base), { chainId: 999, name: 'CustomChain' });
109
- const kasu = Kasu.create({
110
- chain: custom,
111
- signerOrProvider: mockProvider,
112
- });
113
- expect(kasu.chainConfig.chainId).toBe(999);
114
- expect(kasu.chainConfig.name).toBe('CustomChain');
115
- });
116
- it('should accept configOverrides', () => {
117
- const kasu = Kasu.create({
118
- chain: 'base',
119
- signerOrProvider: mockProvider,
120
- configOverrides: {
121
- UNUSED_LENDING_POOL_IDS: ['0xdead'],
122
- },
123
- });
124
- expect(kasu).toBeInstanceOf(Kasu);
125
- });
126
- it('constructs without a directusUrl — on-chain data does not need one', () => {
127
- // `createDirectus('')` throws `Invalid URL`, so an SDK configured
128
- // without the (documented-optional) CMS URL used to be
129
- // unconstructable rather than merely CMS-less.
130
- const kasu = Kasu.create({
131
- chain: 'base',
132
- signerOrProvider: mockProvider,
133
- configOverrides: { directusUrl: '' },
134
- });
135
- expect(kasu).toBeInstanceOf(Kasu);
136
- expect(kasu.services.DataService).toBeDefined();
137
- expect(kasu.services.UserLending).toBeDefined();
138
- });
139
- it('refuses a CMS-only call clearly when no directusUrl is configured', () => __awaiter(void 0, void 0, void 0, function* () {
140
- const kasu = Kasu.create({
141
- chain: 'base',
142
- signerOrProvider: mockProvider,
143
- configOverrides: { directusUrl: '' },
144
- });
145
- // A sentence naming what to configure, not a null dereference thrown
146
- // from inside the vendor SDK.
147
- yield expect(kasu.services.DataService.getPlatformOverview()).rejects.toThrow(NO_DIRECTUS_URL_MESSAGE);
148
- }));
149
- it('should expose the underlying KasuSdk via .services', () => {
150
- const kasu = Kasu.create({
151
- chain: 'base',
152
- signerOrProvider: mockProvider,
153
- });
154
- expect(kasu.services).toBeDefined();
155
- expect(kasu.services.DataService).toBeDefined();
156
- expect(kasu.services.UserLending).toBeDefined();
157
- expect(kasu.services.Locking).toBeDefined();
158
- expect(kasu.services.Portfolio).toBeDefined();
159
- });
160
- });
161
- // ---------------------------------------------------------------------------
162
- // StrategiesFacade.calculateDepositLimits()
163
- // ---------------------------------------------------------------------------
164
- describe('StrategiesFacade.calculateDepositLimits()', () => {
165
- // We can test this pure function without network calls by constructing
166
- // a StrategiesFacade with null services and calling calculateDepositLimits directly.
167
- const facade = new StrategiesFacade(null, null);
168
- it('should enforce minimum of 1 USDC', () => {
169
- const tranche = makeTranche({
170
- minimumDeposit: '0.5',
171
- maximumDeposit: '10000',
172
- poolCapacity: '50000',
173
- });
174
- const limits = facade.calculateDepositLimits(tranche);
175
- expect(limits.min).toBe('1');
176
- expect(limits.max).toBe('10000');
177
- expect(limits.availableCapacity).toBe('50000');
178
- });
179
- it('should pass through minimum when >= 1', () => {
180
- const tranche = makeTranche({
181
- minimumDeposit: '100',
182
- maximumDeposit: '10000',
183
- poolCapacity: '50000',
184
- });
185
- const limits = facade.calculateDepositLimits(tranche);
186
- expect(limits.min).toBe('100');
187
- });
188
- it('should cap max at pool capacity when capacity is lower', () => {
189
- const tranche = makeTranche({
190
- minimumDeposit: '100',
191
- maximumDeposit: '50000',
192
- poolCapacity: '10000',
193
- });
194
- const limits = facade.calculateDepositLimits(tranche);
195
- expect(limits.max).toBe('10000');
196
- });
197
- it('should use maximumDeposit when capacity is higher', () => {
198
- const tranche = makeTranche({
199
- minimumDeposit: '100',
200
- maximumDeposit: '5000',
201
- poolCapacity: '50000',
202
- });
203
- const limits = facade.calculateDepositLimits(tranche);
204
- expect(limits.max).toBe('5000');
205
- });
206
- });
207
- // ---------------------------------------------------------------------------
208
- // PortfolioFacade.getRequestStates()
209
- // ---------------------------------------------------------------------------
210
- describe('PortfolioFacade.getRequestStates()', () => {
211
- it('maps the transaction history through deriveRequestState', () => __awaiter(void 0, void 0, void 0, function* () {
212
- const requests = [
213
- makeUserRequest({ id: 'req-1' }),
214
- makeUserRequest({
215
- id: 'req-2',
216
- requestType: 'Withdrawal',
217
- status: UserRequestStatus.PROCESSED,
218
- canCancel: false,
219
- acceptedAmount: '100',
220
- }),
221
- ];
222
- const userLending = {
223
- getCurrentEpoch: () => Promise.resolve('42'),
224
- getUserRequests: () => Promise.resolve(requests),
225
- };
226
- const facade = new PortfolioFacade({}, userLending, {});
227
- const states = yield facade.getRequestStates('0xuser');
228
- expect(states.map((s) => s.id)).toEqual(['req-1', 'req-2']);
229
- expect(states[0].statusCode).toBe('pending');
230
- expect(states[0].amount).toBe(100);
231
- expect(states[1].statusCode).toBe('complete');
232
- expect(states[1].amount).toBe(-100);
233
- }));
234
- it('returns an empty list for a wallet with no history', () => __awaiter(void 0, void 0, void 0, function* () {
235
- const userLending = {
236
- getCurrentEpoch: () => Promise.resolve('42'),
237
- getUserRequests: () => Promise.resolve([]),
238
- };
239
- const facade = new PortfolioFacade({}, userLending, {});
240
- yield expect(facade.getRequestStates('0xuser')).resolves.toEqual([]);
241
- }));
242
- });
243
- // ---------------------------------------------------------------------------
244
- // Type exports — verify key facade types are importable
245
- // ---------------------------------------------------------------------------
246
- describe('Type re-exports', () => {
247
- it('should export facade classes from the main entry', () => {
248
- // Verify the barrel exports resolve — these would fail at compile time
249
- // if the re-exports were broken.
250
- expect(Kasu).toBeDefined();
251
- expect(CHAIN_CONFIGS).toBeDefined();
252
- expect(StrategiesFacade).toBeDefined();
253
- expect(DepositsFacade).toBeDefined();
254
- expect(PortfolioFacade).toBeDefined();
255
- });
256
- });
257
- // ---------------------------------------------------------------------------
258
- // Helpers
259
- // ---------------------------------------------------------------------------
260
- // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
261
- function makeTranche(raw) {
262
- return {
263
- id: '0xtest',
264
- name: 'Test Tranche',
265
- apy: 0.08,
266
- minApy: 0.06,
267
- maxApy: 0.10,
268
- minimumDeposit: raw.minimumDeposit,
269
- maximumDeposit: raw.maximumDeposit,
270
- availableCapacity: raw.poolCapacity,
271
- fixedTermOptions: [],
272
- _raw: Object.assign(Object.assign({}, raw), { id: '0xtest', name: 'Test Tranche', apy: '0.08', minApy: '0.06', maxApy: '0.10', fixedTermConfig: [] }),
273
- };
274
- }
275
- function makeUserRequest(overrides = {}) {
276
- return Object.assign({ id: 'req-1', userId: '0xuser', lendingPool: { id: '0xpool', name: 'Pool', tranches: [{ orderId: '0' }] }, requestType: 'Deposit', trancheId: '0xtranche', trancheName: 'Senior', requestedAmount: '100', acceptedAmount: '0', rejectedAmount: '0', timestamp: 1700000000, status: UserRequestStatus.REQUESTED, canCancel: true, events: [], nftId: '', apy: '0', fixedTermConfig: undefined }, overrides);
277
- }
278
- //# sourceMappingURL=facade.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"facade.test.js","sourceRoot":"","sources":["../../src/facade/facade.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,41 +0,0 @@
1
- import { providers } from 'ethers';
2
- import { apyToEpochRate, epochRateToApy } from '../../domain/rates';
3
- import { CHAIN_CONFIGS } from '../../facade/chain-configs';
4
- import { SdkConfig } from '../../sdk-config';
5
- import { KSULocking } from './locking';
6
- // Offline: the constructor only builds contract instances. Nothing here calls
7
- // the RPC or the subgraph.
8
- function locking() {
9
- const chain = CHAIN_CONFIGS.base;
10
- const config = new SdkConfig({
11
- subgraphUrl: 'https://example.invalid/subgraph',
12
- contracts: chain.contracts,
13
- UNUSED_LENDING_POOL_IDS: [''],
14
- });
15
- return new KSULocking(config, new providers.StaticJsonRpcProvider(chain.rpcUrls[0], chain.chainId));
16
- }
17
- describe('KSULocking.calculateApy', () => {
18
- it('compounds the epoch rate instead of XOR-ing it', () => {
19
- // The old body was `(1 + r) ^ (EPOCHS_IN_YEAR - 1)` — bitwise XOR on
20
- // int32 operands, so every realistic rate returned the constant 50.
21
- for (const r of [0.001, 0.0025, 0.003, 0.005]) {
22
- expect(locking().calculateApy(r)).toBe(epochRateToApy(r));
23
- expect(locking().calculateApy(r)).not.toBe(50);
24
- }
25
- });
26
- it('lands on the APYs the platform actually quotes', () => {
27
- // Every live tranche APY, back through its own per-epoch rate.
28
- for (const apy of [0.1, 0.12, 0.14, 0.16, 0.22, 0.3]) {
29
- expect(locking().calculateApy(apyToEpochRate(apy))).toBeCloseTo(apy, 10);
30
- }
31
- expect(locking().calculateApy(0)).toBe(0);
32
- });
33
- it('agrees with DataService.calculateApyForTranche', () => {
34
- // The two used to carry separate copies of the constant AND separate
35
- // (one of them wrong) formulas.
36
- for (const r of [0.001, 0.003, 0.01]) {
37
- expect(locking().calculateApy(r)).toBe(epochRateToApy(r));
38
- }
39
- });
40
- });
41
- //# sourceMappingURL=calculate-apy.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"calculate-apy.test.js","sourceRoot":"","sources":["../../../src/services/Locking/calculate-apy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,8EAA8E;AAC9E,2BAA2B;AAC3B,SAAS,OAAO;IACZ,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QACzB,WAAW,EAAE,kCAAkC;QAC/C,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,uBAAuB,EAAE,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,OAAO,IAAI,UAAU,CACjB,MAAM,EACN,IAAI,SAAS,CAAC,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CACvE,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,qEAAqE;QACrE,oEAAoE;QACpE,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;YAC1D,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnD,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,+DAA+D;QAC/D,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAC3D,GAAG,EACH,EAAE,CACL,CAAC;QACN,CAAC;QACD,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACtD,qEAAqE;QACrE,gCAAgC;QAChC,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,CAAC,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,59 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- /**
11
- * Live-network spec. It talks to a real subgraph and a real RPC, so it is
12
- * OPT-IN: it runs only under `LIVE_TESTS=1` (`npm run test:live`) and is
13
- * skipped by `npm test` and `npm run test:unit`. A network problem must never
14
- * be able to fail a pull request that did not touch the network.
15
- *
16
- * Known state: the stack it points at (`kasu-wip-sepolia` on The Graph Studio,
17
- * with Base Sepolia addresses) is decommissioned, so `npm run test:live` fails
18
- * on a missing deployment. That is pre-existing and unrelated to the gate; the
19
- * spec needs retargeting at a live deployment before it means anything.
20
- */
21
- import * as ethers from 'ethers';
22
- import { KasuSdk } from '..';
23
- import { SdkConfig } from '../sdk-config';
24
- const live = process.env.LIVE_TESTS === '1';
25
- (live ? describe : describe.skip)('live network — subgraph read', () => {
26
- it('reads a user APY bonus through the subgraph', () => __awaiter(void 0, void 0, void 0, function* () {
27
- const provider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org');
28
- // Generated per run. This spec only reads, so the wallet never needs
29
- // funds or a key that outlives the process — and a public repository
30
- // must never carry one.
31
- const wallet = ethers.Wallet.createRandom().connect(provider);
32
- const config = new SdkConfig({
33
- subgraphUrl: 'https://api.studio.thegraph.com/query/63245/kasu-wip-sepolia/version/latest',
34
- contracts: {
35
- IKSULocking: '0x529A81c11ab6176c5E88670d293BB771800066a2',
36
- IKSULockBonus: '0xBBfFd5F744156FFc526df12F5e09dC7b208Be740',
37
- // The allow below is for a public Base Sepolia contract
38
- // address, not a secret: the generic-api-key rule fires on a
39
- // "Token" key name sitting next to a long hex literal.
40
- KSUToken: '0xa0f698Feb9Bc2BeA6E85eb071D5E3F59dc5bC56b', // gitleaks:allow
41
- UserManager: '0xA788e9223fDd7c9Db91Ef133BbeB73515c174773',
42
- LendingPoolManager: '0xc074Aaf2565aae18db2c7498ee1387610a809F40',
43
- KasuAllowList: '0xaE94F9D187c9eA649ADd4966340831F7cc62B69c',
44
- SystemVariables: '0xB174a3240B23e595e90bC2736A5b8ec674Cba73A',
45
- UserLoyaltyRewards: '0x259631CE76FD9F65296549Cd81232aa59D53Dd0c',
46
- KsuPrice: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
47
- ClearingCoordinator: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
48
- KasuNFTs: '0x0000000000000000000000000000000000000000',
49
- ExternalTVL: '0x0000000000000000000000000000000000000000',
50
- },
51
- directusUrl: 'https://kasu-finance.directus.app',
52
- UNUSED_LENDING_POOL_IDS: [''],
53
- });
54
- const sdk = new KasuSdk(config, wallet);
55
- const bonus = yield sdk.UserLending.getUserApyBonus('0xef38c432682ab49095e00442aaa354e955ac03a5');
56
- expect(bonus).toBeDefined();
57
- }));
58
- });
59
- //# sourceMappingURL=sample.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sample.test.js","sourceRoot":"","sources":["../../src/tests/sample.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,CAAC;AAE5C,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,8BAA8B,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,6CAA6C,EAAE,GAAS,EAAE;QACzD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CACjD,0BAA0B,CAC7B,CAAC;QAEF,qEAAqE;QACrE,qEAAqE;QACrE,wBAAwB;QACxB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;YACzB,WAAW,EACP,6EAA6E;YACjF,SAAS,EAAE;gBACP,WAAW,EAAE,4CAA4C;gBACzD,aAAa,EAAE,4CAA4C;gBAC3D,wDAAwD;gBACxD,6DAA6D;gBAC7D,uDAAuD;gBACvD,QAAQ,EAAE,4CAA4C,EAAE,iBAAiB;gBACzE,WAAW,EAAE,4CAA4C;gBACzD,kBAAkB,EAAE,4CAA4C;gBAChE,aAAa,EAAE,4CAA4C;gBAC3D,eAAe,EAAE,4CAA4C;gBAC7D,kBAAkB,EACd,4CAA4C;gBAChD,QAAQ,EAAE,4CAA4C;gBACtD,mBAAmB,EACf,4CAA4C;gBAChD,QAAQ,EAAE,4CAA4C;gBACtD,WAAW,EAAE,4CAA4C;aAC5D;YACD,WAAW,EAAE,mCAAmC;YAChD,uBAAuB,EAAE,CAAC,EAAE,CAAC;SAChC,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAExC,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,eAAe,CAC/C,4CAA4C,CAC/C,CAAC;QAEF,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC,CAAA,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}