quantum-coin-js-sdk 2.0.1 → 2.1.0
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 +13 -0
- package/index.d.ts +9 -0
- package/index.js +37 -4
- package/package.json +12 -4
- package/wasmBase64.js +3 -2
- package/.idea/.name +0 -1
- package/.idea/modules.xml +0 -8
- package/.idea/quantum-coin-js-sdk.iml +0 -12
- package/.idea/vcs.xml +0 -6
- package/.vs/ProjectSettings.json +0 -3
- package/.vs/VSWorkspaceState.json +0 -8
- package/.vs/quantum-coin-js-sdk/FileContentIndex/a9d6de82-cfc3-4c22-ac38-06d706ff3673.vsidx +0 -0
- package/.vs/quantum-coin-js-sdk/FileContentIndex/fdc816df-1898-4153-99f2-c69ef4c2283b.vsidx +0 -0
- package/.vs/quantum-coin-js-sdk/config/applicationhost.config +0 -1011
- package/.vs/quantum-coin-js-sdk/v17/.wsuo +0 -0
- package/.vs/quantum-coin-js-sdk/v17/DocumentLayout.backup.json +0 -39
- package/.vs/quantum-coin-js-sdk/v17/DocumentLayout.json +0 -57
- package/.vs/slnx.sqlite +0 -0
- package/example/README.md +0 -14
- package/example/conversion-example.js +0 -19
- package/example/example-create-contract.js +0 -396
- package/example/example-encode-decode-rlp.js +0 -225
- package/example/example-event-pack-unpack.js +0 -391
- package/example/example-misc.js +0 -96
- package/example/example-token-pack-unpack.js +0 -960
- package/example/example-wallet-version4.js +0 -34
- package/example/example-wallet.js +0 -39
- package/example/example.js +0 -115
- package/example/node_modules/.bin/sdkgen +0 -16
- package/example/node_modules/.bin/sdkgen.cmd +0 -17
- package/example/node_modules/.bin/sdkgen.ps1 +0 -28
- package/example/node_modules/.package-lock.json +0 -51
- package/example/node_modules/quantumcoin/.github/workflows/publish-npmjs.yaml +0 -22
- package/example/node_modules/quantumcoin/LICENSE +0 -21
- package/example/node_modules/quantumcoin/README-SDK.md +0 -828
- package/example/node_modules/quantumcoin/README.md +0 -197
- package/example/node_modules/quantumcoin/config.d.ts +0 -50
- package/example/node_modules/quantumcoin/config.js +0 -123
- package/example/node_modules/quantumcoin/examples/AllSolidityTypes.sol +0 -184
- package/example/node_modules/quantumcoin/examples/SimpleIERC20.sol +0 -74
- package/example/node_modules/quantumcoin/examples/events.js +0 -41
- package/example/node_modules/quantumcoin/examples/events.ts +0 -35
- package/example/node_modules/quantumcoin/examples/example-generator-sdk-js.js +0 -100
- package/example/node_modules/quantumcoin/examples/example-generator-sdk-js.ts +0 -77
- package/example/node_modules/quantumcoin/examples/example-generator-sdk-ts.js +0 -100
- package/example/node_modules/quantumcoin/examples/example-generator-sdk-ts.ts +0 -77
- package/example/node_modules/quantumcoin/examples/example.js +0 -67
- package/example/node_modules/quantumcoin/examples/example.ts +0 -56
- package/example/node_modules/quantumcoin/examples/offline-signing.js +0 -77
- package/example/node_modules/quantumcoin/examples/offline-signing.ts +0 -65
- package/example/node_modules/quantumcoin/examples/package-lock.json +0 -596
- package/example/node_modules/quantumcoin/examples/package.json +0 -32
- package/example/node_modules/quantumcoin/examples/read-operations.js +0 -32
- package/example/node_modules/quantumcoin/examples/read-operations.ts +0 -31
- package/example/node_modules/quantumcoin/examples/sdk-generator-erc20.inline.json +0 -251
- package/example/node_modules/quantumcoin/examples/solidity-types.ts +0 -43
- package/example/node_modules/quantumcoin/examples/wallet-offline.js +0 -36
- package/example/node_modules/quantumcoin/examples/wallet-offline.ts +0 -26
- package/example/node_modules/quantumcoin/generate-sdk.js +0 -1846
- package/example/node_modules/quantumcoin/index.js +0 -12
- package/example/node_modules/quantumcoin/package.json +0 -95
- package/example/node_modules/quantumcoin/scripts/copy-declarations.js +0 -31
- package/example/node_modules/quantumcoin/scripts/run-all-one-by-one.js +0 -151
- package/example/node_modules/quantumcoin/src/abi/fragments.d.ts +0 -42
- package/example/node_modules/quantumcoin/src/abi/fragments.js +0 -63
- package/example/node_modules/quantumcoin/src/abi/index.d.ts +0 -13
- package/example/node_modules/quantumcoin/src/abi/index.js +0 -9
- package/example/node_modules/quantumcoin/src/abi/interface.d.ts +0 -128
- package/example/node_modules/quantumcoin/src/abi/interface.js +0 -605
- package/example/node_modules/quantumcoin/src/abi/js-abi-coder.d.ts +0 -8
- package/example/node_modules/quantumcoin/src/abi/js-abi-coder.js +0 -538
- package/example/node_modules/quantumcoin/src/constants.d.ts +0 -61
- package/example/node_modules/quantumcoin/src/constants.js +0 -94
- package/example/node_modules/quantumcoin/src/contract/contract-factory.d.ts +0 -28
- package/example/node_modules/quantumcoin/src/contract/contract-factory.js +0 -111
- package/example/node_modules/quantumcoin/src/contract/contract.d.ts +0 -113
- package/example/node_modules/quantumcoin/src/contract/contract.js +0 -408
- package/example/node_modules/quantumcoin/src/contract/index.d.ts +0 -9
- package/example/node_modules/quantumcoin/src/contract/index.js +0 -9
- package/example/node_modules/quantumcoin/src/errors/index.d.ts +0 -92
- package/example/node_modules/quantumcoin/src/errors/index.js +0 -200
- package/example/node_modules/quantumcoin/src/generator/index.d.ts +0 -81
- package/example/node_modules/quantumcoin/src/generator/index.js +0 -1571
- package/example/node_modules/quantumcoin/src/index.d.ts +0 -122
- package/example/node_modules/quantumcoin/src/index.js +0 -41
- package/example/node_modules/quantumcoin/src/internal/hex.d.ts +0 -68
- package/example/node_modules/quantumcoin/src/internal/hex.js +0 -180
- package/example/node_modules/quantumcoin/src/providers/extra-providers.d.ts +0 -139
- package/example/node_modules/quantumcoin/src/providers/extra-providers.js +0 -614
- package/example/node_modules/quantumcoin/src/providers/index.d.ts +0 -17
- package/example/node_modules/quantumcoin/src/providers/index.js +0 -10
- package/example/node_modules/quantumcoin/src/providers/json-rpc-provider.d.ts +0 -12
- package/example/node_modules/quantumcoin/src/providers/json-rpc-provider.js +0 -89
- package/example/node_modules/quantumcoin/src/providers/provider.d.ts +0 -206
- package/example/node_modules/quantumcoin/src/providers/provider.js +0 -524
- package/example/node_modules/quantumcoin/src/types/index.d.ts +0 -214
- package/example/node_modules/quantumcoin/src/types/index.js +0 -9
- package/example/node_modules/quantumcoin/src/utils/address.d.ts +0 -58
- package/example/node_modules/quantumcoin/src/utils/address.js +0 -144
- package/example/node_modules/quantumcoin/src/utils/encoding.d.ts +0 -120
- package/example/node_modules/quantumcoin/src/utils/encoding.js +0 -306
- package/example/node_modules/quantumcoin/src/utils/fixednumber.d.ts +0 -57
- package/example/node_modules/quantumcoin/src/utils/fixednumber.js +0 -366
- package/example/node_modules/quantumcoin/src/utils/hashing.d.ts +0 -76
- package/example/node_modules/quantumcoin/src/utils/hashing.js +0 -298
- package/example/node_modules/quantumcoin/src/utils/index.d.ts +0 -63
- package/example/node_modules/quantumcoin/src/utils/index.js +0 -14
- package/example/node_modules/quantumcoin/src/utils/result.d.ts +0 -57
- package/example/node_modules/quantumcoin/src/utils/result.js +0 -128
- package/example/node_modules/quantumcoin/src/utils/rlp.d.ts +0 -12
- package/example/node_modules/quantumcoin/src/utils/rlp.js +0 -215
- package/example/node_modules/quantumcoin/src/utils/units.d.ts +0 -29
- package/example/node_modules/quantumcoin/src/utils/units.js +0 -107
- package/example/node_modules/quantumcoin/src/wallet/index.d.ts +0 -10
- package/example/node_modules/quantumcoin/src/wallet/index.js +0 -8
- package/example/node_modules/quantumcoin/src/wallet/wallet.d.ts +0 -192
- package/example/node_modules/quantumcoin/src/wallet/wallet.js +0 -713
- package/example/node_modules/quantumcoin/test/e2e/all-solidity-types.dynamic.test.js +0 -207
- package/example/node_modules/quantumcoin/test/e2e/all-solidity-types.dynamic.test.ts +0 -191
- package/example/node_modules/quantumcoin/test/e2e/all-solidity-types.fixtures.js +0 -231
- package/example/node_modules/quantumcoin/test/e2e/all-solidity-types.generated-sdks.e2e.test.js +0 -387
- package/example/node_modules/quantumcoin/test/e2e/all-solidity-types.generated-sdks.e2e.test.ts +0 -350
- package/example/node_modules/quantumcoin/test/e2e/generator-interface.e2e.test.js +0 -165
- package/example/node_modules/quantumcoin/test/e2e/generator-interface.e2e.test.ts +0 -160
- package/example/node_modules/quantumcoin/test/e2e/helpers.js +0 -59
- package/example/node_modules/quantumcoin/test/e2e/signing-context-and-fee.e2e.test.js +0 -141
- package/example/node_modules/quantumcoin/test/e2e/signing-context-and-fee.e2e.test.ts +0 -128
- package/example/node_modules/quantumcoin/test/e2e/simple-erc20.generated-sdks.e2e.test.js +0 -168
- package/example/node_modules/quantumcoin/test/e2e/simple-erc20.generated-sdks.e2e.test.ts +0 -141
- package/example/node_modules/quantumcoin/test/e2e/transactional.test.js +0 -245
- package/example/node_modules/quantumcoin/test/e2e/transactional.test.ts +0 -208
- package/example/node_modules/quantumcoin/test/e2e/typed-generator.e2e.test.js +0 -407
- package/example/node_modules/quantumcoin/test/e2e/typed-generator.e2e.test.ts +0 -337
- package/example/node_modules/quantumcoin/test/fixtures/ConstructorParam.sol +0 -23
- package/example/node_modules/quantumcoin/test/fixtures/MultiContracts.sol +0 -37
- package/example/node_modules/quantumcoin/test/fixtures/SimpleStorage.sol +0 -18
- package/example/node_modules/quantumcoin/test/fixtures/StakingContract.abi.json +0 -1
- package/example/node_modules/quantumcoin/test/integration/ipc-provider.test.js +0 -49
- package/example/node_modules/quantumcoin/test/integration/ipc-provider.test.ts +0 -44
- package/example/node_modules/quantumcoin/test/integration/provider.test.js +0 -88
- package/example/node_modules/quantumcoin/test/integration/provider.test.ts +0 -85
- package/example/node_modules/quantumcoin/test/integration/ws-provider.test.js +0 -41
- package/example/node_modules/quantumcoin/test/integration/ws-provider.test.ts +0 -38
- package/example/node_modules/quantumcoin/test/security/abi-decoder-bounds.test.js +0 -122
- package/example/node_modules/quantumcoin/test/security/contract-overrides.test.js +0 -112
- package/example/node_modules/quantumcoin/test/security/generator-injection.test.js +0 -195
- package/example/node_modules/quantumcoin/test/security/malformed-input.test.js +0 -330
- package/example/node_modules/quantumcoin/test/security/malformed-input.test.ts +0 -35
- package/example/node_modules/quantumcoin/test/security/rpc-numeric-bounds.test.js +0 -81
- package/example/node_modules/quantumcoin/test/security/rpc-trust.test.js +0 -202
- package/example/node_modules/quantumcoin/test/unit/_encrypted-output.txt +0 -6
- package/example/node_modules/quantumcoin/test/unit/_log-encrypted-jsons.js +0 -45
- package/example/node_modules/quantumcoin/test/unit/_write-keystore-fixture.js +0 -16
- package/example/node_modules/quantumcoin/test/unit/abi-interface.test.js +0 -110
- package/example/node_modules/quantumcoin/test/unit/abi-interface.test.ts +0 -109
- package/example/node_modules/quantumcoin/test/unit/address-wallet.test.js +0 -923
- package/example/node_modules/quantumcoin/test/unit/address-wallet.test.ts +0 -877
- package/example/node_modules/quantumcoin/test/unit/browser-provider.test.js +0 -85
- package/example/node_modules/quantumcoin/test/unit/browser-provider.test.ts +0 -79
- package/example/node_modules/quantumcoin/test/unit/contract.test.js +0 -85
- package/example/node_modules/quantumcoin/test/unit/contract.test.ts +0 -83
- package/example/node_modules/quantumcoin/test/unit/encoding-units-rlp.test.js +0 -127
- package/example/node_modules/quantumcoin/test/unit/encoding-units-rlp.test.ts +0 -91
- package/example/node_modules/quantumcoin/test/unit/errors.test.js +0 -77
- package/example/node_modules/quantumcoin/test/unit/errors.test.ts +0 -76
- package/example/node_modules/quantumcoin/test/unit/filter-by-blockhash.test.js +0 -55
- package/example/node_modules/quantumcoin/test/unit/filter-by-blockhash.test.ts +0 -54
- package/example/node_modules/quantumcoin/test/unit/fixednumber.test.js +0 -656
- package/example/node_modules/quantumcoin/test/unit/fixednumber.test.ts +0 -660
- package/example/node_modules/quantumcoin/test/unit/fixtures/encrypted-keystores-48-32-36.js +0 -9
- package/example/node_modules/quantumcoin/test/unit/generate-contract-cli.test.js +0 -42
- package/example/node_modules/quantumcoin/test/unit/generate-contract-cli.test.ts +0 -41
- package/example/node_modules/quantumcoin/test/unit/generate-sdk-artifacts-json.test.js +0 -113
- package/example/node_modules/quantumcoin/test/unit/generate-sdk-artifacts-json.test.ts +0 -110
- package/example/node_modules/quantumcoin/test/unit/generator.test.js +0 -149
- package/example/node_modules/quantumcoin/test/unit/generator.test.ts +0 -148
- package/example/node_modules/quantumcoin/test/unit/hashing.test.js +0 -64
- package/example/node_modules/quantumcoin/test/unit/hashing.test.ts +0 -63
- package/example/node_modules/quantumcoin/test/unit/init.test.js +0 -39
- package/example/node_modules/quantumcoin/test/unit/init.test.ts +0 -38
- package/example/node_modules/quantumcoin/test/unit/interface.test.js +0 -56
- package/example/node_modules/quantumcoin/test/unit/interface.test.ts +0 -54
- package/example/node_modules/quantumcoin/test/unit/internal-hex.test.js +0 -81
- package/example/node_modules/quantumcoin/test/unit/internal-hex.test.ts +0 -80
- package/example/node_modules/quantumcoin/test/unit/populate-transaction.test.js +0 -98
- package/example/node_modules/quantumcoin/test/unit/populate-transaction.test.ts +0 -64
- package/example/node_modules/quantumcoin/test/unit/providers.test.js +0 -252
- package/example/node_modules/quantumcoin/test/unit/providers.test.ts +0 -251
- package/example/node_modules/quantumcoin/test/unit/result.test.js +0 -80
- package/example/node_modules/quantumcoin/test/unit/result.test.ts +0 -79
- package/example/node_modules/quantumcoin/test/unit/solidity-types.test.js +0 -49
- package/example/node_modules/quantumcoin/test/unit/solidity-types.test.ts +0 -39
- package/example/node_modules/quantumcoin/test/unit/utils.test.js +0 -57
- package/example/node_modules/quantumcoin/test/unit/utils.test.ts +0 -56
- package/example/node_modules/quantumcoin/test/verbose-logger.js +0 -74
- package/example/node_modules/quantumcoin/tsconfig.build.json +0 -14
- package/example/node_modules/seed-words/.github/workflows/publish-npmjs.yaml +0 -22
- package/example/node_modules/seed-words/BUILD.md +0 -7
- package/example/node_modules/seed-words/LICENSE +0 -121
- package/example/node_modules/seed-words/README.md +0 -67
- package/example/node_modules/seed-words/dist/seedwords.d.ts +0 -39
- package/example/node_modules/seed-words/package.json +0 -27
- package/example/node_modules/seed-words/seedwords.js +0 -315
- package/example/node_modules/seed-words/seedwords.txt +0 -65536
- package/example/node_modules/seed-words/tsconfig.json +0 -21
- package/example/package-lock.json +0 -60
- package/example/package.json +0 -15
- package/scripts/build-browser-tests.js +0 -29
- package/scripts/build-wasm.js +0 -85
- package/tests/browser/bundle.js +0 -97643
- package/tests/browser/entry.js +0 -57
- package/tests/browser/harness.html +0 -20
- package/tests/browser/run-browser.js +0 -50
- package/tests/encrypted-32.json +0 -1
- package/tests/encrypted-36.json +0 -1
- package/tests/encrypted-48.json +0 -1
- package/tests/generate-verify-vectors.js +0 -88
- package/tests/get-gas-price.test.js +0 -59
- package/tests/hashing.test.js +0 -34
- package/tests/non-transactional.preinit.test.js +0 -33
- package/tests/non-transactional.test.js +0 -1318
- package/tests/sign-raw-keytype5-context-null.test.js +0 -105
- package/tests/sign-raw-transaction.test.js +0 -194
- package/tests/sign-verify.test.js +0 -308
- package/tests/specs/assert.js +0 -74
- package/tests/specs/crypto.spec.js +0 -104
- package/tests/specs/hex.js +0 -31
- package/tests/specs/preinit.spec.js +0 -19
- package/tests/specs/sign.spec.js +0 -90
- package/tests/specs/wallet.spec.js +0 -98
- package/tests/transactional.rpc.test.js +0 -102
- package/tests/verify-vectors.json +0 -95035
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Environment-agnostic deterministic tests for the WASM crypto primitives:
|
|
4
|
-
// the five hashes (sha256/sha512/ripemd160/computeHmac/pbkdf2) and the
|
|
5
|
-
// parameterized scrypt. Requires the SDK to be initialized. Runs identically
|
|
6
|
-
// in Node and the browser.
|
|
7
|
-
|
|
8
|
-
const { hexToBytes, bytesToHex, utf8ToBytes } = require('./hex');
|
|
9
|
-
|
|
10
|
-
// Known-answer vectors (hex).
|
|
11
|
-
const SHA256_ABC = 'ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad';
|
|
12
|
-
const SHA256_EMPTY = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855';
|
|
13
|
-
const SHA512_ABC =
|
|
14
|
-
'ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a' +
|
|
15
|
-
'2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f';
|
|
16
|
-
const RIPEMD_ABC = '8eb208f7e05d987a9b044a8e98c6b087f15a0bfc';
|
|
17
|
-
const RIPEMD_EMPTY = '9c1185a5c5e9fc54612808977ee8f548b2258d31';
|
|
18
|
-
const HMAC256 = '5bdcc146bf60754e6a042426089575c75a003f089d2739839dec58b964ec3843';
|
|
19
|
-
const HMAC512 =
|
|
20
|
-
'164b7a7bfcf819e2e395fbe73b56e0a387bd64222e831fd610270cd7ea250554' +
|
|
21
|
-
'9758bf75c05a994a6d034f65f8f0e6fdcaeab1a34d4a6b4b636e070a38bce737';
|
|
22
|
-
const PBKDF2_256 = '120fb6cffcf8b32c43e7225256c4f837a86548c92ccc35480805987cb70be17b';
|
|
23
|
-
const SCRYPT_RFC7914 =
|
|
24
|
-
'77d6576238657b203b19ca42c18a0497f16b4844e3074ae8dfdffa3fede21442' +
|
|
25
|
-
'fcd0069ded0948f8326a753a0fc81f17e8d3e0fb2e0d3628cf35e20c38d18906';
|
|
26
|
-
|
|
27
|
-
async function run(qcsdk, assert) {
|
|
28
|
-
// ---- SHA-256 ----
|
|
29
|
-
assert.equal(bytesToHex(qcsdk.sha256('abc')), SHA256_ABC, 'sha256(abc)');
|
|
30
|
-
assert.equal(bytesToHex(qcsdk.sha256('')), SHA256_EMPTY, 'sha256("")');
|
|
31
|
-
assert.deepEqual(qcsdk.sha256('abc'), qcsdk.sha256('abc'), 'sha256 deterministic');
|
|
32
|
-
// string and equivalent byte input agree
|
|
33
|
-
assert.deepEqual(qcsdk.sha256('abc'), qcsdk.sha256(utf8ToBytes('abc')), 'sha256 string==bytes');
|
|
34
|
-
assert.deepEqual(qcsdk.sha256(new Uint8Array(utf8ToBytes('abc'))), qcsdk.sha256('abc'), 'sha256 Uint8Array==string');
|
|
35
|
-
assert.equal(qcsdk.sha256(12345), null, 'sha256 rejects non-bytes');
|
|
36
|
-
|
|
37
|
-
// ---- SHA-512 ----
|
|
38
|
-
assert.equal(bytesToHex(qcsdk.sha512('abc')), SHA512_ABC, 'sha512(abc)');
|
|
39
|
-
assert.equal(qcsdk.sha512(null), null, 'sha512 rejects null');
|
|
40
|
-
|
|
41
|
-
// ---- RIPEMD-160 ----
|
|
42
|
-
assert.equal(bytesToHex(qcsdk.ripemd160('abc')), RIPEMD_ABC, 'ripemd160(abc)');
|
|
43
|
-
assert.equal(bytesToHex(qcsdk.ripemd160('')), RIPEMD_EMPTY, 'ripemd160("")');
|
|
44
|
-
assert.equal(qcsdk.ripemd160({}), null, 'ripemd160 rejects object');
|
|
45
|
-
|
|
46
|
-
// ---- HMAC ----
|
|
47
|
-
assert.equal(
|
|
48
|
-
bytesToHex(qcsdk.computeHmac('sha256', 'Jefe', 'what do ya want for nothing?')),
|
|
49
|
-
HMAC256,
|
|
50
|
-
'hmac-sha256 RFC4231',
|
|
51
|
-
);
|
|
52
|
-
assert.equal(
|
|
53
|
-
bytesToHex(qcsdk.computeHmac('sha512', 'Jefe', 'what do ya want for nothing?')),
|
|
54
|
-
HMAC512,
|
|
55
|
-
'hmac-sha512 RFC4231',
|
|
56
|
-
);
|
|
57
|
-
assert.equal(qcsdk.computeHmac('md5', 'k', 'd'), null, 'hmac rejects unsupported alg');
|
|
58
|
-
assert.equal(qcsdk.computeHmac('sha256', 12345, 'd'), null, 'hmac rejects non-bytes key');
|
|
59
|
-
assert.equal(qcsdk.computeHmac(123, 'k', 'd'), null, 'hmac rejects non-string alg');
|
|
60
|
-
|
|
61
|
-
// ---- PBKDF2 ----
|
|
62
|
-
assert.equal(
|
|
63
|
-
bytesToHex(qcsdk.pbkdf2('password', utf8ToBytes('salt'), 1, 32, 'sha256')),
|
|
64
|
-
PBKDF2_256,
|
|
65
|
-
'pbkdf2-sha256 known vector',
|
|
66
|
-
);
|
|
67
|
-
assert.equal(qcsdk.pbkdf2('password', utf8ToBytes('salt'), 0, 32, 'sha256'), null, 'pbkdf2 rejects 0 iterations');
|
|
68
|
-
assert.equal(qcsdk.pbkdf2('password', utf8ToBytes('salt'), 1, 32, 'md5'), null, 'pbkdf2 rejects unsupported alg');
|
|
69
|
-
assert.equal(qcsdk.pbkdf2('password', 12345, 1, 32, 'sha256'), null, 'pbkdf2 rejects non-array salt');
|
|
70
|
-
assert.equal(qcsdk.pbkdf2('password', utf8ToBytes('salt'), '1', 32, 'sha256'), null, 'pbkdf2 rejects non-number iterations');
|
|
71
|
-
|
|
72
|
-
// ---- Scrypt (parameterized) ----
|
|
73
|
-
// RFC 7914 exact vector: scrypt("", [], N=16, r=1, p=1, dkLen=64).
|
|
74
|
-
const rfc = qcsdk.scryptDeriveKey('', [], 16, 1, 1, 64);
|
|
75
|
-
assert.equal(bytesToHex(rfc), SCRYPT_RFC7914, 'scrypt RFC7914 vector');
|
|
76
|
-
assert.equal(rfc.length, 64, 'scrypt honors dkLen');
|
|
77
|
-
|
|
78
|
-
// Determinism.
|
|
79
|
-
assert.deepEqual(
|
|
80
|
-
qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), 16, 8, 1, 32),
|
|
81
|
-
qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), 16, 8, 1, 32),
|
|
82
|
-
'scrypt deterministic',
|
|
83
|
-
);
|
|
84
|
-
|
|
85
|
-
// Relaxed params: values that previously returned null now derive a key.
|
|
86
|
-
const relaxed = qcsdk.scryptDeriveKey('test-passphrase-123', hexToBytes('0102030405060708090a0b0c0d0e0f10'), 16384, 8, 1, 32);
|
|
87
|
-
assert.ok(Array.isArray(relaxed) && relaxed.length === 32, 'relaxed scrypt params derive a 32-byte key');
|
|
88
|
-
|
|
89
|
-
// Bytes secret is accepted and equals the UTF-8 string form.
|
|
90
|
-
assert.deepEqual(
|
|
91
|
-
qcsdk.scryptDeriveKey(utf8ToBytes('pw'), utf8ToBytes('salt'), 16, 8, 1, 32),
|
|
92
|
-
qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), 16, 8, 1, 32),
|
|
93
|
-
'scrypt bytes-secret == string-secret',
|
|
94
|
-
);
|
|
95
|
-
|
|
96
|
-
// Negatives.
|
|
97
|
-
assert.equal(qcsdk.scryptDeriveKey(null, utf8ToBytes('salt'), 16, 8, 1, 32), null, 'scrypt rejects null secret');
|
|
98
|
-
assert.equal(qcsdk.scryptDeriveKey('pw', null, 16, 8, 1, 32), null, 'scrypt rejects null salt');
|
|
99
|
-
assert.equal(qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), '16', 8, 1, 32), null, 'scrypt rejects non-number N');
|
|
100
|
-
assert.equal(qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), 0, 8, 1, 32), null, 'scrypt rejects N=0');
|
|
101
|
-
assert.equal(qcsdk.scryptDeriveKey('pw', utf8ToBytes('salt'), 3, 8, 1, 32), null, 'scrypt rejects N not a power of two');
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
module.exports = { name: 'crypto (scrypt + hashes)', needsInit: true, run };
|
package/tests/specs/hex.js
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Pure-JS byte/hex helpers - no Buffer, no atob - so specs run identically in
|
|
4
|
-
// Node and the browser. All return/accept plain number[] byte arrays.
|
|
5
|
-
|
|
6
|
-
function hexToBytes(hex) {
|
|
7
|
-
if (typeof hex !== 'string') throw new Error('hexToBytes: expected string');
|
|
8
|
-
const h = hex.startsWith('0x') || hex.startsWith('0X') ? hex.slice(2) : hex;
|
|
9
|
-
if (h.length % 2 !== 0) throw new Error('hexToBytes: odd-length hex');
|
|
10
|
-
const out = [];
|
|
11
|
-
for (let i = 0; i < h.length; i += 2) {
|
|
12
|
-
const byte = parseInt(h.slice(i, i + 2), 16);
|
|
13
|
-
if (Number.isNaN(byte)) throw new Error('hexToBytes: invalid hex');
|
|
14
|
-
out.push(byte);
|
|
15
|
-
}
|
|
16
|
-
return out;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
function bytesToHex(bytes) {
|
|
20
|
-
let out = '';
|
|
21
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
22
|
-
out += (bytes[i] & 0xff).toString(16).padStart(2, '0');
|
|
23
|
-
}
|
|
24
|
-
return out;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function utf8ToBytes(str) {
|
|
28
|
-
return Array.from(new TextEncoder().encode(String(str)));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
module.exports = { hexToBytes, bytesToHex, utf8ToBytes };
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Environment-agnostic pre-initialization checks. MUST run before
|
|
4
|
-
// qcsdk.initialize(): every WASM-backed crypto function returns -1000 until the
|
|
5
|
-
// WASM is initialized.
|
|
6
|
-
|
|
7
|
-
const { utf8ToBytes } = require('./hex');
|
|
8
|
-
|
|
9
|
-
async function run(qcsdk, assert) {
|
|
10
|
-
const SALT = utf8ToBytes('salt');
|
|
11
|
-
assert.equal(qcsdk.scryptDeriveKey('secret', SALT, 16, 8, 1, 32), -1000, 'scrypt pre-init -1000');
|
|
12
|
-
assert.equal(qcsdk.sha256('abc'), -1000, 'sha256 pre-init -1000');
|
|
13
|
-
assert.equal(qcsdk.sha512('abc'), -1000, 'sha512 pre-init -1000');
|
|
14
|
-
assert.equal(qcsdk.ripemd160('abc'), -1000, 'ripemd160 pre-init -1000');
|
|
15
|
-
assert.equal(qcsdk.computeHmac('sha256', 'k', 'd'), -1000, 'computeHmac pre-init -1000');
|
|
16
|
-
assert.equal(qcsdk.pbkdf2('password', SALT, 1, 32, 'sha256'), -1000, 'pbkdf2 pre-init -1000');
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
module.exports = { name: 'crypto pre-init (-1000)', needsInit: false, run };
|
package/tests/specs/sign.spec.js
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Environment-agnostic sign/verify tests (offline, deterministic). Exercises the
|
|
4
|
-
// CIRCL WASM signature scheme end-to-end. Requires the SDK to be initialized.
|
|
5
|
-
|
|
6
|
-
const vectors = require('../verify-vectors.json');
|
|
7
|
-
|
|
8
|
-
function message32() {
|
|
9
|
-
const m = [];
|
|
10
|
-
for (let i = 0; i < 32; i++) m.push((i + 1) & 0xff);
|
|
11
|
-
return m;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
function circlAvailable(qcsdk) {
|
|
15
|
-
const w = qcsdk.newWallet();
|
|
16
|
-
return w && w.privateKey != null && w.address != null && qcsdk.verifyWallet(w) === true;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
async function run(qcsdk, assert) {
|
|
20
|
-
assert.ok(circlAvailable(qcsdk), 'CIRCL WASM must be loaded');
|
|
21
|
-
|
|
22
|
-
const MESSAGE = message32();
|
|
23
|
-
|
|
24
|
-
// Sign/verify roundtrip for each key type.
|
|
25
|
-
for (const keyType of [null, 3, 5]) {
|
|
26
|
-
const wallet = qcsdk.newWallet(keyType);
|
|
27
|
-
assert.ok(wallet && typeof wallet === 'object', `newWallet(${keyType})`);
|
|
28
|
-
const signResult = qcsdk.sign(wallet.privateKey, MESSAGE);
|
|
29
|
-
assert.equal(signResult.resultCode, 0, `sign keyType ${keyType}`);
|
|
30
|
-
assert.ok(signResult.signature != null && signResult.signature.length > 0, `signature keyType ${keyType}`);
|
|
31
|
-
const verifyResult = qcsdk.verify(wallet.publicKey, signResult.signature, MESSAGE);
|
|
32
|
-
assert.equal(verifyResult.resultCode, 0, `verify keyType ${keyType}`);
|
|
33
|
-
assert.equal(verifyResult.valid, true, `valid keyType ${keyType}`);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
// Wrong message must not verify.
|
|
37
|
-
{
|
|
38
|
-
const wallet = qcsdk.newWallet(null);
|
|
39
|
-
const signResult = qcsdk.sign(wallet.privateKey, MESSAGE);
|
|
40
|
-
assert.equal(signResult.resultCode, 0, 'sign for wrong-message test');
|
|
41
|
-
const wrong = message32();
|
|
42
|
-
wrong[0] = 0xff;
|
|
43
|
-
const verifyResult = qcsdk.verify(wallet.publicKey, signResult.signature, wrong);
|
|
44
|
-
assert.equal(verifyResult.valid, false, 'wrong message must be invalid');
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
// Explicit signing contexts.
|
|
48
|
-
{
|
|
49
|
-
const wallet3 = qcsdk.newWallet(3);
|
|
50
|
-
for (const ctx of [0, 2]) {
|
|
51
|
-
const s = qcsdk.sign(wallet3.privateKey, MESSAGE, ctx);
|
|
52
|
-
assert.equal(s.resultCode, 0, `sign context ${ctx}`);
|
|
53
|
-
const v = qcsdk.verify(wallet3.publicKey, s.signature, MESSAGE);
|
|
54
|
-
assert.equal(v.valid, true, `verify context ${ctx}`);
|
|
55
|
-
}
|
|
56
|
-
const wallet5 = qcsdk.newWallet(5);
|
|
57
|
-
const s1 = qcsdk.sign(wallet5.privateKey, MESSAGE, 1);
|
|
58
|
-
assert.equal(s1.resultCode, 0, 'sign context 1');
|
|
59
|
-
assert.equal(qcsdk.verify(wallet5.publicKey, s1.signature, MESSAGE).valid, true, 'verify context 1');
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// Invalid inputs.
|
|
63
|
-
{
|
|
64
|
-
const bad = qcsdk.sign(null, MESSAGE);
|
|
65
|
-
assert.notEqual(bad.resultCode, 0, 'sign null private key');
|
|
66
|
-
assert.equal(bad.signature, null, 'null signature on bad sign');
|
|
67
|
-
|
|
68
|
-
const wallet = qcsdk.newWallet(3);
|
|
69
|
-
const badCtx = qcsdk.sign(wallet.privateKey, MESSAGE, 99);
|
|
70
|
-
assert.notEqual(badCtx.resultCode, 0, 'sign invalid context');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Hardcoded deterministic verify vectors.
|
|
74
|
-
for (const key of ['type3Compact', 'type3Full', 'type5']) {
|
|
75
|
-
const { publicKey, signature, message } = vectors[key];
|
|
76
|
-
const ok = qcsdk.verify(publicKey, signature, message);
|
|
77
|
-
assert.equal(ok.resultCode, 0, `vector ${key} resultCode`);
|
|
78
|
-
assert.equal(ok.valid, true, `vector ${key} valid`);
|
|
79
|
-
|
|
80
|
-
const wrongSig = signature.slice();
|
|
81
|
-
wrongSig[0] = (wrongSig[0] + 1) % 256;
|
|
82
|
-
assert.equal(qcsdk.verify(publicKey, wrongSig, message).valid, false, `vector ${key} wrong signature`);
|
|
83
|
-
|
|
84
|
-
const wrongMsg = message.slice();
|
|
85
|
-
wrongMsg[0] = (wrongMsg[0] + 1) % 256;
|
|
86
|
-
assert.equal(qcsdk.verify(publicKey, signature, wrongMsg).valid, false, `vector ${key} wrong message`);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
module.exports = { name: 'sign/verify', needsInit: true, run };
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
// Environment-agnostic wallet / keystore / seed tests (offline, deterministic).
|
|
4
|
-
// Requires the SDK to be initialized. No filesystem or network access, so it
|
|
5
|
-
// runs identically in Node and the browser.
|
|
6
|
-
|
|
7
|
-
const TEST_SEED_WORDS = [
|
|
8
|
-
'cylamidal', 'suculate', 'sealmate', 'radiploid', 'equifaxis', 'and', 'antipoise', 'stitchesy', 'perelade', 'lite',
|
|
9
|
-
'gourtarel', 'thursat', 'overdrome', 'cogulate', 'nonviva', 'stewnut', 'floribund', 'enduivist', 'decatary', 'elvenwort',
|
|
10
|
-
'indoucate', 'ravelent', 'vocalus', 'wetshirt', 'rutatory', 'percect', 'breaktout', 'corpation', 'myricorus', 'veofreat',
|
|
11
|
-
'junkard', 'supercarp', 'sukerus', 'tautang', 'facetype', 'shishkin', 'insulal', 'hobstone', 'stumbed', 'tecutonic',
|
|
12
|
-
'jumplike', 'hegwirth', 'idea', 'bhagatpur', 'pavastava', 'kukuluan', 'mageiline', 'extranite',
|
|
13
|
-
];
|
|
14
|
-
const TEST_SEED_WORDS_32 = TEST_SEED_WORDS.slice(0, 32);
|
|
15
|
-
const TEST_SEED_WORDS_36 = TEST_SEED_WORDS.slice(0, 36);
|
|
16
|
-
const TEST_SEED_ADDRESS = '0x3ce22c0e2714196734e42b0d4d5ad11284260502a560e46c2cd857391564142f';
|
|
17
|
-
const TEST_SEED_ADDRESS_32 = '0x38b12df2d4762a04a183f936c47747a1f13d0b0ba72066b43b4b6d7f776e9e25';
|
|
18
|
-
const TEST_SEED_ADDRESS_36 = '0x030e264c853bd859c53fae3ad6ef0e011dc799685e2b05d5efa7ac50f10ca075';
|
|
19
|
-
|
|
20
|
-
const TEST_SEED_ARRAY_48 = [49,159,218,142,198,66,182,182,73,216,5,119,6,71,216,42,164,55,124,237,92,81,228,227,156,0,38,189,152,58,215,177,80,252,71,86,51,210,70,33,106,200,184,26,246,139,249,41,191,104,163,253,21,26,43,108,146,94,243,204,112,236,219,139,218,249,224,255,76,150,203,7,108,119,101,70,217,112,225,190,112,169,98,168,104,223,14,235,161,192,118,167,128,203,76,59];
|
|
21
|
-
const TEST_SEED_ARRAY_32 = [49,159,218,142,198,66,182,182,73,216,5,119,6,71,216,42,164,55,124,237,92,81,228,227,156,0,38,189,152,58,215,177,80,252,71,86,51,210,70,33,106,200,184,26,246,139,249,41,191,104,163,253,21,26,43,108,146,94,243,204,112,236,219,139];
|
|
22
|
-
const TEST_SEED_ARRAY_36 = [49,159,218,142,198,66,182,182,73,216,5,119,6,71,216,42,164,55,124,237,92,81,228,227,156,0,38,189,152,58,215,177,80,252,71,86,51,210,70,33,106,200,184,26,246,139,249,41,191,104,163,253,21,26,43,108,146,94,243,204,112,236,219,139,218,249,224,255,76,150,203,7];
|
|
23
|
-
|
|
24
|
-
const PASSPHRASE = 'QuantumCoinExample123!';
|
|
25
|
-
const VALID_ADDRESS = '0x6f605c4142f1cb037f967101a5b28ccd00b27cce4516190356baaf284d20e667';
|
|
26
|
-
|
|
27
|
-
async function run(qcsdk, assert) {
|
|
28
|
-
// isAddressValid.
|
|
29
|
-
assert.equal(qcsdk.isAddressValid(VALID_ADDRESS), true, 'valid address accepted');
|
|
30
|
-
assert.equal(qcsdk.isAddressValid(VALID_ADDRESS.toUpperCase()), true, 'valid 0X address accepted');
|
|
31
|
-
assert.equal(qcsdk.isAddressValid('asfasdfasdfs'), false, 'garbage address rejected');
|
|
32
|
-
assert.equal(qcsdk.isAddressValid(null), false, 'null address rejected');
|
|
33
|
-
|
|
34
|
-
// newWallet + serialize/deserialize roundtrip.
|
|
35
|
-
const w1 = qcsdk.newWallet();
|
|
36
|
-
assert.ok(w1 && typeof w1.address === 'string', 'newWallet returns wallet');
|
|
37
|
-
assert.equal(qcsdk.verifyWallet(w1), true, 'verifyWallet(newWallet())');
|
|
38
|
-
const serialized = qcsdk.serializeWallet(w1);
|
|
39
|
-
assert.ok(serialized && typeof serialized === 'string', 'serializeWallet returns string');
|
|
40
|
-
const w2 = qcsdk.deserializeWallet(serialized);
|
|
41
|
-
assert.equal(w2.address.toLowerCase(), w1.address.toLowerCase(), 'deserialize roundtrip address');
|
|
42
|
-
assert.equal(qcsdk.verifyWallet(w2), true, 'verifyWallet(deserialized)');
|
|
43
|
-
|
|
44
|
-
// Encrypted wallet roundtrip + wrong passphrase.
|
|
45
|
-
const enc = qcsdk.serializeEncryptedWallet(w1, PASSPHRASE);
|
|
46
|
-
assert.ok(enc && typeof enc === 'string', 'serializeEncryptedWallet');
|
|
47
|
-
const dec = qcsdk.deserializeEncryptedWallet(enc, PASSPHRASE);
|
|
48
|
-
assert.equal(dec.address.toLowerCase(), w1.address.toLowerCase(), 'encrypted roundtrip address');
|
|
49
|
-
assert.equal(qcsdk.verifyWallet(dec), true, 'verifyWallet(encrypted-decrypted)');
|
|
50
|
-
assert.equal(qcsdk.deserializeEncryptedWallet(enc, PASSPHRASE + 'x'), null, 'wrong passphrase returns null');
|
|
51
|
-
|
|
52
|
-
// Deterministic seed-words -> address.
|
|
53
|
-
const sw = qcsdk.openWalletFromSeedWords(TEST_SEED_WORDS);
|
|
54
|
-
assert.equal(sw.address.toLowerCase(), TEST_SEED_ADDRESS, 'seed words 48 -> address');
|
|
55
|
-
assert.equal(qcsdk.verifyWallet(sw), true, 'verifyWallet(seed words 48)');
|
|
56
|
-
assert.equal(qcsdk.openWalletFromSeedWords(['not', 'enough']), null, 'invalid seed words -> null');
|
|
57
|
-
|
|
58
|
-
// Deterministic raw seed -> address, for all three schemes.
|
|
59
|
-
assert.equal(qcsdk.openWalletFromSeed(TEST_SEED_ARRAY_48).address.toLowerCase(), TEST_SEED_ADDRESS, 'seed 96B -> address');
|
|
60
|
-
assert.equal(qcsdk.openWalletFromSeed(TEST_SEED_ARRAY_32).address.toLowerCase(), TEST_SEED_ADDRESS_32, 'seed 64B -> address');
|
|
61
|
-
assert.equal(qcsdk.openWalletFromSeed(TEST_SEED_ARRAY_36).address.toLowerCase(), TEST_SEED_ADDRESS_36, 'seed 72B -> address');
|
|
62
|
-
assert.equal(qcsdk.openWalletFromSeed(new Uint8Array(TEST_SEED_ARRAY_48)).address.toLowerCase(), TEST_SEED_ADDRESS, 'seed Uint8Array -> address');
|
|
63
|
-
|
|
64
|
-
// openWalletFromSeed matches openWalletFromSeedWords.
|
|
65
|
-
assert.equal(
|
|
66
|
-
qcsdk.openWalletFromSeed(TEST_SEED_ARRAY_32).address.toLowerCase(),
|
|
67
|
-
qcsdk.openWalletFromSeedWords(TEST_SEED_WORDS_32).address.toLowerCase(),
|
|
68
|
-
'seed==seedWords (32)',
|
|
69
|
-
);
|
|
70
|
-
assert.equal(
|
|
71
|
-
qcsdk.openWalletFromSeed(TEST_SEED_ARRAY_36).address.toLowerCase(),
|
|
72
|
-
qcsdk.openWalletFromSeedWords(TEST_SEED_WORDS_36).address.toLowerCase(),
|
|
73
|
-
'seed==seedWords (36)',
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
// openWalletFromSeed negatives.
|
|
77
|
-
assert.equal(qcsdk.openWalletFromSeed(null), null, 'openWalletFromSeed(null)');
|
|
78
|
-
assert.equal(qcsdk.openWalletFromSeed([]), null, 'openWalletFromSeed([])');
|
|
79
|
-
assert.equal(qcsdk.openWalletFromSeed([1, 2, 3, 4, 5]), null, 'openWalletFromSeed(wrong length)');
|
|
80
|
-
assert.equal(qcsdk.openWalletFromSeed('not an array'), null, 'openWalletFromSeed(string)');
|
|
81
|
-
|
|
82
|
-
// serializeSeedAsEncryptedWallet roundtrip (V5) preserves address + preExpansionSeed.
|
|
83
|
-
const seedJson = qcsdk.serializeSeedAsEncryptedWallet(TEST_SEED_ARRAY_32, PASSPHRASE);
|
|
84
|
-
assert.ok(seedJson && typeof seedJson === 'string', 'serializeSeedAsEncryptedWallet returns string');
|
|
85
|
-
const seedWallet = qcsdk.deserializeEncryptedWallet(seedJson, PASSPHRASE);
|
|
86
|
-
assert.equal(seedWallet.address.toLowerCase(), TEST_SEED_ADDRESS_32, 'seed-encrypted roundtrip address');
|
|
87
|
-
assert.ok(seedWallet.preExpansionSeed != null && seedWallet.preExpansionSeed.length === 64, 'preExpansionSeed preserved');
|
|
88
|
-
assert.equal(qcsdk.serializeSeedAsEncryptedWallet(null, PASSPHRASE), null, 'null seed -> null');
|
|
89
|
-
assert.equal(qcsdk.serializeSeedAsEncryptedWallet(TEST_SEED_ARRAY_32, 'short'), null, 'short passphrase -> null');
|
|
90
|
-
|
|
91
|
-
// publicKeyFromPrivateKey / addressFromPublicKey consistency.
|
|
92
|
-
const w = qcsdk.newWallet();
|
|
93
|
-
const pubHex = qcsdk.publicKeyFromPrivateKey(w.privateKey);
|
|
94
|
-
assert.ok(pubHex && typeof pubHex === 'string', 'publicKeyFromPrivateKey returns hex');
|
|
95
|
-
assert.equal(qcsdk.addressFromPublicKey(w.publicKey).toLowerCase(), w.address.toLowerCase(), 'addressFromPublicKey matches wallet');
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
module.exports = { name: 'wallet/keystore/seed', needsInit: true, run };
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
const { describe, test } = require('node:test');
|
|
2
|
-
const assert = require('node:assert/strict');
|
|
3
|
-
|
|
4
|
-
// These are the "transactional" tests: they attempt to submit a transaction.
|
|
5
|
-
// Per requirements:
|
|
6
|
-
// - RPC-based transactional tests must use `https://public.rpc.quantumcoinapi.com`
|
|
7
|
-
// - The transaction must either succeed OR fail only due to no coins for gas.
|
|
8
|
-
|
|
9
|
-
const qcsdk = require('..');
|
|
10
|
-
|
|
11
|
-
const MAINNET_CHAIN_ID = 123123;
|
|
12
|
-
const PUBLIC_RPC_URL = 'https://public.rpc.quantumcoinapi.com';
|
|
13
|
-
|
|
14
|
-
const TO_ADDRESS_EXAMPLE =
|
|
15
|
-
'0x8293cd9b6ac502d2fe077b0c157dad39f36a5e546525b053151dced633634612';
|
|
16
|
-
|
|
17
|
-
function isCirclAvailable() {
|
|
18
|
-
const w = qcsdk.newWallet();
|
|
19
|
-
return (
|
|
20
|
-
typeof w === 'object' &&
|
|
21
|
-
w != null &&
|
|
22
|
-
w.privateKey != null &&
|
|
23
|
-
w.address != null &&
|
|
24
|
-
qcsdk.verifyWallet(w) === true
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const EXAMPLE_WALLET_ENCRYPTED_JSON =
|
|
29
|
-
'{"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}';
|
|
30
|
-
const EXAMPLE_WALLET_PASSPHRASE = 'QuantumCoinExample123!';
|
|
31
|
-
|
|
32
|
-
async function rpc(method, params) {
|
|
33
|
-
const response = await fetch(PUBLIC_RPC_URL, {
|
|
34
|
-
method: 'POST',
|
|
35
|
-
headers: { 'Content-Type': 'application/json' },
|
|
36
|
-
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method, params }),
|
|
37
|
-
});
|
|
38
|
-
assert.ok(response.ok, `RPC HTTP ${response.status}`);
|
|
39
|
-
return response.json();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function isInsufficientGasErrorMessage(message) {
|
|
43
|
-
if (!message || typeof message !== 'string') return false;
|
|
44
|
-
const m = message.toLowerCase();
|
|
45
|
-
return (
|
|
46
|
-
(m.includes('insufficient') && m.includes('fund')) &&
|
|
47
|
-
m.includes('gas')
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
describe('transactional', { concurrency: 1 }, () => {
|
|
52
|
-
test(
|
|
53
|
-
'RPC submit signed raw tx: must succeed or fail only for insufficient gas',
|
|
54
|
-
{ timeout: 120_000 },
|
|
55
|
-
async () => {
|
|
56
|
-
const initOk = await qcsdk.initialize(new qcsdk.Config(MAINNET_CHAIN_ID));
|
|
57
|
-
assert.equal(initOk, true);
|
|
58
|
-
|
|
59
|
-
assert.ok(isCirclAvailable(), 'CIRCL WASM must be loaded and verifyWallet(newWallet()) must pass');
|
|
60
|
-
const wallet = qcsdk.newWallet();
|
|
61
|
-
assert.ok(wallet);
|
|
62
|
-
|
|
63
|
-
const txnCount = await rpc('eth_getTransactionCount', [wallet.address, 'latest']);
|
|
64
|
-
assert.ok(txnCount && (txnCount.result || txnCount.error));
|
|
65
|
-
assert.ok(txnCount.result, `RPC error: ${txnCount.error?.message ?? 'unknown'}`);
|
|
66
|
-
const nonce = parseInt(txnCount.result, 16);
|
|
67
|
-
assert.ok(Number.isInteger(nonce) && nonce >= 0);
|
|
68
|
-
|
|
69
|
-
// Build and sign a minimal transfer with value 0 to keep "value" out of the equation.
|
|
70
|
-
const txReq = new qcsdk.TransactionSigningRequest(
|
|
71
|
-
wallet,
|
|
72
|
-
TO_ADDRESS_EXAMPLE,
|
|
73
|
-
'0x0',
|
|
74
|
-
nonce,
|
|
75
|
-
null,
|
|
76
|
-
21000,
|
|
77
|
-
null,
|
|
78
|
-
MAINNET_CHAIN_ID,
|
|
79
|
-
);
|
|
80
|
-
const sign = qcsdk.signRawTransaction(txReq);
|
|
81
|
-
assert.equal(sign.resultCode, 0);
|
|
82
|
-
assert.ok(typeof sign.txnData === 'string' && sign.txnData.startsWith('0x'));
|
|
83
|
-
|
|
84
|
-
const send = await rpc('eth_sendRawTransaction', [sign.txnData]);
|
|
85
|
-
|
|
86
|
-
if (send && send.result && typeof send.result === 'string') {
|
|
87
|
-
assert.ok(send.result.startsWith('0x'));
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
console.log(sign.txnData);
|
|
92
|
-
|
|
93
|
-
// If it failed, ONLY accept "insufficient funds for gas" style errors.
|
|
94
|
-
const msg = send?.error?.message ?? '';
|
|
95
|
-
assert.ok(
|
|
96
|
-
isInsufficientGasErrorMessage(msg),
|
|
97
|
-
`Transactional RPC test failed with unexpected error: ${msg || JSON.stringify(send)}`,
|
|
98
|
-
);
|
|
99
|
-
},
|
|
100
|
-
);
|
|
101
|
-
});
|
|
102
|
-
|