@rhinestone/sdk 1.0.0-alpha.8 → 1.0.0-beta.38

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 (153) hide show
  1. package/dist/src/accounts/error.d.ts +38 -3
  2. package/dist/src/accounts/error.d.ts.map +1 -1
  3. package/dist/src/accounts/error.js +57 -7
  4. package/dist/src/accounts/index.d.ts +30 -15
  5. package/dist/src/accounts/index.d.ts.map +1 -1
  6. package/dist/src/accounts/index.js +304 -138
  7. package/dist/src/accounts/index.test.js +3 -5
  8. package/dist/src/accounts/json-rpc/index.d.ts +5 -0
  9. package/dist/src/accounts/json-rpc/index.d.ts.map +1 -0
  10. package/dist/src/accounts/json-rpc/index.js +16 -0
  11. package/dist/src/accounts/json-rpc/index.test.d.ts.map +1 -0
  12. package/dist/src/accounts/json-rpc/index.test.js +16 -0
  13. package/dist/src/accounts/json-rpc/providers.d.ts +4 -0
  14. package/dist/src/accounts/json-rpc/providers.d.ts.map +1 -0
  15. package/dist/src/accounts/json-rpc/providers.js +14 -0
  16. package/dist/src/accounts/json-rpc/providers.test.d.ts +2 -0
  17. package/dist/src/accounts/json-rpc/providers.test.d.ts.map +1 -0
  18. package/dist/src/accounts/json-rpc/providers.test.js +15 -0
  19. package/dist/src/accounts/kernel.d.ts +4 -3
  20. package/dist/src/accounts/kernel.d.ts.map +1 -1
  21. package/dist/src/accounts/kernel.js +32 -6
  22. package/dist/src/accounts/kernel.test.js +41 -19
  23. package/dist/src/accounts/nexus.d.ts +14 -7
  24. package/dist/src/accounts/nexus.d.ts.map +1 -1
  25. package/dist/src/accounts/nexus.js +191 -34
  26. package/dist/src/accounts/nexus.test.js +44 -18
  27. package/dist/src/accounts/safe.d.ts +2 -2
  28. package/dist/src/accounts/safe.d.ts.map +1 -1
  29. package/dist/src/accounts/safe.js +88 -58
  30. package/dist/src/accounts/safe.test.js +40 -14
  31. package/dist/src/accounts/signing/common.d.ts +27 -0
  32. package/dist/src/accounts/signing/common.d.ts.map +1 -0
  33. package/dist/src/accounts/signing/common.js +145 -0
  34. package/dist/src/accounts/signing/message.d.ts +5 -0
  35. package/dist/src/accounts/signing/message.d.ts.map +1 -0
  36. package/dist/src/accounts/signing/message.js +47 -0
  37. package/dist/src/accounts/signing/passkeys.d.ts +36 -0
  38. package/dist/src/accounts/signing/passkeys.d.ts.map +1 -0
  39. package/dist/src/accounts/signing/passkeys.js +125 -0
  40. package/dist/src/accounts/signing/passkeys.test.d.ts +2 -0
  41. package/dist/src/accounts/signing/passkeys.test.d.ts.map +1 -0
  42. package/dist/src/accounts/signing/passkeys.test.js +88 -0
  43. package/dist/src/accounts/signing/typedData.d.ts +5 -0
  44. package/dist/src/accounts/signing/typedData.d.ts.map +1 -0
  45. package/dist/src/accounts/signing/typedData.js +35 -0
  46. package/dist/src/accounts/startale.d.ts +20 -0
  47. package/dist/src/accounts/startale.d.ts.map +1 -0
  48. package/dist/src/accounts/startale.js +100 -0
  49. package/dist/src/accounts/startale.test.d.ts +2 -0
  50. package/dist/src/accounts/startale.test.d.ts.map +1 -0
  51. package/dist/src/accounts/startale.test.js +92 -0
  52. package/dist/src/accounts/utils.d.ts +4 -4
  53. package/dist/src/accounts/utils.d.ts.map +1 -1
  54. package/dist/src/accounts/utils.js +3 -40
  55. package/dist/src/accounts/walletClient.d.ts +7 -0
  56. package/dist/src/accounts/walletClient.d.ts.map +1 -0
  57. package/dist/src/accounts/walletClient.js +38 -0
  58. package/dist/src/actions/compact.d.ts +13 -0
  59. package/dist/src/actions/compact.d.ts.map +1 -0
  60. package/dist/src/actions/compact.js +210 -0
  61. package/dist/src/actions/ecdsa.d.ts +35 -0
  62. package/dist/src/actions/ecdsa.d.ts.map +1 -0
  63. package/dist/src/actions/ecdsa.js +114 -0
  64. package/dist/src/actions/ecdsa.test.d.ts +2 -0
  65. package/dist/src/actions/ecdsa.test.d.ts.map +1 -0
  66. package/dist/src/actions/ecdsa.test.js +99 -0
  67. package/dist/src/actions/index.d.ts +23 -38
  68. package/dist/src/actions/index.d.ts.map +1 -1
  69. package/dist/src/actions/index.js +29 -294
  70. package/dist/src/actions/mfa.d.ts +37 -0
  71. package/dist/src/actions/mfa.d.ts.map +1 -0
  72. package/dist/src/actions/mfa.js +133 -0
  73. package/dist/src/actions/passkeys.d.ts +37 -0
  74. package/dist/src/actions/passkeys.d.ts.map +1 -0
  75. package/dist/src/actions/passkeys.js +129 -0
  76. package/dist/src/actions/passkeys.test.d.ts +2 -0
  77. package/dist/src/actions/passkeys.test.d.ts.map +1 -0
  78. package/dist/src/actions/passkeys.test.js +54 -0
  79. package/dist/src/actions/recovery.d.ts +33 -0
  80. package/dist/src/actions/recovery.d.ts.map +1 -0
  81. package/dist/src/actions/recovery.js +193 -0
  82. package/dist/src/actions/recovery.test.d.ts +2 -0
  83. package/dist/src/actions/recovery.test.d.ts.map +1 -0
  84. package/dist/src/actions/recovery.test.js +168 -0
  85. package/dist/src/actions/smart-session.d.ts +6 -0
  86. package/dist/src/actions/smart-session.d.ts.map +1 -1
  87. package/dist/src/actions/smart-session.js +6 -0
  88. package/dist/src/errors/index.d.ts +5 -0
  89. package/dist/src/errors/index.d.ts.map +1 -0
  90. package/dist/src/errors/index.js +35 -0
  91. package/dist/src/execution/compact.d.ts +150 -7
  92. package/dist/src/execution/compact.d.ts.map +1 -1
  93. package/dist/src/execution/compact.js +112 -95
  94. package/dist/src/execution/error.d.ts +2 -9
  95. package/dist/src/execution/error.d.ts.map +1 -1
  96. package/dist/src/execution/error.js +4 -13
  97. package/dist/src/execution/index.d.ts +34 -22
  98. package/dist/src/execution/index.d.ts.map +1 -1
  99. package/dist/src/execution/index.js +62 -43
  100. package/dist/src/execution/permit2.d.ts +148 -0
  101. package/dist/src/execution/permit2.d.ts.map +1 -0
  102. package/dist/src/execution/permit2.js +282 -0
  103. package/dist/src/execution/smart-session.d.ts +3 -3
  104. package/dist/src/execution/smart-session.d.ts.map +1 -1
  105. package/dist/src/execution/types.d.ts +35 -0
  106. package/dist/src/execution/types.d.ts.map +1 -0
  107. package/dist/src/execution/types.js +2 -0
  108. package/dist/src/execution/utils.d.ts +36 -27
  109. package/dist/src/execution/utils.d.ts.map +1 -1
  110. package/dist/src/execution/utils.js +357 -103
  111. package/dist/src/index.d.ts +41 -22
  112. package/dist/src/index.d.ts.map +1 -1
  113. package/dist/src/index.js +199 -65
  114. package/dist/src/modules/common.d.ts +10 -4
  115. package/dist/src/modules/common.d.ts.map +1 -1
  116. package/dist/src/modules/common.js +22 -1
  117. package/dist/src/modules/index.d.ts +4 -18
  118. package/dist/src/modules/index.d.ts.map +1 -1
  119. package/dist/src/modules/index.js +15 -63
  120. package/dist/src/modules/index.test.js +9 -26
  121. package/dist/src/modules/omni-account.d.ts +2 -1
  122. package/dist/src/modules/omni-account.d.ts.map +1 -1
  123. package/dist/src/modules/omni-account.js +3 -1
  124. package/dist/src/modules/read.d.ts.map +1 -1
  125. package/dist/src/modules/read.js +5 -0
  126. package/dist/src/modules/validators/core.d.ts +5 -3
  127. package/dist/src/modules/validators/core.d.ts.map +1 -1
  128. package/dist/src/modules/validators/core.js +64 -41
  129. package/dist/src/modules/validators/core.test.js +7 -7
  130. package/dist/src/modules/validators/smart-sessions.js +3 -3
  131. package/dist/src/modules/validators/smart-sessions.test.js +4 -7
  132. package/dist/src/orchestrator/client.d.ts +4 -4
  133. package/dist/src/orchestrator/client.d.ts.map +1 -1
  134. package/dist/src/orchestrator/client.js +30 -15
  135. package/dist/src/orchestrator/index.d.ts +2 -3
  136. package/dist/src/orchestrator/index.d.ts.map +1 -1
  137. package/dist/src/orchestrator/index.js +1 -3
  138. package/dist/src/orchestrator/registry.d.ts +1 -23
  139. package/dist/src/orchestrator/registry.d.ts.map +1 -1
  140. package/dist/src/orchestrator/registry.js +37 -33
  141. package/dist/src/orchestrator/registry.test.js +7 -7
  142. package/dist/src/orchestrator/types.d.ts +97 -29
  143. package/dist/src/orchestrator/types.d.ts.map +1 -1
  144. package/dist/src/orchestrator/utils.d.ts +1 -3
  145. package/dist/src/orchestrator/utils.d.ts.map +1 -1
  146. package/dist/src/orchestrator/utils.js +0 -102
  147. package/dist/src/types.d.ts +74 -10
  148. package/dist/src/types.d.ts.map +1 -1
  149. package/package.json +72 -1
  150. package/dist/src/actions/index.test.d.ts.map +0 -1
  151. package/dist/src/actions/index.test.js +0 -302
  152. package/dist/src/orchestrator/registry.json +0 -365
  153. /package/dist/src/{actions → accounts/json-rpc}/index.test.d.ts +0 -0
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SessionChainRequiredError = exports.OrderPathRequiredForIntentsError = exports.UserOperationRequiredForSmartSessionsError = exports.SourceChainsNotAvailableForUserOpFlowError = exports.ExecutionError = exports.IntentFailedError = exports.isExecutionError = void 0;
3
+ exports.SignerNotSupportedError = exports.SessionChainRequiredError = exports.OrderPathRequiredForIntentsError = exports.IntentFailedError = exports.ExecutionError = exports.isExecutionError = void 0;
4
4
  exports.sendTransaction = sendTransaction;
5
+ exports.sendTransactionInternal = sendTransactionInternal;
6
+ exports.sendUserOperation = sendUserOperation;
7
+ exports.sendUserOperationInternal = sendUserOperationInternal;
5
8
  exports.waitForExecution = waitForExecution;
6
9
  exports.getMaxSpendableAmount = getMaxSpendableAmount;
7
10
  exports.getPortfolio = getPortfolio;
@@ -17,47 +20,54 @@ Object.defineProperty(exports, "IntentFailedError", { enumerable: true, get: fun
17
20
  Object.defineProperty(exports, "isExecutionError", { enumerable: true, get: function () { return error_1.isExecutionError; } });
18
21
  Object.defineProperty(exports, "OrderPathRequiredForIntentsError", { enumerable: true, get: function () { return error_1.OrderPathRequiredForIntentsError; } });
19
22
  Object.defineProperty(exports, "SessionChainRequiredError", { enumerable: true, get: function () { return error_1.SessionChainRequiredError; } });
20
- Object.defineProperty(exports, "SourceChainsNotAvailableForUserOpFlowError", { enumerable: true, get: function () { return error_1.SourceChainsNotAvailableForUserOpFlowError; } });
21
- Object.defineProperty(exports, "UserOperationRequiredForSmartSessionsError", { enumerable: true, get: function () { return error_1.UserOperationRequiredForSmartSessionsError; } });
23
+ Object.defineProperty(exports, "SignerNotSupportedError", { enumerable: true, get: function () { return error_1.SignerNotSupportedError; } });
22
24
  const smart_session_1 = require("./smart-session");
23
25
  const utils_2 = require("./utils");
24
26
  const POLLING_INTERVAL = 500;
25
27
  async function sendTransaction(config, transaction) {
26
- if ('chain' in transaction) {
27
- // Same-chain transaction
28
- return await sendTransactionInternal(config, [transaction.chain], transaction.chain, transaction.calls, transaction.gasLimit, transaction.tokenRequests, transaction.signers);
28
+ const sourceChains = 'chain' in transaction
29
+ ? [transaction.chain]
30
+ : transaction.sourceChains || [];
31
+ const targetChain = 'chain' in transaction ? transaction.chain : transaction.targetChain;
32
+ const { calls, gasLimit, tokenRequests, signers, sponsored, settlementLayers, sourceAssets, feeAsset, dryRun, } = transaction;
33
+ const isUserOpSigner = signers?.type === 'guardians' || signers?.type === 'session';
34
+ if (isUserOpSigner) {
35
+ throw new error_1.SignerNotSupportedError();
29
36
  }
30
- else {
31
- // Cross-chain transaction
32
- return await sendTransactionInternal(config, transaction.sourceChains || [], transaction.targetChain, transaction.calls, transaction.gasLimit, transaction.tokenRequests, transaction.signers);
37
+ return await sendTransactionInternal(config, sourceChains, targetChain, calls, {
38
+ gasLimit,
39
+ initialTokenRequests: tokenRequests,
40
+ signers,
41
+ sponsored,
42
+ settlementLayers,
43
+ sourceAssets,
44
+ feeAsset,
45
+ dryRun,
46
+ });
47
+ }
48
+ async function sendUserOperation(config, transaction) {
49
+ const accountAddress = (0, accounts_1.getAddress)(config);
50
+ const resolvedCalls = await (0, utils_2.resolveCallInputs)(transaction.calls, config, transaction.chain, accountAddress);
51
+ const userOpSigner = transaction.signers?.type === 'session' ? transaction.signers.session : null;
52
+ if (userOpSigner) {
53
+ await (0, smart_session_1.enableSmartSession)(transaction.chain, config, userOpSigner);
33
54
  }
55
+ // Smart sessions require a UserOp flow
56
+ return await sendUserOperationInternal(config, transaction.chain, resolvedCalls, transaction.signers);
34
57
  }
35
- async function sendTransactionInternal(config, sourceChains, targetChain, callInputs, gasLimit, initialTokenRequests, signers) {
58
+ async function sendTransactionInternal(config, sourceChains, targetChain, callInputs, options) {
36
59
  const accountAddress = (0, accounts_1.getAddress)(config);
37
- // Across requires passing some value to repay the solvers
38
- const tokenRequests = !initialTokenRequests || initialTokenRequests.length === 0
39
- ? [
40
- {
41
- address: viem_1.zeroAddress,
42
- amount: 1n,
43
- },
44
- ]
45
- : initialTokenRequests;
46
- const asUserOp = signers?.type === 'guardians' || signers?.type === 'session';
47
- // const asUserOp = true
48
- if (asUserOp) {
49
- const withSession = signers?.type === 'session' ? signers.session : null;
50
- if (withSession) {
51
- await (0, smart_session_1.enableSmartSession)(targetChain, config, withSession);
52
- }
53
- // Smart sessions require a UserOp flow
54
- return await sendTransactionAsUserOp(config, targetChain, callInputs, signers);
60
+ const resolvedCalls = await (0, utils_2.resolveCallInputs)(callInputs, config, targetChain, accountAddress);
61
+ const tokenRequests = (0, utils_2.getTokenRequests)(sourceChains, targetChain, options.initialTokenRequests, options.settlementLayers);
62
+ const sendAsUserOp = options.signers?.type === 'guardians' || options.signers?.type === 'session';
63
+ if (sendAsUserOp) {
64
+ throw new error_1.SignerNotSupportedError();
55
65
  }
56
66
  else {
57
- return await sendTransactionAsIntent(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress, signers);
67
+ return await sendTransactionAsIntent(config, sourceChains, targetChain, resolvedCalls, options.gasLimit, tokenRequests, accountAddress, options.dryRun, options.signers, options.sponsored, options.settlementLayers, options.sourceAssets, options.feeAsset, options.lockFunds);
58
68
  }
59
69
  }
60
- async function sendTransactionAsUserOp(config, chain, callInputs, signers) {
70
+ async function sendUserOperationInternal(config, chain, callInputs, signers) {
61
71
  // Make sure the account is deployed
62
72
  await (0, accounts_1.deploy)(config, chain);
63
73
  const withSession = signers?.type === 'session' ? signers.session : null;
@@ -84,13 +94,16 @@ async function sendTransactionAsUserOp(config, chain, callInputs, signers) {
84
94
  chain: chain.id,
85
95
  };
86
96
  }
87
- async function sendTransactionAsIntent(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress, signers) {
88
- const { intentRoute, hash: intentHash } = await (0, utils_2.prepareTransactionAsIntent)(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress);
97
+ async function sendTransactionAsIntent(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress, dryRun = false, signers, sponsored, settlementLayers, sourceAssets, feeAsset, lockFunds) {
98
+ const intentRoute = await (0, utils_2.prepareTransactionAsIntent)(config, sourceChains, targetChain, callInputs, gasLimit, tokenRequests, accountAddress, sponsored ?? false, undefined, settlementLayers, sourceAssets, feeAsset, lockFunds);
89
99
  if (!intentRoute) {
90
100
  throw new error_1.OrderPathRequiredForIntentsError();
91
101
  }
92
- const signature = await (0, utils_2.signIntent)(config, targetChain, intentHash, signers);
93
- return await (0, utils_2.submitIntentInternal)(config, sourceChains, targetChain, intentRoute.intentOp, signature);
102
+ const signature = await (0, utils_2.signIntent)(config, targetChain, intentRoute.intentOp, signers);
103
+ const authorizations = config.eoa
104
+ ? await (0, utils_2.signAuthorizationsInternal)(config, intentRoute)
105
+ : [];
106
+ return await (0, utils_2.submitIntentInternal)(config, sourceChains, targetChain, intentRoute.intentOp, signature, authorizations, dryRun);
94
107
  }
95
108
  async function waitForExecution(config, result, acceptsPreconfirmations) {
96
109
  const validStatuses = new Set([
@@ -105,20 +118,26 @@ async function waitForExecution(config, result, acceptsPreconfirmations) {
105
118
  case 'intent': {
106
119
  let intentStatus = null;
107
120
  while (intentStatus === null || !validStatuses.has(intentStatus.status)) {
108
- const orchestrator = (0, utils_2.getOrchestratorByChain)(result.targetChain, config.rhinestoneApiKey);
121
+ const orchestrator = (0, utils_2.getOrchestratorByChain)(result.targetChain, config.apiKey, config.endpointUrl);
109
122
  intentStatus = await orchestrator.getIntentOpStatus(result.id);
110
123
  await new Promise((resolve) => setTimeout(resolve, POLLING_INTERVAL));
111
124
  }
112
125
  if (intentStatus.status === orchestrator_1.INTENT_STATUS_FAILED) {
113
126
  throw new error_1.IntentFailedError();
114
127
  }
115
- return intentStatus;
128
+ return {
129
+ fill: {
130
+ hash: intentStatus.fillTransactionHash,
131
+ chainId: result.targetChain,
132
+ },
133
+ claims: intentStatus.claims.map((claim) => ({
134
+ hash: claim.claimTransactionHash,
135
+ chainId: claim.chainId,
136
+ })),
137
+ };
116
138
  }
117
139
  case 'userop': {
118
140
  const targetChain = (0, registry_1.getChainById)(result.chain);
119
- if (!targetChain) {
120
- throw new Error(`Unsupported chain ID: ${result.chain}`);
121
- }
122
141
  const publicClient = (0, viem_1.createPublicClient)({
123
142
  chain: targetChain,
124
143
  transport: (0, utils_1.createTransport)(targetChain, config.provider),
@@ -131,14 +150,14 @@ async function waitForExecution(config, result, acceptsPreconfirmations) {
131
150
  }
132
151
  }
133
152
  }
134
- async function getMaxSpendableAmount(config, chain, tokenAddress, gasUnits) {
153
+ async function getMaxSpendableAmount(config, chain, tokenAddress, gasUnits, sponsored = false) {
135
154
  const address = (0, accounts_1.getAddress)(config);
136
- const orchestrator = (0, utils_2.getOrchestratorByChain)(chain.id, config.rhinestoneApiKey);
137
- return orchestrator.getMaxTokenAmount(address, chain.id, tokenAddress, gasUnits);
155
+ const orchestrator = (0, utils_2.getOrchestratorByChain)(chain.id, config.apiKey, config.endpointUrl);
156
+ return orchestrator.getMaxTokenAmount(address, chain.id, tokenAddress, gasUnits, sponsored);
138
157
  }
139
158
  async function getPortfolio(config, onTestnets) {
140
159
  const address = (0, accounts_1.getAddress)(config);
141
160
  const chainId = onTestnets ? chains_1.sepolia.id : chains_1.mainnet.id;
142
- const orchestrator = (0, utils_2.getOrchestratorByChain)(chainId, config.rhinestoneApiKey);
161
+ const orchestrator = (0, utils_2.getOrchestratorByChain)(chainId, config.apiKey, config.endpointUrl);
143
162
  return orchestrator.getPortfolio(address);
144
163
  }
@@ -0,0 +1,148 @@
1
+ import { type Address, type Chain } from 'viem';
2
+ import type { IntentOp } from '../orchestrator/types';
3
+ import type { RhinestoneConfig } from '../types';
4
+ import type { BatchPermit2Result, MultiChainPermit2Config, MultiChainPermit2Result, TokenPermissions } from './types';
5
+ declare function getTypedData(intentOp: IntentOp): {
6
+ readonly domain: {
7
+ readonly name: "Permit2";
8
+ readonly chainId: number;
9
+ readonly verifyingContract: "0x000000000022D473030F116dDEE9F6B43aC78BA3";
10
+ };
11
+ readonly types: {
12
+ readonly TokenPermissions: readonly [{
13
+ readonly name: "token";
14
+ readonly type: "address";
15
+ }, {
16
+ readonly name: "amount";
17
+ readonly type: "uint256";
18
+ }];
19
+ readonly Token: readonly [{
20
+ readonly name: "token";
21
+ readonly type: "address";
22
+ }, {
23
+ readonly name: "amount";
24
+ readonly type: "uint256";
25
+ }];
26
+ readonly Target: readonly [{
27
+ readonly name: "recipient";
28
+ readonly type: "address";
29
+ }, {
30
+ readonly name: "tokenOut";
31
+ readonly type: "Token[]";
32
+ }, {
33
+ readonly name: "targetChain";
34
+ readonly type: "uint256";
35
+ }, {
36
+ readonly name: "fillExpiry";
37
+ readonly type: "uint256";
38
+ }];
39
+ readonly Op: readonly [{
40
+ readonly name: "to";
41
+ readonly type: "address";
42
+ }, {
43
+ readonly name: "value";
44
+ readonly type: "uint256";
45
+ }, {
46
+ readonly name: "data";
47
+ readonly type: "bytes";
48
+ }];
49
+ readonly Mandate: readonly [{
50
+ readonly name: "target";
51
+ readonly type: "Target";
52
+ }, {
53
+ readonly name: "v";
54
+ readonly type: "uint8";
55
+ }, {
56
+ readonly name: "minGas";
57
+ readonly type: "uint128";
58
+ }, {
59
+ readonly name: "originOps";
60
+ readonly type: "Op[]";
61
+ }, {
62
+ readonly name: "destOps";
63
+ readonly type: "Op[]";
64
+ }, {
65
+ readonly name: "q";
66
+ readonly type: "bytes32";
67
+ }];
68
+ readonly PermitBatchWitnessTransferFrom: readonly [{
69
+ readonly name: "permitted";
70
+ readonly type: "TokenPermissions[]";
71
+ }, {
72
+ readonly name: "spender";
73
+ readonly type: "address";
74
+ }, {
75
+ readonly name: "nonce";
76
+ readonly type: "uint256";
77
+ }, {
78
+ readonly name: "deadline";
79
+ readonly type: "uint256";
80
+ }, {
81
+ readonly name: "mandate";
82
+ readonly type: "Mandate";
83
+ }];
84
+ };
85
+ readonly primaryType: "PermitBatchWitnessTransferFrom";
86
+ readonly message: {
87
+ readonly permitted: TokenPermissions[];
88
+ readonly spender: `0x${string}`;
89
+ readonly nonce: bigint;
90
+ readonly deadline: bigint;
91
+ readonly mandate: {
92
+ readonly target: {
93
+ readonly recipient: `0x${string}`;
94
+ readonly tokenOut: {
95
+ token: `0x${string}`;
96
+ amount: bigint;
97
+ }[];
98
+ readonly targetChain: bigint;
99
+ readonly fillExpiry: bigint;
100
+ };
101
+ readonly v: number;
102
+ readonly minGas: bigint;
103
+ readonly originOps: {
104
+ to: `0x${string}`;
105
+ value: bigint;
106
+ data: `0x${string}`;
107
+ }[];
108
+ readonly destOps: {
109
+ to: `0x${string}`;
110
+ value: bigint;
111
+ data: `0x${string}`;
112
+ }[];
113
+ readonly q: `0x${string}`;
114
+ };
115
+ };
116
+ };
117
+ declare function checkERC20AllowanceDirect(owner: Address, spender: Address, tokenAddress: Address, publicClient: any): Promise<bigint>;
118
+ declare function checkERC20Allowance(tokenAddress: Address, chain: Chain, config: RhinestoneConfig): Promise<bigint>;
119
+ /**
120
+ * Get the Permit2 contract address
121
+ * @returns The Permit2 contract address
122
+ */
123
+ declare function getPermit2Address(): Address;
124
+ /**
125
+ * Signs permit2 calls across multiple chains using batch approach.
126
+ * Collects all signatures first, then returns them all at once.
127
+ *
128
+ * This approach is efficient for backend signers but may be memory-intensive
129
+ * for frontend applications with many chains.
130
+ *
131
+ * @param configs - Array of permit2 signing configurations for different chains
132
+ * @returns Promise<BatchPermit2Result> - All signatures collected
133
+ */
134
+ declare function signPermit2Batch(configs: MultiChainPermit2Config[]): Promise<BatchPermit2Result>;
135
+ /**
136
+ * Signs permit2 calls across multiple chains sequentially.
137
+ * Signs one by one, useful for frontend applications to avoid memory issues.
138
+ *
139
+ * This approach is more memory-efficient for frontend applications but slower
140
+ * due to sequential processing.
141
+ *
142
+ * @param configs - Array of permit2 signing configurations for different chains
143
+ * @param onProgress - Optional callback for progress updates
144
+ * @returns Promise<BatchPermit2Result> - All signatures collected
145
+ */
146
+ declare function signPermit2Sequential(configs: MultiChainPermit2Config[], onProgress?: (completed: number, total: number, current: MultiChainPermit2Result) => void): Promise<BatchPermit2Result>;
147
+ export { getTypedData, checkERC20Allowance, checkERC20AllowanceDirect, getPermit2Address, signPermit2Batch, signPermit2Sequential, type MultiChainPermit2Config, type MultiChainPermit2Result, type BatchPermit2Result, };
148
+ //# sourceMappingURL=permit2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permit2.d.ts","sourceRoot":"","sources":["../../../execution/permit2.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,KAAK,EAIX,MAAM,MAAM,CAAA;AAEb,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AACrD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAChD,OAAO,KAAK,EACV,kBAAkB,EAClB,uBAAuB,EACvB,uBAAuB,EACvB,gBAAgB,EACjB,MAAM,SAAS,CAAA;AAQhB,iBAAS,YAAY,CAAC,QAAQ,EAAE,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8FvC;AAED,iBAAe,yBAAyB,CACtC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,OAAO,EACrB,YAAY,EAAE,GAAG,GAChB,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED,iBAAe,mBAAmB,CAChC,YAAY,EAAE,OAAO,EACrB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;GAGG;AACH,iBAAS,iBAAiB,IAAI,OAAO,CAEpC;AAED;;;;;;;;;GASG;AACH,iBAAe,gBAAgB,CAC7B,OAAO,EAAE,uBAAuB,EAAE,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAiE7B;AAED;;;;;;;;;;GAUG;AACH,iBAAe,qBAAqB,CAClC,OAAO,EAAE,uBAAuB,EAAE,EAClC,UAAU,CAAC,EAAE,CACX,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,uBAAuB,KAC7B,IAAI,GACR,OAAO,CAAC,kBAAkB,CAAC,CAsD7B;AAED,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,yBAAyB,EACzB,iBAAiB,EAEjB,gBAAgB,EAChB,qBAAqB,EAErB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,EAC5B,KAAK,kBAAkB,GACxB,CAAA"}
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getTypedData = getTypedData;
4
+ exports.checkERC20Allowance = checkERC20Allowance;
5
+ exports.checkERC20AllowanceDirect = checkERC20AllowanceDirect;
6
+ exports.getPermit2Address = getPermit2Address;
7
+ exports.signPermit2Batch = signPermit2Batch;
8
+ exports.signPermit2Sequential = signPermit2Sequential;
9
+ const viem_1 = require("viem");
10
+ const utils_1 = require("../accounts/utils");
11
+ const PERMIT2_ADDRESS = '0x000000000022D473030F116dDEE9F6B43aC78BA3';
12
+ function toToken(id) {
13
+ return `0x${(id & ((1n << 160n) - 1n)).toString(16).padStart(40, '0')}`;
14
+ }
15
+ function getTypedData(intentOp) {
16
+ const element = intentOp.elements[0];
17
+ const tokens = element.idsAndAmounts.map(([id, amount]) => [
18
+ BigInt(id),
19
+ BigInt(amount),
20
+ ]);
21
+ const tokenPermissions = tokens.reduce((permissions, [id, amountIn]) => {
22
+ const token = toToken(BigInt(id));
23
+ const amount = BigInt(amountIn);
24
+ const permission = { token, amount };
25
+ permissions.push(permission);
26
+ return permissions;
27
+ }, []);
28
+ const spender = element.arbiter;
29
+ const mandate = element.mandate;
30
+ const typedData = {
31
+ domain: {
32
+ name: 'Permit2',
33
+ chainId: Number(intentOp.elements[0].chainId),
34
+ verifyingContract: PERMIT2_ADDRESS,
35
+ },
36
+ types: {
37
+ TokenPermissions: [
38
+ { name: 'token', type: 'address' },
39
+ { name: 'amount', type: 'uint256' },
40
+ ],
41
+ Token: [
42
+ { name: 'token', type: 'address' },
43
+ { name: 'amount', type: 'uint256' },
44
+ ],
45
+ Target: [
46
+ { name: 'recipient', type: 'address' },
47
+ { name: 'tokenOut', type: 'Token[]' },
48
+ { name: 'targetChain', type: 'uint256' },
49
+ { name: 'fillExpiry', type: 'uint256' },
50
+ ],
51
+ Op: [
52
+ { name: 'to', type: 'address' },
53
+ { name: 'value', type: 'uint256' },
54
+ { name: 'data', type: 'bytes' },
55
+ ],
56
+ Mandate: [
57
+ { name: 'target', type: 'Target' },
58
+ { name: 'v', type: 'uint8' },
59
+ { name: 'minGas', type: 'uint128' },
60
+ { name: 'originOps', type: 'Op[]' },
61
+ { name: 'destOps', type: 'Op[]' },
62
+ { name: 'q', type: 'bytes32' },
63
+ ],
64
+ PermitBatchWitnessTransferFrom: [
65
+ { name: 'permitted', type: 'TokenPermissions[]' },
66
+ { name: 'spender', type: 'address' },
67
+ { name: 'nonce', type: 'uint256' },
68
+ { name: 'deadline', type: 'uint256' },
69
+ { name: 'mandate', type: 'Mandate' },
70
+ ],
71
+ },
72
+ primaryType: 'PermitBatchWitnessTransferFrom',
73
+ message: {
74
+ permitted: tokenPermissions,
75
+ spender: spender,
76
+ nonce: BigInt(intentOp.nonce),
77
+ deadline: BigInt(intentOp.expires),
78
+ mandate: {
79
+ target: {
80
+ recipient: mandate.recipient,
81
+ tokenOut: mandate.tokenOut.map((token) => ({
82
+ token: toToken(BigInt(token[0])),
83
+ amount: BigInt(token[1]),
84
+ })),
85
+ targetChain: BigInt(mandate.destinationChainId),
86
+ fillExpiry: BigInt(mandate.fillDeadline),
87
+ },
88
+ v: mandate.v || 0,
89
+ minGas: BigInt(mandate.minGas || '0'),
90
+ originOps: mandate.preClaimOps.map((op) => ({
91
+ to: op.to,
92
+ value: BigInt(op.value),
93
+ data: op.data,
94
+ })),
95
+ destOps: mandate.destinationOps.map((op) => ({
96
+ to: op.to,
97
+ value: BigInt(op.value),
98
+ data: op.data,
99
+ })),
100
+ q: (0, viem_1.keccak256)(mandate.qualifier.encodedVal),
101
+ },
102
+ },
103
+ };
104
+ return typedData;
105
+ }
106
+ async function checkERC20AllowanceDirect(owner, spender, tokenAddress, publicClient) {
107
+ try {
108
+ const allowance = await publicClient.readContract({
109
+ address: tokenAddress,
110
+ abi: [
111
+ {
112
+ name: 'allowance',
113
+ type: 'function',
114
+ stateMutability: 'view',
115
+ inputs: [
116
+ { name: 'owner', type: 'address' },
117
+ { name: 'spender', type: 'address' },
118
+ ],
119
+ outputs: [{ name: '', type: 'uint256' }],
120
+ },
121
+ ],
122
+ functionName: 'allowance',
123
+ args: [owner, spender],
124
+ });
125
+ return BigInt(allowance.toString());
126
+ }
127
+ catch (error) {
128
+ console.error('Error checking ERC20 allowance:', error);
129
+ throw new Error('Failed to check ERC20 allowance');
130
+ }
131
+ }
132
+ async function checkERC20Allowance(tokenAddress, chain, config) {
133
+ try {
134
+ const publicClient = (0, viem_1.createPublicClient)({
135
+ chain,
136
+ transport: (0, utils_1.createTransport)(chain, config.provider),
137
+ });
138
+ // Get the account owner from the config
139
+ const owner = config.eoa?.address;
140
+ if (!owner) {
141
+ throw new Error('No EOA address found in account config');
142
+ }
143
+ return await checkERC20AllowanceDirect(owner, PERMIT2_ADDRESS, tokenAddress, publicClient);
144
+ }
145
+ catch (error) {
146
+ console.error('Error checking ERC20 allowance:', error);
147
+ throw new Error('Failed to check ERC20 allowance');
148
+ }
149
+ }
150
+ /**
151
+ * Get the Permit2 contract address
152
+ * @returns The Permit2 contract address
153
+ */
154
+ function getPermit2Address() {
155
+ return PERMIT2_ADDRESS;
156
+ }
157
+ /**
158
+ * Signs permit2 calls across multiple chains using batch approach.
159
+ * Collects all signatures first, then returns them all at once.
160
+ *
161
+ * This approach is efficient for backend signers but may be memory-intensive
162
+ * for frontend applications with many chains.
163
+ *
164
+ * @param configs - Array of permit2 signing configurations for different chains
165
+ * @returns Promise<BatchPermit2Result> - All signatures collected
166
+ */
167
+ async function signPermit2Batch(configs) {
168
+ const results = [];
169
+ let successfulSignatures = 0;
170
+ let failedSignatures = 0;
171
+ // Process all signing operations in parallel
172
+ const signingPromises = configs.map(async (config) => {
173
+ try {
174
+ // Get typed data for this chain
175
+ const typedData = getTypedData(config.intentOp);
176
+ // Sign with EOA account
177
+ if (!config.eoaAccount.signTypedData) {
178
+ throw new Error('EOA account does not support typed data signing');
179
+ }
180
+ const signature = await config.eoaAccount.signTypedData(typedData);
181
+ const result = {
182
+ chainId: config.chain.id,
183
+ signature,
184
+ success: true,
185
+ };
186
+ successfulSignatures++;
187
+ return result;
188
+ }
189
+ catch (error) {
190
+ const result = {
191
+ chainId: config.chain.id,
192
+ signature: '0x',
193
+ success: false,
194
+ error: error instanceof Error ? error : new Error(String(error)),
195
+ };
196
+ failedSignatures++;
197
+ return result;
198
+ }
199
+ });
200
+ // Wait for all signing operations to complete
201
+ const signingResults = await Promise.allSettled(signingPromises);
202
+ // Process results
203
+ for (const result of signingResults) {
204
+ if (result.status === 'fulfilled') {
205
+ results.push(result.value);
206
+ }
207
+ else {
208
+ // This shouldn't happen since we catch errors in the promise
209
+ failedSignatures++;
210
+ results.push({
211
+ chainId: 0,
212
+ signature: '0x',
213
+ success: false,
214
+ error: result.reason,
215
+ });
216
+ }
217
+ }
218
+ return {
219
+ results,
220
+ totalChains: configs.length,
221
+ successfulSignatures,
222
+ failedSignatures,
223
+ allSuccessful: failedSignatures === 0,
224
+ };
225
+ }
226
+ /**
227
+ * Signs permit2 calls across multiple chains sequentially.
228
+ * Signs one by one, useful for frontend applications to avoid memory issues.
229
+ *
230
+ * This approach is more memory-efficient for frontend applications but slower
231
+ * due to sequential processing.
232
+ *
233
+ * @param configs - Array of permit2 signing configurations for different chains
234
+ * @param onProgress - Optional callback for progress updates
235
+ * @returns Promise<BatchPermit2Result> - All signatures collected
236
+ */
237
+ async function signPermit2Sequential(configs, onProgress) {
238
+ const results = [];
239
+ let successfulSignatures = 0;
240
+ let failedSignatures = 0;
241
+ // Process signing operations sequentially
242
+ for (let i = 0; i < configs.length; i++) {
243
+ const config = configs[i];
244
+ try {
245
+ // Get typed data for this chain
246
+ const typedData = getTypedData(config.intentOp);
247
+ // Sign with EOA account
248
+ if (!config.eoaAccount.signTypedData) {
249
+ throw new Error('EOA account does not support typed data signing');
250
+ }
251
+ const signature = await config.eoaAccount.signTypedData(typedData);
252
+ const result = {
253
+ chainId: config.chain.id,
254
+ signature,
255
+ success: true,
256
+ };
257
+ results.push(result);
258
+ successfulSignatures++;
259
+ // Call progress callback if provided
260
+ onProgress?.(i + 1, configs.length, result);
261
+ }
262
+ catch (error) {
263
+ const result = {
264
+ chainId: config.chain.id,
265
+ signature: '0x',
266
+ success: false,
267
+ error: error instanceof Error ? error : new Error(String(error)),
268
+ };
269
+ results.push(result);
270
+ failedSignatures++;
271
+ // Call progress callback if provided
272
+ onProgress?.(i + 1, configs.length, result);
273
+ }
274
+ }
275
+ return {
276
+ results,
277
+ totalChains: configs.length,
278
+ successfulSignatures,
279
+ failedSignatures,
280
+ allSuccessful: failedSignatures === 0,
281
+ };
282
+ }
@@ -1,15 +1,15 @@
1
1
  import { type Chain, type Hex } from 'viem';
2
2
  import { type ChainDigest, type EnableSessionData, type SmartSessionModeType } from '../modules/validators/smart-sessions';
3
- import type { RhinestoneAccountConfig, Session } from '../types';
3
+ import type { RhinestoneConfig, Session } from '../types';
4
4
  interface SessionDetails {
5
5
  permissionEnableHash: Hex;
6
6
  mode: SmartSessionModeType;
7
7
  hashesAndChainIds: ChainDigest[];
8
8
  enableSessionData: EnableSessionData;
9
9
  }
10
- declare function getSessionDetails(config: RhinestoneAccountConfig, sessions: Session[], sessionIndex: number, signature?: Hex): Promise<SessionDetails>;
10
+ declare function getSessionDetails(config: RhinestoneConfig, sessions: Session[], sessionIndex: number, signature?: Hex): Promise<SessionDetails>;
11
11
  declare function getMultichainDigest(chainDigests: ChainDigest[]): Hex;
12
- declare function enableSmartSession(chain: Chain, config: RhinestoneAccountConfig, session: Session): Promise<void>;
12
+ declare function enableSmartSession(chain: Chain, config: RhinestoneConfig, session: Session): Promise<void>;
13
13
  export { enableSmartSession, getSessionDetails, getMultichainDigest };
14
14
  export type { SessionDetails };
15
15
  //# sourceMappingURL=smart-session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"smart-session.d.ts","sourceRoot":"","sources":["../../../execution/smart-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAIV,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AAmBb,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EAGtB,KAAK,oBAAoB,EAC1B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAGV,uBAAuB,EACvB,OAAO,EACR,MAAM,UAAU,CAAA;AAGjB,UAAU,cAAc;IACtB,oBAAoB,EAAE,GAAG,CAAA;IACzB,IAAI,EAAE,oBAAoB,CAAA;IAC1B,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AAED,iBAAe,iBAAiB,CAC9B,MAAM,EAAE,uBAAuB,EAC/B,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,cAAc,CAAC,CA4BzB;AAgGD,iBAAS,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,CAgC7D;AAiLD,iBAAe,kBAAkB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,uBAAuB,EAC/B,OAAO,EAAE,OAAO,iBA+BjB;AAED,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;AACrE,YAAY,EAAE,cAAc,EAAE,CAAA"}
1
+ {"version":3,"file":"smart-session.d.ts","sourceRoot":"","sources":["../../../execution/smart-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EAIV,KAAK,GAAG,EAGT,MAAM,MAAM,CAAA;AAmBb,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,iBAAiB,EAGtB,KAAK,oBAAoB,EAC1B,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAGV,gBAAgB,EAChB,OAAO,EACR,MAAM,UAAU,CAAA;AAGjB,UAAU,cAAc;IACtB,oBAAoB,EAAE,GAAG,CAAA;IACzB,IAAI,EAAE,oBAAoB,CAAA;IAC1B,iBAAiB,EAAE,WAAW,EAAE,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;CACrC;AAED,iBAAe,iBAAiB,CAC9B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,OAAO,EAAE,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,GAAG,GACd,OAAO,CAAC,cAAc,CAAC,CA4BzB;AAgGD,iBAAS,mBAAmB,CAAC,YAAY,EAAE,WAAW,EAAE,GAAG,GAAG,CAgC7D;AAiLD,iBAAe,kBAAkB,CAC/B,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,OAAO,iBA+BjB;AAED,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,CAAA;AACrE,YAAY,EAAE,cAAc,EAAE,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { Account, Address, Chain, Hex } from 'viem';
2
+ import type { IntentOp } from '../orchestrator/types';
3
+ interface TokenPermissions {
4
+ token: Address;
5
+ amount: bigint;
6
+ }
7
+ /**
8
+ * Multi-chain permit2 signing configuration
9
+ */
10
+ interface MultiChainPermit2Config {
11
+ chain: Chain;
12
+ intentOp: IntentOp;
13
+ eoaAccount: Account;
14
+ }
15
+ /**
16
+ * Result of a multi-chain permit2 signing operation
17
+ */
18
+ interface MultiChainPermit2Result {
19
+ chainId: number;
20
+ signature: Hex;
21
+ success: boolean;
22
+ error?: Error;
23
+ }
24
+ /**
25
+ * Batch permit2 signing result
26
+ */
27
+ interface BatchPermit2Result {
28
+ results: MultiChainPermit2Result[];
29
+ totalChains: number;
30
+ successfulSignatures: number;
31
+ failedSignatures: number;
32
+ allSuccessful: boolean;
33
+ }
34
+ export type { TokenPermissions, MultiChainPermit2Config, MultiChainPermit2Result, BatchPermit2Result, };
35
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../execution/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAA;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,UAAU,gBAAgB;IACxB,KAAK,EAAE,OAAO,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,KAAK,EAAE,KAAK,CAAA;IACZ,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;CACpB;AAED;;GAEG;AACH,UAAU,uBAAuB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,GAAG,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED;;GAEG;AACH,UAAU,kBAAkB;IAC1B,OAAO,EAAE,uBAAuB,EAAE,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;IACnB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,aAAa,EAAE,OAAO,CAAA;CACvB;AAED,YAAY,EACV,gBAAgB,EAChB,uBAAuB,EACvB,uBAAuB,EACvB,kBAAkB,GACnB,CAAA"}