@canton-network/wallet-gateway-remote 0.18.0 → 0.20.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 (59) hide show
  1. package/dist/config/Config.d.ts +19 -15
  2. package/dist/config/Config.d.ts.map +1 -1
  3. package/dist/config/Config.js +5 -1
  4. package/dist/config/Config.test.js +8 -8
  5. package/dist/config/ConfigUtils.js +6 -6
  6. package/dist/dapp-api/controller.d.ts.map +1 -1
  7. package/dist/dapp-api/controller.js +80 -33
  8. package/dist/dapp-api/rpc-gen/typings.d.ts +41 -54
  9. package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
  10. package/dist/dapp-api/server.test.js +1 -5
  11. package/dist/example-config.d.ts +3 -0
  12. package/dist/example-config.d.ts.map +1 -1
  13. package/dist/example-config.js +3 -0
  14. package/dist/index.js +2 -2
  15. package/dist/init.d.ts.map +1 -1
  16. package/dist/init.js +12 -7
  17. package/dist/ledger/wallet-sync-service.test.js +3 -0
  18. package/dist/user-api/controller.d.ts +3 -1
  19. package/dist/user-api/controller.d.ts.map +1 -1
  20. package/dist/user-api/controller.js +123 -41
  21. package/dist/user-api/rpc-gen/index.d.ts +6 -0
  22. package/dist/user-api/rpc-gen/index.d.ts.map +1 -1
  23. package/dist/user-api/rpc-gen/index.js +2 -0
  24. package/dist/user-api/rpc-gen/typings.d.ts +37 -25
  25. package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
  26. package/dist/user-api/server.d.ts +1 -1
  27. package/dist/user-api/server.d.ts.map +1 -1
  28. package/dist/user-api/server.js +2 -2
  29. package/dist/user-api/server.test.js +1 -1
  30. package/dist/utils.d.ts +2 -3
  31. package/dist/utils.d.ts.map +1 -1
  32. package/dist/web/frontend/404/index.html +5 -5
  33. package/dist/web/frontend/approve/index.html +6 -6
  34. package/dist/web/frontend/assets/404-CKmKuu6H.js +8 -0
  35. package/dist/web/frontend/assets/approve-MzXNo4XO.js +17 -0
  36. package/dist/web/frontend/assets/callback-CcXLRr7Q.js +1 -0
  37. package/dist/web/frontend/assets/index-BnEARqU4.js +1679 -0
  38. package/dist/web/frontend/assets/{decode-CLJkuAIr.js → index-NP2zGQqX.js} +1 -1
  39. package/dist/web/frontend/assets/login-Btlo0Zla.js +7 -0
  40. package/dist/web/frontend/assets/settings-Br8FgNOa.js +37 -0
  41. package/dist/web/frontend/assets/{state-D-NnR2Q_.js → state-1o1CuDWy.js} +1 -1
  42. package/dist/web/frontend/assets/transactions-Cnu9eUFe.js +28 -0
  43. package/dist/web/frontend/assets/wallets-Dj5yeBJd.js +63 -0
  44. package/dist/web/frontend/callback/index.html +4 -4
  45. package/dist/web/frontend/index.html +3 -4
  46. package/dist/web/frontend/login/index.html +5 -5
  47. package/dist/web/frontend/settings/index.html +5 -5
  48. package/dist/web/frontend/transactions/index.html +6 -6
  49. package/dist/web/frontend/wallets/index.html +5 -5
  50. package/package.json +29 -29
  51. package/dist/web/frontend/assets/404-Cdu0PFS_.js +0 -16
  52. package/dist/web/frontend/assets/approve-B-AjC3qs.js +0 -227
  53. package/dist/web/frontend/assets/callback-CVGmyjFw.js +0 -1
  54. package/dist/web/frontend/assets/index-7OK83THX.css +0 -1
  55. package/dist/web/frontend/assets/index-DUTzHvwi.js +0 -1158
  56. package/dist/web/frontend/assets/login-BpjPKEmn.js +0 -186
  57. package/dist/web/frontend/assets/settings-DFCq6vOq.js +0 -28
  58. package/dist/web/frontend/assets/transactions-Cn8Y2p7-.js +0 -140
  59. package/dist/web/frontend/assets/wallets-B4lynciv.js +0 -267
package/dist/index.js CHANGED
@@ -34,7 +34,7 @@ const program = new Command()
34
34
  // Define project-global logger
35
35
  const logger = pino({
36
36
  name: 'main',
37
- level: 'debug',
37
+ level: 'info',
38
38
  ...(opts.logFormat === 'pretty'
39
39
  ? {
40
40
  transport: {
@@ -59,7 +59,7 @@ let signingDb = new Command('signing-db')
59
59
  const hasDb = process.argv.slice(2).includes('db');
60
60
  if (hasDb) {
61
61
  const config = ConfigUtils.loadConfigFile(options.config);
62
- db = createCLI(config.store);
62
+ db = createCLI(config.store, config.bootstrap);
63
63
  }
64
64
  const hasSigningDb = process.argv.slice(2).includes('signing-db');
65
65
  if (hasSigningDb) {
@@ -1 +1 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAqB7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAyIvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBAoIhE"}
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAqB7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAyIvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBA0IhE"}
package/dist/init.js CHANGED
@@ -62,7 +62,7 @@ async function initializeDatabase(config, logger) {
62
62
  // bootstrap database from config file if it did not exist before
63
63
  if (!exists) {
64
64
  logger.info('Bootstrapping database from config...');
65
- await bootstrap(db, config.store, logger);
65
+ await bootstrap(db, config.bootstrap, logger);
66
66
  }
67
67
  return new StoreSql(db, logger);
68
68
  }
@@ -107,8 +107,8 @@ async function initializeSigningDatabase(config, logger) {
107
107
  }
108
108
  // bootstrap database from config file if it did not exist before
109
109
  if (!exists) {
110
- logger.info('Bootstrapping database from config...');
111
- await signingBootstrap(db, config.store, logger);
110
+ logger.info('Bootstrapping signing database from config...');
111
+ await signingBootstrap(db, config.signingStore, logger);
112
112
  }
113
113
  return new SigningStoreSql(db, logger);
114
114
  }
@@ -140,8 +140,8 @@ export async function initialize(opts, logger) {
140
140
  // Provide apiKey from User API in Fireblocks
141
141
  const apiPath = path.resolve(process.cwd(), 'fireblocks_api.key');
142
142
  const secretPath = path.resolve(process.cwd(), 'fireblocks_secret.key');
143
- let apiKey = '';
144
- let apiSecret = '';
143
+ let apiKey;
144
+ let apiSecret;
145
145
  if (existsSync(apiPath) && existsSync(secretPath)) {
146
146
  apiKey = readFileSync(apiPath, 'utf8');
147
147
  apiSecret = readFileSync(secretPath, 'utf8');
@@ -170,7 +170,12 @@ export async function initialize(opts, logger) {
170
170
  };
171
171
  const allowedPaths = {
172
172
  [config.server.dappPath]: ['*'],
173
- [config.server.userPath]: ['addSession', 'listNetworks', 'listIdps'],
173
+ [config.server.userPath]: [
174
+ 'addSession',
175
+ 'listNetworks',
176
+ 'listIdps',
177
+ 'getUser',
178
+ ],
174
179
  };
175
180
  app.use('/api/*splat', express.json());
176
181
  app.use('/api/*splat', rpcRateLimit);
@@ -180,7 +185,7 @@ export async function initialize(opts, logger) {
180
185
  // register dapp API handlers
181
186
  dapp(config.server.dappPath, app, logger, server, kernelInfo, dappApiUrl, publicUrl, config.server, notificationService, authService, store);
182
187
  // register user API handlers
183
- user(config.server.userPath, app, logger, kernelInfo, publicUrl, notificationService, drivers, store);
188
+ user(config.server.userPath, app, logger, kernelInfo, publicUrl, notificationService, drivers, store, config.server.admin);
184
189
  // register web handler
185
190
  web(app, server, userApiUrl);
186
191
  isReady = true;
@@ -104,6 +104,9 @@ describe('WalletSyncService - resolveSigningProvider', () => {
104
104
  const internalDriver = service['signingDrivers'][SigningProvider.WALLET_KERNEL];
105
105
  const controller = internalDriver.controller(authContext.userId);
106
106
  const key = await controller.createKey({ name: 'test-key' });
107
+ if ('error' in key) {
108
+ throw new Error(`Failed to create key in test: ${key.error_description}`);
109
+ }
107
110
  const namespace = partyAllocator.createFingerprintFromKey(key.publicKey);
108
111
  mockLedgerGet.mockResolvedValueOnce({
109
112
  participantId: 'participant1::different-participant-namespace',
@@ -5,7 +5,7 @@ import { AuthContext } from '@canton-network/core-wallet-auth';
5
5
  import { KernelInfo } from '../config/Config.js';
6
6
  import { SigningDriverInterface, SigningProvider } from '@canton-network/core-signing-lib';
7
7
  type AvailableSigningDrivers = Partial<Record<SigningProvider, SigningDriverInterface>>;
8
- export declare const userController: (kernelInfo: KernelInfo, userUrl: string, store: Store, notificationService: NotificationService, authContext: AuthContext | undefined, drivers: AvailableSigningDrivers, _logger: Logger) => {
8
+ export declare const userController: (kernelInfo: KernelInfo, userUrl: string, store: Store, notificationService: NotificationService, authContext: AuthContext | undefined, drivers: AvailableSigningDrivers, _logger: Logger, adminUserId?: string) => {
9
9
  addNetwork: import("./rpc-gen/typings.js").AddNetwork;
10
10
  removeNetwork: import("./rpc-gen/typings.js").RemoveNetwork;
11
11
  listNetworks: import("./rpc-gen/typings.js").ListNetworks;
@@ -25,6 +25,8 @@ export declare const userController: (kernelInfo: KernelInfo, userUrl: string, s
25
25
  listSessions: import("./rpc-gen/typings.js").ListSessions;
26
26
  getTransaction: import("./rpc-gen/typings.js").GetTransaction;
27
27
  listTransactions: import("./rpc-gen/typings.js").ListTransactions;
28
+ deleteTransaction: import("./rpc-gen/typings.js").DeleteTransaction;
29
+ getUser: import("./rpc-gen/typings.js").GetUser;
28
30
  };
29
31
  export {};
30
32
  //# sourceMappingURL=controller.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AA0BA,OAAO,EACH,KAAK,EAIR,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAGH,WAAW,EAId,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACH,sBAAsB,EACtB,eAAe,EAClB,MAAM,kCAAkC,CAAA;AAczC,KAAK,uBAAuB,GAAG,OAAO,CAClC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,cAAc,GACvB,YAAY,UAAU,EACtB,SAAS,MAAM,EACf,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,GAAG,SAAS,EACpC,SAAS,uBAAuB,EAChC,SAAS,MAAM;;;;;;;;;;;;;;;;;;;;CAw8BlB,CAAA"}
1
+ {"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AA4BA,OAAO,EACH,KAAK,EAIR,MAAM,mCAAmC,CAAA;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAGH,WAAW,EAId,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACH,sBAAsB,EACtB,eAAe,EAElB,MAAM,kCAAkC,CAAA;AAazC,KAAK,uBAAuB,GAAG,OAAO,CAClC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,cAAc,GACvB,YAAY,UAAU,EACtB,SAAS,MAAM,EACf,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,GAAG,SAAS,EACpC,SAAS,uBAAuB,EAChC,SAAS,MAAM,EACf,cAAc,MAAM;;;;;;;;;;;;;;;;;;;;;;CA8iCvB,CAAA"}
@@ -10,10 +10,36 @@ import { PartyAllocationService, } from '../ledger/party-allocation-service.js';
10
10
  import { WalletSyncService } from '../ledger/wallet-sync-service.js';
11
11
  import { networkStatus, ledgerPrepareParams, } from '../utils.js';
12
12
  import { v4 } from 'uuid';
13
- export const userController = (kernelInfo, userUrl, store, notificationService, authContext, drivers, _logger) => {
13
+ export const userController = (kernelInfo, userUrl, store, notificationService, authContext, drivers, _logger, adminUserId) => {
14
14
  const logger = _logger.child({ component: 'user-controller' });
15
+ const provider = {
16
+ id: kernelInfo.id,
17
+ version: 'TODO',
18
+ providerType: kernelInfo.clientType,
19
+ userUrl: `${userUrl}/login/`,
20
+ };
21
+ function assertAdmin() {
22
+ const userId = assertConnected(authContext).userId;
23
+ if (!adminUserId || userId !== adminUserId) {
24
+ throw new Error('Unauthorized: only the admin user can perform this operation');
25
+ }
26
+ }
27
+ function handleSigningError(result) {
28
+ if ('error' in result) {
29
+ throw new Error(`Error from signing driver: ${result.error_description}`);
30
+ }
31
+ return result;
32
+ }
15
33
  return buildController({
34
+ getUser: async () => {
35
+ const userId = assertConnected(authContext).userId;
36
+ return {
37
+ userId,
38
+ isAdmin: !!adminUserId && userId === adminUserId,
39
+ };
40
+ },
16
41
  addNetwork: async (params) => {
42
+ assertAdmin();
17
43
  const { network } = params;
18
44
  const ledgerApi = {
19
45
  baseUrl: network.ledgerApi ?? '',
@@ -35,31 +61,39 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
35
61
  // TODO: Add an explicit updateNetwork method to the User API spec and controller
36
62
  const existingNetworks = await store.listNetworks();
37
63
  if (existingNetworks.find((n) => n.id === newNetwork.id)) {
64
+ logger.info(`Updating network ${newNetwork.id}`);
38
65
  await store.updateNetwork(newNetwork);
39
66
  }
40
67
  else {
68
+ logger.info(`Adding network ${newNetwork.id}`);
41
69
  await store.addNetwork(newNetwork);
42
70
  }
43
71
  return null;
44
72
  },
45
73
  removeNetwork: async (params) => {
74
+ assertAdmin();
46
75
  await store.removeNetwork(params.networkName);
47
76
  return null;
48
77
  },
49
78
  listNetworks: async () => Promise.resolve({ networks: await store.listNetworks() }),
50
79
  addIdp: async (params) => {
80
+ assertAdmin();
51
81
  const validatedIdp = idpSchema.parse(params.idp);
52
82
  // TODO: Add an explicit updateIdp method to the User API spec and controller
53
83
  const existingIdps = await store.listIdps();
54
84
  if (existingIdps.find((n) => n.id === validatedIdp.id)) {
85
+ logger.info(`Updating IDP ${validatedIdp.id}`);
55
86
  await store.updateIdp(validatedIdp);
56
87
  }
57
88
  else {
89
+ logger.info(`Adding IDP ${validatedIdp.id}`);
58
90
  await store.addIdp(validatedIdp);
59
91
  }
60
92
  return null;
61
93
  },
62
94
  removeIdp: async (params) => {
95
+ assertAdmin();
96
+ logger.info(`Removing IDP ${params.identityProviderId}`);
63
97
  await store.removeIdp(params.identityProviderId);
64
98
  return null;
65
99
  },
@@ -96,17 +130,24 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
96
130
  break;
97
131
  }
98
132
  case SigningProvider.WALLET_KERNEL: {
99
- const key = await driver.createKey({
133
+ const key = await driver
134
+ .createKey({
100
135
  name: partyHint,
101
- });
136
+ })
137
+ .then(handleSigningError);
102
138
  party = await partyAllocator.allocateParty(userId, partyHint, key.publicKey, async (hash) => {
103
- const { signature } = await driver.signTransaction({
139
+ const { signature } = await driver
140
+ .signTransaction({
104
141
  tx: '',
105
142
  txHash: hash,
106
143
  keyIdentifier: {
107
144
  publicKey: key.publicKey,
108
145
  },
109
- });
146
+ })
147
+ .then(handleSigningError);
148
+ if (!signature) {
149
+ throw new Error('No signature returned from signing driver');
150
+ }
110
151
  return signature;
111
152
  });
112
153
  publicKey = key.publicKey;
@@ -115,10 +156,12 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
115
156
  case SigningProvider.BLOCKDAEMON: {
116
157
  if (signingProviderContext?.externalTxId) {
117
158
  walletStatus = 'initialized';
118
- const { signature, status } = await driver.getTransaction({
159
+ const { signature } = await driver
160
+ .getTransaction({
119
161
  userId,
120
162
  txId: signingProviderContext.externalTxId,
121
- });
163
+ })
164
+ .then(handleSigningError);
122
165
  if (!['pending', 'signed'].includes(status)) {
123
166
  await store.removeWallet(signingProviderContext.partyId);
124
167
  }
@@ -152,19 +195,26 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
152
195
  .replace(/-/g, '')
153
196
  .substring(0, 16);
154
197
  const txPayload = JSON.stringify(topologyTransactions);
155
- const { status, txId: id } = await driver.signTransaction({
198
+ const { status, txId: id } = await driver
199
+ .signTransaction({
156
200
  tx: Buffer.from(txPayload).toString('base64'),
157
201
  txHash: transactions.multiHash,
158
202
  keyIdentifier: {
159
203
  publicKey: key.publicKey,
160
204
  },
161
205
  internalTxId,
162
- });
206
+ })
207
+ .then(handleSigningError);
163
208
  if (status === 'signed') {
164
- const { signature } = await driver.getTransaction({
209
+ const { signature } = await driver
210
+ .getTransaction({
165
211
  userId,
166
212
  txId: id,
167
- });
213
+ })
214
+ .then(handleSigningError);
215
+ if (!signature) {
216
+ throw new Error('Transaction signed but no signature found in result');
217
+ }
168
218
  partyId =
169
219
  await partyAllocator.allocatePartyWithExistingWallet(namespace, transactions.topologyTransactions ?? [], signature, userId);
170
220
  }
@@ -182,16 +232,18 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
182
232
  break;
183
233
  }
184
234
  case SigningProvider.FIREBLOCKS: {
185
- const keys = await driver.getKeys();
235
+ const keys = await driver.getKeys().then(handleSigningError);
186
236
  const key = keys?.keys?.find((k) => k.name === 'Canton Party');
187
237
  if (!key)
188
238
  throw new Error('Fireblocks key not found');
189
239
  if (signingProviderContext) {
190
240
  walletStatus = 'initialized';
191
- const { signature, status } = await driver.getTransaction({
241
+ const { signature, status } = await driver
242
+ .getTransaction({
192
243
  userId,
193
244
  txId: signingProviderContext.externalTxId,
194
- });
245
+ })
246
+ .then(handleSigningError);
195
247
  if (!['pending', 'signed'].includes(status)) {
196
248
  await store.removeWallet(signingProviderContext.partyId);
197
249
  }
@@ -212,18 +264,25 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
212
264
  topologyTransactions =
213
265
  transactions.topologyTransactions;
214
266
  let partyId = '';
215
- const { status, txId: id } = await driver.signTransaction({
267
+ const { status, txId: id } = await driver
268
+ .signTransaction({
216
269
  tx: '',
217
270
  txHash: Buffer.from(transactions.multiHash, 'base64').toString('hex'),
218
271
  keyIdentifier: {
219
272
  publicKey: key.publicKey,
220
273
  },
221
- });
274
+ })
275
+ .then(handleSigningError);
222
276
  if (status === 'signed') {
223
- const { signature } = await driver.getTransaction({
277
+ const { signature } = await driver
278
+ .getTransaction({
224
279
  userId,
225
280
  txId: id,
226
- });
281
+ })
282
+ .then(handleSigningError);
283
+ if (!signature) {
284
+ throw new Error('Transaction signed but no signature found in result');
285
+ }
227
286
  partyId =
228
287
  await partyAllocator.allocatePartyWithExistingWallet(namespace, transactions.topologyTransactions, Buffer.from(signature, 'hex').toString('base64'), userId);
229
288
  }
@@ -284,7 +343,7 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
284
343
  },
285
344
  removeWallet: async (params) => Promise.resolve({}),
286
345
  listWallets: async (params) => {
287
- return await store.getAllWallets(params.filter);
346
+ return await store.getWallets(params.filter);
288
347
  },
289
348
  sign: async ({ preparedTransaction, preparedTransactionHash, partyId, commandId, }) => {
290
349
  const network = await store.getCurrentNetwork();
@@ -312,14 +371,16 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
312
371
  };
313
372
  }
314
373
  case SigningProvider.WALLET_KERNEL: {
315
- const signature = await driver.signTransaction({
374
+ const { signature } = await driver
375
+ .signTransaction({
316
376
  tx: preparedTransaction,
317
377
  txHash: preparedTransactionHash,
318
378
  keyIdentifier: {
319
379
  publicKey: wallet.publicKey,
320
380
  },
321
- });
322
- if (!signature.signature) {
381
+ })
382
+ .then(handleSigningError);
383
+ if (!signature) {
323
384
  throw new Error('Failed to sign transaction: ' +
324
385
  JSON.stringify(signature));
325
386
  }
@@ -340,7 +401,7 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
340
401
  store.setTransaction(signedTx);
341
402
  notifier.emit('txChanged', signedTx);
342
403
  return {
343
- signature: signature.signature,
404
+ signature,
344
405
  signedBy: wallet.namespace,
345
406
  partyId: wallet.partyId,
346
407
  };
@@ -350,21 +411,25 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
350
411
  .randomUUID()
351
412
  .replace(/-/g, '')
352
413
  .substring(0, 16);
353
- let result = await driver.signTransaction({
414
+ let result = await driver
415
+ .signTransaction({
354
416
  tx: preparedTransaction,
355
417
  txHash: preparedTransactionHash,
356
418
  keyIdentifier: {
357
419
  publicKey: wallet.publicKey,
358
420
  },
359
421
  internalTxId,
360
- });
422
+ })
423
+ .then(handleSigningError);
361
424
  if (result.status === 'pending' && result.txId) {
362
425
  for (let i = 0; i < 60; i++) {
363
426
  await new Promise((r) => setTimeout(r, 1000));
364
- result = await driver.getTransaction({
427
+ result = await driver
428
+ .getTransaction({
365
429
  userId,
366
430
  txId: result.txId,
367
- });
431
+ })
432
+ .then(handleSigningError);
368
433
  if (result.status === 'signed')
369
434
  break;
370
435
  }
@@ -523,18 +588,17 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
523
588
  });
524
589
  const status = await networkStatus(ledgerClient);
525
590
  notifier.emit('statusChanged', {
526
- kernel: {
527
- ...kernelInfo,
528
- userUrl: `${userUrl}/login/`,
591
+ provider: provider,
592
+ connection: {
593
+ isConnected: status.isConnected,
594
+ reason: status.reason ? status.reason : 'OK',
595
+ isNetworkConnected: status.isConnected,
596
+ networkReason: status.reason ? status.reason : 'OK',
529
597
  },
530
- isConnected: true,
531
- isNetworkConnected: status.isConnected,
532
- networkReason: status.reason ? status.reason : 'OK',
533
598
  network: {
534
599
  networkId: network.id,
535
- ledgerApi: {
536
- baseUrl: network.ledgerApi.baseUrl,
537
- },
600
+ ledgerApi: network.ledgerApi.baseUrl,
601
+ accessToken: accessToken,
538
602
  },
539
603
  session: {
540
604
  id: newSessionId,
@@ -566,7 +630,9 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
566
630
  }
567
631
  catch (error) {
568
632
  logger.error(`Failed to add session: ${error}`);
569
- throw new Error(`Failed to add session: ${error}`);
633
+ throw new Error(`Failed to add session: ${error}`, {
634
+ cause: error,
635
+ });
570
636
  }
571
637
  },
572
638
  removeSession: async () => {
@@ -575,10 +641,15 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
575
641
  const notifier = notificationService.getNotifier(userId);
576
642
  await store.removeSession();
577
643
  notifier.emit('statusChanged', {
578
- kernel: kernelInfo,
579
- isConnected: false,
580
- isNetworkConnected: false,
581
- networkReason: 'removed session',
644
+ provider: provider,
645
+ connection: {
646
+ isConnected: false,
647
+ reason: 'disconnect',
648
+ isNetworkConnected: false,
649
+ networkReason: 'removed session',
650
+ },
651
+ network: undefined,
652
+ session: undefined,
582
653
  userUrl: `${userUrl}/login/`,
583
654
  });
584
655
  return null;
@@ -723,5 +794,16 @@ export const userController = (kernelInfo, userUrl, store, notificationService,
723
794
  }));
724
795
  return { transactions: txs };
725
796
  },
797
+ deleteTransaction: async (params) => {
798
+ const transaction = await store.getTransaction(params.commandId);
799
+ if (!transaction) {
800
+ throw new Error(`Transaction not found with commandId: ${params.commandId}`);
801
+ }
802
+ if (transaction.status !== 'pending') {
803
+ throw new Error(`Cannot delete transaction with status '${transaction.status}'. Only pending transactions can be deleted.`);
804
+ }
805
+ await store.removeTransaction(params.commandId);
806
+ return null;
807
+ },
726
808
  });
727
809
  };
@@ -17,6 +17,8 @@ import { RemoveSession } from './typings.js';
17
17
  import { ListSessions } from './typings.js';
18
18
  import { GetTransaction } from './typings.js';
19
19
  import { ListTransactions } from './typings.js';
20
+ import { DeleteTransaction } from './typings.js';
21
+ import { GetUser } from './typings.js';
20
22
  export type Methods = {
21
23
  addNetwork: AddNetwork;
22
24
  removeNetwork: RemoveNetwork;
@@ -37,6 +39,8 @@ export type Methods = {
37
39
  listSessions: ListSessions;
38
40
  getTransaction: GetTransaction;
39
41
  listTransactions: ListTransactions;
42
+ deleteTransaction: DeleteTransaction;
43
+ getUser: GetUser;
40
44
  };
41
45
  declare function buildController(methods: Methods): {
42
46
  addNetwork: AddNetwork;
@@ -58,6 +62,8 @@ declare function buildController(methods: Methods): {
58
62
  listSessions: ListSessions;
59
63
  getTransaction: GetTransaction;
60
64
  listTransactions: ListTransactions;
65
+ deleteTransaction: DeleteTransaction;
66
+ getUser: GetUser;
61
67
  };
62
68
  export default buildController;
63
69
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/user-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAE/C,MAAM,MAAM,OAAO,GAAG;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;IAC1B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,YAAY,EAAE,YAAY,CAAA;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,gBAAgB,EAAE,gBAAgB,CAAA;CACrC,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;EAsBxC;AAED,eAAe,eAAe,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/user-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,MAAM,MAAM,OAAO,GAAG;IAClB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,SAAS,CAAA;IACpB,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,EAAE,YAAY,CAAA;IAC1B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,YAAY,EAAE,YAAY,CAAA;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,WAAW,EAAE,WAAW,CAAA;IACxB,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,IAAI,EAAE,IAAI,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,YAAY,CAAA;IAC1B,cAAc,EAAE,cAAc,CAAA;IAC9B,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,OAAO,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;;;;;;;;;;EAwBxC;AAED,eAAe,eAAe,CAAA"}
@@ -21,6 +21,8 @@ function buildController(methods) {
21
21
  listSessions: methods.listSessions,
22
22
  getTransaction: methods.getTransaction,
23
23
  listTransactions: methods.listTransactions,
24
+ deleteTransaction: methods.deleteTransaction,
25
+ getUser: methods.getUser,
24
26
  };
25
27
  }
26
28
  export default buildController;