@hashgraph/hedera-wallet-connect 1.3.2-0 → 1.3.2
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +4 -4
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +20 -0
- package/dist/{types/src → src}/lib/dapp/DAppSigner.d.ts +0 -1
- package/dist/src/lib/dapp/DAppSigner.js +214 -0
- package/dist/{types/src → src}/lib/dapp/index.d.ts +0 -1
- package/dist/src/lib/dapp/index.js +431 -0
- package/dist/{types/src → src}/lib/index.d.ts +0 -1
- package/dist/src/lib/index.js +22 -0
- package/dist/{types/src → src}/lib/shared/chainIds.d.ts +0 -1
- package/dist/src/lib/shared/chainIds.js +31 -0
- package/dist/{types/src → src}/lib/shared/errors.d.ts +0 -1
- package/dist/src/lib/shared/errors.js +51 -0
- package/dist/{types/src → src}/lib/shared/events.d.ts +0 -1
- package/dist/src/lib/shared/events.js +27 -0
- package/dist/{types/src → src}/lib/shared/extensionController.d.ts +0 -1
- package/dist/src/lib/shared/extensionController.js +42 -0
- package/dist/{types/src → src}/lib/shared/index.d.ts +0 -1
- package/dist/src/lib/shared/index.js +26 -0
- package/dist/{types/src → src}/lib/shared/methods.d.ts +0 -1
- package/dist/src/lib/shared/methods.js +32 -0
- package/dist/{types/src → src}/lib/shared/payloads.d.ts +0 -1
- package/dist/src/lib/shared/payloads.js +20 -0
- package/dist/{types/src → src}/lib/shared/utils.d.ts +0 -1
- package/dist/src/lib/shared/utils.js +424 -0
- package/dist/{types/src → src}/lib/wallet/index.d.ts +0 -1
- package/dist/src/lib/wallet/index.js +301 -0
- package/dist/{types/src → src}/lib/wallet/provider.d.ts +0 -1
- package/dist/src/lib/wallet/provider.js +58 -0
- package/dist/{types/src → src}/lib/wallet/types.d.ts +0 -1
- package/dist/src/lib/wallet/types.js +20 -0
- package/dist/{types/test → test}/_helpers.d.ts +0 -1
- package/dist/test/_helpers.js +95 -0
- package/dist/test/dapp/DAppConnector.test.d.ts +1 -0
- package/dist/test/dapp/DAppConnector.test.js +236 -0
- package/dist/test/dapp/DAppSigner.test.d.ts +1 -0
- package/dist/test/dapp/DAppSigner.test.js +155 -0
- package/dist/test/utils.test.d.ts +1 -0
- package/dist/test/utils.test.js +202 -0
- package/dist/test/wallet/methods/wallet-executeTransaction.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-executeTransaction.test.js +43 -0
- package/dist/test/wallet/methods/wallet-getNodeAddresses.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-getNodeAddresses.test.js +40 -0
- package/dist/test/wallet/methods/wallet-signAndExecuteQuery.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-signAndExecuteQuery.test.js +41 -0
- package/dist/test/wallet/methods/wallet-signAndExecuteTransaction.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-signAndExecuteTransaction.test.js +48 -0
- package/dist/test/wallet/methods/wallet-signMessage.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-signMessage.test.js +60 -0
- package/dist/test/wallet/methods/wallet-signTransaction.test.d.ts +1 -0
- package/dist/test/wallet/methods/wallet-signTransaction.test.js +45 -0
- package/dist/test/wallet/wallet-init.test.d.ts +1 -0
- package/dist/test/wallet/wallet-init.test.js +53 -0
- package/package.json +11 -19
- package/dist/browser-cjs-metafile.json +0 -1
- package/dist/browser-cjs.js +0 -250
- package/dist/browser-esm-metafile.json +0 -1
- package/dist/browser-esm.js +0 -250
- package/dist/node-cjs-metafile.json +0 -1
- package/dist/node-cjs.js +0 -11404
- package/dist/node-esm-metafile.json +0 -1
- package/dist/node-esm.js +0 -11404
- package/dist/types/src/index.d.ts +0 -2
- package/dist/types/src/index.d.ts.map +0 -1
- package/dist/types/src/lib/dapp/DAppSigner.d.ts.map +0 -1
- package/dist/types/src/lib/dapp/index.d.ts.map +0 -1
- package/dist/types/src/lib/index.d.ts.map +0 -1
- package/dist/types/src/lib/shared/chainIds.d.ts.map +0 -1
- package/dist/types/src/lib/shared/errors.d.ts.map +0 -1
- package/dist/types/src/lib/shared/events.d.ts.map +0 -1
- package/dist/types/src/lib/shared/extensionController.d.ts.map +0 -1
- package/dist/types/src/lib/shared/index.d.ts.map +0 -1
- package/dist/types/src/lib/shared/methods.d.ts.map +0 -1
- package/dist/types/src/lib/shared/payloads.d.ts.map +0 -1
- package/dist/types/src/lib/shared/utils.d.ts.map +0 -1
- package/dist/types/src/lib/wallet/index.d.ts.map +0 -1
- package/dist/types/src/lib/wallet/provider.d.ts.map +0 -1
- package/dist/types/src/lib/wallet/types.d.ts.map +0 -1
- package/dist/types/test/_helpers.d.ts.map +0 -1
- package/dist/types/test/dapp/DAppConnector.test.d.ts +0 -2
- package/dist/types/test/dapp/DAppConnector.test.d.ts.map +0 -1
- package/dist/types/test/dapp/DAppSigner.test.d.ts +0 -2
- package/dist/types/test/dapp/DAppSigner.test.d.ts.map +0 -1
- package/dist/types/test/utils.test.d.ts +0 -2
- package/dist/types/test/utils.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-executeTransaction.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-executeTransaction.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-getNodeAddresses.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-getNodeAddresses.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-signAndExecuteQuery.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-signAndExecuteQuery.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-signAndExecuteTransaction.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-signAndExecuteTransaction.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-signMessage.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-signMessage.test.d.ts.map +0 -1
- package/dist/types/test/wallet/methods/wallet-signTransaction.test.d.ts +0 -2
- package/dist/types/test/wallet/methods/wallet-signTransaction.test.d.ts.map +0 -1
- package/dist/types/test/wallet/wallet-init.test.d.ts +0 -2
- package/dist/types/test/wallet/wallet-init.test.d.ts.map +0 -1
@@ -0,0 +1,431 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
import { LedgerId } from '@hashgraph/sdk';
|
21
|
+
import QRCodeModal from '@walletconnect/qrcode-modal';
|
22
|
+
import { WalletConnectModal } from '@walletconnect/modal';
|
23
|
+
import SignClient from '@walletconnect/sign-client';
|
24
|
+
import { getSdkError } from '@walletconnect/utils';
|
25
|
+
import { HederaJsonRpcMethod, accountAndLedgerFromSession, networkNamespaces, extensionConnect, findExtensions, } from '../shared';
|
26
|
+
import { DAppSigner } from './DAppSigner';
|
27
|
+
export * from './DAppSigner';
|
28
|
+
export class DAppConnector {
|
29
|
+
/**
|
30
|
+
* Initializes the DAppConnector instance.
|
31
|
+
* @param metadata - SignClientTypes.Metadata object for the DApp metadata.
|
32
|
+
* @param network - LedgerId representing the network (default: LedgerId.TESTNET).
|
33
|
+
* @param projectId - Project ID for the WalletConnect client.
|
34
|
+
* @param methods - Array of supported methods for the DApp (optional).
|
35
|
+
* @param events - Array of supported events for the DApp (optional).
|
36
|
+
* @param chains - Array of supported chains for the DApp (optional).
|
37
|
+
*/
|
38
|
+
constructor(metadata, network, projectId, methods, events, chains) {
|
39
|
+
this.network = LedgerId.TESTNET;
|
40
|
+
this.supportedMethods = [];
|
41
|
+
this.supportedEvents = [];
|
42
|
+
this.supportedChains = [];
|
43
|
+
this.extensions = [];
|
44
|
+
this.onSessionIframeCreated = null;
|
45
|
+
this.signers = [];
|
46
|
+
this.isInitializing = false;
|
47
|
+
this.abortableConnect = async (callback) => {
|
48
|
+
return new Promise(async (resolve, reject) => {
|
49
|
+
const pairTimeoutMs = 480000;
|
50
|
+
const timeout = setTimeout(() => {
|
51
|
+
QRCodeModal.close();
|
52
|
+
reject(new Error(`Connect timed out after ${pairTimeoutMs}(ms)`));
|
53
|
+
}, pairTimeoutMs);
|
54
|
+
try {
|
55
|
+
return resolve(await callback());
|
56
|
+
}
|
57
|
+
catch (error) {
|
58
|
+
reject(error);
|
59
|
+
}
|
60
|
+
finally {
|
61
|
+
clearTimeout(timeout);
|
62
|
+
}
|
63
|
+
});
|
64
|
+
};
|
65
|
+
this.dAppMetadata = metadata;
|
66
|
+
this.network = network;
|
67
|
+
this.projectId = projectId;
|
68
|
+
this.supportedMethods = methods !== null && methods !== void 0 ? methods : Object.values(HederaJsonRpcMethod);
|
69
|
+
this.supportedEvents = events !== null && events !== void 0 ? events : [];
|
70
|
+
this.supportedChains = chains !== null && chains !== void 0 ? chains : [];
|
71
|
+
this.extensions = [];
|
72
|
+
this.walletConnectModal = new WalletConnectModal({
|
73
|
+
projectId: projectId,
|
74
|
+
chains: chains,
|
75
|
+
});
|
76
|
+
findExtensions((metadata, isIframe) => {
|
77
|
+
this.extensions.push(Object.assign(Object.assign({}, metadata), { available: true, availableInIframe: isIframe }));
|
78
|
+
});
|
79
|
+
}
|
80
|
+
/**
|
81
|
+
* Initializes the DAppConnector instance.
|
82
|
+
* @param logger - `BaseLogger` for logging purposes (optional).
|
83
|
+
*/
|
84
|
+
async init({ logger } = {}) {
|
85
|
+
try {
|
86
|
+
this.isInitializing = true;
|
87
|
+
if (!this.projectId) {
|
88
|
+
throw new Error('Project ID is not defined');
|
89
|
+
}
|
90
|
+
this.walletConnectClient = await SignClient.init({
|
91
|
+
logger,
|
92
|
+
relayUrl: 'wss://relay.walletconnect.com',
|
93
|
+
projectId: this.projectId,
|
94
|
+
metadata: this.dAppMetadata,
|
95
|
+
});
|
96
|
+
const existingSessions = this.walletConnectClient.session.getAll();
|
97
|
+
if (existingSessions.length > 0)
|
98
|
+
this.signers = existingSessions.flatMap((session) => this.createSigners(session));
|
99
|
+
else
|
100
|
+
this.checkIframeConnect();
|
101
|
+
this.walletConnectClient.on('session_event', (event) => {
|
102
|
+
// Handle session events, such as "chainChanged", "accountsChanged", etc.
|
103
|
+
console.log(event);
|
104
|
+
});
|
105
|
+
this.walletConnectClient.on('session_update', ({ topic, params }) => {
|
106
|
+
// Handle session update
|
107
|
+
const { namespaces } = params;
|
108
|
+
const _session = this.walletConnectClient.session.get(topic);
|
109
|
+
// Overwrite the `namespaces` of the existing session with the incoming one.
|
110
|
+
const updatedSession = Object.assign(Object.assign({}, _session), { namespaces });
|
111
|
+
// Integrate the updated session state into your dapp state.
|
112
|
+
console.log(updatedSession);
|
113
|
+
});
|
114
|
+
this.walletConnectClient.on('session_delete', (pairing) => {
|
115
|
+
console.log(pairing);
|
116
|
+
this.signers = this.signers.filter((signer) => signer.topic !== pairing.topic);
|
117
|
+
this.disconnect(pairing.topic);
|
118
|
+
// Session was deleted -> reset the dapp state, clean up from user session, etc.
|
119
|
+
console.log('Dapp: Session deleted by wallet!');
|
120
|
+
});
|
121
|
+
this.walletConnectClient.core.pairing.events.on('pairing_delete', (pairing) => {
|
122
|
+
// Session was deleted
|
123
|
+
console.log(pairing);
|
124
|
+
this.signers = this.signers.filter((signer) => signer.topic !== pairing.topic);
|
125
|
+
this.disconnect(pairing.topic);
|
126
|
+
console.log(`Dapp: Pairing deleted by wallet!`);
|
127
|
+
// clean up after the pairing for `topic` was deleted.
|
128
|
+
});
|
129
|
+
}
|
130
|
+
finally {
|
131
|
+
this.isInitializing = false;
|
132
|
+
}
|
133
|
+
}
|
134
|
+
getSigner(accountId) {
|
135
|
+
const signer = this.signers.find((signer) => signer.getAccountId().equals(accountId));
|
136
|
+
if (!signer)
|
137
|
+
throw new Error('Signer is not found for this accountId');
|
138
|
+
return signer;
|
139
|
+
}
|
140
|
+
/**
|
141
|
+
* Initiates the WalletConnect connection flow using a QR code.
|
142
|
+
* @param pairingTopic - The pairing topic for the connection (optional).
|
143
|
+
* @returns A Promise that resolves when the connection process is complete.
|
144
|
+
*/
|
145
|
+
async connectQR(pairingTopic) {
|
146
|
+
return this.abortableConnect(async () => {
|
147
|
+
try {
|
148
|
+
const { uri, approval } = await this.connectURI(pairingTopic);
|
149
|
+
if (!uri)
|
150
|
+
throw new Error('URI is not defined');
|
151
|
+
QRCodeModal.open(uri, () => {
|
152
|
+
throw new Error('User rejected pairing');
|
153
|
+
});
|
154
|
+
await this.onSessionConnected(await approval());
|
155
|
+
}
|
156
|
+
finally {
|
157
|
+
QRCodeModal.close();
|
158
|
+
}
|
159
|
+
});
|
160
|
+
}
|
161
|
+
/**
|
162
|
+
* Initiates the WalletConnect connection flow using a QR code.
|
163
|
+
* @param pairingTopic - The pairing topic for the connection (optional).
|
164
|
+
* @returns {Promise<SessionTypes.Struct>} - A Promise that resolves when the connection process is complete.
|
165
|
+
*/
|
166
|
+
async openModal(pairingTopic) {
|
167
|
+
try {
|
168
|
+
const { uri, approval } = await this.connectURI(pairingTopic);
|
169
|
+
this.walletConnectModal.openModal({ uri });
|
170
|
+
const session = await approval();
|
171
|
+
await this.onSessionConnected(session);
|
172
|
+
return session;
|
173
|
+
}
|
174
|
+
finally {
|
175
|
+
this.walletConnectModal.closeModal();
|
176
|
+
}
|
177
|
+
}
|
178
|
+
/**
|
179
|
+
* Initiates the WallecConnect connection flow using URI.
|
180
|
+
* @param pairingTopic - The pairing topic for the connection (optional).
|
181
|
+
* @param extensionId - The id for the extension used to connect (optional).
|
182
|
+
* @returns A Promise that resolves when the connection process is complete.
|
183
|
+
*/
|
184
|
+
async connect(launchCallback, pairingTopic, extensionId) {
|
185
|
+
return this.abortableConnect(async () => {
|
186
|
+
var _a;
|
187
|
+
const { uri, approval } = await this.connectURI(pairingTopic);
|
188
|
+
if (!uri)
|
189
|
+
throw new Error('URI is not defined');
|
190
|
+
launchCallback(uri);
|
191
|
+
const session = await approval();
|
192
|
+
if (extensionId) {
|
193
|
+
const sessionProperties = Object.assign(Object.assign({}, session.sessionProperties), { extensionId });
|
194
|
+
session.sessionProperties = sessionProperties;
|
195
|
+
await ((_a = this.walletConnectClient) === null || _a === void 0 ? void 0 : _a.session.update(session.topic, {
|
196
|
+
sessionProperties,
|
197
|
+
}));
|
198
|
+
}
|
199
|
+
await this.onSessionConnected(session);
|
200
|
+
return session;
|
201
|
+
});
|
202
|
+
}
|
203
|
+
/**
|
204
|
+
* Initiates the WallecConnect connection flow sending a message to the extension.
|
205
|
+
* @param extensionId - The id for the extension used to connect.
|
206
|
+
* @param pairingTopic - The pairing topic for the connection (optional).
|
207
|
+
* @returns A Promise that resolves when the connection process is complete.
|
208
|
+
*/
|
209
|
+
async connectExtension(extensionId, pairingTopic) {
|
210
|
+
const extension = this.extensions.find((ext) => ext.id === extensionId);
|
211
|
+
if (!extension || !extension.available)
|
212
|
+
throw new Error('Extension is not available');
|
213
|
+
return this.connect((uri) => {
|
214
|
+
extensionConnect(extension.id, extension.availableInIframe, uri);
|
215
|
+
}, pairingTopic, extension.availableInIframe ? undefined : extensionId);
|
216
|
+
}
|
217
|
+
/**
|
218
|
+
* Initiates the WallecConnect connection if the wallet in iframe mode is detected.
|
219
|
+
*/
|
220
|
+
async checkIframeConnect() {
|
221
|
+
const extension = this.extensions.find((ext) => ext.availableInIframe);
|
222
|
+
if (extension) {
|
223
|
+
const session = await this.connectExtension(extension.id);
|
224
|
+
if (this.onSessionIframeCreated)
|
225
|
+
this.onSessionIframeCreated(session);
|
226
|
+
}
|
227
|
+
}
|
228
|
+
/**
|
229
|
+
* Disconnects the current session associated with the specified topic.
|
230
|
+
* @param topic - The topic of the session to disconnect.
|
231
|
+
* @returns A Promise that resolves when the session is disconnected.
|
232
|
+
*/
|
233
|
+
async disconnect(topic) {
|
234
|
+
await this.walletConnectClient.disconnect({
|
235
|
+
topic: topic,
|
236
|
+
reason: getSdkError('USER_DISCONNECTED'),
|
237
|
+
});
|
238
|
+
}
|
239
|
+
/**
|
240
|
+
* Disconnects all active sessions and pairings.
|
241
|
+
*
|
242
|
+
* Throws error when WalletConnect is not initialized or there are no active sessions/pairings.
|
243
|
+
* @returns A Promise that resolves when all active sessions and pairings are disconnected.
|
244
|
+
*/
|
245
|
+
async disconnectAll() {
|
246
|
+
if (!this.walletConnectClient) {
|
247
|
+
throw new Error('WalletConnect is not initialized');
|
248
|
+
}
|
249
|
+
const sessions = this.walletConnectClient.session.getAll();
|
250
|
+
const pairings = this.walletConnectClient.core.pairing.getPairings();
|
251
|
+
if (!(sessions === null || sessions === void 0 ? void 0 : sessions.length) && !(pairings === null || pairings === void 0 ? void 0 : pairings.length)) {
|
252
|
+
throw new Error('There is no active session/pairing. Connect to the wallet at first.');
|
253
|
+
}
|
254
|
+
const disconnectionPromises = [];
|
255
|
+
// disconnect sessions
|
256
|
+
for (const session of this.walletConnectClient.session.getAll()) {
|
257
|
+
console.log(`Disconnecting from session: ${session}`);
|
258
|
+
const promise = this.disconnect(session.topic);
|
259
|
+
disconnectionPromises.push(promise);
|
260
|
+
}
|
261
|
+
// disconnect pairings
|
262
|
+
//https://docs.walletconnect.com/api/core/pairing
|
263
|
+
for (const pairing of pairings) {
|
264
|
+
const promise = this.disconnect(pairing.topic);
|
265
|
+
disconnectionPromises.push(promise);
|
266
|
+
}
|
267
|
+
await Promise.all(disconnectionPromises);
|
268
|
+
this.signers = [];
|
269
|
+
}
|
270
|
+
createSigners(session) {
|
271
|
+
const allNamespaceAccounts = accountAndLedgerFromSession(session);
|
272
|
+
return allNamespaceAccounts.map(({ account, network }) => {
|
273
|
+
var _a;
|
274
|
+
return new DAppSigner(account, this.walletConnectClient, session.topic, network, (_a = session.sessionProperties) === null || _a === void 0 ? void 0 : _a.extensionId);
|
275
|
+
});
|
276
|
+
}
|
277
|
+
async onSessionConnected(session) {
|
278
|
+
this.signers.push(...this.createSigners(session));
|
279
|
+
}
|
280
|
+
async connectURI(pairingTopic) {
|
281
|
+
if (!this.walletConnectClient) {
|
282
|
+
throw new Error('WalletConnect is not initialized');
|
283
|
+
}
|
284
|
+
return this.walletConnectClient.connect({
|
285
|
+
pairingTopic,
|
286
|
+
requiredNamespaces: networkNamespaces(this.network, this.supportedMethods, this.supportedEvents),
|
287
|
+
});
|
288
|
+
}
|
289
|
+
async request({ method, params, }) {
|
290
|
+
const signer = this.signers[this.signers.length - 1];
|
291
|
+
if (!signer) {
|
292
|
+
throw new Error('There is no active session. Connect to the wallet at first.');
|
293
|
+
}
|
294
|
+
return await signer.request({
|
295
|
+
method: method,
|
296
|
+
params: params,
|
297
|
+
});
|
298
|
+
}
|
299
|
+
/**
|
300
|
+
* Retrieves the node addresses associated with the current Hedera network.
|
301
|
+
*
|
302
|
+
* When there is no active session or an error occurs during the request.
|
303
|
+
* @returns Promise\<{@link GetNodeAddressesResult}\>
|
304
|
+
*/
|
305
|
+
async getNodeAddresses() {
|
306
|
+
return await this.request({
|
307
|
+
method: HederaJsonRpcMethod.GetNodeAddresses,
|
308
|
+
params: undefined,
|
309
|
+
});
|
310
|
+
}
|
311
|
+
/**
|
312
|
+
* Executes a transaction on the Hedera network.
|
313
|
+
*
|
314
|
+
* @param {ExecuteTransactionParams} params - The parameters of type {@link ExecuteTransactionParams | `ExecuteTransactionParams`} required for the transaction execution.
|
315
|
+
* @param {string[]} params.signedTransaction - Array of Base64-encoded `Transaction`'s
|
316
|
+
* @returns Promise\<{@link ExecuteTransactionResult}\>
|
317
|
+
* @example
|
318
|
+
* Use helper `transactionToBase64String` to encode `Transaction` to Base64 string
|
319
|
+
* ```ts
|
320
|
+
* const params = {
|
321
|
+
* signedTransaction: [transactionToBase64String(transaction)]
|
322
|
+
* }
|
323
|
+
*
|
324
|
+
* const result = await dAppConnector.executeTransaction(params)
|
325
|
+
* ```
|
326
|
+
*/
|
327
|
+
async executeTransaction(params) {
|
328
|
+
return await this.request({
|
329
|
+
method: HederaJsonRpcMethod.ExecuteTransaction,
|
330
|
+
params,
|
331
|
+
});
|
332
|
+
}
|
333
|
+
/**
|
334
|
+
* Signs a provided `message` with provided `signerAccountId`.
|
335
|
+
*
|
336
|
+
* @param {SignMessageParams} params - The parameters of type {@link SignMessageParams | `SignMessageParams`} required for signing message.
|
337
|
+
* @param {string} params.signerAccountId - a signer Hedera Account identifier in {@link https://hips.hedera.com/hip/hip-30 | HIP-30} (`<nework>:<shard>.<realm>.<num>`) form.
|
338
|
+
* @param {string} params.message - a plain UTF-8 string
|
339
|
+
* @returns Promise\<{@link SignMessageResult}\>
|
340
|
+
* @example
|
341
|
+
* ```ts
|
342
|
+
* const params = {
|
343
|
+
* signerAccountId: '0.0.12345',
|
344
|
+
* message: 'Hello World!'
|
345
|
+
* }
|
346
|
+
*
|
347
|
+
* const result = await dAppConnector.signMessage(params)
|
348
|
+
* ```
|
349
|
+
*/
|
350
|
+
async signMessage(params) {
|
351
|
+
return await this.request({
|
352
|
+
method: HederaJsonRpcMethod.SignMessage,
|
353
|
+
params,
|
354
|
+
});
|
355
|
+
}
|
356
|
+
/**
|
357
|
+
* Signs and send `Query` on the Hedera network.
|
358
|
+
*
|
359
|
+
* @param {SignAndExecuteQueryParams} params - The parameters of type {@link SignAndExecuteQueryParams | `SignAndExecuteQueryParams`} required for the Query execution.
|
360
|
+
* @param {string} params.signerAccountId - a signer Hedera Account identifier in {@link https://hips.hedera.com/hip/hip-30 | HIP-30} (`<nework>:<shard>.<realm>.<num>`) form.
|
361
|
+
* @param {string} params.query - `Query` object represented as Base64 string
|
362
|
+
* @returns Promise\<{@link SignAndExecuteQueryResult}\>
|
363
|
+
* @example
|
364
|
+
* Use helper `queryToBase64String` to encode `Query` to Base64 string
|
365
|
+
* ```ts
|
366
|
+
* const params = {
|
367
|
+
* signerAccountId: '0.0.12345',
|
368
|
+
* query: queryToBase64String(query),
|
369
|
+
* }
|
370
|
+
*
|
371
|
+
* const result = await dAppConnector.signAndExecuteQuery(params)
|
372
|
+
* ```
|
373
|
+
*/
|
374
|
+
async signAndExecuteQuery(params) {
|
375
|
+
return await this.request({
|
376
|
+
method: HederaJsonRpcMethod.SignAndExecuteQuery,
|
377
|
+
params,
|
378
|
+
});
|
379
|
+
}
|
380
|
+
/**
|
381
|
+
* Signs and executes Transactions on the Hedera network.
|
382
|
+
*
|
383
|
+
* @param {SignAndExecuteTransactionParams} params - The parameters of type {@link SignAndExecuteTransactionParams | `SignAndExecuteTransactionParams`} required for `Transaction` signing and execution.
|
384
|
+
* @param {string} params.signerAccountId - a signer Hedera Account identifier in {@link https://hips.hedera.com/hip/hip-30 | HIP-30} (`<nework>:<shard>.<realm>.<num>`) form.
|
385
|
+
* @param {string[]} params.transaction - Array of Base64-encoded `Transaction`'s
|
386
|
+
* @returns Promise\<{@link SignAndExecuteTransactionResult}\>
|
387
|
+
* @example
|
388
|
+
* Use helper `transactionToBase64String` to encode `Transaction` to Base64 string
|
389
|
+
* ```ts
|
390
|
+
* const params = {
|
391
|
+
* signerAccountId: '0.0.12345'
|
392
|
+
* transaction: [transactionToBase64String(transaction)]
|
393
|
+
* }
|
394
|
+
*
|
395
|
+
* const result = await dAppConnector.signAndExecuteTransaction(params)
|
396
|
+
* ```
|
397
|
+
*/
|
398
|
+
async signAndExecuteTransaction(params) {
|
399
|
+
return await this.request({
|
400
|
+
method: HederaJsonRpcMethod.SignAndExecuteTransaction,
|
401
|
+
params,
|
402
|
+
});
|
403
|
+
}
|
404
|
+
/**
|
405
|
+
* Signs and executes Transactions on the Hedera network.
|
406
|
+
*
|
407
|
+
* @param {SignTransactionParams} params - The parameters of type {@link SignTransactionParams | `SignTransactionParams`} required for `Transaction` signing.
|
408
|
+
* @param {string} params.signerAccountId - a signer Hedera Account identifier in {@link https://hips.hedera.com/hip/hip-30 | HIP-30} (`<nework>:<shard>.<realm>.<num>`) form.
|
409
|
+
* @param {string[]} params.transaction - Array of Base64-encoded `Transaction`'s
|
410
|
+
* @returns Promise\<{@link SignTransactionResult}\>
|
411
|
+
* @example
|
412
|
+
* ```ts
|
413
|
+
* const transactionBodyObject = transactionToTransactionBody(transaction, AccountId.fromString('0.0.3'))
|
414
|
+
* const transactionBody = transactionBodyToBase64String(transactionBodyObject)
|
415
|
+
*
|
416
|
+
* const params = {
|
417
|
+
* signerAccountId: '0.0.12345',
|
418
|
+
* transactionBody
|
419
|
+
* }
|
420
|
+
*
|
421
|
+
* const result = await dAppConnector.signTransaction(params)
|
422
|
+
* ```
|
423
|
+
*/
|
424
|
+
async signTransaction(params) {
|
425
|
+
return await this.request({
|
426
|
+
method: HederaJsonRpcMethod.SignTransaction,
|
427
|
+
params,
|
428
|
+
});
|
429
|
+
}
|
430
|
+
}
|
431
|
+
export default DAppConnector;
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
export * from './shared';
|
21
|
+
export { default as Wallet } from './wallet';
|
22
|
+
export * from './dapp';
|
@@ -0,0 +1,31 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
/**
|
21
|
+
* Enum representing different Hedera network chain IDs.
|
22
|
+
*
|
23
|
+
* @see {@link https://github.com/hashgraph/hedera-improvement-proposal/blob/main/HIP/hip-820.md#specification | HIP-820 Specification}
|
24
|
+
*/
|
25
|
+
export var HederaChainId;
|
26
|
+
(function (HederaChainId) {
|
27
|
+
HederaChainId["Mainnet"] = "hedera:mainnet";
|
28
|
+
HederaChainId["Testnet"] = "hedera:testnet";
|
29
|
+
HederaChainId["Previewnet"] = "hedera:previewnet";
|
30
|
+
HederaChainId["Devnet"] = "hedera:devnet";
|
31
|
+
})(HederaChainId || (HederaChainId = {}));
|
@@ -46,4 +46,3 @@ export interface HederaJsonRpcError<T = string | number> {
|
|
46
46
|
* @returns A HederaErrorResponse object with the specified code, message, and additional data.
|
47
47
|
*/
|
48
48
|
export declare function getHederaError<T>(key: string, context?: string | number, data?: T): HederaErrorResponse<T>;
|
49
|
-
//# sourceMappingURL=errors.d.ts.map
|
@@ -0,0 +1,51 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
/**
|
21
|
+
* WalletConnect has certain
|
22
|
+
* {@link https://github.com/WalletConnect/walletconnect-monorepo/blob/v2.0/packages/utils/src/errors.ts | error code ranges reserved}
|
23
|
+
* for WalletConnect use.
|
24
|
+
* The following schema uses negative codes to avoid conflicts.
|
25
|
+
*
|
26
|
+
* @see {@link https://github.com/WalletConnect/walletconnect-monorepo/blob/v2.0/packages/utils/src/errors.ts | WalletConnect Errors}
|
27
|
+
*/
|
28
|
+
/**
|
29
|
+
* Object containing specific Hedera errors with their respective codes and messages.
|
30
|
+
*/
|
31
|
+
export const HEDERA_ERRORS = {
|
32
|
+
INVALID_PARAMS: {
|
33
|
+
code: 9000,
|
34
|
+
message: 'INVALID_PARAMS',
|
35
|
+
},
|
36
|
+
};
|
37
|
+
/**
|
38
|
+
* Generates a Hedera error response based on the provided key, context, and additional data.
|
39
|
+
* @param key - Key representing the specific error type.
|
40
|
+
* @param context - Contextual information for the error (optional).
|
41
|
+
* @param data - Additional data to include in the error response (optional).
|
42
|
+
* @returns A HederaErrorResponse object with the specified code, message, and additional data.
|
43
|
+
*/
|
44
|
+
export function getHederaError(key, context, data) {
|
45
|
+
const { code, message } = HEDERA_ERRORS[key];
|
46
|
+
return {
|
47
|
+
code,
|
48
|
+
message: context ? `${message} ${context}` : message,
|
49
|
+
data,
|
50
|
+
};
|
51
|
+
}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
/**
|
21
|
+
* Represents different events related to a Hedera session.
|
22
|
+
*/
|
23
|
+
export var HederaSessionEvent;
|
24
|
+
(function (HederaSessionEvent) {
|
25
|
+
HederaSessionEvent["AccountsChanged"] = "accountsChanged";
|
26
|
+
HederaSessionEvent["ChainChanged"] = "chainChanged";
|
27
|
+
})(HederaSessionEvent || (HederaSessionEvent = {}));
|
@@ -19,4 +19,3 @@ export declare const findExtensions: (onFound: (_metadata: ExtensionData, isIfra
|
|
19
19
|
export declare const extensionQuery: () => void;
|
20
20
|
export declare const extensionConnect: (id: string, isIframe: boolean, pairingString: string) => void;
|
21
21
|
export declare const extensionOpen: (id: string) => void;
|
22
|
-
//# sourceMappingURL=extensionController.d.ts.map
|
@@ -0,0 +1,42 @@
|
|
1
|
+
export var EVENTS;
|
2
|
+
(function (EVENTS) {
|
3
|
+
EVENTS["extensionQuery"] = "hedera-extension-query";
|
4
|
+
EVENTS["extensionConnect"] = "hedera-extension-connect-";
|
5
|
+
EVENTS["extensionOpen"] = "hedera-extension-open-";
|
6
|
+
EVENTS["extensionResponse"] = "hedera-extension-response";
|
7
|
+
EVENTS["iframeQuery"] = "hedera-iframe-query";
|
8
|
+
EVENTS["iframeQueryResponse"] = "hedera-iframe-response";
|
9
|
+
EVENTS["iframeConnect"] = "hedera-iframe-connect";
|
10
|
+
})(EVENTS || (EVENTS = {}));
|
11
|
+
export const findExtensions = (onFound) => {
|
12
|
+
if (typeof window === 'undefined')
|
13
|
+
return;
|
14
|
+
window.addEventListener('message', (event) => {
|
15
|
+
var _a, _b;
|
16
|
+
if (((_a = event === null || event === void 0 ? void 0 : event.data) === null || _a === void 0 ? void 0 : _a.type) == EVENTS.extensionResponse && event.data.metadata) {
|
17
|
+
onFound(event.data.metadata, false);
|
18
|
+
}
|
19
|
+
if (((_b = event === null || event === void 0 ? void 0 : event.data) === null || _b === void 0 ? void 0 : _b.type) == EVENTS.iframeQueryResponse && event.data.metadata) {
|
20
|
+
onFound(event.data.metadata, true);
|
21
|
+
}
|
22
|
+
});
|
23
|
+
setTimeout(() => {
|
24
|
+
extensionQuery();
|
25
|
+
}, 200);
|
26
|
+
};
|
27
|
+
export const extensionQuery = () => {
|
28
|
+
window.postMessage({ type: EVENTS.extensionQuery }, '*');
|
29
|
+
if (window.parent) {
|
30
|
+
window.parent.postMessage({ type: EVENTS.iframeQuery }, '*');
|
31
|
+
}
|
32
|
+
};
|
33
|
+
export const extensionConnect = (id, isIframe, pairingString) => {
|
34
|
+
if (isIframe) {
|
35
|
+
window.parent.postMessage({ type: EVENTS.iframeConnect, pairingString }, '*');
|
36
|
+
return;
|
37
|
+
}
|
38
|
+
window.postMessage({ type: EVENTS.extensionConnect + id, pairingString }, '*');
|
39
|
+
};
|
40
|
+
export const extensionOpen = (id) => {
|
41
|
+
window.postMessage({ type: EVENTS.extensionOpen + id }, '*');
|
42
|
+
};
|
@@ -0,0 +1,26 @@
|
|
1
|
+
/*
|
2
|
+
*
|
3
|
+
* Hedera Wallet Connect
|
4
|
+
*
|
5
|
+
* Copyright (C) 2023 Hedera Hashgraph, LLC
|
6
|
+
*
|
7
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
8
|
+
* you may not use this file except in compliance with the License.
|
9
|
+
* You may obtain a copy of the License at
|
10
|
+
*
|
11
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
12
|
+
*
|
13
|
+
* Unless required by applicable law or agreed to in writing, software
|
14
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
15
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
16
|
+
* See the License for the specific language governing permissions and
|
17
|
+
* limitations under the License.
|
18
|
+
*
|
19
|
+
*/
|
20
|
+
export * from './chainIds';
|
21
|
+
export * from './errors';
|
22
|
+
export * from './events';
|
23
|
+
export * from './methods';
|
24
|
+
export * from './payloads';
|
25
|
+
export * from './utils';
|
26
|
+
export * from './extensionController';
|