quantum-coin-js-sdk 1.0.14 → 1.0.16
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/.gitignore +1 -0
- package/LICENSE +21 -0
- package/LICENSE-wasm_exec.js.txt +30 -0
- package/README.md +56 -7
- package/example/example.js +109 -3
- package/example/package-lock.json +17 -7
- package/example/package.json +1 -1
- package/index.js +187 -12
- package/package.json +3 -2
- package/wasm_exec.js +30 -4
package/.gitignore
CHANGED
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2024 Quantum Coin Community
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
License for file wasm_exec.js
|
|
2
|
+
https://github.com/golang/go/blob/master/LICENSE
|
|
3
|
+
|
|
4
|
+
Copyright 2009 The Go Authors.
|
|
5
|
+
|
|
6
|
+
Redistribution and use in source and binary forms, with or without
|
|
7
|
+
modification, are permitted provided that the following conditions are
|
|
8
|
+
met:
|
|
9
|
+
|
|
10
|
+
* Redistributions of source code must retain the above copyright
|
|
11
|
+
notice, this list of conditions and the following disclaimer.
|
|
12
|
+
* Redistributions in binary form must reproduce the above
|
|
13
|
+
copyright notice, this list of conditions and the following disclaimer
|
|
14
|
+
in the documentation and/or other materials provided with the
|
|
15
|
+
distribution.
|
|
16
|
+
* Neither the name of Google LLC nor the names of its
|
|
17
|
+
contributors may be used to endorse or promote products derived from
|
|
18
|
+
this software without specific prior written permission.
|
|
19
|
+
|
|
20
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
21
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
22
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
23
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
24
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
25
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
26
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
27
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
28
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
29
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
30
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ Quantum Coin JS SDK provides functionality to interact with the Quantum Coin Blo
|
|
|
5
5
|
|
|
6
6
|
**Example**
|
|
7
7
|
```js
|
|
8
|
-
Requires Node.js version v20.18.1 or higher
|
|
9
8
|
|
|
10
9
|
|
|
10
|
+
Requires Node.js version v20.18.1 or higher
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
* [quantum-coin-js-sdk](#module_quantum-coin-js-sdk)
|
|
@@ -94,6 +94,10 @@ Requires Node.js version v20.18.1 or higher
|
|
|
94
94
|
* [~initialize(clientConfig)](#module_quantum-coin-js-sdk..initialize) ⇒ <code>Promise.<boolean></code>
|
|
95
95
|
* [~isAddressValid(address)](#module_quantum-coin-js-sdk..isAddressValid) ⇒ <code>boolean</code>
|
|
96
96
|
* [~newWallet()](#module_quantum-coin-js-sdk..newWallet) ⇒ <code>Wallet</code>
|
|
97
|
+
* [~newWalletSeed()](#module_quantum-coin-js-sdk..newWalletSeed) ⇒ <code>array</code>
|
|
98
|
+
* [~openWalletFromSeedWords(seedWordList)](#module_quantum-coin-js-sdk..openWalletFromSeedWords) ⇒ <code>Wallet</code>
|
|
99
|
+
* [~deserializeEncryptedWallet(walletJsonString, passphrase)](#module_quantum-coin-js-sdk..deserializeEncryptedWallet) ⇒ <code>Wallet</code>
|
|
100
|
+
* [~serializeEncryptedWallet(wallet, passphrase)](#module_quantum-coin-js-sdk..serializeEncryptedWallet) ⇒ <code>string</code>
|
|
97
101
|
* [~verifyWallet(wallet)](#module_quantum-coin-js-sdk..verifyWallet) ⇒ <code>boolean</code>
|
|
98
102
|
* [~serializeWallet(wallet)](#module_quantum-coin-js-sdk..serializeWallet) ⇒ <code>string</code>
|
|
99
103
|
* [~deserializeWallet(walletJson)](#module_quantum-coin-js-sdk..deserializeWallet) ⇒ <code>Wallet</code>
|
|
@@ -129,8 +133,8 @@ Creates a config class
|
|
|
129
133
|
|
|
130
134
|
| Param | Type | Description |
|
|
131
135
|
| --- | --- | --- |
|
|
132
|
-
| readUrl | <code>string</code> | The Read API URL pointing to a read relay. See https://github.com/
|
|
133
|
-
| writeUrl | <code>string</code> | The Write API URL pointing to a write relay. See https://github.com/
|
|
136
|
+
| readUrl | <code>string</code> | The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://sdk.readrelay.quantumcoinapi.com |
|
|
137
|
+
| writeUrl | <code>string</code> | The Write API URL pointing to a write relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://sdk.writerelay.quantumcoinapi.com |
|
|
134
138
|
| chainId | <code>number</code> | The chain id of the blockchain. Mainnet chainId is 123123. Testnet T4 chainId is 310324. |
|
|
135
139
|
| readApiKey | <code>string</code> | Optional parameter if authorization is enabled for the relay service. API Key for authorization. Defaults to null which indicates no authorization. |
|
|
136
140
|
| writeApiKey | <code>string</code> | Optional parameter if authorization is enabled for the relay service. API Key for authorization. Defaults to null which indicates no authorization. |
|
|
@@ -138,14 +142,14 @@ Creates a config class
|
|
|
138
142
|
<a name="module_quantum-coin-js-sdk..Config+readUrl"></a>
|
|
139
143
|
|
|
140
144
|
#### config.readUrl : <code>string</code>
|
|
141
|
-
The Read API URL pointing to a read relay. See https://github.com/
|
|
145
|
+
The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay
|
|
142
146
|
|
|
143
147
|
**Kind**: instance property of [<code>Config</code>](#module_quantum-coin-js-sdk..Config)
|
|
144
148
|
**Access**: public
|
|
145
149
|
<a name="module_quantum-coin-js-sdk..Config+writeUrl"></a>
|
|
146
150
|
|
|
147
151
|
#### config.writeUrl : <code>string</code>
|
|
148
|
-
The Read API URL pointing to a read relay. See https://github.com/
|
|
152
|
+
The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay
|
|
149
153
|
|
|
150
154
|
**Kind**: instance property of [<code>Config</code>](#module_quantum-coin-js-sdk..Config)
|
|
151
155
|
**Access**: public
|
|
@@ -173,7 +177,7 @@ API Key for authorization if authorization is enabled for the relay service. Def
|
|
|
173
177
|
<a name="module_quantum-coin-js-sdk..Wallet"></a>
|
|
174
178
|
|
|
175
179
|
### quantum-coin-js-sdk~Wallet
|
|
176
|
-
This class represents a Wallet. Use the verifyWallet function to verify if a wallet is valid. Verifying the wallet is highly recommended, especially if it comes from an untrusted source. For more details on the underlying cryptography of the Wallet, see https://github.com/
|
|
180
|
+
This class represents a Wallet. Use the verifyWallet function to verify if a wallet is valid. Verifying the wallet is highly recommended, especially if it comes from an untrusted source. For more details on the underlying cryptography of the Wallet, see https://github.com/QuantumCoinProject/hybrid-pqc
|
|
177
181
|
|
|
178
182
|
**Kind**: inner class of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
179
183
|
**Access**: public
|
|
@@ -828,6 +832,51 @@ The newWallet function creates a new Wallet.
|
|
|
828
832
|
|
|
829
833
|
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
830
834
|
**Returns**: <code>Wallet</code> - Returns a Wallet object.
|
|
835
|
+
<a name="module_quantum-coin-js-sdk..newWalletSeed"></a>
|
|
836
|
+
|
|
837
|
+
### quantum-coin-js-sdk~newWalletSeed() ⇒ <code>array</code>
|
|
838
|
+
The newWalletSeed function creates a new Wallet seed word list. The return array can then be passed to the openWalletFromSeedWords function to create a new wallet.
|
|
839
|
+
|
|
840
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
841
|
+
**Returns**: <code>array</code> - Returns an array of seed words (48 words in total). Returns null if the operation failed.
|
|
842
|
+
<a name="module_quantum-coin-js-sdk..openWalletFromSeedWords"></a>
|
|
843
|
+
|
|
844
|
+
### quantum-coin-js-sdk~openWalletFromSeedWords(seedWordList) ⇒ <code>Wallet</code>
|
|
845
|
+
The openWalletFromSeedWords function creates a wallet from a seed word list. The seed word list is available for wallets created from Desktop/Web/Mobile wallets.
|
|
846
|
+
|
|
847
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
848
|
+
**Returns**: <code>Wallet</code> - Returns a Wallet object. Returns null if the operation failed.
|
|
849
|
+
|
|
850
|
+
| Param | Type | Description |
|
|
851
|
+
| --- | --- | --- |
|
|
852
|
+
| seedWordList | <code>array</code> | An array of seed words. There should be 48 words in total. |
|
|
853
|
+
|
|
854
|
+
<a name="module_quantum-coin-js-sdk..deserializeEncryptedWallet"></a>
|
|
855
|
+
|
|
856
|
+
### quantum-coin-js-sdk~deserializeEncryptedWallet(walletJsonString, passphrase) ⇒ <code>Wallet</code>
|
|
857
|
+
The deserializeEncryptedWallet function opens a wallet backed-up using an application such as the Desktop/Mobile/CLI/Web wallet. This function can take upto a minute or so to execute. You should open wallets only from trusted sources.
|
|
858
|
+
|
|
859
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
860
|
+
**Returns**: <code>Wallet</code> - Returns a Wallet object. Returns null if opening the wallet fails.
|
|
861
|
+
|
|
862
|
+
| Param | Type | Description |
|
|
863
|
+
| --- | --- | --- |
|
|
864
|
+
| walletJsonString | <code>string</code> | The json string from a wallet file. |
|
|
865
|
+
| passphrase | <code>string</code> | The passphrase used to encrypt the wallet. |
|
|
866
|
+
|
|
867
|
+
<a name="module_quantum-coin-js-sdk..serializeEncryptedWallet"></a>
|
|
868
|
+
|
|
869
|
+
### quantum-coin-js-sdk~serializeEncryptedWallet(wallet, passphrase) ⇒ <code>string</code>
|
|
870
|
+
The serializeEncryptedWallet function encrypts and serializes a Wallet object to a JSON string readable by the Desktop/Mobile/Web/CLI wallet applications. You can save this string to a file and open the file in one of these wallet applications. You may also open this string using the deserializeEncryptedWallet function. If you loose the passphrase, you will be unable to open the wallet. This function can take upto a minute or so to execute.
|
|
871
|
+
|
|
872
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
873
|
+
**Returns**: <code>string</code> - Returns the Wallet in JSON string format. If the wallet is invalid, null is returned.
|
|
874
|
+
|
|
875
|
+
| Param | Type | Description |
|
|
876
|
+
| --- | --- | --- |
|
|
877
|
+
| wallet | <code>Wallet</code> | A Wallet object representing the wallet to serialize. |
|
|
878
|
+
| passphrase | <code>string</code> | A passphrase used to encrypt the wallet. It should atleast be 12 characters long. |
|
|
879
|
+
|
|
831
880
|
<a name="module_quantum-coin-js-sdk..verifyWallet"></a>
|
|
832
881
|
|
|
833
882
|
### quantum-coin-js-sdk~verifyWallet(wallet) ⇒ <code>boolean</code>
|
|
@@ -918,7 +967,7 @@ The listAccountTransactions function returns a list of transactions for a specif
|
|
|
918
967
|
| Param | Type | Description |
|
|
919
968
|
| --- | --- | --- |
|
|
920
969
|
| address | <code>string</code> | The address for which the transactions have to be listed. |
|
|
921
|
-
| pageNumber | <code>number</code> | The page number for which the transactions has to be listed for the account. Pass 0 to list the latest page. |
|
|
970
|
+
| pageNumber | <code>number</code> | The page number for which the transactions has to be listed for the account. Pass 0 to list the latest page. Pass 1 to list the oldest page. A maximum of 20 transactions are returned in each page. The response of this API includes a field that shows the pageCount (total number of pages available). You can pass any number between 1 to pageCount to get the corresponding page. |
|
|
922
971
|
|
|
923
972
|
<a name="module_quantum-coin-js-sdk..signSendCoinTransaction"></a>
|
|
924
973
|
|
package/example/example.js
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
const qcsdk = require('quantum-coin-js-sdk');
|
|
2
2
|
const ethers = require('ethers');
|
|
3
3
|
|
|
4
|
+
var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
5
|
+
|
|
6
|
+
|
|
4
7
|
//Initialize the client configuration
|
|
5
|
-
var clientConfigVal = new qcsdk.Config("https://t4-relayread.quantumcoin.org", "https://t4-relaywrite.quantumcoin.org", 310324, "", ""); //Testnet T4
|
|
8
|
+
//var clientConfigVal = new qcsdk.Config("https://t4-relayread.quantumcoin.org", "https://t4-relaywrite.quantumcoin.org", 310324, "", ""); //Testnet T4
|
|
6
9
|
//Testnet T4 Block Explorer: https://t4.scan.quantumcoin.org
|
|
7
10
|
|
|
8
11
|
//For mainnet, use the following configuration
|
|
9
|
-
//var clientConfigVal = new qcsdk.Config("https://
|
|
12
|
+
//var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
13
|
+
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
14
|
+
|
|
15
|
+
//Local testing configuration
|
|
16
|
+
//var clientConfigVal = new qcsdk.Config("http://127.0.0.1:9090", "http://127.0.0.1:9091", 123123, "", ""); //local testing
|
|
10
17
|
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
11
18
|
|
|
12
19
|
|
|
@@ -27,7 +34,11 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
27
34
|
console.error("Initialize failed");
|
|
28
35
|
return;
|
|
29
36
|
}
|
|
30
|
-
console.log("Initialize succeeded");
|
|
37
|
+
console.log("Initialize succeeded");
|
|
38
|
+
|
|
39
|
+
console.log("isAddressValid (expected true)" + qcsdk.isAddressValid("0x6f605c4142f1cb037f967101a5b28ccd00b27cce4516190356baaf284d20e667")); //should print true
|
|
40
|
+
console.log("isAddressValid (expected true)" + qcsdk.isAddressValid("0X6F605C4142F1CB037F967101A5B28CCD00B27CCE4516190356BAAF284D20E667")); //should print true
|
|
41
|
+
|
|
31
42
|
|
|
32
43
|
//Get the account details
|
|
33
44
|
let address = "0x0000000000000000000000000000000000000000000000000000000000001000"; //Just an example address https://t4.scan.quantumcoin.org/account/0x0000000000000000000000000000000000000000000000000000000000001000
|
|
@@ -239,6 +250,7 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
239
250
|
console.log(" Account address: " + address);
|
|
240
251
|
console.log(" Page Count: " + accountTransactionsResult.listAccountTransactionsResponse.pageCount);
|
|
241
252
|
console.log(" Number of transactions returned: " + txnList.length);
|
|
253
|
+
|
|
242
254
|
for (const txn of txnList) {
|
|
243
255
|
console.log(" Transaction Hash: " + txn.hash);
|
|
244
256
|
console.log(" From Address: " + txn.from);
|
|
@@ -251,6 +263,19 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
251
263
|
console.log(" Status: " + txn.status);
|
|
252
264
|
console.log(" Block Number: " + txn.blockNumber);
|
|
253
265
|
}
|
|
266
|
+
|
|
267
|
+
let pageCount = accountTransactionsResult.listAccountTransactionsResponse.pageCount;
|
|
268
|
+
|
|
269
|
+
//Enumerate and list all the pages
|
|
270
|
+
for (i = 1; i <= pageCount; i++) {
|
|
271
|
+
let pageNumber = i;
|
|
272
|
+
qcsdk.listAccountTransactions(address, pageNumber).then((txnListResult) => {
|
|
273
|
+
let txnList = txnListResult.listAccountTransactionsResponse.items;
|
|
274
|
+
for (const txn of txnList) {
|
|
275
|
+
console.log(" Transaction Hash: " + txn.hash + " pageNumber = " + pageNumber);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
}
|
|
254
279
|
});
|
|
255
280
|
|
|
256
281
|
//Offline sign a transaction from existing wallet. This is typically called from an offline device hosting a cold storage wallet.
|
|
@@ -287,5 +312,86 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
287
312
|
|
|
288
313
|
console.log(" postTransaction succeeded. This does not necessarily mean that the transaction has succeded. txnHash " + sendResult.txnHash);
|
|
289
314
|
});
|
|
315
|
+
|
|
316
|
+
//Open example wallet created using external wallet application such as Desktop/Web/CLI/Mobile wallet
|
|
317
|
+
const walletEncryptedJson1 = "{\"address\":\"1a846abe71c8b989e8337c55d608be81c28ab3b2e40c83eaa2a68d516049aec6\",\"crypto\":{\"cipher\":\"aes-256-ctr\",\"ciphertext\":\"ab7e620dd66cb55ac201b9c6796de92bbb06f3681b5932eabe099871f1f7d79acabe30921a39ad13bfe74f42c515734882b6723760142aa3e26e011df514a534ae47bd15d86badd9c6f17c48d4c892711d54d441ee3a0ee0e5b060f816e79c7badd13ff4c235934b1986774223ecf6e8761388969bb239c759b54c8c70e6a2e27c93a4b70129c8159f461d271ae8f3573414c78b88e4d0abfa6365ed45456636d4ed971c7a0c6b84e6f0c2621e819268b135e2bcc169a54d1847b39e6ba2ae8ec969b69f330b7db9e785ed02204d5a1185915ae5338b0f40ef2a7f4d5aaf7563d502135e57f4eb89d5ec1efa5c77e374969d6cd85be625a2ed1225d68ecdd84067bfc69adb83ecd5c6050472eca28a5a646fcdd28077165c629975bec8a79fe1457cb53389b788b25e1f8eff8b2ca326d7dfcaba3f8839225a08057c018a458891fd2caa0d2b27632cffd80f592147ccec9a10dc8a08a48fb55047bff5cf85cda39eb089096bef63842fc3686412f298a54a9e4b0bf4ad36907ba373cbd6d32e7ac494af371da5aa9d38a3463220865114c4adc5e4ac258ba9c6af9fa2ddfd1aec2e16887e4b3977c69561df8599ac9d411c9dd2a4d57f92ea4e5c02aae3f49fb3bc83e16673e6c2dbe96bb181c8dfd0f9757ade2e4ff27215a836058c5ffeab042f6f97c7c02339f76a6284680e01b4bb733690eb3347fbfcc26614b8bf755f9dfce3fea9d4e4d15b164983201732c2e87593a86bca6da6972e128490338f76ae68135888070f4e59e90db54d23834769bdbda9769213faf5357f9167a224523975a946367b68f0cec98658575609f58bfd329e420a921c06713326e4cb20a0df1d77f37e78a320a637a96c604ca3fa89e24beb42313751b8f09b14f9c14c77e4fd13fc6382505d27c771bca0d821ec7c3765acffa99d83c50140a56b0b28101c762bd682fe55cb6f23cbeb3f421d7b36021010e45ac27160dd7ead99c864a1b550c7edb1246950fe32dcc049799f9085287f0a747a6ef7a023df46a23a22f3e833bbf8d404f84344870492658256ee1dfc40fda33bb8d48fc72d4520ba9fc820c9123104a045206809037709f2a5f6723fa77d6bac5a573823d4ec3a7f1cb786a52ee2697e622e5d75962fa554d1024a6c355e21f33a63b2b72e6c4742a8b1c373aa532b40518c38c90b5373c2eb8c9d7be2a9e16047a3ee09dc9a6849deac5183ace6cfe91a9bef2ffc0a7df6ccebfd4c858c84b0e0355650d7466971e66f1e3883013e5ad1be33199b1d110b79070ac1b745ccb14cf63a08f8cca3a21c9525e626ff5f0c34746e10750fb742ad51f11f2acae3676c2111853d7250d01b77821a6ba9e04400ba2c543ca9f2d701ae6f47bfad14ffe3039ee9e71f7b2401359ade9938750ddb9c5a8b018a7929ed8d0e717ff1861446ce17535e9b17c187711190aae3388bd9490837a636c25ed4d42d7079ad1a51e13292c683d5d012abcf46965c534b83ab53f2c1f0cf5830ef7582e06863a33c19a70511df632885d63245965047ea96b56f1af5b3b94a54999f784fb9574fdfcd7c1230e07a2aaa04acd3097b2b9f8ddba05ae9734491deb5c1a513c76ed276cb78bbf4839dae3156d76af444a5805129d5df791167a9c8576a1d7f760b2d2797c4658669608706fbd0ace1be2346f74862dfc9ef518e55632e43c043186e5d070deb34d12fb9e5aba84e5cb50213dc88efd39cc35bf42455aa82d5e3b707b3140be3b8623b34fdd81d08615c188ae8438a13881fdf6bf32f2cb9ff5fa625561040c6b71d4b8eccc90bc3b99650d28dd1ee63773e49664e3d48c484996b290943635a6f2eb1ce9796d3fa144a3f00ef82faaa32d6a413668f7b521517cb68b2b017fcf56c79326fa5e4060e643631ca3f0a0dc0ed718798b6f46b130d437c33f64039e887324b6f5e604b1669d613923794edbf04b1b3caea54793b52b44b170173a4f25c7ecef3b71e2aad76e556b1cb9f1d637ec52ececfa950dd31dbb6a60828a3ad34c1beffe09eb4785786d63bad10a0b0f66ea88c57380f38ea85f018dbd7f538cf1ee7624095b9a01ec5edd528f281168af020609e651ff316aa1320a710134ddfca600cc72174dcdb846d2aa29916488aa1b537b66da92e61af526debef4eb38c984569eaf549ff2129449269b492d030cd74d885f6f5785881cc4804b4a8a09ba4ff7aefe9074ac7d0c4f05d51fe4cc0ff7388a772092b9d02d70e5433a5cf3e02f46a6bd6b818d59a07ce3b9fbbf8b5faba74563bcc5240930c2d406c9aaee3e3ce0429bf68ac2b0a57adb09414cff50817d2a48fb9fa624ab863cb0c31a8b8dc5eaf6fa68cc1d7c6c685c5a33edd5c8933b9e8ab628ee428d0743699b2ff17f25586c7ce959280bb0b8c5342251f0a30b53dbc7bf1ee426ac9619c3560f811f2268ee37f189794e2e4b3db3a2fb2e34b649e504fb467438abfd1082619cc4a0b30d66beb831077812e418d2e2148db10cf4d4a29101ca52ec445b8d83519dd7de85a98e0beae9ee537096d3f1a55a7a80cdfa93d25f07c9f98e8af18cde19ec1f99c5dd4588b717a5039ddb7f177717caf0d0fd45420a70dbd6d3146890d9e450d5224146db4c33b779e3c3a04b976c052bad042ac57dd38be45407808c0fb0d7e2a8819e6cd53c6739e6612996ddaa6f066552590aa0343bc1e62b298ff2514a0cef8be21956c2e942816f7a3a3a0935eaf9b37251409ce444c986c3817e82835555fe18239f3ae33469d7965c2bde9991fde556bd07af01df52bbde0c35bb4ef48e3b5d0db53f8ca4ed35b83f760f0a1bc4ed9f86e85d6039a17df373c85402ef956f01db00eb39c4b74bd0660d29ee746714d9780d738e05c6cca414ce3d7b40dda8036a9eea9ab1388805f913eb19bdd3f09d9e161eaa50231bd9caba61971f194332dd28c696a60458c1c6c2cc5da8b1192611c7c553e9e12fe48ce46bbb891be8bb118721c86222e671ddd1da8f0ccb2b68e02f2014b4925e904e88369aaf7466bd7033a60c265d45955944916ecbdb84bf1b522b01b0149c632e04c568a7eb627c5bb90ece052ebcf79166c28b30d23fe52da0a5ab5dea83ca479a3e3b7a9cfbbfea04dbe6137c19d067317c2ec427a8c75a6b06bec6dcd5d5c0edc9aa80b9003b8e17c088b2f3db327d3e42630d82d20120240c3ba56232280787da4aabbf5bc95a864029f00710e195f2a76460a0317d10b552fe1bea097e41d49756c680a41d6ac186e62169b6b6cd7776ea84618b5b752328a5bacaa10aa122ff9b2698b43efe73d852a899db644863c8c9bc8068ea86ea843fd6fe36272b91cdc5d5317083ef3fd1e5462a0b0d0604dc57b3bbfceb0fca4cd349625dd7b25166af30efe5ee6a0af953a74d65f4736c59918ee55a3b0d9d9d42e04c7f8a77e479109f740e20c464d5d7e3d16805f47b61f403ff7f408c9e850d9baacd8067e544536a4953480b0f9ee9cd45f41ebd67b51f78788a6470cb1e5ca72ca346ce8a50d0ca0c921d5576a4455a1afb6d0bc688004712ee122cacdb29c51e84893324c27fa4a3f1917edf5352272b4c97579a6152e4b77663d0ab532915f2eeb6a862de8b696452321b660c3f2449673d086e95a7af28845a5259b763e0fcd09f72acf7b6c811066263060e5aa5b24658e880a01fd56bda4dad5ab604e129290f7d5489728f2a40968c6168b21cebbbcd11727cc9e9160c4e92e04387d3b0d62aab06a61f26daedd9fed11816ef2180172a47f47184ac4032b88758c98a2e0fb200f70e93ba695f5ebb7a1029610ad360d3b7fa1b4640b9dc674d3625eef786da93dff19bc7991b5d6193a3896664763fde479b5dfc04812111a80782854f2cf68ca7d82765cc9eb40fba4b44640710ed6e653abf9f07b466333f4fd22784d53cf40e17120f42caa841eaa24056b237827b0f47f7257c103c35027e9f503e5acfd023e7357b600d3084d361d5ee65ba319b45c153212a54e6fed85af7e43e0a926ebcbc2edf8de7e2ec9528f00bec262ad04d5c9dafccaea06a24748d28bf1799bae0e895543084539c50b5aaa4fb50d7431d6f0c8cee2a54aaf7ee7919b55bf40adb688632e5dbe273cea09e97b19c3d8e1f4de000deb66fa1942ad03a62d3252f51992244366c156000b49c297167a6cbdedea7ebae139d295f0ad298e0864249b905b7eb812886ec70ecdb286702274b5b8574149bf3866f9e46b997ff5ed622b169a0eb071347f18d530db1663906a28f4544ee4e004ab87b65476af30ede118052ff052b8dc986ca2c93dd5d4943266a579c7698ea014f688b3e8063a107feb162d392e2177b01bff77fb5abe5feebd0607158049a5a093325b7c9ee6b4dfa7a9f65c7c2fb628920d3603a1c2dad979eaa047cd661a268af1078c9788d720e64e4ce9d12e68de1e417ef2f293323681e1071f9220e1ee43d2e29d111b870ce3439f5100ecd4551ab65ee74aa1667e564957e9bc0ae1ea193980da2a0ec2698073388c85bec25ef447f0d5e93a5203fa44dff268e5cb799ed3b66e63d5e07b487e7534f24934c73a62a243e0151843a0fd3807711a101eaa7fc71f0ba68aebb9534d57cba41b094eebfb4c31cca8eddfa426f676aa347be8a7023a4e91ddb154b35cd4d5f7dbc2e5db491de99f33fc2cff2d57029ac950e1ccd681980af6a4e8969dfe39b3c7bfcbcf8fac92f1e6ec9fe572bfa6a7d65860eab2ed10ac01a71290b52e3148e84b7376a8605cd2bb0e8681ffc54691ce087685e33921bd44d36c78291713dce17569570f62137e6904f0d68cf53aa2ec395c389a75141f08114fb293ea63950e4ffee55ec6fc83cf44876b8e7f25cdd393ff87b9eda6eb746085b61a6900de191f0ce2cb388d61ece52e78bc47368194e8e00277e0d1631e6b9d4626ef76f8522582ccd5a40be3febc699bb510acc6271d55ff0f4cf3bb7669855a72efd9ca3e1056a2fe592a5bc877cce2b1f63b58383971da87873d2d1349cf5881242cdce4e7e2c5c514755746a0e0a7c2a6d9701cde005ae3420beb17c379a3516662253554f51f0423bb1844b0b90c54ed8177ceb0e1036a6609d836e748ca06c40ca64befadc6443ec286a0ce464678e8d11eb455f7bb305acebf6cb1f50e394a9bfeb752df1687831bac9cdd811f4f112ef6658d0f8799a866374ff96c5e2b79f30e7a74f8a2bc9ed1f88f01f30e30cb78ffb2bff10108f35e910ee3be4463e9e6f0ed910e8d598326e71dfa2277ffe5579d7fe9b6018bfe295b25219eae07b3b0270665c3fa00c3e0d180812b5cd62925585de84a7c48a9a86dba96544a251654d1966e082432dc85b6149cf21e91a46020ec32b66d28ba3b6a90c0617bc6fdd55aea819af2bcf84864ad60c28fe3c9f8339d0aee68b39d97f63b6e082835d86119cf9b9fdc8b827c847ce40aa10e1577a710132316845e825345e95bdf94d0c66ec65a6c4319fce4792313663b5f7a651a6710783e6ab71608ac6cbbf3af6911adf596ccf7c172b9bd5bceb6db379967b32b143bdd11d2ee12ddf64ecef6391e0f8570e6cddd3db95204919362b89b739fa94e7c1bfde799fd5e22aa25ca6ca42e30c08e23aae2385d99ebab441072a880dcefdab74a4c9bd39d363f6d1933d59400fca161d432aa00f23b1b1c19a154be8989699d549b66d44e39896f5523443bc6ddf4a65e91f1f3fb7b52318869a05856a4fc92f3694c81ed833c972fb918f7e5\",\"cipherparams\":{\"iv\":\"8c46d6162cd4c765759aedcbce2a5874\"},\"kdf\":\"scrypt\",\"kdfparams\":{\"dklen\":32,\"n\":262144,\"p\":1,\"r\":8,\"salt\":\"82fb6cdc6917609135277badacf15baa31899d08b71a5a0fa33167167c161537\"},\"mac\":\"9187b17f7eca48e6b8c586b0cd790dbe0feb876ac8385f93faa7d5e22a3c8fc7\"},\"id\":\"92caf6ee-2d43-48c0-859e-ffa1e0e23312\",\"version\":3}";
|
|
318
|
+
const examplePassphrase = "QuantumCoinExample123!";
|
|
319
|
+
let walletObj1 = qcsdk.deserializeEncryptedWallet(walletEncryptedJson1, examplePassphrase);
|
|
320
|
+
if (walletObj1 === null) {
|
|
321
|
+
throw new Error("deserializeEncryptedWallet failed");
|
|
322
|
+
}
|
|
323
|
+
if (walletObj1.address.toLowerCase() !== "0x1a846ABE71C8B989e8337c55d608Be81C28Ab3b2e40c83eaA2A68D516049AeC6".toLowerCase()) {
|
|
324
|
+
throw new Error("deserializeEncryptedWallet address check failed");
|
|
325
|
+
}
|
|
326
|
+
console.log("wallet address from deserializeEncryptedWallet is " + walletObj1.address);
|
|
327
|
+
|
|
328
|
+
//Save to an encrypted wallet that can then be restored into an external wallet application such as Desktop/Web/CLI/Mobile wallet
|
|
329
|
+
let walletObj2 = qcsdk.newWallet();
|
|
330
|
+
let walletEncryptedJson2 = qcsdk.serializeEncryptedWallet(walletObj2, examplePassphrase);
|
|
331
|
+
if (walletEncryptedJson2 === null) {
|
|
332
|
+
throw new Error("serializeEncryptedWallet failed");
|
|
333
|
+
}
|
|
334
|
+
console.log("Serialized wallet: " + walletEncryptedJson2); //just an example for demonstration, do not actually log to console
|
|
335
|
+
|
|
336
|
+
//Try opening the same wallet again
|
|
337
|
+
let walletObj3 = qcsdk.deserializeEncryptedWallet(walletEncryptedJson2, examplePassphrase);
|
|
338
|
+
if (walletObj3 === null) {
|
|
339
|
+
throw new Error("deserializeEncryptedWallet failed");
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (walletObj2.address.toLowerCase() !== walletObj3.address.toLowerCase()) {
|
|
343
|
+
throw new Error("deserializeEncryptedWallet address check failed");
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
//Sign a transaction from a deserialized wallet (1)
|
|
347
|
+
qcsdk.signSendCoinTransaction(walletObj1, toAddressExample, coinsExample, nonceExample).then((signResult) => {
|
|
348
|
+
console.log("signSendCoinTransaction walletObj1 resultCode: " + signResult.resultCode);
|
|
349
|
+
console.log("signSendCoinTransaction walletObj1 hash: " + signResult.txnHash);
|
|
350
|
+
console.log("signSendCoinTransaction walletObj1 txnData: " + signResult.txnData); //txnData is to be sent to postTransaction
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
//Sign a transaction from a deserialized wallet (3)
|
|
354
|
+
qcsdk.signSendCoinTransaction(walletObj1, toAddressExample, coinsExample, nonceExample).then((signResult) => {
|
|
355
|
+
console.log("signSendCoinTransaction walletObj3 resultCode: " + signResult.resultCode);
|
|
356
|
+
console.log("signSendCoinTransaction walletObj3 hash: " + signResult.txnHash);
|
|
357
|
+
console.log("signSendCoinTransaction walletObj3 txnData: " + signResult.txnData); //txnData is to be sent to postTransaction
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
//Create a new seed word list
|
|
361
|
+
let seedWords = qcsdk.newWalletSeed();
|
|
362
|
+
if (seedWords === null) {
|
|
363
|
+
console.error("newWalletSeed failed");
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
console.log ("SeedWords: " + seedWords);
|
|
367
|
+
|
|
368
|
+
//Open a wallet from seed words
|
|
369
|
+
let seedWallet = qcsdk.openWalletFromSeedWords(seedWords);
|
|
370
|
+
if (seedWallet === null) {
|
|
371
|
+
console.error("openWalletFromSeedWords failed");
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
console.log("seedWallet address: " + seedWallet.address);
|
|
375
|
+
|
|
376
|
+
//Open a wallet from seed words static
|
|
377
|
+
let seedWordList = "servetize,redmation,suaveton,dreadtolk,rondial,pondicle,miscoil,teaguery,dylodecid,portnel,mantical,slapware,sluthike,tactise,crierial,tajluvki,pranicum,sockcup,stacksong,duerling,genogram,peasate,pulubly,skimpop,feldtail,saprostal,crabrock,radiment,dolocsin,strigemen,juryeuk,fextial,merunized,tangienti,stylocyte,plumvieve,bobstike,nosecrown,acudemy,gripstick,lacreous,marculade,sporculum,outslope,bioburden,trompong,sidelay,finchage";
|
|
378
|
+
let seedWordArray = seedWordList.split(",");
|
|
379
|
+
let seedWallet2 = qcsdk.openWalletFromSeedWords(seedWordArray);
|
|
380
|
+
if (seedWallet2 === null) {
|
|
381
|
+
console.error("openWalletFromSeedWords failed");
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
if (seedWallet2.address !== "0xc7C24aE0Db614F1638C5161e823A539a0293238366d4EaF29A63316D631e964F") {
|
|
385
|
+
console.error("seedWallet2 check failed");
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
console.log("seedWallet2 address: " + seedWallet2.address);
|
|
389
|
+
|
|
390
|
+
//Sign a transaction from a wallet created from seed words
|
|
391
|
+
qcsdk.signSendCoinTransaction(seedWallet, toAddressExample, coinsExample, nonceExample).then((signResult) => {
|
|
392
|
+
console.log("signSendCoinTransaction seedWallet resultCode: " + signResult.resultCode);
|
|
393
|
+
console.log("signSendCoinTransaction seedWallet hash: " + signResult.txnHash);
|
|
394
|
+
console.log("signSendCoinTransaction seedWallet txnData: " + signResult.txnData); //txnData is to be sent to postTransaction
|
|
395
|
+
});
|
|
290
396
|
});
|
|
291
397
|
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"ethers": "^6.13.4",
|
|
13
|
-
"quantum-coin-js-sdk": "^1.0.
|
|
13
|
+
"quantum-coin-js-sdk": "^1.0.15"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"node_modules/@adraffy/ens-normalize": {
|
|
@@ -81,17 +81,19 @@
|
|
|
81
81
|
}
|
|
82
82
|
},
|
|
83
83
|
"node_modules/quantum-coin-js-sdk": {
|
|
84
|
-
"version": "1.0.
|
|
85
|
-
"resolved": "https://registry.npmjs.org/quantum-coin-js-sdk/-/quantum-coin-js-sdk-1.0.
|
|
86
|
-
"integrity": "sha512-
|
|
84
|
+
"version": "1.0.15",
|
|
85
|
+
"resolved": "https://registry.npmjs.org/quantum-coin-js-sdk/-/quantum-coin-js-sdk-1.0.15.tgz",
|
|
86
|
+
"integrity": "sha512-IeWUSrJ0NPLmsLCa1Eg4WYYRNlpqZWzAkHpb5kOcR5Qn9WVjjN5ZZi7LQlAjstXR8GmZ56biy5w4EMa2nM/azQ==",
|
|
87
|
+
"license": "MIT",
|
|
87
88
|
"dependencies": {
|
|
88
89
|
"quantum-coin-pqc-js-sdk": "^1.0.0"
|
|
89
90
|
}
|
|
90
91
|
},
|
|
91
92
|
"node_modules/quantum-coin-pqc-js-sdk": {
|
|
92
|
-
"version": "1.0.
|
|
93
|
-
"resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.
|
|
94
|
-
"integrity": "sha512-
|
|
93
|
+
"version": "1.0.1",
|
|
94
|
+
"resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.1.tgz",
|
|
95
|
+
"integrity": "sha512-d837t+/wVt8SN6xp3RMAkHvClgrwo2VV254eIsz6do2HD1GmzXCH+vts9S4jILHo7wK0ro7SHRwzZLR9AEhOIw==",
|
|
96
|
+
"license": "MIT"
|
|
95
97
|
},
|
|
96
98
|
"node_modules/tslib": {
|
|
97
99
|
"version": "2.7.0",
|
|
@@ -122,6 +124,14 @@
|
|
|
122
124
|
"optional": true
|
|
123
125
|
}
|
|
124
126
|
}
|
|
127
|
+
},
|
|
128
|
+
"quantum-coin-js-sdk": {
|
|
129
|
+
"version": "1.0.15",
|
|
130
|
+
"extraneous": true,
|
|
131
|
+
"license": "MIT",
|
|
132
|
+
"dependencies": {
|
|
133
|
+
"quantum-coin-pqc-js-sdk": "^1.0.0"
|
|
134
|
+
}
|
|
125
135
|
}
|
|
126
136
|
}
|
|
127
137
|
}
|
package/example/package.json
CHANGED
package/index.js
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
* var qcsdk = require('quantum-coin-js-sdk');
|
|
17
17
|
*
|
|
18
18
|
* //Initialize the SDK first before invoking any other function
|
|
19
|
-
* var clientConfigVal = new qcsdk.Config("https://
|
|
19
|
+
* var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //TMainnet Block Explorer: https://QuantumScan.com
|
|
20
20
|
*
|
|
21
21
|
* qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
22
22
|
*
|
|
@@ -32,12 +32,16 @@ const path = require('path');
|
|
|
32
32
|
var wasmexec = require('./wasm_exec');
|
|
33
33
|
var pqc = require('quantum-coin-pqc-js-sdk');
|
|
34
34
|
const crypto = require("crypto");
|
|
35
|
+
var seedwords = require('seed-words');
|
|
35
36
|
|
|
36
37
|
var config = null;
|
|
37
38
|
var isInitialized = false;
|
|
38
39
|
const DEFAULT_GAS = 21000;
|
|
39
40
|
const API_KEY_HEADER_NAME = "X-API-KEY";
|
|
40
41
|
const REQUEST_ID_HEADER_NAME = "X-REQUEST-ID";
|
|
42
|
+
const CRYPTO_SEED_WORDS = 48
|
|
43
|
+
const CRYPTO_SEED_BYTES = 96
|
|
44
|
+
const CRYPTO_EXPANDED_SEED_BYTES = 160
|
|
41
45
|
|
|
42
46
|
/**
|
|
43
47
|
* @class
|
|
@@ -48,8 +52,8 @@ const REQUEST_ID_HEADER_NAME = "X-REQUEST-ID";
|
|
|
48
52
|
class Config {
|
|
49
53
|
/**
|
|
50
54
|
* Creates a config class
|
|
51
|
-
* @param {string} readUrl - The Read API URL pointing to a read relay. See https://github.com/
|
|
52
|
-
* @param {string} writeUrl - The Write API URL pointing to a write relay. See https://github.com/
|
|
55
|
+
* @param {string} readUrl - The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://sdk.readrelay.quantumcoinapi.com
|
|
56
|
+
* @param {string} writeUrl - The Write API URL pointing to a write relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://sdk.writerelay.quantumcoinapi.com
|
|
53
57
|
* @param {number} chainId - The chain id of the blockchain. Mainnet chainId is 123123. Testnet T4 chainId is 310324.
|
|
54
58
|
* @param {string} readApiKey - Optional parameter if authorization is enabled for the relay service. API Key for authorization. Defaults to null which indicates no authorization.
|
|
55
59
|
* @param {string} writeApiKey - Optional parameter if authorization is enabled for the relay service. API Key for authorization. Defaults to null which indicates no authorization.
|
|
@@ -57,14 +61,14 @@ class Config {
|
|
|
57
61
|
|
|
58
62
|
constructor(readUrl, writeUrl, chainId, readApiKey, writeApiKey) {
|
|
59
63
|
/**
|
|
60
|
-
* The Read API URL pointing to a read relay. See https://github.com/
|
|
64
|
+
* The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay
|
|
61
65
|
* @type {string}
|
|
62
66
|
* @public
|
|
63
67
|
*/
|
|
64
68
|
this.readUrl = readUrl;
|
|
65
69
|
|
|
66
70
|
/**
|
|
67
|
-
* The Read API URL pointing to a read relay. See https://github.com/
|
|
71
|
+
* The Read API URL pointing to a read relay. See https://github.com/quantumcoinproject/quantum-coin-go/tree/dogep/relay
|
|
68
72
|
* @type {string}
|
|
69
73
|
* @public
|
|
70
74
|
*/
|
|
@@ -97,7 +101,7 @@ class Config {
|
|
|
97
101
|
* @class
|
|
98
102
|
* @constructor
|
|
99
103
|
* @public
|
|
100
|
-
* @classdesc This class represents a Wallet. Use the verifyWallet function to verify if a wallet is valid. Verifying the wallet is highly recommended, especially if it comes from an untrusted source. For more details on the underlying cryptography of the Wallet, see https://github.com/
|
|
104
|
+
* @classdesc This class represents a Wallet. Use the verifyWallet function to verify if a wallet is valid. Verifying the wallet is highly recommended, especially if it comes from an untrusted source. For more details on the underlying cryptography of the Wallet, see https://github.com/QuantumCoinProject/hybrid-pqc
|
|
101
105
|
*/
|
|
102
106
|
class Wallet {
|
|
103
107
|
/**
|
|
@@ -704,8 +708,9 @@ async function initialize(clientConfig) {
|
|
|
704
708
|
}
|
|
705
709
|
await InitAccountsWebAssembly();
|
|
706
710
|
config = clientConfig;
|
|
707
|
-
isInitialized =
|
|
708
|
-
|
|
711
|
+
isInitialized = await seedwords.initialize();
|
|
712
|
+
|
|
713
|
+
return isInitialized;
|
|
709
714
|
}
|
|
710
715
|
|
|
711
716
|
/**
|
|
@@ -752,6 +757,173 @@ function newWallet() {
|
|
|
752
757
|
return walletRet;
|
|
753
758
|
}
|
|
754
759
|
|
|
760
|
+
/**
|
|
761
|
+
* The newWalletSeed function creates a new Wallet seed word list. The return array can then be passed to the openWalletFromSeedWords function to create a new wallet.
|
|
762
|
+
*
|
|
763
|
+
* @function newWalletSeed
|
|
764
|
+
* @return {array} Returns an array of seed words (48 words in total). Returns null if the operation failed.
|
|
765
|
+
*/
|
|
766
|
+
function newWalletSeed() {
|
|
767
|
+
if (isInitialized === false) {
|
|
768
|
+
return -1000;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
let seedArray = pqc.cryptoNewSeed();
|
|
772
|
+
if (seedArray === null || seedArray.length === null || seedArray.length !== CRYPTO_SEED_BYTES) {
|
|
773
|
+
return null;
|
|
774
|
+
}
|
|
775
|
+
|
|
776
|
+
let wordList = seedwords.getWordListFromSeedArray(seedArray);
|
|
777
|
+
if (wordList === null || wordList.length === null || wordList.length !== CRYPTO_SEED_WORDS) {
|
|
778
|
+
return null;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
return wordList;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
/**
|
|
785
|
+
* The openWalletFromSeedWords function creates a wallet from a seed word list. The seed word list is available for wallets created from Desktop/Web/Mobile wallets.
|
|
786
|
+
*
|
|
787
|
+
* @function openWalletFromSeedWords
|
|
788
|
+
* @param {array} seedWordList - An array of seed words. There should be 48 words in total.
|
|
789
|
+
* @return {Wallet} Returns a Wallet object. Returns null if the operation failed.
|
|
790
|
+
*/
|
|
791
|
+
function openWalletFromSeedWords(seedWordList) {
|
|
792
|
+
if (isInitialized === false) {
|
|
793
|
+
return -1000;
|
|
794
|
+
}
|
|
795
|
+
|
|
796
|
+
if (seedWordList === null || seedWordList.length === null || seedWordList.length != CRYPTO_SEED_WORDS) {
|
|
797
|
+
return null;
|
|
798
|
+
}
|
|
799
|
+
|
|
800
|
+
let seedArray = seedwords.getSeedArrayFromWordList(seedWordList);
|
|
801
|
+
|
|
802
|
+
if (seedArray === null || seedArray.length === null || seedArray.length !== CRYPTO_SEED_BYTES) {
|
|
803
|
+
return null;
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
let expandedSeedArray = pqc.cryptoExpandSeed(seedArray);
|
|
807
|
+
if (expandedSeedArray === null || expandedSeedArray.length === null || expandedSeedArray.length !== CRYPTO_EXPANDED_SEED_BYTES) {
|
|
808
|
+
return null;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
let keyPair = pqc.cryptoNewKeyPairFromSeed(expandedSeedArray);
|
|
812
|
+
let address = PublicKeyToAddress(keyPair.getPublicKey());
|
|
813
|
+
let walletRet = new Wallet(address, keyPair.getPrivateKey(), keyPair.getPublicKey());
|
|
814
|
+
return walletRet;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
/**
|
|
818
|
+
* The deserializeEncryptedWallet function opens a wallet backed-up using an application such as the Desktop/Mobile/CLI/Web wallet. This function can take upto a minute or so to execute. You should open wallets only from trusted sources.
|
|
819
|
+
*
|
|
820
|
+
* @function deserializeEncryptedWallet
|
|
821
|
+
* @param {string} walletJsonString - The json string from a wallet file.
|
|
822
|
+
* @param {string} passphrase - The passphrase used to encrypt the wallet.
|
|
823
|
+
* @return {Wallet} Returns a Wallet object. Returns null if opening the wallet fails.
|
|
824
|
+
*/
|
|
825
|
+
function deserializeEncryptedWallet(walletJsonString, passphrase) {
|
|
826
|
+
if (isInitialized === false) {
|
|
827
|
+
return -1000;
|
|
828
|
+
}
|
|
829
|
+
|
|
830
|
+
if (walletJsonString == null || passphrase == null) {
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
if (typeof walletJsonString === 'string' || walletJsonString instanceof String) {
|
|
835
|
+
|
|
836
|
+
} else {
|
|
837
|
+
return null;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
if (typeof passphrase === 'string' || passphrase instanceof String) {
|
|
841
|
+
|
|
842
|
+
} else {
|
|
843
|
+
return null;
|
|
844
|
+
}
|
|
845
|
+
|
|
846
|
+
let walletJsonObj = JSON.parse(walletJsonString);
|
|
847
|
+
|
|
848
|
+
if (walletJsonObj == null) {
|
|
849
|
+
return null;
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
if (walletJsonObj.address == null) {
|
|
853
|
+
return null;
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
let keyPairString = JsonToWalletKeyPair(walletJsonString, passphrase);
|
|
857
|
+
if (keyPairString == null) {
|
|
858
|
+
return null;
|
|
859
|
+
}
|
|
860
|
+
|
|
861
|
+
let keyPairSplit = keyPairString.split(",");
|
|
862
|
+
if (keyPairSplit.length < 2) {
|
|
863
|
+
return null;
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
let privateKeyArray = base64ToBytes(keyPairSplit[0]);
|
|
867
|
+
let publicKeyArray = base64ToBytes(keyPairSplit[1]);
|
|
868
|
+
let address = PublicKeyToAddress(publicKeyArray);
|
|
869
|
+
if (address == null) {
|
|
870
|
+
return null;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
if (typeof address === 'string' || address instanceof String) {
|
|
874
|
+
|
|
875
|
+
} else {
|
|
876
|
+
return null;
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
let addressCheck = "0x" + walletJsonObj.address.toLowerCase();
|
|
880
|
+
if (addressCheck != address.toLowerCase()) {
|
|
881
|
+
return null;
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
let wallet = new Wallet(address, privateKeyArray, publicKeyArray);
|
|
885
|
+
|
|
886
|
+
return wallet;
|
|
887
|
+
}
|
|
888
|
+
|
|
889
|
+
/**
|
|
890
|
+
* The serializeEncryptedWallet function encrypts and serializes a Wallet object to a JSON string readable by the Desktop/Mobile/Web/CLI wallet applications. You can save this string to a file and open the file in one of these wallet applications. You may also open this string using the deserializeEncryptedWallet function. If you loose the passphrase, you will be unable to open the wallet. This function can take upto a minute or so to execute.
|
|
891
|
+
*
|
|
892
|
+
* @function serializeEncryptedWallet
|
|
893
|
+
* @param {Wallet} wallet - A Wallet object representing the wallet to serialize.
|
|
894
|
+
* @param {string} passphrase - A passphrase used to encrypt the wallet. It should atleast be 12 characters long.
|
|
895
|
+
* @return {string} Returns the Wallet in JSON string format. If the wallet is invalid, null is returned.
|
|
896
|
+
*/
|
|
897
|
+
function serializeEncryptedWallet(wallet, passphrase) {
|
|
898
|
+
if(verifyWallet(wallet) === false) {
|
|
899
|
+
return null;
|
|
900
|
+
}
|
|
901
|
+
|
|
902
|
+
if (passphrase == null) {
|
|
903
|
+
return null;
|
|
904
|
+
}
|
|
905
|
+
|
|
906
|
+
if (typeof passphrase === 'string' || passphrase instanceof String) {
|
|
907
|
+
|
|
908
|
+
} else {
|
|
909
|
+
return null;
|
|
910
|
+
}
|
|
911
|
+
|
|
912
|
+
if (passphrase.length < 12) {
|
|
913
|
+
return null;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
let walletJsonString = KeyPairToWalletJson(wallet.privateKey, wallet.publicKey, passphrase);
|
|
917
|
+
|
|
918
|
+
let walletJson = JSON.parse(walletJsonString);
|
|
919
|
+
let addressCheck = "0x" + walletJson.address;
|
|
920
|
+
if (addressCheck.toLowerCase() != wallet.address.toLowerCase()) {
|
|
921
|
+
return null;
|
|
922
|
+
}
|
|
923
|
+
|
|
924
|
+
return walletJsonString;
|
|
925
|
+
}
|
|
926
|
+
|
|
755
927
|
function base64ToBytes(base64) {
|
|
756
928
|
const binString = atob(base64);
|
|
757
929
|
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
@@ -1225,7 +1397,7 @@ async function getTransactionDetails(txnHash) {
|
|
|
1225
1397
|
* @async
|
|
1226
1398
|
* @function listAccountTransactions
|
|
1227
1399
|
* @param {string} address - The address for which the transactions have to be listed.
|
|
1228
|
-
* @param {number} pageNumber - The page number for which the transactions has to be listed for the account. Pass 0 to list the latest page.
|
|
1400
|
+
* @param {number} pageNumber - The page number for which the transactions has to be listed for the account. Pass 0 to list the latest page. Pass 1 to list the oldest page. A maximum of 20 transactions are returned in each page. The response of this API includes a field that shows the pageCount (total number of pages available). You can pass any number between 1 to pageCount to get the corresponding page.
|
|
1229
1401
|
* @return {Promise<ListAccountTransactionsResponse>} Returns a promise of type type ListAccountTransactionsResponse.
|
|
1230
1402
|
*/
|
|
1231
1403
|
async function listAccountTransactions(address, pageNumber) {
|
|
@@ -1257,7 +1429,6 @@ async function listAccountTransactions(address, pageNumber) {
|
|
|
1257
1429
|
}
|
|
1258
1430
|
|
|
1259
1431
|
var url = config.readUrl + "/account/" + address + "/transactions/" + pageNumber;
|
|
1260
|
-
console.log(url);
|
|
1261
1432
|
|
|
1262
1433
|
try {
|
|
1263
1434
|
const response = await fetch(url, {
|
|
@@ -1314,7 +1485,7 @@ async function listAccountTransactions(address, pageNumber) {
|
|
|
1314
1485
|
|
|
1315
1486
|
/**
|
|
1316
1487
|
* The signSendCoinTransaction function returns a signed transaction.
|
|
1317
|
-
* Since the gas fee for sending coins is fixed at 1000 coins, there is no option to set the gas fee explicitly.
|
|
1488
|
+
* Since the gas fee for sending coins is fixed at 1000 coins, there is no option to set the gas fee explicitly.
|
|
1318
1489
|
* This function is useful for offline (cold storage) wallets, where you can sign a transaction offline and then use the postTransaction function to post it on a connected device.
|
|
1319
1490
|
* Another usecase for this function is when you want to first store a signed transaction to a database, then queue it and finally submit the transaction by calling the postTransaction function.
|
|
1320
1491
|
*
|
|
@@ -1473,6 +1644,8 @@ module.exports = {
|
|
|
1473
1644
|
initialize,
|
|
1474
1645
|
serializeWallet,
|
|
1475
1646
|
deserializeWallet,
|
|
1647
|
+
serializeEncryptedWallet,
|
|
1648
|
+
deserializeEncryptedWallet,
|
|
1476
1649
|
verifyWallet,
|
|
1477
1650
|
newWallet,
|
|
1478
1651
|
sendCoins,
|
|
@@ -1495,5 +1668,7 @@ module.exports = {
|
|
|
1495
1668
|
TransactionDetailsResult,
|
|
1496
1669
|
AccountTransactionsResult,
|
|
1497
1670
|
ListAccountTransactionsResponse,
|
|
1498
|
-
AccountTransactionCompact
|
|
1671
|
+
AccountTransactionCompact,
|
|
1672
|
+
newWalletSeed,
|
|
1673
|
+
openWalletFromSeedWords
|
|
1499
1674
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quantum-coin-js-sdk",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.16",
|
|
4
4
|
"description": "Quantum Coin - Q SDK in JavaScript",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://github.com/quantumcoinproject/quantum-coin-js-sdk#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"quantum-coin-pqc-js-sdk": "^1.0.0"
|
|
31
|
+
"quantum-coin-pqc-js-sdk": "^1.0.0",
|
|
32
|
+
"seed-words": "^1.0.1"
|
|
32
33
|
}
|
|
33
34
|
}
|
package/wasm_exec.js
CHANGED
|
@@ -1,6 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
/*
|
|
2
|
+
Copyright 2009 The Go Authors.
|
|
3
|
+
|
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
|
5
|
+
modification, are permitted provided that the following conditions are
|
|
6
|
+
met:
|
|
7
|
+
|
|
8
|
+
* Redistributions of source code must retain the above copyright
|
|
9
|
+
notice, this list of conditions and the following disclaimer.
|
|
10
|
+
* Redistributions in binary form must reproduce the above
|
|
11
|
+
copyright notice, this list of conditions and the following disclaimer
|
|
12
|
+
in the documentation and/or other materials provided with the
|
|
13
|
+
distribution.
|
|
14
|
+
* Neither the name of Google LLC nor the names of its
|
|
15
|
+
contributors may be used to endorse or promote products derived from
|
|
16
|
+
this software without specific prior written permission.
|
|
17
|
+
|
|
18
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
19
|
+
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
20
|
+
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
21
|
+
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
22
|
+
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
23
|
+
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
24
|
+
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
25
|
+
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
26
|
+
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
27
|
+
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
28
|
+
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
29
|
+
*/
|
|
4
30
|
|
|
5
31
|
"use strict";
|
|
6
32
|
|
|
@@ -558,4 +584,4 @@
|
|
|
558
584
|
};
|
|
559
585
|
}
|
|
560
586
|
}
|
|
561
|
-
})();
|
|
587
|
+
})();
|