@gearbox-protocol/sdk 16.4.0-next.1 → 16.4.0-next.10

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 (115) hide show
  1. package/dist/cjs/dev/index.js +3 -2
  2. package/dist/cjs/dev/kycUtils.js +18 -35
  3. package/dist/cjs/dev/midasUtils.js +80 -16
  4. package/dist/cjs/dev/securitizeUtils.js +14 -10
  5. package/dist/cjs/dev/withdrawalUtils.js +3 -6
  6. package/dist/cjs/model/errors/index.js +1 -0
  7. package/dist/cjs/model/errors/operation-errors.js +9 -0
  8. package/dist/cjs/model/index.js +1 -0
  9. package/dist/cjs/onchain/accounts/CreditAccountsServiceV310.js +0 -1
  10. package/dist/cjs/onchain/accounts/intents/borrow.js +139 -0
  11. package/dist/cjs/onchain/accounts/intents/{collateral-money.js → collateral-valuation.js} +7 -7
  12. package/dist/cjs/onchain/accounts/intents/index.js +86 -2
  13. package/dist/cjs/onchain/accounts/intents/leverage-band.js +2 -12
  14. package/dist/cjs/onchain/accounts/intents/maxBorrow.js +89 -0
  15. package/dist/cjs/onchain/accounts/intents/maxWithdrawCollateral.js +14 -14
  16. package/dist/cjs/onchain/accounts/intents/open-strategy.js +6 -45
  17. package/dist/cjs/onchain/accounts/intents/realize.js +44 -0
  18. package/dist/cjs/onchain/accounts/intents/testing/sdk-mock.js +1 -0
  19. package/dist/cjs/onchain/accounts/intents/utils/common.js +19 -0
  20. package/dist/cjs/onchain/accounts/intents/utils/credit-account-slice.js +21 -0
  21. package/dist/cjs/onchain/accounts/intents/utils/index.js +2 -0
  22. package/dist/cjs/onchain/accounts/intents/utils/price-impact.js +3 -3
  23. package/dist/cjs/onchain/accounts/intents/withdraw-limits.js +8 -8
  24. package/dist/cjs/onchain/core/createAddressProvider.js +2 -5
  25. package/dist/cjs/onchain/index.js +4 -0
  26. package/dist/cjs/onchain/market/adapters/contracts/MidasGatewayAdapterContract.js +11 -3
  27. package/dist/cjs/onchain/positions/calcHealthFactor.js +3 -3
  28. package/dist/cjs/onchain/preview/index.js +2 -0
  29. package/dist/cjs/onchain/preview/preview/index.js +2 -0
  30. package/dist/cjs/onchain/preview/preview/midasGreenlistsAccount.js +17 -0
  31. package/dist/cjs/onchain/preview/preview/previewOpenStrategyPosition.js +5 -2
  32. package/dist/cjs/onchain/validation/bundles/checkCreditOperation.js +2 -1
  33. package/dist/cjs/onchain/validation/bundles/checkMidasAccountGreenlist.js +44 -0
  34. package/dist/cjs/onchain/validation/bundles/checkRWAOpening.js +15 -5
  35. package/dist/cjs/onchain/validation/bundles/index.js +2 -0
  36. package/dist/cjs/onchain/validation/index.js +2 -0
  37. package/dist/cjs/sdk/execute/ExecuteApi.js +65 -5
  38. package/dist/cjs/sdk/prepare/PrepareApi.js +86 -12
  39. package/dist/esm/dev/index.js +3 -3
  40. package/dist/esm/dev/kycUtils.js +17 -33
  41. package/dist/esm/dev/midasUtils.js +80 -18
  42. package/dist/esm/dev/securitizeUtils.js +15 -11
  43. package/dist/esm/dev/withdrawalUtils.js +3 -6
  44. package/dist/esm/model/errors/index.js +2 -2
  45. package/dist/esm/model/errors/operation-errors.js +9 -1
  46. package/dist/esm/model/index.js +2 -2
  47. package/dist/esm/onchain/accounts/CreditAccountsServiceV310.js +0 -1
  48. package/dist/esm/onchain/accounts/intents/borrow.js +137 -0
  49. package/dist/esm/onchain/accounts/intents/{collateral-money.js → collateral-valuation.js} +7 -7
  50. package/dist/esm/onchain/accounts/intents/index.js +86 -2
  51. package/dist/esm/onchain/accounts/intents/leverage-band.js +2 -12
  52. package/dist/esm/onchain/accounts/intents/maxBorrow.js +87 -0
  53. package/dist/esm/onchain/accounts/intents/maxWithdrawCollateral.js +14 -14
  54. package/dist/esm/onchain/accounts/intents/open-strategy.js +6 -45
  55. package/dist/esm/onchain/accounts/intents/realize.js +44 -0
  56. package/dist/esm/onchain/accounts/intents/testing/sdk-mock.js +1 -0
  57. package/dist/esm/onchain/accounts/intents/utils/common.js +19 -1
  58. package/dist/esm/onchain/accounts/intents/utils/credit-account-slice.js +21 -1
  59. package/dist/esm/onchain/accounts/intents/utils/index.js +3 -3
  60. package/dist/esm/onchain/accounts/intents/utils/price-impact.js +3 -3
  61. package/dist/esm/onchain/accounts/intents/withdraw-limits.js +8 -8
  62. package/dist/esm/onchain/core/createAddressProvider.js +2 -5
  63. package/dist/esm/onchain/index.js +3 -1
  64. package/dist/esm/onchain/market/adapters/contracts/MidasGatewayAdapterContract.js +11 -3
  65. package/dist/esm/onchain/positions/calcHealthFactor.js +3 -3
  66. package/dist/esm/onchain/preview/index.js +2 -1
  67. package/dist/esm/onchain/preview/preview/index.js +2 -1
  68. package/dist/esm/onchain/preview/preview/midasGreenlistsAccount.js +16 -0
  69. package/dist/esm/onchain/preview/preview/previewOpenStrategyPosition.js +5 -2
  70. package/dist/esm/onchain/validation/bundles/checkCreditOperation.js +2 -1
  71. package/dist/esm/onchain/validation/bundles/checkMidasAccountGreenlist.js +43 -0
  72. package/dist/esm/onchain/validation/bundles/checkRWAOpening.js +15 -5
  73. package/dist/esm/onchain/validation/bundles/index.js +2 -1
  74. package/dist/esm/onchain/validation/index.js +2 -1
  75. package/dist/esm/sdk/execute/ExecuteApi.js +65 -5
  76. package/dist/esm/sdk/prepare/PrepareApi.js +86 -12
  77. package/dist/types/dev/index.d.ts +3 -3
  78. package/dist/types/dev/kycUtils.d.ts +1 -5
  79. package/dist/types/dev/midasUtils.d.ts +15 -4
  80. package/dist/types/model/errors/index.d.ts +2 -2
  81. package/dist/types/model/errors/operation-errors.d.ts +14 -1
  82. package/dist/types/model/index.d.ts +2 -2
  83. package/dist/types/model/previews.d.ts +17 -2
  84. package/dist/types/onchain/accounts/index.d.ts +4 -3
  85. package/dist/types/onchain/accounts/intents/borrow.d.ts +141 -0
  86. package/dist/types/onchain/accounts/intents/{collateral-money.d.ts → collateral-valuation.d.ts} +8 -8
  87. package/dist/types/onchain/accounts/intents/index.d.ts +81 -2
  88. package/dist/types/onchain/accounts/intents/maxBorrow.d.ts +54 -0
  89. package/dist/types/onchain/accounts/intents/maxWithdrawCollateral.d.ts +3 -3
  90. package/dist/types/onchain/accounts/intents/open-strategy.d.ts +3 -17
  91. package/dist/types/onchain/accounts/intents/testing/sdk-mock.d.ts +2 -0
  92. package/dist/types/onchain/accounts/intents/tests/open-strategy.fixtures.d.ts +2 -2
  93. package/dist/types/onchain/accounts/intents/types.d.ts +15 -1
  94. package/dist/types/onchain/accounts/intents/utils/common.d.ts +15 -1
  95. package/dist/types/onchain/accounts/intents/utils/credit-account-slice.d.ts +14 -1
  96. package/dist/types/onchain/accounts/intents/utils/index.d.ts +3 -3
  97. package/dist/types/onchain/accounts/intents/withdraw-limits.d.ts +1 -1
  98. package/dist/types/onchain/index.d.ts +7 -4
  99. package/dist/types/onchain/market/adapters/contracts/MidasGatewayAdapterContract.d.ts +8 -2
  100. package/dist/types/onchain/preview/index.d.ts +2 -1
  101. package/dist/types/onchain/preview/preview/index.d.ts +2 -1
  102. package/dist/types/onchain/preview/preview/midasGreenlistsAccount.d.ts +13 -0
  103. package/dist/types/onchain/validation/bundles/checkCreditOperation.d.ts +2 -2
  104. package/dist/types/onchain/validation/bundles/checkMidasAccountGreenlist.d.ts +22 -0
  105. package/dist/types/onchain/validation/bundles/checkRWAOpening.d.ts +6 -4
  106. package/dist/types/onchain/validation/bundles/index.d.ts +3 -2
  107. package/dist/types/onchain/validation/checks/checkDebtLimits.d.ts +2 -2
  108. package/dist/types/onchain/validation/index.d.ts +3 -2
  109. package/dist/types/sdk/execute/index.d.ts +2 -2
  110. package/dist/types/sdk/execute/types.d.ts +48 -6
  111. package/dist/types/sdk/index.d.ts +5 -4
  112. package/dist/types/sdk/prepare/PrepareApi.d.ts +15 -3
  113. package/dist/types/sdk/prepare/index.d.ts +4 -3
  114. package/dist/types/sdk/prepare/types.d.ts +176 -49
  115. package/package.json +1 -1
@@ -223,6 +223,7 @@ const require_onchain_validation_bundles_checkIncreaseDebt = require("./validati
223
223
  const require_onchain_validation_bundles_checkIncreaseQuota = require("./validation/bundles/checkIncreaseQuota.js");
224
224
  const require_onchain_validation_bundles_checkMarket = require("./validation/bundles/checkMarket.js");
225
225
  const require_onchain_validation_bundles_checkObtained = require("./validation/bundles/checkObtained.js");
226
+ const require_onchain_validation_bundles_checkMidasAccountGreenlist = require("./validation/bundles/checkMidasAccountGreenlist.js");
226
227
  const require_onchain_validation_bundles_checkRWAOpenRequirements = require("./validation/bundles/checkRWAOpenRequirements.js");
227
228
  const require_onchain_validation_bundles_checkRWAOpening = require("./validation/bundles/checkRWAOpening.js");
228
229
  const require_onchain_validation_bundles_checkCreditOperation = require("./validation/bundles/checkCreditOperation.js");
@@ -293,6 +294,7 @@ const require_onchain_preview_preview_detectCloseOrRepay = require("./preview/pr
293
294
  const require_onchain_preview_preview_detectDelayedClaim = require("./preview/preview/detectDelayedClaim.js");
294
295
  const require_onchain_preview_preview_detectDelayedOperation = require("./preview/preview/detectDelayedOperation.js");
295
296
  const require_onchain_preview_preview_estimateClaimableAt = require("./preview/preview/estimateClaimableAt.js");
297
+ const require_onchain_preview_preview_midasGreenlistsAccount = require("./preview/preview/midasGreenlistsAccount.js");
296
298
  const require_onchain_preview_preview_previewAdjustStrategyPosition = require("./preview/preview/previewAdjustStrategyPosition.js");
297
299
  const require_onchain_preview_preview_previewExitOrRepayStrategyPosition = require("./preview/preview/previewExitOrRepayStrategyPosition.js");
298
300
  const require_onchain_preview_preview_replayInnerOperations = require("./preview/preview/replayInnerOperations.js");
@@ -576,6 +578,7 @@ exports.checkLiquidationFunding = require_onchain_validation_bundles_checkLiquid
576
578
  exports.checkLiquidatorEligible = require_onchain_validation_checks_checkLiquidatorEligible.checkLiquidatorEligible;
577
579
  exports.checkMarket = require_onchain_validation_bundles_checkMarket.checkMarket;
578
580
  exports.checkMarketExpired = require_onchain_validation_checks_checkMarketExpired.checkMarketExpired;
581
+ exports.checkMidasAccountGreenlist = require_onchain_validation_bundles_checkMidasAccountGreenlist.checkMidasAccountGreenlist;
579
582
  exports.checkObtained = require_onchain_validation_bundles_checkObtained.checkObtained;
580
583
  exports.checkOperation = require_onchain_validation_checkOperation.checkOperation;
581
584
  exports.checkPoolFunding = require_onchain_validation_bundles_checkPoolFunding.checkPoolFunding;
@@ -755,6 +758,7 @@ exports.json_stringify = require_onchain_utils_json.json_stringify;
755
758
  exports.lidoV1_WETHGatewayAbi = require_onchain_market_adapters_abi_targetContractAbi.lidoV1_WETHGatewayAbi;
756
759
  exports.makeReplayState = require_onchain_preview_preview_replayInnerOperations.makeReplayState;
757
760
  exports.mellowDvvAdapterAbi = require_onchain_market_adapters_abi_adapters_mellowDvvAdapter.mellowDvvAdapterAbi;
761
+ exports.midasGreenlistsAccount = require_onchain_preview_preview_midasGreenlistsAccount.midasGreenlistsAccount;
758
762
  exports.minSeizedAmount = require_onchain_market_math.minSeizedAmount;
759
763
  exports.numberWithCommas = require_onchain_utils_formatter.numberWithCommas;
760
764
  exports.onchainSDKOptionsSchema = require_onchain_options.onchainSDKOptionsSchema;
@@ -170,13 +170,21 @@ var MidasGatewayAdapterContract = class extends require_onchain_market_adapters_
170
170
  return { redeemer };
171
171
  }
172
172
  /**
173
+ * Whether `calldata` is `receiveGreenlist()`, the call that grants the
174
+ * Midas greenlisted role to the credit account.
175
+ */
176
+ isReceiveGreenlist(calldata) {
177
+ return calldata === receiveGreenlistCalldata;
178
+ }
179
+ /**
173
180
  * `receiveGreenlist()` is prepended by `prependMidasReceiveGreenlist`
174
181
  * before the balance bracket when the multicall mints a permissioned
175
- * mToken: it only greenlists the credit account and is balance-neutral,
176
- * so it is legal outside a bracket and leaves balances untouched.
182
+ * mToken: it only grants the Midas greenlisted role to the credit
183
+ * account and is balance-neutral, so it is legal outside a bracket and
184
+ * leaves balances untouched.
177
185
  */
178
186
  replayOutOfBracketCall(_balances, calldata) {
179
- return calldata === receiveGreenlistCalldata;
187
+ return this.isReceiveGreenlist(calldata);
180
188
  }
181
189
  applyBalanceChanges(balances, decoded) {
182
190
  switch (decoded.functionName) {
@@ -36,7 +36,7 @@ function calcHealthFactor(props) {
36
36
  const scale = 10n ** BigInt(decimalsByToken.get(token) ?? 18);
37
37
  return amount * price / scale;
38
38
  };
39
- const assetMoney = snapshot.assets.reduce((acc, { token, balance }) => {
39
+ const assetValue = snapshot.assets.reduce((acc, { token, balance }) => {
40
40
  if (balance <= 10n) return acc;
41
41
  const lt = BigInt(lts.get(token) ?? 0);
42
42
  const tokenLtWeighted = (convertToUSD(token, balance, true) ?? 0n) * lt;
@@ -45,8 +45,8 @@ function calcHealthFactor(props) {
45
45
  const quotaWeighted = (convertToUSD(underlying, quotaBalance) ?? 0n) * require_onchain_constants_math.PERCENTAGE_FACTOR;
46
46
  return acc + (quota ? require_onchain_utils_bigint_math.BigIntMath.min(quotaWeighted, tokenLtWeighted) : tokenLtWeighted);
47
47
  }, 0n);
48
- const borrowedMoney = convertToUSD(underlying, snapshot.totalDebt) ?? 0n;
49
- const hf = borrowedMoney > 0n ? assetMoney / borrowedMoney : 0n;
48
+ const borrowedValue = convertToUSD(underlying, snapshot.totalDebt) ?? 0n;
49
+ const hf = borrowedValue > 0n ? assetValue / borrowedValue : 0n;
50
50
  return Number(hf);
51
51
  }
52
52
  //#endregion
@@ -12,6 +12,7 @@ const require_onchain_preview_preview_detectCloseOrRepay = require("./preview/de
12
12
  const require_onchain_preview_preview_detectDelayedClaim = require("./preview/detectDelayedClaim.js");
13
13
  const require_onchain_preview_preview_detectDelayedOperation = require("./preview/detectDelayedOperation.js");
14
14
  const require_onchain_preview_preview_estimateClaimableAt = require("./preview/estimateClaimableAt.js");
15
+ const require_onchain_preview_preview_midasGreenlistsAccount = require("./preview/midasGreenlistsAccount.js");
15
16
  const require_onchain_preview_preview_previewAdjustStrategyPosition = require("./preview/previewAdjustStrategyPosition.js");
16
17
  const require_onchain_preview_preview_previewExitOrRepayStrategyPosition = require("./preview/previewExitOrRepayStrategyPosition.js");
17
18
  const require_onchain_preview_preview_replayInnerOperations = require("./preview/replayInnerOperations.js");
@@ -29,6 +30,7 @@ exports.isCloseOrRepay = require_onchain_preview_preview_detectCloseOrRepay.isCl
29
30
  exports.isPoolOperation = require_onchain_preview_parse_types.isPoolOperation;
30
31
  exports.isRWAOperation = require_onchain_preview_parse_types.isRWAOperation;
31
32
  exports.makeReplayState = require_onchain_preview_preview_replayInnerOperations.makeReplayState;
33
+ exports.midasGreenlistsAccount = require_onchain_preview_preview_midasGreenlistsAccount.midasGreenlistsAccount;
32
34
  exports.parseFacadeOperationCalldata = require_onchain_preview_parse_parseFacadeOperationCalldata.parseFacadeOperationCalldata;
33
35
  exports.parseOperationCalldata = require_onchain_preview_parse_parseOperationCalldata.parseOperationCalldata;
34
36
  exports.parsePoolOperationCalldata = require_onchain_preview_parse_parsePoolOperationCalldata.parsePoolOperationCalldata;
@@ -5,6 +5,7 @@ const require_onchain_preview_preview_detectCloseOrRepay = require("./detectClos
5
5
  const require_onchain_preview_preview_detectDelayedClaim = require("./detectDelayedClaim.js");
6
6
  const require_onchain_preview_preview_detectDelayedOperation = require("./detectDelayedOperation.js");
7
7
  const require_onchain_preview_preview_estimateClaimableAt = require("./estimateClaimableAt.js");
8
+ const require_onchain_preview_preview_midasGreenlistsAccount = require("./midasGreenlistsAccount.js");
8
9
  const require_onchain_preview_preview_previewAdjustStrategyPosition = require("./previewAdjustStrategyPosition.js");
9
10
  const require_onchain_preview_preview_previewExitOrRepayStrategyPosition = require("./previewExitOrRepayStrategyPosition.js");
10
11
  const require_onchain_preview_preview_replayInnerOperations = require("./replayInnerOperations.js");
@@ -18,6 +19,7 @@ exports.detectDelayedOperation = require_onchain_preview_preview_detectDelayedOp
18
19
  exports.estimateClaimableAt = require_onchain_preview_preview_estimateClaimableAt.estimateClaimableAt;
19
20
  exports.isCloseOrRepay = require_onchain_preview_preview_detectCloseOrRepay.isCloseOrRepay;
20
21
  exports.makeReplayState = require_onchain_preview_preview_replayInnerOperations.makeReplayState;
22
+ exports.midasGreenlistsAccount = require_onchain_preview_preview_midasGreenlistsAccount.midasGreenlistsAccount;
21
23
  exports.previewAdjustStrategyPosition = require_onchain_preview_preview_previewAdjustStrategyPosition.previewAdjustStrategyPosition;
22
24
  exports.previewExitOrRepayStrategyPosition = require_onchain_preview_preview_previewExitOrRepayStrategyPosition.previewExitOrRepayStrategyPosition;
23
25
  exports.previewOperation = require_onchain_preview_preview_previewOperation.previewOperation;
@@ -0,0 +1,17 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_onchain_market_adapters_contracts_MidasGatewayAdapterContract = require("../../market/adapters/contracts/MidasGatewayAdapterContract.js");
3
+ //#region src/onchain/preview/preview/midasGreenlistsAccount.ts
4
+ /**
5
+ * Whether the multicall grants the Midas greenlisted role to the credit
6
+ * account via `receiveGreenlist()`.
7
+ */
8
+ function midasGreenlistsAccount(sdk, multicall) {
9
+ for (const op of multicall) {
10
+ if (op.operation !== "Execute") continue;
11
+ const adapter = sdk.getContract(op.adapter);
12
+ if (adapter instanceof require_onchain_market_adapters_contracts_MidasGatewayAdapterContract.MidasGatewayAdapterContract && adapter.isReceiveGreenlist(op.calldata)) return true;
13
+ }
14
+ return false;
15
+ }
16
+ //#endregion
17
+ exports.midasGreenlistsAccount = midasGreenlistsAccount;
@@ -3,6 +3,7 @@ const require_onchain_constants_address_provider = require("../../constants/addr
3
3
  const require_model_previews = require("../../../model/previews.js");
4
4
  const require_model_result = require("../../../model/result.js");
5
5
  require("../../../model/index.js");
6
+ const require_onchain_preview_preview_midasGreenlistsAccount = require("./midasGreenlistsAccount.js");
6
7
  const require_onchain_preview_preview_unwrapNativeCollateral = require("./unwrapNativeCollateral.js");
7
8
  //#region src/onchain/preview/preview/previewOpenStrategyPosition.ts
8
9
  function previewOpenStrategyPosition(sdk, input, operation, replay) {
@@ -17,7 +18,7 @@ function previewOpenStrategyPosition(sdk, input, operation, replay) {
17
18
  warning ??= priced.error;
18
19
  return priced.value;
19
20
  };
20
- const netValue = before.balances.sum(price) + after.collateralAdded.sum(price);
21
+ const netValue = before.balances.sum(price) + after.collateralAdded.sum(price) - after.collateralWithdrawn.sum(price);
21
22
  const unwrapped = require_onchain_preview_preview_unwrapNativeCollateral.unwrapNativeCollateral(after.collateralAdded.toAssets(), value, sdk.addressProvider.getAddress(require_onchain_constants_address_provider.AP_WETH_TOKEN, 0));
22
23
  if (!unwrapped.ok) return unwrapped;
23
24
  const collateral = unwrapped.data;
@@ -27,13 +28,15 @@ function previewOpenStrategyPosition(sdk, input, operation, replay) {
27
28
  ...require_model_previews.asEstimated(sdk.positions.projection(snap, { availableLiquidityChange: -account.totalDebt })),
28
29
  targetCollateral: targetAsset ? oracle.toTokenAmount(targetAsset.token, targetAsset.balance) : void 0,
29
30
  collateralAdded: collateral.map((a) => oracle.toTokenAmount(a.token, a.balance)),
31
+ collateralWithdrawn: after.collateralWithdrawn.toAssets().map((a) => oracle.toTokenAmount(a.token, a.balance)),
30
32
  warning
31
33
  };
32
34
  return require_model_result.sdkOk({
33
35
  ...projection,
34
36
  operation: "OpenCreditAccount",
35
37
  ...operation.operation === "MultiCall" || operation.operation === "BotMulticall" || operation.operation === "RWAMulticall" ? { creditAccount: operation.creditAccount } : {},
36
- ..."args" in operation ? { rwaArgs: operation.args } : {}
38
+ ..."args" in operation ? { rwaArgs: operation.args } : {},
39
+ midasGreenlistsAccount: require_onchain_preview_preview_midasGreenlistsAccount.midasGreenlistsAccount(sdk, operation.multicall)
37
40
  });
38
41
  }
39
42
  /**
@@ -27,6 +27,7 @@ async function checkCreditOperation(args) {
27
27
  const market = suite.market;
28
28
  const underlying = require_onchain_validation_helpers_token.toToken(sdk, market.pool.underlying);
29
29
  const isOpening = preview.operation === "OpenCreditAccount";
30
+ const isEmptyOpening = preview.operation === "OpenCreditAccount" && preview.totalDebt.value === 0n && preview.collateralAdded.length === 0 && preview.quotas.length === 0;
30
31
  const protocol = [
31
32
  ...require_onchain_validation_bundles_checkMarket.checkMarket(suite),
32
33
  ...require_onchain_validation_checks_checkDebtLimits.checkDebtLimits({
@@ -34,7 +35,7 @@ async function checkCreditOperation(args) {
34
35
  minDebt: suite.creditFacade.minDebt,
35
36
  maxDebt: suite.creditFacade.maxDebt,
36
37
  underlying,
37
- allowZero: !isOpening,
38
+ allowZero: !isOpening || isEmptyOpening,
38
39
  maxBorrowAmount: suite.maxBorrowAmount()
39
40
  }),
40
41
  ...require_onchain_validation_bundles_checkIncreaseDebt.checkIncreaseDebt(suite, preview, underlying),
@@ -0,0 +1,44 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_model_errors_operation_errors = require("../../../model/errors/operation-errors.js");
3
+ const require_model_errors_prepare_errors = require("../../../model/errors/prepare-errors.js");
4
+ require("../../../model/index.js");
5
+ const require_onchain_validation_helpers_token = require("../helpers/token.js");
6
+ require("../helpers/index.js");
7
+ //#region src/onchain/validation/bundles/checkMidasAccountGreenlist.ts
8
+ /**
9
+ * Whether the credit account already holds the Midas greenlisted role
10
+ * this permissioned mToken requires of its holder.
11
+ */
12
+ async function checkMidasAccountGreenlist(input) {
13
+ const { sdk, preview, nft, tokens } = input;
14
+ if (nft.protocol !== "midas") return [];
15
+ if (tokens.length === 0) return [];
16
+ const account = preview.creditAccount;
17
+ if (!account) return tokens.map((token) => require_model_errors_operation_errors.accountNotMidasGreenlisted({
18
+ token: require_onchain_validation_helpers_token.toToken(sdk, token),
19
+ creditManager: preview.creditManager
20
+ }));
21
+ return (await Promise.all(tokens.map((token) => checkAccountRole({
22
+ sdk,
23
+ nft,
24
+ account,
25
+ token,
26
+ preview
27
+ })))).flat();
28
+ }
29
+ async function checkAccountRole(input) {
30
+ const { sdk, nft, account, token, preview } = input;
31
+ try {
32
+ const requirements = await nft.getOpenAccountRequirements(account, { tokenOutAddress: token });
33
+ if (nft.isRegistered(requirements)) return [];
34
+ return [require_model_errors_operation_errors.accountNotMidasGreenlisted({
35
+ token: require_onchain_validation_helpers_token.toToken(sdk, token),
36
+ creditManager: preview.creditManager,
37
+ creditAccount: account
38
+ })];
39
+ } catch (cause) {
40
+ return [require_model_errors_prepare_errors.unexpectedFailure(cause, "read the Midas account greenlist")];
41
+ }
42
+ }
43
+ //#endregion
44
+ exports.checkMidasAccountGreenlist = checkMidasAccountGreenlist;
@@ -1,24 +1,34 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_onchain_utils_AddressSet = require("../../utils/AddressSet.js");
3
+ const require_onchain_validation_bundles_checkMidasAccountGreenlist = require("./checkMidasAccountGreenlist.js");
3
4
  const require_onchain_validation_bundles_checkRWAOpenRequirements = require("./checkRWAOpenRequirements.js");
4
5
  //#region src/onchain/validation/bundles/checkRWAOpening.ts
5
6
  /**
6
7
  * Per KYC-gated token among `collateralAdded ∪ quotas`, whether the
7
- * borrower still has to register or sign before this opening can land.
8
+ * borrower still has to register or sign before this opening can land,
9
+ * and whether a Midas credit account may hold the mToken.
8
10
  */
9
11
  async function checkRWAOpening(input) {
10
12
  const { sdk, preview, sender } = input;
11
13
  const nft = await sdk.marketRegister.findCreditManager(preview.creditManager).degenNFT();
12
14
  if (!nft) return [];
13
- const gated = new require_onchain_utils_AddressSet.AddressSet(await nft.getTokens());
14
- const candidates = new require_onchain_utils_AddressSet.AddressSet([...preview.collateralAdded.map((a) => a.token.address), ...preview.quotas.map((q) => q.token.address)]);
15
- return (await Promise.all([...candidates].filter((token) => gated.has(token)).map((token) => require_onchain_validation_bundles_checkRWAOpenRequirements.checkRWAOpenRequirements({
15
+ const nftTokens = new require_onchain_utils_AddressSet.AddressSet(await nft.getTokens());
16
+ let candidates = new require_onchain_utils_AddressSet.AddressSet([...preview.collateralAdded.map((a) => a.token.address), ...preview.quotas.map((q) => q.token.address)]).asArray();
17
+ candidates = candidates.filter((token) => nftTokens.has(token));
18
+ let tokensToCheck = candidates;
19
+ if (tokensToCheck.length === 0 && !preview.creditAccount && nft.protocol === "midas") tokensToCheck = nftTokens.asArray();
20
+ return (await Promise.all([...tokensToCheck.map((token) => require_onchain_validation_bundles_checkRWAOpenRequirements.checkRWAOpenRequirements({
16
21
  sdk,
17
22
  wallet: sender,
18
23
  creditManager: preview.creditManager,
19
24
  token,
20
25
  providedArgs: preview.rwaArgs
21
- })))).flat();
26
+ })), require_onchain_validation_bundles_checkMidasAccountGreenlist.checkMidasAccountGreenlist({
27
+ sdk,
28
+ preview,
29
+ nft,
30
+ tokens: candidates
31
+ })])).flat();
22
32
  }
23
33
  //#endregion
24
34
  exports.checkRWAOpening = checkRWAOpening;
@@ -8,6 +8,7 @@ const require_onchain_validation_bundles_checkIncreaseDebt = require("./checkInc
8
8
  const require_onchain_validation_bundles_checkIncreaseQuota = require("./checkIncreaseQuota.js");
9
9
  const require_onchain_validation_bundles_checkMarket = require("./checkMarket.js");
10
10
  const require_onchain_validation_bundles_checkObtained = require("./checkObtained.js");
11
+ const require_onchain_validation_bundles_checkMidasAccountGreenlist = require("./checkMidasAccountGreenlist.js");
11
12
  const require_onchain_validation_bundles_checkRWAOpenRequirements = require("./checkRWAOpenRequirements.js");
12
13
  const require_onchain_validation_bundles_checkRWAOpening = require("./checkRWAOpening.js");
13
14
  const require_onchain_validation_bundles_checkCreditOperation = require("./checkCreditOperation.js");
@@ -25,6 +26,7 @@ exports.checkIncreaseQuota = require_onchain_validation_bundles_checkIncreaseQuo
25
26
  exports.checkLiquidationEligibility = require_onchain_validation_bundles_checkLiquidationEligibility.checkLiquidationEligibility;
26
27
  exports.checkLiquidationFunding = require_onchain_validation_bundles_checkLiquidationFunding.checkLiquidationFunding;
27
28
  exports.checkMarket = require_onchain_validation_bundles_checkMarket.checkMarket;
29
+ exports.checkMidasAccountGreenlist = require_onchain_validation_bundles_checkMidasAccountGreenlist.checkMidasAccountGreenlist;
28
30
  exports.checkObtained = require_onchain_validation_bundles_checkObtained.checkObtained;
29
31
  exports.checkPoolFunding = require_onchain_validation_bundles_checkPoolFunding.checkPoolFunding;
30
32
  exports.checkPoolOperation = require_onchain_validation_bundles_checkPoolOperation.checkPoolOperation;
@@ -29,6 +29,7 @@ const require_onchain_validation_bundles_checkIncreaseDebt = require("./bundles/
29
29
  const require_onchain_validation_bundles_checkIncreaseQuota = require("./bundles/checkIncreaseQuota.js");
30
30
  const require_onchain_validation_bundles_checkMarket = require("./bundles/checkMarket.js");
31
31
  const require_onchain_validation_bundles_checkObtained = require("./bundles/checkObtained.js");
32
+ const require_onchain_validation_bundles_checkMidasAccountGreenlist = require("./bundles/checkMidasAccountGreenlist.js");
32
33
  const require_onchain_validation_bundles_checkRWAOpenRequirements = require("./bundles/checkRWAOpenRequirements.js");
33
34
  const require_onchain_validation_bundles_checkRWAOpening = require("./bundles/checkRWAOpening.js");
34
35
  const require_onchain_validation_bundles_checkCreditOperation = require("./bundles/checkCreditOperation.js");
@@ -67,6 +68,7 @@ exports.checkLiquidationFunding = require_onchain_validation_bundles_checkLiquid
67
68
  exports.checkLiquidatorEligible = require_onchain_validation_checks_checkLiquidatorEligible.checkLiquidatorEligible;
68
69
  exports.checkMarket = require_onchain_validation_bundles_checkMarket.checkMarket;
69
70
  exports.checkMarketExpired = require_onchain_validation_checks_checkMarketExpired.checkMarketExpired;
71
+ exports.checkMidasAccountGreenlist = require_onchain_validation_bundles_checkMidasAccountGreenlist.checkMidasAccountGreenlist;
70
72
  exports.checkObtained = require_onchain_validation_bundles_checkObtained.checkObtained;
71
73
  exports.checkOperation = require_onchain_validation_checkOperation.checkOperation;
72
74
  exports.checkPoolFunding = require_onchain_validation_bundles_checkPoolFunding.checkPoolFunding;
@@ -17,6 +17,8 @@ var ExecuteApi = class {
17
17
  switch (request.kind) {
18
18
  case "pool": return poolTx(sdk, request);
19
19
  case "open": return openTx(sdk, request);
20
+ case "openEmpty": return openEmptyTx(sdk, request);
21
+ case "borrow": return borrowTx(sdk, request);
20
22
  case "account": return accountTx(sdk, request);
21
23
  }
22
24
  }
@@ -63,17 +65,75 @@ async function openTx(sdk, request) {
63
65
  reopenCreditAccount: state.creditAccount,
64
66
  permits: {},
65
67
  referralCode: 0n,
66
- rwaOptions: await openRwaOptions(sdk, request)
68
+ rwaOptions: await openRwaOptions(sdk, request, request.targetToken)
69
+ });
70
+ }
71
+ /**
72
+ * The opening with nothing in it: no debt to draw, no collateral to take, no
73
+ * path to run and no quota to buy, so `openCA` is left with the price updates
74
+ * the market demands and the facade's own `openCreditAccount`.
75
+ *
76
+ * Nothing is read off the preparation because there is nothing on it. The
77
+ * account holds no token, so an RWA market has none to gate on either.
78
+ **/
79
+ function openEmptyTx(sdk, request) {
80
+ return sdk.accounts.openCA({
81
+ creditManager: request.creditManager,
82
+ to: request.wallet,
83
+ collateral: [],
84
+ ethAmount: 0n,
85
+ debt: 0n,
86
+ calls: [],
87
+ averageQuota: [],
88
+ minQuota: [],
89
+ permits: {},
90
+ referralCode: 0n
91
+ });
92
+ }
93
+ /**
94
+ * A loan is an opening whose debt leaves again, so it is the same `openCA`
95
+ * with `withdrawToken` set: the facade draws the debt, takes the collateral,
96
+ * runs whatever path buys the payout, and sweeps that payout to the wallet.
97
+ *
98
+ * Both quota branches are the one the state carries. An opening has two
99
+ * because the balances it lands on are a router quote; here the account is
100
+ * left holding the collateral the caller named, and a named amount has no
101
+ * floor to differ from.
102
+ **/
103
+ async function borrowTx(sdk, request) {
104
+ const { creditManager, wallet, ethAmount, sim } = request;
105
+ const { state } = sim.data;
106
+ const collateral = {
107
+ token: state.collateral.token.address,
108
+ balance: state.collateral.value
109
+ };
110
+ return sdk.accounts.openCA({
111
+ creditManager,
112
+ to: wallet,
113
+ collateral: [collateral],
114
+ ethAmount,
115
+ debt: state.totalDebt.value,
116
+ calls: state.calls,
117
+ withdrawToken: state.borrowed.token.address,
118
+ averageQuota: state.quotaIncrease,
119
+ minQuota: state.quotaIncrease,
120
+ reopenCreditAccount: state.creditAccount,
121
+ permits: {},
122
+ referralCode: 0n,
123
+ rwaOptions: await openRwaOptions(sdk, request, collateral.token)
67
124
  });
68
125
  }
69
126
  /**
70
127
  * The documented `openCA` contract: ask the market for its open requirements
71
128
  * and hand them back as operation args, with the caller's cached signatures
72
- * attached. `undefined` on non-RWA markets and when no target token is named.
129
+ * attached. `undefined` on non-RWA markets and when no token is named.
130
+ *
131
+ * `token` is the one the account ends up holding, which is what an RWA market
132
+ * gates on: the opening's target, and the borrow's collateral.
73
133
  **/
74
- async function openRwaOptions(sdk, request) {
75
- if (!request.targetToken) return;
76
- const requirements = await sdk.accounts.getOpenAccountRequirements(request.wallet, request.creditManager, { tokenOutAddress: request.targetToken });
134
+ async function openRwaOptions(sdk, request, token) {
135
+ if (!token) return;
136
+ const requirements = await sdk.accounts.getOpenAccountRequirements(request.wallet, request.creditManager, { tokenOutAddress: token });
77
137
  if (requirements?.protocol !== "securitize") return;
78
138
  return {
79
139
  protocol: "securitize",
@@ -196,26 +196,33 @@ var PrepareApi = class extends require_onchain_base_MultichainConstruct.Multicha
196
196
  }
197
197
  }
198
198
  /**
199
+ * {@inheritDoc IOpportunitiesPrepare.openEmptyCreditAccount}
200
+ **/
201
+ async openEmptyCreditAccount(strategy) {
202
+ try {
203
+ const sdk = await this.#chain(strategy.chainId);
204
+ const at = stateBlock(sdk);
205
+ const result = await service(sdk).openEmptyAccountIntent({
206
+ sdk,
207
+ creditManager: strategy.creditManager
208
+ });
209
+ return result.ok ? require_model_result.sdkOk(at) : methodError(result);
210
+ } catch (e) {
211
+ return require_model_result.sdkErr(require_model_errors_prepare_errors.unexpectedFailure(e));
212
+ }
213
+ }
214
+ /**
199
215
  * {@inheritDoc IOpportunitiesPrepare.openNewStrategy}
200
216
  **/
201
217
  async openNewStrategy(strategy, params) {
202
218
  try {
203
219
  const sdk = await this.#chain(strategy.chainId);
204
220
  const at = stateBlock(sdk);
205
- if (params.empty) return opened(await service(sdk).openStrategyIntent({
206
- sdk,
207
- creditManager: strategy.creditManager,
208
- empty: true
209
- }), at);
210
221
  const targetToken = params.targetToken ?? sdk.marketRegister.findCreditManager(strategy.creditManager).strategyTargetCollateral;
211
222
  if (!targetToken) return require_model_result.sdkErr(require_model_errors_prepare_errors.noStrategyTargetCollateral(strategy.creditManager));
212
- let creditAccount;
213
- if (params.creditAccount) {
214
- const reused = await slice(sdk, params.creditAccount);
215
- if (!reused || !(0, viem.isAddressEqual)(reused.creditManager, strategy.creditManager)) return require_model_result.sdkErr(require_model_errors_prepare_errors.creditAccountNotFound(params.creditAccount));
216
- if (reused.totalDebt > 0n || reused.tokens.some((t) => t.quota > 0n)) return require_model_result.sdkErr(require_model_errors_prepare_errors.creditAccountNotEmpty(params.creditAccount));
217
- creditAccount = reused;
218
- }
223
+ const reused = await reusable(sdk, strategy, params.creditAccount);
224
+ if (reused && "error" in reused) return reused;
225
+ const creditAccount = reused?.account;
219
226
  return opened(await service(sdk).openStrategyIntent({
220
227
  sdk,
221
228
  creditManager: strategy.creditManager,
@@ -232,6 +239,30 @@ var PrepareApi = class extends require_onchain_base_MultichainConstruct.Multicha
232
239
  }
233
240
  }
234
241
  /**
242
+ * {@inheritDoc IOpportunitiesPrepare.borrow}
243
+ **/
244
+ async borrow(strategy, params) {
245
+ try {
246
+ const sdk = await this.#chain(strategy.chainId);
247
+ const at = stateBlock(sdk);
248
+ const reused = await reusable(sdk, strategy, params.creditAccount);
249
+ if (reused && "error" in reused) return reused;
250
+ return borrowed(await service(sdk).borrowIntent({
251
+ sdk,
252
+ creditManager: strategy.creditManager,
253
+ collateralToken: params.collateralToken,
254
+ collateralAmount: params.collateralAmount,
255
+ borrowToken: params.borrowToken,
256
+ borrowAmount: params.borrowAmount,
257
+ slippage: params.slippage,
258
+ quotaReserve: params.quotaReserve,
259
+ creditAccount: reused?.account
260
+ }), at);
261
+ } catch (e) {
262
+ return require_model_result.sdkErr(require_model_errors_prepare_errors.unexpectedFailure(e));
263
+ }
264
+ }
265
+ /**
235
266
  * {@inheritDoc IOpportunitiesPrepare.depositStrategy}
236
267
  **/
237
268
  async depositStrategy(position, params) {
@@ -354,6 +385,21 @@ var PrepareApi = class extends require_onchain_base_MultichainConstruct.Multicha
354
385
  });
355
386
  }
356
387
  /**
388
+ * {@inheritDoc IOpportunitiesPrepare.maxBorrow}
389
+ **/
390
+ maxBorrow(strategy, params) {
391
+ const sdk = this.sdk.chain(strategy.chainId);
392
+ return service(sdk).maxBorrow({
393
+ sdk,
394
+ creditManager: strategy.creditManager,
395
+ collateralToken: params.collateralToken,
396
+ collateralAmount: params.collateralAmount,
397
+ borrowToken: params.borrowToken,
398
+ targetHF: params.targetHF,
399
+ quotaReserve: params.quotaReserve
400
+ });
401
+ }
402
+ /**
357
403
  * The account a bare `max*` read weighs. These reads answer a number, not
358
404
  * an envelope, so an account the markets do not hold is thrown rather than
359
405
  * described, see {@link IOpportunitiesPrepare.maxWithdraw}.
@@ -439,6 +485,25 @@ async function slice(sdk, creditAccount) {
439
485
  return data && require_onchain_accounts_intents_utils_credit_account_slice.toCreditAccountSlice(data);
440
486
  }
441
487
  /**
488
+ * The pre-opened account a request asks to be run on, held to what "pre-opened"
489
+ * means: this manager's, owing nothing and holding no quota.
490
+ *
491
+ * Shared by the two flows that put something on a fresh account — an opening
492
+ * and a borrow — so both hold a reused one to the same terms. Whatever
493
+ * balances sit on it are left to the flow: an opening routes them, a borrow
494
+ * leaves them where they are.
495
+ *
496
+ * @returns Nothing when the request named no account, the refusal to answer
497
+ * with when it named one that does not qualify, and the slice otherwise
498
+ **/
499
+ async function reusable(sdk, strategy, creditAccount) {
500
+ if (!creditAccount) return;
501
+ const account = await slice(sdk, creditAccount);
502
+ if (!account || !(0, viem.isAddressEqual)(account.creditManager, strategy.creditManager)) return require_model_result.sdkErr(require_model_errors_prepare_errors.creditAccountNotFound(creditAccount));
503
+ if (account.totalDebt > 0n || account.tokens.some((t) => t.quota > 0n)) return require_model_result.sdkErr(require_model_errors_prepare_errors.creditAccountNotEmpty(creditAccount));
504
+ return { account };
505
+ }
506
+ /**
442
507
  * The operation a claim resumes, or `undefined` when there is none to resume:
443
508
  * a withdrawal requested without an intent, or one read through a compressor
444
509
  * too old to report it. Every intent the engine records can be finished,
@@ -538,6 +603,15 @@ function opened(result, at) {
538
603
  }
539
604
  /**
540
605
  * {@inheritDoc planned}
606
+ **/
607
+ function borrowed(result, at) {
608
+ return result.ok ? require_model_result.sdkOk({
609
+ state: result.state,
610
+ ...at
611
+ }) : methodError(result);
612
+ }
613
+ /**
614
+ * {@inheritDoc planned}
541
615
  *
542
616
  * Both routes are payload, error and all: `errors` says why a missing one is
543
617
  * missing, and it stays on the error when neither route answered, since that is
@@ -13,10 +13,10 @@ import { detectChain } from "./detectChain.js";
13
13
  import { isOutOfSyncError } from "./isOutOfSyncError.js";
14
14
  import { isRateLimitError } from "./isRateLimitError.js";
15
15
  import { isTransientError } from "./isTransientError.js";
16
- import { greenlistMidasGateway, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, writeAndWait } from "./kycUtils.js";
16
+ import { collectMidasGateways, collectMidasMTokens, unpauseMidasIssuanceVault } from "./midasUtils.js";
17
+ import { greenlistMidasGateway, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor } from "./kycUtils.js";
17
18
  import { isRangeError, logSplitterTransport } from "./logSplitterTransport.js";
18
19
  import { setLTZero, setLTs } from "./ltUtils.js";
19
- import { unpauseMidasIssuanceVault } from "./midasUtils.js";
20
20
  import { migrateFaucet } from "./migrateFaucet.js";
21
21
  import { SUPPORTED_RPC_PROVIDERS, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getRpcProviderUrl, getThirdWebUrl, rpcProvidersSchema } from "./providers.js";
22
22
  import { replaceStorage } from "./replaceStorage.js";
@@ -25,4 +25,4 @@ import { claimDSToken, claimDSTokens, enableDSTokenBackDating } from "./securiti
25
25
  import "./types.js";
26
26
  import { ONCHAIN_EXECUTION_ID_ADDRESS, verifyTestnet } from "./verifyTestnet.js";
27
27
  import { makePendingWithdrawalsClaimable } from "./withdrawalUtils.js";
28
- export { AccountOpener, Create2Deployer, DEFAULT_CREATE2_SALT, EthCallSpy, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, RevolverTransport, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet, writeAndWait };
28
+ export { AccountOpener, Create2Deployer, DEFAULT_CREATE2_SALT, EthCallSpy, NoAvailableTransportsError, ONCHAIN_EXECUTION_ID_ADDRESS, OpenTxRevertedError, PUBLIC_CREATE2_FACTORY, RevolverTransport, SUPPORTED_RPC_PROVIDERS, SelectionStrategy, anvilNodeInfo, calcLiquidatableLTs, claimDSToken, claimDSTokens, claimFromFaucet, collectMidasGateways, collectMidasMTokens, createAnvilClient, createMinter, deployUsingPublicCreate2, detectChain, enableDSTokenBackDating, evmMineDetailed, extendAnvilClient, getAlchemyUrl, getAnkrUrl, getDrpcUrl, getErpcKey, getPublicCreate2Address, getRpcProviderUrl, getThirdWebUrl, greenlistMidasGateway, httpTransportOptionsSchema, iDegenNftv2Abi, iFaucetAbi, iOnchainExecutionIdAbi, iOwnableAbi, iaclTraitAbi, isAnvil, isDeployedUsingPublicCreate2, isOutOfSyncError, isRangeError, isRateLimitError, isTransientError, logSplitterTransport, makePendingWithdrawalsClaimable, migrateFaucet, providerConfigSchema, registerMidasInvestor, registerRWAInvestor, registerSecuritizeInvestor, replaceStorage, resilientTransport, resilientTransportOptionsSchema, revolverTransportConfigBaseSchema, revolverTransportConfigSchema, rpcProvidersSchema, setLTZero, setLTs, unpauseMidasIssuanceVault, verifyTestnet };