quantumcoin 7.0.12 → 7.0.14
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-SDK.md +828 -823
- package/README.md +4 -0
- package/config.d.ts +50 -50
- package/examples/example-generated-sdk-js/README.md +65 -0
- package/examples/example-generated-sdk-js/examples/_test-wallet.js +17 -0
- package/examples/example-generated-sdk-js/examples/deploy.js +41 -0
- package/examples/example-generated-sdk-js/examples/events.js +36 -0
- package/examples/example-generated-sdk-js/examples/read-operations.js +46 -0
- package/examples/example-generated-sdk-js/examples/write-operations.js +44 -0
- package/examples/example-generated-sdk-js/index.d.ts +1 -0
- package/examples/example-generated-sdk-js/index.js +15 -0
- package/examples/example-generated-sdk-js/package-lock.json +59 -0
- package/examples/example-generated-sdk-js/package.json +22 -0
- package/examples/example-generated-sdk-js/src/SimpleERC20.d.ts +19 -0
- package/examples/example-generated-sdk-js/src/SimpleERC20.js +353 -0
- package/examples/example-generated-sdk-js/src/SimpleERC20__factory.d.ts +10 -0
- package/examples/example-generated-sdk-js/src/SimpleERC20__factory.js +29 -0
- package/examples/example-generated-sdk-js/src/index.d.ts +4 -0
- package/examples/example-generated-sdk-js/src/index.js +5 -0
- package/examples/example-generated-sdk-js/src/quantumcoin-shims.d.ts +23 -0
- package/examples/example-generated-sdk-js/src/types.d.ts +3 -0
- package/examples/example-generated-sdk-js/src/types.js +3 -0
- package/examples/example-generated-sdk-js/test/e2e/SimpleERC20.e2e.test.js +78 -0
- package/examples/example-generated-sdk-ts/README.md +65 -0
- package/examples/example-generated-sdk-ts/examples/_test-wallet.js +17 -0
- package/examples/example-generated-sdk-ts/examples/deploy.js +41 -0
- package/examples/example-generated-sdk-ts/examples/events.js +36 -0
- package/examples/example-generated-sdk-ts/examples/read-operations.js +46 -0
- package/examples/example-generated-sdk-ts/examples/write-operations.js +44 -0
- package/examples/example-generated-sdk-ts/index.d.ts +1 -0
- package/examples/example-generated-sdk-ts/index.js +15 -0
- package/examples/example-generated-sdk-ts/package-lock.json +59 -0
- package/examples/example-generated-sdk-ts/package.json +23 -0
- package/examples/example-generated-sdk-ts/src/SimpleERC20.ts +334 -0
- package/examples/example-generated-sdk-ts/src/SimpleERC20__factory.ts +28 -0
- package/examples/example-generated-sdk-ts/src/index.ts +4 -0
- package/examples/example-generated-sdk-ts/src/quantumcoin-shims.d.ts +23 -0
- package/examples/example-generated-sdk-ts/src/types.ts +4 -0
- package/examples/example-generated-sdk-ts/test/e2e/SimpleERC20.e2e.test.js +78 -0
- package/examples/example-generated-sdk-ts/tsconfig.json +14 -0
- package/examples/node_modules/.package-lock.json +5 -5
- package/examples/node_modules/quantum-coin-js-sdk/README.md +5 -5
- package/examples/node_modules/quantum-coin-js-sdk/example/package-lock.json +1 -1
- package/examples/node_modules/quantum-coin-js-sdk/index.d.ts +1031 -1031
- package/examples/node_modules/quantum-coin-js-sdk/index.js +15 -15
- package/examples/node_modules/quantum-coin-js-sdk/package.json +1 -1
- package/examples/node_modules/quantum-coin-js-sdk/wasmBase64.js +2 -2
- package/examples/package-lock.json +6 -6
- package/examples/package.json +1 -1
- package/examples/sdk-generator-erc20.inline.json +251 -251
- package/generate-sdk.js +1845 -1822
- package/package.json +2 -2
- package/src/abi/fragments.d.ts +42 -42
- package/src/abi/index.d.ts +13 -13
- package/src/abi/interface.js +11 -2
- package/src/abi/js-abi-coder.js +61 -2
- package/src/contract/contract.js +53 -5
- package/src/contract/index.d.ts +9 -9
- package/src/errors/index.d.ts +92 -92
- package/src/generator/index.d.ts +11 -4
- package/src/generator/index.js +185 -18
- package/src/internal/hex.d.ts +68 -61
- package/src/internal/hex.js +36 -0
- package/src/providers/json-rpc-provider.d.ts +12 -12
- package/src/providers/provider.js +141 -8
- package/src/utils/address.d.ts +58 -58
- package/src/utils/encoding.d.ts +120 -120
- package/src/utils/hashing.js +298 -298
- package/src/utils/index.d.ts +63 -63
- package/src/utils/index.js +14 -14
- package/src/utils/result.d.ts +57 -57
- package/src/utils/rlp.d.ts +12 -12
- package/src/utils/rlp.js +13 -1
- package/src/utils/units.d.ts +29 -29
- package/src/wallet/index.d.ts +10 -10
- package/src/wallet/wallet.d.ts +192 -192
- package/src/wallet/wallet.js +713 -630
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/README.md +83 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/artifacts/AllSolidityTypes.abi.json +12544 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/artifacts/AllSolidityTypes.bin +1 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/_test-wallet.js +17 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/_test-wallet.ts +10 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/deploy.js +41 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/deploy.ts +41 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/events.js +36 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/events.ts +36 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/offline-signing.js +82 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/offline-signing.ts +80 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/read-operations.js +46 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/read-operations.ts +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/write-operations.js +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/examples/write-operations.ts +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/index.d.ts +1 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/index.js +21 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/package-lock.json +597 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/package.json +25 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/AllSolidityTypes.d.ts +1280 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/AllSolidityTypes.js +14021 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/AllSolidityTypes__factory.d.ts +11 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/AllSolidityTypes__factory.js +31 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/index.d.ts +4 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/index.js +5 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/quantumcoin-shims.d.ts +25 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/types.d.ts +3 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/src/types.js +3 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/test/e2e/AllSolidityTypes.e2e.test.js +77 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-js/test/e2e/AllSolidityTypes.extra.test.js +195 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/README.md +83 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/artifacts/AllSolidityTypes.abi.json +12544 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/artifacts/AllSolidityTypes.bin +1 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/_test-wallet.js +17 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/_test-wallet.ts +10 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/deploy.js +41 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/deploy.ts +41 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/events.js +36 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/events.ts +36 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/offline-signing.js +82 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/offline-signing.ts +80 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/read-operations.js +46 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/read-operations.ts +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/write-operations.js +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/examples/write-operations.ts +44 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/index.d.ts +1 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/index.js +21 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/package-lock.json +597 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/package.json +26 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/src/AllSolidityTypes.ts +13940 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/src/AllSolidityTypes__factory.ts +31 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/src/index.ts +4 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/src/quantumcoin-shims.d.ts +25 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/src/types.ts +4 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/test/e2e/AllSolidityTypes.e2e.test.js +77 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/test/e2e/AllSolidityTypes.extra.test.js +195 -0
- package/test/e2e/generated-sdks/all-solidity-types/all-solidity-types-ts/tsconfig.json +18 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/README.md +74 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/artifacts/SimpleERC20.abi.json +245 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/artifacts/SimpleERC20.bin +1 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/_test-wallet.js +17 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/_test-wallet.ts +10 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/deploy.js +41 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/deploy.ts +41 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/events.js +36 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/events.ts +36 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/offline-signing.js +82 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/offline-signing.ts +80 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/read-operations.js +46 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/read-operations.ts +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/write-operations.js +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/examples/write-operations.ts +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/index.d.ts +1 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/index.js +16 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/package-lock.json +597 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/package.json +25 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/SimpleERC20.d.ts +24 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/SimpleERC20.js +378 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/SimpleERC20__factory.d.ts +10 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/SimpleERC20__factory.js +31 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/index.d.ts +4 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/index.js +5 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/quantumcoin-shims.d.ts +25 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/types.d.ts +3 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/src/types.js +3 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-js/test/e2e/SimpleERC20.e2e.test.js +90 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/README.md +74 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/artifacts/SimpleERC20.abi.json +245 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/artifacts/SimpleERC20.bin +1 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/_test-wallet.js +17 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/_test-wallet.ts +10 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/deploy.js +41 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/deploy.ts +41 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/events.js +36 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/events.ts +36 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/offline-signing.js +82 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/offline-signing.ts +80 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/read-operations.js +46 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/read-operations.ts +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/write-operations.js +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/examples/write-operations.ts +44 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/index.d.ts +1 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/index.js +16 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/package-lock.json +597 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/package.json +26 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/src/SimpleERC20.ts +361 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/src/SimpleERC20__factory.ts +30 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/src/index.ts +4 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/src/quantumcoin-shims.d.ts +25 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/src/types.ts +4 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/test/e2e/SimpleERC20.e2e.test.js +90 -0
- package/test/e2e/generated-sdks/simple-erc20/simple-erc20-ts/tsconfig.json +18 -0
- package/test/e2e/generator-interface.e2e.test.js +165 -0
- package/test/e2e/generator-interface.e2e.test.ts +160 -0
- package/test/e2e/signing-context-and-fee.e2e.test.js +141 -141
- package/test/e2e/signing-context-and-fee.e2e.test.ts +128 -128
- package/test/integration/provider.test.js +88 -88
- package/test/security/abi-decoder-bounds.test.js +122 -0
- package/test/security/contract-overrides.test.js +112 -0
- package/test/security/generator-injection.test.js +195 -0
- package/test/security/malformed-input.test.js +26 -27
- package/test/security/rpc-numeric-bounds.test.js +81 -0
- package/test/security/rpc-trust.test.js +202 -0
- package/test/unit/abi-interface.test.js +12 -5
- package/test/unit/abi-interface.test.ts +8 -1
- package/test/unit/address-wallet.test.js +923 -892
- package/test/unit/address-wallet.test.ts +877 -877
- package/test/unit/encoding-units-rlp.test.js +35 -0
- package/test/unit/generator.test.js +48 -1
- package/test/unit/generator.test.ts +48 -1
- package/test/unit/hashing.test.js +64 -64
- package/test/unit/hashing.test.ts +63 -63
- package/test/unit/internal-hex.test.js +32 -1
- package/test/unit/internal-hex.test.ts +32 -1
- package/test/unit/populate-transaction.test.js +33 -0
- package/test/unit/providers.test.js +51 -1
- package/test/unit/providers.test.ts +53 -0
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @testCategory security
|
|
3
|
+
* @blockchainRequired false
|
|
4
|
+
* @transactional false
|
|
5
|
+
* @description Do not trust the RPC node. A broadcast must be rejected if
|
|
6
|
+
* the node returns a transaction hash different from the one we
|
|
7
|
+
* signed, and event logs from foreign contract addresses must be
|
|
8
|
+
* dropped from getLogs results.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
const { describe, it } = require("node:test");
|
|
12
|
+
const assert = require("node:assert/strict");
|
|
13
|
+
|
|
14
|
+
const { Initialize } = require("../../config");
|
|
15
|
+
const qc = require("../../index");
|
|
16
|
+
const { logSuite, logTest } = require("../verbose-logger");
|
|
17
|
+
|
|
18
|
+
const SIGNED_HASH = "0x" + "aa".repeat(32);
|
|
19
|
+
|
|
20
|
+
class SendProvider extends qc.AbstractProvider {
|
|
21
|
+
constructor(returnedHash) {
|
|
22
|
+
super();
|
|
23
|
+
this._returnedHash = returnedHash;
|
|
24
|
+
}
|
|
25
|
+
async _perform(method) {
|
|
26
|
+
if (method === "eth_sendRawTransaction") return this._returnedHash;
|
|
27
|
+
if (method === "eth_getTransactionByHash") return { hash: this._returnedHash };
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("Security: RPC broadcast hash verification", () => {
|
|
33
|
+
logSuite("Security: RPC broadcast hash verification");
|
|
34
|
+
|
|
35
|
+
it("throws when the node returns a different hash than the signed tx (negative)", async () => {
|
|
36
|
+
logTest("throws when the node returns a different hash than the signed tx", {});
|
|
37
|
+
await Initialize(null);
|
|
38
|
+
const p = new SendProvider("0x" + "bb".repeat(32));
|
|
39
|
+
await assert.rejects(
|
|
40
|
+
() => p.sendTransaction("0xrawsigned", { expectedHash: SIGNED_HASH }),
|
|
41
|
+
/does not match the signed transaction/i,
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("returns the response when the node hash matches (positive, case-insensitive)", async () => {
|
|
46
|
+
logTest("returns the response when the node hash matches", {});
|
|
47
|
+
await Initialize(null);
|
|
48
|
+
const p = new SendProvider(SIGNED_HASH);
|
|
49
|
+
const resp = await p.sendTransaction("0xrawsigned", { expectedHash: SIGNED_HASH.toUpperCase() });
|
|
50
|
+
assert.ok(resp && typeof resp.hash === "string");
|
|
51
|
+
assert.equal(resp.hash.toLowerCase(), SIGNED_HASH);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("without expectedHash, sendTransaction stays backward compatible", async () => {
|
|
55
|
+
logTest("without expectedHash, sendTransaction stays backward compatible", {});
|
|
56
|
+
await Initialize(null);
|
|
57
|
+
const p = new SendProvider(SIGNED_HASH);
|
|
58
|
+
const resp = await p.sendTransaction("0xrawsigned");
|
|
59
|
+
assert.equal(resp.hash, SIGNED_HASH);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
class LogProvider extends qc.AbstractProvider {
|
|
64
|
+
constructor(logs) {
|
|
65
|
+
super();
|
|
66
|
+
this._logs = logs;
|
|
67
|
+
}
|
|
68
|
+
async _perform(method) {
|
|
69
|
+
if (method === "eth_getLogs") return this._logs;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
describe("Security: event-log provenance", () => {
|
|
75
|
+
logSuite("Security: event-log provenance");
|
|
76
|
+
|
|
77
|
+
it("drops logs whose address does not match the filter (negative) and keeps matching ones (positive)", async () => {
|
|
78
|
+
logTest("drops foreign-address logs and keeps matching ones", {});
|
|
79
|
+
await Initialize(null);
|
|
80
|
+
const target = "0x" + "11".repeat(32);
|
|
81
|
+
const foreign = "0x" + "99".repeat(32);
|
|
82
|
+
const p = new LogProvider([
|
|
83
|
+
{ address: target, topics: [], data: "0x", blockNumber: "0x1" },
|
|
84
|
+
{ address: foreign, topics: [], data: "0x", blockNumber: "0x1" },
|
|
85
|
+
{ address: target.toUpperCase(), topics: [], data: "0x", blockNumber: "0x1" },
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
const logs = await p.getLogs({ address: target });
|
|
89
|
+
assert.equal(logs.length, 2, "only logs from the requested address survive");
|
|
90
|
+
for (const l of logs) {
|
|
91
|
+
assert.equal(l.address.toLowerCase(), target.toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("returns all logs when no address filter is given (positive)", async () => {
|
|
96
|
+
logTest("returns all logs when no address filter is given", {});
|
|
97
|
+
await Initialize(null);
|
|
98
|
+
const p = new LogProvider([
|
|
99
|
+
{ address: "0x" + "11".repeat(32), topics: [], data: "0x" },
|
|
100
|
+
{ address: "0x" + "99".repeat(32), topics: [], data: "0x" },
|
|
101
|
+
]);
|
|
102
|
+
const logs = await p.getLogs({ fromBlock: 0 });
|
|
103
|
+
assert.equal(logs.length, 2);
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
const AA = "0x" + "aa".repeat(32);
|
|
108
|
+
const BB = "0x" + "bb".repeat(32);
|
|
109
|
+
|
|
110
|
+
class HashProvider extends qc.AbstractProvider {
|
|
111
|
+
constructor(obj) {
|
|
112
|
+
super();
|
|
113
|
+
this._obj = obj;
|
|
114
|
+
}
|
|
115
|
+
async _perform(method) {
|
|
116
|
+
if (method === "eth_getTransactionByHash") return this._obj;
|
|
117
|
+
if (method === "eth_getTransactionReceipt") return this._obj;
|
|
118
|
+
return null;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
describe("Security: read-back / confirmation hash verification", () => {
|
|
123
|
+
logSuite("Security: read-back / confirmation hash verification");
|
|
124
|
+
|
|
125
|
+
it("getTransaction throws when the returned hash differs from the requested hash (negative)", async () => {
|
|
126
|
+
logTest("getTransaction rejects a mismatched returned hash", {});
|
|
127
|
+
await Initialize(null);
|
|
128
|
+
const p = new HashProvider({ hash: BB });
|
|
129
|
+
await assert.rejects(() => p.getTransaction(AA), /does not match the requested hash/i);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("getTransaction returns the response when the hash matches (positive)", async () => {
|
|
133
|
+
logTest("getTransaction accepts a matching hash", {});
|
|
134
|
+
await Initialize(null);
|
|
135
|
+
const p = new HashProvider({ hash: AA });
|
|
136
|
+
const tx = await p.getTransaction(AA);
|
|
137
|
+
assert.equal(tx.hash, AA);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("getTransactionReceipt throws when transactionHash differs (negative)", async () => {
|
|
141
|
+
logTest("getTransactionReceipt rejects a mismatched receipt", {});
|
|
142
|
+
await Initialize(null);
|
|
143
|
+
const p = new HashProvider({ transactionHash: BB, blockNumber: "0x1" });
|
|
144
|
+
await assert.rejects(() => p.getTransactionReceipt(AA), /does not match the requested hash/i);
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("wait() rejects when the node returns a receipt for a different tx (negative)", async () => {
|
|
148
|
+
logTest("wait() rejects a mismatched receipt", {});
|
|
149
|
+
await Initialize(null);
|
|
150
|
+
const p = new HashProvider({ transactionHash: BB, blockNumber: "0x1" });
|
|
151
|
+
const resp = new qc.TransactionResponse({ hash: AA }, p);
|
|
152
|
+
await assert.rejects(() => resp.wait(1, 5000), /does not match the requested hash/i);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
describe("Security: event-log topic binding", () => {
|
|
157
|
+
logSuite("Security: event-log topic binding");
|
|
158
|
+
|
|
159
|
+
const eventAbi = [
|
|
160
|
+
{
|
|
161
|
+
type: "event",
|
|
162
|
+
name: "Transfer",
|
|
163
|
+
anonymous: false,
|
|
164
|
+
inputs: [
|
|
165
|
+
{ name: "from", type: "address", indexed: true },
|
|
166
|
+
{ name: "to", type: "address", indexed: true },
|
|
167
|
+
{ name: "value", type: "uint256", indexed: false },
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
];
|
|
171
|
+
|
|
172
|
+
it("getLogs drops logs whose topic0 does not match the requested topic (negative+positive)", async () => {
|
|
173
|
+
logTest("getLogs filters by topic0", {});
|
|
174
|
+
await Initialize(null);
|
|
175
|
+
const addr = "0x" + "11".repeat(32);
|
|
176
|
+
const wanted = "0x" + "cc".repeat(32);
|
|
177
|
+
const other = "0x" + "dd".repeat(32);
|
|
178
|
+
const p = new LogProvider([
|
|
179
|
+
{ address: addr, topics: [wanted], data: "0x", blockNumber: "0x1" },
|
|
180
|
+
{ address: addr, topics: [other], data: "0x", blockNumber: "0x1" },
|
|
181
|
+
]);
|
|
182
|
+
const logs = await p.getLogs({ address: addr, topics: [wanted] });
|
|
183
|
+
assert.equal(logs.length, 1);
|
|
184
|
+
assert.equal(logs[0].topics[0], wanted);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("queryFilter only returns logs matching the event's topic0 (negative+positive)", async () => {
|
|
188
|
+
logTest("queryFilter binds results to the event topic", {});
|
|
189
|
+
await Initialize(null);
|
|
190
|
+
const addr = "0x" + "11".repeat(32);
|
|
191
|
+
const topic0 = new qc.Interface(eventAbi).getEventTopic("Transfer");
|
|
192
|
+
const wrong = "0x" + "ee".repeat(32);
|
|
193
|
+
const p = new LogProvider([
|
|
194
|
+
{ address: addr, topics: [topic0], data: "0x", blockNumber: "0x1" },
|
|
195
|
+
{ address: addr, topics: [wrong], data: "0x", blockNumber: "0x1" },
|
|
196
|
+
]);
|
|
197
|
+
const contract = new qc.Contract(addr, eventAbi, p);
|
|
198
|
+
const events = await contract.queryFilter("Transfer", 0, "latest");
|
|
199
|
+
assert.equal(events.length, 1, "only the matching-topic log survives");
|
|
200
|
+
assert.equal(events[0].topics[0], topic0);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
@@ -87,11 +87,18 @@
|
|
|
87
87
|
const iface = new qc.Interface([]);
|
|
88
88
|
assert.throws(() => iface.parseTransaction(), (e) => e && e.code === "NOT_IMPLEMENTED");
|
|
89
89
|
assert.throws(() => iface.parseError(), (e) => e && e.code === "NOT_IMPLEMENTED");
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
90
|
+
assert.throws(() => iface.getSighash(), (e) => e && e.code === "NOT_IMPLEMENTED");
|
|
91
|
+
assert.equal(iface.getFallback(), null);
|
|
92
|
+
assert.equal(iface.getReceive(), null);
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
it("getEventTopic returns the event signature hash", () => {
|
|
96
|
+
const iface = new qc.Interface([
|
|
97
|
+
{ type: "event", name: "E", anonymous: false, inputs: [{ name: "x", type: "uint256", indexed: false }] },
|
|
98
|
+
]);
|
|
99
|
+
assert.match(iface.getEventTopic("E"), /^0x[0-9a-f]{64}$/);
|
|
100
|
+
assert.throws(() => iface.getEventTopic("Nope"), (e) => e && e.code === "INVALID_ARGUMENT");
|
|
101
|
+
});
|
|
95
102
|
});
|
|
96
103
|
|
|
97
104
|
describe("AbiCoder", () => {
|
|
@@ -88,10 +88,17 @@ describe("Interface", () => {
|
|
|
88
88
|
assert.throws(() => iface.parseTransaction(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
|
|
89
89
|
assert.throws(() => iface.parseError(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
|
|
90
90
|
assert.throws(() => iface.getSighash(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
|
|
91
|
-
assert.throws(() => iface.getEventTopic(), (e: Error & { code?: string }) => e && e.code === "NOT_IMPLEMENTED");
|
|
92
91
|
assert.equal(iface.getFallback(), null);
|
|
93
92
|
assert.equal(iface.getReceive(), null);
|
|
94
93
|
});
|
|
94
|
+
|
|
95
|
+
it("getEventTopic returns the event signature hash", () => {
|
|
96
|
+
const iface = new qc.Interface([
|
|
97
|
+
{ type: "event", name: "E", anonymous: false, inputs: [{ name: "x", type: "uint256", indexed: false }] },
|
|
98
|
+
]);
|
|
99
|
+
assert.match(iface.getEventTopic("E"), /^0x[0-9a-f]{64}$/);
|
|
100
|
+
assert.throws(() => iface.getEventTopic("Nope"), (e: Error & { code?: string }) => e && e.code === "INVALID_ARGUMENT");
|
|
101
|
+
});
|
|
95
102
|
});
|
|
96
103
|
|
|
97
104
|
describe("AbiCoder", () => {
|