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 CHANGED
@@ -1,2 +1,3 @@
1
+ .idea
1
2
  .vs/
2
3
  node_modules/
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.&lt;boolean&gt;</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/DogeProtocol/go-dp/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://relayread.quantumcoin.org Testnet T4: https://t4-relayread.quantumcoin.org |
133
- | writeUrl | <code>string</code> | The Write API URL pointing to a write relay. See https://github.com/DogeProtocol/go-dp/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://relaywrite.quantumcoin.org Testnet T4: https://t4-relaywrite.quantumcoin.org |
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/DogeProtocol/go-dp/tree/dogep/relay
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/DogeProtocol/go-dp/tree/dogep/relay
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/DogeProtocol/hybrid-pqc
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
 
@@ -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://relayread.quantumcoin.org", "https://relaywrite.quantumcoin.org", 123123, "", ""); //Mainnet
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.6"
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.12",
85
- "resolved": "https://registry.npmjs.org/quantum-coin-js-sdk/-/quantum-coin-js-sdk-1.0.12.tgz",
86
- "integrity": "sha512-6tL2h49j4Lqb4+80/V28pdulj9/fC9LNeolzxw3AujvZUClj3b5XUF9i2cWOmxTsHF3IGN4qSDghITXoKbhTag==",
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.0",
93
- "resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.0.tgz",
94
- "integrity": "sha512-SPRDhX6JHV0VJmIWB20S9YTH3oCQww7YoMjgt/4Ftt0U8yNVmUQOL79b/cknMPDd/zMZLAedmd3z8hs+Z8shig=="
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
  }
@@ -10,6 +10,6 @@
10
10
  "license": "MIT",
11
11
  "dependencies": {
12
12
  "ethers": "^6.13.4",
13
- "quantum-coin-js-sdk": "^1.0.6"
13
+ "quantum-coin-js-sdk": "^1.0.15"
14
14
  }
15
15
  }
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://t4-relayread.quantumcoin.org", "https://t4-relaywrite.quantumcoin.org", 310324, "", ""); //Testnet T4 Block Explorer: https://t4.scan.quantumcoin.org
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/DogeProtocol/go-dp/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://relayread.quantumcoin.org Testnet T4: https://t4-relayread.quantumcoin.org
52
- * @param {string} writeUrl - The Write API URL pointing to a write relay. See https://github.com/DogeProtocol/go-dp/tree/dogep/relay. The following URLs are community maintained. Please use your own relay service. Mainnet: https://relaywrite.quantumcoin.org Testnet T4: https://t4-relaywrite.quantumcoin.org
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/DogeProtocol/go-dp/tree/dogep/relay
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/DogeProtocol/go-dp/tree/dogep/relay
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/DogeProtocol/hybrid-pqc
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 = true;
708
- return true;
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.14",
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
- // Copyright 2018 The Go Authors. All rights reserved.
2
- // Use of this source code is governed by a BSD-style
3
- // license that can be found in the LICENSE file.
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
+ })();