@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.
- package/dist/config/Config.d.ts +19 -15
- package/dist/config/Config.d.ts.map +1 -1
- package/dist/config/Config.js +5 -1
- package/dist/config/Config.test.js +8 -8
- package/dist/config/ConfigUtils.js +6 -6
- package/dist/dapp-api/controller.d.ts.map +1 -1
- package/dist/dapp-api/controller.js +80 -33
- package/dist/dapp-api/rpc-gen/typings.d.ts +41 -54
- package/dist/dapp-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/dapp-api/server.test.js +1 -5
- package/dist/example-config.d.ts +3 -0
- package/dist/example-config.d.ts.map +1 -1
- package/dist/example-config.js +3 -0
- package/dist/index.js +2 -2
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +12 -7
- package/dist/ledger/wallet-sync-service.test.js +3 -0
- package/dist/user-api/controller.d.ts +3 -1
- package/dist/user-api/controller.d.ts.map +1 -1
- package/dist/user-api/controller.js +123 -41
- package/dist/user-api/rpc-gen/index.d.ts +6 -0
- package/dist/user-api/rpc-gen/index.d.ts.map +1 -1
- package/dist/user-api/rpc-gen/index.js +2 -0
- package/dist/user-api/rpc-gen/typings.d.ts +37 -25
- package/dist/user-api/rpc-gen/typings.d.ts.map +1 -1
- package/dist/user-api/server.d.ts +1 -1
- package/dist/user-api/server.d.ts.map +1 -1
- package/dist/user-api/server.js +2 -2
- package/dist/user-api/server.test.js +1 -1
- package/dist/utils.d.ts +2 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/web/frontend/404/index.html +5 -5
- package/dist/web/frontend/approve/index.html +6 -6
- package/dist/web/frontend/assets/404-CKmKuu6H.js +8 -0
- package/dist/web/frontend/assets/approve-MzXNo4XO.js +17 -0
- package/dist/web/frontend/assets/callback-CcXLRr7Q.js +1 -0
- package/dist/web/frontend/assets/index-BnEARqU4.js +1679 -0
- package/dist/web/frontend/assets/{decode-CLJkuAIr.js → index-NP2zGQqX.js} +1 -1
- package/dist/web/frontend/assets/login-Btlo0Zla.js +7 -0
- package/dist/web/frontend/assets/settings-Br8FgNOa.js +37 -0
- package/dist/web/frontend/assets/{state-D-NnR2Q_.js → state-1o1CuDWy.js} +1 -1
- package/dist/web/frontend/assets/transactions-Cnu9eUFe.js +28 -0
- package/dist/web/frontend/assets/wallets-Dj5yeBJd.js +63 -0
- package/dist/web/frontend/callback/index.html +4 -4
- package/dist/web/frontend/index.html +3 -4
- package/dist/web/frontend/login/index.html +5 -5
- package/dist/web/frontend/settings/index.html +5 -5
- package/dist/web/frontend/transactions/index.html +6 -6
- package/dist/web/frontend/wallets/index.html +5 -5
- package/package.json +29 -29
- package/dist/web/frontend/assets/404-Cdu0PFS_.js +0 -16
- package/dist/web/frontend/assets/approve-B-AjC3qs.js +0 -227
- package/dist/web/frontend/assets/callback-CVGmyjFw.js +0 -1
- package/dist/web/frontend/assets/index-7OK83THX.css +0 -1
- package/dist/web/frontend/assets/index-DUTzHvwi.js +0 -1158
- package/dist/web/frontend/assets/login-BpjPKEmn.js +0 -186
- package/dist/web/frontend/assets/settings-DFCq6vOq.js +0 -28
- package/dist/web/frontend/assets/transactions-Cn8Y2p7-.js +0 -140
- 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: '
|
|
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) {
|
package/dist/init.d.ts.map
CHANGED
|
@@ -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,
|
|
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.
|
|
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.
|
|
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]: [
|
|
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":"
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
527
|
-
|
|
528
|
-
|
|
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
|
-
|
|
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
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
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;
|
|
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;
|