@gearbox-protocol/sdk 16.3.0-next.4 → 17.0.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 (91) hide show
  1. package/dist/cjs/model/errors/operation-errors.js +1 -1
  2. package/dist/cjs/model/index.js +2 -2
  3. package/dist/cjs/model/rwa.js +4 -4
  4. package/dist/cjs/model/rwa.schema.js +4 -4
  5. package/dist/cjs/offchain/opportunities/OffchainOpportunities.js +1 -1
  6. package/dist/cjs/onchain/accounts/CreditAccountsServiceV310.js +3 -1
  7. package/dist/cjs/onchain/accounts/intents/guards.js +4 -4
  8. package/dist/cjs/onchain/accounts/liquidations/LiquidationsService.js +1 -1
  9. package/dist/cjs/onchain/market/credit/CreditSuite.js +12 -26
  10. package/dist/cjs/onchain/market/rwa/midas/MidasDegenNFT.js +5 -45
  11. package/dist/cjs/onchain/market/rwa/securitize/SecuritizeDegenNFT.js +12 -56
  12. package/dist/cjs/onchain/market/rwa/securitize/SecuritizeRWAFactory.js +37 -0
  13. package/dist/cjs/onchain/opportunities/MultichainOpportunitiesService.js +2 -8
  14. package/dist/cjs/onchain/opportunities/OpportunitiesService.js +4 -16
  15. package/dist/cjs/onchain/preview/parse/parseRWAFactoryOperationCalldata.js +2 -2
  16. package/dist/cjs/onchain/validation/bundles/checkCreditOperation.js +2 -3
  17. package/dist/cjs/onchain/validation/bundles/checkDraw.js +3 -3
  18. package/dist/cjs/onchain/validation/bundles/checkRWAOpenRequirements.js +9 -9
  19. package/dist/cjs/onchain/validation/bundles/checkRWAOpening.js +5 -6
  20. package/dist/cjs/onchain/validation/checkSimulation.js +4 -11
  21. package/dist/cjs/onchain/validation/checks/checkDebtLimits.js +2 -3
  22. package/dist/cjs/sdk/execute/ExecuteApi.js +2 -2
  23. package/dist/cjs/sdk/opportunities/OpportunitiesNamespace.js +3 -9
  24. package/dist/esm/dev/AccountOpener.js +1 -1
  25. package/dist/esm/dev/withdrawalUtils.js +1 -1
  26. package/dist/esm/history/trace/extractTransfers.js +1 -1
  27. package/dist/esm/model/errors/operation-errors.js +1 -1
  28. package/dist/esm/model/index.js +3 -3
  29. package/dist/esm/model/rwa.js +4 -4
  30. package/dist/esm/model/rwa.schema.js +5 -5
  31. package/dist/esm/offchain/opportunities/OffchainOpportunities.js +1 -1
  32. package/dist/esm/onchain/accounts/CreditAccountsServiceV310.js +5 -3
  33. package/dist/esm/onchain/accounts/intents/guards.js +4 -4
  34. package/dist/esm/onchain/accounts/liquidations/LiquidationsService.js +2 -2
  35. package/dist/esm/onchain/accounts/withdrawal-compressor/RedemptionLoggerV310Contract.js +1 -1
  36. package/dist/esm/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV310Contract.js +1 -1
  37. package/dist/esm/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV311Contract.js +1 -1
  38. package/dist/esm/onchain/accounts/withdrawal-compressor/WithdrawalCompressorV313Contract.js +1 -1
  39. package/dist/esm/onchain/base/TokensMeta.js +3 -3
  40. package/dist/esm/onchain/core/createAddressProvider.js +1 -1
  41. package/dist/esm/onchain/market/adapters/contracts/AccountMigratorAdapterContract.js +1 -1
  42. package/dist/esm/onchain/market/adapters/contracts/ERC4626AdapterContract.js +1 -1
  43. package/dist/esm/onchain/market/credit/CreditFacadeV310BaseContract.js +1 -1
  44. package/dist/esm/onchain/market/credit/CreditSuite.js +12 -26
  45. package/dist/esm/onchain/market/pool/PoolV310Contract.js +1 -1
  46. package/dist/esm/onchain/market/rwa/createDegenNFT.js +1 -1
  47. package/dist/esm/onchain/market/rwa/midas/MidasDegenNFT.js +5 -45
  48. package/dist/esm/onchain/market/rwa/securitize/SecuritizeDegenNFT.js +10 -55
  49. package/dist/esm/onchain/market/rwa/securitize/SecuritizeRWAFactory.js +37 -0
  50. package/dist/esm/onchain/market/zapper/IETHZapperContract.js +1 -1
  51. package/dist/esm/onchain/market/zapper/ZapperContract.js +1 -1
  52. package/dist/esm/onchain/opportunities/MultichainOpportunitiesService.js +2 -8
  53. package/dist/esm/onchain/opportunities/OpportunitiesService.js +4 -16
  54. package/dist/esm/onchain/preview/parse/parseRWAFactoryOperationCalldata.js +2 -2
  55. package/dist/esm/onchain/preview/preview/previewPoolPositionOperation.js +2 -2
  56. package/dist/esm/onchain/utils/viem/simulateWithPriceUpdates.js +1 -1
  57. package/dist/esm/onchain/validation/bundles/checkCreditOperation.js +2 -3
  58. package/dist/esm/onchain/validation/bundles/checkDraw.js +3 -3
  59. package/dist/esm/onchain/validation/bundles/checkRWAOpenRequirements.js +9 -9
  60. package/dist/esm/onchain/validation/bundles/checkRWAOpening.js +5 -6
  61. package/dist/esm/onchain/validation/checkSimulation.js +4 -11
  62. package/dist/esm/onchain/validation/checks/checkDebtLimits.js +2 -3
  63. package/dist/esm/sdk/execute/ExecuteApi.js +2 -2
  64. package/dist/esm/sdk/opportunities/OpportunitiesNamespace.js +3 -9
  65. package/dist/types/model/errors/operation-errors.d.ts +4 -10
  66. package/dist/types/model/index.d.ts +3 -3
  67. package/dist/types/model/opportunities.d.ts +5 -4
  68. package/dist/types/model/rwa.d.ts +27 -47
  69. package/dist/types/model/rwa.schema.d.ts +3 -3
  70. package/dist/types/offchain/opportunities/OffchainOpportunities.d.ts +2 -1
  71. package/dist/types/offchain/opportunities/types.d.ts +4 -1
  72. package/dist/types/onchain/accounts/types.d.ts +2 -4
  73. package/dist/types/onchain/index.d.ts +2 -2
  74. package/dist/types/onchain/market/credit/CreditSuite.d.ts +3 -8
  75. package/dist/types/onchain/market/credit/types.d.ts +2 -2
  76. package/dist/types/onchain/market/index.d.ts +2 -2
  77. package/dist/types/onchain/market/rwa/index.d.ts +2 -2
  78. package/dist/types/onchain/market/rwa/midas/MidasDegenNFT.d.ts +4 -19
  79. package/dist/types/onchain/market/rwa/securitize/SecuritizeDegenNFT.d.ts +4 -24
  80. package/dist/types/onchain/market/rwa/securitize/SecuritizeRWAFactory.d.ts +14 -2
  81. package/dist/types/onchain/market/rwa/types.d.ts +37 -39
  82. package/dist/types/onchain/opportunities/MultichainOpportunitiesService.d.ts +1 -5
  83. package/dist/types/onchain/opportunities/OpportunitiesService.d.ts +3 -10
  84. package/dist/types/onchain/opportunities/types.d.ts +1 -6
  85. package/dist/types/onchain/validation/bundles/checkRWAOpenRequirements.d.ts +2 -2
  86. package/dist/types/onchain/validation/bundles/checkRWAOpening.d.ts +3 -3
  87. package/dist/types/onchain/validation/checkSimulation.d.ts +3 -6
  88. package/dist/types/onchain/validation/checks/checkDebtLimits.d.ts +0 -4
  89. package/dist/types/sdk/opportunities/OpportunitiesNamespace.d.ts +1 -5
  90. package/dist/types/sdk/opportunities/types.d.ts +3 -9
  91. package/package.json +1 -1
@@ -114,7 +114,7 @@ function insufficientAllowance(args) {
114
114
  function rwaOpenRequirementsNotMet(args) {
115
115
  return {
116
116
  code: "rwaOpenRequirementsNotMet",
117
- message: `${args.protocol} still wants something from the borrower before ${args.token.symbol} can be opened on.`,
117
+ message: `The RWA factory still wants something from the borrower before ${args.token.symbol} can be opened on.`,
118
118
  ...args
119
119
  };
120
120
  }
@@ -39,13 +39,13 @@ exports.CHART_METRIC_UNITS = require_model_charts.CHART_METRIC_UNITS;
39
39
  exports.CHART_RANGES = require_model_charts.CHART_RANGES;
40
40
  exports.CHART_UNAVAILABLE_CODES = require_model_charts.CHART_UNAVAILABLE_CODES;
41
41
  exports.FILTER_ALL = require_model_filters.FILTER_ALL;
42
+ exports.KYC_PROTOCOLS = require_model_rwa.KYC_PROTOCOLS;
42
43
  exports.KYC_REGISTRATION_LINKS = require_model_rwa.KYC_REGISTRATION_LINKS;
43
44
  exports.POOL_OPPORTUNITY_CHART_METRICS = require_model_charts.POOL_OPPORTUNITY_CHART_METRICS;
44
45
  exports.POOL_POSITION_CHART_METRICS = require_model_charts.POOL_POSITION_CHART_METRICS;
45
46
  exports.PROTOCOL_CHART_METRICS = require_model_charts.PROTOCOL_CHART_METRICS;
46
47
  exports.RWA_FACTORY_SECURITIZE = require_model_rwa.RWA_FACTORY_SECURITIZE;
47
48
  exports.RWA_FACTORY_TYPES = require_model_rwa.RWA_FACTORY_TYPES;
48
- exports.RWA_PROTOCOLS = require_model_rwa.RWA_PROTOCOLS;
49
49
  exports.SECURITIZE_REGISTER_VAULT_TYPES = require_model_rwa.SECURITIZE_REGISTER_VAULT_TYPES;
50
50
  exports.STRATEGY_OPPORTUNITY_CHART_METRICS = require_model_charts.STRATEGY_OPPORTUNITY_CHART_METRICS;
51
51
  exports.STRATEGY_POSITION_CHART_METRICS = require_model_charts.STRATEGY_POSITION_CHART_METRICS;
@@ -102,6 +102,7 @@ exports.insufficientBalance = require_model_errors_operation_errors.insufficient
102
102
  exports.insufficientCollateral = require_model_errors_operation_errors.insufficientCollateral;
103
103
  exports.insufficientPoolLiquidity = require_model_errors_operation_errors.insufficientPoolLiquidity;
104
104
  exports.isFilterSet = require_model_filters.isFilterSet;
105
+ exports.kycProtocolSchema = require_model_rwa_schema.kycProtocolSchema;
105
106
  exports.kycRequirementSchema = require_model_rwa_schema.kycRequirementSchema;
106
107
  exports.leverageOutOfRange = require_model_errors_operation_errors.leverageOutOfRange;
107
108
  exports.leverageSchema = require_model_primitives_schema.leverageSchema;
@@ -180,7 +181,6 @@ exports.responseSchema = require_model_response_schema.responseSchema;
180
181
  exports.rewardsPnLSchema = require_model_positions_schema.rewardsPnLSchema;
181
182
  exports.rewardsSchema = require_model_opportunities_schema.rewardsSchema;
182
183
  exports.rwaOpenRequirementsNotMet = require_model_errors_operation_errors.rwaOpenRequirementsNotMet;
183
- exports.rwaProtocolSchema = require_model_rwa_schema.rwaProtocolSchema;
184
184
  exports.safeValue = require_model_result.safeValue;
185
185
  exports.sdkErr = require_model_result.sdkErr;
186
186
  exports.sdkOk = require_model_result.sdkOk;
@@ -35,19 +35,19 @@ const SECURITIZE_REGISTER_VAULT_TYPES = { RegisterVault: [
35
35
  }
36
36
  ] };
37
37
  /**
38
- * RWA protocols that require dedicated flows
38
+ * KYC providers a strategy may be gated by
39
39
  **/
40
- const RWA_PROTOCOLS = ["securitize", "midas"];
40
+ const KYC_PROTOCOLS = ["securitize", "midas"];
41
41
  /**
42
- * Hardcoded registration URLs for each {@link RWAProtocol}.
42
+ * Hardcoded registration URLs for each {@link KycProtocol}.
43
43
  **/
44
44
  const KYC_REGISTRATION_LINKS = {
45
45
  securitize: "https://securitize.io/",
46
46
  midas: "https://form.typeform.com/to/DqZaw6kr"
47
47
  };
48
48
  //#endregion
49
+ exports.KYC_PROTOCOLS = KYC_PROTOCOLS;
49
50
  exports.KYC_REGISTRATION_LINKS = KYC_REGISTRATION_LINKS;
50
51
  exports.RWA_FACTORY_SECURITIZE = RWA_FACTORY_SECURITIZE;
51
52
  exports.RWA_FACTORY_TYPES = RWA_FACTORY_TYPES;
52
- exports.RWA_PROTOCOLS = RWA_PROTOCOLS;
53
53
  exports.SECURITIZE_REGISTER_VAULT_TYPES = SECURITIZE_REGISTER_VAULT_TYPES;
@@ -4,17 +4,17 @@ const require_model_rwa = require("./rwa.js");
4
4
  let zod_v4 = require("zod/v4");
5
5
  //#region src/model/rwa.schema.ts
6
6
  /**
7
- * {@link ./rwa.js#RWAProtocol}
7
+ * {@link ./rwa.js#KycProtocol}
8
8
  **/
9
- const rwaProtocolSchema = zod_v4.z.enum(require_model_rwa.RWA_PROTOCOLS);
9
+ const kycProtocolSchema = zod_v4.z.enum(require_model_rwa.KYC_PROTOCOLS);
10
10
  /**
11
11
  * {@link ./rwa.js#KycRequirement}
12
12
  **/
13
13
  const kycRequirementSchema = zod_v4.z.object({
14
- protocol: rwaProtocolSchema,
14
+ protocol: kycProtocolSchema,
15
15
  token: require_model_primitives_schema.tokenSchema.optional(),
16
16
  registrationLink: zod_v4.z.string()
17
17
  });
18
18
  //#endregion
19
+ exports.kycProtocolSchema = kycProtocolSchema;
19
20
  exports.kycRequirementSchema = kycRequirementSchema;
20
- exports.rwaProtocolSchema = rwaProtocolSchema;
@@ -36,7 +36,7 @@ var OffchainOpportunities = class extends require_offchain_AbstractOffchainNames
36
36
  /**
37
37
  * {@inheritDoc IOffchainOpportunities.getStrategy}
38
38
  **/
39
- async getStrategy(key) {
39
+ async getStrategy(key, _wallet) {
40
40
  return this.get({
41
41
  path: this.#strategyPath(key),
42
42
  schema: require_model_opportunities_schema.strategyOpportunityDetailSchema
@@ -189,7 +189,9 @@ var CreditAccountsServiceV310 = class extends require_onchain_base_SDKConstruct.
189
189
  * {@inheritDoc ICreditAccountsService.getOpenAccountRequirements}
190
190
  */
191
191
  async getOpenAccountRequirements(borrower, creditManager, props) {
192
- return (await this.sdk.marketRegister.findCreditManager(creditManager).degenNFT())?.getOpenAccountRequirements(borrower, props);
192
+ const { rwaFactory } = this.sdk.marketRegister.findCreditManager(creditManager);
193
+ if (!rwaFactory) return;
194
+ return rwaFactory.getOpenAccountRequirements(borrower, props);
193
195
  }
194
196
  /**
195
197
  * {@inheritDoc ICreditAccountsService.openCA}
@@ -44,13 +44,13 @@ function assertMarketOperable(suite) {
44
44
  }
45
45
  /** The pool has to be able to lend what the plan means to draw. */
46
46
  function assertCanBorrow(sdk, suite, amount) {
47
- const maxBorrowAmount = suite.maxBorrowAmount();
47
+ const { value, limit } = suite.maxBorrowAmount();
48
48
  require_onchain_validation_raise.raise(require_onchain_validation_checks_checkBorrowLimit.checkBorrowLimit({
49
49
  requested: amount,
50
- available: maxBorrowAmount.amount.value,
51
- limit: maxBorrowAmount.limit,
50
+ available: value,
51
+ limit,
52
52
  underlying: require_onchain_validation_helpers_token.toToken(sdk, suite.market.pool.underlying)
53
- }), `borrow: ${amount} exceeds what the pool can lend now (${maxBorrowAmount.amount.value})`);
53
+ }), `borrow: ${amount} exceeds what the pool can lend now (${value})`);
54
54
  }
55
55
  /**
56
56
  * What the account is allowed to end up holding more of than it started with.
@@ -10,9 +10,9 @@ require("../../utils/index.js");
10
10
  const require_onchain_base_SDKConstruct = require("../../base/SDKConstruct.js");
11
11
  require("../../base/index.js");
12
12
  const require_onchain_market_math = require("../../market/math.js");
13
- const require_onchain_market_rwa_midas_constants = require("../../market/rwa/midas/constants.js");
14
13
  const require_model_liquidations = require("../../../model/liquidations.js");
15
14
  require("../../../model/index.js");
15
+ const require_onchain_market_rwa_midas_constants = require("../../market/rwa/midas/constants.js");
16
16
  const require_onchain_market_rwa_securitize_constants = require("../../market/rwa/securitize/constants.js");
17
17
  const require_onchain_market_credit_collateralUtils = require("../../market/credit/collateralUtils.js");
18
18
  const require_onchain_market_rwa_midas_MidasLiquidatorContract = require("../../market/rwa/midas/MidasLiquidatorContract.js");
@@ -8,6 +8,8 @@ require("../../utils/index.js");
8
8
  const require_onchain_base_SDKConstruct = require("../../base/SDKConstruct.js");
9
9
  require("../../base/index.js");
10
10
  const require_onchain_market_math = require("../math.js");
11
+ const require_model_rwa = require("../../../model/rwa.js");
12
+ require("../../../model/index.js");
11
13
  const require_onchain_market_rwa_createDegenNFT = require("../rwa/createDegenNFT.js");
12
14
  const require_onchain_market_strategyName = require("../strategyName.js");
13
15
  const require_onchain_market_credit_collateralUtils = require("./collateralUtils.js");
@@ -124,37 +126,25 @@ var CreditSuite = class extends require_onchain_base_SDKConstruct.SDKConstruct {
124
126
  degenNFT() {
125
127
  const address = this.creditFacade.degenNFT;
126
128
  if ((0, viem.isAddressEqual)(address, "0x0000000000000000000000000000000000000000")) return Promise.resolve(void 0);
127
- const factoryNft = this.rwaFactory?.degenNFT;
128
- if (factoryNft && (0, viem.isAddressEqual)(factoryNft.address, address)) return Promise.resolve(factoryNft);
129
129
  if (!this.#degenNFT) this.#degenNFT = require_onchain_market_rwa_createDegenNFT.createDegenNFT(this.sdk, address);
130
130
  return this.#degenNFT;
131
131
  }
132
132
  /**
133
- * The KYC gate of this suite's strategy; `null` when there is none.
134
- * Wallet-independent.
133
+ * What `wallet` still has to do before the facade lets it open an account;
134
+ * `null` when nothing (no degen NFT, not a KYC gate, or already eligible).
135
135
  */
136
- async kycRequirement(targetCollateral) {
136
+ async kycRequirement(wallet, targetCollateral) {
137
137
  const nft = await this.degenNFT();
138
138
  if (!nft) return null;
139
- const tokens = await nft.getTokens();
140
- const token = tokens.find((t) => (0, viem.isAddressEqual)(t, targetCollateral)) ?? tokens[0];
139
+ const { eligible, token } = await nft.checkKyc(wallet, targetCollateral);
140
+ if (eligible) return null;
141
141
  return {
142
142
  protocol: nft.protocol,
143
- token: token ? this.tokensMeta.getToken(token) : void 0,
144
- registrationLink: nft.registrationLink
143
+ token: this.tokensMeta.getToken(token),
144
+ registrationLink: require_model_rwa.KYC_REGISTRATION_LINKS[nft.protocol]
145
145
  };
146
146
  }
147
147
  /**
148
- * Whether `wallet` may open this suite's strategy today; `true` when there
149
- * is no KYC gate.
150
- */
151
- async isEligibleForStrategy(wallet, targetCollateral) {
152
- const nft = await this.degenNFT();
153
- if (!nft) return true;
154
- const requirements = await nft.getOpenAccountRequirements(wallet, { tokenOutAddress: targetCollateral });
155
- return nft.isRegistered(requirements);
156
- }
157
- /**
158
148
  * Builds a transaction that executes a multicall on one of this suite's
159
149
  * credit accounts.
160
150
  *
@@ -289,11 +279,11 @@ var CreditSuite = class extends require_onchain_base_SDKConstruct.SDKConstruct {
289
279
  const { pool } = this.market.pool;
290
280
  const { maxDebtPerBlockMultiplier, maxDebt } = this.creditFacade;
291
281
  if (maxDebtPerBlockMultiplier === 0) return {
292
- amount: this.market.toUnderlyingAmount(0n),
282
+ value: 0n,
293
283
  limit: "debtPerBlockLimit"
294
284
  };
295
285
  const available = pool.creditManagerDebtParams.get(this.creditManager.address)?.available;
296
- const { value, limit } = [
286
+ return [
297
287
  {
298
288
  value: pool.availableLiquidity,
299
289
  limit: "poolAvailableLiquidity"
@@ -307,10 +297,6 @@ var CreditSuite = class extends require_onchain_base_SDKConstruct.SDKConstruct {
307
297
  limit: "maxDebt"
308
298
  }
309
299
  ].reduce((a, b) => b.value < a.value ? b : a);
310
- return {
311
- amount: this.market.toUnderlyingAmount(value),
312
- limit
313
- };
314
300
  }
315
301
  /**
316
302
  * The single target collateral of this suite's strategy, or `undefined` when
@@ -369,7 +355,7 @@ var CreditSuite = class extends require_onchain_base_SDKConstruct.SDKConstruct {
369
355
  * or `undefined` when credit suite does not offer a strategy opportunity.
370
356
  */
371
357
  strategyOpportunity() {
372
- const maxBorrowAmount = this.maxBorrowAmount().amount.value;
358
+ const maxBorrowAmount = this.maxBorrowAmount().value;
373
359
  if (maxBorrowAmount <= MIN_STRATEGY_BORROW_AMOUNT) return;
374
360
  const collateral = this.strategyTargetCollateral;
375
361
  if (!collateral) return;
@@ -6,23 +6,14 @@ require("../../adapters/abi/index.js");
6
6
  const require_abi_rwa_iMidasDegenNFT = require("../../../../abi/rwa/iMidasDegenNFT.js");
7
7
  require("./constants.js");
8
8
  const require_abi_rwa_iMidasAccessControl = require("../../../../abi/rwa/iMidasAccessControl.js");
9
- const require_model_rwa = require("../../../../model/rwa.js");
10
- require("../../../../model/index.js");
11
9
  let viem = require("viem");
12
10
  //#region src/onchain/market/rwa/midas/MidasDegenNFT.ts
13
11
  const abi = require_abi_rwa_iMidasDegenNFT.iMidasDegenNFTAbi;
14
- /**
15
- * Midas is an RWA protocol without a factory: accounts open through the plain
16
- * facade. Only a Permissioned-mode gateway deploys a degen NFT, so a Midas
17
- * strategy that does not require KYC has no NFT at all.
18
- */
19
12
  var MidasDegenNFT = class extends require_onchain_base_BaseContract.BaseContract {
20
13
  protocol = "midas";
21
- registrationLink = require_model_rwa.KYC_REGISTRATION_LINKS.midas;
22
14
  gateway;
23
15
  accessControl;
24
16
  greenlistedRole;
25
- #mToken;
26
17
  constructor(sdk, baseParams) {
27
18
  super(sdk, {
28
19
  ...baseParams,
@@ -40,26 +31,9 @@ var MidasDegenNFT = class extends require_onchain_base_BaseContract.BaseContract
40
31
  this.accessControl = accessControl;
41
32
  this.greenlistedRole = greenlistedRole;
42
33
  }
43
- async getTokens() {
44
- return [await this.#mTokenAddress()];
45
- }
46
- /**
47
- * Same predicate `MidasDegenNFT.burn` reverts on; the mToken rides along in
48
- * the batch until it is cached.
49
- */
50
- async getOpenAccountRequirements(wallet, _props) {
51
- const token = this.#mToken;
52
- if (token !== void 0) return {
53
- protocol: "midas",
54
- token,
55
- greenlisted: await this.client.readContract({
56
- abi: require_abi_rwa_iMidasAccessControl.iMidasAccessControlAbi,
57
- address: this.accessControl,
58
- functionName: "hasRole",
59
- args: [this.greenlistedRole, wallet]
60
- })
61
- };
62
- const [greenlisted, mToken] = await this.client.multicall({
34
+ /** Same predicate `MidasDegenNFT.burn` reverts on; the mToken rides along in the batch. */
35
+ async checkKyc(wallet, _targetCollateral) {
36
+ const [eligible, token] = await this.client.multicall({
63
37
  allowFailure: false,
64
38
  contracts: [{
65
39
  abi: require_abi_rwa_iMidasAccessControl.iMidasAccessControlAbi,
@@ -72,25 +46,11 @@ var MidasDegenNFT = class extends require_onchain_base_BaseContract.BaseContract
72
46
  functionName: "mToken"
73
47
  }]
74
48
  });
75
- this.#mToken = mToken;
76
49
  return {
77
- protocol: "midas",
78
- token: mToken,
79
- greenlisted
50
+ eligible,
51
+ token
80
52
  };
81
53
  }
82
- isRegistered(requirements) {
83
- return requirements.greenlisted;
84
- }
85
- getMissingRequirements() {}
86
- async #mTokenAddress() {
87
- if (this.#mToken === void 0) this.#mToken = await this.client.readContract({
88
- abi: require_onchain_market_adapters_abi_midas_iMidasGatewayV311.iMidasGatewayV311Abi,
89
- address: this.gateway,
90
- functionName: "mToken"
91
- });
92
- return this.#mToken;
93
- }
94
54
  };
95
55
  //#endregion
96
56
  exports.MidasDegenNFT = MidasDegenNFT;
@@ -1,23 +1,14 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_onchain_utils_AddressSet = require("../../../utils/AddressSet.js");
3
- require("../../../utils/index.js");
4
2
  const require_onchain_base_BaseContract = require("../../../base/BaseContract.js");
5
3
  require("../../../base/index.js");
6
- const require_model_rwa = require("../../../../model/rwa.js");
7
- require("../../../../model/index.js");
8
4
  const require_onchain_market_rwa_securitize_constants = require("./constants.js");
5
+ const require_abi_rwa_iSecuritizeDegenNFT = require("../../../../abi/rwa/iSecuritizeDegenNFT.js");
6
+ let viem = require("viem");
9
7
  //#region src/onchain/market/rwa/securitize/SecuritizeDegenNFT.ts
10
- const abi = require("../../../../abi/rwa/iSecuritizeDegenNFT.js").iSecuritizeDegenNFTAbi;
11
- /**
12
- * Securitize always has a factory, which deploys this NFT. DS-token data,
13
- * registrars and cached signatures live here; the factory only builds txs
14
- * and looks up investor/wallet addresses.
15
- */
8
+ const abi = require_abi_rwa_iSecuritizeDegenNFT.iSecuritizeDegenNFTAbi;
16
9
  var SecuritizeDegenNFT = class extends require_onchain_base_BaseContract.BaseContract {
17
10
  protocol = "securitize";
18
- registrationLink = require_model_rwa.KYC_REGISTRATION_LINKS.securitize;
19
11
  factory;
20
- #sdk;
21
12
  constructor(sdk, address, factory) {
22
13
  super(sdk, {
23
14
  addr: address,
@@ -26,54 +17,19 @@ var SecuritizeDegenNFT = class extends require_onchain_base_BaseContract.BaseCon
26
17
  name: "SecuritizeDegenNFT",
27
18
  abi
28
19
  });
29
- this.#sdk = sdk;
30
20
  this.factory = factory;
31
21
  }
32
- async getTokens() {
33
- return this.factory.getTokens();
34
- }
35
- /**
36
- * Registration on Securitize is the protocol-side KYC step; pending
37
- * EIP-712 signatures are tx-side leftover, not KYC.
38
- */
39
- async getOpenAccountRequirements(wallet, props) {
40
- const tokensToRegister = new require_onchain_utils_AddressSet.AddressSet(this.factory.getTokens()).has(props.tokenOutAddress) ? new require_onchain_utils_AddressSet.AddressSet([props.tokenOutAddress]) : new require_onchain_utils_AddressSet.AddressSet();
41
- if (tokensToRegister.size === 0) return {
42
- protocol: "securitize",
43
- factory: this.factory.address,
44
- securitizeTokensToRegister: [],
45
- tokensToRegister: [],
46
- requiredSignatures: []
47
- };
48
- const [investorData] = await this.#sdk.rwa.getInvestorData(wallet, [this.factory.address]);
49
- const registredTokens = new require_onchain_utils_AddressSet.AddressSet(investorData.registeredTokens);
50
- const signedTokens = new require_onchain_utils_AddressSet.AddressSet(investorData.cachedSignatures.map((s) => s.token));
51
- const unsignedTokens = tokensToRegister.difference(signedTokens);
52
- const securitizeTokensToRegister = tokensToRegister.difference(registredTokens);
53
- const requiredSignatures = investorData.registerVaultMessages.filter((m) => unsignedTokens.has(m.message.token));
54
- return {
55
- protocol: "securitize",
56
- factory: this.factory.address,
57
- securitizeTokensToRegister: Array.from(securitizeTokensToRegister),
58
- tokensToRegister: Array.from(tokensToRegister),
59
- requiredSignatures
22
+ /** Registration on Securitize is the only KYC step; pending EIP-712 signatures are not. */
23
+ async checkKyc(wallet, targetCollateral) {
24
+ const { factory } = this;
25
+ if (!factory.getTokens().some((t) => (0, viem.isAddressEqual)(t, targetCollateral))) return {
26
+ eligible: true,
27
+ token: targetCollateral
60
28
  };
61
- }
62
- isRegistered(requirements) {
63
- return requirements.securitizeTokensToRegister.length === 0;
64
- }
65
- /**
66
- * A required signature is omitted when `providedArgs.signaturesToCache`
67
- * already carries a signature for the same token: the transaction caches it
68
- * on-chain as part of the operation.
69
- */
70
- getMissingRequirements(requirements, providedArgs) {
71
- const providedTokens = new require_onchain_utils_AddressSet.AddressSet((providedArgs?.signaturesToCache ?? []).map((s) => s.token));
72
- const requiredSignatures = requirements.requiredSignatures.filter((message) => !providedTokens.has(message.message.token));
73
- if (requiredSignatures.length === 0) return;
29
+ const req = await factory.getOpenAccountRequirements(wallet, { tokenOutAddress: targetCollateral });
74
30
  return {
75
- protocol: "securitize",
76
- requiredSignatures
31
+ eligible: !req || req.securitizeTokensToRegister.length === 0,
32
+ token: req?.securitizeTokensToRegister[0] ?? targetCollateral
77
33
  };
78
34
  }
79
35
  };
@@ -1,5 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_onchain_utils_AddressMap = require("../../../utils/AddressMap.js");
3
+ const require_onchain_utils_AddressSet = require("../../../utils/AddressSet.js");
3
4
  require("../../../utils/index.js");
4
5
  const require_onchain_base_BaseContract = require("../../../base/BaseContract.js");
5
6
  require("../../../base/index.js");
@@ -11,6 +12,7 @@ let viem = require("viem");
11
12
  //#region src/onchain/market/rwa/securitize/SecuritizeRWAFactory.ts
12
13
  const abi = require_abi_rwa_iSecuritizeRWAFactory.iSecuritizeRWAFactoryAbi;
13
14
  var SecuritizeRWAFactory = class extends require_onchain_base_BaseContract.BaseContract {
15
+ #sdk;
14
16
  #investorCache = new require_onchain_utils_AddressMap.AddressMap();
15
17
  degenNFT;
16
18
  owner;
@@ -22,6 +24,7 @@ var SecuritizeRWAFactory = class extends require_onchain_base_BaseContract.BaseC
22
24
  name: "SecuritizeRWAFactory",
23
25
  abi
24
26
  });
27
+ this.#sdk = sdk;
25
28
  const decoded = (0, viem.decodeAbiParameters)([
26
29
  {
27
30
  name: "owner",
@@ -182,6 +185,40 @@ var SecuritizeRWAFactory = class extends require_onchain_base_BaseContract.BaseC
182
185
  });
183
186
  }
184
187
  /**
188
+ * {@inheritDoc IRWAFactory.getOpenAccountRequirements}
189
+ */
190
+ async getOpenAccountRequirements(investor, props) {
191
+ const [investorData] = await this.#sdk.rwa.getInvestorData(investor, [this.address]);
192
+ const tokensToRegister = new require_onchain_utils_AddressSet.AddressSet([props.tokenOutAddress]);
193
+ const registredTokens = new require_onchain_utils_AddressSet.AddressSet(investorData.registeredTokens);
194
+ const signedTokens = new require_onchain_utils_AddressSet.AddressSet(investorData.cachedSignatures.map((s) => s.token));
195
+ const unsignedTokens = tokensToRegister.difference(signedTokens);
196
+ const securitizeTokensToRegister = tokensToRegister.difference(registredTokens);
197
+ const requiredSignatures = investorData.registerVaultMessages.filter((m) => unsignedTokens.has(m.message.token));
198
+ return {
199
+ type: require_model_rwa.RWA_FACTORY_SECURITIZE,
200
+ securitizeTokensToRegister: Array.from(securitizeTokensToRegister),
201
+ tokensToRegister: Array.from(tokensToRegister),
202
+ requiredSignatures
203
+ };
204
+ }
205
+ /**
206
+ * {@inheritDoc IRWAFactory.getMissingRequirements}
207
+ *
208
+ * A required signature is omitted when `providedArgs.signaturesToCache`
209
+ * already carries a signature for the same token: the transaction caches it
210
+ * on-chain as part of the operation.
211
+ */
212
+ getMissingRequirements(requirements, providedArgs) {
213
+ const providedTokens = new require_onchain_utils_AddressSet.AddressSet((providedArgs?.signaturesToCache ?? []).map((s) => s.token));
214
+ const requiredSignatures = requirements.requiredSignatures.filter((message) => !providedTokens.has(message.message.token));
215
+ if (requiredSignatures.length === 0) return;
216
+ return {
217
+ type: require_model_rwa.RWA_FACTORY_SECURITIZE,
218
+ requiredSignatures
219
+ };
220
+ }
221
+ /**
185
222
  * {@inheritDoc IRWAFactory.openCreditAccount}
186
223
  */
187
224
  openCreditAccount(creditManager, calls, args) {
@@ -38,18 +38,12 @@ var MultichainOpportunitiesService = class extends require_onchain_base_Multicha
38
38
  *
39
39
  * See {@link MultichainOpportunitiesService.getPool}.
40
40
  **/
41
- async getStrategy(key) {
41
+ async getStrategy(key, wallet) {
42
42
  return this.queryChain({
43
43
  network: key.chainId,
44
- run: (sdk) => sdk.opportunities.getStrategy(key)
44
+ run: (sdk) => sdk.opportunities.getStrategy(key, wallet)
45
45
  });
46
46
  }
47
- /**
48
- * {@inheritDoc OpportunitiesService.isEligibleForStrategy}
49
- **/
50
- async isEligibleForStrategy(key, wallet) {
51
- return this.sdk.chain(key.chainId).opportunities.isEligibleForStrategy(key, wallet);
52
- }
53
47
  };
54
48
  //#endregion
55
49
  exports.MultichainOpportunitiesService = MultichainOpportunitiesService;
@@ -37,34 +37,22 @@ var OpportunitiesService = class extends require_onchain_base_SDKConstruct.SDKCo
37
37
  * A single strategy opportunity plus the rate curve of the pool it borrows
38
38
  * from and the price feeds its liquidation price depends on.
39
39
  *
40
- * `kyc` is the strategy's KYC gate, independent of any wallet.
40
+ * @param wallet - When given, `kyc` says whether this wallet must register
41
+ * with the strategy's KYC provider first; `null` otherwise.
41
42
  *
42
43
  * @throws If the credit manager is unknown, or does not currently offer a
43
44
  * strategy.
44
45
  **/
45
- async getStrategy(key) {
46
+ async getStrategy(key, wallet) {
46
47
  const suite = this.sdk.marketRegister.findCreditManager(key.creditManager);
47
48
  const detail = suite.strategyOpportunityDetail();
48
49
  if (!detail) throw new Error(`credit manager ${key.creditManager} does not currently offer a strategy`);
49
- const kyc = await suite.kycRequirement(detail.targetCollateral.address);
50
+ const kyc = wallet ? await suite.kycRequirement(wallet, detail.targetCollateral.address) : null;
50
51
  return {
51
52
  ...detail,
52
53
  kyc
53
54
  };
54
55
  }
55
- /**
56
- * Whether `wallet` may open this strategy today: `true` when it is not
57
- * KYC-gated or the wallet already passed the gate.
58
- *
59
- * @throws If the credit manager is unknown, or does not currently offer a
60
- * strategy.
61
- **/
62
- async isEligibleForStrategy(key, wallet) {
63
- const suite = this.sdk.marketRegister.findCreditManager(key.creditManager);
64
- const opportunity = suite.strategyOpportunity();
65
- if (!opportunity) throw new Error(`credit manager ${key.creditManager} does not currently offer a strategy`);
66
- return suite.isEligibleForStrategy(wallet, opportunity.targetCollateral.address);
67
- }
68
56
  };
69
57
  //#endregion
70
58
  exports.OpportunitiesService = OpportunitiesService;
@@ -2,7 +2,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_onchain_utils_hex = require("../../utils/hex.js");
3
3
  const require_onchain_market_adapters_contracts_AbstractAdapter = require("../../market/adapters/contracts/AbstractAdapter.js");
4
4
  const require_onchain_market_credit_CreditFacadeV310Contract = require("../../market/credit/CreditFacadeV310Contract.js");
5
- require("../../../model/rwa.js");
5
+ const require_model_rwa = require("../../../model/rwa.js");
6
6
  require("../../../model/index.js");
7
7
  const require_onchain_market_rwa_types = require("../../market/rwa/types.js");
8
8
  const require_onchain_preview_parse_classifyInnerOperations = require("./classifyInnerOperations.js");
@@ -33,7 +33,7 @@ function parseSecuritizeOperationCalldata(sdk, factory, calldata) {
33
33
  const { rawArgs } = parsed;
34
34
  const innerCalls = rawArgs.calls ?? [];
35
35
  const args = {
36
- protocol: "securitize",
36
+ type: require_model_rwa.RWA_FACTORY_SECURITIZE,
37
37
  tokensToRegister: [...rawArgs.tokensToRegister ?? []],
38
38
  signaturesToCache: [...rawArgs.signaturesToCache ?? []]
39
39
  };
@@ -33,8 +33,7 @@ async function checkCreditOperation(args) {
33
33
  minDebt: suite.creditFacade.minDebt,
34
34
  maxDebt: suite.creditFacade.maxDebt,
35
35
  underlying,
36
- allowZero: !isOpening,
37
- maxBorrowAmount: suite.maxBorrowAmount()
36
+ allowZero: !isOpening
38
37
  }),
39
38
  ...require_onchain_validation_bundles_checkDraw.checkDraw(suite, preview, underlying),
40
39
  ...require_onchain_validation_bundles_checkObtained.checkObtained(suite, preview),
@@ -51,7 +50,7 @@ async function checkCreditOperation(args) {
51
50
  preview,
52
51
  sender,
53
52
  blockNumber
54
- }), preview.operation === "OpenCreditAccount" || preview.operation === "RWAOpenCreditAccount" ? require_onchain_validation_bundles_checkRWAOpening.checkRWAOpening({
53
+ }), preview.operation === "RWAOpenCreditAccount" ? require_onchain_validation_bundles_checkRWAOpening.checkRWAOpening({
55
54
  sdk,
56
55
  preview,
57
56
  sender
@@ -16,11 +16,11 @@ require("../checks/index.js");
16
16
  function checkDraw(suite, preview, underlying) {
17
17
  const drawn = preview.operation === "AdjustCreditAccount" ? preview.totalDebtChange.value : preview.totalDebt.value;
18
18
  if (drawn <= 0n) return [];
19
- const maxBorrowAmount = suite.maxBorrowAmount();
19
+ const { value, limit } = suite.maxBorrowAmount();
20
20
  return require_onchain_validation_checks_checkBorrowLimit.checkBorrowLimit({
21
21
  requested: drawn,
22
- available: maxBorrowAmount.amount.value,
23
- limit: maxBorrowAmount.limit,
22
+ available: value,
23
+ limit,
24
24
  underlying
25
25
  });
26
26
  }
@@ -6,24 +6,24 @@ const require_onchain_validation_helpers_token = require("../helpers/token.js");
6
6
  require("../helpers/index.js");
7
7
  //#region src/onchain/validation/bundles/checkRWAOpenRequirements.ts
8
8
  /**
9
- * The degen NFT is satisfied that `wallet` may open on `token` with the
9
+ * The RWA factory is satisfied that `wallet` may open on `token` with the
10
10
  * registration args already on the transaction.
11
11
  */
12
12
  async function checkRWAOpenRequirements(input) {
13
13
  const { sdk, wallet, creditManager, token, providedArgs } = input;
14
14
  try {
15
- const nft = await sdk.marketRegister.findCreditManager(creditManager).degenNFT();
16
- if (!nft) return [];
17
- const requirements = await nft.getOpenAccountRequirements(wallet, { tokenOutAddress: token });
18
- const missing = nft.getMissingRequirements(requirements, providedArgs);
19
- if (!missing && nft.isRegistered(requirements)) return [];
15
+ const requirements = await sdk.accounts.getOpenAccountRequirements(wallet, creditManager, { tokenOutAddress: token });
16
+ if (!requirements) return [];
17
+ const { rwaFactory } = sdk.marketRegister.findByCreditManager(creditManager);
18
+ if (!rwaFactory) throw new Error(`no RWA factory for credit manager ${creditManager}`);
19
+ const missing = rwaFactory.getMissingRequirements(requirements, providedArgs);
20
+ if (!missing && requirements.securitizeTokensToRegister.length === 0) return [];
20
21
  return [require_model_errors_operation_errors.rwaOpenRequirementsNotMet({
21
22
  token: require_onchain_validation_helpers_token.toToken(sdk, token),
22
23
  creditManager,
23
- protocol: nft.protocol,
24
- registrationLink: nft.registrationLink,
24
+ factory: rwaFactory.address,
25
25
  requirements,
26
- missing
26
+ ...missing === void 0 ? {} : { missing }
27
27
  })];
28
28
  } catch (cause) {
29
29
  return [require_model_errors_prepare_errors.unexpectedFailure(cause, "read the RWA opening requirements")];
@@ -3,22 +3,21 @@ const require_onchain_utils_AddressSet = require("../../utils/AddressSet.js");
3
3
  const require_onchain_validation_bundles_checkRWAOpenRequirements = require("./checkRWAOpenRequirements.js");
4
4
  //#region src/onchain/validation/bundles/checkRWAOpening.ts
5
5
  /**
6
- * Per KYC-gated token among `collateralAdded ∪ quotas`, whether the
6
+ * Per factory-gated token among `collateralAdded ∪ quotas`, whether the
7
7
  * borrower still has to register or sign before this opening can land.
8
8
  */
9
9
  async function checkRWAOpening(input) {
10
10
  const { sdk, preview, sender } = input;
11
- const nft = await sdk.marketRegister.findCreditManager(preview.creditManager).degenNFT();
12
- if (!nft) return [];
13
- const gated = new require_onchain_utils_AddressSet.AddressSet(await nft.getTokens());
11
+ const { rwaFactory } = sdk.marketRegister.findByCreditManager(preview.creditManager);
12
+ if (!rwaFactory) return [];
13
+ const gated = new require_onchain_utils_AddressSet.AddressSet(rwaFactory.getTokens());
14
14
  const candidates = new require_onchain_utils_AddressSet.AddressSet([...preview.collateralAdded.map((a) => a.token.address), ...preview.quotas.map((q) => q.token.address)]);
15
- const providedArgs = preview.operation === "RWAOpenCreditAccount" ? preview.rwaArgs : void 0;
16
15
  return (await Promise.all([...candidates].filter((token) => gated.has(token)).map((token) => require_onchain_validation_bundles_checkRWAOpenRequirements.checkRWAOpenRequirements({
17
16
  sdk,
18
17
  wallet: sender,
19
18
  creditManager: preview.creditManager,
20
19
  token,
21
- providedArgs
20
+ providedArgs: preview.rwaArgs
22
21
  })))).flat();
23
22
  }
24
23
  //#endregion