@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,218 @@
1
+ import { decodeAbiParameters } from "viem";
2
+ import { iSecuritizeKYCFactoryAbi } from "../../../../abi/kyc/iSecuritizeKYCFactory.js";
3
+ import { BaseContract } from "../../../base/index.js";
4
+ import { AddressMap, AddressSet } from "../../../utils/index.js";
5
+ import { KYC_FACTORY_SECURITIZE } from "./constants.js";
6
+ const abi = iSecuritizeKYCFactoryAbi;
7
+ class SecuritizeKYCFactory extends BaseContract {
8
+ #sdk;
9
+ #investorCache = new AddressMap();
10
+ degenNFT;
11
+ owner;
12
+ dsTokens;
13
+ contractType = KYC_FACTORY_SECURITIZE;
14
+ constructor(sdk, data) {
15
+ super(sdk, {
16
+ ...data.baseParams,
17
+ name: "SecuritizeKYCFactory",
18
+ abi
19
+ });
20
+ this.#sdk = sdk;
21
+ const decoded = decodeAbiParameters(
22
+ [
23
+ { name: "owner", type: "address" },
24
+ { name: "degenNFT", type: "address" },
25
+ {
26
+ name: "dsTokensData",
27
+ type: "tuple[]",
28
+ components: [
29
+ { name: "token", type: "address" },
30
+ { name: "registrar", type: "address" },
31
+ { name: "operators", type: "address[]" }
32
+ ]
33
+ }
34
+ ],
35
+ data.baseParams.serializedParams
36
+ );
37
+ this.owner = decoded[0];
38
+ this.degenNFT = decoded[1];
39
+ for (const t of data.tokens) {
40
+ this.tokensMeta.upsert(t.addr, t);
41
+ }
42
+ this.dsTokens = decoded[2].map((t) => ({
43
+ address: t.token,
44
+ registrar: t.registrar,
45
+ operators: [...t.operators]
46
+ }));
47
+ }
48
+ /**
49
+ * {@inheritDoc IKYCFactory.decodeInvestorData}
50
+ */
51
+ decodeInvestorData(data) {
52
+ const { creditAccounts, extraDetails } = data;
53
+ const [registeredTokens, cachedSignatures, registerVaultMessages] = decodeAbiParameters(
54
+ [
55
+ { name: "registeredTokens", type: "address[]" },
56
+ {
57
+ name: "cachedSignatures",
58
+ type: "tuple[]",
59
+ components: [...registerMessageTuple]
60
+ },
61
+ {
62
+ name: "registerVaultMessages",
63
+ type: "tuple[]",
64
+ components: [...registerVaultMessageTuple]
65
+ }
66
+ ],
67
+ extraDetails
68
+ );
69
+ return {
70
+ type: KYC_FACTORY_SECURITIZE,
71
+ factory: this.address,
72
+ cachedSignatures: [...cachedSignatures],
73
+ registerVaultMessages: [...registerVaultMessages],
74
+ registeredTokens: [...registeredTokens],
75
+ creditAccounts: creditAccounts.map((ca) => {
76
+ const [registeredTokens2] = decodeAbiParameters(
77
+ [{ name: "registeredTokens", type: "address[]" }],
78
+ ca.extraDetails
79
+ );
80
+ return {
81
+ ...ca,
82
+ registeredTokens: [...registeredTokens2]
83
+ };
84
+ })
85
+ };
86
+ }
87
+ /**
88
+ * {@inheritDoc IKYCFactory.getInvestor}
89
+ */
90
+ async getInvestor(creditAccount, fromCache) {
91
+ if (fromCache && this.#investorCache.has(creditAccount)) {
92
+ return this.#investorCache.mustGet(creditAccount);
93
+ }
94
+ const investor = await this.contract.read.getInvestor([creditAccount]);
95
+ if (fromCache) {
96
+ this.#investorCache.upsert(creditAccount, investor);
97
+ }
98
+ return investor;
99
+ }
100
+ /**
101
+ * {@inheritDoc IKYCFactory.getApprovalAddress}
102
+ */
103
+ async getApprovalAddress(options) {
104
+ if ("creditAccount" in options) {
105
+ return this.getWallet(options.creditAccount);
106
+ }
107
+ return this.#precomputeWalletAddress(
108
+ options.creditManager,
109
+ options.borrower
110
+ );
111
+ }
112
+ /**
113
+ * {@inheritDoc IKYCFactory.getWallet}
114
+ */
115
+ async getWallet(creditAccount) {
116
+ return this.contract.read.getWallet([creditAccount]);
117
+ }
118
+ /**
119
+ * {@inheritDoc IKYCFactory.multicall}
120
+ */
121
+ multicall(creditAccount, calls, options) {
122
+ const { tokensToRegister = [], signaturesToCache = [] } = options ?? {};
123
+ return this.createRawTx({
124
+ functionName: "multicall",
125
+ args: [creditAccount, calls, tokensToRegister, signaturesToCache]
126
+ });
127
+ }
128
+ /**
129
+ * {@inheritDoc IKYCFactory.getOpenAccountRequirements}
130
+ */
131
+ async getOpenAccountRequirements(investor, props) {
132
+ const [investorData] = await this.#sdk.kyc.getInvestorData(investor, [
133
+ this.address
134
+ ]);
135
+ const tokensToRegister = new AddressSet([props.tokenOutAddress]);
136
+ const registredTokens = new AddressSet(investorData.registeredTokens);
137
+ const signedTokens = new AddressSet(
138
+ investorData.cachedSignatures.map((s) => s.token)
139
+ );
140
+ const unsignedTokens = tokensToRegister.difference(signedTokens);
141
+ const securitizeTokensToRegister = tokensToRegister.difference(registredTokens);
142
+ const requiredSignatures = investorData.registerVaultMessages.filter(
143
+ (m) => unsignedTokens.has(m.token)
144
+ );
145
+ return {
146
+ type: KYC_FACTORY_SECURITIZE,
147
+ securitizeTokensToRegister: Array.from(securitizeTokensToRegister),
148
+ tokensToRegister: Array.from(tokensToRegister),
149
+ requiredSignatures
150
+ };
151
+ }
152
+ /**
153
+ * {@inheritDoc IKYCFactory.openCreditAccount}
154
+ */
155
+ openCreditAccount(creditManager, calls, options) {
156
+ const { tokensToRegister = [], signaturesToCache = [] } = options ?? {};
157
+ return this.createRawTx({
158
+ functionName: "openCreditAccount",
159
+ args: [creditManager, calls, tokensToRegister, signaturesToCache]
160
+ });
161
+ }
162
+ stateHuman(_raw) {
163
+ return {
164
+ ...super.stateHuman(_raw),
165
+ owner: this.labelAddress(this.owner),
166
+ degenNFT: this.labelAddress(this.degenNFT),
167
+ dsTokens: this.dsTokens.map((t) => ({
168
+ ...this.tokensMeta.mustGet(t.address),
169
+ registrar: this.labelAddress(t.registrar),
170
+ operators: t.operators.map((o) => this.labelAddress(o))
171
+ }))
172
+ };
173
+ }
174
+ /**
175
+ * Precomputes the wallet address that will own a new credit account
176
+ * for the given investor in the given credit manager.
177
+ *
178
+ * @param creditManager - credit manager address
179
+ * @param investor - investor address
180
+ **/
181
+ async #precomputeWalletAddress(creditManager, investor) {
182
+ return this.contract.read.precomputeWalletAddress([
183
+ creditManager,
184
+ investor
185
+ ]);
186
+ }
187
+ }
188
+ const registerMessageTuple = [
189
+ { name: "token", type: "address" },
190
+ {
191
+ name: "signature",
192
+ type: "tuple",
193
+ components: [
194
+ { name: "deadline", type: "uint256" },
195
+ { name: "signature", type: "bytes" }
196
+ ]
197
+ }
198
+ ];
199
+ const registerVaultMessageTuple = [
200
+ {
201
+ name: "domain",
202
+ type: "tuple",
203
+ components: [
204
+ { name: "name", type: "string" },
205
+ { name: "version", type: "string" },
206
+ { name: "chainId", type: "uint256" },
207
+ { name: "verifyingContract", type: "address" }
208
+ ]
209
+ },
210
+ { name: "investor", type: "address" },
211
+ { name: "operator", type: "address" },
212
+ { name: "token", type: "address" },
213
+ { name: "nonce", type: "uint256" },
214
+ { name: "deadline", type: "uint256" }
215
+ ];
216
+ export {
217
+ SecuritizeKYCFactory
218
+ };
@@ -0,0 +1,4 @@
1
+ const KYC_FACTORY_SECURITIZE = "KYC_FACTORY::SECURITIZE";
2
+ export {
3
+ KYC_FACTORY_SECURITIZE
4
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./constants.js";
2
+ export * from "./SecuritizeKYCFactory.js";
3
+ export * from "./types.js";
File without changes
@@ -0,0 +1,9 @@
1
+ import { KYC_FACTORY_SECURITIZE } from "./securitize/index.js";
2
+ const KYC_FACTORY_TYPES = [KYC_FACTORY_SECURITIZE];
3
+ function isKYCFactory(factory, type) {
4
+ return factory.contractType === type;
5
+ }
6
+ export {
7
+ KYC_FACTORY_TYPES,
8
+ isKYCFactory
9
+ };
@@ -55,6 +55,9 @@ class PoolSuite extends SDKConstruct {
55
55
  get underlying() {
56
56
  return this.pool.underlying;
57
57
  }
58
+ get kycFactory() {
59
+ return this.pool.kycFactory;
60
+ }
58
61
  get dirty() {
59
62
  return this.pool.dirty || this.rateKeeper.dirty || this.pqk.dirty || this.interestRateModel.dirty;
60
63
  }
@@ -10,13 +10,15 @@ import {
10
10
  const abi = [...iPoolV310Abi, ...iPausableAbi];
11
11
  class PoolV310Contract extends BaseContract {
12
12
  creditManagerDebtParams;
13
- constructor(options, data) {
13
+ #sdk;
14
+ constructor(sdk, data) {
14
15
  const { baseParams, creditManagerDebtParams, ...rest } = data;
15
- super(options, {
16
+ super(sdk, {
16
17
  ...data.baseParams,
17
18
  name: `PoolV3(${data.name})`,
18
19
  abi
19
20
  });
21
+ this.#sdk = sdk;
20
22
  Object.assign(this, rest);
21
23
  this.creditManagerDebtParams = new AddressMap(
22
24
  creditManagerDebtParams.map((p) => [p.creditManager, p])
@@ -28,6 +30,13 @@ class PoolV310Contract extends BaseContract {
28
30
  symbol: data.symbol
29
31
  });
30
32
  }
33
+ get kycFactory() {
34
+ const meta = this.#sdk.tokensMeta.mustGet(this.underlying);
35
+ if (this.#sdk.tokensMeta.isKYCUnderlying(meta)) {
36
+ return this.#sdk.mustGetContract(meta.kycFactory);
37
+ }
38
+ return void 0;
39
+ }
31
40
  stateHuman(raw = true) {
32
41
  return {
33
42
  ...super.stateHuman(raw),
@@ -1,4 +1,5 @@
1
1
  export * from "./GaugeContract.js";
2
2
  export * from "./LinearInterestRateModelContract.js";
3
3
  export * from "./PoolSuite.js";
4
+ export * from "./PoolV310Contract.js";
4
5
  export * from "./types.js";
@@ -221,13 +221,13 @@ class PriceFeedRegister extends SDKConstruct {
221
221
  * Loads PARTIAL information about all updatable price feeds from MarketCompressor
222
222
  * Discovered price feeds are not saved anywhere in PriceFeedRegister, and can later be used to load price feed updates
223
223
  */
224
- async getPartialUpdatablePriceFeeds(configurators, pools) {
224
+ async getPartialUpdatablePriceFeeds(configurators) {
225
225
  const [priceFeedCompressorAddress] = this.sdk.addressProvider.mustGetLatest(
226
226
  AP_PRICE_FEED_COMPRESSOR,
227
227
  VERSION_RANGE_310
228
228
  );
229
229
  this.logger?.debug(
230
- { configurators, pools },
230
+ { configurators },
231
231
  `calling getUpdatablePriceFeeds in block ${this.sdk.currentBlock}`
232
232
  );
233
233
  const result = await this.client.readContract({
@@ -237,7 +237,7 @@ class PriceFeedRegister extends SDKConstruct {
237
237
  args: [
238
238
  {
239
239
  configurators,
240
- pools: pools ?? [],
240
+ pools: [],
241
241
  underlying: ADDRESS_0X0
242
242
  }
243
243
  ],
@@ -23,6 +23,12 @@ const AttachOptionsSchema = z.object({
23
23
  addressProvider: ZodAddress().optional(),
24
24
  /** Addresses of market configurator contracts to load. */
25
25
  marketConfigurators: z.array(ZodAddress()).optional(),
26
+ /**
27
+ * Addresses of KYC factory contracts to load.
28
+ * If not set, all default KYC factories for the chain are loaded
29
+ * (from {@link GearboxChain.kycFactories})
30
+ **/
31
+ kycFactories: z.array(ZodAddress()).optional(),
26
32
  /** Pin SDK to a specific block number during attach. */
27
33
  blockNumber: z.union([z.bigint().nonnegative(), z.number().int().nonnegative()]).optional(),
28
34
  /** Skip fetching updatable price feeds on attach and sync. */
@@ -1,34 +1,84 @@
1
1
  import { iPoolV310Abi } from "../../abi/310/generated.js";
2
+ import { ierc20Abi } from "../../abi/iERC20.js";
2
3
  import { ierc20ZapperDepositsAbi } from "../../abi/iERC20ZapperDeposits.js";
3
4
  import { iethZapperDepositsAbi } from "../../abi/iETHZapperDeposits.js";
4
5
  import { iZapperAbi } from "../../abi/iZapper.js";
5
- import { SDKConstruct } from "../base/index.js";
6
+ import {
7
+ KYC_UNDERLYING_DEFAULT,
8
+ KYC_UNDERLYING_ON_DEMAND,
9
+ SDKConstruct
10
+ } from "../base/index.js";
6
11
  import { NATIVE_ADDRESS } from "../constants/index.js";
7
12
  import { AddressSet, hexEq } from "../utils/index.js";
8
13
  class PoolService extends SDKConstruct {
9
14
  /**
10
- * @inheritdoc IPoolsService.getDepositTokensIn
15
+ * {@inheritDoc IPoolsService.getDepositTokensIn}
11
16
  */
12
17
  getDepositTokensIn(pool) {
18
+ const underlying = this.#describeUnderlying(pool);
19
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
20
+ switch (underlying.contractType) {
21
+ case KYC_UNDERLYING_DEFAULT:
22
+ return this.#depositTokensIn(pool, false);
23
+ case KYC_UNDERLYING_ON_DEMAND:
24
+ return [underlying.asset];
25
+ }
26
+ }
13
27
  return this.#depositTokensIn(pool, true);
14
28
  }
15
29
  /**
16
- * @inheritdoc IPoolsService.getDepositTokensOut
30
+ * {@inheritDoc IPoolsService.getDepositTokensOut}
17
31
  */
18
32
  getDepositTokensOut(pool, tokenIn) {
33
+ const underlying = this.#describeUnderlying(pool);
34
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
35
+ switch (underlying.contractType) {
36
+ case KYC_UNDERLYING_DEFAULT:
37
+ return this.#depositTokensOut(pool, tokenIn, false);
38
+ case KYC_UNDERLYING_ON_DEMAND:
39
+ return [];
40
+ }
41
+ }
19
42
  return this.#depositTokensOut(pool, tokenIn, true);
20
43
  }
21
44
  /**
22
- * @inheritdoc IPoolsService.getDepositMetadata
45
+ * {@inheritDoc IPoolsService.getDepositMetadata}
23
46
  */
24
47
  getDepositMetadata(pool, tokenIn, tokenOut) {
48
+ const underlying = this.#describeUnderlying(pool);
49
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
50
+ switch (underlying.contractType) {
51
+ case KYC_UNDERLYING_DEFAULT: {
52
+ return this.#depositMetadata(
53
+ "kyc-default",
54
+ pool,
55
+ tokenIn,
56
+ tokenOut,
57
+ false
58
+ );
59
+ }
60
+ case KYC_UNDERLYING_ON_DEMAND:
61
+ return {
62
+ zapper: void 0,
63
+ approveTarget: underlying.liquidityProvider.addr,
64
+ permissible: false,
65
+ type: "kyc-on-demand"
66
+ };
67
+ }
68
+ }
25
69
  return this.#depositMetadata("classic", pool, tokenIn, tokenOut, true);
26
70
  }
27
71
  /**
28
- * @inheritdoc IPoolsService.addLiquidity
72
+ * {@inheritDoc IPoolsService.addLiquidity}
29
73
  */
30
74
  addLiquidity(props) {
31
75
  const { collateral, meta, permit, referralCode, pool, wallet } = props;
76
+ const underlying = this.#describeUnderlying(pool);
77
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
78
+ if (underlying.contractType === KYC_UNDERLYING_ON_DEMAND) {
79
+ return void 0;
80
+ }
81
+ }
32
82
  const { zapper } = meta;
33
83
  if (zapper && hexEq(zapper.tokenIn.addr, NATIVE_ADDRESS)) {
34
84
  return {
@@ -68,22 +118,51 @@ class PoolService extends SDKConstruct {
68
118
  }
69
119
  }
70
120
  /**
71
- * @inheritdoc IPoolsService.getWithdrawalTokensIn
121
+ * {@inheritDoc IPoolsService.getWithdrawalTokensIn}
72
122
  */
73
123
  getWithdrawalTokensIn(pool) {
124
+ const underlying = this.#describeUnderlying(pool);
125
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
126
+ switch (underlying.contractType) {
127
+ case KYC_UNDERLYING_DEFAULT:
128
+ return this.#withdrawalTokensIn(pool, false);
129
+ case KYC_UNDERLYING_ON_DEMAND:
130
+ return [];
131
+ }
132
+ }
74
133
  return this.#withdrawalTokensIn(pool, true);
75
134
  }
76
135
  /**
77
- * @inheritdoc IPoolsService.getWithdrawalTokensOut
136
+ * {@inheritDoc IPoolsService.getWithdrawalTokensOut}
78
137
  */
79
138
  getWithdrawalTokensOut(pool, tokenIn) {
139
+ const underlying = this.#describeUnderlying(pool);
140
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
141
+ switch (underlying.contractType) {
142
+ case KYC_UNDERLYING_DEFAULT:
143
+ return this.#withdrawalTokensOut(pool, tokenIn, false);
144
+ case KYC_UNDERLYING_ON_DEMAND:
145
+ return [underlying.asset];
146
+ }
147
+ }
80
148
  return this.#withdrawalTokensOut(pool, tokenIn, true);
81
149
  }
82
150
  /**
83
- * @inheritdoc IPoolsService.removeLiquidity
151
+ * {@inheritDoc IPoolsService.removeLiquidity}
84
152
  */
85
153
  removeLiquidity(props) {
86
154
  const { pool, amount, meta, wallet, permit } = props;
155
+ const underlying = this.#describeUnderlying(pool);
156
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
157
+ if (underlying.contractType === KYC_UNDERLYING_ON_DEMAND) {
158
+ return {
159
+ abi: ierc20Abi,
160
+ functionName: "approve",
161
+ args: [underlying.liquidityProvider, 0n],
162
+ target: underlying.asset
163
+ };
164
+ }
165
+ }
87
166
  if (meta.zapper) {
88
167
  return permit ? {
89
168
  target: meta.zapper.baseParams.addr,
@@ -112,9 +191,30 @@ class PoolService extends SDKConstruct {
112
191
  };
113
192
  }
114
193
  /**
115
- * @inheritdoc IPoolsService.getWithdrawalMetadata
194
+ * {@inheritDoc IPoolsService.getWithdrawalMetadata}
116
195
  */
117
196
  getWithdrawalMetadata(pool, tokenIn, tokenOut) {
197
+ const underlying = this.#describeUnderlying(pool);
198
+ if (this.sdk.tokensMeta.isKYCUnderlying(underlying)) {
199
+ switch (underlying.contractType) {
200
+ case KYC_UNDERLYING_DEFAULT: {
201
+ return this.#withdrawalMetadata(
202
+ "kyc-default",
203
+ pool,
204
+ tokenIn,
205
+ tokenOut,
206
+ false
207
+ );
208
+ }
209
+ case KYC_UNDERLYING_ON_DEMAND:
210
+ return {
211
+ zapper: void 0,
212
+ approveTarget: void 0,
213
+ permissible: false,
214
+ type: "kyc-on-demand"
215
+ };
216
+ }
217
+ }
118
218
  return this.#withdrawalMetadata("classic", pool, tokenIn, tokenOut, true);
119
219
  }
120
220
  /**
@@ -274,8 +374,6 @@ class PoolService extends SDKConstruct {
274
374
  zapper,
275
375
  // Approval target is zapper when routed, otherwise the pool contract.
276
376
  approveTarget: zapper?.baseParams.addr ?? pool.pool.address,
277
- // TODO: instead of permissible, return permitType depending on tokenIn
278
- // "none" | "eip2612" | "dai_like";
279
377
  permissible: !!zapper && !hexEq(tokenIn, NATIVE_ADDRESS),
280
378
  type
281
379
  };
@@ -303,8 +401,6 @@ class PoolService extends SDKConstruct {
303
401
  zapper,
304
402
  // Approval target exists only for zapper-based withdrawals.
305
403
  approveTarget: zapper?.baseParams.addr,
306
- // TODO: instead of permissible, return permitType depending on tokenIn
307
- // "none" | "eip2612" | "dai_like";
308
404
  permissible: !!zapper,
309
405
  type
310
406
  };
@@ -0,0 +1,14 @@
1
+ import { simulateWithPriceUpdates } from "./simulateWithPriceUpdates.js";
2
+ async function executeDelegatedMulticalls(client, multicalls, opts) {
3
+ if (!multicalls.length) return;
4
+ const results = await simulateWithPriceUpdates(client, {
5
+ ...opts,
6
+ contracts: multicalls.map((d) => d.call)
7
+ });
8
+ for (let i = 0; i < multicalls.length; i++) {
9
+ multicalls[i].onResult(results[i]);
10
+ }
11
+ }
12
+ export {
13
+ executeDelegatedMulticalls
14
+ };
@@ -1,6 +1,5 @@
1
1
  export * from "./cast.js";
2
- export * from "./getLogsPaginated.js";
3
- export * from "./getLogsSafe.js";
2
+ export * from "./executeDelegatedMulticalls.js";
4
3
  export * from "./sendRawTx.js";
5
4
  export * from "./simulateMulticall.js";
6
5
  export * from "./simulateWithPriceUpdates.js";