@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.
- package/.claude/settings.local.json +15 -0
- package/CLAUDE.md +410 -0
- package/README.md +179 -12
- package/dist/bundle.cjs.js +749 -99
- package/dist/bundle.esm.js +745 -101
- package/dist/contracts/IClearingCoordinatorAbi.js +1 -0
- package/dist/contracts/IClearingCoordinatorAbi.js.map +1 -0
- package/dist/contracts/IERC20MetadataAbi.js +1 -0
- package/dist/contracts/IERC20MetadataAbi.js.map +1 -0
- package/dist/contracts/IFeeManagerAbi.js +1 -0
- package/dist/contracts/IFeeManagerAbi.js.map +1 -0
- package/dist/contracts/IKSULockingAbi.js +1 -0
- package/dist/contracts/IKSULockingAbi.js.map +1 -0
- package/dist/contracts/IKasuAllowListAbi.js +1 -0
- package/dist/contracts/IKasuAllowListAbi.js.map +1 -0
- package/dist/contracts/IKasuControllerAbi.js +1 -0
- package/dist/contracts/IKasuControllerAbi.js.map +1 -0
- package/dist/contracts/IKasuNFTsAbi.js +1 -0
- package/dist/contracts/IKasuNFTsAbi.js.map +1 -0
- package/dist/contracts/IKsuPriceAbi.js +1 -0
- package/dist/contracts/IKsuPriceAbi.js.map +1 -0
- package/dist/contracts/ILendingPoolAbi.js +1 -0
- package/dist/contracts/ILendingPoolAbi.js.map +1 -0
- package/dist/contracts/ILendingPoolFactoryAbi.js +1 -0
- package/dist/contracts/ILendingPoolFactoryAbi.js.map +1 -0
- package/dist/contracts/ILendingPoolManagerAbi.js +1 -0
- package/dist/contracts/ILendingPoolManagerAbi.js.map +1 -0
- package/dist/contracts/ILendingPoolTrancheAbi.js +1 -0
- package/dist/contracts/ILendingPoolTrancheAbi.js.map +1 -0
- package/dist/contracts/ISystemVariablesAbi.js +1 -0
- package/dist/contracts/ISystemVariablesAbi.js.map +1 -0
- package/dist/contracts/IUserLoyaltyRewardsAbi.js +1 -0
- package/dist/contracts/IUserLoyaltyRewardsAbi.js.map +1 -0
- package/dist/contracts/IUserManagerAbi.js +1 -0
- package/dist/contracts/IUserManagerAbi.js.map +1 -0
- package/dist/contracts/KSULockBonusAbi.js +1 -0
- package/dist/contracts/KSULockBonusAbi.js.map +1 -0
- package/dist/contracts/KasuPoolExternalTVLAbi.js +1 -0
- package/dist/contracts/KasuPoolExternalTVLAbi.js.map +1 -0
- package/dist/contracts/SwapperAbi.js +1 -0
- package/dist/contracts/SwapperAbi.js.map +1 -0
- package/dist/contracts/common.js +1 -0
- package/dist/contracts/common.js.map +1 -0
- package/dist/contracts/factories/IClearingCoordinatorAbi__factory.js +1 -0
- package/dist/contracts/factories/IClearingCoordinatorAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IERC20MetadataAbi__factory.js +1 -0
- package/dist/contracts/factories/IERC20MetadataAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IFeeManagerAbi__factory.js +1 -0
- package/dist/contracts/factories/IFeeManagerAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IKSULockingAbi__factory.js +1 -0
- package/dist/contracts/factories/IKSULockingAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IKasuAllowListAbi__factory.js +1 -0
- package/dist/contracts/factories/IKasuAllowListAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IKasuControllerAbi__factory.js +1 -0
- package/dist/contracts/factories/IKasuControllerAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IKasuNFTsAbi__factory.js +1 -0
- package/dist/contracts/factories/IKasuNFTsAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IKsuPriceAbi__factory.js +1 -0
- package/dist/contracts/factories/IKsuPriceAbi__factory.js.map +1 -0
- package/dist/contracts/factories/ILendingPoolAbi__factory.js +1 -0
- package/dist/contracts/factories/ILendingPoolAbi__factory.js.map +1 -0
- package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.js +1 -0
- package/dist/contracts/factories/ILendingPoolFactoryAbi__factory.js.map +1 -0
- package/dist/contracts/factories/ILendingPoolManagerAbi__factory.js +1 -0
- package/dist/contracts/factories/ILendingPoolManagerAbi__factory.js.map +1 -0
- package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.js +1 -0
- package/dist/contracts/factories/ILendingPoolTrancheAbi__factory.js.map +1 -0
- package/dist/contracts/factories/ISystemVariablesAbi__factory.js +1 -0
- package/dist/contracts/factories/ISystemVariablesAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.js +1 -0
- package/dist/contracts/factories/IUserLoyaltyRewardsAbi__factory.js.map +1 -0
- package/dist/contracts/factories/IUserManagerAbi__factory.js +1 -0
- package/dist/contracts/factories/IUserManagerAbi__factory.js.map +1 -0
- package/dist/contracts/factories/KSULockBonusAbi__factory.js +1 -0
- package/dist/contracts/factories/KSULockBonusAbi__factory.js.map +1 -0
- package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.js +1 -0
- package/dist/contracts/factories/KasuPoolExternalTVLAbi__factory.js.map +1 -0
- package/dist/contracts/factories/SwapperAbi__factory.js +1 -0
- package/dist/contracts/factories/SwapperAbi__factory.js.map +1 -0
- package/dist/contracts/factories/index.js +1 -0
- package/dist/contracts/factories/index.js.map +1 -0
- package/dist/contracts/index.js +1 -0
- package/dist/contracts/index.js.map +1 -0
- package/dist/facade/chain-configs.d.ts +11 -0
- package/dist/facade/chain-configs.js +84 -0
- package/dist/facade/chain-configs.js.map +1 -0
- package/dist/facade/deposits.d.ts +56 -0
- package/dist/facade/deposits.js +87 -0
- package/dist/facade/deposits.js.map +1 -0
- package/dist/facade/index.d.ts +6 -0
- package/dist/facade/index.js +9 -0
- package/dist/facade/index.js.map +1 -0
- package/dist/facade/kasu.d.ts +71 -0
- package/dist/facade/kasu.js +101 -0
- package/dist/facade/kasu.js.map +1 -0
- package/dist/facade/strategies.d.ts +37 -0
- package/dist/facade/strategies.js +112 -0
- package/dist/facade/strategies.js.map +1 -0
- package/dist/facade/types.d.ts +127 -0
- package/dist/facade/types.js +2 -0
- package/dist/facade/types.js.map +1 -0
- package/dist/facade/user-portfolio.d.ts +35 -0
- package/dist/facade/user-portfolio.js +53 -0
- package/dist/facade/user-portfolio.js.map +1 -0
- package/dist/index.d.ts +9 -17
- package/dist/index.js +10 -16
- package/dist/index.js.map +1 -0
- package/dist/kasu-sdk.d.ts +17 -0
- package/dist/kasu-sdk.js +17 -0
- package/dist/kasu-sdk.js.map +1 -0
- package/dist/sdk-config.d.ts +28 -4
- package/dist/sdk-config.js +9 -6
- package/dist/sdk-config.js.map +1 -0
- package/dist/services/DataService/data-service.d.ts +9 -2
- package/dist/services/DataService/data-service.js +91 -52
- package/dist/services/DataService/data-service.js.map +1 -0
- package/dist/services/DataService/directus-types.js +1 -0
- package/dist/services/DataService/directus-types.js.map +1 -0
- package/dist/services/DataService/queries.d.ts +0 -1
- package/dist/services/DataService/queries.js +1 -8
- package/dist/services/DataService/queries.js.map +1 -0
- package/dist/services/DataService/subgraph-types.d.ts +0 -6
- package/dist/services/DataService/subgraph-types.js +1 -0
- package/dist/services/DataService/subgraph-types.js.map +1 -0
- package/dist/services/DataService/types.d.ts +0 -1
- package/dist/services/DataService/types.js +1 -0
- package/dist/services/DataService/types.js.map +1 -0
- package/dist/services/Locking/locking.d.ts +4 -2
- package/dist/services/Locking/locking.js +90 -7
- package/dist/services/Locking/locking.js.map +1 -0
- package/dist/services/Locking/queries.js +1 -0
- package/dist/services/Locking/queries.js.map +1 -0
- package/dist/services/Locking/types.js +1 -0
- package/dist/services/Locking/types.js.map +1 -0
- package/dist/services/Portfolio/portfolio.d.ts +41 -2
- package/dist/services/Portfolio/portfolio.js +146 -34
- package/dist/services/Portfolio/portfolio.js.map +1 -0
- package/dist/services/Portfolio/queries.js +1 -0
- package/dist/services/Portfolio/queries.js.map +1 -0
- package/dist/services/Portfolio/types.js +1 -0
- package/dist/services/Portfolio/types.js.map +1 -0
- package/dist/services/Swapper/swapper.js +1 -0
- package/dist/services/Swapper/swapper.js.map +1 -0
- package/dist/services/Swapper/types.js +1 -0
- package/dist/services/Swapper/types.js.map +1 -0
- package/dist/services/UserLending/helper.js +1 -0
- package/dist/services/UserLending/helper.js.map +1 -0
- package/dist/services/UserLending/queries.js +1 -0
- package/dist/services/UserLending/queries.js.map +1 -0
- package/dist/services/UserLending/subgraph-types.js +1 -0
- package/dist/services/UserLending/subgraph-types.js.map +1 -0
- package/dist/services/UserLending/types.js +1 -0
- package/dist/services/UserLending/types.js.map +1 -0
- package/dist/services/UserLending/user-lending.js +1 -0
- package/dist/services/UserLending/user-lending.js.map +1 -0
- package/dist/services/shared.js +1 -0
- package/dist/services/shared.js.map +1 -0
- package/dist/tests/facade.test.d.ts +1 -0
- package/dist/tests/facade.test.js +196 -0
- package/dist/tests/facade.test.js.map +1 -0
- package/dist/tests/sample.test.js +20 -14
- package/dist/tests/sample.test.js.map +1 -0
- package/dist/utils/deployment-mode.d.ts +6 -0
- package/dist/utils/deployment-mode.js +8 -0
- package/dist/utils/deployment-mode.js.map +1 -0
- package/package.json +3 -2
- package/src/facade/chain-configs.ts +93 -0
- package/src/facade/deposits.ts +102 -0
- package/src/facade/index.ts +26 -0
- package/src/facade/kasu.ts +144 -0
- package/src/facade/strategies.ts +119 -0
- package/src/facade/types.ts +168 -0
- package/src/facade/user-portfolio.ts +73 -0
- package/src/index.ts +59 -25
- package/src/kasu-sdk.ts +27 -0
- package/src/sdk-config.ts +36 -15
- package/src/services/DataService/data-service.ts +105 -65
- package/src/services/DataService/queries.ts +0 -9
- package/src/services/DataService/subgraph-types.ts +0 -7
- package/src/services/DataService/types.ts +0 -1
- package/src/services/Locking/locking.ts +113 -12
- package/src/services/Portfolio/portfolio.ts +276 -50
- package/src/tests/facade.test.ts +245 -0
- package/src/tests/sample.test.ts +7 -9
- package/src/utils/deployment-mode.ts +9 -0
- 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(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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,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
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "dist/bundle.cjs.js",
|
|
6
6
|
"module": "dist/bundle.esm.js",
|
|
7
|
-
"types": "dist/
|
|
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
|
+
}
|