dedot 0.0.1-alpha.22
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/LICENSE +201 -0
- package/README.md +245 -0
- package/cjs/client/Dedot.js +444 -0
- package/cjs/client/index.js +17 -0
- package/cjs/executor/ConstantExecutor.js +22 -0
- package/cjs/executor/ErrorExecutor.js +47 -0
- package/cjs/executor/EventExecutor.js +53 -0
- package/cjs/executor/Executor.js +39 -0
- package/cjs/executor/RpcExecutor.js +109 -0
- package/cjs/executor/RuntimeApiExecutor.js +93 -0
- package/cjs/executor/StorageQueryExecutor.js +33 -0
- package/cjs/executor/TxExecutor.js +153 -0
- package/cjs/executor/index.js +24 -0
- package/cjs/extrinsic/SubmittableResult.js +33 -0
- package/cjs/extrinsic/extensions/ExtraSignedExtension.js +65 -0
- package/cjs/extrinsic/extensions/SignedExtension.js +41 -0
- package/cjs/extrinsic/extensions/index.js +19 -0
- package/cjs/extrinsic/extensions/known/ChargeAssetTxPayment.js +44 -0
- package/cjs/extrinsic/extensions/known/ChargeTransactionPayment.js +16 -0
- package/cjs/extrinsic/extensions/known/CheckGenesis.js +19 -0
- package/cjs/extrinsic/extensions/known/CheckMortality.js +71 -0
- package/cjs/extrinsic/extensions/known/CheckNonZeroSender.js +10 -0
- package/cjs/extrinsic/extensions/known/CheckNonce.js +34 -0
- package/cjs/extrinsic/extensions/known/CheckSpecVersion.js +19 -0
- package/cjs/extrinsic/extensions/known/CheckTxVersion.js +19 -0
- package/cjs/extrinsic/extensions/known/CheckWeight.js +10 -0
- package/cjs/extrinsic/extensions/known/PrevalidateAttests.js +11 -0
- package/cjs/extrinsic/extensions/known/index.js +25 -0
- package/cjs/extrinsic/index.js +18 -0
- package/cjs/index.js +25 -0
- package/cjs/package.json +1 -0
- package/cjs/packageInfo.js +5 -0
- package/cjs/proxychain.js +20 -0
- package/cjs/storage/QueryableStorage.js +99 -0
- package/cjs/types.js +2 -0
- package/client/Dedot.d.ts +181 -0
- package/client/Dedot.js +440 -0
- package/client/index.d.ts +1 -0
- package/client/index.js +1 -0
- package/executor/ConstantExecutor.d.ts +11 -0
- package/executor/ConstantExecutor.js +18 -0
- package/executor/ErrorExecutor.d.ts +11 -0
- package/executor/ErrorExecutor.js +43 -0
- package/executor/EventExecutor.d.ts +11 -0
- package/executor/EventExecutor.js +49 -0
- package/executor/Executor.d.ts +150 -0
- package/executor/Executor.js +35 -0
- package/executor/RpcExecutor.d.ts +14 -0
- package/executor/RpcExecutor.js +105 -0
- package/executor/RuntimeApiExecutor.d.ts +9 -0
- package/executor/RuntimeApiExecutor.js +89 -0
- package/executor/StorageQueryExecutor.d.ts +10 -0
- package/executor/StorageQueryExecutor.js +29 -0
- package/executor/TxExecutor.d.ts +47 -0
- package/executor/TxExecutor.js +147 -0
- package/executor/index.d.ts +8 -0
- package/executor/index.js +8 -0
- package/extrinsic/SubmittableResult.d.ts +19 -0
- package/extrinsic/SubmittableResult.js +29 -0
- package/extrinsic/extensions/ExtraSignedExtension.d.ts +14 -0
- package/extrinsic/extensions/ExtraSignedExtension.js +61 -0
- package/extrinsic/extensions/SignedExtension.d.ts +40 -0
- package/extrinsic/extensions/SignedExtension.js +37 -0
- package/extrinsic/extensions/index.d.ts +3 -0
- package/extrinsic/extensions/index.js +3 -0
- package/extrinsic/extensions/known/ChargeAssetTxPayment.d.ts +14 -0
- package/extrinsic/extensions/known/ChargeAssetTxPayment.js +40 -0
- package/extrinsic/extensions/known/ChargeTransactionPayment.d.ts +6 -0
- package/extrinsic/extensions/known/ChargeTransactionPayment.js +12 -0
- package/extrinsic/extensions/known/CheckGenesis.d.ts +10 -0
- package/extrinsic/extensions/known/CheckGenesis.js +15 -0
- package/extrinsic/extensions/known/CheckMortality.d.ts +15 -0
- package/extrinsic/extensions/known/CheckMortality.js +67 -0
- package/extrinsic/extensions/known/CheckNonZeroSender.d.ts +6 -0
- package/extrinsic/extensions/known/CheckNonZeroSender.js +6 -0
- package/extrinsic/extensions/known/CheckNonce.d.ts +10 -0
- package/extrinsic/extensions/known/CheckNonce.js +30 -0
- package/extrinsic/extensions/known/CheckSpecVersion.d.ts +9 -0
- package/extrinsic/extensions/known/CheckSpecVersion.js +15 -0
- package/extrinsic/extensions/known/CheckTxVersion.d.ts +9 -0
- package/extrinsic/extensions/known/CheckTxVersion.js +15 -0
- package/extrinsic/extensions/known/CheckWeight.d.ts +6 -0
- package/extrinsic/extensions/known/CheckWeight.js +6 -0
- package/extrinsic/extensions/known/PrevalidateAttests.d.ts +7 -0
- package/extrinsic/extensions/known/PrevalidateAttests.js +7 -0
- package/extrinsic/extensions/known/index.d.ts +3 -0
- package/extrinsic/extensions/known/index.js +22 -0
- package/extrinsic/index.d.ts +2 -0
- package/extrinsic/index.js +2 -0
- package/index.d.ts +6 -0
- package/index.js +5 -0
- package/package.json +54 -0
- package/packageInfo.d.ts +4 -0
- package/packageInfo.js +3 -0
- package/proxychain.d.ts +7 -0
- package/proxychain.js +16 -0
- package/storage/QueryableStorage.d.ts +16 -0
- package/storage/QueryableStorage.js +95 -0
- package/types.d.ts +44 -0
- package/types.js +1 -0
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckMortality = exports.MORTAL_PERIOD = exports.FALLBACK_PERIOD = exports.FALLBACK_MAX_HASH_COUNT = exports.MAX_FINALITY_LAG = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
const utils_1 = require("@dedot/utils");
|
|
6
|
+
const util_1 = require("@polkadot/util");
|
|
7
|
+
exports.MAX_FINALITY_LAG = 5;
|
|
8
|
+
exports.FALLBACK_MAX_HASH_COUNT = 250;
|
|
9
|
+
exports.FALLBACK_PERIOD = 6 * 1000;
|
|
10
|
+
exports.MORTAL_PERIOD = 5 * 60 * 1000;
|
|
11
|
+
/**
|
|
12
|
+
* @description Check for transaction mortality.
|
|
13
|
+
*/
|
|
14
|
+
class CheckMortality extends SignedExtension_1.SignedExtension {
|
|
15
|
+
#signingHeader;
|
|
16
|
+
async init() {
|
|
17
|
+
this.#signingHeader = await this.#determineSigningHeader();
|
|
18
|
+
this.data = { period: this.#calculateMortalLength(), current: BigInt(this.#signingHeader.number) };
|
|
19
|
+
this.additionalSigned = (await this.api.rpc.chain.getBlockHash(this.#signingHeader.number));
|
|
20
|
+
}
|
|
21
|
+
// Ref: https://github.com/polkadot-js/api/blob/3bdf49b0428a62f16b3222b9a31bfefa43c1ca55/packages/api-derive/src/tx/signingInfo.ts#L34-L64
|
|
22
|
+
async #determineSigningHeader() {
|
|
23
|
+
const [header, finalizedHash] = await Promise.all([
|
|
24
|
+
this.api.rpc.chain.getHeader(),
|
|
25
|
+
this.api.rpc.chain.getFinalizedHead(),
|
|
26
|
+
]);
|
|
27
|
+
(0, utils_1.assert)(header, 'Current header not found');
|
|
28
|
+
const [currentHeader, finalizedHeader] = await Promise.all([
|
|
29
|
+
Promise.resolve(header).then((header) => {
|
|
30
|
+
const { parentHash } = header;
|
|
31
|
+
if (parentHash.length === 0 || (0, utils_1.isZeroHash)(parentHash)) {
|
|
32
|
+
return header;
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
return this.api.rpc.chain.getHeader(parentHash);
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
this.api.rpc.chain.getHeader(finalizedHash),
|
|
39
|
+
]);
|
|
40
|
+
(0, utils_1.assert)(currentHeader, 'Cannot determine current header');
|
|
41
|
+
if (!finalizedHeader || currentHeader.number - finalizedHeader.number > exports.MAX_FINALITY_LAG) {
|
|
42
|
+
return currentHeader;
|
|
43
|
+
}
|
|
44
|
+
return finalizedHeader;
|
|
45
|
+
}
|
|
46
|
+
// Ref: https://github.com/polkadot-js/api/blob/3bdf49b0428a62f16b3222b9a31bfefa43c1ca55/packages/api-derive/src/tx/signingInfo.ts#L83-L93
|
|
47
|
+
#calculateMortalLength() {
|
|
48
|
+
return (0, utils_1.min)(BigInt(this.#getConst('system', 'blockHashCount') || exports.FALLBACK_MAX_HASH_COUNT), BigInt(exports.MORTAL_PERIOD) /
|
|
49
|
+
BigInt(this.#getConst('babe', 'expectedBlockTime') ||
|
|
50
|
+
BigInt(this.#getConst('timestamp', 'minimumPeriod') || 0) * 2n ||
|
|
51
|
+
exports.FALLBACK_PERIOD) +
|
|
52
|
+
BigInt(exports.MAX_FINALITY_LAG));
|
|
53
|
+
}
|
|
54
|
+
#getConst(pallet, name) {
|
|
55
|
+
try {
|
|
56
|
+
return this.api.consts[pallet][name];
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// ignore this on purpose
|
|
60
|
+
}
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
toPayload() {
|
|
64
|
+
return {
|
|
65
|
+
era: (0, util_1.u8aToHex)(this.dataCodec.tryEncode(this.data)),
|
|
66
|
+
blockHash: this.additionalSigned,
|
|
67
|
+
blockNumber: (0, util_1.numberToHex)(this.#signingHeader.number),
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.CheckMortality = CheckMortality;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckNonZeroSender = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
/**
|
|
6
|
+
* @description Check to ensure that the sender is not the zero address
|
|
7
|
+
*/
|
|
8
|
+
class CheckNonZeroSender extends SignedExtension_1.SignedExtension {
|
|
9
|
+
}
|
|
10
|
+
exports.CheckNonZeroSender = CheckNonZeroSender;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckNonce = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
const util_1 = require("@polkadot/util");
|
|
6
|
+
const utils_1 = require("@dedot/utils");
|
|
7
|
+
/**
|
|
8
|
+
* @description Nonce check and increment to give replay protection for transactions.
|
|
9
|
+
*/
|
|
10
|
+
class CheckNonce extends SignedExtension_1.SignedExtension {
|
|
11
|
+
async init() {
|
|
12
|
+
this.data = this.payloadOptions.nonce || (await this.#getNonce());
|
|
13
|
+
}
|
|
14
|
+
async #getNonce() {
|
|
15
|
+
const { signerAddress } = this.options || {};
|
|
16
|
+
(0, utils_1.assert)(signerAddress, 'Signer address not found');
|
|
17
|
+
try {
|
|
18
|
+
return (await this.api.query.system.account(signerAddress)).nonce;
|
|
19
|
+
}
|
|
20
|
+
catch { }
|
|
21
|
+
try {
|
|
22
|
+
return await this.api.call.accountNonceApi.accountNonce(signerAddress);
|
|
23
|
+
}
|
|
24
|
+
catch { }
|
|
25
|
+
// TODO fallback to api.rpc.system.accountNextIndex if needed
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
toPayload() {
|
|
29
|
+
return {
|
|
30
|
+
nonce: (0, util_1.numberToHex)(this.data),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.CheckNonce = CheckNonce;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckSpecVersion = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
const util_1 = require("@polkadot/util");
|
|
6
|
+
/**
|
|
7
|
+
* @description Ensure the runtime version registered in the transaction is the same as at present.
|
|
8
|
+
*/
|
|
9
|
+
class CheckSpecVersion extends SignedExtension_1.SignedExtension {
|
|
10
|
+
async init() {
|
|
11
|
+
this.additionalSigned = this.api.runtimeVersion.specVersion;
|
|
12
|
+
}
|
|
13
|
+
toPayload() {
|
|
14
|
+
return {
|
|
15
|
+
specVersion: (0, util_1.numberToHex)(this.additionalSigned),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.CheckSpecVersion = CheckSpecVersion;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckTxVersion = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
const util_1 = require("@polkadot/util");
|
|
6
|
+
/**
|
|
7
|
+
* @description Ensure the transaction version registered in the transaction is the same as at present.
|
|
8
|
+
*/
|
|
9
|
+
class CheckTxVersion extends SignedExtension_1.SignedExtension {
|
|
10
|
+
async init() {
|
|
11
|
+
this.additionalSigned = this.api.runtimeVersion.transactionVersion;
|
|
12
|
+
}
|
|
13
|
+
toPayload() {
|
|
14
|
+
return {
|
|
15
|
+
transactionVersion: (0, util_1.numberToHex)(this.additionalSigned),
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.CheckTxVersion = CheckTxVersion;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CheckWeight = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
/**
|
|
6
|
+
* @description Block resource (weight) limit check.
|
|
7
|
+
*/
|
|
8
|
+
class CheckWeight extends SignedExtension_1.SignedExtension {
|
|
9
|
+
}
|
|
10
|
+
exports.CheckWeight = CheckWeight;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrevalidateAttests = void 0;
|
|
4
|
+
const SignedExtension_1 = require("../SignedExtension");
|
|
5
|
+
/**
|
|
6
|
+
* @description Validate `attest` calls prior to execution.
|
|
7
|
+
* Needed to avoid a DoS attack since they are otherwise free to place on chain.
|
|
8
|
+
*/
|
|
9
|
+
class PrevalidateAttests extends SignedExtension_1.SignedExtension {
|
|
10
|
+
}
|
|
11
|
+
exports.PrevalidateAttests = PrevalidateAttests;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.knownSignedExtensions = void 0;
|
|
4
|
+
const CheckNonZeroSender_1 = require("./CheckNonZeroSender");
|
|
5
|
+
const CheckSpecVersion_1 = require("./CheckSpecVersion");
|
|
6
|
+
const CheckTxVersion_1 = require("./CheckTxVersion");
|
|
7
|
+
const CheckGenesis_1 = require("./CheckGenesis");
|
|
8
|
+
const CheckMortality_1 = require("./CheckMortality");
|
|
9
|
+
const CheckNonce_1 = require("./CheckNonce");
|
|
10
|
+
const CheckWeight_1 = require("./CheckWeight");
|
|
11
|
+
const ChargeTransactionPayment_1 = require("./ChargeTransactionPayment");
|
|
12
|
+
const PrevalidateAttests_1 = require("./PrevalidateAttests");
|
|
13
|
+
const ChargeAssetTxPayment_1 = require("./ChargeAssetTxPayment");
|
|
14
|
+
exports.knownSignedExtensions = {
|
|
15
|
+
CheckNonZeroSender: CheckNonZeroSender_1.CheckNonZeroSender,
|
|
16
|
+
CheckSpecVersion: CheckSpecVersion_1.CheckSpecVersion,
|
|
17
|
+
CheckTxVersion: CheckTxVersion_1.CheckTxVersion,
|
|
18
|
+
CheckGenesis: CheckGenesis_1.CheckGenesis,
|
|
19
|
+
CheckMortality: CheckMortality_1.CheckMortality,
|
|
20
|
+
CheckNonce: CheckNonce_1.CheckNonce,
|
|
21
|
+
CheckWeight: CheckWeight_1.CheckWeight,
|
|
22
|
+
ChargeTransactionPayment: ChargeTransactionPayment_1.ChargeTransactionPayment,
|
|
23
|
+
PrevalidateAttests: PrevalidateAttests_1.PrevalidateAttests,
|
|
24
|
+
ChargeAssetTxPayment: ChargeAssetTxPayment_1.ChargeAssetTxPayment,
|
|
25
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./extensions"), exports);
|
|
18
|
+
__exportStar(require("./SubmittableResult"), exports);
|
package/cjs/index.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.WsProvider = exports.ScProvider = exports.HttpProvider = exports.Dedot = void 0;
|
|
18
|
+
const client_1 = require("./client");
|
|
19
|
+
Object.defineProperty(exports, "Dedot", { enumerable: true, get: function () { return client_1.Dedot; } });
|
|
20
|
+
__exportStar(require("./executor"), exports);
|
|
21
|
+
__exportStar(require("./extrinsic"), exports);
|
|
22
|
+
var rpc_provider_1 = require("@polkadot/rpc-provider");
|
|
23
|
+
Object.defineProperty(exports, "HttpProvider", { enumerable: true, get: function () { return rpc_provider_1.HttpProvider; } });
|
|
24
|
+
Object.defineProperty(exports, "ScProvider", { enumerable: true, get: function () { return rpc_provider_1.ScProvider; } });
|
|
25
|
+
Object.defineProperty(exports, "WsProvider", { enumerable: true, get: function () { return rpc_provider_1.WsProvider; } });
|
package/cjs/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.newProxyChain = void 0;
|
|
4
|
+
const newProxyChain = (carrier, currentLevel = 1, maxLevel = 3) => {
|
|
5
|
+
const { executor, chain = [] } = carrier;
|
|
6
|
+
if (currentLevel === maxLevel) {
|
|
7
|
+
return executor.execute(...chain);
|
|
8
|
+
}
|
|
9
|
+
return new Proxy(carrier, {
|
|
10
|
+
get(target, property, receiver) {
|
|
11
|
+
if (!target.chain) {
|
|
12
|
+
target.chain = [];
|
|
13
|
+
}
|
|
14
|
+
const { chain } = target;
|
|
15
|
+
chain.push(property.toString());
|
|
16
|
+
return (0, exports.newProxyChain)(target, currentLevel + 1);
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
};
|
|
20
|
+
exports.newProxyChain = newProxyChain;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.QueryableStorage = void 0;
|
|
4
|
+
const utils_1 = require("@dedot/utils");
|
|
5
|
+
const codecs_1 = require("@dedot/codecs");
|
|
6
|
+
const util_1 = require("@polkadot/util");
|
|
7
|
+
const util_crypto_1 = require("@polkadot/util-crypto");
|
|
8
|
+
/**
|
|
9
|
+
* @name QueryableStorage
|
|
10
|
+
* @description A helper to encode key & decode value for a storage entry
|
|
11
|
+
*/
|
|
12
|
+
class QueryableStorage {
|
|
13
|
+
registry;
|
|
14
|
+
palletName;
|
|
15
|
+
storageItem;
|
|
16
|
+
pallet;
|
|
17
|
+
storageEntry;
|
|
18
|
+
constructor(registry, palletName, storageItem) {
|
|
19
|
+
this.registry = registry;
|
|
20
|
+
this.palletName = palletName;
|
|
21
|
+
this.storageItem = storageItem;
|
|
22
|
+
this.pallet = this.#getPallet();
|
|
23
|
+
this.storageEntry = this.#getStorageEntry();
|
|
24
|
+
}
|
|
25
|
+
encodeKey(keyInput) {
|
|
26
|
+
const palletNameHash = (0, util_crypto_1.xxhashAsU8a)(this.pallet.name, 128);
|
|
27
|
+
const storageItemHash = (0, util_crypto_1.xxhashAsU8a)(this.storageEntry.name, 128);
|
|
28
|
+
const prefixHash = (0, util_1.u8aConcat)(palletNameHash, storageItemHash);
|
|
29
|
+
const { type } = this.storageEntry;
|
|
30
|
+
if (type.tag === 'Plain') {
|
|
31
|
+
return (0, util_1.u8aToHex)(prefixHash);
|
|
32
|
+
}
|
|
33
|
+
else if (type.tag === 'Map') {
|
|
34
|
+
const { hashers, keyTypeId } = type.value;
|
|
35
|
+
const extractedInputs = this.#extractRequiredKeyInputs(keyInput, hashers.length);
|
|
36
|
+
let keyTypeIds = [keyTypeId];
|
|
37
|
+
if (hashers.length > 1) {
|
|
38
|
+
const { type } = this.registry.findPortableType(keyTypeId);
|
|
39
|
+
(0, utils_1.assert)(type.tag === 'Tuple', 'Key type should be a tuple!');
|
|
40
|
+
keyTypeIds = type.value.fields;
|
|
41
|
+
}
|
|
42
|
+
const keyParts = keyTypeIds.map((keyId, index) => {
|
|
43
|
+
const input = extractedInputs[index];
|
|
44
|
+
const hasher = utils_1.HASHERS[hashers[index]];
|
|
45
|
+
const $keyCodec = this.registry.findPortableCodec(keyId);
|
|
46
|
+
return hasher($keyCodec.tryEncode(input));
|
|
47
|
+
});
|
|
48
|
+
return (0, util_1.u8aToHex)((0, util_1.u8aConcat)(prefixHash, ...keyParts));
|
|
49
|
+
}
|
|
50
|
+
throw Error(`Invalid storage entry type: ${type}`);
|
|
51
|
+
}
|
|
52
|
+
decodeValue(raw) {
|
|
53
|
+
const { modifier, type: { value: { valueTypeId }, }, default: defaultValue, } = this.storageEntry;
|
|
54
|
+
if (raw === null || raw === undefined) {
|
|
55
|
+
if (modifier === 'Optional') {
|
|
56
|
+
return undefined;
|
|
57
|
+
}
|
|
58
|
+
else if (modifier === 'Default') {
|
|
59
|
+
return this.registry.findPortableCodec(valueTypeId).tryDecode((0, util_1.hexToU8a)(defaultValue));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
return this.registry.findPortableCodec(valueTypeId).tryDecode(codecs_1.$StorageData.tryEncode(raw));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
#extractRequiredKeyInputs(keyInput, numberOfValue) {
|
|
67
|
+
if (numberOfValue === 0) {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
if (keyInput === undefined) {
|
|
72
|
+
throw new Error(`Invalid key inputs, required ${numberOfValue} input(s)`);
|
|
73
|
+
}
|
|
74
|
+
if (numberOfValue === 1) {
|
|
75
|
+
return [keyInput];
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
if (!Array.isArray(keyInput)) {
|
|
79
|
+
throw new Error(`Input should be an array with ${numberOfValue} value(s)`);
|
|
80
|
+
}
|
|
81
|
+
if (keyInput.length !== numberOfValue) {
|
|
82
|
+
throw new Error(`Mismatch key inputs length, required an array of ${numberOfValue} value(s)`);
|
|
83
|
+
}
|
|
84
|
+
return keyInput.slice(0, numberOfValue);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
#getPallet() {
|
|
89
|
+
const targetPallet = this.registry.metadata.pallets.find((p) => (0, util_1.stringCamelCase)(p.name) === (0, util_1.stringCamelCase)(this.palletName));
|
|
90
|
+
(0, utils_1.assert)(targetPallet, `Pallet not found: ${this.palletName}`);
|
|
91
|
+
return targetPallet;
|
|
92
|
+
}
|
|
93
|
+
#getStorageEntry() {
|
|
94
|
+
const targetEntry = this.pallet.storage?.entries?.find((entry) => (0, util_1.stringCamelCase)(entry.name) === (0, util_1.stringCamelCase)(this.storageItem));
|
|
95
|
+
(0, utils_1.assert)(targetEntry, `Storage item not found: ${this.storageItem}`);
|
|
96
|
+
return targetEntry;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.QueryableStorage = QueryableStorage;
|
package/cjs/types.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { ProviderInterface } from '@polkadot/rpc-provider/types';
|
|
2
|
+
import type { SubstrateApi } from '@dedot/chaintypes';
|
|
3
|
+
import { BlockHash, CodecRegistry, Metadata, MetadataLatest } from '@dedot/codecs';
|
|
4
|
+
import { ChainProperties, GenericSubstrateApi } from '@dedot/types';
|
|
5
|
+
import { ApiOptions, MetadataKey, NetworkEndpoint, NormalizedApiOptions } from '../types';
|
|
6
|
+
export declare const KEEP_ALIVE_INTERVAL = 10000;
|
|
7
|
+
export declare const CATCH_ALL_METADATA_KEY: MetadataKey;
|
|
8
|
+
export declare const SUPPORTED_METADATA_VERSIONS: number[];
|
|
9
|
+
/**
|
|
10
|
+
* @name Dedot
|
|
11
|
+
* @description Promised-based API Client for Polkadot & Substrate
|
|
12
|
+
*
|
|
13
|
+
* ### Initialize API instance and interact with substrate-based network
|
|
14
|
+
* ```typescript
|
|
15
|
+
* import { Dedot } from 'dedot';
|
|
16
|
+
* import { PolkadotApi } from '@dedot/chaintypes/polkadot';
|
|
17
|
+
*
|
|
18
|
+
* const run = async () => {
|
|
19
|
+
* const api = await Dedot.new<PolkadotApi>('wss://rpc.polkadot.io');
|
|
20
|
+
*
|
|
21
|
+
* // Call rpc `state_getMetadata` to fetch raw scale-encoded metadata and decode it.
|
|
22
|
+
* const metadata = await api.rpc.state.getMetadata();
|
|
23
|
+
* console.log('Metadata:', metadata);
|
|
24
|
+
*
|
|
25
|
+
* // Query on-chain storage
|
|
26
|
+
* const address = '14...';
|
|
27
|
+
* const balance = await api.query.system.account(address);
|
|
28
|
+
* console.log('Balance:', balance);
|
|
29
|
+
*
|
|
30
|
+
*
|
|
31
|
+
* // Subscribe to on-chain storage changes
|
|
32
|
+
* const unsub = await api.query.system.number((blockNumber) => {
|
|
33
|
+
* console.log(`Current block number: ${blockNumber}`);
|
|
34
|
+
* });
|
|
35
|
+
*
|
|
36
|
+
* // Get pallet constants
|
|
37
|
+
* const ss58Prefix = api.consts.system.ss58Prefix;
|
|
38
|
+
* console.log('Polkadot ss58Prefix:', ss58Prefix)
|
|
39
|
+
*
|
|
40
|
+
* // await unsub();
|
|
41
|
+
* // await api.disconnect();
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* run().catch(console.error);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class Dedot<ChainApi extends GenericSubstrateApi = SubstrateApi> {
|
|
48
|
+
#private;
|
|
49
|
+
/**
|
|
50
|
+
* Use factory methods (`create`, `new`) to create `Dedot` instances.
|
|
51
|
+
*
|
|
52
|
+
* @param options
|
|
53
|
+
* @protected
|
|
54
|
+
*/
|
|
55
|
+
protected constructor(options: ApiOptions | NetworkEndpoint);
|
|
56
|
+
/**
|
|
57
|
+
* Factory method to create a new Dedot instance
|
|
58
|
+
*
|
|
59
|
+
* @param options
|
|
60
|
+
*/
|
|
61
|
+
static create<ChainApi extends GenericSubstrateApi = SubstrateApi>(options: ApiOptions | NetworkEndpoint): Promise<Dedot<ChainApi>>;
|
|
62
|
+
/**
|
|
63
|
+
* Alias for __Dedot.create__
|
|
64
|
+
* @param options
|
|
65
|
+
*/
|
|
66
|
+
static new<ChainApi extends GenericSubstrateApi = SubstrateApi>(options: ApiOptions | NetworkEndpoint): Promise<Dedot<ChainApi>>;
|
|
67
|
+
/**
|
|
68
|
+
* Initialize APIs before usage
|
|
69
|
+
*/
|
|
70
|
+
init(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* @description Entry-point for executing RPCs to blockchain node.
|
|
73
|
+
*
|
|
74
|
+
* ```typescript
|
|
75
|
+
* // Subscribe to new heads
|
|
76
|
+
* api.rpc.chain.subscribeNewHeads((header) => {
|
|
77
|
+
* console.log(header);
|
|
78
|
+
* });
|
|
79
|
+
*
|
|
80
|
+
* // Execute arbitrary rpc method: `module_rpc_name`
|
|
81
|
+
* const result = await api.rpc.module.rpc_name();
|
|
82
|
+
* ```
|
|
83
|
+
*/
|
|
84
|
+
get rpc(): ChainApi['rpc'];
|
|
85
|
+
/**
|
|
86
|
+
* @description Entry-point for inspecting constants (parameter types) for all pallets (modules).
|
|
87
|
+
*
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const ss58Prefix = api.consts.system.ss58Prefix;
|
|
90
|
+
* console.log('ss58Prefix:', ss58Prefix)
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
get consts(): ChainApi['consts'];
|
|
94
|
+
/**
|
|
95
|
+
* @description Entry-point for executing query to on-chain storage.
|
|
96
|
+
*
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const balance = await api.query.system.account(<address>);
|
|
99
|
+
* console.log('Balance:', balance);
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
get query(): ChainApi['query'];
|
|
103
|
+
queryAt(blockHash: BlockHash): ChainApi['query'];
|
|
104
|
+
/**
|
|
105
|
+
* @description Entry-point for inspecting errors from metadata
|
|
106
|
+
*/
|
|
107
|
+
get errors(): ChainApi['errors'];
|
|
108
|
+
/**
|
|
109
|
+
* @description Entry-point for inspecting events from metadata
|
|
110
|
+
*/
|
|
111
|
+
get events(): ChainApi['events'];
|
|
112
|
+
get call(): ChainApi['call'];
|
|
113
|
+
callAt(blockHash: BlockHash): ChainApi['call'];
|
|
114
|
+
get tx(): ChainApi['tx'];
|
|
115
|
+
/**
|
|
116
|
+
* @description Current provider for api connection
|
|
117
|
+
*/
|
|
118
|
+
get provider(): ProviderInterface;
|
|
119
|
+
/**
|
|
120
|
+
* @description Codec registry
|
|
121
|
+
*/
|
|
122
|
+
get registry(): CodecRegistry;
|
|
123
|
+
/**
|
|
124
|
+
* @description Check if metadata is present
|
|
125
|
+
*/
|
|
126
|
+
get hasMetadata(): boolean;
|
|
127
|
+
get metadata(): Metadata;
|
|
128
|
+
get metadataLatest(): MetadataLatest;
|
|
129
|
+
/**
|
|
130
|
+
* Setup metadata for
|
|
131
|
+
* @param metadata
|
|
132
|
+
*/
|
|
133
|
+
setMetadata(metadata: Metadata): void;
|
|
134
|
+
/**
|
|
135
|
+
* @description Disconnect to blockchain node
|
|
136
|
+
*/
|
|
137
|
+
disconnect(): Promise<void>;
|
|
138
|
+
/**
|
|
139
|
+
* @description Clear local cache
|
|
140
|
+
*/
|
|
141
|
+
clearCache(): Promise<void>;
|
|
142
|
+
/**
|
|
143
|
+
* @description Check if current provider can make subscription request (e.: via WebSocket)
|
|
144
|
+
*/
|
|
145
|
+
get hasSubscriptions(): boolean;
|
|
146
|
+
/**
|
|
147
|
+
* @description Check if it's connected to the blockchain node
|
|
148
|
+
*/
|
|
149
|
+
get isConnected(): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* @description Check if the api instance is using a catch-all metadata
|
|
152
|
+
*/
|
|
153
|
+
get hasCatchAllMetadata(): boolean;
|
|
154
|
+
get currentMetadataKey(): string;
|
|
155
|
+
/**
|
|
156
|
+
* @description Genesis hash of connected blockchain node
|
|
157
|
+
*/
|
|
158
|
+
get genesisHash(): `0x${string}` | undefined;
|
|
159
|
+
/**
|
|
160
|
+
* @description Runtime version of connected blockchain node
|
|
161
|
+
*/
|
|
162
|
+
get runtimeVersion(): {
|
|
163
|
+
specName: string;
|
|
164
|
+
implName: string;
|
|
165
|
+
authoringVersion: number;
|
|
166
|
+
specVersion: number;
|
|
167
|
+
implVersion: number;
|
|
168
|
+
apis: (readonly [`0x${string}`, number])[];
|
|
169
|
+
transactionVersion: number;
|
|
170
|
+
stateVersion: number;
|
|
171
|
+
} | undefined;
|
|
172
|
+
/**
|
|
173
|
+
* @description Chain properties of connected blockchain node
|
|
174
|
+
*/
|
|
175
|
+
get chainProperties(): ChainProperties | undefined;
|
|
176
|
+
/**
|
|
177
|
+
* @description Runtime chain name of connected blockchain node
|
|
178
|
+
*/
|
|
179
|
+
get runtimeChain(): string | undefined;
|
|
180
|
+
get options(): NormalizedApiOptions;
|
|
181
|
+
}
|