@bitgo-beta/sdk-coin-dot 2.2.8-beta.167 → 2.2.8-beta.1670
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/dist/{src → cjs/src}/dot.d.ts +8 -19
- package/dist/cjs/src/dot.d.ts.map +1 -0
- package/dist/cjs/src/dot.js +623 -0
- package/dist/cjs/src/index.d.ts.map +1 -0
- package/dist/{src → cjs/src}/index.js +6 -2
- package/dist/cjs/src/lib/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/addressInitializationBuilder.js +182 -0
- package/dist/{src → cjs/src}/lib/batchTransactionBuilder.d.ts +1 -0
- package/dist/cjs/src/lib/batchTransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/batchTransactionBuilder.js +229 -0
- package/dist/cjs/src/lib/claimBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/claimBuilder.js +117 -0
- package/dist/cjs/src/lib/errors.d.ts.map +1 -0
- package/dist/cjs/src/lib/errors.js +19 -0
- package/dist/{src → cjs/src}/lib/iface.d.ts +16 -13
- package/dist/cjs/src/lib/iface.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface.js +128 -0
- package/dist/cjs/src/lib/iface_utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/iface_utils.js +92 -0
- package/dist/{src → cjs/src}/lib/index.d.ts +2 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/index.js +73 -0
- package/dist/{src → cjs/src}/lib/keyPair.d.ts +7 -0
- package/dist/cjs/src/lib/keyPair.d.ts.map +1 -0
- package/dist/cjs/src/lib/keyPair.js +117 -0
- package/dist/cjs/src/lib/nativeTransferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/nativeTransferBuilder.js +219 -0
- package/dist/cjs/src/lib/proxyBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/proxyBuilder.js +116 -0
- package/dist/cjs/src/lib/singletonRegistry.d.ts.map +1 -0
- package/dist/cjs/src/lib/singletonRegistry.js +20 -0
- package/dist/cjs/src/lib/stakingBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/stakingBuilder.js +167 -0
- package/dist/{src → cjs/src}/lib/transaction.d.ts +0 -1
- package/dist/cjs/src/lib/transaction.d.ts.map +1 -0
- package/dist/cjs/src/lib/transaction.js +624 -0
- package/dist/{src → cjs/src}/lib/transactionBuilder.d.ts +0 -1
- package/dist/cjs/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilder.js +351 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/transactionBuilderFactory.js +104 -0
- package/dist/cjs/src/lib/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/transferBuilder.js +11 -0
- package/dist/cjs/src/lib/txnSchema.d.ts.map +1 -0
- package/dist/cjs/src/lib/txnSchema.js +117 -0
- package/dist/cjs/src/lib/unnominateBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/unnominateBuilder.js +48 -0
- package/dist/cjs/src/lib/unstakeBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/unstakeBuilder.js +87 -0
- package/dist/{src → cjs/src}/lib/utils.d.ts +10 -2
- package/dist/cjs/src/lib/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/utils.js +491 -0
- package/dist/cjs/src/lib/wasmParser.d.ts +57 -0
- package/dist/cjs/src/lib/wasmParser.d.ts.map +1 -0
- package/dist/cjs/src/lib/wasmParser.js +345 -0
- package/dist/cjs/src/lib/withdrawUnstakedBuilder.d.ts.map +1 -0
- package/dist/cjs/src/lib/withdrawUnstakedBuilder.js +88 -0
- package/dist/cjs/src/register.d.ts.map +1 -0
- package/dist/cjs/src/register.js +11 -0
- package/dist/cjs/src/resources/index.d.ts +5 -0
- package/dist/cjs/src/resources/index.d.ts.map +1 -0
- package/dist/cjs/src/resources/index.js +21 -0
- package/dist/cjs/src/resources/mainnet.d.ts.map +1 -0
- package/dist/cjs/src/resources/mainnet.js +5 -0
- package/dist/cjs/src/resources/polkadotAssetHub.d.ts +2 -0
- package/dist/cjs/src/resources/polkadotAssetHub.d.ts.map +1 -0
- package/dist/cjs/src/resources/polkadotAssetHub.js +5 -0
- package/dist/cjs/src/resources/westend.d.ts.map +1 -0
- package/dist/cjs/src/resources/westend.js +5 -0
- package/dist/cjs/src/resources/westendAssetHub.d.ts +2 -0
- package/dist/cjs/src/resources/westendAssetHub.d.ts.map +1 -0
- package/dist/cjs/src/resources/westendAssetHub.js +5 -0
- package/dist/cjs/src/tdot.d.ts.map +1 -0
- package/dist/cjs/src/tdot.js +27 -0
- package/dist/cjs/test/fixtures.d.ts +283 -0
- package/dist/cjs/test/fixtures.d.ts.map +1 -0
- package/dist/cjs/test/fixtures.js +439 -0
- package/dist/cjs/test/resources/index.d.ts +141 -0
- package/dist/cjs/test/resources/index.d.ts.map +1 -0
- package/dist/cjs/test/resources/index.js +157 -0
- package/dist/cjs/test/resources/materialData.json +8 -0
- package/dist/cjs/test/resources/materialDataModified.json +8 -0
- package/dist/cjs/test/resources/testnet.d.ts +2 -0
- package/dist/cjs/test/resources/testnet.d.ts.map +1 -0
- package/dist/{src/resources/westend.js → cjs/test/resources/testnet.js} +3 -3
- package/dist/cjs/test/unit/address.d.ts +2 -0
- package/dist/cjs/test/unit/address.d.ts.map +1 -0
- package/dist/cjs/test/unit/address.js +45 -0
- package/dist/cjs/test/unit/dot.d.ts +2 -0
- package/dist/cjs/test/unit/dot.d.ts.map +1 -0
- package/dist/cjs/test/unit/dot.js +944 -0
- package/dist/cjs/test/unit/keypair.d.ts +2 -0
- package/dist/cjs/test/unit/keypair.d.ts.map +1 -0
- package/dist/cjs/test/unit/keypair.js +111 -0
- package/dist/cjs/test/unit/transaction.d.ts +2 -0
- package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
- package/dist/cjs/test/unit/transaction.js +269 -0
- package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/addressInitializationBuilder.js +265 -0
- package/dist/cjs/test/unit/transactionBuilder/base.d.ts +8 -0
- package/dist/cjs/test/unit/transactionBuilder/base.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/base.js +233 -0
- package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/batchTransactionBuilder.js +521 -0
- package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/claimBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/claimBuilder.js +129 -0
- package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/proxyBuilder.js +88 -0
- package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/singeltonRegistry.js +59 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/stakingBuilder.js +235 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transactionBuilderFactory.js +107 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/transferBuilder.js +437 -0
- package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/unnominateBuilder.js +97 -0
- package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/unstakeBuilder.js +116 -0
- package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts +2 -0
- package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.d.ts.map +1 -0
- package/dist/cjs/test/unit/transactionBuilder/withdrawUnstakedBuilder.js +115 -0
- package/dist/cjs/test/unit/utils.d.ts +2 -0
- package/dist/cjs/test/unit/utils.d.ts.map +1 -0
- package/dist/cjs/test/unit/utils.js +117 -0
- package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts +22 -0
- package/dist/cjs/test/unit/wasmBuilderByteComparison.d.ts.map +1 -0
- package/dist/cjs/test/unit/wasmBuilderByteComparison.js +197 -0
- package/dist/cjs/test/unit/wasmParserExplanation.d.ts +15 -0
- package/dist/cjs/test/unit/wasmParserExplanation.d.ts.map +1 -0
- package/dist/cjs/test/unit/wasmParserExplanation.js +147 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/dot.d.ts +147 -0
- package/dist/esm/dot.d.ts.map +1 -0
- package/dist/esm/dot.js +583 -0
- package/dist/esm/index.d.ts +5 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/lib/addressInitializationBuilder.d.ts +79 -0
- package/dist/esm/lib/addressInitializationBuilder.js +175 -0
- package/dist/esm/lib/batchTransactionBuilder.d.ts +62 -0
- package/dist/{src → esm}/lib/batchTransactionBuilder.d.ts.map +1 -1
- package/dist/esm/lib/batchTransactionBuilder.js +222 -0
- package/dist/esm/lib/claimBuilder.d.ts +58 -0
- package/dist/esm/lib/claimBuilder.js +110 -0
- package/dist/esm/lib/errors.d.ts +8 -0
- package/dist/esm/lib/errors.js +14 -0
- package/dist/esm/lib/iface.d.ts +337 -0
- package/dist/esm/lib/iface.d.ts.map +1 -0
- package/dist/esm/lib/iface.js +125 -0
- package/dist/esm/lib/iface_utils.d.ts +59 -0
- package/dist/esm/lib/iface_utils.js +83 -0
- package/dist/esm/lib/index.d.ts +21 -0
- package/dist/{src → esm}/lib/index.d.ts.map +1 -1
- package/dist/esm/lib/index.js +20 -0
- package/dist/esm/lib/keyPair.d.ts +38 -0
- package/dist/esm/lib/keyPair.d.ts.map +1 -0
- package/dist/esm/lib/keyPair.js +77 -0
- package/dist/esm/lib/nativeTransferBuilder.d.ts +84 -0
- package/dist/esm/lib/nativeTransferBuilder.js +212 -0
- package/dist/esm/lib/proxyBuilder.d.ts +54 -0
- package/dist/esm/lib/proxyBuilder.js +109 -0
- package/dist/esm/lib/singletonRegistry.d.ts +7 -0
- package/dist/esm/lib/singletonRegistry.js +16 -0
- package/dist/esm/lib/stakingBuilder.d.ts +66 -0
- package/dist/esm/lib/stakingBuilder.js +160 -0
- package/dist/esm/lib/transaction.d.ts +83 -0
- package/dist/esm/lib/transaction.d.ts.map +1 -0
- package/dist/esm/lib/transaction.js +584 -0
- package/dist/esm/lib/transactionBuilder.d.ts +131 -0
- package/dist/esm/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/esm/lib/transactionBuilder.js +311 -0
- package/dist/esm/lib/transactionBuilderFactory.d.ts +28 -0
- package/dist/esm/lib/transactionBuilderFactory.js +97 -0
- package/dist/esm/lib/transferBuilder.d.ts +11 -0
- package/dist/esm/lib/transferBuilder.js +7 -0
- package/dist/esm/lib/txnSchema.d.ts +15 -0
- package/dist/esm/lib/txnSchema.js +111 -0
- package/dist/esm/lib/unnominateBuilder.d.ts +24 -0
- package/dist/esm/lib/unnominateBuilder.js +44 -0
- package/dist/esm/lib/unstakeBuilder.d.ts +38 -0
- package/dist/esm/lib/unstakeBuilder.js +80 -0
- package/dist/esm/lib/utils.d.ts +261 -0
- package/dist/esm/lib/utils.d.ts.map +1 -0
- package/dist/esm/lib/utils.js +451 -0
- package/dist/esm/lib/wasmParser.d.ts +57 -0
- package/dist/esm/lib/wasmParser.d.ts.map +1 -0
- package/dist/esm/lib/wasmParser.js +341 -0
- package/dist/esm/lib/withdrawUnstakedBuilder.d.ts +38 -0
- package/dist/esm/lib/withdrawUnstakedBuilder.js +81 -0
- package/dist/esm/register.d.ts +3 -0
- package/dist/esm/register.js +7 -0
- package/dist/esm/resources/index.d.ts +5 -0
- package/dist/{src → esm}/resources/index.d.ts.map +1 -1
- package/dist/esm/resources/index.js +5 -0
- package/dist/esm/resources/mainnet.d.ts +2 -0
- package/dist/esm/resources/mainnet.js +2 -0
- package/dist/esm/resources/polkadotAssetHub.d.ts +2 -0
- package/dist/esm/resources/polkadotAssetHub.d.ts.map +1 -0
- package/dist/esm/resources/polkadotAssetHub.js +2 -0
- package/dist/esm/resources/westend.d.ts +2 -0
- package/dist/esm/resources/westend.js +2 -0
- package/dist/esm/resources/westendAssetHub.d.ts +2 -0
- package/dist/esm/resources/westendAssetHub.d.ts.map +1 -0
- package/dist/esm/resources/westendAssetHub.js +2 -0
- package/dist/esm/tdot.d.ts +12 -0
- package/dist/esm/tdot.js +23 -0
- package/package.json +43 -21
- package/.eslintignore +0 -5
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -450
- package/dist/src/dot.d.ts.map +0 -1
- package/dist/src/dot.js +0 -562
- package/dist/src/lib/addressInitializationBuilder.js +0 -184
- package/dist/src/lib/batchTransactionBuilder.js +0 -220
- package/dist/src/lib/claimBuilder.js +0 -119
- package/dist/src/lib/errors.js +0 -19
- package/dist/src/lib/iface.d.ts.map +0 -1
- package/dist/src/lib/iface.js +0 -128
- package/dist/src/lib/iface_utils.js +0 -93
- package/dist/src/lib/index.js +0 -57
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -70
- package/dist/src/lib/nativeTransferBuilder.js +0 -221
- package/dist/src/lib/proxyBuilder.js +0 -118
- package/dist/src/lib/singletonRegistry.js +0 -20
- package/dist/src/lib/stakingBuilder.js +0 -169
- package/dist/src/lib/transaction.d.ts.map +0 -1
- package/dist/src/lib/transaction.js +0 -590
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -337
- package/dist/src/lib/transactionBuilderFactory.js +0 -105
- package/dist/src/lib/transferBuilder.js +0 -11
- package/dist/src/lib/txnSchema.js +0 -117
- package/dist/src/lib/unnominateBuilder.js +0 -50
- package/dist/src/lib/unstakeBuilder.js +0 -89
- package/dist/src/lib/utils.d.ts.map +0 -1
- package/dist/src/lib/utils.js +0 -458
- package/dist/src/lib/withdrawUnstakedBuilder.js +0 -90
- package/dist/src/register.js +0 -11
- package/dist/src/resources/index.d.ts +0 -3
- package/dist/src/resources/index.js +0 -15
- package/dist/src/resources/mainnet.js +0 -5
- package/dist/src/tdot.js +0 -27
- /package/dist/{src → cjs/src}/index.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/addressInitializationBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/claimBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/errors.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/iface_utils.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/nativeTransferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/proxyBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/singletonRegistry.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/stakingBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transactionBuilderFactory.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/transferBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/txnSchema.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/unnominateBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/unstakeBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/lib/withdrawUnstakedBuilder.d.ts +0 -0
- /package/dist/{src → cjs/src}/register.d.ts +0 -0
- /package/dist/{src → cjs/src}/resources/mainnet.d.ts +0 -0
- /package/dist/{src → cjs/src}/resources/westend.d.ts +0 -0
- /package/dist/{src → cjs/src}/tdot.d.ts +0 -0
- /package/dist/{src → esm}/index.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/addressInitializationBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/claimBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/errors.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/iface_utils.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/nativeTransferBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/proxyBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/singletonRegistry.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/stakingBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transactionBuilderFactory.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/transferBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/txnSchema.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/unnominateBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/unstakeBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/lib/withdrawUnstakedBuilder.d.ts.map +0 -0
- /package/dist/{src → esm}/register.d.ts.map +0 -0
- /package/dist/{src → esm}/resources/mainnet.d.ts.map +0 -0
- /package/dist/{src → esm}/resources/westend.d.ts.map +0 -0
- /package/dist/{src → esm}/tdot.d.ts.map +0 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WASM Builder Byte Comparison Tests
|
|
4
|
+
*
|
|
5
|
+
* Compare serialized output between:
|
|
6
|
+
* 1. Legacy approach (using @substrate/txwrapper-polkadot)
|
|
7
|
+
* 2. WASM approach (using @bitgo/wasm-dot buildTransaction)
|
|
8
|
+
*
|
|
9
|
+
* For unsigned transactions, legacy toBroadcastFormat() returns the signing payload
|
|
10
|
+
* (via construct.signingPayload). We compare WASM signablePayload() against it.
|
|
11
|
+
*
|
|
12
|
+
* Format difference: txwrapper encodes the call as `Bytes` (Vec<u8>) which includes
|
|
13
|
+
* a SCALE compact-length prefix. subxt encodes it as raw `Call` (no prefix).
|
|
14
|
+
* We strip this prefix from the legacy side before comparing, since the actual
|
|
15
|
+
* call data, era, nonce, tip, and chain context are identical.
|
|
16
|
+
*
|
|
17
|
+
* Note: wasm-dot@1.3.0 uses high-level business intents (payment, stake, unstake,
|
|
18
|
+
* claim, consolidate) instead of low-level call types. Batch and proxy operations
|
|
19
|
+
* are composed automatically from the intent (e.g., stake with proxyAddress
|
|
20
|
+
* produces batchAll(bond, addProxy)).
|
|
21
|
+
*/
|
|
22
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
23
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
const assert_1 = __importDefault(require("assert"));
|
|
27
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
28
|
+
const transactionBuilderFactory_1 = require("../../src/lib/transactionBuilderFactory");
|
|
29
|
+
const fixtures_1 = require("../fixtures");
|
|
30
|
+
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
31
|
+
// Import WASM builder
|
|
32
|
+
const wasm_dot_1 = require("@bitgo/wasm-dot");
|
|
33
|
+
describe('WASM vs Legacy Builder Byte Comparison', function () {
|
|
34
|
+
const coin = statics_1.coins.get('tdot');
|
|
35
|
+
// Get material from utils to ensure same metadata as legacy builder
|
|
36
|
+
const material = utils_1.default.getMaterial(coin);
|
|
37
|
+
function createWasmContext(overrides = {}) {
|
|
38
|
+
return {
|
|
39
|
+
sender: fixtures_1.accounts.account1.address,
|
|
40
|
+
nonce: 0,
|
|
41
|
+
tip: 0n,
|
|
42
|
+
material: material,
|
|
43
|
+
validity: {
|
|
44
|
+
firstValid: fixtures_1.westendBlock.blockNumber,
|
|
45
|
+
maxDuration: 2400,
|
|
46
|
+
},
|
|
47
|
+
referenceBlock: fixtures_1.westendBlock.hash,
|
|
48
|
+
...overrides,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Strip SCALE compact-length prefix from the legacy signing payload.
|
|
53
|
+
*
|
|
54
|
+
* Legacy (txwrapper) encodes the call as `Bytes` type, which adds a compact-length
|
|
55
|
+
* prefix. subxt encodes it as raw `Call` (no prefix). Both produce identical
|
|
56
|
+
* call data + era + nonce + tip + chain context after this prefix.
|
|
57
|
+
*/
|
|
58
|
+
function stripCompactPrefix(hex) {
|
|
59
|
+
const data = hex.startsWith('0x') ? hex.slice(2) : hex;
|
|
60
|
+
const bytes = Buffer.from(data, 'hex');
|
|
61
|
+
const mode = bytes[0] & 0b11;
|
|
62
|
+
let offset;
|
|
63
|
+
if (mode === 0b00)
|
|
64
|
+
offset = 1;
|
|
65
|
+
else if (mode === 0b01)
|
|
66
|
+
offset = 2;
|
|
67
|
+
else if (mode === 0b10)
|
|
68
|
+
offset = 4;
|
|
69
|
+
else
|
|
70
|
+
throw new Error('Big compact not supported');
|
|
71
|
+
return '0x' + bytes.slice(offset).toString('hex');
|
|
72
|
+
}
|
|
73
|
+
// ===========================================================================
|
|
74
|
+
// Transfer Transaction Tests
|
|
75
|
+
// ===========================================================================
|
|
76
|
+
describe('Transfer Transactions', function () {
|
|
77
|
+
it('should produce identical signing payload for transfer', async function () {
|
|
78
|
+
const to = fixtures_1.accounts.account2.address;
|
|
79
|
+
const amount = '1000000000000'; // 1 DOT
|
|
80
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
|
|
81
|
+
const legacyBuilder = factory.getTransferBuilder();
|
|
82
|
+
legacyBuilder
|
|
83
|
+
.sender({ address: fixtures_1.accounts.account1.address })
|
|
84
|
+
.to({ address: to })
|
|
85
|
+
.amount(amount)
|
|
86
|
+
.validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
|
|
87
|
+
.referenceBlock(fixtures_1.westendBlock.hash)
|
|
88
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
|
|
89
|
+
const legacyTx = await legacyBuilder.build();
|
|
90
|
+
const legacyHex = legacyTx.toBroadcastFormat();
|
|
91
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to, amount: BigInt(amount), keepAlive: true }, createWasmContext());
|
|
92
|
+
const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
|
|
93
|
+
assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
|
|
94
|
+
});
|
|
95
|
+
it('should produce identical signing payload for transferKeepAlive with different nonce', async function () {
|
|
96
|
+
const to = fixtures_1.accounts.account2.address;
|
|
97
|
+
const amount = '5000000000000'; // 5 DOT
|
|
98
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
|
|
99
|
+
const legacyBuilder = factory.getTransferBuilder();
|
|
100
|
+
legacyBuilder
|
|
101
|
+
.sender({ address: fixtures_1.accounts.account1.address })
|
|
102
|
+
.to({ address: to })
|
|
103
|
+
.amount(amount)
|
|
104
|
+
.validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
|
|
105
|
+
.referenceBlock(fixtures_1.westendBlock.hash)
|
|
106
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 5 });
|
|
107
|
+
const legacyTx = await legacyBuilder.build();
|
|
108
|
+
const legacyHex = legacyTx.toBroadcastFormat();
|
|
109
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to, amount: BigInt(amount), keepAlive: true }, createWasmContext({ nonce: 5 }));
|
|
110
|
+
const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
|
|
111
|
+
assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
// ===========================================================================
|
|
115
|
+
// Staking Transaction Tests
|
|
116
|
+
// ===========================================================================
|
|
117
|
+
describe('Staking Transactions', function () {
|
|
118
|
+
// Note: wasm-dot@1.3.0 `stake` without proxyAddress produces bondExtra (top-up),
|
|
119
|
+
// while the legacy getStakingBuilder() produces bond (initial stake). These are
|
|
120
|
+
// different extrinsic calls so byte comparison is not applicable. The bond call
|
|
121
|
+
// is now only produced via `stake` with proxyAddress (which creates a batch).
|
|
122
|
+
// See Intent-based Transaction Building tests below for stake sanity checks.
|
|
123
|
+
it('should produce identical signing payload for unstake (unbond)', async function () {
|
|
124
|
+
const amount = '5000000000000'; // 5 DOT
|
|
125
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
|
|
126
|
+
const legacyBuilder = factory.getUnstakeBuilder();
|
|
127
|
+
legacyBuilder
|
|
128
|
+
.sender({ address: fixtures_1.accounts.account1.address })
|
|
129
|
+
.amount(amount)
|
|
130
|
+
.validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
|
|
131
|
+
.referenceBlock(fixtures_1.westendBlock.hash)
|
|
132
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
|
|
133
|
+
const legacyTx = await legacyBuilder.build();
|
|
134
|
+
const legacyHex = legacyTx.toBroadcastFormat();
|
|
135
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'unstake', amount: BigInt(amount) }, createWasmContext());
|
|
136
|
+
const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
|
|
137
|
+
assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
|
|
138
|
+
});
|
|
139
|
+
it('should produce identical signing payload for withdrawUnbonded (claim)', async function () {
|
|
140
|
+
const slashingSpans = 0;
|
|
141
|
+
const factory = new transactionBuilderFactory_1.TransactionBuilderFactory(coin);
|
|
142
|
+
const legacyBuilder = factory.getWithdrawUnstakedBuilder();
|
|
143
|
+
legacyBuilder
|
|
144
|
+
.sender({ address: fixtures_1.accounts.account1.address })
|
|
145
|
+
.slashingSpans(slashingSpans)
|
|
146
|
+
.validity({ firstValid: fixtures_1.westendBlock.blockNumber, maxDuration: 2400 })
|
|
147
|
+
.referenceBlock(fixtures_1.westendBlock.hash)
|
|
148
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 0 });
|
|
149
|
+
const legacyTx = await legacyBuilder.build();
|
|
150
|
+
const legacyHex = legacyTx.toBroadcastFormat();
|
|
151
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'claim', slashingSpans }, createWasmContext());
|
|
152
|
+
const wasmHex = '0x' + Buffer.from(wasmTx.signablePayload()).toString('hex');
|
|
153
|
+
assert_1.default.strictEqual(wasmHex, stripCompactPrefix(legacyHex), 'Signing payload should match');
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
// ===========================================================================
|
|
157
|
+
// Intent-based Transaction Building (sanity checks)
|
|
158
|
+
// ===========================================================================
|
|
159
|
+
describe('Intent-based Transaction Building', function () {
|
|
160
|
+
it('should build payment from intent', async function () {
|
|
161
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true }, createWasmContext());
|
|
162
|
+
const serialized = wasmTx.toBroadcastFormat();
|
|
163
|
+
(0, assert_1.default)(serialized.startsWith('0x'), 'Should be hex encoded');
|
|
164
|
+
(0, assert_1.default)(serialized.length > 10, 'Should have content');
|
|
165
|
+
});
|
|
166
|
+
it('should build stake (top-up) from intent', async function () {
|
|
167
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: 5000000000000n, payee: { type: 'staked' } }, createWasmContext());
|
|
168
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
169
|
+
});
|
|
170
|
+
it('should build stake with proxy (new stake / batchAll(bond, addProxy)) from intent', async function () {
|
|
171
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'stake', amount: 10000000000000n, proxyAddress: fixtures_1.accounts.account2.address, payee: { type: 'staked' } }, createWasmContext());
|
|
172
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
173
|
+
});
|
|
174
|
+
it('should build claim (withdrawUnbonded) from intent', async function () {
|
|
175
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'claim', slashingSpans: 0 }, createWasmContext());
|
|
176
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
177
|
+
});
|
|
178
|
+
it('should build unstake (partial / unbond) from intent', async function () {
|
|
179
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'unstake', amount: 5000000000000n }, createWasmContext());
|
|
180
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
181
|
+
});
|
|
182
|
+
it('should build unstake with stopStaking (full / batchAll(removeProxy, chill, unbond)) from intent', async function () {
|
|
183
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({
|
|
184
|
+
type: 'unstake',
|
|
185
|
+
amount: 5000000000000n,
|
|
186
|
+
stopStaking: true,
|
|
187
|
+
proxyAddress: fixtures_1.accounts.account2.address,
|
|
188
|
+
}, createWasmContext());
|
|
189
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
190
|
+
});
|
|
191
|
+
it('should build consolidate (transferAll) from intent', async function () {
|
|
192
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'consolidate', to: fixtures_1.accounts.account2.address }, createWasmContext());
|
|
193
|
+
(0, assert_1.default)(wasmTx.toBroadcastFormat().startsWith('0x'));
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbUJ1aWxkZXJCeXRlQ29tcGFyaXNvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC93YXNtQnVpbGRlckJ5dGVDb21wYXJpc29uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRzs7Ozs7QUFFSCxvREFBNEI7QUFDNUIsaURBQTRDO0FBQzVDLHVGQUFvRjtBQUVwRiwwQ0FBcUQ7QUFDckQsZ0VBQXdDO0FBRXhDLHNCQUFzQjtBQUN0Qiw4Q0FBcUY7QUFFckYsUUFBUSxDQUFDLHdDQUF3QyxFQUFFO0lBQ2pELE1BQU0sSUFBSSxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFL0Isb0VBQW9FO0lBQ3BFLE1BQU0sUUFBUSxHQUFHLGVBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFekMsU0FBUyxpQkFBaUIsQ0FBQyxZQUFtQyxFQUFFO1FBQzlELE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxLQUFLLEVBQUUsQ0FBQztZQUNSLEdBQUcsRUFBRSxFQUFFO1lBQ1AsUUFBUSxFQUFFLFFBQW9CO1lBQzlCLFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsdUJBQVksQ0FBQyxXQUFXO2dCQUNwQyxXQUFXLEVBQUUsSUFBSTthQUNsQjtZQUNELGNBQWMsRUFBRSx1QkFBWSxDQUFDLElBQUk7WUFDakMsR0FBRyxTQUFTO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxTQUFTLGtCQUFrQixDQUFDLEdBQVc7UUFDckMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3ZELE1BQU0sS0FB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O2dCQUNqQixZQUFZLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTzthQUN4QyxFQUNELGlCQUFpQixFQUFFLENBQ3BCLENBQUM7WUFDRixJQUFBLGdCQUFNLEVBQUMsTUFBTSxDQUFDLGlCQUFpQixFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsb0RBQW9ELEVBQUUsS0FBSztZQUM1RCxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUFDLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQzdHLElBQUEsZ0JBQU0sRUFBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdBU00gQnVpbGRlciBCeXRlIENvbXBhcmlzb24gVGVzdHNcbiAqXG4gKiBDb21wYXJlIHNlcmlhbGl6ZWQgb3V0cHV0IGJldHdlZW46XG4gKiAxLiBMZWdhY3kgYXBwcm9hY2ggKHVzaW5nIEBzdWJzdHJhdGUvdHh3cmFwcGVyLXBvbGthZG90KVxuICogMi4gV0FTTSBhcHByb2FjaCAodXNpbmcgQGJpdGdvL3dhc20tZG90IGJ1aWxkVHJhbnNhY3Rpb24pXG4gKlxuICogRm9yIHVuc2lnbmVkIHRyYW5zYWN0aW9ucywgbGVnYWN5IHRvQnJvYWRjYXN0Rm9ybWF0KCkgcmV0dXJucyB0aGUgc2lnbmluZyBwYXlsb2FkXG4gKiAodmlhIGNvbnN0cnVjdC5zaWduaW5nUGF5bG9hZCkuIFdlIGNvbXBhcmUgV0FTTSBzaWduYWJsZVBheWxvYWQoKSBhZ2FpbnN0IGl0LlxuICpcbiAqIEZvcm1hdCBkaWZmZXJlbmNlOiB0eHdyYXBwZXIgZW5jb2RlcyB0aGUgY2FsbCBhcyBgQnl0ZXNgIChWZWM8dTg+KSB3aGljaCBpbmNsdWRlc1xuICogYSBTQ0FMRSBjb21wYWN0LWxlbmd0aCBwcmVmaXguIHN1Ynh0IGVuY29kZXMgaXQgYXMgcmF3IGBDYWxsYCAobm8gcHJlZml4KS5cbiAqIFdlIHN0cmlwIHRoaXMgcHJlZml4IGZyb20gdGhlIGxlZ2FjeSBzaWRlIGJlZm9yZSBjb21wYXJpbmcsIHNpbmNlIHRoZSBhY3R1YWxcbiAqIGNhbGwgZGF0YSwgZXJhLCBub25jZSwgdGlwLCBhbmQgY2hhaW4gY29udGV4dCBhcmUgaWRlbnRpY2FsLlxuICpcbiAqIE5vdGU6IHdhc20tZG90QDEuMy4wIHVzZXMgaGlnaC1sZXZlbCBidXNpbmVzcyBpbnRlbnRzIChwYXltZW50LCBzdGFrZSwgdW5zdGFrZSxcbiAqIGNsYWltLCBjb25zb2xpZGF0ZSkgaW5zdGVhZCBvZiBsb3ctbGV2ZWwgY2FsbCB0eXBlcy4gQmF0Y2ggYW5kIHByb3h5IG9wZXJhdGlvbnNcbiAqIGFyZSBjb21wb3NlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGludGVudCAoZS5nLiwgc3Rha2Ugd2l0aCBwcm94eUFkZHJlc3NcbiAqIHByb2R1Y2VzIGJhdGNoQWxsKGJvbmQsIGFkZFByb3h5KSkuXG4gKi9cblxuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9zcmMvbGliL3RyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHsgVHJhbnNmZXJCdWlsZGVyIH0gZnJvbSAnLi4vLi4vc3JjL2xpYi90cmFuc2ZlckJ1aWxkZXInO1xuaW1wb3J0IHsgYWNjb3VudHMsIHdlc3RlbmRCbG9jayB9IGZyb20gJy4uL2ZpeHR1cmVzJztcbmltcG9ydCB1dGlscyBmcm9tICcuLi8uLi9zcmMvbGliL3V0aWxzJztcblxuLy8gSW1wb3J0IFdBU00gYnVpbGRlclxuaW1wb3J0IHsgYnVpbGRUcmFuc2FjdGlvbiwgdHlwZSBCdWlsZENvbnRleHQsIHR5cGUgTWF0ZXJpYWwgfSBmcm9tICdAYml0Z28vd2FzbS1kb3QnO1xuXG5kZXNjcmliZSgnV0FTTSB2cyBMZWdhY3kgQnVpbGRlciBCeXRlIENvbXBhcmlzb24nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvaW4gPSBjb2lucy5nZXQoJ3Rkb3QnKTtcblxuICAvLyBHZXQgbWF0ZXJpYWwgZnJvbSB1dGlscyB0byBlbnN1cmUgc2FtZSBtZXRhZGF0YSBhcyBsZWdhY3kgYnVpbGRlclxuICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW4pO1xuXG4gIGZ1bmN0aW9uIGNyZWF0ZVdhc21Db250ZXh0KG92ZXJyaWRlczogUGFydGlhbDxCdWlsZENvbnRleHQ+ID0ge30pOiBCdWlsZENvbnRleHQge1xuICAgIHJldHVybiB7XG4gICAgICBzZW5kZXI6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsXG4gICAgICBub25jZTogMCxcbiAgICAgIHRpcDogMG4sXG4gICAgICBtYXRlcmlhbDogbWF0ZXJpYWwgYXMgTWF0ZXJpYWwsXG4gICAgICB2YWxpZGl0eToge1xuICAgICAgICBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgIG1heER1cmF0aW9uOiAyNDAwLFxuICAgICAgfSxcbiAgICAgIHJlZmVyZW5jZUJsb2NrOiB3ZXN0ZW5kQmxvY2suaGFzaCxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFN0cmlwIFNDQUxFIGNvbXBhY3QtbGVuZ3RoIHByZWZpeCBmcm9tIHRoZSBsZWdhY3kgc2lnbmluZyBwYXlsb2FkLlxuICAgKlxuICAgKiBMZWdhY3kgKHR4d3JhcHBlcikgZW5jb2RlcyB0aGUgY2FsbCBhcyBgQnl0ZXNgIHR5cGUsIHdoaWNoIGFkZHMgYSBjb21wYWN0LWxlbmd0aFxuICAgKiBwcmVmaXguIHN1Ynh0IGVuY29kZXMgaXQgYXMgcmF3IGBDYWxsYCAobm8gcHJlZml4KS4gQm90aCBwcm9kdWNlIGlkZW50aWNhbFxuICAgKiBjYWxsIGRhdGEgKyBlcmEgKyBub25jZSArIHRpcCArIGNoYWluIGNvbnRleHQgYWZ0ZXIgdGhpcyBwcmVmaXguXG4gICAqL1xuICBmdW5jdGlvbiBzdHJpcENvbXBhY3RQcmVmaXgoaGV4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGEgPSBoZXguc3RhcnRzV2l0aCgnMHgnKSA/IGhleC5zbGljZSgyKSA6IGhleDtcbiAgICBjb25zdCBieXRlcyA9IEJ1ZmZlci5mcm9tKGRhdGEsICdoZXgnKTtcbiAgICBjb25zdCBtb2RlID0gYnl0ZXNbMF0gJiAwYjExO1xuICAgIGxldCBvZmZzZXQ6IG51bWJlcjtcbiAgICBpZiAobW9kZSA9PT0gMGIwMCkgb2Zmc2V0ID0gMTtcbiAgICBlbHNlIGlmIChtb2RlID09PSAwYjAxKSBvZmZzZXQgPSAyO1xuICAgIGVsc2UgaWYgKG1vZGUgPT09IDBiMTApIG9mZnNldCA9IDQ7XG4gICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoJ0JpZyBjb21wYWN0IG5vdCBzdXBwb3J0ZWQnKTtcbiAgICByZXR1cm4gJzB4JyArIGJ5dGVzLnNsaWNlKG9mZnNldCkudG9TdHJpbmcoJ2hleCcpO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFRyYW5zZmVyIFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnVHJhbnNmZXIgVHJhbnNhY3Rpb25zJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgc2lnbmluZyBwYXlsb2FkIGZvciB0cmFuc2ZlcicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHRvID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcbiAgICAgIGNvbnN0IGFtb3VudCA9ICcxMDAwMDAwMDAwMDAwJzsgLy8gMSBET1RcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0VHJhbnNmZXJCdWlsZGVyKCkgYXMgVHJhbnNmZXJCdWlsZGVyO1xuXG4gICAgICBsZWdhY3lCdWlsZGVyXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzIH0pXG4gICAgICAgIC50byh7IGFkZHJlc3M6IHRvIH0pXG4gICAgICAgIC5hbW91bnQoYW1vdW50KVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7IHR5cGU6ICdwYXltZW50JywgdG8sIGFtb3VudDogQmlnSW50KGFtb3VudCksIGtlZXBBbGl2ZTogdHJ1ZSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgY29uc3Qgd2FzbUhleCA9ICcweCcgKyBCdWZmZXIuZnJvbSh3YXNtVHguc2lnbmFibGVQYXlsb2FkKCkpLnRvU3RyaW5nKCdoZXgnKTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHdhc21IZXgsIHN0cmlwQ29tcGFjdFByZWZpeChsZWdhY3lIZXgpLCAnU2lnbmluZyBwYXlsb2FkIHNob3VsZCBtYXRjaCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBwcm9kdWNlIGlkZW50aWNhbCBzaWduaW5nIHBheWxvYWQgZm9yIHRyYW5zZmVyS2VlcEFsaXZlIHdpdGggZGlmZmVyZW50IG5vbmNlJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdG8gPSBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzO1xuICAgICAgY29uc3QgYW1vdW50ID0gJzUwMDAwMDAwMDAwMDAnOyAvLyA1IERPVFxuXG4gICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbik7XG4gICAgICBjb25zdCBsZWdhY3lCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKSBhcyBUcmFuc2ZlckJ1aWxkZXI7XG5cbiAgICAgIGxlZ2FjeUJ1aWxkZXJcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSlcbiAgICAgICAgLnRvKHsgYWRkcmVzczogdG8gfSlcbiAgICAgICAgLmFtb3VudChhbW91bnQpXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IHdlc3RlbmRCbG9jay5ibG9ja051bWJlciwgbWF4RHVyYXRpb246IDI0MDAgfSlcbiAgICAgICAgLnJlZmVyZW5jZUJsb2NrKHdlc3RlbmRCbG9jay5oYXNoKVxuICAgICAgICAuc2VxdWVuY2VJZCh7IG5hbWU6ICdOb25jZScsIGtleXdvcmQ6ICdub25jZScsIHZhbHVlOiA1IH0pO1xuXG4gICAgICBjb25zdCBsZWdhY3lUeCA9IGF3YWl0IGxlZ2FjeUJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIGNvbnN0IGxlZ2FjeUhleCA9IGxlZ2FjeVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG5cbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3BheW1lbnQnLCB0bywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSwga2VlcEFsaXZlOiB0cnVlIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KHsgbm9uY2U6IDUgfSlcbiAgICAgICk7XG4gICAgICBjb25zdCB3YXNtSGV4ID0gJzB4JyArIEJ1ZmZlci5mcm9tKHdhc21UeC5zaWduYWJsZVBheWxvYWQoKSkudG9TdHJpbmcoJ2hleCcpO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwod2FzbUhleCwgc3RyaXBDb21wYWN0UHJlZml4KGxlZ2FjeUhleCksICdTaWduaW5nIHBheWxvYWQgc2hvdWxkIG1hdGNoJyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBTdGFraW5nIFRyYW5zYWN0aW9uIFRlc3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICBkZXNjcmliZSgnU3Rha2luZyBUcmFuc2FjdGlvbnMnLCBmdW5jdGlvbiAoKSB7XG4gICAgLy8gTm90ZTogd2FzbS1kb3RAMS4zLjAgYHN0YWtlYCB3aXRob3V0IHByb3h5QWRkcmVzcyBwcm9kdWNlcyBib25kRXh0cmEgKHRvcC11cCksXG4gICAgLy8gd2hpbGUgdGhlIGxlZ2FjeSBnZXRTdGFraW5nQnVpbGRlcigpIHByb2R1Y2VzIGJvbmQgKGluaXRpYWwgc3Rha2UpLiBUaGVzZSBhcmVcbiAgICAvLyBkaWZmZXJlbnQgZXh0cmluc2ljIGNhbGxzIHNvIGJ5dGUgY29tcGFyaXNvbiBpcyBub3QgYXBwbGljYWJsZS4gVGhlIGJvbmQgY2FsbFxuICAgIC8vIGlzIG5vdyBvbmx5IHByb2R1Y2VkIHZpYSBgc3Rha2VgIHdpdGggcHJveHlBZGRyZXNzICh3aGljaCBjcmVhdGVzIGEgYmF0Y2gpLlxuICAgIC8vIFNlZSBJbnRlbnQtYmFzZWQgVHJhbnNhY3Rpb24gQnVpbGRpbmcgdGVzdHMgYmVsb3cgZm9yIHN0YWtlIHNhbml0eSBjaGVja3MuXG5cbiAgICBpdCgnc2hvdWxkIHByb2R1Y2UgaWRlbnRpY2FsIHNpZ25pbmcgcGF5bG9hZCBmb3IgdW5zdGFrZSAodW5ib25kKScsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFtb3VudCA9ICc1MDAwMDAwMDAwMDAwJzsgLy8gNSBET1RcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0VW5zdGFrZUJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAuYW1vdW50KGFtb3VudClcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogd2VzdGVuZEJsb2NrLmJsb2NrTnVtYmVyLCBtYXhEdXJhdGlvbjogMjQwMCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2sod2VzdGVuZEJsb2NrLmhhc2gpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDAgfSk7XG5cbiAgICAgIGNvbnN0IGxlZ2FjeVR4ID0gYXdhaXQgbGVnYWN5QnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgbGVnYWN5SGV4ID0gbGVnYWN5VHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcblxuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICd1bnN0YWtlJywgYW1vdW50OiBCaWdJbnQoYW1vdW50KSB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGNvbnN0IHdhc21IZXggPSAnMHgnICsgQnVmZmVyLmZyb20od2FzbVR4LnNpZ25hYmxlUGF5bG9hZCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3YXNtSGV4LCBzdHJpcENvbXBhY3RQcmVmaXgobGVnYWN5SGV4KSwgJ1NpZ25pbmcgcGF5bG9hZCBzaG91bGQgbWF0Y2gnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgcHJvZHVjZSBpZGVudGljYWwgc2lnbmluZyBwYXlsb2FkIGZvciB3aXRoZHJhd1VuYm9uZGVkIChjbGFpbSknLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBzbGFzaGluZ1NwYW5zID0gMDtcblxuICAgICAgY29uc3QgZmFjdG9yeSA9IG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXJGYWN0b3J5KGNvaW4pO1xuICAgICAgY29uc3QgbGVnYWN5QnVpbGRlciA9IGZhY3RvcnkuZ2V0V2l0aGRyYXdVbnN0YWtlZEJ1aWxkZXIoKTtcblxuICAgICAgbGVnYWN5QnVpbGRlclxuICAgICAgICAuc2VuZGVyKHsgYWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KVxuICAgICAgICAuc2xhc2hpbmdTcGFucyhzbGFzaGluZ1NwYW5zKVxuICAgICAgICAudmFsaWRpdHkoeyBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsIG1heER1cmF0aW9uOiAyNDAwIH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jayh3ZXN0ZW5kQmxvY2suaGFzaClcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMCB9KTtcblxuICAgICAgY29uc3QgbGVnYWN5VHggPSBhd2FpdCBsZWdhY3lCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBjb25zdCBsZWdhY3lIZXggPSBsZWdhY3lUeC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKHsgdHlwZTogJ2NsYWltJywgc2xhc2hpbmdTcGFucyB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcbiAgICAgIGNvbnN0IHdhc21IZXggPSAnMHgnICsgQnVmZmVyLmZyb20od2FzbVR4LnNpZ25hYmxlUGF5bG9hZCgpKS50b1N0cmluZygnaGV4Jyk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbCh3YXNtSGV4LCBzdHJpcENvbXBhY3RQcmVmaXgobGVnYWN5SGV4KSwgJ1NpZ25pbmcgcGF5bG9hZCBzaG91bGQgbWF0Y2gnKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEludGVudC1iYXNlZCBUcmFuc2FjdGlvbiBCdWlsZGluZyAoc2FuaXR5IGNoZWNrcylcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGRlc2NyaWJlKCdJbnRlbnQtYmFzZWQgVHJhbnNhY3Rpb24gQnVpbGRpbmcnLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ3Nob3VsZCBidWlsZCBwYXltZW50IGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAncGF5bWVudCcsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDBuLCBrZWVwQWxpdmU6IHRydWUgfSxcbiAgICAgICAgY3JlYXRlV2FzbUNvbnRleHQoKVxuICAgICAgKTtcbiAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSB3YXNtVHgudG9Ccm9hZGNhc3RGb3JtYXQoKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLnN0YXJ0c1dpdGgoJzB4JyksICdTaG91bGQgYmUgaGV4IGVuY29kZWQnKTtcbiAgICAgIGFzc2VydChzZXJpYWxpemVkLmxlbmd0aCA+IDEwLCAnU2hvdWxkIGhhdmUgY29udGVudCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzdGFrZSAodG9wLXVwKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3N0YWtlJywgYW1vdW50OiA1MDAwMDAwMDAwMDAwbiwgcGF5ZWU6IHsgdHlwZTogJ3N0YWtlZCcgfSB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBzdGFrZSB3aXRoIHByb3h5IChuZXcgc3Rha2UgLyBiYXRjaEFsbChib25kLCBhZGRQcm94eSkpIGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAgeyB0eXBlOiAnc3Rha2UnLCBhbW91bnQ6IDEwMDAwMDAwMDAwMDAwbiwgcHJveHlBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLCBwYXllZTogeyB0eXBlOiAnc3Rha2VkJyB9IH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG4gICAgICBhc3NlcnQod2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIGNsYWltICh3aXRoZHJhd1VuYm9uZGVkKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAnY2xhaW0nLCBzbGFzaGluZ1NwYW5zOiAwIH0sIGNyZWF0ZVdhc21Db250ZXh0KCkpO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCB1bnN0YWtlIChwYXJ0aWFsIC8gdW5ib25kKSBmcm9tIGludGVudCcsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oeyB0eXBlOiAndW5zdGFrZScsIGFtb3VudDogNTAwMDAwMDAwMDAwMG4gfSwgY3JlYXRlV2FzbUNvbnRleHQoKSk7XG4gICAgICBhc3NlcnQod2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCkuc3RhcnRzV2l0aCgnMHgnKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIGJ1aWxkIHVuc3Rha2Ugd2l0aCBzdG9wU3Rha2luZyAoZnVsbCAvIGJhdGNoQWxsKHJlbW92ZVByb3h5LCBjaGlsbCwgdW5ib25kKSkgZnJvbSBpbnRlbnQnLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3Vuc3Rha2UnLFxuICAgICAgICAgIGFtb3VudDogNTAwMDAwMDAwMDAwMG4sXG4gICAgICAgICAgc3RvcFN0YWtpbmc6IHRydWUsXG4gICAgICAgICAgcHJveHlBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzLFxuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVXYXNtQ29udGV4dCgpXG4gICAgICApO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBidWlsZCBjb25zb2xpZGF0ZSAodHJhbnNmZXJBbGwpIGZyb20gaW50ZW50JywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICdjb25zb2xpZGF0ZScsIHRvOiBhY2NvdW50cy5hY2NvdW50Mi5hZGRyZXNzIH0sIGNyZWF0ZVdhc21Db250ZXh0KCkpO1xuICAgICAgYXNzZXJ0KHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLnN0YXJ0c1dpdGgoJzB4JykpO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WASM Parser Explanation Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests for explainDotTransaction, specifically verifying batch transaction
|
|
5
|
+
* handling with proxy deposit costs matches legacy account-lib behavior.
|
|
6
|
+
*
|
|
7
|
+
* Uses WASM-built transactions (not legacy rawTx fixtures) since the WASM
|
|
8
|
+
* parser requires metadata-compatible signed extension encoding.
|
|
9
|
+
*
|
|
10
|
+
* Note: wasm-dot@1.3.0 uses high-level business intents. Batch transactions
|
|
11
|
+
* are produced automatically from the intent (e.g., unstake with stopStaking
|
|
12
|
+
* produces batchAll(removeProxy, chill, unbond)).
|
|
13
|
+
*/
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=wasmParserExplanation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasmParserExplanation.d.ts","sourceRoot":"","sources":["../../../../test/unit/wasmParserExplanation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* WASM Parser Explanation Tests
|
|
4
|
+
*
|
|
5
|
+
* Tests for explainDotTransaction, specifically verifying batch transaction
|
|
6
|
+
* handling with proxy deposit costs matches legacy account-lib behavior.
|
|
7
|
+
*
|
|
8
|
+
* Uses WASM-built transactions (not legacy rawTx fixtures) since the WASM
|
|
9
|
+
* parser requires metadata-compatible signed extension encoding.
|
|
10
|
+
*
|
|
11
|
+
* Note: wasm-dot@1.3.0 uses high-level business intents. Batch transactions
|
|
12
|
+
* are produced automatically from the intent (e.g., unstake with stopStaking
|
|
13
|
+
* produces batchAll(removeProxy, chill, unbond)).
|
|
14
|
+
*/
|
|
15
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
16
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const assert_1 = __importDefault(require("assert"));
|
|
20
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
21
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
22
|
+
const wasmParser_1 = require("../../src/lib/wasmParser");
|
|
23
|
+
const wasm_dot_1 = require("@bitgo/wasm-dot");
|
|
24
|
+
const fixtures_1 = require("../fixtures");
|
|
25
|
+
const utils_1 = __importDefault(require("../../src/lib/utils"));
|
|
26
|
+
describe('WASM Parser Explanation', function () {
|
|
27
|
+
const coin = statics_1.coins.get('tdot');
|
|
28
|
+
// utils.getMaterial returns the iface Material shape; cast to WasmMaterial for buildTransaction
|
|
29
|
+
const material = utils_1.default.getMaterial(coin);
|
|
30
|
+
function createWasmContext(overrides = {}) {
|
|
31
|
+
return {
|
|
32
|
+
sender: fixtures_1.accounts.account1.address,
|
|
33
|
+
nonce: 0,
|
|
34
|
+
tip: 0n,
|
|
35
|
+
material,
|
|
36
|
+
validity: {
|
|
37
|
+
firstValid: fixtures_1.westendBlock.blockNumber,
|
|
38
|
+
maxDuration: 2400,
|
|
39
|
+
},
|
|
40
|
+
referenceBlock: fixtures_1.westendBlock.hash,
|
|
41
|
+
...overrides,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
describe('Batch unstake (removeProxy + chill + unbond)', function () {
|
|
45
|
+
it('should explain batch unstake with proxy deposit cost', function () {
|
|
46
|
+
const unbondAmount = 5000000000000n; // 5 DOT
|
|
47
|
+
const proxyDelegate = fixtures_1.accounts.account2.address;
|
|
48
|
+
// Build a full unstake: produces batchAll(removeProxy, chill, unbond)
|
|
49
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({
|
|
50
|
+
type: 'unstake',
|
|
51
|
+
amount: unbondAmount,
|
|
52
|
+
stopStaking: true,
|
|
53
|
+
proxyAddress: proxyDelegate,
|
|
54
|
+
}, createWasmContext());
|
|
55
|
+
const txHex = wasmTx.toBroadcastFormat();
|
|
56
|
+
const explanation = (0, wasmParser_1.explainDotTransaction)({
|
|
57
|
+
txHex,
|
|
58
|
+
material,
|
|
59
|
+
senderAddress: fixtures_1.accounts.account1.address,
|
|
60
|
+
});
|
|
61
|
+
// Should be Batch type
|
|
62
|
+
assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Batch);
|
|
63
|
+
assert_1.default.ok(explanation.methodName.includes('batchAll'), `Expected batchAll, got ${explanation.methodName}`);
|
|
64
|
+
// Outputs should contain proxy deposit cost, NOT the unbond amount
|
|
65
|
+
assert_1.default.strictEqual(explanation.outputs.length, 1, 'Should have exactly one output (proxy deposit cost)');
|
|
66
|
+
const output = explanation.outputs[0];
|
|
67
|
+
assert_1.default.strictEqual(output.address, fixtures_1.accounts.account1.address, 'Output should go to sender (deposit refund)');
|
|
68
|
+
const proxyDepositCost = BigInt(output.amount);
|
|
69
|
+
assert_1.default.ok(proxyDepositCost > 0n, 'Proxy deposit cost should be positive');
|
|
70
|
+
// The proxy deposit cost should NOT equal the unbond amount
|
|
71
|
+
assert_1.default.notStrictEqual(proxyDepositCost, unbondAmount, 'Should use proxy deposit cost, not unbond amount');
|
|
72
|
+
// Input should come from the proxy delegate address
|
|
73
|
+
assert_1.default.strictEqual(explanation.inputs.length, 1, 'Should have exactly one input');
|
|
74
|
+
assert_1.default.strictEqual(explanation.inputs[0].address, proxyDelegate, 'Input should come from proxy delegate');
|
|
75
|
+
assert_1.default.strictEqual(explanation.inputs[0].valueString, output.amount, 'Input value should equal proxy deposit cost');
|
|
76
|
+
});
|
|
77
|
+
it('proxy deposit cost should be consistent across calls', function () {
|
|
78
|
+
const proxyDelegate = fixtures_1.accounts.account2.address;
|
|
79
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({
|
|
80
|
+
type: 'unstake',
|
|
81
|
+
amount: 1000000000000n,
|
|
82
|
+
stopStaking: true,
|
|
83
|
+
proxyAddress: proxyDelegate,
|
|
84
|
+
}, createWasmContext());
|
|
85
|
+
const txHex = wasmTx.toBroadcastFormat();
|
|
86
|
+
const explanation1 = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
|
|
87
|
+
const explanation2 = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
|
|
88
|
+
assert_1.default.strictEqual(explanation1.outputs[0].amount, explanation2.outputs[0].amount);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('Batch stake (bond + addProxy)', function () {
|
|
92
|
+
it('should explain batch stake with bond amount and proxy deposit cost', function () {
|
|
93
|
+
const bondAmount = 10000000000000n; // 10 DOT
|
|
94
|
+
const proxyDelegate = fixtures_1.accounts.account2.address;
|
|
95
|
+
// Build a new stake with proxy: produces batchAll(bond, addProxy)
|
|
96
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({
|
|
97
|
+
type: 'stake',
|
|
98
|
+
amount: bondAmount,
|
|
99
|
+
proxyAddress: proxyDelegate,
|
|
100
|
+
payee: { type: 'staked' },
|
|
101
|
+
}, createWasmContext());
|
|
102
|
+
const txHex = wasmTx.toBroadcastFormat();
|
|
103
|
+
const explanation = (0, wasmParser_1.explainDotTransaction)({ txHex, material, senderAddress: fixtures_1.accounts.account1.address });
|
|
104
|
+
assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Batch);
|
|
105
|
+
// Should have two outputs: bond amount (to STAKING_DESTINATION sentinel) + proxy deposit cost (to proxy delegate)
|
|
106
|
+
assert_1.default.strictEqual(explanation.outputs.length, 2, 'Should have bond + proxy deposit outputs');
|
|
107
|
+
const stakingOutput = explanation.outputs.find((o) => o.address === '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM');
|
|
108
|
+
assert_1.default.ok(stakingOutput, 'Should have STAKING_DESTINATION sentinel output for bond amount');
|
|
109
|
+
assert_1.default.strictEqual(BigInt(stakingOutput.amount), bondAmount, 'Bond amount should match');
|
|
110
|
+
const proxyOutput = explanation.outputs.find((o) => o.address !== '5C4hrfjw9DjXZTzV3MwzrrAr9P1MJhSrvWGWqi1eSuyUpnhM');
|
|
111
|
+
assert_1.default.ok(proxyOutput, 'Should have proxy deposit output');
|
|
112
|
+
assert_1.default.strictEqual(proxyOutput.address, proxyDelegate);
|
|
113
|
+
assert_1.default.ok(BigInt(proxyOutput.amount) > 0n, 'Proxy deposit cost should be positive');
|
|
114
|
+
// All inputs should come from sender
|
|
115
|
+
assert_1.default.strictEqual(explanation.inputs.length, 2);
|
|
116
|
+
for (const input of explanation.inputs) {
|
|
117
|
+
assert_1.default.strictEqual(input.address, fixtures_1.accounts.account1.address);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('Non-batch transactions (should not be affected)', function () {
|
|
122
|
+
it('should explain transfer normally', function () {
|
|
123
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'payment', to: fixtures_1.accounts.account2.address, amount: 1000000000000n, keepAlive: true }, createWasmContext());
|
|
124
|
+
const explanation = (0, wasmParser_1.explainDotTransaction)({
|
|
125
|
+
txHex: wasmTx.toBroadcastFormat(),
|
|
126
|
+
material,
|
|
127
|
+
senderAddress: fixtures_1.accounts.account1.address,
|
|
128
|
+
});
|
|
129
|
+
assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.Send);
|
|
130
|
+
assert_1.default.strictEqual(explanation.outputs.length, 1);
|
|
131
|
+
assert_1.default.strictEqual(explanation.outputs[0].address, fixtures_1.accounts.account2.address);
|
|
132
|
+
assert_1.default.strictEqual(explanation.outputs[0].amount, '1000000000000');
|
|
133
|
+
});
|
|
134
|
+
it('should explain single unstake (unbond) normally', function () {
|
|
135
|
+
const wasmTx = (0, wasm_dot_1.buildTransaction)({ type: 'unstake', amount: 5000000000000n }, createWasmContext());
|
|
136
|
+
const explanation = (0, wasmParser_1.explainDotTransaction)({
|
|
137
|
+
txHex: wasmTx.toBroadcastFormat(),
|
|
138
|
+
material,
|
|
139
|
+
senderAddress: fixtures_1.accounts.account1.address,
|
|
140
|
+
});
|
|
141
|
+
assert_1.default.strictEqual(explanation.type, sdk_core_1.TransactionType.StakingUnlock);
|
|
142
|
+
// Unbond has no outputs (balance stays in account as unlocking, matching legacy behavior)
|
|
143
|
+
assert_1.default.strictEqual(explanation.outputs.length, 0);
|
|
144
|
+
});
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FzbVBhcnNlckV4cGxhbmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3dhc21QYXJzZXJFeHBsYW5hdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7OztHQVlHOzs7OztBQUVILG9EQUE0QjtBQUM1QixpREFBNEM7QUFDNUMsbURBQXVEO0FBQ3ZELHlEQUFpRTtBQUNqRSw4Q0FBcUc7QUFFckcsMENBQXFEO0FBQ3JELGdFQUF3QztBQUV4QyxRQUFRLENBQUMseUJBQXlCLEVBQUU7SUFDbEMsTUFBTSxJQUFJLEdBQUcsZUFBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixnR0FBZ0c7SUFDaEcsTUFBTSxRQUFRLEdBQUcsZUFBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQTRCLENBQUM7SUFFcEUsU0FBUyxpQkFBaUIsQ0FBQyxZQUFtQyxFQUFFO1FBQzlELE9BQU87WUFDTCxNQUFNLEVBQUUsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxLQUFLLEVBQUUsQ0FBQztZQUNSLEdBQUcsRUFBRSxFQUFFO1lBQ1AsUUFBUTtZQUNSLFFBQVEsRUFBRTtnQkFDUixVQUFVLEVBQUUsdUJBQVksQ0FBQyxXQUFXO2dCQUNwQyxXQUFXLEVBQUUsSUFBSTthQUNsQjtZQUNELGNBQWMsRUFBRSx1QkFBWSxDQUFDLElBQUk7WUFDakMsR0FBRyxTQUFTO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsOENBQThDLEVBQUU7UUFDdkQsRUFBRSxDQUFDLHNEQUFzRCxFQUFFO1lBQ3pELE1BQU0sWUFBWSxHQUFHLGNBQWMsQ0FBQyxDQUFDLFFBQVE7WUFDN0MsTUFBTSxhQUFhLEdBQUcsbUJBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO1lBRWhELHNFQUFzRTtZQUN0RSxNQUFNLE1BQU0sR0FBRyxJQUFBLDJCQUFnQixFQUM3QjtnQkFD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QUFDLElBQUksRUFBRSwwQkFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BFLDBGQUEwRjtZQUMxRixnQkFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdBU00gUGFyc2VyIEV4cGxhbmF0aW9uIFRlc3RzXG4gKlxuICogVGVzdHMgZm9yIGV4cGxhaW5Eb3RUcmFuc2FjdGlvbiwgc3BlY2lmaWNhbGx5IHZlcmlmeWluZyBiYXRjaCB0cmFuc2FjdGlvblxuICogaGFuZGxpbmcgd2l0aCBwcm94eSBkZXBvc2l0IGNvc3RzIG1hdGNoZXMgbGVnYWN5IGFjY291bnQtbGliIGJlaGF2aW9yLlxuICpcbiAqIFVzZXMgV0FTTS1idWlsdCB0cmFuc2FjdGlvbnMgKG5vdCBsZWdhY3kgcmF3VHggZml4dHVyZXMpIHNpbmNlIHRoZSBXQVNNXG4gKiBwYXJzZXIgcmVxdWlyZXMgbWV0YWRhdGEtY29tcGF0aWJsZSBzaWduZWQgZXh0ZW5zaW9uIGVuY29kaW5nLlxuICpcbiAqIE5vdGU6IHdhc20tZG90QDEuMy4wIHVzZXMgaGlnaC1sZXZlbCBidXNpbmVzcyBpbnRlbnRzLiBCYXRjaCB0cmFuc2FjdGlvbnNcbiAqIGFyZSBwcm9kdWNlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGludGVudCAoZS5nLiwgdW5zdGFrZSB3aXRoIHN0b3BTdGFraW5nXG4gKiBwcm9kdWNlcyBiYXRjaEFsbChyZW1vdmVQcm94eSwgY2hpbGwsIHVuYm9uZCkpLlxuICovXG5cbmltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IGNvaW5zIH0gZnJvbSAnQGJpdGdvLWJldGEvc3RhdGljcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBleHBsYWluRG90VHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMvbGliL3dhc21QYXJzZXInO1xuaW1wb3J0IHsgYnVpbGRUcmFuc2FjdGlvbiwgdHlwZSBCdWlsZENvbnRleHQsIHR5cGUgTWF0ZXJpYWwgYXMgV2FzbU1hdGVyaWFsIH0gZnJvbSAnQGJpdGdvL3dhc20tZG90JztcbmltcG9ydCB0eXBlIHsgTWF0ZXJpYWwgfSBmcm9tICcuLi8uLi9zcmMvbGliL2lmYWNlJztcbmltcG9ydCB7IGFjY291bnRzLCB3ZXN0ZW5kQmxvY2sgfSBmcm9tICcuLi9maXh0dXJlcyc7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi4vLi4vc3JjL2xpYi91dGlscyc7XG5cbmRlc2NyaWJlKCdXQVNNIFBhcnNlciBFeHBsYW5hdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29pbiA9IGNvaW5zLmdldCgndGRvdCcpO1xuICAvLyB1dGlscy5nZXRNYXRlcmlhbCByZXR1cm5zIHRoZSBpZmFjZSBNYXRlcmlhbCBzaGFwZTsgY2FzdCB0byBXYXNtTWF0ZXJpYWwgZm9yIGJ1aWxkVHJhbnNhY3Rpb25cbiAgY29uc3QgbWF0ZXJpYWwgPSB1dGlscy5nZXRNYXRlcmlhbChjb2luKSBhcyBNYXRlcmlhbCAmIFdhc21NYXRlcmlhbDtcblxuICBmdW5jdGlvbiBjcmVhdGVXYXNtQ29udGV4dChvdmVycmlkZXM6IFBhcnRpYWw8QnVpbGRDb250ZXh0PiA9IHt9KTogQnVpbGRDb250ZXh0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2VuZGVyOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgbm9uY2U6IDAsXG4gICAgICB0aXA6IDBuLFxuICAgICAgbWF0ZXJpYWwsXG4gICAgICB2YWxpZGl0eToge1xuICAgICAgICBmaXJzdFZhbGlkOiB3ZXN0ZW5kQmxvY2suYmxvY2tOdW1iZXIsXG4gICAgICAgIG1heER1cmF0aW9uOiAyNDAwLFxuICAgICAgfSxcbiAgICAgIHJlZmVyZW5jZUJsb2NrOiB3ZXN0ZW5kQmxvY2suaGFzaCxcbiAgICAgIC4uLm92ZXJyaWRlcyxcbiAgICB9O1xuICB9XG5cbiAgZGVzY3JpYmUoJ0JhdGNoIHVuc3Rha2UgKHJlbW92ZVByb3h5ICsgY2hpbGwgKyB1bmJvbmQpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiBiYXRjaCB1bnN0YWtlIHdpdGggcHJveHkgZGVwb3NpdCBjb3N0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgdW5ib25kQW1vdW50ID0gNTAwMDAwMDAwMDAwMG47IC8vIDUgRE9UXG4gICAgICBjb25zdCBwcm94eURlbGVnYXRlID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcblxuICAgICAgLy8gQnVpbGQgYSBmdWxsIHVuc3Rha2U6IHByb2R1Y2VzIGJhdGNoQWxsKHJlbW92ZVByb3h5LCBjaGlsbCwgdW5ib25kKVxuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbihcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd1bnN0YWtlJyxcbiAgICAgICAgICBhbW91bnQ6IHVuYm9uZEFtb3VudCxcbiAgICAgICAgICBzdG9wU3Rha2luZzogdHJ1ZSxcbiAgICAgICAgICBwcm94eUFkZHJlc3M6IHByb3h5RGVsZWdhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4SGV4ID0gd2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbih7XG4gICAgICAgIHR4SGV4LFxuICAgICAgICBtYXRlcmlhbCxcbiAgICAgICAgc2VuZGVyQWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBTaG91bGQgYmUgQmF0Y2ggdHlwZVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5CYXRjaCk7XG4gICAgICBhc3NlcnQub2soZXhwbGFuYXRpb24ubWV0aG9kTmFtZS5pbmNsdWRlcygnYmF0Y2hBbGwnKSwgYEV4cGVjdGVkIGJhdGNoQWxsLCBnb3QgJHtleHBsYW5hdGlvbi5tZXRob2ROYW1lfWApO1xuXG4gICAgICAvLyBPdXRwdXRzIHNob3VsZCBjb250YWluIHByb3h5IGRlcG9zaXQgY29zdCwgTk9UIHRoZSB1bmJvbmQgYW1vdW50XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24ub3V0cHV0cy5sZW5ndGgsIDEsICdTaG91bGQgaGF2ZSBleGFjdGx5IG9uZSBvdXRwdXQgKHByb3h5IGRlcG9zaXQgY29zdCknKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGV4cGxhbmF0aW9uLm91dHB1dHNbMF07XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwob3V0cHV0LmFkZHJlc3MsIGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MsICdPdXRwdXQgc2hvdWxkIGdvIHRvIHNlbmRlciAoZGVwb3NpdCByZWZ1bmQpJyk7XG4gICAgICBjb25zdCBwcm94eURlcG9zaXRDb3N0ID0gQmlnSW50KG91dHB1dC5hbW91bnQpO1xuICAgICAgYXNzZXJ0Lm9rKHByb3h5RGVwb3NpdENvc3QgPiAwbiwgJ1Byb3h5IGRlcG9zaXQgY29zdCBzaG91bGQgYmUgcG9zaXRpdmUnKTtcbiAgICAgIC8vIFRoZSBwcm94eSBkZXBvc2l0IGNvc3Qgc2hvdWxkIE5PVCBlcXVhbCB0aGUgdW5ib25kIGFtb3VudFxuICAgICAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHByb3h5RGVwb3NpdENvc3QsIHVuYm9uZEFtb3VudCwgJ1Nob3VsZCB1c2UgcHJveHkgZGVwb3NpdCBjb3N0LCBub3QgdW5ib25kIGFtb3VudCcpO1xuXG4gICAgICAvLyBJbnB1dCBzaG91bGQgY29tZSBmcm9tIHRoZSBwcm94eSBkZWxlZ2F0ZSBhZGRyZXNzXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uaW5wdXRzLmxlbmd0aCwgMSwgJ1Nob3VsZCBoYXZlIGV4YWN0bHkgb25lIGlucHV0Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24uaW5wdXRzWzBdLmFkZHJlc3MsIHByb3h5RGVsZWdhdGUsICdJbnB1dCBzaG91bGQgY29tZSBmcm9tIHByb3h5IGRlbGVnYXRlJyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICAgIGV4cGxhbmF0aW9uLmlucHV0c1swXS52YWx1ZVN0cmluZyxcbiAgICAgICAgb3V0cHV0LmFtb3VudCxcbiAgICAgICAgJ0lucHV0IHZhbHVlIHNob3VsZCBlcXVhbCBwcm94eSBkZXBvc2l0IGNvc3QnXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Byb3h5IGRlcG9zaXQgY29zdCBzaG91bGQgYmUgY29uc2lzdGVudCBhY3Jvc3MgY2FsbHMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICBjb25zdCBwcm94eURlbGVnYXRlID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndW5zdGFrZScsXG4gICAgICAgICAgYW1vdW50OiAxMDAwMDAwMDAwMDAwbixcbiAgICAgICAgICBzdG9wU3Rha2luZzogdHJ1ZSxcbiAgICAgICAgICBwcm94eUFkZHJlc3M6IHByb3h5RGVsZWdhdGUsXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4SGV4ID0gd2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbjEgPSBleHBsYWluRG90VHJhbnNhY3Rpb24oeyB0eEhleCwgbWF0ZXJpYWwsIHNlbmRlckFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbjIgPSBleHBsYWluRG90VHJhbnNhY3Rpb24oeyB0eEhleCwgbWF0ZXJpYWwsIHNlbmRlckFkZHJlc3M6IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3MgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbjEub3V0cHV0c1swXS5hbW91bnQsIGV4cGxhbmF0aW9uMi5vdXRwdXRzWzBdLmFtb3VudCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdCYXRjaCBzdGFrZSAoYm9uZCArIGFkZFByb3h5KScsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGV4cGxhaW4gYmF0Y2ggc3Rha2Ugd2l0aCBib25kIGFtb3VudCBhbmQgcHJveHkgZGVwb3NpdCBjb3N0JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgYm9uZEFtb3VudCA9IDEwMDAwMDAwMDAwMDAwbjsgLy8gMTAgRE9UXG4gICAgICBjb25zdCBwcm94eURlbGVnYXRlID0gYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcztcblxuICAgICAgLy8gQnVpbGQgYSBuZXcgc3Rha2Ugd2l0aCBwcm94eTogcHJvZHVjZXMgYmF0Y2hBbGwoYm9uZCwgYWRkUHJveHkpXG4gICAgICBjb25zdCB3YXNtVHggPSBidWlsZFRyYW5zYWN0aW9uKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3N0YWtlJyxcbiAgICAgICAgICBhbW91bnQ6IGJvbmRBbW91bnQsXG4gICAgICAgICAgcHJveHlBZGRyZXNzOiBwcm94eURlbGVnYXRlLFxuICAgICAgICAgIHBheWVlOiB7IHR5cGU6ICdzdGFrZWQnIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IHR4SGV4ID0gd2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCk7XG4gICAgICBjb25zdCBleHBsYW5hdGlvbiA9IGV4cGxhaW5Eb3RUcmFuc2FjdGlvbih7IHR4SGV4LCBtYXRlcmlhbCwgc2VuZGVyQWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyB9KTtcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLnR5cGUsIFRyYW5zYWN0aW9uVHlwZS5CYXRjaCk7XG5cbiAgICAgIC8vIFNob3VsZCBoYXZlIHR3byBvdXRwdXRzOiBib25kIGFtb3VudCAodG8gU1RBS0lOR19ERVNUSU5BVElPTiBzZW50aW5lbCkgKyBwcm94eSBkZXBvc2l0IGNvc3QgKHRvIHByb3h5IGRlbGVnYXRlKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCAyLCAnU2hvdWxkIGhhdmUgYm9uZCArIHByb3h5IGRlcG9zaXQgb3V0cHV0cycpO1xuXG4gICAgICBjb25zdCBzdGFraW5nT3V0cHV0ID0gZXhwbGFuYXRpb24ub3V0cHV0cy5maW5kKFxuICAgICAgICAobykgPT4gby5hZGRyZXNzID09PSAnNUM0aHJmanc5RGpYWlR6VjNNd3pyckFyOVAxTUpoU3J2V0dXcWkxZVN1eVVwbmhNJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC5vayhzdGFraW5nT3V0cHV0LCAnU2hvdWxkIGhhdmUgU1RBS0lOR19ERVNUSU5BVElPTiBzZW50aW5lbCBvdXRwdXQgZm9yIGJvbmQgYW1vdW50Jyk7XG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoQmlnSW50KHN0YWtpbmdPdXRwdXQhLmFtb3VudCksIGJvbmRBbW91bnQsICdCb25kIGFtb3VudCBzaG91bGQgbWF0Y2gnKTtcblxuICAgICAgY29uc3QgcHJveHlPdXRwdXQgPSBleHBsYW5hdGlvbi5vdXRwdXRzLmZpbmQoXG4gICAgICAgIChvKSA9PiBvLmFkZHJlc3MgIT09ICc1QzRocmZqdzlEalhaVHpWM013enJyQXI5UDFNSmhTcnZXR1dxaTFlU3V5VXBuaE0nXG4gICAgICApO1xuICAgICAgYXNzZXJ0Lm9rKHByb3h5T3V0cHV0LCAnU2hvdWxkIGhhdmUgcHJveHkgZGVwb3NpdCBvdXRwdXQnKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChwcm94eU91dHB1dCEuYWRkcmVzcywgcHJveHlEZWxlZ2F0ZSk7XG4gICAgICBhc3NlcnQub2soQmlnSW50KHByb3h5T3V0cHV0IS5hbW91bnQpID4gMG4sICdQcm94eSBkZXBvc2l0IGNvc3Qgc2hvdWxkIGJlIHBvc2l0aXZlJyk7XG5cbiAgICAgIC8vIEFsbCBpbnB1dHMgc2hvdWxkIGNvbWUgZnJvbSBzZW5kZXJcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5pbnB1dHMubGVuZ3RoLCAyKTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXQgb2YgZXhwbGFuYXRpb24uaW5wdXRzKSB7XG4gICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChpbnB1dC5hZGRyZXNzLCBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ05vbi1iYXRjaCB0cmFuc2FjdGlvbnMgKHNob3VsZCBub3QgYmUgYWZmZWN0ZWQpJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgZXhwbGFpbiB0cmFuc2ZlciBub3JtYWxseScsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHdhc21UeCA9IGJ1aWxkVHJhbnNhY3Rpb24oXG4gICAgICAgIHsgdHlwZTogJ3BheW1lbnQnLCB0bzogYWNjb3VudHMuYWNjb3VudDIuYWRkcmVzcywgYW1vdW50OiAxMDAwMDAwMDAwMDAwbiwga2VlcEFsaXZlOiB0cnVlIH0sXG4gICAgICAgIGNyZWF0ZVdhc21Db250ZXh0KClcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4cGxhbmF0aW9uID0gZXhwbGFpbkRvdFRyYW5zYWN0aW9uKHtcbiAgICAgICAgdHhIZXg6IHdhc21UeC50b0Jyb2FkY2FzdEZvcm1hdCgpLFxuICAgICAgICBtYXRlcmlhbCxcbiAgICAgICAgc2VuZGVyQWRkcmVzczogYWNjb3VudHMuYWNjb3VudDEuYWRkcmVzcyxcbiAgICAgIH0pO1xuXG4gICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZXhwbGFuYXRpb24udHlwZSwgVHJhbnNhY3Rpb25UeXBlLlNlbmQpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHMubGVuZ3RoLCAxKTtcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzWzBdLmFkZHJlc3MsIGFjY291bnRzLmFjY291bnQyLmFkZHJlc3MpO1xuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGV4cGxhbmF0aW9uLm91dHB1dHNbMF0uYW1vdW50LCAnMTAwMDAwMDAwMDAwMCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBleHBsYWluIHNpbmdsZSB1bnN0YWtlICh1bmJvbmQpIG5vcm1hbGx5JywgZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3Qgd2FzbVR4ID0gYnVpbGRUcmFuc2FjdGlvbih7IHR5cGU6ICd1bnN0YWtlJywgYW1vdW50OiA1MDAwMDAwMDAwMDAwbiB9LCBjcmVhdGVXYXNtQ29udGV4dCgpKTtcblxuICAgICAgY29uc3QgZXhwbGFuYXRpb24gPSBleHBsYWluRG90VHJhbnNhY3Rpb24oe1xuICAgICAgICB0eEhleDogd2FzbVR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksXG4gICAgICAgIG1hdGVyaWFsLFxuICAgICAgICBzZW5kZXJBZGRyZXNzOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgfSk7XG5cbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi50eXBlLCBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ1VubG9jayk7XG4gICAgICAvLyBVbmJvbmQgaGFzIG5vIG91dHB1dHMgKGJhbGFuY2Ugc3RheXMgaW4gYWNjb3VudCBhcyB1bmxvY2tpbmcsIG1hdGNoaW5nIGxlZ2FjeSBiZWhhdmlvcilcbiAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChleHBsYW5hdGlvbi5vdXRwdXRzLmxlbmd0aCwgMCk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|