quantum-coin-js-sdk 1.0.17 → 1.0.18
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 +33 -6
- package/example/example-misc.js +57 -0
- package/example/example-send.js +70 -0
- package/example/example.js +1 -1
- package/example/package-lock.json +10 -10
- package/example/package.json +1 -1
- package/index.d.ts +21 -4
- package/index.js +68 -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,8 @@ 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>
|
|
111
113
|
|
|
112
114
|
<a name="module_quantum-coin-js-sdk..Config"></a>
|
|
113
115
|
|
|
@@ -185,8 +187,8 @@ This class represents a Wallet. Use the verifyWallet function to verify if a wal
|
|
|
185
187
|
* [~Wallet](#module_quantum-coin-js-sdk..Wallet)
|
|
186
188
|
* [new Wallet(address, privateKey, publicKey)](#new_module_quantum-coin-js-sdk..Wallet_new)
|
|
187
189
|
* [.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)
|
|
190
|
+
* [.privateKey](#module_quantum-coin-js-sdk..Wallet+privateKey) : <code>Array.<number></code>
|
|
191
|
+
* [.publicKey](#module_quantum-coin-js-sdk..Wallet+publicKey) : <code>Array.<number></code>
|
|
190
192
|
|
|
191
193
|
<a name="new_module_quantum-coin-js-sdk..Wallet_new"></a>
|
|
192
194
|
|
|
@@ -209,14 +211,14 @@ Address of the wallet. Is 66 bytes in length including 0x (if the wallet is vali
|
|
|
209
211
|
**Access**: public
|
|
210
212
|
<a name="module_quantum-coin-js-sdk..Wallet+privateKey"></a>
|
|
211
213
|
|
|
212
|
-
#### wallet.privateKey
|
|
214
|
+
#### wallet.privateKey : <code>Array.<number></code>
|
|
213
215
|
Private Key byte array of the wallet. Is 4064 bytes in length (if the wallet is valid).
|
|
214
216
|
|
|
215
217
|
**Kind**: instance property of [<code>Wallet</code>](#module_quantum-coin-js-sdk..Wallet)
|
|
216
218
|
**Access**: public
|
|
217
219
|
<a name="module_quantum-coin-js-sdk..Wallet+publicKey"></a>
|
|
218
220
|
|
|
219
|
-
#### wallet.publicKey
|
|
221
|
+
#### wallet.publicKey : <code>Array.<number></code>
|
|
220
222
|
Public Key byte array of the wallet. Is 1408 bytes in length (if the wallet is valid).
|
|
221
223
|
|
|
222
224
|
**Kind**: instance property of [<code>Wallet</code>](#module_quantum-coin-js-sdk..Wallet)
|
|
@@ -999,3 +1001,28 @@ The sendCoins function posts a send-coin transaction to the blockchain.
|
|
|
999
1001
|
| 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
1002
|
| 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
1003
|
|
|
1004
|
+
<a name="module_quantum-coin-js-sdk..publicKeyFromSignature"></a>
|
|
1005
|
+
|
|
1006
|
+
### quantum-coin-js-sdk~publicKeyFromSignature(digest, signature) ⇒ <code>Array.<number></code>
|
|
1007
|
+
The publicKeyFromSignature extracts the public key from a signature.
|
|
1008
|
+
|
|
1009
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
1010
|
+
**Returns**: <code>Array.<number></code> - - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
1011
|
+
|
|
1012
|
+
| Param | Type | Description |
|
|
1013
|
+
| --- | --- | --- |
|
|
1014
|
+
| digest | <code>Array.<number></code> | An array of bytes containing the digestHash. Should be of length 32. |
|
|
1015
|
+
| signature | <code>Array.<number></code> | An array of bytes containing the signature. |
|
|
1016
|
+
|
|
1017
|
+
<a name="module_quantum-coin-js-sdk..publicKeyFromPrivateKey"></a>
|
|
1018
|
+
|
|
1019
|
+
### quantum-coin-js-sdk~publicKeyFromPrivateKey(privateKey) ⇒ <code>Array.<number></code>
|
|
1020
|
+
The publicKeyFromPrivateKey extracts the public key from a private key.
|
|
1021
|
+
|
|
1022
|
+
**Kind**: inner method of [<code>quantum-coin-js-sdk</code>](#module_quantum-coin-js-sdk)
|
|
1023
|
+
**Returns**: <code>Array.<number></code> - - Returns a byte array containing the public key. Returns null if the operation failed.
|
|
1024
|
+
|
|
1025
|
+
| Param | Type | Description |
|
|
1026
|
+
| --- | --- | --- |
|
|
1027
|
+
| privateKey | <code>Array.<number></code> | An array of bytes containing the privateKey. |
|
|
1028
|
+
|
|
@@ -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) => {
|
|
@@ -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.17"
|
|
14
14
|
}
|
|
15
15
|
},
|
|
16
16
|
"node_modules/@adraffy/ens-normalize": {
|
|
@@ -87,9 +87,9 @@
|
|
|
87
87
|
}
|
|
88
88
|
},
|
|
89
89
|
"node_modules/quantum-coin-js-sdk": {
|
|
90
|
-
"version": "1.0.
|
|
91
|
-
"resolved": "https://registry.npmjs.org/quantum-coin-js-sdk/-/quantum-coin-js-sdk-1.0.
|
|
92
|
-
"integrity": "sha512-
|
|
90
|
+
"version": "1.0.17",
|
|
91
|
+
"resolved": "https://registry.npmjs.org/quantum-coin-js-sdk/-/quantum-coin-js-sdk-1.0.17.tgz",
|
|
92
|
+
"integrity": "sha512-PhpNkNDXOmBHOyyakeUUsj8rBnJ/Tr3ZXmpgd6M8n7qvo1vsoiuBjSWEIJR2YvsIiPOpRCIJqq8E59sCJ9+1Zg==",
|
|
93
93
|
"license": "MIT",
|
|
94
94
|
"dependencies": {
|
|
95
95
|
"quantum-coin-pqc-js-sdk": "^1.0.0",
|
|
@@ -97,15 +97,15 @@
|
|
|
97
97
|
}
|
|
98
98
|
},
|
|
99
99
|
"node_modules/quantum-coin-pqc-js-sdk": {
|
|
100
|
-
"version": "1.0.
|
|
101
|
-
"resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.
|
|
102
|
-
"integrity": "sha512-
|
|
100
|
+
"version": "1.0.5",
|
|
101
|
+
"resolved": "https://registry.npmjs.org/quantum-coin-pqc-js-sdk/-/quantum-coin-pqc-js-sdk-1.0.5.tgz",
|
|
102
|
+
"integrity": "sha512-9P1YDkca5CqrO7++TnGJZzPvYlBjYARopHgxYbDcEHgPicP7+tA8zD+DE1BooHp7sLEWF9ObklMj6AdaDUjDVw==",
|
|
103
103
|
"license": "MIT"
|
|
104
104
|
},
|
|
105
105
|
"node_modules/seed-words": {
|
|
106
|
-
"version": "1.0.
|
|
107
|
-
"resolved": "https://registry.npmjs.org/seed-words/-/seed-words-1.0.
|
|
108
|
-
"integrity": "sha512-
|
|
106
|
+
"version": "1.0.2",
|
|
107
|
+
"resolved": "https://registry.npmjs.org/seed-words/-/seed-words-1.0.2.tgz",
|
|
108
|
+
"integrity": "sha512-ia58deuPjcR8DpJ8uIgZ7gqDnIWD8vnjb4jX/sEsIDcuQaH/AJj9J8L3DXkUHfUGqAq9Y6pVMuG90t3XUJH90g==",
|
|
109
109
|
"license": "MIT"
|
|
110
110
|
},
|
|
111
111
|
"node_modules/tslib": {
|
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,23 @@ 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[];
|
|
672
689
|
/**
|
|
673
690
|
* @class
|
|
674
691
|
* @constructor
|