@canton-network/wallet-gateway-remote 1.3.0 → 1.5.0

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 (141) hide show
  1. package/README.md +1 -1
  2. package/dist/auth/jwt-auth-service.d.ts.map +1 -1
  3. package/dist/auth/jwt-auth-service.js +6 -5
  4. package/dist/auth/jwt-auth-service.test.d.ts +2 -0
  5. package/dist/auth/jwt-auth-service.test.d.ts.map +1 -0
  6. package/dist/auth/jwt-auth-service.test.js +259 -0
  7. package/dist/auth/jwt-unsafe-auth-service.test.d.ts +2 -0
  8. package/dist/auth/jwt-unsafe-auth-service.test.d.ts.map +1 -0
  9. package/dist/auth/jwt-unsafe-auth-service.test.js +120 -0
  10. package/dist/config/Config.d.ts +64 -8
  11. package/dist/config/Config.d.ts.map +1 -1
  12. package/dist/config/Config.js +1 -0
  13. package/dist/config/ConfigUtils.d.ts.map +1 -1
  14. package/dist/config/ConfigUtils.js +3 -0
  15. package/dist/dapp-api/controller.d.ts +1 -0
  16. package/dist/dapp-api/controller.d.ts.map +1 -1
  17. package/dist/dapp-api/controller.js +87 -26
  18. package/dist/dapp-api/controller.test.d.ts +2 -0
  19. package/dist/dapp-api/controller.test.d.ts.map +1 -0
  20. package/dist/dapp-api/controller.test.js +516 -0
  21. package/dist/dapp-api/rpc-gen/index.d.ts +3 -0
  22. package/dist/dapp-api/rpc-gen/index.d.ts.map +1 -1
  23. package/dist/dapp-api/rpc-gen/index.js +1 -0
  24. package/dist/dapp-api/rpc-gen/typings.d.ts +99 -14
  25. package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
  26. package/dist/dapp-api/server.d.ts.map +1 -1
  27. package/dist/dapp-api/server.js +5 -0
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +10 -0
  30. package/dist/init.d.ts.map +1 -1
  31. package/dist/init.js +4 -6
  32. package/dist/ledger/transaction-service.d.ts +14 -11
  33. package/dist/ledger/transaction-service.d.ts.map +1 -1
  34. package/dist/ledger/transaction-service.js +95 -8
  35. package/dist/ledger/transaction-service.test.d.ts +2 -0
  36. package/dist/ledger/transaction-service.test.d.ts.map +1 -0
  37. package/dist/ledger/transaction-service.test.js +356 -0
  38. package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.d.ts +5 -2
  39. package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.d.ts.map +1 -1
  40. package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.js +7 -6
  41. package/dist/ledger/wallet-allocation/wallet-allocation-service.d.ts +11 -5
  42. package/dist/ledger/wallet-allocation/wallet-allocation-service.d.ts.map +1 -1
  43. package/dist/ledger/wallet-allocation/wallet-allocation-service.js +28 -14
  44. package/dist/ledger/wallet-allocation/wallet-allocation-service.test.js +550 -19
  45. package/dist/ledger/wallet-sync-service.js +3 -3
  46. package/dist/middleware/apiKeyAuth.d.ts +6 -0
  47. package/dist/middleware/apiKeyAuth.d.ts.map +1 -0
  48. package/dist/middleware/apiKeyAuth.js +88 -0
  49. package/dist/middleware/apiKeyAuth.test.d.ts +2 -0
  50. package/dist/middleware/apiKeyAuth.test.d.ts.map +1 -0
  51. package/dist/middleware/apiKeyAuth.test.js +126 -0
  52. package/dist/middleware/jsonRpcHandler.d.ts +11 -1
  53. package/dist/middleware/jsonRpcHandler.d.ts.map +1 -1
  54. package/dist/middleware/jsonRpcHandler.js +14 -15
  55. package/dist/middleware/jsonRpcHandler.test.d.ts +2 -0
  56. package/dist/middleware/jsonRpcHandler.test.d.ts.map +1 -0
  57. package/dist/middleware/jsonRpcHandler.test.js +254 -0
  58. package/dist/middleware/jwtAuth.d.ts.map +1 -1
  59. package/dist/middleware/jwtAuth.js +4 -0
  60. package/dist/middleware/jwtAuth.test.d.ts +2 -0
  61. package/dist/middleware/jwtAuth.test.d.ts.map +1 -0
  62. package/dist/middleware/jwtAuth.test.js +93 -0
  63. package/dist/middleware/rateLimit.js +2 -2
  64. package/dist/middleware/rateLimit.test.js +26 -0
  65. package/dist/middleware/sessionHandler.js +1 -1
  66. package/dist/middleware/sessionHandler.test.d.ts +2 -0
  67. package/dist/middleware/sessionHandler.test.d.ts.map +1 -0
  68. package/dist/middleware/sessionHandler.test.js +121 -0
  69. package/dist/notification/NotificationService.test.d.ts +2 -0
  70. package/dist/notification/NotificationService.test.d.ts.map +1 -0
  71. package/dist/notification/NotificationService.test.js +110 -0
  72. package/dist/signing/signing-drivers.d.ts +7 -0
  73. package/dist/signing/signing-drivers.d.ts.map +1 -0
  74. package/dist/signing/signing-drivers.js +3 -0
  75. package/dist/user-api/controller.d.ts +12 -4
  76. package/dist/user-api/controller.d.ts.map +1 -1
  77. package/dist/user-api/controller.js +330 -95
  78. package/dist/user-api/controller.test.d.ts +2 -0
  79. package/dist/user-api/controller.test.d.ts.map +1 -0
  80. package/dist/user-api/controller.test.js +862 -0
  81. package/dist/user-api/rpc-gen/index.d.ts +30 -0
  82. package/dist/user-api/rpc-gen/index.d.ts.map +1 -1
  83. package/dist/user-api/rpc-gen/index.js +10 -0
  84. package/dist/user-api/rpc-gen/typings.d.ts +170 -25
  85. package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
  86. package/dist/user-api/server.test.js +53 -0
  87. package/dist/utils.d.ts +19 -5
  88. package/dist/utils.d.ts.map +1 -1
  89. package/dist/utils.js +53 -2
  90. package/dist/utils.test.d.ts +2 -0
  91. package/dist/utils.test.d.ts.map +1 -0
  92. package/dist/utils.test.js +24 -0
  93. package/dist/web/frontend/404/index.html +2 -2
  94. package/dist/web/frontend/activities/index.html +3 -3
  95. package/dist/web/frontend/approve/index.html +4 -5
  96. package/dist/web/frontend/assets/404-MVLWUPwN.js +5 -0
  97. package/dist/web/frontend/assets/activities-DaWkmGqA.js +61 -0
  98. package/dist/web/frontend/assets/addIdentityProvider--rBb0ihb.js +28 -0
  99. package/dist/web/frontend/assets/addNetwork-C6UDsRkU.js +38 -0
  100. package/dist/web/frontend/assets/addParty-B3fFD1eM.js +45 -0
  101. package/dist/web/frontend/assets/approve-WbGL4E82.js +21 -0
  102. package/dist/web/frontend/assets/callback--tihEryB.js +1 -0
  103. package/dist/web/frontend/assets/identityProviders-Dra4qG6t.js +71 -0
  104. package/dist/web/frontend/assets/index-Bm76pXA_.js +91 -0
  105. package/dist/web/frontend/assets/index-D1dC4Cl9.js +4477 -0
  106. package/dist/web/frontend/assets/login-BC8a-kD_.js +10 -0
  107. package/dist/web/frontend/assets/networks-B3ztsogL.js +73 -0
  108. package/dist/web/frontend/assets/reviewIdentityProvider-Co420Dbk.js +43 -0
  109. package/dist/web/frontend/assets/reviewNetwork-B-Sh8pCH.js +43 -0
  110. package/dist/web/frontend/assets/{settings-B1ga2TK0.js → settings-DvyUjqLl.js} +1 -1
  111. package/dist/web/frontend/assets/state-Bq65GwdF.js +1 -0
  112. package/dist/web/frontend/assets/{utils-CT9Hzi7v.js → utils-B2iziW8V.js} +1 -1
  113. package/dist/web/frontend/callback/index.html +2 -2
  114. package/dist/web/frontend/identity-providers/add/index.html +3 -3
  115. package/dist/web/frontend/identity-providers/index.html +3 -3
  116. package/dist/web/frontend/identity-providers/review/index.html +3 -3
  117. package/dist/web/frontend/index.html +1 -1
  118. package/dist/web/frontend/login/index.html +3 -4
  119. package/dist/web/frontend/networks/add/index.html +3 -3
  120. package/dist/web/frontend/networks/index.html +3 -3
  121. package/dist/web/frontend/networks/review/index.html +3 -3
  122. package/dist/web/frontend/parties/add/index.html +5 -5
  123. package/dist/web/frontend/parties/index.html +4 -4
  124. package/dist/web/frontend/settings/index.html +3 -3
  125. package/package.json +40 -33
  126. package/dist/web/frontend/assets/404-B-o9ppJB.js +0 -5
  127. package/dist/web/frontend/assets/activities-CGjCIjUH.js +0 -61
  128. package/dist/web/frontend/assets/addIdentityProvider-CR4Wm9Tl.js +0 -28
  129. package/dist/web/frontend/assets/addNetwork-Dx0-SN4j.js +0 -38
  130. package/dist/web/frontend/assets/addParty-COhk_rFn.js +0 -41
  131. package/dist/web/frontend/assets/approve-B2w66l0J.js +0 -21
  132. package/dist/web/frontend/assets/callback-BTVon_yQ.js +0 -1
  133. package/dist/web/frontend/assets/identityProviders-CK8zSrd3.js +0 -71
  134. package/dist/web/frontend/assets/index-CF4BKzgl.js +0 -91
  135. package/dist/web/frontend/assets/index-DWz_3f3y.js +0 -1
  136. package/dist/web/frontend/assets/index-_pMHlJoE.js +0 -4042
  137. package/dist/web/frontend/assets/login-CVoPNVDw.js +0 -10
  138. package/dist/web/frontend/assets/networks-D1nPvUzM.js +0 -73
  139. package/dist/web/frontend/assets/reviewIdentityProvider-CNSf2qQv.js +0 -43
  140. package/dist/web/frontend/assets/reviewNetwork-DGLK-Ume.js +0 -43
  141. package/dist/web/frontend/assets/state-B2k3ak7d.js +0 -1
@@ -4,7 +4,8 @@ import { assertConnected, AuthTokenProvider, } from '@canton-network/core-wallet
4
4
  import buildController from './rpc-gen/index.js';
5
5
  import { LedgerClient, } from '@canton-network/core-ledger-client';
6
6
  import { v4 } from 'uuid';
7
- import { networkStatus, ledgerPrepareParams } from '../utils.js';
7
+ import { networkStatus, ledgerPrepareParams, logDynamically } from '../utils.js';
8
+ import { rpcErrors } from '@canton-network/core-rpc-errors';
8
9
  export const dappController = (kernelInfo, dappUrl, userUrl, store, notificationService, _logger, origin, context) => {
9
10
  const logger = _logger.child({ component: 'dapp-controller' });
10
11
  return buildController({
@@ -127,6 +128,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
127
128
  },
128
129
  prepareExecute: async (params) => {
129
130
  const wallet = await store.getPrimaryWallet();
131
+ const wallets = await store.getWallets();
130
132
  const network = await store.getCurrentNetwork();
131
133
  if (context === undefined) {
132
134
  throw new Error('Unauthenticated context');
@@ -134,26 +136,54 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
134
136
  if (wallet === undefined) {
135
137
  throw new Error('No primary wallet found');
136
138
  }
139
+ let userId = context.userId;
140
+ const accessTokenProvider = AuthTokenProvider.fromToken(context.accessToken, logger);
141
+ if (context?.isApiKey) {
142
+ logger.info('Authenticated with API Key, fetching m2m token for ledger access');
143
+ userId = context.ledgerUserId;
144
+ }
137
145
  const ledgerClient = new LedgerClient({
138
146
  baseUrl: new URL(network.ledgerApi.baseUrl),
139
147
  logger,
140
- accessTokenProvider: AuthTokenProvider.fromToken(context.accessToken, logger),
148
+ accessTokenProvider,
141
149
  });
142
- const userId = context.userId;
143
150
  const notifier = notificationService.getNotifier(userId);
144
- params.commandId = params.commandId || v4();
145
- const commandId = params.commandId;
151
+ const commandId = params.commandId || v4();
146
152
  const transactionId = v4();
147
153
  notifier.emit('txChanged', { status: 'pending', commandId });
148
154
  const synchronizerId = network.synchronizerId ??
149
155
  (await ledgerClient.getSynchronizerId());
150
- const response = await prepareSubmission(context.userId, wallet.partyId, synchronizerId, params, ledgerClient);
156
+ let actAs = [wallet.partyId];
157
+ if (params.actAs && params.actAs.length > 0) {
158
+ actAs = params.actAs;
159
+ for (const actingParty of actAs) {
160
+ if (wallets.find((w) => w.partyId === actingParty) ===
161
+ undefined) {
162
+ throw rpcErrors.invalidRequest(`Acting party ${actingParty} does not belong to user`);
163
+ }
164
+ }
165
+ }
166
+ logDynamically(logger, 'prepareExecute: Submitting request to ledger', {
167
+ info: { transactionId },
168
+ debug: { commandId, userId, actAs },
169
+ });
170
+ const actAsParty = params.actAs || [wallet.partyId];
171
+ const prepared = await prepareSubmission(context.userId, actAsParty, synchronizerId, params, ledgerClient);
172
+ logDynamically(logger, 'prepareExecute: Received response from ledger', {
173
+ info: { transactionId },
174
+ debug: {
175
+ commandId,
176
+ userId,
177
+ partyId: actAsParty,
178
+ prepared,
179
+ },
180
+ });
151
181
  const transaction = {
152
182
  id: transactionId,
153
183
  commandId,
154
184
  status: 'pending',
155
- preparedTransaction: response.preparedTransaction,
156
- preparedTransactionHash: response.preparedTransactionHash,
185
+ preparedTransaction: prepared.preparedTransaction,
186
+ preparedTransactionHash: prepared.preparedTransactionHash,
157
187
  payload: params,
158
188
  origin: origin || null,
159
189
  createdAt: new Date(),
@@ -161,10 +191,10 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
161
191
  logger.info({
162
192
  actAs: params.actAs || [wallet.partyId],
163
193
  readAs: params.readAs || [],
164
- userId: context.userId,
194
+ userId,
165
195
  commandId,
166
196
  commands: params.commands?.[0],
167
- confirmationRequestTrafficCostEstimation: response.costEstimation
197
+ confirmationRequestTrafficCostEstimation: prepared.costEstimation
168
198
  ?.confirmationRequestTrafficCostEstimation,
169
199
  }, 'prepared transaction traffic estimation');
170
200
  await store.setTransaction(transaction);
@@ -221,21 +251,9 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
221
251
  userUrl: `${userUrl}/login/`,
222
252
  };
223
253
  },
224
- connected: async () => {
225
- throw new Error('Only for events.');
226
- },
227
- onStatusChanged: async () => {
228
- throw new Error('Only for events.');
229
- },
230
- accountsChanged: async () => {
231
- throw new Error('Only for events.');
232
- },
233
254
  listAccounts: async () => {
234
255
  return await store.getWallets();
235
256
  },
236
- txChanged: async () => {
237
- throw new Error('Only for events.');
238
- },
239
257
  getActiveNetwork: async () => {
240
258
  const network = await store.getCurrentNetwork();
241
259
  return {
@@ -246,8 +264,36 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
246
264
  : {}),
247
265
  };
248
266
  },
249
- signMessage: function () {
250
- throw new Error('Function not implemented.');
267
+ signMessage: async (params) => {
268
+ if (!params?.message)
269
+ throw new Error('Message is required');
270
+ const wallet = await store.getPrimaryWallet();
271
+ if (context === undefined) {
272
+ throw new Error('Unauthenticated context');
273
+ }
274
+ if (wallet === undefined) {
275
+ throw new Error('No primary wallet found');
276
+ }
277
+ const notifier = notificationService.getNotifier(context.userId);
278
+ const messageId = v4();
279
+ await store.setMessageRaw({
280
+ id: messageId,
281
+ status: 'pending',
282
+ userId: context.userId,
283
+ partyId: wallet.partyId,
284
+ publicKey: wallet.publicKey,
285
+ message: params.message,
286
+ origin: origin || null,
287
+ createdAt: new Date(),
288
+ });
289
+ notifier.emit('messageSignature', {
290
+ status: 'pending',
291
+ messageId,
292
+ });
293
+ return {
294
+ messageId,
295
+ userUrl: `${userUrl}/sign-message/index.html?messageId=${messageId}&closeafteraction`,
296
+ };
251
297
  },
252
298
  getPrimaryAccount: async function () {
253
299
  const wallet = await store.getPrimaryWallet();
@@ -256,8 +302,23 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
256
302
  }
257
303
  return wallet;
258
304
  },
305
+ connected: async () => {
306
+ throw new Error('Only for events.');
307
+ },
308
+ onStatusChanged: async () => {
309
+ throw new Error('Only for events.');
310
+ },
311
+ accountsChanged: async () => {
312
+ throw new Error('Only for events.');
313
+ },
314
+ txChanged: async () => {
315
+ throw new Error('Only for events.');
316
+ },
317
+ messageSignature: function () {
318
+ throw new Error('Only for events.');
319
+ },
259
320
  });
260
321
  };
261
- async function prepareSubmission(userId, partyId, synchronizerId, params, ledgerClient) {
262
- return await ledgerClient.postWithRetry('/v2/interactive-submission/prepare', ledgerPrepareParams(userId, partyId, synchronizerId, params));
322
+ async function prepareSubmission(userId, partyIds, synchronizerId, params, ledgerClient) {
323
+ return await ledgerClient.postWithRetry('/v2/interactive-submission/prepare', ledgerPrepareParams(userId, partyIds, synchronizerId, params));
263
324
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controller.test.d.ts","sourceRoot":"","sources":["../../src/dapp-api/controller.test.ts"],"names":[],"mappings":""}