@kasufinance/kasu-sdk 1.0.3 → 2.1.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 (186) hide show
  1. package/.claude/settings.local.json +15 -0
  2. package/CLAUDE.md +410 -0
  3. package/README.md +179 -12
  4. package/dist/bundle.cjs.js +749 -99
  5. package/dist/bundle.esm.js +745 -101
  6. package/dist/contracts/IClearingCoordinatorAbi.js +1 -0
  7. package/dist/contracts/IClearingCoordinatorAbi.js.map +1 -0
  8. package/dist/contracts/IERC20MetadataAbi.js +1 -0
  9. package/dist/contracts/IERC20MetadataAbi.js.map +1 -0
  10. package/dist/contracts/IFeeManagerAbi.js +1 -0
  11. package/dist/contracts/IFeeManagerAbi.js.map +1 -0
  12. package/dist/contracts/IKSULockingAbi.js +1 -0
  13. package/dist/contracts/IKSULockingAbi.js.map +1 -0
  14. package/dist/contracts/IKasuAllowListAbi.js +1 -0
  15. package/dist/contracts/IKasuAllowListAbi.js.map +1 -0
  16. package/dist/contracts/IKasuControllerAbi.js +1 -0
  17. package/dist/contracts/IKasuControllerAbi.js.map +1 -0
  18. package/dist/contracts/IKasuNFTsAbi.js +1 -0
  19. package/dist/contracts/IKasuNFTsAbi.js.map +1 -0
  20. package/dist/contracts/IKsuPriceAbi.js +1 -0
  21. package/dist/contracts/IKsuPriceAbi.js.map +1 -0
  22. package/dist/contracts/ILendingPoolAbi.js +1 -0
  23. package/dist/contracts/ILendingPoolAbi.js.map +1 -0
  24. package/dist/contracts/ILendingPoolFactoryAbi.js +1 -0
  25. package/dist/contracts/ILendingPoolFactoryAbi.js.map +1 -0
  26. package/dist/contracts/ILendingPoolManagerAbi.js +1 -0
  27. package/dist/contracts/ILendingPoolManagerAbi.js.map +1 -0
  28. package/dist/contracts/ILendingPoolTrancheAbi.js +1 -0
  29. package/dist/contracts/ILendingPoolTrancheAbi.js.map +1 -0
  30. package/dist/contracts/ISystemVariablesAbi.js +1 -0
  31. package/dist/contracts/ISystemVariablesAbi.js.map +1 -0
  32. package/dist/contracts/IUserLoyaltyRewardsAbi.js +1 -0
  33. package/dist/contracts/IUserLoyaltyRewardsAbi.js.map +1 -0
  34. package/dist/contracts/IUserManagerAbi.js +1 -0
  35. package/dist/contracts/IUserManagerAbi.js.map +1 -0
  36. package/dist/contracts/KSULockBonusAbi.js +1 -0
  37. package/dist/contracts/KSULockBonusAbi.js.map +1 -0
  38. package/dist/contracts/KasuPoolExternalTVLAbi.js +1 -0
  39. package/dist/contracts/KasuPoolExternalTVLAbi.js.map +1 -0
  40. package/dist/contracts/SwapperAbi.js +1 -0
  41. package/dist/contracts/SwapperAbi.js.map +1 -0
  42. package/dist/contracts/common.js +1 -0
  43. package/dist/contracts/common.js.map +1 -0
  44. package/dist/contracts/factories/IClearingCoordinatorAbi__factory.js +1 -0
  45. package/dist/contracts/factories/IClearingCoordinatorAbi__factory.js.map +1 -0
  46. package/dist/contracts/factories/IERC20MetadataAbi__factory.js +1 -0
  47. package/dist/contracts/factories/IERC20MetadataAbi__factory.js.map +1 -0
  48. package/dist/contracts/factories/IFeeManagerAbi__factory.js +1 -0
  49. package/dist/contracts/factories/IFeeManagerAbi__factory.js.map +1 -0
  50. package/dist/contracts/factories/IKSULockingAbi__factory.js +1 -0
  51. package/dist/contracts/factories/IKSULockingAbi__factory.js.map +1 -0
  52. package/dist/contracts/factories/IKasuAllowListAbi__factory.js +1 -0
  53. package/dist/contracts/factories/IKasuAllowListAbi__factory.js.map +1 -0
  54. package/dist/contracts/factories/IKasuControllerAbi__factory.js +1 -0
  55. package/dist/contracts/factories/IKasuControllerAbi__factory.js.map +1 -0
  56. package/dist/contracts/factories/IKasuNFTsAbi__factory.js +1 -0
  57. package/dist/contracts/factories/IKasuNFTsAbi__factory.js.map +1 -0
  58. package/dist/contracts/factories/IKsuPriceAbi__factory.js +1 -0
  59. package/dist/contracts/factories/IKsuPriceAbi__factory.js.map +1 -0
  60. package/dist/contracts/factories/ILendingPoolAbi__factory.js +1 -0
  61. package/dist/contracts/factories/ILendingPoolAbi__factory.js.map +1 -0
  62. package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.js +1 -0
  63. package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.js.map +1 -0
  64. package/dist/contracts/factories/ILendingPoolManagerAbi__factory.js +1 -0
  65. package/dist/contracts/factories/ILendingPoolManagerAbi__factory.js.map +1 -0
  66. package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.js +1 -0
  67. package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.js.map +1 -0
  68. package/dist/contracts/factories/ISystemVariablesAbi__factory.js +1 -0
  69. package/dist/contracts/factories/ISystemVariablesAbi__factory.js.map +1 -0
  70. package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.js +1 -0
  71. package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.js.map +1 -0
  72. package/dist/contracts/factories/IUserManagerAbi__factory.js +1 -0
  73. package/dist/contracts/factories/IUserManagerAbi__factory.js.map +1 -0
  74. package/dist/contracts/factories/KSULockBonusAbi__factory.js +1 -0
  75. package/dist/contracts/factories/KSULockBonusAbi__factory.js.map +1 -0
  76. package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.js +1 -0
  77. package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.js.map +1 -0
  78. package/dist/contracts/factories/SwapperAbi__factory.js +1 -0
  79. package/dist/contracts/factories/SwapperAbi__factory.js.map +1 -0
  80. package/dist/contracts/factories/index.js +1 -0
  81. package/dist/contracts/factories/index.js.map +1 -0
  82. package/dist/contracts/index.js +1 -0
  83. package/dist/contracts/index.js.map +1 -0
  84. package/dist/facade/chain-configs.d.ts +11 -0
  85. package/dist/facade/chain-configs.js +84 -0
  86. package/dist/facade/chain-configs.js.map +1 -0
  87. package/dist/facade/deposits.d.ts +56 -0
  88. package/dist/facade/deposits.js +87 -0
  89. package/dist/facade/deposits.js.map +1 -0
  90. package/dist/facade/index.d.ts +6 -0
  91. package/dist/facade/index.js +9 -0
  92. package/dist/facade/index.js.map +1 -0
  93. package/dist/facade/kasu.d.ts +71 -0
  94. package/dist/facade/kasu.js +101 -0
  95. package/dist/facade/kasu.js.map +1 -0
  96. package/dist/facade/strategies.d.ts +37 -0
  97. package/dist/facade/strategies.js +112 -0
  98. package/dist/facade/strategies.js.map +1 -0
  99. package/dist/facade/types.d.ts +127 -0
  100. package/dist/facade/types.js +2 -0
  101. package/dist/facade/types.js.map +1 -0
  102. package/dist/facade/user-portfolio.d.ts +35 -0
  103. package/dist/facade/user-portfolio.js +53 -0
  104. package/dist/facade/user-portfolio.js.map +1 -0
  105. package/dist/index.d.ts +9 -17
  106. package/dist/index.js +10 -16
  107. package/dist/index.js.map +1 -0
  108. package/dist/kasu-sdk.d.ts +17 -0
  109. package/dist/kasu-sdk.js +17 -0
  110. package/dist/kasu-sdk.js.map +1 -0
  111. package/dist/sdk-config.d.ts +28 -4
  112. package/dist/sdk-config.js +9 -6
  113. package/dist/sdk-config.js.map +1 -0
  114. package/dist/services/DataService/data-service.d.ts +9 -2
  115. package/dist/services/DataService/data-service.js +91 -52
  116. package/dist/services/DataService/data-service.js.map +1 -0
  117. package/dist/services/DataService/directus-types.js +1 -0
  118. package/dist/services/DataService/directus-types.js.map +1 -0
  119. package/dist/services/DataService/queries.d.ts +0 -1
  120. package/dist/services/DataService/queries.js +1 -8
  121. package/dist/services/DataService/queries.js.map +1 -0
  122. package/dist/services/DataService/subgraph-types.d.ts +0 -6
  123. package/dist/services/DataService/subgraph-types.js +1 -0
  124. package/dist/services/DataService/subgraph-types.js.map +1 -0
  125. package/dist/services/DataService/types.d.ts +0 -1
  126. package/dist/services/DataService/types.js +1 -0
  127. package/dist/services/DataService/types.js.map +1 -0
  128. package/dist/services/Locking/locking.d.ts +4 -2
  129. package/dist/services/Locking/locking.js +90 -7
  130. package/dist/services/Locking/locking.js.map +1 -0
  131. package/dist/services/Locking/queries.js +1 -0
  132. package/dist/services/Locking/queries.js.map +1 -0
  133. package/dist/services/Locking/types.js +1 -0
  134. package/dist/services/Locking/types.js.map +1 -0
  135. package/dist/services/Portfolio/portfolio.d.ts +41 -2
  136. package/dist/services/Portfolio/portfolio.js +146 -34
  137. package/dist/services/Portfolio/portfolio.js.map +1 -0
  138. package/dist/services/Portfolio/queries.js +1 -0
  139. package/dist/services/Portfolio/queries.js.map +1 -0
  140. package/dist/services/Portfolio/types.js +1 -0
  141. package/dist/services/Portfolio/types.js.map +1 -0
  142. package/dist/services/Swapper/swapper.js +1 -0
  143. package/dist/services/Swapper/swapper.js.map +1 -0
  144. package/dist/services/Swapper/types.js +1 -0
  145. package/dist/services/Swapper/types.js.map +1 -0
  146. package/dist/services/UserLending/helper.js +1 -0
  147. package/dist/services/UserLending/helper.js.map +1 -0
  148. package/dist/services/UserLending/queries.js +1 -0
  149. package/dist/services/UserLending/queries.js.map +1 -0
  150. package/dist/services/UserLending/subgraph-types.js +1 -0
  151. package/dist/services/UserLending/subgraph-types.js.map +1 -0
  152. package/dist/services/UserLending/types.js +1 -0
  153. package/dist/services/UserLending/types.js.map +1 -0
  154. package/dist/services/UserLending/user-lending.js +1 -0
  155. package/dist/services/UserLending/user-lending.js.map +1 -0
  156. package/dist/services/shared.js +1 -0
  157. package/dist/services/shared.js.map +1 -0
  158. package/dist/tests/facade.test.d.ts +1 -0
  159. package/dist/tests/facade.test.js +196 -0
  160. package/dist/tests/facade.test.js.map +1 -0
  161. package/dist/tests/sample.test.js +20 -14
  162. package/dist/tests/sample.test.js.map +1 -0
  163. package/dist/utils/deployment-mode.d.ts +6 -0
  164. package/dist/utils/deployment-mode.js +8 -0
  165. package/dist/utils/deployment-mode.js.map +1 -0
  166. package/package.json +3 -2
  167. package/src/facade/chain-configs.ts +93 -0
  168. package/src/facade/deposits.ts +102 -0
  169. package/src/facade/index.ts +26 -0
  170. package/src/facade/kasu.ts +144 -0
  171. package/src/facade/strategies.ts +119 -0
  172. package/src/facade/types.ts +168 -0
  173. package/src/facade/user-portfolio.ts +73 -0
  174. package/src/index.ts +59 -25
  175. package/src/kasu-sdk.ts +27 -0
  176. package/src/sdk-config.ts +36 -15
  177. package/src/services/DataService/data-service.ts +105 -65
  178. package/src/services/DataService/queries.ts +0 -9
  179. package/src/services/DataService/subgraph-types.ts +0 -7
  180. package/src/services/DataService/types.ts +0 -1
  181. package/src/services/Locking/locking.ts +113 -12
  182. package/src/services/Portfolio/portfolio.ts +276 -50
  183. package/src/tests/facade.test.ts +245 -0
  184. package/src/tests/sample.test.ts +7 -9
  185. package/src/utils/deployment-mode.ts +9 -0
  186. package/tsconfig.json +1 -1
@@ -0,0 +1,196 @@
1
+ import { CHAIN_CONFIGS } from '../facade/chain-configs';
2
+ import { DepositsFacade } from '../facade/deposits';
3
+ import { Kasu } from '../facade/kasu';
4
+ import { StrategiesFacade } from '../facade/strategies';
5
+ import { PortfolioFacade } from '../facade/user-portfolio';
6
+ // ---------------------------------------------------------------------------
7
+ // Chain configs
8
+ // ---------------------------------------------------------------------------
9
+ describe('CHAIN_CONFIGS', () => {
10
+ it('should have base, xdc, and plume entries', () => {
11
+ expect(CHAIN_CONFIGS).toHaveProperty('base');
12
+ expect(CHAIN_CONFIGS).toHaveProperty('xdc');
13
+ expect(CHAIN_CONFIGS).toHaveProperty('plume');
14
+ });
15
+ it('base should be a full deployment', () => {
16
+ const base = CHAIN_CONFIGS.base;
17
+ expect(base.chainId).toBe(8453);
18
+ expect(base.isLiteDeployment).toBe(false);
19
+ expect(base.contracts.KSUToken).toBeDefined();
20
+ expect(base.contracts.KasuNFTs).toBeDefined();
21
+ });
22
+ it('xdc should be a lite deployment without KSU token', () => {
23
+ const xdc = CHAIN_CONFIGS.xdc;
24
+ expect(xdc.chainId).toBe(50);
25
+ expect(xdc.isLiteDeployment).toBe(true);
26
+ expect(xdc.contracts.KSUToken).toBeUndefined();
27
+ expect(xdc.contracts.KasuNFTs).toBeUndefined();
28
+ });
29
+ it('plume should be a lite deployment', () => {
30
+ const plume = CHAIN_CONFIGS.plume;
31
+ expect(plume.chainId).toBe(98866);
32
+ expect(plume.isLiteDeployment).toBe(true);
33
+ });
34
+ it('all chains should have required contract addresses', () => {
35
+ for (const [, config] of Object.entries(CHAIN_CONFIGS)) {
36
+ expect(config.contracts.LendingPoolManager).toBeDefined();
37
+ expect(config.contracts.UserManager).toBeDefined();
38
+ expect(config.contracts.KasuAllowList).toBeDefined();
39
+ expect(config.contracts.SystemVariables).toBeDefined();
40
+ expect(config.subgraphUrl).toContain('goldsky.com');
41
+ }
42
+ });
43
+ it('xdc should have poolMetadataMapping', () => {
44
+ const mapping = CHAIN_CONFIGS.xdc.poolMetadataMapping;
45
+ expect(mapping).toBeDefined();
46
+ expect(Object.keys(mapping !== null && mapping !== void 0 ? mapping : {}).length).toBeGreaterThan(0);
47
+ });
48
+ });
49
+ // ---------------------------------------------------------------------------
50
+ // Kasu.create()
51
+ // ---------------------------------------------------------------------------
52
+ describe('Kasu.create()', () => {
53
+ // Mock provider — enough to construct the SDK without network calls
54
+ const mockProvider = {
55
+ getNetwork: jest.fn().mockResolvedValue({ chainId: 8453, name: 'base' }),
56
+ call: jest.fn(),
57
+ estimateGas: jest.fn(),
58
+ getBlockNumber: jest.fn(),
59
+ getBlock: jest.fn(),
60
+ getTransaction: jest.fn(),
61
+ getTransactionReceipt: jest.fn(),
62
+ getLogs: jest.fn(),
63
+ on: jest.fn(),
64
+ once: jest.fn(),
65
+ off: jest.fn(),
66
+ removeAllListeners: jest.fn(),
67
+ _isProvider: true,
68
+ };
69
+ it('should create an instance from a chain name', () => {
70
+ const kasu = Kasu.create({
71
+ chain: 'base',
72
+ signerOrProvider: mockProvider,
73
+ });
74
+ expect(kasu).toBeInstanceOf(Kasu);
75
+ expect(kasu.strategies).toBeInstanceOf(StrategiesFacade);
76
+ expect(kasu.deposits).toBeInstanceOf(DepositsFacade);
77
+ expect(kasu.portfolio).toBeInstanceOf(PortfolioFacade);
78
+ });
79
+ it('should expose chainConfig for the selected chain', () => {
80
+ const kasu = Kasu.create({
81
+ chain: 'xdc',
82
+ signerOrProvider: mockProvider,
83
+ });
84
+ expect(kasu.chainConfig.chainId).toBe(50);
85
+ expect(kasu.isLiteDeployment).toBe(true);
86
+ });
87
+ it('should accept a custom ChainConfigEntry', () => {
88
+ const custom = Object.assign(Object.assign({}, CHAIN_CONFIGS.base), { chainId: 999, name: 'CustomChain' });
89
+ const kasu = Kasu.create({
90
+ chain: custom,
91
+ signerOrProvider: mockProvider,
92
+ });
93
+ expect(kasu.chainConfig.chainId).toBe(999);
94
+ expect(kasu.chainConfig.name).toBe('CustomChain');
95
+ });
96
+ it('should accept configOverrides', () => {
97
+ const kasu = Kasu.create({
98
+ chain: 'base',
99
+ signerOrProvider: mockProvider,
100
+ configOverrides: {
101
+ UNUSED_LENDING_POOL_IDS: ['0xdead'],
102
+ },
103
+ });
104
+ expect(kasu).toBeInstanceOf(Kasu);
105
+ });
106
+ it('should expose the underlying KasuSdk via .services', () => {
107
+ const kasu = Kasu.create({
108
+ chain: 'base',
109
+ signerOrProvider: mockProvider,
110
+ });
111
+ expect(kasu.services).toBeDefined();
112
+ expect(kasu.services.DataService).toBeDefined();
113
+ expect(kasu.services.UserLending).toBeDefined();
114
+ expect(kasu.services.Locking).toBeDefined();
115
+ expect(kasu.services.Portfolio).toBeDefined();
116
+ });
117
+ });
118
+ // ---------------------------------------------------------------------------
119
+ // StrategiesFacade.calculateDepositLimits()
120
+ // ---------------------------------------------------------------------------
121
+ describe('StrategiesFacade.calculateDepositLimits()', () => {
122
+ // We can test this pure function without network calls by constructing
123
+ // a StrategiesFacade with null services and calling calculateDepositLimits directly.
124
+ const facade = new StrategiesFacade(null, null);
125
+ it('should enforce minimum of 1 USDC', () => {
126
+ const tranche = makeTranche({
127
+ minimumDeposit: '0.5',
128
+ maximumDeposit: '10000',
129
+ poolCapacity: '50000',
130
+ });
131
+ const limits = facade.calculateDepositLimits(tranche);
132
+ expect(limits.min).toBe('1');
133
+ expect(limits.max).toBe('10000');
134
+ expect(limits.availableCapacity).toBe('50000');
135
+ });
136
+ it('should pass through minimum when >= 1', () => {
137
+ const tranche = makeTranche({
138
+ minimumDeposit: '100',
139
+ maximumDeposit: '10000',
140
+ poolCapacity: '50000',
141
+ });
142
+ const limits = facade.calculateDepositLimits(tranche);
143
+ expect(limits.min).toBe('100');
144
+ });
145
+ it('should cap max at pool capacity when capacity is lower', () => {
146
+ const tranche = makeTranche({
147
+ minimumDeposit: '100',
148
+ maximumDeposit: '50000',
149
+ poolCapacity: '10000',
150
+ });
151
+ const limits = facade.calculateDepositLimits(tranche);
152
+ expect(limits.max).toBe('10000');
153
+ });
154
+ it('should use maximumDeposit when capacity is higher', () => {
155
+ const tranche = makeTranche({
156
+ minimumDeposit: '100',
157
+ maximumDeposit: '5000',
158
+ poolCapacity: '50000',
159
+ });
160
+ const limits = facade.calculateDepositLimits(tranche);
161
+ expect(limits.max).toBe('5000');
162
+ });
163
+ });
164
+ // ---------------------------------------------------------------------------
165
+ // Type exports — verify key facade types are importable
166
+ // ---------------------------------------------------------------------------
167
+ describe('Type re-exports', () => {
168
+ it('should export facade classes from the main entry', () => {
169
+ // Verify the barrel exports resolve — these would fail at compile time
170
+ // if the re-exports were broken.
171
+ expect(Kasu).toBeDefined();
172
+ expect(CHAIN_CONFIGS).toBeDefined();
173
+ expect(StrategiesFacade).toBeDefined();
174
+ expect(DepositsFacade).toBeDefined();
175
+ expect(PortfolioFacade).toBeDefined();
176
+ });
177
+ });
178
+ // ---------------------------------------------------------------------------
179
+ // Helpers
180
+ // ---------------------------------------------------------------------------
181
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
182
+ function makeTranche(raw) {
183
+ return {
184
+ id: '0xtest',
185
+ name: 'Test Tranche',
186
+ apy: 0.08,
187
+ minApy: 0.06,
188
+ maxApy: 0.10,
189
+ minimumDeposit: raw.minimumDeposit,
190
+ maximumDeposit: raw.maximumDeposit,
191
+ availableCapacity: raw.poolCapacity,
192
+ fixedTermOptions: [],
193
+ _raw: Object.assign(Object.assign({}, raw), { id: '0xtest', name: 'Test Tranche', apy: '0.08', minApy: '0.06', maxApy: '0.10', fixedTermConfig: [] }),
194
+ };
195
+ }
196
+ //# sourceMappingURL=facade.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facade.test.js","sourceRoot":"","sources":["../../src/tests/facade.test.ts"],"names":[],"mappings":"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"}
@@ -13,20 +13,26 @@ import { SdkConfig } from '../sdk-config';
13
13
  test('subgraphCall', () => __awaiter(void 0, void 0, void 0, function* () {
14
14
  const provider = new ethers.providers.JsonRpcProvider('https://sepolia.base.org');
15
15
  const wallet = new ethers.Wallet('dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd', provider);
16
- const config = new SdkConfig('https://api.studio.thegraph.com/query/63245/kasu-wip-sepolia/version/latest', 'https://api.goldsky.com/api/public/project_cm9t3064xeuyn01tgctdo3c17/subgraphs/kasu-plume/prod/gn', {
17
- IKSULocking: '0x529A81c11ab6176c5E88670d293BB771800066a2',
18
- IKSULockBonus: '0xBBfFd5F744156FFc526df12F5e09dC7b208Be740',
19
- KSUToken: '0xa0f698Feb9Bc2BeA6E85eb071D5E3F59dc5bC56b',
20
- UserManager: '0xA788e9223fDd7c9Db91Ef133BbeB73515c174773',
21
- LendingPoolManager: '0xc074Aaf2565aae18db2c7498ee1387610a809F40',
22
- KasuAllowList: '0xaE94F9D187c9eA649ADd4966340831F7cc62B69c',
23
- SystemVariables: '0xB174a3240B23e595e90bC2736A5b8ec674Cba73A',
24
- UserLoyaltyRewards: '0x259631CE76FD9F65296549Cd81232aa59D53Dd0c',
25
- KsuPrice: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
26
- ClearingCoordinator: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
27
- KasuNFTs: '0x0000000000000000000000000000000000000000',
28
- ExternalTVL: '0x0000000000000000000000000000000000000000',
29
- }, 'https://kasu-finance.directus.app', ['']);
16
+ const config = new SdkConfig({
17
+ subgraphUrl: 'https://api.studio.thegraph.com/query/63245/kasu-wip-sepolia/version/latest',
18
+ contracts: {
19
+ IKSULocking: '0x529A81c11ab6176c5E88670d293BB771800066a2',
20
+ IKSULockBonus: '0xBBfFd5F744156FFc526df12F5e09dC7b208Be740',
21
+ KSUToken: '0xa0f698Feb9Bc2BeA6E85eb071D5E3F59dc5bC56b',
22
+ UserManager: '0xA788e9223fDd7c9Db91Ef133BbeB73515c174773',
23
+ LendingPoolManager: '0xc074Aaf2565aae18db2c7498ee1387610a809F40',
24
+ KasuAllowList: '0xaE94F9D187c9eA649ADd4966340831F7cc62B69c',
25
+ SystemVariables: '0xB174a3240B23e595e90bC2736A5b8ec674Cba73A',
26
+ UserLoyaltyRewards: '0x259631CE76FD9F65296549Cd81232aa59D53Dd0c',
27
+ KsuPrice: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
28
+ ClearingCoordinator: '0x2027192aCFB4810Ad734A212F19d7030F698aCE3',
29
+ KasuNFTs: '0x0000000000000000000000000000000000000000',
30
+ ExternalTVL: '0x0000000000000000000000000000000000000000',
31
+ },
32
+ directusUrl: 'https://kasu-finance.directus.app',
33
+ UNUSED_LENDING_POOL_IDS: [''],
34
+ });
30
35
  const sdk = new KasuSdk(config, wallet);
31
36
  console.log(yield sdk.UserLending.getUserApyBonus('0xef38c432682ab49095e00442aaa354e955ac03a5'));
32
37
  }));
38
+ //# sourceMappingURL=sample.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sample.test.js","sourceRoot":"","sources":["../../src/tests/sample.test.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AAEjC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAE1C,IAAI,CAAC,cAAc,EAAE,GAAS,EAAE;IAC5B,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,eAAe,CACjD,0BAA0B,CAC7B,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,MAAM,CAC5B,kEAAkE,EAClE,QAAQ,CACX,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QACzB,WAAW,EACP,6EAA6E;QACjF,SAAS,EAAE;YACP,WAAW,EAAE,4CAA4C;YACzD,aAAa,EAAE,4CAA4C;YAC3D,QAAQ,EAAE,4CAA4C;YACtD,WAAW,EAAE,4CAA4C;YACzD,kBAAkB,EAAE,4CAA4C;YAChE,aAAa,EAAE,4CAA4C;YAC3D,eAAe,EAAE,4CAA4C;YAC7D,kBAAkB,EAAE,4CAA4C;YAChE,QAAQ,EAAE,4CAA4C;YACtD,mBAAmB,EAAE,4CAA4C;YACjE,QAAQ,EAAE,4CAA4C;YACtD,WAAW,EAAE,4CAA4C;SAC5D;QACD,WAAW,EAAE,mCAAmC;QAChD,uBAAuB,EAAE,CAAC,EAAE,CAAC;KAChC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CACP,MAAM,GAAG,CAAC,WAAW,CAAC,eAAe,CACjC,4CAA4C,CAC/C,CACJ,CAAC;AACN,CAAC,CAAA,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { SdkConfig } from '../sdk-config';
2
+ /**
3
+ * Check if the SDK is configured for a Lite deployment.
4
+ * Lite deployments don't have KSU token, locking, or loyalty features.
5
+ */
6
+ export declare function isLiteDeployment(config: SdkConfig): boolean;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Check if the SDK is configured for a Lite deployment.
3
+ * Lite deployments don't have KSU token, locking, or loyalty features.
4
+ */
5
+ export function isLiteDeployment(config) {
6
+ return config.isLiteDeployment;
7
+ }
8
+ //# sourceMappingURL=deployment-mode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-mode.js","sourceRoot":"","sources":["../../src/utils/deployment-mode.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAC9C,OAAO,MAAM,CAAC,gBAAgB,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,14 +1,15 @@
1
1
  {
2
2
  "name": "@kasufinance/kasu-sdk",
3
- "version": "1.0.3",
3
+ "version": "2.1.0",
4
4
  "description": "",
5
5
  "main": "dist/bundle.cjs.js",
6
6
  "module": "dist/bundle.esm.js",
7
- "types": "dist/types/index.d.ts",
7
+ "types": "dist/index.d.ts",
8
8
  "scripts": {
9
9
  "test": "jest --config=jest-config.ts",
10
10
  "build-tc": "typechain --target ethers-v5 --out-dir src/contracts './abis/*.json'",
11
11
  "build": "eslint . && tsc --build --force tsconfig.json",
12
+ "build:watch": "npx tsc -b --force --watch",
12
13
  "rollup-build": "rollup -c",
13
14
  "lint": "eslint . --fix"
14
15
  },
@@ -0,0 +1,93 @@
1
+ import { ChainConfigEntry } from './types';
2
+
3
+ /**
4
+ * Built-in chain configurations for Kasu-supported networks.
5
+ *
6
+ * Usage:
7
+ * ```ts
8
+ * import { CHAIN_CONFIGS } from '@kasufinance/kasu-sdk';
9
+ * const base = CHAIN_CONFIGS.base;
10
+ * ```
11
+ */
12
+ export const CHAIN_CONFIGS: Record<'base' | 'xdc' | 'plume', ChainConfigEntry> = {
13
+ base: {
14
+ chainId: 8453,
15
+ name: 'Base Mainnet',
16
+ isLiteDeployment: false,
17
+ contracts: {
18
+ KSUToken: '0x5D9b878744dbe721a3f33A60a6b102E289CeADBA',
19
+ IKSULocking: '0xB145C061684C701c2C018A3f322aa14F5A553CE1',
20
+ IKSULockBonus: '0xEEDE30AcF16caFf49c1a48F75185C67Be2e20B40',
21
+ LendingPoolManager: '0xE1Be322323a412579b4A09fB08ff4bfcA12096B5',
22
+ UserManager: '0x5Dc8D315a80fd99AbEF0f327B9a52a3FBC3C93f3',
23
+ KasuAllowList: '0x807A7e119EBf0282420b5Ca0e0056c0525cBf8BB',
24
+ SystemVariables: '0x193Bb02A24F5562b58fEB86550e6f09Bb6c41f69',
25
+ KsuPrice: '0x221a54CbbD5f490Bd8e77CF36acBA4B1304E5c1b',
26
+ UserLoyaltyRewards: '0xB4784f69Bb1F1076F50907cB0a815908a719D635',
27
+ ClearingCoordinator: '0x2cF12A6d91fa4bEB5a4C17589a03e78F88f57DE2',
28
+ KasuNFTs: '0x4946fF5f1a6550524C425479022D50446AA2968E',
29
+ ExternalTVL: '0x662379FEBb3e4F91400B5f7d4f7F7ce4699F3c9F',
30
+ },
31
+ subgraphUrl:
32
+ 'https://api.goldsky.com/api/public/project_cmgzlpxm300765np2a19421om/subgraphs/kasu-base/v1.0.13/gn',
33
+ directusUrl: 'https://kasu-finance.directus.app/',
34
+ unusedPoolIds: [],
35
+ poolMetadataMapping: undefined,
36
+ },
37
+
38
+ xdc: {
39
+ chainId: 50,
40
+ name: 'XDC Mainnet',
41
+ isLiteDeployment: true,
42
+ contracts: {
43
+ // No KSUToken on Lite deployments
44
+ IKSULocking: '0x7fF469f8c5fba92A9051B8D28794CBb891760e81',
45
+ IKSULockBonus: '0x7cc1434EfA50301Fdd56B7c5c6fF7e30Dc20C55c',
46
+ LendingPoolManager: '0xa46143db92aBe5bB1f61d13d8C1cCd50fc40Ca10',
47
+ UserManager: '0x9b57dF89e59235f0481A5Fae942302c8831e1B81',
48
+ KasuAllowList: '0x32c1Ff5FbBe6D28503ddc46E5001C0D13d6E9B2A',
49
+ SystemVariables: '0x34d17c9DD1f31Fb34757DE923EC083601d0eDFFe',
50
+ KsuPrice: '0x666b589933965bF8B378eD973f0404b6cae0eb52',
51
+ UserLoyaltyRewards: '0xb95834C5610A178be9065Dd1EF78258D29879CDb',
52
+ ClearingCoordinator: '0xAF0a66953Eba1c5353eB7425b398B213Bb2c6121',
53
+ // No KasuNFTs on Lite deployments
54
+ ExternalTVL: '0xCCB4156964377CF36441f3775A2A800dbeCB8094',
55
+ },
56
+ subgraphUrl:
57
+ 'https://api.goldsky.com/api/public/project_cmgzlpxm300765np2a19421om/subgraphs/kasu-xdc/v1.0.0/gn',
58
+ directusUrl: 'https://kasu-finance.directus.app/',
59
+ unusedPoolIds: [],
60
+ poolMetadataMapping: {
61
+ '0x20f42fb45f91657acf9528b99a5a16d0229c7800':
62
+ '0xc987350716fe4a7d674c3591c391d29eba26b8ce',
63
+ '0x3b7cb493aa22f731db2ab424d918e7375e00f6a9':
64
+ '0x03f93c8caa9a82e000d35673ba34a4c0e6e117a2',
65
+ '0xeda50c91a8c4ca8a83652b8542c0b3bd00a71fad':
66
+ '0xc347a9e4aec8c8d11a149d2907deb2bf23b81c6f',
67
+ },
68
+ },
69
+
70
+ plume: {
71
+ chainId: 98866,
72
+ name: 'Plume Mainnet',
73
+ isLiteDeployment: true,
74
+ contracts: {
75
+ // Placeholder — update when Plume contracts are deployed
76
+ IKSULocking: '',
77
+ IKSULockBonus: '',
78
+ LendingPoolManager: '',
79
+ UserManager: '',
80
+ KasuAllowList: '',
81
+ SystemVariables: '',
82
+ KsuPrice: '',
83
+ UserLoyaltyRewards: '',
84
+ ClearingCoordinator: '',
85
+ ExternalTVL: '',
86
+ },
87
+ subgraphUrl:
88
+ 'https://api.goldsky.com/api/public/project_cmgzlpxm300765np2a19421om/subgraphs/kasu-plume/prod',
89
+ directusUrl: 'https://kasu-finance.directus.app/',
90
+ unusedPoolIds: [],
91
+ poolMetadataMapping: undefined,
92
+ },
93
+ };
@@ -0,0 +1,102 @@
1
+ import { ContractTransaction } from 'ethers';
2
+
3
+ import { UserLending } from '../services/UserLending/user-lending';
4
+
5
+ import { DepositParams, KycParams, WithdrawParams } from './types';
6
+
7
+ /**
8
+ * High-level facade for deposit and withdrawal operations.
9
+ *
10
+ * Integrators use this to submit on-chain transactions without
11
+ * worrying about internal encoding details.
12
+ */
13
+ export class DepositsFacade {
14
+ constructor(
15
+ private _userLending: UserLending,
16
+ private _chainId: string,
17
+ ) {}
18
+
19
+ /**
20
+ * Submit a deposit request.
21
+ *
22
+ * The integrator must first obtain a KYC signature via the Nexera flow
23
+ * using the params from `buildKycParams()`.
24
+ *
25
+ * ```ts
26
+ * const kycParams = kasu.deposits.buildKycParams('0xUser...');
27
+ * // ... obtain kycSignature from your backend via Nexera ...
28
+ * const tx = await kasu.deposits.deposit({
29
+ * poolId: '0x...',
30
+ * trancheId: '0x...',
31
+ * amount: parseUnits('1000', 6),
32
+ * kycSignature: { blockExpiration, signature },
33
+ * });
34
+ * ```
35
+ */
36
+ async deposit(params: DepositParams): Promise<ContractTransaction> {
37
+ return await this._userLending.requestDepositWithKyc(
38
+ params.poolId,
39
+ params.trancheId,
40
+ params.amount,
41
+ params.swapData ?? '0x',
42
+ params.fixedTermConfigId ?? 0,
43
+ params.depositData ?? '0x',
44
+ params.kycSignature,
45
+ params.ethValue ?? '0',
46
+ );
47
+ }
48
+
49
+ /**
50
+ * Submit a withdrawal request for a specific USDC amount.
51
+ */
52
+ async withdraw(params: WithdrawParams): Promise<ContractTransaction> {
53
+ return await this._userLending.requestWithdrawalInUSDC(
54
+ params.poolId,
55
+ params.trancheId,
56
+ params.amount,
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Withdraw the entire balance from a tranche.
62
+ */
63
+ async withdrawMax(
64
+ poolId: string,
65
+ trancheId: string,
66
+ userAddress: string,
67
+ ): Promise<ContractTransaction> {
68
+ return await this._userLending.requestWithdrawalMax(
69
+ poolId,
70
+ trancheId,
71
+ userAddress,
72
+ );
73
+ }
74
+
75
+ /**
76
+ * Build KYC signature parameters for the Nexera verification flow.
77
+ *
78
+ * The integrator is responsible for sending these to their backend,
79
+ * which obtains the signature from Nexera's signing service.
80
+ */
81
+ buildKycParams(userAddress: `0x${string}`): KycParams {
82
+ return this._userLending.buildKycSignatureParams(
83
+ userAddress,
84
+ this._chainId,
85
+ );
86
+ }
87
+
88
+ /**
89
+ * Check whether the pool is currently in a clearing period
90
+ * (deposits/withdrawals are temporarily paused).
91
+ */
92
+ async isClearingPending(poolId: string): Promise<boolean> {
93
+ return await this._userLending.isClearingPending(poolId);
94
+ }
95
+
96
+ /**
97
+ * Get the current epoch number.
98
+ */
99
+ async getCurrentEpoch(): Promise<string> {
100
+ return await this._userLending.getCurrentEpoch();
101
+ }
102
+ }
@@ -0,0 +1,26 @@
1
+ // Main entry point
2
+ export { Kasu } from './kasu';
3
+
4
+ // Individual facades (for advanced composition)
5
+ export { StrategiesFacade } from './strategies';
6
+ export { DepositsFacade } from './deposits';
7
+ export { PortfolioFacade } from './user-portfolio';
8
+
9
+ // Chain configurations
10
+ export { CHAIN_CONFIGS } from './chain-configs';
11
+
12
+ // All facade types
13
+ export type {
14
+ SupportedChain,
15
+ ChainConfigEntry,
16
+ KasuOptions,
17
+ Strategy,
18
+ StrategyTranche,
19
+ FixedTermOption,
20
+ DepositParams,
21
+ WithdrawParams,
22
+ DepositLimits,
23
+ KycParams,
24
+ UserPositions,
25
+ PlatformStats,
26
+ } from './types';
@@ -0,0 +1,144 @@
1
+ import { KasuSdk } from '../kasu-sdk';
2
+ import { SdkConfig } from '../sdk-config';
3
+
4
+ import { CHAIN_CONFIGS } from './chain-configs';
5
+ import { DepositsFacade } from './deposits';
6
+ import { StrategiesFacade } from './strategies';
7
+ import { ChainConfigEntry, KasuOptions, SupportedChain } from './types';
8
+ import { PortfolioFacade } from './user-portfolio';
9
+
10
+ /**
11
+ * High-level entry point for external integrators.
12
+ *
13
+ * Provides three domain facades — `strategies`, `deposits`, `portfolio` — and
14
+ * exposes the underlying `KasuSdk` services via `.services` for power-users.
15
+ *
16
+ * ```ts
17
+ * import { Kasu } from '@kasufinance/kasu-sdk';
18
+ *
19
+ * const kasu = Kasu.create({ chain: 'base', signerOrProvider: provider });
20
+ *
21
+ * // Browse strategies
22
+ * const strategies = await kasu.strategies.getAll();
23
+ *
24
+ * // Deposit
25
+ * const tx = await kasu.deposits.deposit({ poolId, trancheId, amount, kycSignature });
26
+ *
27
+ * // User positions
28
+ * const positions = await kasu.portfolio.getPositions(userAddress);
29
+ * ```
30
+ */
31
+ export class Kasu {
32
+ /** Browse lending strategies, APY, capacity. */
33
+ public readonly strategies: StrategiesFacade;
34
+ /** Deposit, withdraw, KYC helpers. */
35
+ public readonly deposits: DepositsFacade;
36
+ /** User positions, yields, transaction history. */
37
+ public readonly portfolio: PortfolioFacade;
38
+
39
+ private readonly _sdk: KasuSdk;
40
+ private readonly _chainConfig: ChainConfigEntry;
41
+
42
+ private constructor(
43
+ sdk: KasuSdk,
44
+ chainConfig: ChainConfigEntry,
45
+ ) {
46
+ this._sdk = sdk;
47
+ this._chainConfig = chainConfig;
48
+
49
+ this.strategies = new StrategiesFacade(
50
+ sdk.DataService,
51
+ sdk.UserLending,
52
+ );
53
+
54
+ this.deposits = new DepositsFacade(
55
+ sdk.UserLending,
56
+ chainConfig.chainId.toString(),
57
+ );
58
+
59
+ this.portfolio = new PortfolioFacade(
60
+ sdk.DataService,
61
+ sdk.UserLending,
62
+ sdk.Portfolio,
63
+ );
64
+ }
65
+
66
+ /**
67
+ * Create a Kasu instance with built-in chain config.
68
+ *
69
+ * ```ts
70
+ * // Minimal setup — uses built-in Base mainnet config
71
+ * const kasu = Kasu.create({ chain: 'base', signerOrProvider: provider });
72
+ *
73
+ * // Custom config override
74
+ * const kasu = Kasu.create({
75
+ * chain: 'base',
76
+ * signerOrProvider: signer,
77
+ * configOverrides: { UNUSED_LENDING_POOL_IDS: ['0x...'] },
78
+ * });
79
+ *
80
+ * // Fully custom chain
81
+ * const kasu = Kasu.create({
82
+ * chain: { chainId: 123, name: 'MyChain', ... },
83
+ * signerOrProvider: provider,
84
+ * });
85
+ * ```
86
+ */
87
+ static create(options: KasuOptions): Kasu {
88
+ const chainConfig = resolveChainConfig(options.chain);
89
+ const overrides = options.configOverrides ?? {};
90
+
91
+ const sdkConfig = new SdkConfig({
92
+ subgraphUrl: overrides.subgraphUrl ?? chainConfig.subgraphUrl,
93
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
94
+ contracts: overrides.contracts ?? chainConfig.contracts,
95
+ directusUrl:
96
+ overrides.directusUrl ?? chainConfig.directusUrl,
97
+ UNUSED_LENDING_POOL_IDS:
98
+ overrides.UNUSED_LENDING_POOL_IDS ??
99
+ chainConfig.unusedPoolIds,
100
+ isLiteDeployment:
101
+ overrides.isLiteDeployment ?? chainConfig.isLiteDeployment,
102
+ poolMetadataMapping:
103
+ overrides.poolMetadataMapping ??
104
+ chainConfig.poolMetadataMapping,
105
+ });
106
+
107
+ const sdk = new KasuSdk(sdkConfig, options.signerOrProvider);
108
+ return new Kasu(sdk, chainConfig);
109
+ }
110
+
111
+ /**
112
+ * Access the underlying `KasuSdk` services for advanced use cases.
113
+ *
114
+ * ```ts
115
+ * const locks = await kasu.services.Locking.getUserLocks(address);
116
+ * ```
117
+ */
118
+ get services(): KasuSdk {
119
+ return this._sdk;
120
+ }
121
+
122
+ /** The resolved chain configuration. */
123
+ get chainConfig(): ChainConfigEntry {
124
+ return this._chainConfig;
125
+ }
126
+
127
+ /** Whether this deployment has KSU token / locking features. */
128
+ get isLiteDeployment(): boolean {
129
+ return this._chainConfig.isLiteDeployment;
130
+ }
131
+ }
132
+
133
+ // ---------------------------------------------------------------------------
134
+ // Helpers
135
+ // ---------------------------------------------------------------------------
136
+
137
+ function resolveChainConfig(
138
+ chain: SupportedChain | ChainConfigEntry,
139
+ ): ChainConfigEntry {
140
+ if (typeof chain === 'string') {
141
+ return CHAIN_CONFIGS[chain];
142
+ }
143
+ return chain;
144
+ }