@canton-network/wallet-gateway-remote 0.19.0 → 0.21.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.
- package/dist/dapp-api/controller.d.ts.map +1 -1
- package/dist/dapp-api/controller.js +14 -11
- package/dist/dapp-api/rpc-gen/typings.d.ts +1 -1
- package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/init.js +2 -2
- package/dist/ledger/party-allocation-service.d.ts +1 -2
- package/dist/ledger/party-allocation-service.d.ts.map +1 -1
- package/dist/ledger/party-allocation-service.js +2 -4
- package/dist/ledger/party-allocation-service.test.js +7 -4
- package/dist/ledger/wallet-allocation/signing-providers/blockdaemon-wallet-allocator.d.ts +17 -0
- package/dist/ledger/wallet-allocation/signing-providers/blockdaemon-wallet-allocator.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/signing-providers/blockdaemon-wallet-allocator.js +146 -0
- package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.d.ts +17 -0
- package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.js +140 -0
- package/dist/ledger/wallet-allocation/signing-providers/kernel-wallet-allocator.d.ts +17 -0
- package/dist/ledger/wallet-allocation/signing-providers/kernel-wallet-allocator.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/signing-providers/kernel-wallet-allocator.js +79 -0
- package/dist/ledger/wallet-allocation/signing-providers/participant-wallet-allocator.d.ts +15 -0
- package/dist/ledger/wallet-allocation/signing-providers/participant-wallet-allocator.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/signing-providers/participant-wallet-allocator.js +37 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.d.ts +20 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.js +70 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.test.d.ts +2 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.test.d.ts.map +1 -0
- package/dist/ledger/wallet-allocation/wallet-allocation-service.test.js +301 -0
- package/dist/ledger/wallet-sync-service.d.ts +7 -12
- package/dist/ledger/wallet-sync-service.d.ts.map +1 -1
- package/dist/ledger/wallet-sync-service.js +128 -100
- package/dist/ledger/wallet-sync-service.test.js +194 -46
- package/dist/user-api/controller.d.ts +1 -0
- package/dist/user-api/controller.d.ts.map +1 -1
- package/dist/user-api/controller.js +56 -248
- package/dist/user-api/rpc-gen/index.d.ts +3 -0
- package/dist/user-api/rpc-gen/index.d.ts.map +1 -1
- package/dist/user-api/rpc-gen/index.js +1 -0
- package/dist/user-api/rpc-gen/typings.d.ts +32 -36
- package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/web/frontend/404/index.html +2 -2
- package/dist/web/frontend/approve/index.html +4 -3
- package/dist/web/frontend/assets/404-C-OWOQ3D.js +8 -0
- package/dist/web/frontend/assets/approve-CPkaFbuR.js +17 -0
- package/dist/web/frontend/assets/callback-Bev8B02C.js +1 -0
- package/dist/web/frontend/assets/index-CZYV-CqB.js +1679 -0
- package/dist/web/frontend/assets/login-D2fXBXBX.js +7 -0
- package/dist/web/frontend/assets/settings-laHcyEOv.js +37 -0
- package/dist/web/frontend/assets/{state-TjGUBiUh.js → state-BZtCpgb6.js} +1 -1
- package/dist/web/frontend/assets/transactions-n26INLpW.js +28 -0
- package/dist/web/frontend/assets/utils-DqekxUsS.js +1 -0
- package/dist/web/frontend/assets/wallets-dk9ilN4k.js +62 -0
- package/dist/web/frontend/callback/index.html +2 -2
- package/dist/web/frontend/index.html +1 -2
- package/dist/web/frontend/login/index.html +3 -3
- package/dist/web/frontend/settings/index.html +3 -3
- package/dist/web/frontend/transactions/index.html +4 -3
- package/dist/web/frontend/wallets/index.html +4 -3
- package/package.json +29 -29
- package/dist/web/frontend/assets/404-BQsvObfu.js +0 -8
- package/dist/web/frontend/assets/approve-BLORPbEM.js +0 -17
- package/dist/web/frontend/assets/callback-C7kRcm3U.js +0 -1
- package/dist/web/frontend/assets/index-DPbaEEZi.js +0 -1722
- package/dist/web/frontend/assets/login-p5H_f9In.js +0 -7
- package/dist/web/frontend/assets/settings-89wZp5vZ.js +0 -37
- package/dist/web/frontend/assets/transactions-BnROcA2_.js +0 -28
- package/dist/web/frontend/assets/wallets-TPeR2lS2.js +0 -63
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/dapp-api/controller.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"controller.d.ts","sourceRoot":"","sources":["../../src/dapp-api/controller.ts"],"names":[],"mappings":"AAGA,OAAO,EAEH,WAAW,EAEd,MAAM,kCAAkC,CAAA;AAWzC,OAAO,EAAE,KAAK,EAAe,MAAM,mCAAmC,CAAA;AAQtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAA;AAC5E,OAAO,EAAE,UAAU,IAAI,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAI7B,eAAO,MAAM,cAAc,GACvB,YAAY,gBAAgB,EAC5B,SAAS,MAAM,EACf,SAAS,MAAM,EACf,OAAO,KAAK,EACZ,qBAAqB,mBAAmB,EACxC,SAAS,MAAM,EACf,QAAQ,MAAM,GAAG,IAAI,EACrB,UAAU,WAAW;;;;;;;;;;;;;;CAuRxB,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
-
import { assertConnected } from '@canton-network/core-wallet-auth';
|
|
3
|
+
import { assertConnected, AuthTokenProvider, } from '@canton-network/core-wallet-auth';
|
|
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';
|
|
@@ -22,8 +22,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
22
22
|
const ledgerClient = new LedgerClient({
|
|
23
23
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
24
24
|
logger,
|
|
25
|
-
|
|
26
|
-
accessToken: context.accessToken,
|
|
25
|
+
accessTokenProvider: AuthTokenProvider.fromToken(context.accessToken, logger),
|
|
27
26
|
});
|
|
28
27
|
const status = await networkStatus(ledgerClient);
|
|
29
28
|
const notifier = notificationService.getNotifier(context.userId);
|
|
@@ -86,8 +85,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
86
85
|
const ledgerClient = new LedgerClient({
|
|
87
86
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
88
87
|
logger,
|
|
89
|
-
|
|
90
|
-
accessToken: assertConnected(context).accessToken,
|
|
88
|
+
accessTokenProvider: AuthTokenProvider.fromToken(assertConnected(context).accessToken, logger),
|
|
91
89
|
});
|
|
92
90
|
let result;
|
|
93
91
|
switch (params.requestMethod) {
|
|
@@ -118,8 +116,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
118
116
|
const ledgerClient = new LedgerClient({
|
|
119
117
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
120
118
|
logger,
|
|
121
|
-
|
|
122
|
-
accessToken: context.accessToken,
|
|
119
|
+
accessTokenProvider: AuthTokenProvider.fromToken(context.accessToken, logger),
|
|
123
120
|
});
|
|
124
121
|
const userId = context.userId;
|
|
125
122
|
const notifier = notificationService.getNotifier(userId);
|
|
@@ -180,8 +177,7 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
180
177
|
const ledgerClient = new LedgerClient({
|
|
181
178
|
baseUrl: new URL(network.ledgerApi.baseUrl),
|
|
182
179
|
logger,
|
|
183
|
-
|
|
184
|
-
accessToken: context.accessToken,
|
|
180
|
+
accessTokenProvider: AuthTokenProvider.fromToken(context.accessToken, logger),
|
|
185
181
|
});
|
|
186
182
|
const status = await networkStatus(ledgerClient);
|
|
187
183
|
return {
|
|
@@ -220,8 +216,15 @@ export const dappController = (kernelInfo, dappUrl, userUrl, store, notification
|
|
|
220
216
|
txChanged: async () => {
|
|
221
217
|
throw new Error('Only for events.');
|
|
222
218
|
},
|
|
223
|
-
getActiveNetwork:
|
|
224
|
-
|
|
219
|
+
getActiveNetwork: async () => {
|
|
220
|
+
const network = await store.getCurrentNetwork();
|
|
221
|
+
return {
|
|
222
|
+
networkId: network.id,
|
|
223
|
+
ledgerApi: network.ledgerApi.baseUrl,
|
|
224
|
+
...(context?.accessToken
|
|
225
|
+
? { accessToken: context.accessToken }
|
|
226
|
+
: {}),
|
|
227
|
+
};
|
|
225
228
|
},
|
|
226
229
|
signMessage: function () {
|
|
227
230
|
throw new Error('Function not implemented.');
|
|
@@ -227,7 +227,7 @@ export type PartyId = string;
|
|
|
227
227
|
* The status of the wallet.
|
|
228
228
|
*
|
|
229
229
|
*/
|
|
230
|
-
export type WalletStatus = 'initialized' | 'allocated';
|
|
230
|
+
export type WalletStatus = 'initialized' | 'allocated' | 'removed';
|
|
231
231
|
/**
|
|
232
232
|
*
|
|
233
233
|
* The party hint and name of the wallet.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAE9B;;;;GAIG;AACH,MAAM,WAAW,UAAU;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB;AACD;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAA;AAC1B;;;;GAIG;AACH,MAAM,MAAM,KAAK,GAAG,KAAK,EAAE,CAAA;AAC3B;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,KAAK,EAAE,CAAA;AAC5B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAC/B;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAA;AAC/B;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAA;AACrC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAA;AACnC;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAC9B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,gBAAgB,EAAE,gBAAgB,CAAA;IAClC,cAAc,CAAC,EAAE,cAAc,CAAA;CAClC;AACD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,iBAAiB,EAAE,CAAA;AACpD,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B;;;;GAIG;AACH,MAAM,MAAM,4BAA4B,GAAG,SAAS,EAAE,CAAA;AACtD;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAC5B,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,UAAU,GAAG,MAAM,CAAA;AAC/B;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAC5B;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,CAAA;AACtE;;;;GAIG;AACH,MAAM,MAAM,GAAG,GAAG,MAAM,CAAA;AACxB;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAC5B;;;;GAIG;AACH,MAAM,WAAW,QAAQ;IACrB,EAAE,EAAE,UAAU,CAAA;IACd,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,YAAY,CAAC,EAAE,YAAY,CAAA;IAC3B,GAAG,CAAC,EAAE,GAAG,CAAA;IACT,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AACD;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAA;AACjC;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAA;AAC3B;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,CAAA;AACxC;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAClC,MAAM,WAAW,aAAa;IAC1B,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,kBAAkB,EAAE,kBAAkB,CAAA;IACtC,aAAa,CAAC,EAAE,aAAa,CAAA;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;CACpB;AACD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAA;AACjC;;;;GAIG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAChC;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,SAAS,EAAE,SAAS,CAAA;IACpB,SAAS,CAAC,EAAE,YAAY,CAAA;IACxB,WAAW,CAAC,EAAE,WAAW,CAAA;CAC5B;AACD;;;;GAIG;AACH,MAAM,MAAM,MAAM,GAAG,MAAM,CAAA;AAC3B;;;;GAIG;AACH,MAAM,WAAW,OAAO;IACpB,WAAW,EAAE,WAAW,CAAA;IACxB,MAAM,EAAE,MAAM,CAAA;CACjB;AACD;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAC9B,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAA;AAC7B;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,CAAA;AAC7B;;;;GAIG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAA;AAC5B;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,aAAa,GAAG,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"typings.d.ts","sourceRoot":"","sources":["../../../src/dapp-api/rpc-gen/typings.ts"],"names":[],"mappings":"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"}
|
package/dist/init.js
CHANGED
|
@@ -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');
|
|
@@ -14,12 +14,11 @@ export declare class PartyAllocationService {
|
|
|
14
14
|
private logger;
|
|
15
15
|
private ledgerClient;
|
|
16
16
|
private synchronizerId;
|
|
17
|
-
constructor({ synchronizerId, accessTokenProvider, httpLedgerUrl, logger,
|
|
17
|
+
constructor({ synchronizerId, accessTokenProvider, httpLedgerUrl, logger, }: {
|
|
18
18
|
synchronizerId?: string;
|
|
19
19
|
accessTokenProvider: AccessTokenProvider;
|
|
20
20
|
httpLedgerUrl: string;
|
|
21
21
|
logger: Logger;
|
|
22
|
-
accessToken?: string;
|
|
23
22
|
});
|
|
24
23
|
/**
|
|
25
24
|
* Allocates an internal participant party for a user.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,2BAA2B,EAE9B,MAAM,oCAAoC,CAAA;AAE3C,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;IAC/B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAoB;gBAE9B,EACR,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,MAAM,
|
|
1
|
+
{"version":3,"file":"party-allocation-service.d.ts","sourceRoot":"","sources":["../../src/ledger/party-allocation-service.ts"],"names":[],"mappings":"AAGA,OAAO,EACH,2BAA2B,EAE9B,MAAM,oCAAoC,CAAA;AAE3C,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;IAC/B,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAoB;gBAE9B,EACR,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,MAAM,GACT,EAAE;QACC,cAAc,CAAC,EAAE,MAAM,CAAA;QACvB,mBAAmB,EAAE,mBAAmB,CAAA;QACxC,aAAa,EAAE,MAAM,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;KACjB;IAUD;;;;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;IAoB1B;;;OAGG;IACH,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAenD;;;;;OAKG;IACH,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAsB5D;;;;OAIG;IACG,4BAA4B,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAClB,OAAO,CAAC,2BAA2B,CAAC;IAevC;;;;;;OAMG;IACG,+BAA+B,CACjC,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC;YAgCJ,qBAAqB;YAgCrB,qBAAqB;CAsCtC"}
|
|
@@ -6,15 +6,13 @@ import { createHash } from 'node:crypto';
|
|
|
6
6
|
* This service provides an abstraction for Canton party allocation that seamlessly handles both internal and external parties.
|
|
7
7
|
*/
|
|
8
8
|
export class PartyAllocationService {
|
|
9
|
-
constructor({ synchronizerId, accessTokenProvider, httpLedgerUrl, logger,
|
|
9
|
+
constructor({ synchronizerId, accessTokenProvider, httpLedgerUrl, logger, }) {
|
|
10
10
|
this.logger = logger;
|
|
11
11
|
this.synchronizerId = synchronizerId;
|
|
12
12
|
this.ledgerClient = new LedgerClient({
|
|
13
13
|
baseUrl: new URL(httpLedgerUrl),
|
|
14
14
|
logger: this.logger,
|
|
15
|
-
|
|
16
|
-
accessToken: accessToken ?? '',
|
|
17
|
-
accessTokenProvider: accessTokenProvider,
|
|
15
|
+
accessTokenProvider,
|
|
18
16
|
});
|
|
19
17
|
}
|
|
20
18
|
async allocateParty(userId, hint, publicKey, signingCallback) {
|
|
@@ -60,12 +60,15 @@ describe('PartyAllocationService', () => {
|
|
|
60
60
|
const pas = await import('./party-allocation-service.js');
|
|
61
61
|
// Mock AccessTokenProvider
|
|
62
62
|
const mockAccessTokenProvider = {
|
|
63
|
-
|
|
64
|
-
.fn()
|
|
65
|
-
.mockResolvedValue('user.jwt'),
|
|
66
|
-
getAdminAccessToken: jest
|
|
63
|
+
getAccessToken: jest
|
|
67
64
|
.fn()
|
|
68
65
|
.mockResolvedValue('admin.jwt'),
|
|
66
|
+
getAuthContext: jest
|
|
67
|
+
.fn()
|
|
68
|
+
.mockResolvedValue({
|
|
69
|
+
userId: 'admin',
|
|
70
|
+
accessToken: 'admin.jwt',
|
|
71
|
+
}),
|
|
69
72
|
};
|
|
70
73
|
service = new pas.PartyAllocationService({
|
|
71
74
|
synchronizerId: network.synchronizerId,
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UserId } from '@canton-network/core-wallet-auth';
|
|
2
|
+
import { Store, Wallet } from '@canton-network/core-wallet-store';
|
|
3
|
+
import { SigningDriverInterface } from '@canton-network/core-signing-lib';
|
|
4
|
+
import { Logger } from 'pino';
|
|
5
|
+
import { PartyAllocationService } from '../../party-allocation-service.js';
|
|
6
|
+
import { PartyHint, Primary } from '../../../user-api/rpc-gen/typings.js';
|
|
7
|
+
import type { WalletAllocator } from '../wallet-allocation-service.js';
|
|
8
|
+
export declare class BlockdaemonWalletAllocator implements WalletAllocator {
|
|
9
|
+
private store;
|
|
10
|
+
private logger;
|
|
11
|
+
private partyAllocator;
|
|
12
|
+
private signingDriver;
|
|
13
|
+
constructor(store: Store, logger: Logger, partyAllocator: PartyAllocationService, signingDriver: SigningDriverInterface);
|
|
14
|
+
createWallet(userId: UserId, partyHint: PartyHint, primary?: Primary): Promise<Wallet>;
|
|
15
|
+
allocateParty(userId: UserId, existingWallet: Wallet): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=blockdaemon-wallet-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blockdaemon-wallet-allocator.d.ts","sourceRoot":"","sources":["../../../../src/ledger/wallet-allocation/signing-providers/blockdaemon-wallet-allocator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,KAAK,EAAgB,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAEH,sBAAsB,EAEzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAYtE,qBAAa,0BAA2B,YAAW,eAAe;IAE1D,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,aAAa;gBAHb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,sBAAsB,EACtC,aAAa,EAAE,sBAAsB;IAG3C,YAAY,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,MAAM,CAAC;IAuGZ,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CA8D7E"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { SigningProvider, } from '@canton-network/core-signing-lib';
|
|
4
|
+
import { WALLET_DISABLED_REASON } from '@canton-network/core-types';
|
|
5
|
+
function handleSigningError(result) {
|
|
6
|
+
if ('error' in result) {
|
|
7
|
+
throw new Error(`Error from signing driver: ${result.error_description}`);
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
export class BlockdaemonWalletAllocator {
|
|
12
|
+
constructor(store, logger, partyAllocator, signingDriver) {
|
|
13
|
+
this.store = store;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
this.partyAllocator = partyAllocator;
|
|
16
|
+
this.signingDriver = signingDriver;
|
|
17
|
+
}
|
|
18
|
+
async createWallet(userId, partyHint, primary = false) {
|
|
19
|
+
const driver = this.signingDriver.controller(userId);
|
|
20
|
+
const key = await driver.createKey({
|
|
21
|
+
name: partyHint,
|
|
22
|
+
});
|
|
23
|
+
if ('error' in key) {
|
|
24
|
+
throw new Error(`Failed to create key: ${key.error_description}`);
|
|
25
|
+
}
|
|
26
|
+
const namespace = this.partyAllocator.createFingerprintFromKey(key.publicKey);
|
|
27
|
+
const transactions = await this.partyAllocator.generateTopologyTransactions(partyHint, key.publicKey);
|
|
28
|
+
const topologyTransactions = transactions.topologyTransactions ?? [];
|
|
29
|
+
topologyTransactions.forEach((tx, idx) => {
|
|
30
|
+
this.logger.info(`BLOCKDAEMON: topologyTransaction[${idx}] length=${tx.length} preview=${tx.substring(0, 100)}...`);
|
|
31
|
+
});
|
|
32
|
+
const internalTxId = crypto
|
|
33
|
+
.randomUUID()
|
|
34
|
+
.replace(/-/g, '')
|
|
35
|
+
.substring(0, 16);
|
|
36
|
+
const txPayload = JSON.stringify(topologyTransactions);
|
|
37
|
+
const { status, txId } = await driver
|
|
38
|
+
.signTransaction({
|
|
39
|
+
tx: Buffer.from(txPayload).toString('base64'),
|
|
40
|
+
txHash: transactions.multiHash,
|
|
41
|
+
keyIdentifier: {
|
|
42
|
+
publicKey: key.publicKey,
|
|
43
|
+
},
|
|
44
|
+
internalTxId,
|
|
45
|
+
})
|
|
46
|
+
.then(handleSigningError);
|
|
47
|
+
const network = await this.store.getCurrentNetwork();
|
|
48
|
+
const walletBase = {
|
|
49
|
+
partyId: `${partyHint}::${namespace}`,
|
|
50
|
+
hint: partyHint,
|
|
51
|
+
namespace,
|
|
52
|
+
signingProviderId: SigningProvider.BLOCKDAEMON,
|
|
53
|
+
networkId: network.id,
|
|
54
|
+
primary,
|
|
55
|
+
publicKey: key.publicKey,
|
|
56
|
+
externalTxId: txId,
|
|
57
|
+
topologyTransactions: topologyTransactions.join(', '),
|
|
58
|
+
};
|
|
59
|
+
let wallet;
|
|
60
|
+
if (status === 'signed') {
|
|
61
|
+
const { signature } = await driver
|
|
62
|
+
.getTransaction({
|
|
63
|
+
userId,
|
|
64
|
+
txId,
|
|
65
|
+
})
|
|
66
|
+
.then(handleSigningError);
|
|
67
|
+
if (!signature) {
|
|
68
|
+
throw new Error('Transaction signed but no signature found in result');
|
|
69
|
+
}
|
|
70
|
+
const partyId = await this.partyAllocator.allocatePartyWithExistingWallet(namespace, topologyTransactions, signature, userId);
|
|
71
|
+
wallet = {
|
|
72
|
+
...walletBase,
|
|
73
|
+
partyId,
|
|
74
|
+
status: 'allocated',
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
else if (status === 'pending') {
|
|
78
|
+
wallet = {
|
|
79
|
+
...walletBase,
|
|
80
|
+
status: 'initialized',
|
|
81
|
+
reason: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_PENDING,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const reason = status === 'rejected'
|
|
86
|
+
? WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_REJECTED
|
|
87
|
+
: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_FAILED;
|
|
88
|
+
wallet = {
|
|
89
|
+
...walletBase,
|
|
90
|
+
status: 'removed',
|
|
91
|
+
disabled: true,
|
|
92
|
+
reason,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
await this.store.addWallet(wallet);
|
|
96
|
+
return wallet;
|
|
97
|
+
}
|
|
98
|
+
async allocateParty(userId, existingWallet) {
|
|
99
|
+
if (!existingWallet.externalTxId ||
|
|
100
|
+
!existingWallet.topologyTransactions) {
|
|
101
|
+
throw new Error('Existing wallet is missing field externalTxId or topologyTransactions');
|
|
102
|
+
}
|
|
103
|
+
const driver = this.signingDriver.controller(userId);
|
|
104
|
+
const { signature, status } = await driver
|
|
105
|
+
.getTransaction({
|
|
106
|
+
userId,
|
|
107
|
+
txId: existingWallet.externalTxId,
|
|
108
|
+
})
|
|
109
|
+
.then(handleSigningError);
|
|
110
|
+
let walletUpdate = {
|
|
111
|
+
partyId: existingWallet.partyId,
|
|
112
|
+
networkId: existingWallet.networkId,
|
|
113
|
+
};
|
|
114
|
+
if (status === 'signed') {
|
|
115
|
+
if (!signature) {
|
|
116
|
+
throw new Error('Transaction signed but no signature found in result');
|
|
117
|
+
}
|
|
118
|
+
const partyId = await this.partyAllocator.allocatePartyWithExistingWallet(existingWallet.namespace, existingWallet.topologyTransactions.split(', '), signature, userId);
|
|
119
|
+
walletUpdate = {
|
|
120
|
+
...walletUpdate,
|
|
121
|
+
partyId,
|
|
122
|
+
status: 'allocated',
|
|
123
|
+
reason: '',
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
else if (status === 'pending') {
|
|
127
|
+
walletUpdate = {
|
|
128
|
+
...walletUpdate,
|
|
129
|
+
status: 'initialized',
|
|
130
|
+
reason: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_PENDING,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
const reason = status === 'rejected'
|
|
135
|
+
? WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_REJECTED
|
|
136
|
+
: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_FAILED;
|
|
137
|
+
walletUpdate = {
|
|
138
|
+
...walletUpdate,
|
|
139
|
+
status: 'removed',
|
|
140
|
+
disabled: true,
|
|
141
|
+
reason,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
return this.store.updateWallet(walletUpdate);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UserId } from '@canton-network/core-wallet-auth';
|
|
2
|
+
import { Store, Wallet } from '@canton-network/core-wallet-store';
|
|
3
|
+
import { SigningDriverInterface } from '@canton-network/core-signing-lib';
|
|
4
|
+
import { Logger } from 'pino';
|
|
5
|
+
import { PartyAllocationService } from '../../party-allocation-service.js';
|
|
6
|
+
import { PartyHint, Primary } from '../../../user-api/rpc-gen/typings.js';
|
|
7
|
+
import type { WalletAllocator } from '../wallet-allocation-service.js';
|
|
8
|
+
export declare class FireblocksWalletAllocator implements WalletAllocator {
|
|
9
|
+
private store;
|
|
10
|
+
private logger;
|
|
11
|
+
private partyAllocator;
|
|
12
|
+
private signingDriver;
|
|
13
|
+
constructor(store: Store, logger: Logger, partyAllocator: PartyAllocationService, signingDriver: SigningDriverInterface);
|
|
14
|
+
createWallet(userId: UserId, partyHint: PartyHint, primary?: Primary): Promise<Wallet>;
|
|
15
|
+
allocateParty(userId: UserId, existingWallet: Wallet): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=fireblocks-wallet-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fireblocks-wallet-allocator.d.ts","sourceRoot":"","sources":["../../../../src/ledger/wallet-allocation/signing-providers/fireblocks-wallet-allocator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,KAAK,EAAgB,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAEH,sBAAsB,EAEzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAYtE,qBAAa,yBAA0B,YAAW,eAAe;IAEzD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,aAAa;gBAHb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,sBAAsB,EACtC,aAAa,EAAE,sBAAsB;IAG3C,YAAY,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,MAAM,CAAC;IA4FZ,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAkE7E"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { SigningProvider, } from '@canton-network/core-signing-lib';
|
|
4
|
+
import { WALLET_DISABLED_REASON } from '@canton-network/core-types';
|
|
5
|
+
function handleSigningError(result) {
|
|
6
|
+
if ('error' in result) {
|
|
7
|
+
throw new Error(`Error from signing driver: ${result.error_description}`);
|
|
8
|
+
}
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
export class FireblocksWalletAllocator {
|
|
12
|
+
constructor(store, logger, partyAllocator, signingDriver) {
|
|
13
|
+
this.store = store;
|
|
14
|
+
this.logger = logger;
|
|
15
|
+
this.partyAllocator = partyAllocator;
|
|
16
|
+
this.signingDriver = signingDriver;
|
|
17
|
+
}
|
|
18
|
+
async createWallet(userId, partyHint, primary = false) {
|
|
19
|
+
const driver = this.signingDriver.controller(userId);
|
|
20
|
+
const keys = await driver.getKeys().then(handleSigningError);
|
|
21
|
+
const key = keys?.keys?.find((k) => k.name === 'Canton Party');
|
|
22
|
+
if (!key)
|
|
23
|
+
throw new Error('Fireblocks key not found');
|
|
24
|
+
const formattedPublicKey = Buffer.from(key.publicKey, 'hex').toString('base64');
|
|
25
|
+
const namespace = this.partyAllocator.createFingerprintFromKey(formattedPublicKey);
|
|
26
|
+
const transactions = await this.partyAllocator.generateTopologyTransactions(partyHint, formattedPublicKey);
|
|
27
|
+
const topologyTransactions = transactions.topologyTransactions ?? [];
|
|
28
|
+
const { status, txId } = await driver
|
|
29
|
+
.signTransaction({
|
|
30
|
+
tx: '',
|
|
31
|
+
txHash: Buffer.from(transactions.multiHash, 'base64').toString('hex'),
|
|
32
|
+
keyIdentifier: {
|
|
33
|
+
publicKey: key.publicKey,
|
|
34
|
+
},
|
|
35
|
+
})
|
|
36
|
+
.then(handleSigningError);
|
|
37
|
+
const network = await this.store.getCurrentNetwork();
|
|
38
|
+
const walletBase = {
|
|
39
|
+
partyId: `${partyHint}::${namespace}`,
|
|
40
|
+
hint: partyHint,
|
|
41
|
+
namespace,
|
|
42
|
+
signingProviderId: SigningProvider.FIREBLOCKS,
|
|
43
|
+
networkId: network.id,
|
|
44
|
+
primary,
|
|
45
|
+
publicKey: key.publicKey,
|
|
46
|
+
externalTxId: txId,
|
|
47
|
+
topologyTransactions: topologyTransactions.join(', '),
|
|
48
|
+
};
|
|
49
|
+
let wallet;
|
|
50
|
+
if (status === 'signed') {
|
|
51
|
+
const { signature } = await driver
|
|
52
|
+
.getTransaction({
|
|
53
|
+
userId,
|
|
54
|
+
txId,
|
|
55
|
+
})
|
|
56
|
+
.then(handleSigningError);
|
|
57
|
+
if (!signature) {
|
|
58
|
+
throw new Error('Transaction signed but no signature found in result');
|
|
59
|
+
}
|
|
60
|
+
const partyId = await this.partyAllocator.allocatePartyWithExistingWallet(namespace, topologyTransactions, Buffer.from(signature, 'hex').toString('base64'), userId);
|
|
61
|
+
wallet = {
|
|
62
|
+
...walletBase,
|
|
63
|
+
partyId,
|
|
64
|
+
status: 'allocated',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
else if (status === 'pending') {
|
|
68
|
+
wallet = {
|
|
69
|
+
...walletBase,
|
|
70
|
+
status: 'initialized',
|
|
71
|
+
reason: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_PENDING,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
const reason = status === 'rejected'
|
|
76
|
+
? WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_REJECTED
|
|
77
|
+
: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_FAILED;
|
|
78
|
+
wallet = {
|
|
79
|
+
...walletBase,
|
|
80
|
+
status: 'removed',
|
|
81
|
+
disabled: true,
|
|
82
|
+
reason,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
await this.store.addWallet(wallet);
|
|
86
|
+
return wallet;
|
|
87
|
+
}
|
|
88
|
+
async allocateParty(userId, existingWallet) {
|
|
89
|
+
if (!existingWallet.externalTxId ||
|
|
90
|
+
!existingWallet.topologyTransactions) {
|
|
91
|
+
throw new Error('Existing wallet is missing field externalTxId or topologyTransactions');
|
|
92
|
+
}
|
|
93
|
+
const driver = this.signingDriver.controller(userId);
|
|
94
|
+
const keys = await driver.getKeys().then(handleSigningError);
|
|
95
|
+
const key = keys?.keys?.find((k) => k.name === 'Canton Party');
|
|
96
|
+
if (!key)
|
|
97
|
+
throw new Error('Fireblocks key not found');
|
|
98
|
+
const { signature, status } = await driver
|
|
99
|
+
.getTransaction({
|
|
100
|
+
userId,
|
|
101
|
+
txId: existingWallet.externalTxId,
|
|
102
|
+
})
|
|
103
|
+
.then(handleSigningError);
|
|
104
|
+
let walletUpdate = {
|
|
105
|
+
partyId: existingWallet.partyId,
|
|
106
|
+
networkId: existingWallet.networkId,
|
|
107
|
+
};
|
|
108
|
+
if (status === 'signed') {
|
|
109
|
+
if (!signature) {
|
|
110
|
+
throw new Error('Transaction signed but no signature found in result');
|
|
111
|
+
}
|
|
112
|
+
const partyId = await this.partyAllocator.allocatePartyWithExistingWallet(existingWallet.namespace, existingWallet.topologyTransactions.split(', '), Buffer.from(signature, 'hex').toString('base64'), userId);
|
|
113
|
+
walletUpdate = {
|
|
114
|
+
...walletUpdate,
|
|
115
|
+
partyId,
|
|
116
|
+
status: 'allocated',
|
|
117
|
+
reason: '',
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
else if (status === 'pending') {
|
|
121
|
+
walletUpdate = {
|
|
122
|
+
...walletUpdate,
|
|
123
|
+
status: 'initialized',
|
|
124
|
+
reason: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_PENDING,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
const reason = status === 'rejected'
|
|
129
|
+
? WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_REJECTED
|
|
130
|
+
: WALLET_DISABLED_REASON.TOPOLOGY_TRANSACTION_FAILED;
|
|
131
|
+
walletUpdate = {
|
|
132
|
+
...walletUpdate,
|
|
133
|
+
status: 'removed',
|
|
134
|
+
disabled: true,
|
|
135
|
+
reason,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
return this.store.updateWallet(walletUpdate);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { UserId } from '@canton-network/core-wallet-auth';
|
|
2
|
+
import { Store, Wallet } from '@canton-network/core-wallet-store';
|
|
3
|
+
import { SigningDriverInterface } from '@canton-network/core-signing-lib';
|
|
4
|
+
import { Logger } from 'pino';
|
|
5
|
+
import { PartyAllocationService } from '../../party-allocation-service.js';
|
|
6
|
+
import { PartyHint, Primary } from '../../../user-api/rpc-gen/typings.js';
|
|
7
|
+
import type { WalletAllocator } from '../wallet-allocation-service.js';
|
|
8
|
+
export declare class KernelWalletAllocator implements WalletAllocator {
|
|
9
|
+
private store;
|
|
10
|
+
private logger;
|
|
11
|
+
private partyAllocator;
|
|
12
|
+
private signingDriver;
|
|
13
|
+
constructor(store: Store, logger: Logger, partyAllocator: PartyAllocationService, signingDriver: SigningDriverInterface);
|
|
14
|
+
createWallet(userId: UserId, partyHint: PartyHint, primary?: Primary): Promise<Wallet>;
|
|
15
|
+
allocateParty(userId: UserId, existingWallet: Wallet): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=kernel-wallet-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel-wallet-allocator.d.ts","sourceRoot":"","sources":["../../../../src/ledger/wallet-allocation/signing-providers/kernel-wallet-allocator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,KAAK,EAAgB,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAC/E,OAAO,EAEH,sBAAsB,EAEzB,MAAM,kCAAkC,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAUtE,qBAAa,qBAAsB,YAAW,eAAe;IAErD,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;IACtB,OAAO,CAAC,aAAa;gBAHb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,sBAAsB,EACtC,aAAa,EAAE,sBAAsB;IAG3C,YAAY,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,MAAM,CAAC;IAgDZ,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAiC7E"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
// Copyright (c) 2025-2026 Digital Asset (Switzerland) GmbH and/or its affiliates. All rights reserved.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
import { SigningProvider, } from '@canton-network/core-signing-lib';
|
|
4
|
+
function handleSigningError(result) {
|
|
5
|
+
if ('error' in result) {
|
|
6
|
+
throw new Error(`Error from signing driver: ${result.error_description}`);
|
|
7
|
+
}
|
|
8
|
+
return result;
|
|
9
|
+
}
|
|
10
|
+
export class KernelWalletAllocator {
|
|
11
|
+
constructor(store, logger, partyAllocator, signingDriver) {
|
|
12
|
+
this.store = store;
|
|
13
|
+
this.logger = logger;
|
|
14
|
+
this.partyAllocator = partyAllocator;
|
|
15
|
+
this.signingDriver = signingDriver;
|
|
16
|
+
}
|
|
17
|
+
async createWallet(userId, partyHint, primary = false) {
|
|
18
|
+
const driver = this.signingDriver.controller(userId);
|
|
19
|
+
const key = await driver
|
|
20
|
+
.createKey({
|
|
21
|
+
name: partyHint,
|
|
22
|
+
})
|
|
23
|
+
.then(handleSigningError);
|
|
24
|
+
const party = await this.partyAllocator.allocateParty(userId, partyHint, key.publicKey, async (hash) => {
|
|
25
|
+
const { signature } = await driver
|
|
26
|
+
.signTransaction({
|
|
27
|
+
tx: '',
|
|
28
|
+
txHash: hash,
|
|
29
|
+
keyIdentifier: {
|
|
30
|
+
publicKey: key.publicKey,
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
.then(handleSigningError);
|
|
34
|
+
if (!signature) {
|
|
35
|
+
throw new Error('No signature returned from signing driver');
|
|
36
|
+
}
|
|
37
|
+
return signature;
|
|
38
|
+
});
|
|
39
|
+
const network = await this.store.getCurrentNetwork();
|
|
40
|
+
const wallet = {
|
|
41
|
+
partyId: party.partyId,
|
|
42
|
+
hint: party.hint,
|
|
43
|
+
namespace: party.namespace,
|
|
44
|
+
signingProviderId: SigningProvider.WALLET_KERNEL,
|
|
45
|
+
networkId: network.id,
|
|
46
|
+
status: 'allocated',
|
|
47
|
+
primary,
|
|
48
|
+
publicKey: key.publicKey,
|
|
49
|
+
externalTxId: '',
|
|
50
|
+
topologyTransactions: '',
|
|
51
|
+
};
|
|
52
|
+
await this.store.addWallet(wallet);
|
|
53
|
+
return wallet;
|
|
54
|
+
}
|
|
55
|
+
async allocateParty(userId, existingWallet) {
|
|
56
|
+
const driver = this.signingDriver.controller(userId);
|
|
57
|
+
const signingCallback = async (hash) => {
|
|
58
|
+
const result = await driver
|
|
59
|
+
.signTransaction({
|
|
60
|
+
tx: '',
|
|
61
|
+
txHash: hash,
|
|
62
|
+
keyIdentifier: { publicKey: existingWallet.publicKey },
|
|
63
|
+
})
|
|
64
|
+
.then(handleSigningError);
|
|
65
|
+
if (!result.signature) {
|
|
66
|
+
throw new Error('No signature returned from signing driver');
|
|
67
|
+
}
|
|
68
|
+
return result.signature;
|
|
69
|
+
};
|
|
70
|
+
const party = await this.partyAllocator.allocateParty(userId, existingWallet.hint, existingWallet.publicKey, signingCallback);
|
|
71
|
+
const network = await this.store.getCurrentNetwork();
|
|
72
|
+
const updateWallet = {
|
|
73
|
+
networkId: network.id,
|
|
74
|
+
partyId: party.partyId,
|
|
75
|
+
status: 'allocated',
|
|
76
|
+
};
|
|
77
|
+
return await this.store.updateWallet(updateWallet);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { UserId } from '@canton-network/core-wallet-auth';
|
|
2
|
+
import { Store, Wallet } from '@canton-network/core-wallet-store';
|
|
3
|
+
import { Logger } from 'pino';
|
|
4
|
+
import { PartyAllocationService } from '../../party-allocation-service.js';
|
|
5
|
+
import { PartyHint, Primary } from '../../../user-api/rpc-gen/typings.js';
|
|
6
|
+
import type { WalletAllocator } from '../wallet-allocation-service.js';
|
|
7
|
+
export declare class ParticipantWalletAllocator implements WalletAllocator {
|
|
8
|
+
private store;
|
|
9
|
+
private logger;
|
|
10
|
+
private partyAllocator;
|
|
11
|
+
constructor(store: Store, logger: Logger, partyAllocator: PartyAllocationService);
|
|
12
|
+
createWallet(userId: UserId, partyHint: PartyHint, primary?: Primary): Promise<Wallet>;
|
|
13
|
+
allocateParty(userId: UserId, existingWallet: Wallet): Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=participant-wallet-allocator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participant-wallet-allocator.d.ts","sourceRoot":"","sources":["../../../../src/ledger/wallet-allocation/signing-providers/participant-wallet-allocator.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,kCAAkC,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAA;AAEjE,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAA;AAC7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,sCAAsC,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAA;AAEtE,qBAAa,0BAA2B,YAAW,eAAe;IAE1D,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,MAAM;IACd,OAAO,CAAC,cAAc;gBAFd,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,sBAAsB;IAG5C,YAAY,CACd,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE,OAAe,GACzB,OAAO,CAAC,MAAM,CAAC;IAmBZ,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAY7E"}
|