@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
package/README.md
CHANGED
@@ -67,14 +67,14 @@ use this library’s functions to easily create and handle requests for the Hede
|
|
67
67
|
|
68
68
|
### Installation
|
69
69
|
|
70
|
-
`npm i --save @hashgraph/hedera-wallet-connect
|
70
|
+
`npm i --save @hashgraph/hedera-wallet-connect`
|
71
71
|
|
72
72
|
### Example code
|
73
73
|
|
74
|
-
|
74
|
+
- [Typescript dApp example code](src/examples/typescript/dapp/main.ts)
|
75
|
+
- [Typescript Wallet example code](src/examples/typescript/wallet/main.ts)
|
76
|
+
- [React dApp example code](demos/react-dapp)
|
75
77
|
|
76
|
-
- [dApp example code](src/examples/typescript/dapp/main.ts)
|
77
|
-
- [Wallet example code](src/examples/typescript/wallet/main.ts)
|
78
78
|
|
79
79
|
### DApps
|
80
80
|
|
@@ -0,0 +1 @@
|
|
1
|
+
export * from './lib';
|
@@ -0,0 +1,20 @@
|
|
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 './lib';
|
@@ -0,0 +1,214 @@
|
|
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 { AccountBalance, AccountId, AccountInfo, LedgerId, SignerSignature, Transaction, TransactionRecord, Client, PublicKey, TransactionId, TransactionResponse, Query, AccountRecordsQuery, AccountInfoQuery, AccountBalanceQuery, TransactionReceiptQuery, TransactionReceipt, } from '@hashgraph/sdk';
|
21
|
+
import { proto } from '@hashgraph/proto';
|
22
|
+
import { HederaJsonRpcMethod, Uint8ArrayToBase64String, base64StringToSignatureMap, base64StringToUint8Array, ledgerIdToCAIPChainId, queryToBase64String, transactionBodyToBase64String, transactionToBase64String, transactionToTransactionBody, extensionOpen, } from '../shared';
|
23
|
+
const clients = {};
|
24
|
+
export class DAppSigner {
|
25
|
+
constructor(accountId, signClient, topic, ledgerId = LedgerId.MAINNET, extensionId) {
|
26
|
+
this.accountId = accountId;
|
27
|
+
this.signClient = signClient;
|
28
|
+
this.topic = topic;
|
29
|
+
this.ledgerId = ledgerId;
|
30
|
+
this.extensionId = extensionId;
|
31
|
+
}
|
32
|
+
_getHederaClient() {
|
33
|
+
const ledgerIdString = this.ledgerId.toString();
|
34
|
+
if (!clients[ledgerIdString]) {
|
35
|
+
clients[ledgerIdString] = Client.forName(ledgerIdString);
|
36
|
+
}
|
37
|
+
return clients[ledgerIdString];
|
38
|
+
}
|
39
|
+
get _signerAccountId() {
|
40
|
+
return `${ledgerIdToCAIPChainId(this.ledgerId)}:${this.accountId.toString()}`;
|
41
|
+
}
|
42
|
+
_getRandomNodes(numberOfNodes) {
|
43
|
+
const allNodes = Object.values(this._getHederaClient().network).map((o) => typeof o === 'string' ? AccountId.fromString(o) : o);
|
44
|
+
// shuffle nodes
|
45
|
+
for (let i = allNodes.length - 1; i > 0; i--) {
|
46
|
+
const j = Math.floor(Math.random() * (i + 1));
|
47
|
+
[allNodes[i], allNodes[j]] = [allNodes[j], allNodes[i]];
|
48
|
+
}
|
49
|
+
return allNodes.slice(0, numberOfNodes);
|
50
|
+
}
|
51
|
+
request(request) {
|
52
|
+
if (this.extensionId)
|
53
|
+
extensionOpen(this.extensionId);
|
54
|
+
return this.signClient.request({
|
55
|
+
topic: this.topic,
|
56
|
+
request,
|
57
|
+
chainId: ledgerIdToCAIPChainId(this.ledgerId),
|
58
|
+
});
|
59
|
+
}
|
60
|
+
getAccountId() {
|
61
|
+
return this.accountId;
|
62
|
+
}
|
63
|
+
getAccountKey() {
|
64
|
+
throw new Error('Method not implemented.');
|
65
|
+
}
|
66
|
+
getLedgerId() {
|
67
|
+
return this.ledgerId;
|
68
|
+
}
|
69
|
+
getNetwork() {
|
70
|
+
return this._getHederaClient().network;
|
71
|
+
}
|
72
|
+
getMirrorNetwork() {
|
73
|
+
return this._getHederaClient().mirrorNetwork;
|
74
|
+
}
|
75
|
+
getAccountBalance() {
|
76
|
+
return this.call(new AccountBalanceQuery().setAccountId(this.accountId));
|
77
|
+
}
|
78
|
+
getAccountInfo() {
|
79
|
+
return this.call(new AccountInfoQuery().setAccountId(this.accountId));
|
80
|
+
}
|
81
|
+
getAccountRecords() {
|
82
|
+
return this.call(new AccountRecordsQuery().setAccountId(this.accountId));
|
83
|
+
}
|
84
|
+
async sign(data, signOptions) {
|
85
|
+
const { signatureMap } = await this.request({
|
86
|
+
method: HederaJsonRpcMethod.SignMessage,
|
87
|
+
params: {
|
88
|
+
signerAccountId: this._signerAccountId,
|
89
|
+
message: Uint8ArrayToBase64String(data[0]),
|
90
|
+
},
|
91
|
+
});
|
92
|
+
const sigmap = base64StringToSignatureMap(signatureMap);
|
93
|
+
const signerSignature = new SignerSignature({
|
94
|
+
accountId: this.getAccountId(),
|
95
|
+
publicKey: PublicKey.fromBytes(sigmap.sigPair[0].pubKeyPrefix),
|
96
|
+
signature: sigmap.sigPair[0].ed25519 ||
|
97
|
+
sigmap.sigPair[0].ECDSASecp256k1,
|
98
|
+
});
|
99
|
+
return [signerSignature];
|
100
|
+
}
|
101
|
+
async checkTransaction(transaction) {
|
102
|
+
throw new Error('Method not implemented.');
|
103
|
+
}
|
104
|
+
async populateTransaction(transaction) {
|
105
|
+
return transaction
|
106
|
+
.setNodeAccountIds(this._getRandomNodes(10)) // allow retrying on up to 10 nodes
|
107
|
+
.setTransactionId(TransactionId.generate(this.getAccountId()));
|
108
|
+
}
|
109
|
+
/**
|
110
|
+
* Prepares a transaction object for signing using a single node account id.
|
111
|
+
* If the transaction object does not already have a node account id,
|
112
|
+
* generate a random node account id using the Hedera SDK client
|
113
|
+
*
|
114
|
+
* @param transaction - Any instance of a class that extends `Transaction`
|
115
|
+
* @returns transaction - `Transaction` object with signature
|
116
|
+
*/
|
117
|
+
async signTransaction(transaction) {
|
118
|
+
let nodeAccountId;
|
119
|
+
if (!transaction.nodeAccountIds || transaction.nodeAccountIds.length === 0)
|
120
|
+
nodeAccountId = this._getRandomNodes(1)[0];
|
121
|
+
else
|
122
|
+
nodeAccountId = transaction.nodeAccountIds[0];
|
123
|
+
const transactionBody = transactionToTransactionBody(transaction, nodeAccountId);
|
124
|
+
const transactionBodyBase64 = transactionBodyToBase64String(transactionBody);
|
125
|
+
const { signatureMap } = await this.request({
|
126
|
+
method: HederaJsonRpcMethod.SignTransaction,
|
127
|
+
params: {
|
128
|
+
signerAccountId: this._signerAccountId,
|
129
|
+
transactionBody: transactionBodyBase64,
|
130
|
+
},
|
131
|
+
});
|
132
|
+
const sigMap = base64StringToSignatureMap(signatureMap);
|
133
|
+
const bodyBytes = base64StringToUint8Array(transactionBodyBase64);
|
134
|
+
const bytes = proto.Transaction.encode({ bodyBytes, sigMap }).finish();
|
135
|
+
return Transaction.fromBytes(bytes);
|
136
|
+
}
|
137
|
+
async _tryExecuteTransactionRequest(request) {
|
138
|
+
try {
|
139
|
+
const transaction = Transaction.fromBytes(request.toBytes());
|
140
|
+
const result = await this.request({
|
141
|
+
method: HederaJsonRpcMethod.SignAndExecuteTransaction,
|
142
|
+
params: {
|
143
|
+
signerAccountId: this._signerAccountId,
|
144
|
+
transactionList: transactionToBase64String(transaction),
|
145
|
+
},
|
146
|
+
});
|
147
|
+
return { result: TransactionResponse.fromJSON(result) };
|
148
|
+
}
|
149
|
+
catch (error) {
|
150
|
+
return { error };
|
151
|
+
}
|
152
|
+
}
|
153
|
+
async _parseQueryResponse(query, base64EncodedQueryResponse) {
|
154
|
+
if (query instanceof AccountRecordsQuery) {
|
155
|
+
const base64EncodedQueryResponseSplit = base64EncodedQueryResponse.split(',');
|
156
|
+
const data = base64EncodedQueryResponseSplit.map((o) => base64StringToUint8Array(o));
|
157
|
+
return data.map((o) => TransactionRecord.fromBytes(o));
|
158
|
+
}
|
159
|
+
const data = base64StringToUint8Array(base64EncodedQueryResponse);
|
160
|
+
if (query instanceof AccountBalanceQuery) {
|
161
|
+
return AccountBalance.fromBytes(data);
|
162
|
+
}
|
163
|
+
else if (query instanceof AccountInfoQuery) {
|
164
|
+
return AccountInfo.fromBytes(data);
|
165
|
+
}
|
166
|
+
else if (query instanceof TransactionReceiptQuery) {
|
167
|
+
return TransactionReceipt.fromBytes(data);
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
throw new Error('Unsupported query type');
|
171
|
+
}
|
172
|
+
}
|
173
|
+
async _tryExecuteQueryRequest(request) {
|
174
|
+
try {
|
175
|
+
const query = Query.fromBytes(request.toBytes());
|
176
|
+
const result = await this.request({
|
177
|
+
method: HederaJsonRpcMethod.SignAndExecuteQuery,
|
178
|
+
params: {
|
179
|
+
signerAccountId: this._signerAccountId,
|
180
|
+
query: queryToBase64String(query),
|
181
|
+
},
|
182
|
+
});
|
183
|
+
return { result: this._parseQueryResponse(query, result.response) };
|
184
|
+
}
|
185
|
+
catch (error) {
|
186
|
+
return { error };
|
187
|
+
}
|
188
|
+
}
|
189
|
+
async call(request) {
|
190
|
+
var _a, _b, _c, _d, _e, _f;
|
191
|
+
const txResult = await this._tryExecuteTransactionRequest(request);
|
192
|
+
if (txResult.result) {
|
193
|
+
return txResult.result;
|
194
|
+
}
|
195
|
+
const queryResult = await this._tryExecuteQueryRequest(request);
|
196
|
+
if (queryResult.result) {
|
197
|
+
return queryResult.result;
|
198
|
+
}
|
199
|
+
// TODO: make this error more usable
|
200
|
+
throw new Error('Error executing transaction or query: \n' +
|
201
|
+
JSON.stringify({
|
202
|
+
txError: {
|
203
|
+
name: (_a = txResult.error) === null || _a === void 0 ? void 0 : _a.name,
|
204
|
+
message: (_b = txResult.error) === null || _b === void 0 ? void 0 : _b.message,
|
205
|
+
stack: (_c = txResult.error) === null || _c === void 0 ? void 0 : _c.stack,
|
206
|
+
},
|
207
|
+
queryError: {
|
208
|
+
name: (_d = queryResult.error) === null || _d === void 0 ? void 0 : _d.name,
|
209
|
+
message: (_e = queryResult.error) === null || _e === void 0 ? void 0 : _e.message,
|
210
|
+
stack: (_f = queryResult.error) === null || _f === void 0 ? void 0 : _f.stack,
|
211
|
+
},
|
212
|
+
}, null, 2));
|
213
|
+
}
|
214
|
+
}
|