@gearbox-protocol/sdk 14.0.0-next.9 → 14.1.0-next.1

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 (119) hide show
  1. package/dist/cjs/abi/kyc/iDSRegistryService.js +149 -0
  2. package/dist/cjs/abi/kyc/iDSToken.js +71 -0
  3. package/dist/cjs/abi/kyc/iKYCCompressor.js +196 -0
  4. package/dist/cjs/abi/kyc/iKYCFactory.js +122 -0
  5. package/dist/cjs/abi/kyc/iKYCUnderlying.js +401 -0
  6. package/dist/cjs/abi/kyc/iSecuritizeDegenNFT.js +326 -0
  7. package/dist/cjs/abi/kyc/iSecuritizeKYCFactory.js +319 -0
  8. package/dist/cjs/dev/AccountOpener.js +45 -5
  9. package/dist/cjs/rewards/rewards/extra-apy.js +1 -1
  10. package/dist/cjs/sdk/MultichainSDK.js +5 -0
  11. package/dist/cjs/sdk/OnchainSDK.js +55 -6
  12. package/dist/cjs/sdk/accounts/AbstractCreditAccountsService.js +335 -21
  13. package/dist/cjs/sdk/accounts/CreditAccountsServiceV310.js +7 -1
  14. package/dist/cjs/sdk/base/TokensMeta.js +22 -42
  15. package/dist/cjs/sdk/base/token-types.js +9 -0
  16. package/dist/cjs/sdk/chain/chains.js +18 -1
  17. package/dist/cjs/sdk/constants/address-provider.js +3 -0
  18. package/dist/cjs/sdk/market/MarketRegister.js +70 -116
  19. package/dist/cjs/sdk/market/MarketSuite.js +3 -0
  20. package/dist/cjs/sdk/market/index.js +2 -0
  21. package/dist/cjs/sdk/market/kyc/KYCRegistry.js +269 -0
  22. package/dist/cjs/sdk/market/kyc/index.js +26 -0
  23. package/dist/cjs/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +242 -0
  24. package/dist/cjs/sdk/market/kyc/securitize/constants.js +28 -0
  25. package/dist/cjs/sdk/market/kyc/securitize/index.js +26 -0
  26. package/dist/cjs/sdk/market/kyc/securitize/types.js +16 -0
  27. package/dist/cjs/sdk/{accounts/utils.js → market/kyc/types.js} +11 -15
  28. package/dist/cjs/sdk/market/pool/PoolSuite.js +3 -0
  29. package/dist/cjs/sdk/market/pool/PoolV310Contract.js +11 -2
  30. package/dist/cjs/sdk/market/pool/index.js +2 -0
  31. package/dist/cjs/sdk/market/pricefeeds/PriceFeedsRegister.js +3 -3
  32. package/dist/cjs/sdk/options.js +6 -0
  33. package/dist/cjs/sdk/pools/PoolService.js +104 -12
  34. package/dist/cjs/sdk/utils/viem/executeDelegatedMulticalls.js +38 -0
  35. package/dist/cjs/sdk/utils/viem/index.js +2 -4
  36. package/dist/esm/abi/kyc/iDSRegistryService.js +125 -0
  37. package/dist/esm/abi/kyc/iDSToken.js +47 -0
  38. package/dist/esm/abi/kyc/iKYCCompressor.js +172 -0
  39. package/dist/esm/abi/kyc/iKYCFactory.js +98 -0
  40. package/dist/esm/abi/kyc/iKYCUnderlying.js +377 -0
  41. package/dist/esm/abi/kyc/iSecuritizeDegenNFT.js +302 -0
  42. package/dist/esm/abi/kyc/iSecuritizeKYCFactory.js +295 -0
  43. package/dist/esm/dev/AccountOpener.js +47 -6
  44. package/dist/esm/rewards/rewards/extra-apy.js +1 -1
  45. package/dist/esm/sdk/MultichainSDK.js +5 -0
  46. package/dist/esm/sdk/OnchainSDK.js +58 -7
  47. package/dist/esm/sdk/accounts/AbstractCreditAccountsService.js +336 -22
  48. package/dist/esm/sdk/accounts/CreditAccountsServiceV310.js +7 -1
  49. package/dist/esm/sdk/base/TokensMeta.js +22 -44
  50. package/dist/esm/sdk/base/token-types.js +6 -0
  51. package/dist/esm/sdk/chain/chains.js +18 -1
  52. package/dist/esm/sdk/constants/address-provider.js +2 -0
  53. package/dist/esm/sdk/market/MarketRegister.js +74 -118
  54. package/dist/esm/sdk/market/MarketSuite.js +3 -0
  55. package/dist/esm/sdk/market/index.js +1 -0
  56. package/dist/esm/sdk/market/kyc/KYCRegistry.js +253 -0
  57. package/dist/esm/sdk/market/kyc/index.js +3 -0
  58. package/dist/esm/sdk/market/kyc/securitize/SecuritizeKYCFactory.js +218 -0
  59. package/dist/esm/sdk/market/kyc/securitize/constants.js +4 -0
  60. package/dist/esm/sdk/market/kyc/securitize/index.js +3 -0
  61. package/dist/esm/sdk/market/kyc/securitize/types.js +0 -0
  62. package/dist/esm/sdk/market/kyc/types.js +9 -0
  63. package/dist/esm/sdk/market/pool/PoolSuite.js +3 -0
  64. package/dist/esm/sdk/market/pool/PoolV310Contract.js +11 -2
  65. package/dist/esm/sdk/market/pool/index.js +1 -0
  66. package/dist/esm/sdk/market/pricefeeds/PriceFeedsRegister.js +3 -3
  67. package/dist/esm/sdk/options.js +6 -0
  68. package/dist/esm/sdk/pools/PoolService.js +109 -13
  69. package/dist/esm/sdk/utils/viem/executeDelegatedMulticalls.js +14 -0
  70. package/dist/esm/sdk/utils/viem/index.js +1 -2
  71. package/dist/types/abi/kyc/iDSRegistryService.d.ts +191 -0
  72. package/dist/types/abi/kyc/iDSToken.d.ts +67 -0
  73. package/dist/types/abi/kyc/iKYCCompressor.d.ts +228 -0
  74. package/dist/types/abi/kyc/iKYCFactory.d.ts +139 -0
  75. package/dist/types/abi/kyc/iKYCUnderlying.d.ts +548 -0
  76. package/dist/types/abi/kyc/iSecuritizeDegenNFT.d.ts +404 -0
  77. package/dist/types/abi/kyc/iSecuritizeKYCFactory.d.ts +376 -0
  78. package/dist/types/sdk/OnchainSDK.d.ts +19 -1
  79. package/dist/types/sdk/accounts/AbstractCreditAccountsService.d.ts +59 -6
  80. package/dist/types/sdk/accounts/CreditAccountsServiceV310.d.ts +1 -1
  81. package/dist/types/sdk/accounts/types.d.ts +114 -14
  82. package/dist/types/sdk/base/TokensMeta.d.ts +14 -3
  83. package/dist/types/sdk/base/token-types.d.ts +44 -4
  84. package/dist/types/sdk/base/types.d.ts +116 -2
  85. package/dist/types/sdk/chain/chains.d.ts +5 -1
  86. package/dist/types/sdk/constants/address-provider.d.ts +1 -0
  87. package/dist/types/sdk/market/MarketRegister.d.ts +6 -9
  88. package/dist/types/sdk/market/MarketSuite.d.ts +2 -0
  89. package/dist/types/sdk/market/index.d.ts +1 -0
  90. package/dist/types/sdk/market/kyc/KYCRegistry.d.ts +52 -0
  91. package/dist/types/sdk/market/kyc/index.d.ts +3 -0
  92. package/dist/types/sdk/market/kyc/securitize/SecuritizeKYCFactory.d.ts +429 -0
  93. package/dist/types/sdk/market/kyc/securitize/constants.d.ts +1 -0
  94. package/dist/types/sdk/market/kyc/securitize/index.d.ts +3 -0
  95. package/dist/types/sdk/market/kyc/securitize/types.d.ts +136 -0
  96. package/dist/types/sdk/market/kyc/types.d.ts +171 -0
  97. package/dist/types/sdk/market/oracle/PriceOracleBaseContract.d.ts +3 -2
  98. package/dist/types/sdk/market/oracle/types.d.ts +3 -10
  99. package/dist/types/sdk/market/pool/PoolSuite.d.ts +2 -0
  100. package/dist/types/sdk/market/pool/PoolV310Contract.d.ts +6 -2
  101. package/dist/types/sdk/market/pool/index.d.ts +1 -0
  102. package/dist/types/sdk/market/pricefeeds/PriceFeedsRegister.d.ts +1 -1
  103. package/dist/types/sdk/market/types.d.ts +1 -1
  104. package/dist/types/sdk/options.d.ts +1 -0
  105. package/dist/types/sdk/pools/PoolService.d.ts +8 -8
  106. package/dist/types/sdk/pools/types.d.ts +1 -1
  107. package/dist/types/sdk/types/state-human.d.ts +2 -0
  108. package/dist/types/sdk/types/state.d.ts +5 -0
  109. package/dist/types/sdk/utils/viem/executeDelegatedMulticalls.d.ts +28 -0
  110. package/dist/types/sdk/utils/viem/index.d.ts +1 -2
  111. package/package.json +4 -4
  112. package/dist/cjs/sdk/utils/viem/getLogsPaginated.js +0 -62
  113. package/dist/cjs/sdk/utils/viem/getLogsSafe.js +0 -87
  114. package/dist/esm/sdk/accounts/utils.js +0 -14
  115. package/dist/esm/sdk/utils/viem/getLogsPaginated.js +0 -38
  116. package/dist/esm/sdk/utils/viem/getLogsSafe.js +0 -65
  117. package/dist/types/sdk/accounts/utils.d.ts +0 -2
  118. package/dist/types/sdk/utils/viem/getLogsPaginated.d.ts +0 -12
  119. package/dist/types/sdk/utils/viem/getLogsSafe.d.ts +0 -3
@@ -0,0 +1,295 @@
1
+ const iSecuritizeKYCFactoryAbi = [
2
+ {
3
+ type: "function",
4
+ name: "contractType",
5
+ inputs: [],
6
+ outputs: [{ name: "", type: "bytes32", internalType: "bytes32" }],
7
+ stateMutability: "view"
8
+ },
9
+ {
10
+ type: "function",
11
+ name: "getCreditAccounts",
12
+ inputs: [{ name: "investor", type: "address", internalType: "address" }],
13
+ outputs: [{ name: "", type: "address[]", internalType: "address[]" }],
14
+ stateMutability: "view"
15
+ },
16
+ {
17
+ type: "function",
18
+ name: "getDegenNFT",
19
+ inputs: [],
20
+ outputs: [{ name: "", type: "address", internalType: "address" }],
21
+ stateMutability: "view"
22
+ },
23
+ {
24
+ type: "function",
25
+ name: "getInvestor",
26
+ inputs: [
27
+ { name: "creditAccount", type: "address", internalType: "address" }
28
+ ],
29
+ outputs: [{ name: "", type: "address", internalType: "address" }],
30
+ stateMutability: "view"
31
+ },
32
+ {
33
+ type: "function",
34
+ name: "getTokens",
35
+ inputs: [],
36
+ outputs: [{ name: "", type: "address[]", internalType: "address[]" }],
37
+ stateMutability: "view"
38
+ },
39
+ {
40
+ type: "function",
41
+ name: "getWallet",
42
+ inputs: [
43
+ { name: "creditAccount", type: "address", internalType: "address" }
44
+ ],
45
+ outputs: [{ name: "", type: "address", internalType: "address" }],
46
+ stateMutability: "view"
47
+ },
48
+ {
49
+ type: "function",
50
+ name: "isCreditAccount",
51
+ inputs: [
52
+ { name: "creditAccount", type: "address", internalType: "address" }
53
+ ],
54
+ outputs: [{ name: "", type: "bool", internalType: "bool" }],
55
+ stateMutability: "view"
56
+ },
57
+ {
58
+ type: "function",
59
+ name: "isFrozen",
60
+ inputs: [
61
+ { name: "creditAccount", type: "address", internalType: "address" }
62
+ ],
63
+ outputs: [{ name: "", type: "bool", internalType: "bool" }],
64
+ stateMutability: "view"
65
+ },
66
+ {
67
+ type: "function",
68
+ name: "multicall",
69
+ inputs: [
70
+ { name: "creditAccount", type: "address", internalType: "address" },
71
+ {
72
+ name: "calls",
73
+ type: "tuple[]",
74
+ internalType: "struct MultiCall[]",
75
+ components: [
76
+ { name: "target", type: "address", internalType: "address" },
77
+ { name: "callData", type: "bytes", internalType: "bytes" }
78
+ ]
79
+ },
80
+ {
81
+ name: "tokensToRegister",
82
+ type: "address[]",
83
+ internalType: "address[]"
84
+ },
85
+ {
86
+ name: "signaturesToCache",
87
+ type: "tuple[]",
88
+ internalType: "struct ISecuritizeDegenNFT.RegisterMessage[]",
89
+ components: [
90
+ { name: "token", type: "address", internalType: "address" },
91
+ {
92
+ name: "signature",
93
+ type: "tuple",
94
+ internalType: "struct ISecuritizeDegenNFT.Signature",
95
+ components: [
96
+ { name: "deadline", type: "uint256", internalType: "uint256" },
97
+ { name: "signature", type: "bytes", internalType: "bytes" }
98
+ ]
99
+ }
100
+ ]
101
+ }
102
+ ],
103
+ outputs: [],
104
+ stateMutability: "nonpayable"
105
+ },
106
+ {
107
+ type: "function",
108
+ name: "openCreditAccount",
109
+ inputs: [
110
+ { name: "creditManager", type: "address", internalType: "address" },
111
+ {
112
+ name: "calls",
113
+ type: "tuple[]",
114
+ internalType: "struct MultiCall[]",
115
+ components: [
116
+ { name: "target", type: "address", internalType: "address" },
117
+ { name: "callData", type: "bytes", internalType: "bytes" }
118
+ ]
119
+ },
120
+ {
121
+ name: "tokensToRegister",
122
+ type: "address[]",
123
+ internalType: "address[]"
124
+ },
125
+ {
126
+ name: "signaturesToCache",
127
+ type: "tuple[]",
128
+ internalType: "struct ISecuritizeDegenNFT.RegisterMessage[]",
129
+ components: [
130
+ { name: "token", type: "address", internalType: "address" },
131
+ {
132
+ name: "signature",
133
+ type: "tuple",
134
+ internalType: "struct ISecuritizeDegenNFT.Signature",
135
+ components: [
136
+ { name: "deadline", type: "uint256", internalType: "uint256" },
137
+ { name: "signature", type: "bytes", internalType: "bytes" }
138
+ ]
139
+ }
140
+ ]
141
+ }
142
+ ],
143
+ outputs: [
144
+ { name: "creditAccount", type: "address", internalType: "address" },
145
+ { name: "wallet", type: "address", internalType: "address" }
146
+ ],
147
+ stateMutability: "nonpayable"
148
+ },
149
+ {
150
+ type: "function",
151
+ name: "precomputeWalletAddress",
152
+ inputs: [
153
+ { name: "creditManager", type: "address", internalType: "address" },
154
+ { name: "investor", type: "address", internalType: "address" }
155
+ ],
156
+ outputs: [{ name: "", type: "address", internalType: "address" }],
157
+ stateMutability: "view"
158
+ },
159
+ {
160
+ type: "function",
161
+ name: "serialize",
162
+ inputs: [],
163
+ outputs: [{ name: "serializedData", type: "bytes", internalType: "bytes" }],
164
+ stateMutability: "view"
165
+ },
166
+ {
167
+ type: "function",
168
+ name: "setFrozenStatus",
169
+ inputs: [
170
+ { name: "creditAccount", type: "address", internalType: "address" },
171
+ { name: "frozen", type: "bool", internalType: "bool" }
172
+ ],
173
+ outputs: [],
174
+ stateMutability: "nonpayable"
175
+ },
176
+ {
177
+ type: "function",
178
+ name: "setInvestor",
179
+ inputs: [
180
+ { name: "creditAccount", type: "address", internalType: "address" },
181
+ { name: "investor", type: "address", internalType: "address" }
182
+ ],
183
+ outputs: [],
184
+ stateMutability: "nonpayable"
185
+ },
186
+ {
187
+ type: "function",
188
+ name: "version",
189
+ inputs: [],
190
+ outputs: [{ name: "", type: "uint256", internalType: "uint256" }],
191
+ stateMutability: "view"
192
+ },
193
+ {
194
+ type: "event",
195
+ name: "CreateWallet",
196
+ inputs: [
197
+ {
198
+ name: "creditAccount",
199
+ type: "address",
200
+ indexed: true,
201
+ internalType: "address"
202
+ },
203
+ {
204
+ name: "wallet",
205
+ type: "address",
206
+ indexed: true,
207
+ internalType: "address"
208
+ },
209
+ {
210
+ name: "investor",
211
+ type: "address",
212
+ indexed: true,
213
+ internalType: "address"
214
+ }
215
+ ],
216
+ anonymous: false
217
+ },
218
+ {
219
+ type: "event",
220
+ name: "SetFrozenStatus",
221
+ inputs: [
222
+ {
223
+ name: "creditAccount",
224
+ type: "address",
225
+ indexed: true,
226
+ internalType: "address"
227
+ },
228
+ { name: "frozen", type: "bool", indexed: false, internalType: "bool" }
229
+ ],
230
+ anonymous: false
231
+ },
232
+ {
233
+ type: "event",
234
+ name: "SetInvestor",
235
+ inputs: [
236
+ {
237
+ name: "creditAccount",
238
+ type: "address",
239
+ indexed: true,
240
+ internalType: "address"
241
+ },
242
+ {
243
+ name: "oldInvestor",
244
+ type: "address",
245
+ indexed: true,
246
+ internalType: "address"
247
+ },
248
+ {
249
+ name: "newInvestor",
250
+ type: "address",
251
+ indexed: true,
252
+ internalType: "address"
253
+ }
254
+ ],
255
+ anonymous: false
256
+ },
257
+ {
258
+ type: "error",
259
+ name: "CallerIsNotInvestorException",
260
+ inputs: [
261
+ { name: "caller", type: "address", internalType: "address" },
262
+ { name: "creditAccount", type: "address", internalType: "address" }
263
+ ]
264
+ },
265
+ {
266
+ type: "error",
267
+ name: "FrozenCreditAccountException",
268
+ inputs: [
269
+ { name: "creditAccount", type: "address", internalType: "address" }
270
+ ]
271
+ },
272
+ {
273
+ type: "error",
274
+ name: "InvalidCreditManagerException",
275
+ inputs: [
276
+ { name: "creditManager", type: "address", internalType: "address" }
277
+ ]
278
+ },
279
+ {
280
+ type: "error",
281
+ name: "InvalidUnderlyingTokenException",
282
+ inputs: [{ name: "underlying", type: "address", internalType: "address" }]
283
+ },
284
+ {
285
+ type: "error",
286
+ name: "UnknownCreditAccountException",
287
+ inputs: [
288
+ { name: "creditAccount", type: "address", internalType: "address" }
289
+ ]
290
+ },
291
+ { type: "error", name: "ZeroAddressException", inputs: [] }
292
+ ];
293
+ export {
294
+ iSecuritizeKYCFactoryAbi
295
+ };
@@ -6,7 +6,7 @@ import {
6
6
  parseEventLogs
7
7
  } from "viem";
8
8
  import { generatePrivateKey, privateKeyToAccount } from "viem/accounts";
9
- import { iCreditFacadeV310Abi, iPoolV310Abi } from "../abi/310/generated.js";
9
+ import { iCreditFacadeV310Abi } from "../abi/310/generated.js";
10
10
  import { ierc20Abi } from "../abi/iERC20.js";
11
11
  import {
12
12
  ADDRESS_0X0,
@@ -15,6 +15,7 @@ import {
15
15
  childLogger,
16
16
  MAX_UINT256,
17
17
  PERCENTAGE_FACTOR,
18
+ PoolService,
18
19
  SDKConstruct,
19
20
  sendRawTx
20
21
  } from "../sdk/index.js";
@@ -43,6 +44,7 @@ class AccountOpener extends SDKConstruct {
43
44
  #minDebtMultiplier;
44
45
  #allowMint;
45
46
  #leverageDelta;
47
+ #poolService;
46
48
  constructor(service, options_ = {}) {
47
49
  super(service.sdk);
48
50
  const {
@@ -68,6 +70,7 @@ class AccountOpener extends SDKConstruct {
68
70
  this.#poolDepositMultiplier = BigInt(poolDepositMultiplier);
69
71
  this.#minDebtMultiplier = BigInt(minDebtMultiplier);
70
72
  this.#leverageDelta = BigInt(leverageDelta);
73
+ this.#poolService = new PoolService(service.sdk);
71
74
  this.#logger?.info(
72
75
  {
73
76
  borrower: privateKeyToAccount(this.borrowerKey).address,
@@ -105,6 +108,10 @@ class AccountOpener extends SDKConstruct {
105
108
  },
106
109
  "opening credit accounts"
107
110
  );
111
+ await Promise.all([
112
+ this.sdk.tokensMeta.loadTokenData(),
113
+ this.sdk.marketRegister.loadZappers()
114
+ ]);
108
115
  let deposits = [];
109
116
  if (depositIntoPools) {
110
117
  try {
@@ -456,9 +463,34 @@ class AccountOpener extends SDKConstruct {
456
463
  this.#logger?.debug(
457
464
  `depositor balance in underlying: ${this.sdk.tokensMeta.formatBN(pool.underlying, allowance, { symbol: true })}`
458
465
  );
466
+ const tokensOut = this.#poolService.getDepositTokensOut(
467
+ address,
468
+ underlying
469
+ );
470
+ this.#logger?.debug(
471
+ { tokensOut: tokensOut.map((t) => this.labelAddress(t)) },
472
+ "deposit tokens out"
473
+ );
474
+ if (tokensOut.length === 0) {
475
+ throw new Error(`no tokens out found for pool ${poolName}`);
476
+ }
477
+ const tokenOut = tokensOut[0];
478
+ const metadata = this.#poolService.getDepositMetadata(
479
+ address,
480
+ underlying,
481
+ tokenOut
482
+ );
483
+ this.logger?.debug(
484
+ {
485
+ underlying: this.labelAddress(underlying),
486
+ tokenOut: this.labelAddress(tokenOut),
487
+ ...metadata
488
+ },
489
+ "pool deposit metadata"
490
+ );
459
491
  txHash = await this.#anvil.writeContract({
460
492
  account: depositor,
461
- address: underlying,
493
+ address: metadata.approveTarget,
462
494
  abi: ierc20Abi,
463
495
  functionName: "approve",
464
496
  args: [address, allowance],
@@ -475,12 +507,21 @@ class AccountOpener extends SDKConstruct {
475
507
  this.#logger?.debug(
476
508
  `depositor approved underlying for pool ${poolName}: ${txHash}`
477
509
  );
510
+ const depositCall = this.#poolService.addLiquidity({
511
+ collateral: { token: underlying, balance: amount },
512
+ pool: address,
513
+ wallet: depositor.address,
514
+ meta: metadata
515
+ });
516
+ if (!depositCall) {
517
+ throw new Error(`no deposit call could be created for ${poolName}`);
518
+ }
478
519
  txHash = await this.#anvil.writeContract({
479
520
  account: depositor,
480
- address,
481
- abi: iPoolV310Abi,
482
- functionName: "deposit",
483
- args: [amount, depositor.address],
521
+ address: depositCall.target,
522
+ abi: depositCall.abi,
523
+ functionName: depositCall.functionName,
524
+ args: depositCall.args,
484
525
  chain: this.#anvil.chain
485
526
  });
486
527
  receipt = await this.#anvil.waitForTransactionReceipt({ hash: txHash });
@@ -36,7 +36,7 @@ class PoolPointsAPI {
36
36
  }
37
37
  static async getTokenTotal(token, network, tokensList) {
38
38
  const chainId = chains[network]?.id;
39
- const url = `https://charts-server.fly.dev/api/getBalanceAt?asset=${token}&chainId=${chainId}`;
39
+ const url = `https://api.gearbox.foundation/v1/getBalanceAt?asset=${token}&chainId=${chainId}`;
40
40
  const result = await axios.get(url);
41
41
  const balance = result.data.result.reduce(
42
42
  (sum, r) => r.effective_balance + sum,
@@ -15,8 +15,10 @@ class MultichainSDK {
15
15
  #chains;
16
16
  #redstoneCache;
17
17
  #pythCache;
18
+ #logger;
18
19
  constructor(options) {
19
20
  this.#chains = /* @__PURE__ */ new Map();
21
+ this.#logger = options.logger;
20
22
  for (const [network, chainConfig] of Object.entries(options.chains)) {
21
23
  const { gasLimit, ...clientOptions } = chainConfig;
22
24
  let plugins;
@@ -78,6 +80,7 @@ class MultichainSDK {
78
80
  });
79
81
  })
80
82
  );
83
+ this.#logger?.info("Attached all chains");
81
84
  }
82
85
  /**
83
86
  * Hydrate all configured chains from serialised state.
@@ -128,6 +131,7 @@ class MultichainSDK {
128
131
  }
129
132
  });
130
133
  }
134
+ this.#logger?.info("Hydrated all chains");
131
135
  }
132
136
  /**
133
137
  * Returns the {@link OnchainSDK} for a given network or chain ID.
@@ -186,6 +190,7 @@ class MultichainSDK {
186
190
  if (Object.keys(errors).length > 0) {
187
191
  throw new SdkSyncFailedError(errors);
188
192
  }
193
+ this.#logger?.info("Synced state for all chains");
189
194
  }
190
195
  /**
191
196
  * Serialisable snapshot of all chains' state.
@@ -22,12 +22,15 @@ import {
22
22
  SdkNotAttachedError,
23
23
  SdkStateVersionMismatchError
24
24
  } from "./core/index.js";
25
+ import { KYCRegistry } from "./market/index.js";
25
26
  import { MarketRegister } from "./market/MarketRegister.js";
26
27
  import { PriceFeedRegister } from "./market/pricefeeds/index.js";
27
28
  import { PluginStateVersionError } from "./plugins/index.js";
28
29
  import { createRouter } from "./router/index.js";
29
30
  import { formatTimestamp, TypedObjectUtils, toAddress } from "./utils/index.js";
30
- import { getLogsSafe } from "./utils/viem/index.js";
31
+ import {
32
+ executeDelegatedMulticalls
33
+ } from "./utils/viem/index.js";
31
34
  const STATE_VERSION = 1;
32
35
  function createViemClient(opts, chain) {
33
36
  if ("client" in opts) {
@@ -56,6 +59,7 @@ class OnchainSDK extends ChainContractsRegister {
56
59
  #syncing = false;
57
60
  #attached = false;
58
61
  #addressProvider;
62
+ #kyc;
59
63
  #marketRegister;
60
64
  #priceFeeds;
61
65
  /**
@@ -83,6 +87,7 @@ class OnchainSDK extends ChainContractsRegister {
83
87
  super(client, options?.logger);
84
88
  this.strictContractTypes = options?.strictContractTypes ?? false;
85
89
  this.plugins = options?.plugins ?? {};
90
+ this.#kyc = new KYCRegistry(this);
86
91
  for (const plugin of Object.values(this.plugins)) {
87
92
  plugin.sdk = this;
88
93
  }
@@ -112,6 +117,7 @@ class OnchainSDK extends ChainContractsRegister {
112
117
  const marketConfigurators = mcs ?? TypedObjectUtils.keys(
113
118
  this.client.chain.defaultMarketConfigurators
114
119
  );
120
+ const kycFactories = options?.kycFactories ?? this.client.chain.kycFactories;
115
121
  this.logger?.info(
116
122
  {
117
123
  networkType: this.networkType,
@@ -149,10 +155,33 @@ class OnchainSDK extends ChainContractsRegister {
149
155
  );
150
156
  await this.#addressProvider.syncState(this.currentBlock);
151
157
  this.#marketRegister = new MarketRegister(this, ignoreMarkets);
152
- await this.#marketRegister.loadMarkets(
153
- marketConfigurators,
154
- ignoreUpdateablePrices
155
- );
158
+ if (!marketConfigurators.length) {
159
+ this.logger?.warn(
160
+ "no market configurators provided, skipping market loading"
161
+ );
162
+ } else {
163
+ const delegated = [
164
+ ...this.#marketRegister.getLoadMulticalls(marketConfigurators),
165
+ ...this.#kyc.getLoadMulticalls(marketConfigurators, kycFactories)
166
+ ];
167
+ let txs = [];
168
+ if (!ignoreUpdateablePrices) {
169
+ const updatables = await this.#priceFeeds.getPartialUpdatablePriceFeeds(
170
+ marketConfigurators
171
+ );
172
+ const updates = await this.#priceFeeds.generatePriceFeedsUpdateTxs(updatables);
173
+ txs = updates.txs;
174
+ }
175
+ this.logger?.debug(
176
+ { configurators: marketConfigurators },
177
+ `calling getMarkets with ${txs.length} price updates in block ${this.currentBlock}`
178
+ );
179
+ await executeDelegatedMulticalls(this.client, delegated, {
180
+ priceUpdates: txs,
181
+ blockNumber: this.currentBlock,
182
+ gas: this.gasLimit
183
+ });
184
+ }
156
185
  const pluginsList = TypedObjectUtils.entries(this.plugins);
157
186
  const pluginResponse = await Promise.allSettled(
158
187
  pluginsList.map(([name, plugin]) => {
@@ -205,6 +234,8 @@ class OnchainSDK extends ChainContractsRegister {
205
234
  );
206
235
  this.#marketRegister = new MarketRegister(this, ignoreMarkets);
207
236
  this.#marketRegister.hydrate(state.markets);
237
+ this.#kyc = new KYCRegistry(this);
238
+ this.#kyc.setState(state.kyc);
208
239
  for (const [name, plugin] of TypedObjectUtils.entries(this.plugins)) {
209
240
  const pluginState = state.plugins[name];
210
241
  if (plugin.hydrate && pluginState) {
@@ -248,6 +279,7 @@ class OnchainSDK extends ChainContractsRegister {
248
279
  addressProviderV3: this.addressProvider.stateHuman(raw)
249
280
  },
250
281
  tokens: this.tokensMeta.values(),
282
+ kyc: this.#kyc.stateHuman(raw),
251
283
  plugins: Object.fromEntries(
252
284
  TypedObjectUtils.entries(this.plugins).map(([name, plugin]) => [
253
285
  name,
@@ -267,6 +299,7 @@ class OnchainSDK extends ChainContractsRegister {
267
299
  timestamp: this.timestamp,
268
300
  addressProvider: this.addressProvider.state,
269
301
  markets: this.marketRegister.state,
302
+ kyc: this.#kyc.state,
270
303
  plugins: Object.fromEntries(
271
304
  TypedObjectUtils.entries(this.plugins).map(([name, plugin]) => [
272
305
  name,
@@ -321,7 +354,7 @@ class OnchainSDK extends ChainContractsRegister {
321
354
  this.logger?.debug(
322
355
  `getting logs from ${watchAddresses.length} addresses in [${fromBlock}:${blockNumber}]`
323
356
  );
324
- const logs = await getLogsSafe(this.client, {
357
+ const logs = await this.client.getLogs({
325
358
  fromBlock,
326
359
  toBlock: blockNumber,
327
360
  address: watchAddresses
@@ -434,9 +467,27 @@ class OnchainSDK extends ChainContractsRegister {
434
467
  return this.#marketRegister;
435
468
  }
436
469
  /**
470
+ * KYC register for KYC-wrapped underlying tokens and factories.
471
+ *
472
+ * @throws If the SDK has not been attached or hydrated yet.
473
+ **/
474
+ get kyc() {
475
+ if (this.#kyc === void 0) {
476
+ throw new SdkNotAttachedError();
477
+ }
478
+ return this.#kyc;
479
+ }
480
+ /**
481
+ * @internal
437
482
  * Resolves the appropriate router contract for a given credit manager,
438
483
  * credit facade, or explicit version range.
439
- */
484
+ *
485
+ * @param params - Identifies the context: a credit manager address/state,
486
+ * a credit facade address/state, or a {@link VersionRange}.
487
+ * @returns The matching router contract instance.
488
+ * @throws If the credit facade version is unsupported or no router is
489
+ * registered for the resolved version range.
490
+ **/
440
491
  routerFor(params) {
441
492
  let routerRange;
442
493
  if (Array.isArray(params)) {