@bitgo-beta/sdk-coin-polyx 1.0.1-beta.68 → 1.0.1-beta.680
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/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/lib/baseBuilder.d.ts +24 -0
- package/dist/src/lib/baseBuilder.d.ts.map +1 -0
- package/dist/src/lib/baseBuilder.js +31 -0
- package/dist/src/lib/batchStakingBuilder.d.ts +79 -0
- package/dist/src/lib/batchStakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchStakingBuilder.js +299 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts +39 -0
- package/dist/src/lib/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/src/lib/batchUnstakingBuilder.js +127 -0
- package/dist/src/lib/bondExtraBuilder.d.ts +37 -0
- package/dist/src/lib/bondExtraBuilder.d.ts.map +1 -0
- package/dist/src/lib/bondExtraBuilder.js +101 -0
- package/dist/src/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +15 -0
- package/dist/src/lib/iface.d.ts +140 -2
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +37 -1
- package/dist/src/lib/index.d.ts +16 -7
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +44 -36
- package/dist/src/lib/preApproveAssetBuilder.d.ts +33 -0
- package/dist/src/lib/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/src/lib/preApproveAssetBuilder.js +77 -0
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts +34 -0
- package/dist/src/lib/registerDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/src/lib/registerDidWithCDDBuilder.js +83 -0
- package/dist/src/lib/rejectInstructionBuilder.d.ts +29 -0
- package/dist/src/lib/rejectInstructionBuilder.d.ts.map +1 -0
- package/dist/src/lib/rejectInstructionBuilder.js +89 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts +58 -0
- package/dist/src/lib/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/src/lib/tokenTransferBuilder.js +158 -0
- package/dist/src/lib/transaction.d.ts +26 -4
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +183 -7
- package/dist/src/lib/transactionBuilderFactory.d.ts +29 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +119 -8
- package/dist/src/lib/transferBuilder.d.ts +51 -3
- package/dist/src/lib/transferBuilder.d.ts.map +1 -1
- package/dist/src/lib/transferBuilder.js +109 -3
- package/dist/src/lib/txnSchema.d.ts +50 -0
- package/dist/src/lib/txnSchema.d.ts.map +1 -0
- package/dist/src/lib/txnSchema.js +165 -0
- package/dist/src/lib/unbondBuilder.d.ts +37 -0
- package/dist/src/lib/unbondBuilder.d.ts.map +1 -0
- package/dist/src/lib/unbondBuilder.js +98 -0
- package/dist/src/lib/utils.d.ts +15 -14
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +40 -23
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts +35 -0
- package/dist/src/lib/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/src/lib/withdrawUnbondedBuilder.js +89 -0
- package/dist/src/polyx.d.ts +50 -9
- package/dist/src/polyx.d.ts.map +1 -1
- package/dist/src/polyx.js +269 -15
- package/dist/src/polyxToken.d.ts +20 -0
- package/dist/src/polyxToken.d.ts.map +1 -0
- package/dist/src/polyxToken.js +55 -0
- package/dist/src/register.d.ts.map +1 -1
- package/dist/src/register.js +5 -1
- package/dist/src/resources/index.d.ts +3 -0
- package/dist/src/resources/index.d.ts.map +1 -0
- package/dist/src/resources/index.js +19 -0
- package/dist/src/resources/mainnet.d.ts +13 -0
- package/dist/src/resources/mainnet.d.ts.map +1 -0
- package/dist/src/resources/mainnet.js +16 -0
- package/dist/src/resources/testnet.d.ts +13 -0
- package/dist/src/resources/testnet.d.ts.map +1 -0
- package/dist/src/resources/testnet.js +16 -0
- package/dist/src/tpolyx.d.ts +7 -0
- package/dist/src/tpolyx.d.ts.map +1 -1
- package/dist/src/tpolyx.js +11 -1
- package/dist/test/integration/index.d.ts +1 -0
- package/dist/test/integration/index.d.ts.map +1 -0
- package/dist/test/integration/index.js +1 -0
- package/dist/test/resources/index.d.ts +106 -0
- package/dist/test/resources/index.d.ts.map +1 -0
- package/dist/test/resources/index.js +112 -0
- package/dist/test/resources/mainnet.d.ts +2 -0
- package/dist/test/resources/mainnet.d.ts.map +1 -0
- package/dist/test/resources/mainnet.js +5 -0
- package/dist/test/resources/materialData.json +8 -0
- package/dist/test/resources/materialDataModified.json +8 -0
- package/dist/test/resources/testnet.d.ts +2 -0
- package/dist/test/resources/testnet.d.ts.map +1 -0
- package/dist/test/resources/testnet.js +5 -0
- package/dist/test/resources/wrwUsers.d.ts +19 -0
- package/dist/test/resources/wrwUsers.d.ts.map +1 -0
- package/dist/test/resources/wrwUsers.js +60 -0
- package/dist/test/unit/polyx.d.ts +2 -0
- package/dist/test/unit/polyx.d.ts.map +1 -0
- package/dist/test/unit/polyx.js +209 -0
- package/dist/test/unit/transactionBuilder/base.d.ts +4 -0
- package/dist/test/unit/transactionBuilder/base.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/base.js +245 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchStakingBuilder.js +263 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/batchUnstakingBuilder.js +159 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/bondExtraBuilder.js +158 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/preApproveAssetBuilder.js +115 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/registerDidWithCDDBuilder.js +302 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/rejectInstructionBuilder.js +128 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/singletonRegistry.js +59 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/tokenTransferBuilder.js +140 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transactionBuilderFactory.js +74 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/transferBuilder.js +326 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/unbondBuilder.js +144 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts +2 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder/withdrawUnbondedBuilder.js +138 -0
- package/dist/test/unit/utils.d.ts +2 -0
- package/dist/test/unit/utils.d.ts.map +1 -0
- package/dist/test/unit/utils.js +143 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +19 -10
- package/.eslintignore +0 -4
- package/.mocharc.yml +0 -8
- package/CHANGELOG.md +0 -16
- package/dist/src/lib/keyPair.d.ts +0 -12
- package/dist/src/lib/keyPair.d.ts.map +0 -1
- package/dist/src/lib/keyPair.js +0 -24
- package/dist/src/lib/transactionBuilder.d.ts +0 -43
- package/dist/src/lib/transactionBuilder.d.ts.map +0 -1
- package/dist/src/lib/transactionBuilder.js +0 -78
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const txwrapper_polkadot_1 = require("@substrate/txwrapper-polkadot");
|
|
7
|
+
const statics_1 = require("@bitgo-beta/statics");
|
|
8
|
+
const should_1 = __importDefault(require("should"));
|
|
9
|
+
const sinon_1 = __importDefault(require("sinon"));
|
|
10
|
+
const lib_1 = require("../../../src/lib");
|
|
11
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
12
|
+
const utils_1 = __importDefault(require("../../../src/lib/utils"));
|
|
13
|
+
const resources_1 = require("../../resources");
|
|
14
|
+
function createMockTransaction(txData) {
|
|
15
|
+
return {
|
|
16
|
+
id: '123',
|
|
17
|
+
type: sdk_core_1.TransactionType.StakingWithdraw,
|
|
18
|
+
toBroadcastFormat: () => txData,
|
|
19
|
+
inputs: [],
|
|
20
|
+
outputs: [],
|
|
21
|
+
signature: ['mock-signature'],
|
|
22
|
+
toJson: () => ({
|
|
23
|
+
id: '123',
|
|
24
|
+
type: 'StakingWithdraw',
|
|
25
|
+
sender: resources_1.accounts.account1.address,
|
|
26
|
+
referenceBlock: '0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d',
|
|
27
|
+
blockNumber: 100,
|
|
28
|
+
genesisHash: '0x',
|
|
29
|
+
nonce: 1,
|
|
30
|
+
tip: 0,
|
|
31
|
+
specVersion: 1,
|
|
32
|
+
transactionVersion: 1,
|
|
33
|
+
chainName: 'Polymesh',
|
|
34
|
+
inputs: [],
|
|
35
|
+
outputs: [],
|
|
36
|
+
}),
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
describe('Polyx WithdrawUnbonded Builder', function () {
|
|
40
|
+
let builder;
|
|
41
|
+
const factory = new lib_1.TransactionBuilderFactory(statics_1.coins.get('tpolyx'));
|
|
42
|
+
const senderAddress = resources_1.accounts.account1.address;
|
|
43
|
+
const testSlashingSpans = 0;
|
|
44
|
+
beforeEach(() => {
|
|
45
|
+
builder = factory.getWithdrawUnbondedBuilder();
|
|
46
|
+
});
|
|
47
|
+
describe('setter validation', () => {
|
|
48
|
+
it('should validate slashing spans', () => {
|
|
49
|
+
const spy = sinon_1.default.spy(builder, 'validateValue');
|
|
50
|
+
should_1.default.throws(() => builder.slashingSpans(-1), /Value cannot be less than zero/);
|
|
51
|
+
should_1.default.doesNotThrow(() => builder.slashingSpans(0));
|
|
52
|
+
sinon_1.default.assert.calledTwice(spy);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe('Build and Sign', function () {
|
|
56
|
+
it('should build a withdraw unbonded transaction', async () => {
|
|
57
|
+
builder
|
|
58
|
+
.slashingSpans(testSlashingSpans)
|
|
59
|
+
.sender({ address: senderAddress })
|
|
60
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
61
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
62
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
|
|
63
|
+
const mockTx = createMockTransaction(resources_1.rawTx.withdrawUnbonded.unsigned);
|
|
64
|
+
sinon_1.default.stub(builder, 'build').resolves(mockTx);
|
|
65
|
+
const tx = await builder.build();
|
|
66
|
+
should_1.default.exist(tx);
|
|
67
|
+
should_1.default.equal(builder.getSlashingSpans(), testSlashingSpans);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
describe('Transaction Validation', function () {
|
|
71
|
+
it('should build, decode, and validate a real withdrawUnbonded transaction', () => {
|
|
72
|
+
// Build the transaction with real parameters
|
|
73
|
+
builder
|
|
74
|
+
.slashingSpans(testSlashingSpans)
|
|
75
|
+
.sender({ address: senderAddress })
|
|
76
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
77
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
78
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
|
|
79
|
+
// Set up material for decoding
|
|
80
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
81
|
+
builder.material(material);
|
|
82
|
+
// Build the actual unsigned transaction
|
|
83
|
+
const unsignedTx = builder['buildTransaction']();
|
|
84
|
+
const registry = builder['_registry'];
|
|
85
|
+
// Decode the actual built transaction
|
|
86
|
+
const decodedTx = (0, txwrapper_polkadot_1.decode)(unsignedTx, {
|
|
87
|
+
metadataRpc: material.metadata,
|
|
88
|
+
registry: registry,
|
|
89
|
+
});
|
|
90
|
+
// Validate the decoded transaction structure
|
|
91
|
+
should_1.default.equal(decodedTx.method.name, 'withdrawUnbonded');
|
|
92
|
+
should_1.default.equal(decodedTx.method.pallet, 'staking');
|
|
93
|
+
const withdrawArgs = decodedTx.method.args;
|
|
94
|
+
should_1.default.equal(withdrawArgs.numSlashingSpans, testSlashingSpans);
|
|
95
|
+
// Now validate using the builder's validation method
|
|
96
|
+
should_1.default.doesNotThrow(() => {
|
|
97
|
+
builder.validateDecodedTransaction(decodedTx);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
it('should reject invalid transaction types', () => {
|
|
101
|
+
const mockDecodedTx = {
|
|
102
|
+
method: {
|
|
103
|
+
name: 'transfer',
|
|
104
|
+
pallet: 'balances',
|
|
105
|
+
args: {},
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
should_1.default.throws(() => {
|
|
109
|
+
builder.validateDecodedTransaction(mockDecodedTx);
|
|
110
|
+
}, /Invalid transaction type/);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('From Raw Transaction', function () {
|
|
114
|
+
it('should rebuild from real withdrawUnbonded transaction', async () => {
|
|
115
|
+
// First build a transaction to get a real raw transaction
|
|
116
|
+
const originalBuilder = factory.getWithdrawUnbondedBuilder();
|
|
117
|
+
originalBuilder
|
|
118
|
+
.slashingSpans(testSlashingSpans)
|
|
119
|
+
.sender({ address: senderAddress })
|
|
120
|
+
.validity({ firstValid: 3933, maxDuration: 64 })
|
|
121
|
+
.referenceBlock('0x149799bc9602cb5cf201f3425fb8d253b2d4e61fc119dcab3249f307f594754d')
|
|
122
|
+
.sequenceId({ name: 'Nonce', keyword: 'nonce', value: 100 });
|
|
123
|
+
// Set up material
|
|
124
|
+
const material = utils_1.default.getMaterial(statics_1.coins.get('tpolyx').network.type);
|
|
125
|
+
originalBuilder.material(material);
|
|
126
|
+
// Build the transaction and get the serialized hex
|
|
127
|
+
const tx = await originalBuilder.build();
|
|
128
|
+
const rawTxHex = tx.toBroadcastFormat();
|
|
129
|
+
// Create a new builder and reconstruct from the transaction hex
|
|
130
|
+
const newBuilder = factory.getWithdrawUnbondedBuilder();
|
|
131
|
+
newBuilder.material(material);
|
|
132
|
+
newBuilder.from(rawTxHex);
|
|
133
|
+
// Verify the reconstructed builder has the same parameters
|
|
134
|
+
should_1.default.equal(newBuilder.getSlashingSpans(), testSlashingSpans);
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aGRyYXdVbmJvbmRlZEJ1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb25CdWlsZGVyL3dpdGhkcmF3VW5ib25kZWRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQ0Esc0VBQXVEO0FBQ3ZELGlEQUE0QztBQUM1QyxvREFBNEI7QUFDNUIsa0RBQTBCO0FBQzFCLDBDQUFtRztBQUNuRyxtREFBdUQ7QUFDdkQsbUVBQTJDO0FBRTNDLCtDQUFrRDtBQUVsRCxTQUFTLHFCQUFxQixDQUFDLE1BQWM7SUFDM0MsT0FBTztRQUNMLEVBQUUsRUFBRSxLQUFLO1FBQ1QsSUFBSSxFQUFFLDBCQUFlLENBQUMsZUFBZTtRQUNyQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQy9CLE1BQU0sRUFBRSxFQUFFO1FBQ1YsT0FBTyxFQUFFLEVBQUU7UUFDWCxTQUFTLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztRQUM3QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUNiLEVBQUUsRUFBRSxLQUFLO1lBQ1QsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixNQUFNLEVBQUUsb0JBQVEsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUNqQyxjQUFjLEVBQUUsb0VBQW9FO1lBQ3BGLFdBQVcsRUFBRSxHQUFHO1lBQ2hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLEtBQUssRUFBRSxDQUFDO1lBQ1IsR0FBRyxFQUFFLENBQUM7WUFDTixXQUFXLEVBQUUsQ0FBQztZQUNkLGtCQUFrQixFQUFFLENBQUM7WUFDckIsU0FBUyxFQUFFLFVBQVU7WUFDckIsTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsRUFBRTtTQUNaLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRTtJQUN6QyxJQUFJLE9BQWdDLENBQUM7SUFDckMsTUFBTSxP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QzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFMUIsMkRBQTJEO1lBQzNELGdCQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGVjb2RlZFNpZ25pbmdQYXlsb2FkIH0gZnJvbSAnQHN1YnN0cmF0ZS90eHdyYXBwZXItY29yZSc7XG5pbXBvcnQgeyBkZWNvZGUgfSBmcm9tICdAc3Vic3RyYXRlL3R4d3JhcHBlci1wb2xrYWRvdCc7XG5pbXBvcnQgeyBjb2lucyB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHNob3VsZCBmcm9tICdzaG91bGQnO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnksIFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyLCBUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uLy4uL3NyYy9saWInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25UeXBlIH0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHV0aWxzIGZyb20gJy4uLy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuXG5pbXBvcnQgeyBhY2NvdW50cywgcmF3VHggfSBmcm9tICcuLi8uLi9yZXNvdXJjZXMnO1xuXG5mdW5jdGlvbiBjcmVhdGVNb2NrVHJhbnNhY3Rpb24odHhEYXRhOiBzdHJpbmcpOiBQYXJ0aWFsPFRyYW5zYWN0aW9uPiB7XG4gIHJldHVybiB7XG4gICAgaWQ6ICcxMjMnLFxuICAgIHR5cGU6IFRyYW5zYWN0aW9uVHlwZS5TdGFraW5nV2l0aGRyYXcsXG4gICAgdG9Ccm9hZGNhc3RGb3JtYXQ6ICgpID0+IHR4RGF0YSxcbiAgICBpbnB1dHM6IFtdLFxuICAgIG91dHB1dHM6IFtdLFxuICAgIHNpZ25hdHVyZTogWydtb2NrLXNpZ25hdHVyZSddLFxuICAgIHRvSnNvbjogKCkgPT4gKHtcbiAgICAgIGlkOiAnMTIzJyxcbiAgICAgIHR5cGU6ICdTdGFraW5nV2l0aGRyYXcnLFxuICAgICAgc2VuZGVyOiBhY2NvdW50cy5hY2NvdW50MS5hZGRyZXNzLFxuICAgICAgcmVmZXJlbmNlQmxvY2s6ICcweDE0OTc5OWJjOTYwMmNiNWNmMjAxZjM0MjVmYjhkMjUzYjJkNGU2MWZjMTE5ZGNhYjMyNDlmMzA3ZjU5NDc1NGQnLFxuICAgICAgYmxvY2tOdW1iZXI6IDEwMCxcbiAgICAgIGdlbmVzaXNIYXNoOiAnMHgnLFxuICAgICAgbm9uY2U6IDEsXG4gICAgICB0aXA6IDAsXG4gICAgICBzcGVjVmVyc2lvbjogMSxcbiAgICAgIHRyYW5zYWN0aW9uVmVyc2lvbjogMSxcbiAgICAgIGNoYWluTmFtZTogJ1BvbHltZXNoJyxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBvdXRwdXRzOiBbXSxcbiAgICB9KSxcbiAgfTtcbn1cblxuZGVzY3JpYmUoJ1BvbHl4IFdpdGhkcmF3VW5ib25kZWQgQnVpbGRlcicsIGZ1bmN0aW9uICgpIHtcbiAgbGV0IGJ1aWxkZXI6IFdpdGhkcmF3VW5ib25kZWRCdWlsZGVyO1xuICBjb25zdCBmYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQnVpbGRlckZhY3RvcnkoY29pbnMuZ2V0KCd0cG9seXgnKSk7XG5cbiAgY29uc3Qgc2VuZGVyQWRkcmVzcyA9IGFjY291bnRzLmFjY291bnQxLmFkZHJlc3M7XG4gIGNvbnN0IHRlc3RTbGFzaGluZ1NwYW5zID0gMDtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBidWlsZGVyID0gZmFjdG9yeS5nZXRXaXRoZHJhd1VuYm9uZGVkQnVpbGRlcigpO1xuICB9KTtcblxuICBkZXNjcmliZSgnc2V0dGVyIHZhbGlkYXRpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCB2YWxpZGF0ZSBzbGFzaGluZyBzcGFucycsICgpID0+IHtcbiAgICAgIGNvbnN0IHNweSA9IHNpbm9uLnNweShidWlsZGVyLCAndmFsaWRhdGVWYWx1ZScpO1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiBidWlsZGVyLnNsYXNoaW5nU3BhbnMoLTEpLCAvVmFsdWUgY2Fubm90IGJlIGxlc3MgdGhhbiB6ZXJvLyk7XG4gICAgICBzaG91bGQuZG9lc05vdFRocm93KCgpID0+IGJ1aWxkZXIuc2xhc2hpbmdTcGFucygwKSk7XG4gICAgICBzaW5vbi5hc3NlcnQuY2FsbGVkVHdpY2Uoc3B5KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0J1aWxkIGFuZCBTaWduJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgYnVpbGQgYSB3aXRoZHJhdyB1bmJvbmRlZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIGJ1aWxkZXJcbiAgICAgICAgLnNsYXNoaW5nU3BhbnModGVzdFNsYXNoaW5nU3BhbnMpXG4gICAgICAgIC5zZW5kZXIoeyBhZGRyZXNzOiBzZW5kZXJBZGRyZXNzIH0pXG4gICAgICAgIC52YWxpZGl0eSh7IGZpcnN0VmFsaWQ6IDM5MzMsIG1heER1cmF0aW9uOiA2NCB9KVxuICAgICAgICAucmVmZXJlbmNlQmxvY2soJzB4MTQ5Nzk5YmM5NjAyY2I1Y2YyMDFmMzQyNWZiOGQyNTNiMmQ0ZTYxZmMxMTlkY2FiMzI0OWYzMDdmNTk0NzU0ZCcpXG4gICAgICAgIC5zZXF1ZW5jZUlkKHsgbmFtZTogJ05vbmNlJywga2V5d29yZDogJ25vbmNlJywgdmFsdWU6IDEwMCB9KTtcblxuICAgICAgY29uc3QgbW9ja1R4ID0gY3JlYXRlTW9ja1RyYW5zYWN0aW9uKHJhd1R4LndpdGhkcmF3VW5ib25kZWQudW5zaWduZWQpO1xuICAgICAgc2lub24uc3R1YihidWlsZGVyLCAnYnVpbGQnKS5yZXNvbHZlcyhtb2NrVHggYXMgVHJhbnNhY3Rpb24pO1xuXG4gICAgICBjb25zdCB0eCA9IGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHNob3VsZC5leGlzdCh0eCk7XG5cbiAgICAgIHNob3VsZC5lcXVhbChidWlsZGVyLmdldFNsYXNoaW5nU3BhbnMoKSwgdGVzdFNsYXNoaW5nU3BhbnMpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnVHJhbnNhY3Rpb24gVmFsaWRhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgICBpdCgnc2hvdWxkIGJ1aWxkLCBkZWNvZGUsIGFuZCB2YWxpZGF0ZSBhIHJlYWwgd2l0aGRyYXdVbmJvbmRlZCB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIHRoZSB0cmFuc2FjdGlvbiB3aXRoIHJlYWwgcGFyYW1ldGVyc1xuICAgICAgYnVpbGRlclxuICAgICAgICAuc2xhc2hpbmdTcGFucyh0ZXN0U2xhc2hpbmdTcGFucylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMTAwIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgbWF0ZXJpYWwgZm9yIGRlY29kaW5nXG4gICAgICBjb25zdCBtYXRlcmlhbCA9IHV0aWxzLmdldE1hdGVyaWFsKGNvaW5zLmdldCgndHBvbHl4JykubmV0d29yay50eXBlKTtcbiAgICAgIGJ1aWxkZXIubWF0ZXJpYWwobWF0ZXJpYWwpO1xuXG4gICAgICAvLyBCdWlsZCB0aGUgYWN0dWFsIHVuc2lnbmVkIHRyYW5zYWN0aW9uXG4gICAgICBjb25zdCB1bnNpZ25lZFR4ID0gYnVpbGRlclsnYnVpbGRUcmFuc2FjdGlvbiddKCk7XG4gICAgICBjb25zdCByZWdpc3RyeSA9IGJ1aWxkZXJbJ19yZWdpc3RyeSddO1xuXG4gICAgICAvLyBEZWNvZGUgdGhlIGFjdHVhbCBidWlsdCB0cmFuc2FjdGlvblxuICAgICAgY29uc3QgZGVjb2RlZFR4ID0gZGVjb2RlKHVuc2lnbmVkVHgsIHtcbiAgICAgICAgbWV0YWRhdGFScGM6IG1hdGVyaWFsLm1ldGFkYXRhLFxuICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksXG4gICAgICB9KTtcblxuICAgICAgLy8gVmFsaWRhdGUgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gc3RydWN0dXJlXG4gICAgICBzaG91bGQuZXF1YWwoZGVjb2RlZFR4Lm1ldGhvZC5uYW1lLCAnd2l0aGRyYXdVbmJvbmRlZCcpO1xuICAgICAgc2hvdWxkLmVxdWFsKGRlY29kZWRUeC5tZXRob2QucGFsbGV0LCAnc3Rha2luZycpO1xuXG4gICAgICBjb25zdCB3aXRoZHJhd0FyZ3MgPSBkZWNvZGVkVHgubWV0aG9kLmFyZ3MgYXMgeyBudW1TbGFzaGluZ1NwYW5zOiBudW1iZXIgfTtcbiAgICAgIHNob3VsZC5lcXVhbCh3aXRoZHJhd0FyZ3MubnVtU2xhc2hpbmdTcGFucywgdGVzdFNsYXNoaW5nU3BhbnMpO1xuXG4gICAgICAvLyBOb3cgdmFsaWRhdGUgdXNpbmcgdGhlIGJ1aWxkZXIncyB2YWxpZGF0aW9uIG1ldGhvZFxuICAgICAgc2hvdWxkLmRvZXNOb3RUaHJvdygoKSA9PiB7XG4gICAgICAgIGJ1aWxkZXIudmFsaWRhdGVEZWNvZGVkVHJhbnNhY3Rpb24oZGVjb2RlZFR4KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCByZWplY3QgaW52YWxpZCB0cmFuc2FjdGlvbiB0eXBlcycsICgpID0+IHtcbiAgICAgIGNvbnN0IG1vY2tEZWNvZGVkVHg6IERlY29kZWRTaWduaW5nUGF5bG9hZCA9IHtcbiAgICAgICAgbWV0aG9kOiB7XG4gICAgICAgICAgbmFtZTogJ3RyYW5zZmVyJyxcbiAgICAgICAgICBwYWxsZXQ6ICdiYWxhbmNlcycsXG4gICAgICAgICAgYXJnczoge30sXG4gICAgICAgIH0sXG4gICAgICB9IGFzIHVua25vd24gYXMgRGVjb2RlZFNpZ25pbmdQYXlsb2FkO1xuXG4gICAgICBzaG91bGQudGhyb3dzKCgpID0+IHtcbiAgICAgICAgYnVpbGRlci52YWxpZGF0ZURlY29kZWRUcmFuc2FjdGlvbihtb2NrRGVjb2RlZFR4KTtcbiAgICAgIH0sIC9JbnZhbGlkIHRyYW5zYWN0aW9uIHR5cGUvKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Zyb20gUmF3IFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICAgIGl0KCdzaG91bGQgcmVidWlsZCBmcm9tIHJlYWwgd2l0aGRyYXdVbmJvbmRlZCB0cmFuc2FjdGlvbicsIGFzeW5jICgpID0+IHtcbiAgICAgIC8vIEZpcnN0IGJ1aWxkIGEgdHJhbnNhY3Rpb24gdG8gZ2V0IGEgcmVhbCByYXcgdHJhbnNhY3Rpb25cbiAgICAgIGNvbnN0IG9yaWdpbmFsQnVpbGRlciA9IGZhY3RvcnkuZ2V0V2l0aGRyYXdVbmJvbmRlZEJ1aWxkZXIoKTtcbiAgICAgIG9yaWdpbmFsQnVpbGRlclxuICAgICAgICAuc2xhc2hpbmdTcGFucyh0ZXN0U2xhc2hpbmdTcGFucylcbiAgICAgICAgLnNlbmRlcih7IGFkZHJlc3M6IHNlbmRlckFkZHJlc3MgfSlcbiAgICAgICAgLnZhbGlkaXR5KHsgZmlyc3RWYWxpZDogMzkzMywgbWF4RHVyYXRpb246IDY0IH0pXG4gICAgICAgIC5yZWZlcmVuY2VCbG9jaygnMHgxNDk3OTliYzk2MDJjYjVjZjIwMWYzNDI1ZmI4ZDI1M2IyZDRlNjFmYzExOWRjYWIzMjQ5ZjMwN2Y1OTQ3NTRkJylcbiAgICAgICAgLnNlcXVlbmNlSWQoeyBuYW1lOiAnTm9uY2UnLCBrZXl3b3JkOiAnbm9uY2UnLCB2YWx1ZTogMTAwIH0pO1xuXG4gICAgICAvLyBTZXQgdXAgbWF0ZXJpYWxcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gdXRpbHMuZ2V0TWF0ZXJpYWwoY29pbnMuZ2V0KCd0cG9seXgnKS5uZXR3b3JrLnR5cGUpO1xuICAgICAgb3JpZ2luYWxCdWlsZGVyLm1hdGVyaWFsKG1hdGVyaWFsKTtcblxuICAgICAgLy8gQnVpbGQgdGhlIHRyYW5zYWN0aW9uIGFuZCBnZXQgdGhlIHNlcmlhbGl6ZWQgaGV4XG4gICAgICBjb25zdCB0eCA9IGF3YWl0IG9yaWdpbmFsQnVpbGRlci5idWlsZCgpO1xuICAgICAgY29uc3QgcmF3VHhIZXggPSB0eC50b0Jyb2FkY2FzdEZvcm1hdCgpO1xuXG4gICAgICAvLyBDcmVhdGUgYSBuZXcgYnVpbGRlciBhbmQgcmVjb25zdHJ1Y3QgZnJvbSB0aGUgdHJhbnNhY3Rpb24gaGV4XG4gICAgICBjb25zdCBuZXdCdWlsZGVyID0gZmFjdG9yeS5nZXRXaXRoZHJhd1VuYm9uZGVkQnVpbGRlcigpO1xuICAgICAgbmV3QnVpbGRlci5tYXRlcmlhbChtYXRlcmlhbCk7XG4gICAgICBuZXdCdWlsZGVyLmZyb20ocmF3VHhIZXgpO1xuXG4gICAgICAvLyBWZXJpZnkgdGhlIHJlY29uc3RydWN0ZWQgYnVpbGRlciBoYXMgdGhlIHNhbWUgcGFyYW1ldGVyc1xuICAgICAgc2hvdWxkLmVxdWFsKG5ld0J1aWxkZXIuZ2V0U2xhc2hpbmdTcGFucygpLCB0ZXN0U2xhc2hpbmdTcGFucyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/unit/utils.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const should_1 = __importDefault(require("should"));
|
|
7
|
+
const src_1 = require("../../src");
|
|
8
|
+
const resources_1 = require("../resources");
|
|
9
|
+
const resources_2 = require("../../src/resources");
|
|
10
|
+
describe('Polyx Utils', () => {
|
|
11
|
+
// Create a proper Material object from testnetMaterial
|
|
12
|
+
const material = {
|
|
13
|
+
genesisHash: resources_2.testnetMaterial.genesisHash,
|
|
14
|
+
chainName: resources_2.testnetMaterial.chainName,
|
|
15
|
+
specName: resources_2.testnetMaterial.specName,
|
|
16
|
+
specVersion: resources_2.testnetMaterial.specVersion,
|
|
17
|
+
txVersion: resources_2.testnetMaterial.txVersion,
|
|
18
|
+
metadata: resources_2.testnetMaterial.metadata,
|
|
19
|
+
};
|
|
20
|
+
describe('decodeTransaction', () => {
|
|
21
|
+
it('should decode a signed transfer transaction and identify method name', () => {
|
|
22
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.transfer.signed, material);
|
|
23
|
+
should_1.default.exist(decoded);
|
|
24
|
+
decoded.should.have.property('method');
|
|
25
|
+
decoded.method.should.have.property('pallet');
|
|
26
|
+
decoded.method.should.have.property('name');
|
|
27
|
+
// Check that it's a balances transfer
|
|
28
|
+
decoded.method.pallet.should.equal('balances');
|
|
29
|
+
decoded.method.name.should.equal('transferWithMemo');
|
|
30
|
+
});
|
|
31
|
+
it('should decode an unsigned transfer transaction and identify method name', () => {
|
|
32
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.transfer.unsigned, material);
|
|
33
|
+
should_1.default.exist(decoded);
|
|
34
|
+
decoded.should.have.property('method');
|
|
35
|
+
decoded.method.should.have.property('pallet');
|
|
36
|
+
decoded.method.should.have.property('name');
|
|
37
|
+
// Check that it's a balances transfer
|
|
38
|
+
decoded.method.pallet.should.equal('balances');
|
|
39
|
+
decoded.method.name.should.equal('transferWithMemo');
|
|
40
|
+
});
|
|
41
|
+
it('should decode a CDD registration transaction and identify method name', () => {
|
|
42
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.cddTransaction.signed, material);
|
|
43
|
+
should_1.default.exist(decoded);
|
|
44
|
+
decoded.should.have.property('method');
|
|
45
|
+
decoded.method.should.have.property('pallet');
|
|
46
|
+
decoded.method.should.have.property('name');
|
|
47
|
+
// Check that it's a CDD transaction
|
|
48
|
+
decoded.method.pallet.should.equal('identity');
|
|
49
|
+
decoded.method.name.should.equal('cddRegisterDidWithCdd');
|
|
50
|
+
});
|
|
51
|
+
it('should decode a staking bond transaction and identify method name', () => {
|
|
52
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.bond.signed, material);
|
|
53
|
+
should_1.default.exist(decoded);
|
|
54
|
+
decoded.should.have.property('method');
|
|
55
|
+
decoded.method.should.have.property('pallet');
|
|
56
|
+
decoded.method.should.have.property('name');
|
|
57
|
+
// Check that it's a staking bond
|
|
58
|
+
decoded.method.pallet.should.equal('staking');
|
|
59
|
+
decoded.method.name.should.equal('bond');
|
|
60
|
+
});
|
|
61
|
+
it('should decode a staking unbond transaction and identify method name', () => {
|
|
62
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.unbond.signed, material);
|
|
63
|
+
should_1.default.exist(decoded);
|
|
64
|
+
decoded.should.have.property('method');
|
|
65
|
+
decoded.method.should.have.property('pallet');
|
|
66
|
+
decoded.method.should.have.property('name');
|
|
67
|
+
// Check that it's a staking unbond
|
|
68
|
+
decoded.method.pallet.should.equal('staking');
|
|
69
|
+
decoded.method.name.should.equal('unbond');
|
|
70
|
+
});
|
|
71
|
+
it('should decode a batch transaction and identify method name', () => {
|
|
72
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.stakingTx.batch.bondAndNominate.signed, material);
|
|
73
|
+
should_1.default.exist(decoded);
|
|
74
|
+
decoded.should.have.property('method');
|
|
75
|
+
decoded.method.should.have.property('pallet');
|
|
76
|
+
decoded.method.should.have.property('name');
|
|
77
|
+
// Check that it's a batch transaction
|
|
78
|
+
decoded.method.pallet.should.equal('utility');
|
|
79
|
+
decoded.method.name.should.equal('batchAll');
|
|
80
|
+
// Check the batch calls (handle potential null/undefined)
|
|
81
|
+
decoded.method.should.have.property('args');
|
|
82
|
+
decoded.method.args.should.have.property('calls');
|
|
83
|
+
if (Array.isArray(decoded.method.args.calls)) {
|
|
84
|
+
decoded.method.args.calls.should.be.an.Array();
|
|
85
|
+
decoded.method.args.calls.length.should.equal(2);
|
|
86
|
+
// First call should be bond
|
|
87
|
+
if (decoded.method.args.calls[0]) {
|
|
88
|
+
decoded.method.args.calls[0].should.have.property('callIndex');
|
|
89
|
+
}
|
|
90
|
+
// Second call should be nominate
|
|
91
|
+
if (decoded.method.args.calls[1]) {
|
|
92
|
+
decoded.method.args.calls[1].should.have.property('callIndex');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
it('should decode a preApprove asset transaction and identify method name', () => {
|
|
97
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.preApproveAsset.signed, material);
|
|
98
|
+
should_1.default.exist(decoded);
|
|
99
|
+
decoded.should.have.property('method');
|
|
100
|
+
decoded.method.should.have.property('pallet');
|
|
101
|
+
decoded.method.should.have.property('name');
|
|
102
|
+
// Check that it's an asset preApprove
|
|
103
|
+
decoded.method.pallet.should.equal('asset');
|
|
104
|
+
decoded.method.name.should.equal('preApproveAsset');
|
|
105
|
+
});
|
|
106
|
+
it('should decode a token transfer transaction and identify method name', () => {
|
|
107
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.tokenTransfer.signed, material);
|
|
108
|
+
should_1.default.exist(decoded);
|
|
109
|
+
decoded.should.have.property('method');
|
|
110
|
+
decoded.method.should.have.property('pallet');
|
|
111
|
+
decoded.method.should.have.property('name');
|
|
112
|
+
// Check that it's a settlement transaction
|
|
113
|
+
decoded.method.pallet.should.equal('settlement');
|
|
114
|
+
decoded.method.name.should.equal('addAndAffirmWithMediators');
|
|
115
|
+
});
|
|
116
|
+
it('should decode unstake transaction and identify method name', () => {
|
|
117
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.unstake.signed, material);
|
|
118
|
+
should_1.default.exist(decoded);
|
|
119
|
+
decoded.should.have.property('method');
|
|
120
|
+
decoded.method.should.have.property('pallet');
|
|
121
|
+
decoded.method.should.have.property('name');
|
|
122
|
+
// Check that it's a batch unstaking transaction
|
|
123
|
+
decoded.method.pallet.should.equal('utility');
|
|
124
|
+
decoded.method.name.should.equal('batchAll');
|
|
125
|
+
});
|
|
126
|
+
it('should decode withdraw unbonded transaction and identify method name', () => {
|
|
127
|
+
const decoded = src_1.utils.decodeTransaction(resources_1.rawTx.withdrawUnbonded.signed, material);
|
|
128
|
+
should_1.default.exist(decoded);
|
|
129
|
+
decoded.should.have.property('method');
|
|
130
|
+
decoded.method.should.have.property('pallet');
|
|
131
|
+
decoded.method.should.have.property('name');
|
|
132
|
+
// Check that it's a staking withdraw unbonded
|
|
133
|
+
decoded.method.pallet.should.equal('staking');
|
|
134
|
+
decoded.method.name.should.equal('withdrawUnbonded');
|
|
135
|
+
});
|
|
136
|
+
it('should throw error for invalid transaction hex', () => {
|
|
137
|
+
should_1.default.throws(() => {
|
|
138
|
+
src_1.utils.decodeTransaction('0xinvalid', material);
|
|
139
|
+
}, /Failed to decode transaction/);
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsbUNBQWtDO0FBQ2xDLDRDQUFnRDtBQUNoRCxtREFBc0Q7QUFLdEQsUUFBUSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7SUFDM0IsdURBQXVEO0lBQ3ZELE1BQU0sUUFBUSxHQUFhO1FBQ3pCLFdBQVcsRUFBRSwyQkFBZSxDQUFDLFdBQVc7UUFDeEMsU0FBUyxFQUFFLDJCQUFlLENBQUMsU0FBUztRQUNwQyxRQUFRLEVBQUUsMkJBQWUsQ0FBQyxRQUFRO1FBQ2xDLFdBQVcsRUFBRSwyQkFBZSxDQUFDLFdBQVc7UUFDeEMsU0FBUyxFQUFFLDJCQUFlLENBQUMsU0FBUztRQUNwQyxRQUFRLEVBQUUsMkJBQWUsQ0FBQyxRQUF5QjtLQUNwRCxDQUFDO0lBRUYsUUFBUSxDQUFDLG1CQUFtQixFQUFFLEdBQUcsRUFBRTtRQUNqQyxFQUFFLENBQUMsc0VBQXNFLEVBQUUsR0FBRyxFQUFFO1lBQzlFLE1BQU0sT0FBTyxHQUFHLFdBQUssQ0FBQyxpQkFBaUIsQ0FBQyxpQkFBSyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFekUsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1QyxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMs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QUcsRUFBRTtZQUM5RSxNQUFNLE9BQU8sR0FBRyxXQUFLLENBQUMsaUJBQWlCLENBQUMsaUJBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFFakYsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdEIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUU1Qyw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM5QyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDdkQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsZ0RBQWdELEVBQUUsR0FBRyxFQUFFO1lBQ3hELGdCQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsV0FBSyxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNqRCxDQUFDLEVBQUUsOEJBQThCLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJy4uLy4uL3NyYyc7XG5pbXBvcnQgeyByYXdUeCwgc3Rha2luZ1R4IH0gZnJvbSAnLi4vcmVzb3VyY2VzJztcbmltcG9ydCB7IHRlc3RuZXRNYXRlcmlhbCB9IGZyb20gJy4uLy4uL3NyYy9yZXNvdXJjZXMnO1xuaW1wb3J0IHsgSW50ZXJmYWNlIH0gZnJvbSAnQGJpdGdvLWJldGEvYWJzdHJhY3Qtc3Vic3RyYXRlJztcblxudHlwZSBNYXRlcmlhbCA9IEludGVyZmFjZS5NYXRlcmlhbDtcblxuZGVzY3JpYmUoJ1BvbHl4IFV0aWxzJywgKCkgPT4ge1xuICAvLyBDcmVhdGUgYSBwcm9wZXIgTWF0ZXJpYWwgb2JqZWN0IGZyb20gdGVzdG5ldE1hdGVyaWFsXG4gIGNvbnN0IG1hdGVyaWFsOiBNYXRlcmlhbCA9IHtcbiAgICBnZW5lc2lzSGFzaDogdGVzdG5ldE1hdGVyaWFsLmdlbmVzaXNIYXNoLFxuICAgIGNoYWluTmFtZTogdGVzdG5ldE1hdGVyaWFsLmNoYWluTmFtZSxcbiAgICBzcGVjTmFtZTogdGVzdG5ldE1hdGVyaWFsLnNwZWNOYW1lLFxuICAgIHNwZWNWZXJzaW9uOiB0ZXN0bmV0TWF0ZXJpYWwuc3BlY1ZlcnNpb24sXG4gICAgdHhWZXJzaW9uOiB0ZXN0bmV0TWF0ZXJpYWwudHhWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiB0ZXN0bmV0TWF0ZXJpYWwubWV0YWRhdGEgYXMgYDB4JHtzdHJpbmd9YCxcbiAgfTtcblxuICBkZXNjcmliZSgnZGVjb2RlVHJhbnNhY3Rpb24nLCAoKSA9PiB7XG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBzaWduZWQgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHJhd1R4LnRyYW5zZmVyLnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIGJhbGFuY2VzIHRyYW5zZmVyXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdiYWxhbmNlcycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3RyYW5zZmVyV2l0aE1lbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGFuIHVuc2lnbmVkIHRyYW5zZmVyIHRyYW5zYWN0aW9uIGFuZCBpZGVudGlmeSBtZXRob2QgbmFtZScsICgpID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSB1dGlscy5kZWNvZGVUcmFuc2FjdGlvbihyYXdUeC50cmFuc2Zlci51bnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIGJhbGFuY2VzIHRyYW5zZmVyXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdiYWxhbmNlcycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3RyYW5zZmVyV2l0aE1lbW8nKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgQ0REIHJlZ2lzdHJhdGlvbiB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHguY2RkVHJhbnNhY3Rpb24uc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgQ0REIHRyYW5zYWN0aW9uXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdpZGVudGl0eScpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ2NkZFJlZ2lzdGVyRGlkV2l0aENkZCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSBzdGFraW5nIGJvbmQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC5ib25kLnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhIHN0YWtpbmcgYm9uZFxuICAgICAgZGVjb2RlZC5tZXRob2QucGFsbGV0LnNob3VsZC5lcXVhbCgnc3Rha2luZycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ2JvbmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgc3Rha2luZyB1bmJvbmQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC51bmJvbmQuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3Rha2luZyB1bmJvbmRcbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3N0YWtpbmcnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCd1bmJvbmQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgYmF0Y2ggdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHN0YWtpbmdUeC5iYXRjaC5ib25kQW5kTm9taW5hdGUuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgYmF0Y2ggdHJhbnNhY3Rpb25cbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3V0aWxpdHknKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCdiYXRjaEFsbCcpO1xuXG4gICAgICAvLyBDaGVjayB0aGUgYmF0Y2ggY2FsbHMgKGhhbmRsZSBwb3RlbnRpYWwgbnVsbC91bmRlZmluZWQpXG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnYXJncycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbHMnKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMpKSB7XG4gICAgICAgIGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMuc2hvdWxkLmJlLmFuLkFycmF5KCk7XG4gICAgICAgIGRlY29kZWQubWV0aG9kLmFyZ3MuY2FsbHMubGVuZ3RoLnNob3VsZC5lcXVhbCgyKTtcblxuICAgICAgICAvLyBGaXJzdCBjYWxsIHNob3VsZCBiZSBib25kXG4gICAgICAgIGlmIChkZWNvZGVkLm1ldGhvZC5hcmdzLmNhbGxzWzBdKSB7XG4gICAgICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5jYWxsc1swXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2Vjb25kIGNhbGwgc2hvdWxkIGJlIG5vbWluYXRlXG4gICAgICAgIGlmIChkZWNvZGVkLm1ldGhvZC5hcmdzLmNhbGxzWzFdKSB7XG4gICAgICAgICAgZGVjb2RlZC5tZXRob2QuYXJncy5jYWxsc1sxXS5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnY2FsbEluZGV4Jyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgZGVjb2RlIGEgcHJlQXBwcm92ZSBhc3NldCB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgucHJlQXBwcm92ZUFzc2V0LnNpZ25lZCwgbWF0ZXJpYWwpO1xuXG4gICAgICBzaG91bGQuZXhpc3QoZGVjb2RlZCk7XG4gICAgICBkZWNvZGVkLnNob3VsZC5oYXZlLnByb3BlcnR5KCdtZXRob2QnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCdwYWxsZXQnKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLnNob3VsZC5oYXZlLnByb3BlcnR5KCduYW1lJyk7XG5cbiAgICAgIC8vIENoZWNrIHRoYXQgaXQncyBhbiBhc3NldCBwcmVBcHByb3ZlXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdhc3NldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3ByZUFwcHJvdmVBc3NldCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgYSB0b2tlbiB0cmFuc2ZlciB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgudG9rZW5UcmFuc2Zlci5zaWduZWQsIG1hdGVyaWFsKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWV0aG9kJyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncGFsbGV0Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbmFtZScpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IGl0J3MgYSBzZXR0bGVtZW50IHRyYW5zYWN0aW9uXG4gICAgICBkZWNvZGVkLm1ldGhvZC5wYWxsZXQuc2hvdWxkLmVxdWFsKCdzZXR0bGVtZW50Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5uYW1lLnNob3VsZC5lcXVhbCgnYWRkQW5kQWZmaXJtV2l0aE1lZGlhdG9ycycpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgdW5zdGFrZSB0cmFuc2FjdGlvbiBhbmQgaWRlbnRpZnkgbWV0aG9kIG5hbWUnLCAoKSA9PiB7XG4gICAgICBjb25zdCBkZWNvZGVkID0gdXRpbHMuZGVjb2RlVHJhbnNhY3Rpb24ocmF3VHgudW5zdGFrZS5zaWduZWQsIG1hdGVyaWFsKTtcblxuICAgICAgc2hvdWxkLmV4aXN0KGRlY29kZWQpO1xuICAgICAgZGVjb2RlZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbWV0aG9kJyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgncGFsbGV0Jyk7XG4gICAgICBkZWNvZGVkLm1ldGhvZC5zaG91bGQuaGF2ZS5wcm9wZXJ0eSgnbmFtZScpO1xuXG4gICAgICAvLyBDaGVjayB0aGF0IGl0J3MgYSBiYXRjaCB1bnN0YWtpbmcgdHJhbnNhY3Rpb25cbiAgICAgIGRlY29kZWQubWV0aG9kLnBhbGxldC5zaG91bGQuZXF1YWwoJ3V0aWxpdHknKTtcbiAgICAgIGRlY29kZWQubWV0aG9kLm5hbWUuc2hvdWxkLmVxdWFsKCdiYXRjaEFsbCcpO1xuICAgIH0pO1xuXG4gICAgaXQoJ3Nob3VsZCBkZWNvZGUgd2l0aGRyYXcgdW5ib25kZWQgdHJhbnNhY3Rpb24gYW5kIGlkZW50aWZ5IG1ldGhvZCBuYW1lJywgKCkgPT4ge1xuICAgICAgY29uc3QgZGVjb2RlZCA9IHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKHJhd1R4LndpdGhkcmF3VW5ib25kZWQuc2lnbmVkLCBtYXRlcmlhbCk7XG5cbiAgICAgIHNob3VsZC5leGlzdChkZWNvZGVkKTtcbiAgICAgIGRlY29kZWQuc2hvdWxkLmhhdmUucHJvcGVydHkoJ21ldGhvZCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ3BhbGxldCcpO1xuICAgICAgZGVjb2RlZC5tZXRob2Quc2hvdWxkLmhhdmUucHJvcGVydHkoJ25hbWUnKTtcblxuICAgICAgLy8gQ2hlY2sgdGhhdCBpdCdzIGEgc3Rha2luZyB3aXRoZHJhdyB1bmJvbmRlZFxuICAgICAgZGVjb2RlZC5tZXRob2QucGFsbGV0LnNob3VsZC5lcXVhbCgnc3Rha2luZycpO1xuICAgICAgZGVjb2RlZC5tZXRob2QubmFtZS5zaG91bGQuZXF1YWwoJ3dpdGhkcmF3VW5ib25kZWQnKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgZXJyb3IgZm9yIGludmFsaWQgdHJhbnNhY3Rpb24gaGV4JywgKCkgPT4ge1xuICAgICAgc2hvdWxkLnRocm93cygoKSA9PiB7XG4gICAgICAgIHV0aWxzLmRlY29kZVRyYW5zYWN0aW9uKCcweGludmFsaWQnLCBtYXRlcmlhbCk7XG4gICAgICB9LCAvRmFpbGVkIHRvIGRlY29kZSB0cmFuc2FjdGlvbi8pO1xuICAgIH0pO1xuICB9KTtcbn0pO1xuIl19
|