@canton-network/wallet-gateway-remote 0.4.0 → 0.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -12
- package/dist/auth/jwt-auth-service.d.ts +1 -1
- package/dist/auth/jwt-auth-service.d.ts.map +1 -1
- package/dist/auth/jwt-auth-service.js +11 -1
- package/dist/auth/jwt-unsafe-auth-service.d.ts +11 -0
- package/dist/auth/jwt-unsafe-auth-service.d.ts.map +1 -0
- package/dist/auth/jwt-unsafe-auth-service.js +50 -0
- package/dist/config/Config.d.ts +151 -37
- package/dist/config/Config.d.ts.map +1 -1
- package/dist/dapp-api/controller.d.ts +2 -0
- package/dist/dapp-api/controller.d.ts.map +1 -1
- package/dist/dapp-api/controller.js +28 -7
- package/dist/dapp-api/rpc-gen/index.d.ts +6 -0
- package/dist/dapp-api/rpc-gen/index.d.ts.map +1 -1
- package/dist/dapp-api/rpc-gen/index.js +2 -0
- package/dist/dapp-api/rpc-gen/typings.d.ts +26 -20
- package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/dapp-api/server.d.ts +2 -1
- package/dist/dapp-api/server.d.ts.map +1 -1
- package/dist/dapp-api/server.js +8 -3
- package/dist/dapp-api/server.test.js +11 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -1
- package/dist/init.d.ts +2 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +46 -23
- package/dist/ledger/party-allocation-service.d.ts +2 -1
- package/dist/ledger/party-allocation-service.d.ts.map +1 -1
- package/dist/ledger/party-allocation-service.js +4 -4
- package/dist/ledger/party-allocation-service.test.js +12 -3
- package/dist/ledger/wallet-sync-service.d.ts.map +1 -1
- package/dist/ledger/wallet-sync-service.js +2 -2
- package/dist/user-api/controller.d.ts.map +1 -1
- package/dist/user-api/controller.js +64 -33
- package/dist/user-api/rpc-gen/typings.d.ts +22 -12
- package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/user-api/server.d.ts +6 -5
- package/dist/user-api/server.d.ts.map +1 -1
- package/dist/user-api/server.js +2 -4
- package/dist/user-api/server.test.js +4 -3
- package/dist/web/frontend/404/index.html +3 -6
- package/dist/web/frontend/approve/index.html +5 -9
- package/dist/web/frontend/assets/{404-FxmR286l.js → 404-C4ltj2Y3.js} +3 -3
- package/dist/web/frontend/assets/approve-Drc1zW1z.js +157 -0
- package/dist/web/frontend/assets/callback-BBgKxZBh.js +1 -0
- package/dist/web/frontend/assets/handle-errors-C_r_-A1k.js +1 -0
- package/dist/web/frontend/assets/{index-BknZMPaI.css → index-HEe9--Xd.css} +1 -1
- package/dist/web/frontend/assets/{index-VtAAU1cN.js → index-_AVK9fEz.js} +67 -54
- package/dist/web/frontend/assets/login-x46HxVRr.js +159 -0
- package/dist/web/frontend/assets/{networks-CZV8G3N2.js → networks-DSlcKT60.js} +9 -9
- package/dist/web/frontend/assets/{state-DKGJ6EmM.js → state-BahUv9dS.js} +2 -2
- package/dist/web/frontend/assets/{wallets-DwPVJP85.js → wallets-BXR4V066.js} +6 -6
- package/dist/web/frontend/callback/index.html +3 -3
- package/dist/web/frontend/index.html +2 -5
- package/dist/web/frontend/login/index.html +5 -8
- package/dist/web/frontend/networks/index.html +6 -8
- package/dist/web/frontend/wallets/index.html +5 -9
- package/package.json +17 -17
- package/dist/web/frontend/assets/approve-BHHuvE3i.js +0 -157
- package/dist/web/frontend/assets/callback-D9y0DRns.js +0 -1
- package/dist/web/frontend/assets/handle-errors-BM-xvD4v.js +0 -1
- package/dist/web/frontend/assets/index-BPTkodPz.js +0 -1
- package/dist/web/frontend/assets/index-TZrNw7dA.css +0 -1
- package/dist/web/frontend/assets/login-DJofeRCg.js +0 -159
- package/dist/web/frontend/assets/rpc-client-TGo-LOnR.js +0 -1
- package/dist/web/frontend/assets/state-manager-BNW0y5PZ.js +0 -23
|
@@ -24,14 +24,32 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
|
|
|
24
24
|
const logger = _logger.child({ component: 'dapp-controller' });
|
|
25
25
|
return buildController({
|
|
26
26
|
connect: async () => ({
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
sessionToken: '',
|
|
28
|
+
status: {
|
|
29
|
+
kernel: kernelInfo,
|
|
30
|
+
isConnected: false,
|
|
31
|
+
userUrl: 'http://localhost:3030/login/', // TODO: pull user URL from config
|
|
32
|
+
},
|
|
30
33
|
}),
|
|
34
|
+
disconnect: async () => {
|
|
35
|
+
if (!context) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
const notifier = notificationService.getNotifier(context.userId);
|
|
40
|
+
await store.removeSession();
|
|
41
|
+
notifier.emit('statusChanged', {
|
|
42
|
+
kernel: kernelInfo,
|
|
43
|
+
isConnected: false,
|
|
44
|
+
userUrl: 'http://localhost:3030/login/', // TODO: pull user URL from config
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
},
|
|
31
49
|
darsAvailable: async () => ({ dars: ['default-dar'] }),
|
|
32
50
|
ledgerApi: async (params) => {
|
|
33
51
|
const network = await store.getCurrentNetwork();
|
|
34
|
-
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), assertConnected(context).accessToken
|
|
52
|
+
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, assertConnected(context).accessToken);
|
|
35
53
|
let result;
|
|
36
54
|
switch (params.requestMethod) {
|
|
37
55
|
case 'GET':
|
|
@@ -58,7 +76,7 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
|
|
|
58
76
|
if (wallet === undefined) {
|
|
59
77
|
throw new Error('No primary wallet found');
|
|
60
78
|
}
|
|
61
|
-
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), context.accessToken
|
|
79
|
+
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, context.accessToken);
|
|
62
80
|
const userId = context.userId;
|
|
63
81
|
const notifier = notificationService.getNotifier(userId);
|
|
64
82
|
const commandId = v4();
|
|
@@ -85,7 +103,7 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
|
|
|
85
103
|
if (wallet === undefined) {
|
|
86
104
|
throw new Error('No primary wallet found');
|
|
87
105
|
}
|
|
88
|
-
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), context.accessToken
|
|
106
|
+
const ledgerClient = new LedgerClient(new URL(network.ledgerApi.baseUrl), logger, false, context.accessToken);
|
|
89
107
|
return prepareSubmission(context.userId, wallet.partyId, network.synchronizerId, params.commands, ledgerClient);
|
|
90
108
|
},
|
|
91
109
|
status: async () => {
|
|
@@ -99,13 +117,16 @@ export const dappController = (kernelInfo, store, notificationService, _logger,
|
|
|
99
117
|
return {
|
|
100
118
|
kernel: kernelInfo,
|
|
101
119
|
isConnected: true,
|
|
102
|
-
|
|
120
|
+
networkId: (await store.getCurrentNetwork()).id,
|
|
103
121
|
};
|
|
104
122
|
}
|
|
105
123
|
},
|
|
106
124
|
onConnected: async () => {
|
|
107
125
|
throw new Error('Only for events.');
|
|
108
126
|
},
|
|
127
|
+
onStatusChanged: async () => {
|
|
128
|
+
throw new Error('Only for events.');
|
|
129
|
+
},
|
|
109
130
|
onAccountsChanged: async () => {
|
|
110
131
|
throw new Error('Only for events.');
|
|
111
132
|
},
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import { Status } from './typings.js';
|
|
2
2
|
import { Connect } from './typings.js';
|
|
3
|
+
import { Disconnect } from './typings.js';
|
|
3
4
|
import { DarsAvailable } from './typings.js';
|
|
4
5
|
import { PrepareReturn } from './typings.js';
|
|
5
6
|
import { PrepareExecute } from './typings.js';
|
|
6
7
|
import { LedgerApi } from './typings.js';
|
|
7
8
|
import { OnConnected } from './typings.js';
|
|
9
|
+
import { OnStatusChanged } from './typings.js';
|
|
8
10
|
import { OnAccountsChanged } from './typings.js';
|
|
9
11
|
import { RequestAccounts } from './typings.js';
|
|
10
12
|
import { OnTxChanged } from './typings.js';
|
|
11
13
|
export type Methods = {
|
|
12
14
|
status: Status;
|
|
13
15
|
connect: Connect;
|
|
16
|
+
disconnect: Disconnect;
|
|
14
17
|
darsAvailable: DarsAvailable;
|
|
15
18
|
prepareReturn: PrepareReturn;
|
|
16
19
|
prepareExecute: PrepareExecute;
|
|
17
20
|
ledgerApi: LedgerApi;
|
|
18
21
|
onConnected: OnConnected;
|
|
22
|
+
onStatusChanged: OnStatusChanged;
|
|
19
23
|
onAccountsChanged: OnAccountsChanged;
|
|
20
24
|
requestAccounts: RequestAccounts;
|
|
21
25
|
onTxChanged: OnTxChanged;
|
|
@@ -23,11 +27,13 @@ export type Methods = {
|
|
|
23
27
|
declare function buildController(methods: Methods): {
|
|
24
28
|
status: Status;
|
|
25
29
|
connect: Connect;
|
|
30
|
+
disconnect: Disconnect;
|
|
26
31
|
darsAvailable: DarsAvailable;
|
|
27
32
|
prepareReturn: PrepareReturn;
|
|
28
33
|
prepareExecute: PrepareExecute;
|
|
29
34
|
ledgerApi: LedgerApi;
|
|
30
35
|
onConnected: OnConnected;
|
|
36
|
+
onStatusChanged: OnStatusChanged;
|
|
31
37
|
onAccountsChanged: OnAccountsChanged;
|
|
32
38
|
requestAccounts: RequestAccounts;
|
|
33
39
|
onTxChanged: OnTxChanged;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,OAAO,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,WAAW,CAAA;CAC3B,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,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,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,OAAO,GAAG;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,aAAa,CAAA;IAC5B,cAAc,EAAE,cAAc,CAAA;IAC9B,SAAS,EAAE,SAAS,CAAA;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,eAAe,EAAE,eAAe,CAAA;IAChC,iBAAiB,EAAE,iBAAiB,CAAA;IACpC,eAAe,EAAE,eAAe,CAAA;IAChC,WAAW,EAAE,WAAW,CAAA;CAC3B,CAAA;AAED,iBAAS,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;;;;;;;;EAexC;AAED,eAAe,eAAe,CAAA"}
|
|
@@ -4,11 +4,13 @@ function buildController(methods) {
|
|
|
4
4
|
return {
|
|
5
5
|
status: methods.status,
|
|
6
6
|
connect: methods.connect,
|
|
7
|
+
disconnect: methods.disconnect,
|
|
7
8
|
darsAvailable: methods.darsAvailable,
|
|
8
9
|
prepareReturn: methods.prepareReturn,
|
|
9
10
|
prepareExecute: methods.prepareExecute,
|
|
10
11
|
ledgerApi: methods.ledgerApi,
|
|
11
12
|
onConnected: methods.onConnected,
|
|
13
|
+
onStatusChanged: methods.onStatusChanged,
|
|
12
14
|
onAccountsChanged: methods.onAccountsChanged,
|
|
13
15
|
requestAccounts: methods.requestAccounts,
|
|
14
16
|
onTxChanged: methods.onTxChanged,
|
|
@@ -40,7 +40,7 @@ export interface KernelInfo {
|
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
*
|
|
43
|
-
* Whether or not a connection to a network is
|
|
43
|
+
* Whether or not a connection to a network is established.
|
|
44
44
|
*
|
|
45
45
|
*/
|
|
46
46
|
export type IsConnected = boolean;
|
|
@@ -49,13 +49,19 @@ export type IsConnected = boolean;
|
|
|
49
49
|
* The network ID the wallet corresponds to.
|
|
50
50
|
*
|
|
51
51
|
*/
|
|
52
|
-
export type
|
|
52
|
+
export type NetworkId = string;
|
|
53
|
+
export interface StatusEvent {
|
|
54
|
+
kernel: KernelInfo;
|
|
55
|
+
isConnected: IsConnected;
|
|
56
|
+
networkId?: NetworkId;
|
|
57
|
+
[k: string]: any;
|
|
58
|
+
}
|
|
53
59
|
/**
|
|
54
60
|
*
|
|
55
|
-
*
|
|
61
|
+
* JWT authentication token (if applicable).
|
|
56
62
|
*
|
|
57
63
|
*/
|
|
58
|
-
export type
|
|
64
|
+
export type SessionToken = string;
|
|
59
65
|
export type Dar = string;
|
|
60
66
|
export type Dars = Dar[];
|
|
61
67
|
/**
|
|
@@ -80,13 +86,13 @@ export interface JsPrepareSubmissionResponse {
|
|
|
80
86
|
preparedTransactionHash?: PreparedTransactionHash;
|
|
81
87
|
[k: string]: any;
|
|
82
88
|
}
|
|
83
|
-
export type Response = string;
|
|
84
89
|
/**
|
|
85
90
|
*
|
|
86
|
-
*
|
|
91
|
+
* A URL that points to a user interface.
|
|
87
92
|
*
|
|
88
93
|
*/
|
|
89
|
-
export type
|
|
94
|
+
export type UserUrl = string;
|
|
95
|
+
export type Response = string;
|
|
90
96
|
/**
|
|
91
97
|
*
|
|
92
98
|
* Set as primary wallet for dApp usage.
|
|
@@ -134,7 +140,7 @@ export interface Wallet {
|
|
|
134
140
|
hint: Hint;
|
|
135
141
|
publicKey: PublicKey;
|
|
136
142
|
namespace: Namespace;
|
|
137
|
-
|
|
143
|
+
networkId: NetworkId;
|
|
138
144
|
signingProviderId: SigningProviderId;
|
|
139
145
|
[k: string]: any;
|
|
140
146
|
}
|
|
@@ -264,19 +270,17 @@ export interface LedgerApiParams {
|
|
|
264
270
|
body?: Body;
|
|
265
271
|
[k: string]: any;
|
|
266
272
|
}
|
|
267
|
-
export interface StatusResult {
|
|
268
|
-
kernel: KernelInfo;
|
|
269
|
-
isConnected: IsConnected;
|
|
270
|
-
chainId?: ChainId;
|
|
271
|
-
[k: string]: any;
|
|
272
|
-
}
|
|
273
273
|
export interface ConnectResult {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
chainId?: ChainId;
|
|
277
|
-
userUrl: UserUrl;
|
|
274
|
+
status: StatusEvent;
|
|
275
|
+
sessionToken: SessionToken;
|
|
278
276
|
[k: string]: any;
|
|
279
277
|
}
|
|
278
|
+
/**
|
|
279
|
+
*
|
|
280
|
+
* Represents a null value, used in responses where no data is returned.
|
|
281
|
+
*
|
|
282
|
+
*/
|
|
283
|
+
export type Null = null;
|
|
280
284
|
export interface DarsAvailableResult {
|
|
281
285
|
dars: Dars;
|
|
282
286
|
[k: string]: any;
|
|
@@ -297,7 +301,7 @@ export interface LedgerApiResult {
|
|
|
297
301
|
}
|
|
298
302
|
export interface OnConnectedEvent {
|
|
299
303
|
kernel: KernelInfo;
|
|
300
|
-
|
|
304
|
+
networkId: NetworkId;
|
|
301
305
|
sessionToken?: SessionToken;
|
|
302
306
|
[k: string]: any;
|
|
303
307
|
}
|
|
@@ -324,13 +328,15 @@ export type TxChangedEvent = TxChangedPendingEvent | TxChangedSignedEvent | TxCh
|
|
|
324
328
|
* Generated! Represents an alias to any of the provided schemas
|
|
325
329
|
*
|
|
326
330
|
*/
|
|
327
|
-
export type Status = () => Promise<
|
|
331
|
+
export type Status = () => Promise<StatusEvent>;
|
|
328
332
|
export type Connect = () => Promise<ConnectResult>;
|
|
333
|
+
export type Disconnect = () => Promise<Null>;
|
|
329
334
|
export type DarsAvailable = () => Promise<DarsAvailableResult>;
|
|
330
335
|
export type PrepareReturn = (params: PrepareReturnParams) => Promise<PrepareReturnResult>;
|
|
331
336
|
export type PrepareExecute = (params: PrepareExecuteParams) => Promise<PrepareExecuteResult>;
|
|
332
337
|
export type LedgerApi = (params: LedgerApiParams) => Promise<LedgerApiResult>;
|
|
333
338
|
export type OnConnected = () => Promise<OnConnectedEvent>;
|
|
339
|
+
export type OnStatusChanged = () => Promise<StatusEvent>;
|
|
334
340
|
export type OnAccountsChanged = () => Promise<AccountsChangedEvent>;
|
|
335
341
|
export type RequestAccounts = () => Promise<RequestAccountsResult>;
|
|
336
342
|
export type OnTxChanged = () => Promise<TxChangedEvent>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB;AACD,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;AAC7D,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC7B,MAAM,MAAM,IAAI,GAAG,MAAM,CAAA;AACzB;;;;GAIG;AACH,MAAM,MAAM,EAAE,GAAG,MAAM,CAAA;AACvB;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AACpE;;;;GAIG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AACxB;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,EAAE,CAAA;IACN,UAAU,EAAE,UAAU,CAAA;IACtB,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,CAAC,CAAC,EAAE,MAAM,GAAG,GAAG,CAAA;CACnB;AACD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAA;AACjC;;;;GAIG;AACH,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
+
import { Logger } from 'pino';
|
|
2
3
|
import { Store } from '@canton-network/core-wallet-store';
|
|
3
4
|
import { AuthService, AuthAware } from '@canton-network/core-wallet-auth';
|
|
4
5
|
import { Server } from 'http';
|
|
5
6
|
import { NotificationService } from '../notification/NotificationService.js';
|
|
6
7
|
import { KernelInfo } from '../config/Config.js';
|
|
7
|
-
export declare const dapp: (route: string, app: express.Express, server: Server, kernelInfo: KernelInfo, notificationService: NotificationService, authService: AuthService, store: Store & AuthAware<Store>) => Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
8
|
+
export declare const dapp: (route: string, app: express.Express, logger: Logger, server: Server, kernelInfo: KernelInfo, notificationService: NotificationService, authService: AuthService, store: Store & AuthAware<Store>) => Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>;
|
|
8
9
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dapp-api/server.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/dapp-api/server.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,MAAM,SAAS,CAAA;AAG7B,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAG7B,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AACzE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,OAAO,EACH,mBAAmB,EAEtB,MAAM,wCAAwC,CAAA;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAEhD,eAAO,MAAM,IAAI,GACb,OAAO,MAAM,EACb,KAAK,OAAO,CAAC,OAAO,EACpB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,YAAY,UAAU,EACtB,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,EACxB,OAAO,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,wFAuElC,CAAA"}
|
package/dist/dapp-api/server.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import cors from 'cors';
|
|
3
4
|
import { dappController } from './controller.js';
|
|
4
|
-
import { pino } from 'pino';
|
|
5
5
|
import { jsonRpcHandler } from '../middleware/jsonRpcHandler.js';
|
|
6
6
|
import { Server as SocketIoServer } from 'socket.io';
|
|
7
|
-
const
|
|
8
|
-
|
|
7
|
+
export const dapp = (route, app, logger, server, kernelInfo, notificationService, authService, store) => {
|
|
8
|
+
app.use(cors()); // TODO: read allowedOrigins from config
|
|
9
9
|
app.use(route, (req, res, next) => jsonRpcHandler({
|
|
10
10
|
controller: dappController(kernelInfo, store.withAuthContext(req.authContext), notificationService, logger, req.authContext),
|
|
11
11
|
logger,
|
|
@@ -22,6 +22,9 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
|
|
|
22
22
|
const onAccountsChanged = (...event) => {
|
|
23
23
|
io.emit('accountsChanged', ...event);
|
|
24
24
|
};
|
|
25
|
+
const onStatusChanged = (...event) => {
|
|
26
|
+
io.emit('statusChanged', ...event);
|
|
27
|
+
};
|
|
25
28
|
const onConnected = (...event) => {
|
|
26
29
|
io.emit('onConnected', ...event);
|
|
27
30
|
};
|
|
@@ -38,6 +41,7 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
|
|
|
38
41
|
notifier = notificationService.getNotifier(userId);
|
|
39
42
|
notifier.on('accountsChanged', onAccountsChanged);
|
|
40
43
|
notifier.on('onConnected', onConnected);
|
|
44
|
+
notifier.on('statusChanged', onStatusChanged);
|
|
41
45
|
notifier.on('txChanged', onTxChanged);
|
|
42
46
|
});
|
|
43
47
|
socket.on('disconnect', () => {
|
|
@@ -45,6 +49,7 @@ export const dapp = (route, app, server, kernelInfo, notificationService, authSe
|
|
|
45
49
|
if (notifier) {
|
|
46
50
|
notifier.removeListener('accountsChanged', onAccountsChanged);
|
|
47
51
|
notifier.removeListener('onConnected', onConnected);
|
|
52
|
+
notifier.removeListener('statusChanged', onStatusChanged);
|
|
48
53
|
notifier.removeListener('txChanged', onTxChanged);
|
|
49
54
|
}
|
|
50
55
|
});
|
|
@@ -30,7 +30,7 @@ test('call connect rpc', async () => {
|
|
|
30
30
|
app.use(cors());
|
|
31
31
|
app.use(express.json());
|
|
32
32
|
const server = createServer(app);
|
|
33
|
-
const response = await request(dapp('/api/v0/dapp', app, server, config.kernel, notificationService, authService, store))
|
|
33
|
+
const response = await request(dapp('/api/v0/dapp', app, pino(sink()), server, config.kernel, notificationService, authService, store))
|
|
34
34
|
.post('/api/v0/dapp')
|
|
35
35
|
.send({ jsonrpc: '2.0', id: 0, method: 'connect', params: [] })
|
|
36
36
|
.set('Accept', 'application/json');
|
|
@@ -39,14 +39,17 @@ test('call connect rpc', async () => {
|
|
|
39
39
|
id: 0,
|
|
40
40
|
jsonrpc: '2.0',
|
|
41
41
|
result: {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
sessionToken: '',
|
|
43
|
+
status: {
|
|
44
|
+
kernel: {
|
|
45
|
+
id: 'remote-da',
|
|
46
|
+
clientType: 'remote',
|
|
47
|
+
url: 'http://localhost:3030/api/v0/dapp',
|
|
48
|
+
userUrl: 'http://localhost:3030',
|
|
49
|
+
},
|
|
50
|
+
isConnected: false,
|
|
51
|
+
userUrl: 'http://localhost:3030/login/',
|
|
47
52
|
},
|
|
48
|
-
isConnected: false,
|
|
49
|
-
userUrl: 'http://localhost:3030/login/',
|
|
50
53
|
},
|
|
51
54
|
});
|
|
52
55
|
});
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAuDA,QAAA,MAAM,OAAO;;;;;CAAiB,CAAA;AAE9B,MAAM,MAAM,UAAU,GAAG,OAAO,OAAO,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -8,6 +8,7 @@ import { ConfigUtils } from './config/ConfigUtils.js';
|
|
|
8
8
|
import { readFileSync } from 'fs';
|
|
9
9
|
import { join, dirname } from 'path';
|
|
10
10
|
import { fileURLToPath } from 'url';
|
|
11
|
+
import pino from 'pino';
|
|
11
12
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
13
|
const __dirname = dirname(__filename);
|
|
13
14
|
const pkg = JSON.parse(readFileSync(join(__dirname, '../package.json'), 'utf8'));
|
|
@@ -24,8 +25,20 @@ const program = new Command()
|
|
|
24
25
|
.choices(['sqlite', 'postgres'])
|
|
25
26
|
.default('sqlite'))
|
|
26
27
|
.action((opts) => {
|
|
28
|
+
// Define project-global logger
|
|
29
|
+
const logger = pino({
|
|
30
|
+
name: 'main',
|
|
31
|
+
level: 'debug',
|
|
32
|
+
...(opts.logFormat === 'pretty'
|
|
33
|
+
? {
|
|
34
|
+
transport: {
|
|
35
|
+
target: 'pino-pretty',
|
|
36
|
+
},
|
|
37
|
+
}
|
|
38
|
+
: {}),
|
|
39
|
+
});
|
|
27
40
|
// Initialize the database with the provided config
|
|
28
|
-
initialize(opts);
|
|
41
|
+
initialize(opts, logger);
|
|
29
42
|
});
|
|
30
43
|
// Parse only the options (without executing commands) to get config path
|
|
31
44
|
program.parseOptions(process.argv);
|
package/dist/init.d.ts
CHANGED
package/dist/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAe7B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAsEvC,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,iBA+DhE"}
|
package/dist/init.js
CHANGED
|
@@ -3,9 +3,7 @@
|
|
|
3
3
|
import { dapp } from './dapp-api/server.js';
|
|
4
4
|
import { user } from './user-api/server.js';
|
|
5
5
|
import { web } from './web/server.js';
|
|
6
|
-
import
|
|
7
|
-
import { pino } from 'pino';
|
|
8
|
-
import { StoreSql, connection } from '@canton-network/core-wallet-store-sql';
|
|
6
|
+
import { StoreSql, bootstrap, connection, migrator, } from '@canton-network/core-wallet-store-sql';
|
|
9
7
|
import { ConfigUtils } from './config/ConfigUtils.js';
|
|
10
8
|
import EventEmitter from 'events';
|
|
11
9
|
import { SigningProvider } from '@canton-network/core-signing-lib';
|
|
@@ -15,6 +13,8 @@ import { jwtAuthService } from './auth/jwt-auth-service.js';
|
|
|
15
13
|
import express from 'express';
|
|
16
14
|
import { jwtAuth } from './middleware/jwtAuth.js';
|
|
17
15
|
import { rpcRateLimit } from './middleware/rateLimit.js';
|
|
16
|
+
import { existsSync } from 'fs';
|
|
17
|
+
let isReady = false;
|
|
18
18
|
class NotificationService {
|
|
19
19
|
constructor(logger) {
|
|
20
20
|
this.logger = logger;
|
|
@@ -36,39 +36,62 @@ class NotificationService {
|
|
|
36
36
|
return notifier;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
39
|
+
async function initializeDatabase(config, logger) {
|
|
40
|
+
logger.info('Checking for database migrations...');
|
|
41
|
+
let exists = true;
|
|
42
|
+
if (config.store.connection.type === 'sqlite') {
|
|
43
|
+
exists = existsSync(config.store.connection.database);
|
|
44
|
+
}
|
|
45
|
+
const db = connection(config.store);
|
|
46
|
+
const umzug = migrator(db);
|
|
47
|
+
const pending = await umzug.pending();
|
|
48
|
+
if (pending.length > 0) {
|
|
49
|
+
logger.info({ pendingMigrations: pending.map((m) => m.name) }, 'Applying database migrations...');
|
|
50
|
+
await umzug.up();
|
|
51
|
+
logger.info('Database migrations applied successfully.');
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
logger.info('No pending database migrations found.');
|
|
55
|
+
}
|
|
56
|
+
// bootstrap database from config file if it did not exist before
|
|
57
|
+
if (!exists) {
|
|
58
|
+
logger.info('Bootstrapping database from config...');
|
|
59
|
+
await bootstrap(db, config.store, logger);
|
|
60
|
+
}
|
|
61
|
+
return new StoreSql(db, logger);
|
|
62
|
+
}
|
|
63
|
+
export async function initialize(opts, logger) {
|
|
64
|
+
const port = opts.port ? Number(opts.port) : 3030;
|
|
65
|
+
const app = express();
|
|
66
|
+
const server = app.listen(port, () => {
|
|
67
|
+
logger.info(`Remote Wallet Gateway starting on http://localhost:${port}`);
|
|
68
|
+
});
|
|
69
|
+
app.use('/healthz', rpcRateLimit, (_req, res) => res.status(200).send('OK'));
|
|
70
|
+
app.use('/readyz', rpcRateLimit, (_req, res) => {
|
|
71
|
+
if (isReady) {
|
|
72
|
+
res.status(200).send('OK');
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
res.status(503).send('UNAVAILABLE');
|
|
76
|
+
}
|
|
50
77
|
});
|
|
51
78
|
const notificationService = new NotificationService(logger);
|
|
52
79
|
const config = ConfigUtils.loadConfigFile(opts.config);
|
|
53
|
-
const
|
|
54
|
-
const store = new StoreSql(connection(config.store), logger);
|
|
80
|
+
const store = await initializeDatabase(config, logger);
|
|
55
81
|
const authService = jwtAuthService(store, logger);
|
|
56
82
|
const drivers = {
|
|
57
83
|
[SigningProvider.PARTICIPANT]: new ParticipantSigningDriver(),
|
|
58
84
|
[SigningProvider.WALLET_KERNEL]: new InternalSigningDriver(),
|
|
59
85
|
};
|
|
60
|
-
const app = express();
|
|
61
|
-
app.use(cors()); // TODO: read allowedOrigins from config
|
|
62
86
|
app.use('/api/*splat', express.json());
|
|
63
87
|
app.use('/api/*splat', rpcRateLimit);
|
|
64
88
|
app.use('/api/*splat', jwtAuth(authService, logger));
|
|
65
|
-
const server = app.listen(port, () => {
|
|
66
|
-
logger.info(`Remote Wallet Gateway running at http://localhost:${port}`);
|
|
67
|
-
});
|
|
68
89
|
// register dapp API handlers
|
|
69
|
-
dapp('/api/v0/dapp', app, server, config.kernel, notificationService, authService, store);
|
|
90
|
+
dapp('/api/v0/dapp', app, logger, server, config.kernel, notificationService, authService, store);
|
|
70
91
|
// register user API handlers
|
|
71
|
-
user('/api/v0/user', app, config.kernel, notificationService, drivers, store);
|
|
92
|
+
user('/api/v0/user', app, logger, config.kernel, notificationService, drivers, store);
|
|
72
93
|
// register web handler
|
|
73
94
|
web(app, server);
|
|
95
|
+
isReady = true;
|
|
96
|
+
logger.info('Wallet Gateway initialization complete');
|
|
74
97
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AccessTokenProvider } from '@canton-network/core-wallet-auth';
|
|
1
2
|
import { Logger } from 'pino';
|
|
2
3
|
export type AllocatedParty = {
|
|
3
4
|
partyId: string;
|
|
@@ -12,7 +13,7 @@ export declare class PartyAllocationService {
|
|
|
12
13
|
private synchronizerId;
|
|
13
14
|
private logger;
|
|
14
15
|
private ledgerClient;
|
|
15
|
-
constructor(synchronizerId: string,
|
|
16
|
+
constructor(synchronizerId: string, accessTokenProvider: AccessTokenProvider, httpLedgerUrl: string, logger: Logger, accessToken?: string);
|
|
16
17
|
/**
|
|
17
18
|
* Allocates an internal participant party for a user.
|
|
18
19
|
* @param userId The ID of the user.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,cAAc,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAI3B,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,MAAM;IANlB,OAAO,CAAC,YAAY,CAAc;gBAGtB,cAAc,EAAE,MAAM,EAC9B,
|
|
1
|
+
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAA;AACtE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,cAAc,GAAG;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;CACpB,CAAA;AAED,KAAK,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;AAEpD;;GAEG;AACH,qBAAa,sBAAsB;IAI3B,OAAO,CAAC,cAAc;IAGtB,OAAO,CAAC,MAAM;IANlB,OAAO,CAAC,YAAY,CAAc;gBAGtB,cAAc,EAAE,MAAM,EAC9B,mBAAmB,EAAE,mBAAmB,EACxC,aAAa,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACtB,WAAW,GAAE,MAAW;IAW5B;;;;OAIG;IACG,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAE1E;;;;;;OAMG;IACG,aAAa,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EACjB,eAAe,EAAE,WAAW,GAC7B,OAAO,CAAC,cAAc,CAAC;YAoBZ,qBAAqB;YAuBrB,qBAAqB;CAsCtC"}
|
|
@@ -5,10 +5,10 @@ import { LedgerClient, TopologyWriteService, } from '@canton-network/core-ledger
|
|
|
5
5
|
* This service provides an abstraction for Canton party allocation that seamlessly handles both internal and external parties.
|
|
6
6
|
*/
|
|
7
7
|
export class PartyAllocationService {
|
|
8
|
-
constructor(synchronizerId,
|
|
8
|
+
constructor(synchronizerId, accessTokenProvider, httpLedgerUrl, logger, accessToken = '') {
|
|
9
9
|
this.synchronizerId = synchronizerId;
|
|
10
10
|
this.logger = logger;
|
|
11
|
-
this.ledgerClient = new LedgerClient(new URL(httpLedgerUrl),
|
|
11
|
+
this.ledgerClient = new LedgerClient(new URL(httpLedgerUrl), this.logger, true, accessToken, accessTokenProvider);
|
|
12
12
|
}
|
|
13
13
|
async allocateParty(userId, hint, publicKey, signingCallback) {
|
|
14
14
|
if (publicKey !== undefined && signingCallback !== undefined) {
|
|
@@ -27,7 +27,7 @@ export class PartyAllocationService {
|
|
|
27
27
|
if (!res.partyDetails?.party) {
|
|
28
28
|
throw new Error('Failed to allocate party');
|
|
29
29
|
}
|
|
30
|
-
await this.ledgerClient.
|
|
30
|
+
await this.ledgerClient.waitForPartyAndGrantUserRights(userId, res.partyDetails.party);
|
|
31
31
|
return { hint, namespace, partyId: res.partyDetails.party };
|
|
32
32
|
}
|
|
33
33
|
async allocateExternalParty(userId, hint, publicKey, signingCallback) {
|
|
@@ -44,7 +44,7 @@ export class PartyAllocationService {
|
|
|
44
44
|
signingAlgorithmSpec: 'SIGNING_ALGORITHM_SPEC_ED25519',
|
|
45
45
|
},
|
|
46
46
|
]);
|
|
47
|
-
await this.ledgerClient.
|
|
47
|
+
await this.ledgerClient.waitForPartyAndGrantUserRights(userId, res.partyId);
|
|
48
48
|
return { hint, partyId: res.partyId, namespace };
|
|
49
49
|
}
|
|
50
50
|
}
|
|
@@ -22,7 +22,7 @@ jest.unstable_mockModule('@canton-network/core-ledger-client', () => ({
|
|
|
22
22
|
return {
|
|
23
23
|
getWithRetry: mockLedgerGet,
|
|
24
24
|
postWithRetry: mockLedgerPost,
|
|
25
|
-
|
|
25
|
+
waitForPartyAndGrantUserRights: mockLedgerGrantUserRights,
|
|
26
26
|
generateTopology: jest.fn().mockResolvedValue({
|
|
27
27
|
partyId: 'party2::mypublickey',
|
|
28
28
|
publicKeyFingerprint: 'mypublickey',
|
|
@@ -39,7 +39,7 @@ jest.unstable_mockModule('@canton-network/core-ledger-client', () => ({
|
|
|
39
39
|
describe('PartyAllocationService', () => {
|
|
40
40
|
const network = {
|
|
41
41
|
name: 'test',
|
|
42
|
-
|
|
42
|
+
id: 'network-id',
|
|
43
43
|
synchronizerId: 'sync-id',
|
|
44
44
|
description: 'desc',
|
|
45
45
|
ledgerApi: {
|
|
@@ -61,7 +61,16 @@ describe('PartyAllocationService', () => {
|
|
|
61
61
|
beforeEach(async () => {
|
|
62
62
|
const mockLogger = pino(sink());
|
|
63
63
|
const pas = await import('./party-allocation-service.js');
|
|
64
|
-
|
|
64
|
+
// Mock AccessTokenProvider
|
|
65
|
+
const mockAccessTokenProvider = {
|
|
66
|
+
getUserAccessToken: jest
|
|
67
|
+
.fn()
|
|
68
|
+
.mockResolvedValue('user.jwt'),
|
|
69
|
+
getAdminAccessToken: jest
|
|
70
|
+
.fn()
|
|
71
|
+
.mockResolvedValue('admin.jwt'),
|
|
72
|
+
};
|
|
73
|
+
service = new pas.PartyAllocationService(network.synchronizerId, mockAccessTokenProvider, network.ledgerApi.baseUrl, mockLogger);
|
|
65
74
|
});
|
|
66
75
|
it('allocates an internal party', async () => {
|
|
67
76
|
mockLedgerGet.mockResolvedValueOnce({ participantId: 'participantid' });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet-sync-service.d.ts","sourceRoot":"","sources":["../../src/ledger/wallet-sync-service.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"wallet-sync-service.d.ts","sourceRoot":"","sources":["../../src/ledger/wallet-sync-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,YAAY,EAEf,MAAM,oCAAoC,CAAA;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAE7B,MAAM,MAAM,gBAAgB,GAAG;IAC3B,KAAK,EAAE,MAAM,EAAE,CAAA;IACf,OAAO,EAAE,MAAM,EAAE,CAAA;CACpB,CAAA;AACD,qBAAa,iBAAiB;IAEtB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,WAAW;IACnB,OAAO,CAAC,MAAM;gBAHN,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,WAAW,EACxB,MAAM,EAAE,MAAM;IAGpB,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUrC,WAAW,IAAI,OAAO,CAAC,gBAAgB,CAAC;CA8FjD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright (c) 2025 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { defaultRetryableOptions } from '@canton-network/core-ledger-client
|
|
3
|
+
import { defaultRetryableOptions, } from '@canton-network/core-ledger-client';
|
|
4
4
|
export class WalletSyncService {
|
|
5
5
|
constructor(store, ledgerClient, authContext, logger) {
|
|
6
6
|
this.store = store;
|
|
@@ -64,7 +64,7 @@ export class WalletSyncService {
|
|
|
64
64
|
hint: hint,
|
|
65
65
|
publicKey: namespace,
|
|
66
66
|
namespace: namespace,
|
|
67
|
-
|
|
67
|
+
networkId: network.id,
|
|
68
68
|
signingProviderId: 'participant', // todo: determine based on partyDetails.isLocal
|
|
69
69
|
};
|
|
70
70
|
}) || [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AAkBA,OAAO,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/user-api/controller.ts"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,EAAwB,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAIH,WAAW,EAEd,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAChD,OAAO,EACH,sBAAsB,EACtB,eAAe,EAClB,MAAM,kCAAkC,CAAA;AAOzC,KAAK,uBAAuB,GAAG,OAAO,CAClC,MAAM,CAAC,eAAe,EAAE,sBAAsB,CAAC,CAClD,CAAA;AAED,eAAO,MAAM,cAAc,GACvB,YAAY,UAAU,EACtB,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,aAAa,WAAW,GAAG,SAAS,EACpC,SAAS,uBAAuB,EAChC,SAAS,MAAM;;;;;;;;;;;;;CA0dlB,CAAA"}
|