quantum-coin-js-sdk 1.0.17 → 1.0.19
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/README.md +46 -6
- package/example/example-misc.js +57 -0
- package/example/example-send.js +70 -0
- package/example/example.js +9 -1
- package/example/package-lock.json +11 -21
- package/example/package.json +1 -1
- package/index.d.ts +29 -4
- package/index.js +88 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,8 +19,8 @@ Requires Node.js version v20.18.1 or higher
|
|
|
19
19
|
* [~Wallet](#module_quantum-coin-js-sdk..Wallet)
|
|
20
20
|
* [new Wallet(address, privateKey, publicKey)](#new_module_quantum-coin-js-sdk..Wallet_new)
|
|
21
21
|
* [.address](#module_quantum-coin-js-sdk..Wallet+address) : <code>string</code>
|
|
22
|
-
* [.privateKey](#module_quantum-coin-js-sdk..Wallet+privateKey)
|
|
23
|
-
* [.publicKey](#module_quantum-coin-js-sdk..Wallet+publicKey)
|
|
22
|
+
* [.privateKey](#module_quantum-coin-js-sdk..Wallet+privateKey) : <code>Array.<number></code>
|
|
23
|
+
* [.publicKey](#module_quantum-coin-js-sdk..Wallet+publicKey) : <code>Array.<number></code>
|
|
24
24
|
* [~BlockDetails](#module_quantum-coin-js-sdk..BlockDetails)
|
|
25
25
|
* [.blockNumber](#module_quantum-coin-js-sdk..BlockDetails+blockNumber) : <code>number</code>
|
|
26
26
|
* [~LatestBlockDetailsResult](#module_quantum-coin-js-sdk..LatestBlockDetailsResult)
|
|
@@ -108,6 +108,9 @@ Requires Node.js version v20.18.1 or higher
|
|
|
108
108
|
* [~listAccountTransactions(address, pageNumber)](#module_quantum-coin-js-sdk..listAccountTransactions) ⇒ <code>Promise.<ListAccountTransactionsResponse></code>
|
|
109
109
|
* [~signSendCoinTransaction(wallet, toAddress, coins, nonce)](#module_quantum-coin-js-sdk..signSendCoinTransaction) ⇒ <code>SignResult</code>
|
|
110
110
|
* [~sendCoins(wallet, toAddress, coins, nonce)](#module_quantum-coin-js-sdk..sendCoins) ⇒ <code>Promise.<SendResult></code>
|
|
111
|
+
* [~publicKeyFromSignature(digest, signature)](#module_quantum-coin-js-sdk..publicKeyFromSignature) ⇒ <code>Array.<number></code>
|
|
112
|
+
* [~publicKeyFromPrivateKey(privateKey)](#module_quantum-coin-js-sdk..publicKeyFromPrivateKey) ⇒ <code>Array.<number></code>
|
|
113
|
+
* [~addressFromPublicKey(publicKey)](#module_quantum-coin-js-sdk..addressFromPublicKey) ⇒ <code>string</code>
|
|
111
114
|
|
|
112
115
|
<a name="module_quantum-coin-js-sdk..Config"></a>
|
|
113
116
|
|
|
@@ -185,8 +188,8 @@ This class represents a Wallet. Use the verifyWallet function to verify if a wal
|
|
|
185
188
|
* [~Wallet](#module_quantum-coin-js-sdk..Wallet)
|
|
186
189
|
* [new Wallet(address, privateKey, publicKey)](#new_module_quantum-coin-js-sdk..Wallet_new)
|
|
187
190
|
* [.address](#module_quantum-coin-js-sdk..Wallet+address) : <code>string</code>
|
|
188
|
-
* [.privateKey](#module_quantum-coin-js-sdk..Wallet+privateKey)
|
|
189
|
-
* [.publicKey](#module_quantum-coin-js-sdk..Wallet+publicKey)
|
|
191
|
+
* [.privateKey](#module_quantum-coin-js-sdk..Wallet+privateKey) : <code>Array.<number></code>
|
|
192
|
+
* [.publicKey](#module_quantum-coin-js-sdk..Wallet+publicKey) : <code>Array.<number></code>
|
|
190
193
|
|
|
191
194
|
<a name="new_module_quantum-coin-js-sdk..Wallet_new"></a>
|
|
192
195
|
|
|
@@ -209,14 +212,14 @@ Address of the wallet. Is 66 bytes in length including 0x (if the wallet is vali
|
|
|
209
212
|
**Access**: public
|
|
210
213
|
<a name="module_quantum-coin-js-sdk..Wallet+privateKey"></a>
|
|
211
214
|
|
|
212
|
-
#### wallet.privateKey
|
|
215
|
+
#### wallet.privateKey : <code>Array.<number></code>
|
|
213
216
|
Private Key byte array of the wallet. Is 4064 bytes in length (if the wallet is valid).
|
|
214
217
|
|
|
215
218
|
**Kind**: instance property of [<code>Wallet</code>](#module_quantum-coin-js-sdk..Wallet)
|
|
216
219
|
**Access**: public
|
|
217
220
|
<a name="module_quantum-coin-js-sdk..Wallet+publicKey"></a>
|
|
218
221
|
|
|
219
|
-
#### wallet.publicKey
|
|
222
|
+
#### wallet.publicKey : <code>Array.<number></code>
|
|
220
223
|
Public Key byte array of the wallet. Is 1408 bytes in length (if the wallet is valid).
|
|
221
224
|
|
|
222
225
|
**Kind**: instance property of [<code>Wallet</code>](#module_quantum-coin-js-sdk..Wallet)
|
|
@@ -999,3 +1002,40 @@ The sendCoins function posts a send-coin transaction to the blockchain.
|
|
|
999
1002
|
| coins | <code>string</code> | The string representing the number of coins (in ether) to send. To convert between ethers and wei, see https://docs.ethers.org/v4/api-utils.html#ether-strings-and-wei |
|
|
1000
1003
|
| nonce | <code>number</code> | The nonce of the account retrieved by invoking the getAccountDetails function. You have to carefully manage state of the nonce to avoid sending the coins multiple times, such as when retrying sendCoins after a network error. |
|
|
1001
1004
|
|
|
1005
|
+
<a name="module_quantum-coin-js-sdk..publicKeyFromSignature"></a>
|
|
1006
|
+
|
|
1007
|
+
### quantum-coin-js-sdk~publicKeyFromSignature(digest, signature) ⇒ <code>Array.<number></code>
|
|
1008
|
+
The publicKeyFromSignature extracts the public key from a signature.
|
|
1009
|
+
|
|
1010
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
1011
|
+
**Returns**: <code>Array.<number></code> - - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
1012
|
+
|
|
1013
|
+
| Param | Type | Description |
|
|
1014
|
+
| --- | --- | --- |
|
|
1015
|
+
| digest | <code>Array.<number></code> | An array of bytes containing the digestHash. Should be of length 32. |
|
|
1016
|
+
| signature | <code>Array.<number></code> | An array of bytes containing the signature. |
|
|
1017
|
+
|
|
1018
|
+
<a name="module_quantum-coin-js-sdk..publicKeyFromPrivateKey"></a>
|
|
1019
|
+
|
|
1020
|
+
### quantum-coin-js-sdk~publicKeyFromPrivateKey(privateKey) ⇒ <code>Array.<number></code>
|
|
1021
|
+
The publicKeyFromPrivateKey extracts the public key from a private key.
|
|
1022
|
+
|
|
1023
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
1024
|
+
**Returns**: <code>Array.<number></code> - - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
1025
|
+
|
|
1026
|
+
| Param | Type | Description |
|
|
1027
|
+
| --- | --- | --- |
|
|
1028
|
+
| privateKey | <code>Array.<number></code> | An array of bytes containing the privateKey. |
|
|
1029
|
+
|
|
1030
|
+
<a name="module_quantum-coin-js-sdk..addressFromPublicKey"></a>
|
|
1031
|
+
|
|
1032
|
+
### quantum-coin-js-sdk~addressFromPublicKey(publicKey) ⇒ <code>string</code>
|
|
1033
|
+
The addressFromPublicKey returns the address corresponding to the public key.
|
|
1034
|
+
|
|
1035
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
1036
|
+
**Returns**: <code>string</code> - - Returns a hex string corresponding to the public key. Returns null if the operation failed.
|
|
1037
|
+
|
|
1038
|
+
| Param | Type | Description |
|
|
1039
|
+
| --- | --- | --- |
|
|
1040
|
+
| publicKey | <code>Array.<number></code> | An array of bytes containing the public key. |
|
|
1041
|
+
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
const qcsdk = require('quantum-coin-js-sdk');
|
|
2
|
+
const ethers = require('ethers');
|
|
3
|
+
|
|
4
|
+
var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
5
|
+
|
|
6
|
+
//Initialize the client configuration
|
|
7
|
+
//var clientConfigVal = new qcsdk.Config("https://t4-relayread.quantumcoin.org", "https://t4-relaywrite.quantumcoin.org", 310324, "", ""); //Testnet T4
|
|
8
|
+
//Testnet T4 Block Explorer: https://t4.scan.quantumcoin.org
|
|
9
|
+
|
|
10
|
+
//For mainnet, use the following configuration
|
|
11
|
+
//var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
12
|
+
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
13
|
+
|
|
14
|
+
//Local testing configuration
|
|
15
|
+
//var clientConfigVal = new qcsdk.Config("http://127.0.0.1:9090", "http://127.0.0.1:9091", 123123, "", ""); //local testing
|
|
16
|
+
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
17
|
+
|
|
18
|
+
//Initialize the SDK
|
|
19
|
+
qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
20
|
+
if (initResult === false) {
|
|
21
|
+
console.error("Initialize failed");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const digestHashBase64 = "aGkgdGhlcmVvY2tjaGFpbmJiYmJiYmJiYmJiYmJiYmI=";
|
|
26
|
+
const signatureBase64 = "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";
|
|
27
|
+
|
|
28
|
+
let digest = base64ToBytes(digestHashBase64);
|
|
29
|
+
let signature = base64ToBytes(signatureBase64);
|
|
30
|
+
|
|
31
|
+
let publicKey = qcsdk.publicKeyFromSignature(digest, signature);
|
|
32
|
+
console.log("publicKeyFromSignature publicKey length: " + publicKey.length);
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
//Open example wallet created using external wallet application such as Desktop/Web/CLI/Mobile wallet
|
|
36
|
+
const walletEncryptedJson = "{\"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}";
|
|
37
|
+
let examplePassphrase = "QuantumCoinExample123!";
|
|
38
|
+
let walletExample = qcsdk.deserializeEncryptedWallet(walletEncryptedJson, examplePassphrase);
|
|
39
|
+
console.log("walletExample.privateKey length " + walletExample.privateKey.length);
|
|
40
|
+
let publicKey2 = qcsdk.publicKeyFromPrivateKey(walletExample.privateKey);
|
|
41
|
+
console.log("publicKeyFromPrivateKey publicKey length: " + publicKey2.length);
|
|
42
|
+
if (publicKey2.length !== walletExample.publicKey.length) {
|
|
43
|
+
throw new Error("public key length compare failed");
|
|
44
|
+
}
|
|
45
|
+
for (i = 0; i < publicKey2.length; i++) {
|
|
46
|
+
if (publicKey2[i] !== walletExample.publicKey[i]) {
|
|
47
|
+
throw new Error("public key compare failed");
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
function base64ToBytes(base64) {
|
|
54
|
+
const binString = atob(base64);
|
|
55
|
+
return Uint8Array.from(binString, (m) => m.codePointAt(0));
|
|
56
|
+
}
|
|
57
|
+
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
const qcsdk = require('quantum-coin-js-sdk');
|
|
2
|
+
const ethers = require('ethers');
|
|
3
|
+
|
|
4
|
+
var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
5
|
+
|
|
6
|
+
//Initialize the client configuration
|
|
7
|
+
//var clientConfigVal = new qcsdk.Config("https://t4-relayread.quantumcoin.org", "https://t4-relaywrite.quantumcoin.org", 310324, "", ""); //Testnet T4
|
|
8
|
+
//Testnet T4 Block Explorer: https://t4.scan.quantumcoin.org
|
|
9
|
+
|
|
10
|
+
//For mainnet, use the following configuration
|
|
11
|
+
//var clientConfigVal = new qcsdk.Config("https://sdk.readrelay.quantumcoinapi.com", "https://sdk.writerelay.quantumcoinapi.com", 123123, "", ""); //Mainnet
|
|
12
|
+
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
13
|
+
|
|
14
|
+
//Local testing configuration
|
|
15
|
+
//var clientConfigVal = new qcsdk.Config("http://127.0.0.1:9090", "http://127.0.0.1:9091", 123123, "", ""); //local testing
|
|
16
|
+
//Mainnet Block Explorer: https://scan.quantumcoin.org
|
|
17
|
+
|
|
18
|
+
//Initialize the SDK
|
|
19
|
+
qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
20
|
+
if (initResult === false) {
|
|
21
|
+
console.error("Initialize failed");
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//More examples for sending are in examples.js
|
|
26
|
+
|
|
27
|
+
//Offline sign a transaction from existing wallet. This is typically called from an offline device hosting a cold storage wallet.
|
|
28
|
+
//Another usecase is to first store the signed transaction in a database and then later submit it using the postTransaction function.
|
|
29
|
+
|
|
30
|
+
//Open example wallet created using external wallet application such as Desktop/Web/CLI/Mobile wallet
|
|
31
|
+
const walletEncryptedJson = "{\"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}";
|
|
32
|
+
let examplePassphrase = "QuantumCoinExample123!";
|
|
33
|
+
let walletExample = qcsdk.deserializeEncryptedWallet(walletEncryptedJson, examplePassphrase);
|
|
34
|
+
|
|
35
|
+
var toAddressExample = "0x8293cd9b6ac502d2fe077b0c157dad39f36a5e546525b053151dced633634612";
|
|
36
|
+
var nonceExample = 0; //use the latest nonce for the address as shown in Block Explorer. If address does not exist, default to 0. You may also get the nonce programatically from qcsdk.getAccountDetails like shown below
|
|
37
|
+
/*
|
|
38
|
+
qcsdk.getAccountDetails(address).then((accountDetailsResult) => {
|
|
39
|
+
var nonceExample = accountDetailsResult.accountDetails.nonce;
|
|
40
|
+
}
|
|
41
|
+
*/
|
|
42
|
+
var coinsExample = "10"; //in ethers and not in wei
|
|
43
|
+
|
|
44
|
+
//Sign a transaction
|
|
45
|
+
qcsdk.signSendCoinTransaction(walletExample, toAddressExample, coinsExample, nonceExample).then((signResult) => {
|
|
46
|
+
console.log("signSendCoinTransaction resultCode: " + signResult.resultCode);
|
|
47
|
+
console.log("signSendCoinTransaction hash: " + signResult.txnHash);
|
|
48
|
+
console.log("signSendCoinTransaction txnData: " + signResult.txnData); //txnData is to be sent to postTransaction
|
|
49
|
+
|
|
50
|
+
//Send a transaction that was signed offline
|
|
51
|
+
qcsdk.postTransaction(signResult.txnData).then((sendResult) => {
|
|
52
|
+
if (sendResult === null) {
|
|
53
|
+
console.error(" postTransaction failed : sendResult is null");
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (sendResult.resultCode !== 0) {
|
|
58
|
+
console.log(" postTransaction failed. resultCode is " + sendResult.resultCode + " , requestId is " + sendResult.requestId);
|
|
59
|
+
if (sendResult.response !== null) {
|
|
60
|
+
console.log(" postTransaction response statusText " + JSON.stringify(sendResult.response.statusText));
|
|
61
|
+
console.log(" postTransaction ensure account has adequate gas and nonce is correct");
|
|
62
|
+
}
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
console.log(" postTransaction succeeded. This does not necessarily mean that the transaction has succeded. txnHash " + signResult.txnHash);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
|
package/example/example.js
CHANGED
|
@@ -74,7 +74,7 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
74
74
|
});
|
|
75
75
|
|
|
76
76
|
//Get the transaction details
|
|
77
|
-
let txnHash = "
|
|
77
|
+
let txnHash = "0xe6fbabc178adaaab6b9dbda086de53deaced1d6fe40e7db9539fe9e85695d1be"; //Just an example transaction hash https://quantumscan.com/txn/0xe6fbabc178adaaab6b9dbda086de53deaced1d6fe40e7db9539fe9e85695d1be
|
|
78
78
|
|
|
79
79
|
console.log("getTransactionDetails " + txnHash);
|
|
80
80
|
qcsdk.getTransactionDetails(txnHash).then((transactionDetailsResult) => {
|
|
@@ -172,6 +172,14 @@ qcsdk.initialize(clientConfigVal).then((initResult) => {
|
|
|
172
172
|
console.log("isAddressValid (expected true)" + qcsdk.isAddressValid(wallet1.address)); //should print true
|
|
173
173
|
console.log("isAddressValid (expected false)" + qcsdk.isAddressValid("asfasdfasdfs")); //should print false
|
|
174
174
|
|
|
175
|
+
//Retrieve address from public key
|
|
176
|
+
let addressTemp = qcsdk.addressFromPublicKey(wallet2.publicKey);
|
|
177
|
+
console.log("addressFromPublicKey: " + addressTemp);
|
|
178
|
+
if (addressTemp !== wallet2.address) {
|
|
179
|
+
throw new Error("addressFromPublicKey doesn't match: " + addressTemp + " " + wallet2.publicKey);
|
|
180
|
+
}
|
|
181
|
+
return;
|
|
182
|
+
|
|
175
183
|
//Send coins
|
|
176
184
|
//First get account details nonce
|
|
177
185
|
console.log("sendCoins getAccountDetails " + address);
|
|
@@ -10,7 +10,15 @@
|
|
|
10
10
|
"license": "MIT",
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"ethers": "^6.13.4",
|
|
13
|
-
"quantum-coin-js-sdk": "
|
|
13
|
+
"quantum-coin-js-sdk": "file:.."
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"..": {
|
|
17
|
+
"version": "1.0.19",
|
|
18
|
+
"license": "MIT",
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"quantum-coin-pqc-js-sdk": "^1.0.0",
|
|
21
|
+
"seed-words": "^1.0.1"
|
|
14
22
|
}
|
|
15
23
|
},
|
|
16
24
|
"node_modules/@adraffy/ens-normalize": {
|
|
@@ -87,26 +95,8 @@
|
|
|
87
95
|
}
|
|
88
96
|
},
|
|
89
97
|
"node_modules/quantum-coin-js-sdk": {
|
|
90
|
-
"
|
|
91
|
-
"
|
|
92
|
-
"integrity": "sha512-g8wll8GqEmk1lm9t1UFJTs5NDmpr8PPsHfDtakfrcKdaJTk6FFK6GMTn9HOO7ZzuX1RkBe+lrvNQtRpIb6VdNg==",
|
|
93
|
-
"license": "MIT",
|
|
94
|
-
"dependencies": {
|
|
95
|
-
"quantum-coin-pqc-js-sdk": "^1.0.0",
|
|
96
|
-
"seed-words": "^1.0.1"
|
|
97
|
-
}
|
|
98
|
-
},
|
|
99
|
-
"node_modules/quantum-coin-pqc-js-sdk": {
|
|
100
|
-
"version": "1.0.1",
|
|
101
|
-
"resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.1.tgz",
|
|
102
|
-
"integrity": "sha512-d837t+/wVt8SN6xp3RMAkHvClgrwo2VV254eIsz6do2HD1GmzXCH+vts9S4jILHo7wK0ro7SHRwzZLR9AEhOIw==",
|
|
103
|
-
"license": "MIT"
|
|
104
|
-
},
|
|
105
|
-
"node_modules/seed-words": {
|
|
106
|
-
"version": "1.0.1",
|
|
107
|
-
"resolved": "https://registry.npmjs.org/seed-words/-/seed-words-1.0.1.tgz",
|
|
108
|
-
"integrity": "sha512-wq9DqfEGXzvIdTatznyQo/9+SN8tM/FNV4H0sAPc6XcOSYdI3YhIL035OYwTld1m1Cn2vnMtNBQv1mBTaU1Qjg==",
|
|
109
|
-
"license": "MIT"
|
|
98
|
+
"resolved": "..",
|
|
99
|
+
"link": true
|
|
110
100
|
},
|
|
111
101
|
"node_modules/tslib": {
|
|
112
102
|
"version": "2.7.0",
|
package/example/package.json
CHANGED
package/index.d.ts
CHANGED
|
@@ -217,16 +217,16 @@ export class Wallet {
|
|
|
217
217
|
public address: string;
|
|
218
218
|
/**
|
|
219
219
|
* Private Key byte array of the wallet. Is 4064 bytes in length (if the wallet is valid).
|
|
220
|
-
* @type {
|
|
220
|
+
* @type {number[]}
|
|
221
221
|
* @public
|
|
222
222
|
*/
|
|
223
|
-
public privateKey:
|
|
223
|
+
public privateKey: number[];
|
|
224
224
|
/**
|
|
225
225
|
* Public Key byte array of the wallet. Is 1408 bytes in length (if the wallet is valid).
|
|
226
|
-
* @type {
|
|
226
|
+
* @type {number[]}
|
|
227
227
|
* @public
|
|
228
228
|
*/
|
|
229
|
-
public publicKey:
|
|
229
|
+
public publicKey: number[];
|
|
230
230
|
}
|
|
231
231
|
/**
|
|
232
232
|
* @class
|
|
@@ -669,6 +669,31 @@ export function newWalletSeed(): any[];
|
|
|
669
669
|
* @return {Wallet} Returns a Wallet object. Returns null if the operation failed.
|
|
670
670
|
*/
|
|
671
671
|
export function openWalletFromSeedWords(seedWordList: any[]): Wallet;
|
|
672
|
+
/**
|
|
673
|
+
* The publicKeyFromSignature extracts the public key from a signature.
|
|
674
|
+
*
|
|
675
|
+
* @function publicKeyFromSignature
|
|
676
|
+
* @param {number[]} digest - An array of bytes containing the digestHash. Should be of length 32.
|
|
677
|
+
* @param {number[]} signature - An array of bytes containing the signature.
|
|
678
|
+
* @return {number[]} - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
679
|
+
*/
|
|
680
|
+
export function publicKeyFromSignature(digest: number[], signature: number[]): number[];
|
|
681
|
+
/**
|
|
682
|
+
* The publicKeyFromPrivateKey extracts the public key from a private key.
|
|
683
|
+
*
|
|
684
|
+
* @function publicKeyFromPrivateKey
|
|
685
|
+
* @param {number[]} privateKey - An array of bytes containing the privateKey.
|
|
686
|
+
* @return {number[]} - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
687
|
+
*/
|
|
688
|
+
export function publicKeyFromPrivateKey(privateKey: number[]): number[];
|
|
689
|
+
/**
|
|
690
|
+
* The addressFromPublicKey returns the address corresponding to the public key.
|
|
691
|
+
*
|
|
692
|
+
* @function addressFromPublicKey
|
|
693
|
+
* @param {number[]} publicKey - An array of bytes containing the public key.
|
|
694
|
+
* @return {string} - Returns a hex string corresponding to the public key. Returns null if the operation failed.
|
|
695
|
+
*/
|
|
696
|
+
export function addressFromPublicKey(publicKey: number[]): string;
|
|
672
697
|
/**
|
|
673
698
|
* @class
|
|
674
699
|
* @constructor
|