@substrate/api-sidecar 9.1.9 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/build/package.json +17 -19
- package/build/src/chains-config/index.js +2 -0
- package/build/src/chains-config/index.js.map +1 -1
- package/build/src/chains-config/metadata-consts/index.js +3 -0
- package/build/src/chains-config/metadata-consts/index.js.map +1 -1
- package/build/src/chains-config/metadata-consts/kusamaConsts.js +4 -1
- package/build/src/chains-config/metadata-consts/kusamaConsts.js.map +1 -1
- package/build/src/chains-config/metadata-consts/polkadotConsts.js +4 -1
- package/build/src/chains-config/metadata-consts/polkadotConsts.js.map +1 -1
- package/build/src/chains-config/metadata-consts/shidenConsts.d.ts +2 -0
- package/build/src/chains-config/metadata-consts/shidenConsts.js +20 -0
- package/build/src/chains-config/metadata-consts/shidenConsts.js.map +1 -0
- package/build/src/chains-config/metadata-consts/westendConsts.js +4 -1
- package/build/src/chains-config/metadata-consts/westendConsts.js.map +1 -1
- package/build/src/chains-config/shidenControllers.d.ts +5 -0
- package/build/src/chains-config/shidenControllers.js +36 -0
- package/build/src/chains-config/shidenControllers.js.map +1 -0
- package/build/src/controllers/accounts/AccountsBalanceInfoController.js +2 -1
- package/build/src/controllers/accounts/AccountsBalanceInfoController.js.map +1 -1
- package/build/src/controllers/blocks/BlocksController.js +5 -2
- package/build/src/controllers/blocks/BlocksController.js.map +1 -1
- package/build/src/controllers/blocks/BlocksExtrinsicsController.js +2 -1
- package/build/src/controllers/blocks/BlocksExtrinsicsController.js.map +1 -1
- package/build/src/controllers/pallets/PalletsStorageController.js +12 -6
- package/build/src/controllers/pallets/PalletsStorageController.js.map +1 -1
- package/build/src/main.js +0 -0
- package/build/src/services/accounts/AccountsAssetsService.js +1 -1
- package/build/src/services/accounts/AccountsAssetsService.js.map +1 -1
- package/build/src/services/accounts/AccountsAssetsService.spec.js +107 -1
- package/build/src/services/accounts/AccountsAssetsService.spec.js.map +1 -1
- package/build/src/services/accounts/AccountsBalanceInfoService.d.ts +2 -1
- package/build/src/services/accounts/AccountsBalanceInfoService.js +18 -20
- package/build/src/services/accounts/AccountsBalanceInfoService.js.map +1 -1
- package/build/src/services/accounts/AccountsBalanceInfoService.spec.js +68 -47
- package/build/src/services/accounts/AccountsBalanceInfoService.spec.js.map +1 -1
- package/build/src/services/accounts/AccountsStakingInfoService.spec.d.ts +4 -1
- package/build/src/services/accounts/AccountsStakingInfoService.spec.js +23 -7
- package/build/src/services/accounts/AccountsStakingInfoService.spec.js.map +1 -1
- package/build/src/services/accounts/AccountsVestingInfoService.js +19 -5
- package/build/src/services/accounts/AccountsVestingInfoService.js.map +1 -1
- package/build/src/services/accounts/AccountsVestingInfoService.spec.js +47 -2
- package/build/src/services/accounts/AccountsVestingInfoService.spec.js.map +1 -1
- package/build/src/services/blocks/BlocksService.d.ts +2 -1
- package/build/src/services/blocks/BlocksService.js +31 -26
- package/build/src/services/blocks/BlocksService.js.map +1 -1
- package/build/src/services/blocks/BlocksService.spec.js +80 -41
- package/build/src/services/blocks/BlocksService.spec.js.map +1 -1
- package/build/src/services/blocks/BlocksTraceService.spec.js +1 -1
- package/build/src/services/blocks/BlocksTraceService.spec.js.map +1 -1
- package/build/src/services/node/NodeNetworkService.spec.js +1 -1
- package/build/src/services/node/NodeNetworkService.spec.js.map +1 -1
- package/build/src/services/node/NodeTransactionPoolService.spec.js +5 -5
- package/build/src/services/node/NodeTransactionPoolService.spec.js.map +1 -1
- package/build/src/services/node/NodeVersionService.spec.js +1 -1
- package/build/src/services/node/NodeVersionService.spec.js.map +1 -1
- package/build/src/services/pallets/PalletsAssetsService.spec.js +113 -1
- package/build/src/services/pallets/PalletsAssetsService.spec.js.map +1 -1
- package/build/src/services/pallets/PalletsStakingProgressService.spec.js +48 -7
- package/build/src/services/pallets/PalletsStakingProgressService.spec.js.map +1 -1
- package/build/src/services/pallets/PalletsStorageService.d.ts +14 -2
- package/build/src/services/pallets/PalletsStorageService.js +56 -11
- package/build/src/services/pallets/PalletsStorageService.js.map +1 -1
- package/build/src/services/pallets/PalletsStorageService.spec.js +29 -7
- package/build/src/services/pallets/PalletsStorageService.spec.js.map +1 -1
- package/build/src/services/paras/ParasService.spec.d.ts +10 -1
- package/build/src/services/paras/ParasService.spec.js +201 -8
- package/build/src/services/paras/ParasService.spec.js.map +1 -1
- package/build/src/services/runtime/RuntimeCodeService.spec.js +1 -1
- package/build/src/services/runtime/RuntimeCodeService.spec.js.map +1 -1
- package/build/src/services/runtime/RuntimeMetadataService.spec.js +1 -1
- package/build/src/services/runtime/RuntimeMetadataService.spec.js.map +1 -1
- package/build/src/services/runtime/RuntimeSpecService.spec.js +1 -1
- package/build/src/services/runtime/RuntimeSpecService.spec.js.map +1 -1
- package/build/src/services/test-helpers/mock/data/block789629.json +2 -2
- package/build/src/services/test-helpers/mock/data/blocks789629Fork.json +2 -2
- package/build/src/services/test-helpers/mock/mockApi.d.ts +4 -12
- package/build/src/services/test-helpers/mock/mockApi.js +3 -377
- package/build/src/services/test-helpers/mock/mockApi.js.map +1 -1
- package/build/src/services/test-helpers/responses/accounts/vestingInfo789629.json +5 -1
- package/build/src/services/test-helpers/responses/blocks/block789629Extrinsic.json +3 -0
- package/build/src/services/test-helpers/responses/blocks/blocks789629.json +99 -154
- package/build/src/services/transaction/TransactionFeeEstimateService.spec.js +6 -3
- package/build/src/services/transaction/TransactionFeeEstimateService.spec.js.map +1 -1
- package/build/src/services/transaction/TransactionMaterialService.spec.js +1 -1
- package/build/src/services/transaction/TransactionMaterialService.spec.js.map +1 -1
- package/build/src/services/transaction/TransactionSubmitService.spec.js +8 -7
- package/build/src/services/transaction/TransactionSubmitService.spec.js.map +1 -1
- package/build/src/test-helpers/metadata/polkadotV9110Metadata.d.ts +1 -0
- package/build/src/test-helpers/metadata/polkadotV9110Metadata.js +5 -0
- package/build/src/test-helpers/metadata/polkadotV9110Metadata.js.map +1 -0
- package/build/src/test-helpers/registries/polkadotRegistry.d.ts +4 -0
- package/build/src/test-helpers/registries/polkadotRegistry.js +6 -1
- package/build/src/test-helpers/registries/polkadotRegistry.js.map +1 -1
- package/package.json +17 -19
|
@@ -12,27 +12,25 @@ class AccountsBalanceInfoService extends AbstractService_1.AbstractService {
|
|
|
12
12
|
* @param address Address of the account to get the balance info of.
|
|
13
13
|
* @param token Token to get the balance info of.
|
|
14
14
|
*/
|
|
15
|
-
async fetchAccountBalanceInfo(hash, address, token) {
|
|
15
|
+
async fetchAccountBalanceInfo(hash, historicApi, address, token) {
|
|
16
16
|
const { api } = this;
|
|
17
|
-
// Retrieve the historic api for the given hash
|
|
18
|
-
const historicalApi = await api.at(hash);
|
|
19
17
|
/**
|
|
20
|
-
* Check two different cases where a
|
|
18
|
+
* Check two different cases where a historicApi is needed in order
|
|
21
19
|
* to have the correct runtime methods.
|
|
22
20
|
*
|
|
23
21
|
* a) Does the block use the oldest api where the free balance is found
|
|
24
|
-
* using `
|
|
22
|
+
* using `historicApi.query.balances.freeBalance`.
|
|
25
23
|
*
|
|
26
24
|
* b) Does the block use an older api where the free balance is within the
|
|
27
25
|
* AccountInfo type, but the storage does not yet have the `.at` method.
|
|
28
26
|
*/
|
|
29
|
-
if (
|
|
27
|
+
if (historicApi.query.balances.freeBalance) {
|
|
30
28
|
const [header, free, locks, reserved, nonce] = await Promise.all([
|
|
31
29
|
api.rpc.chain.getHeader(hash),
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
30
|
+
historicApi.query.balances.freeBalance(address),
|
|
31
|
+
historicApi.query.balances.locks(address),
|
|
32
|
+
historicApi.query.balances.reservedBalance(address),
|
|
33
|
+
historicApi.query.system.accountNonce(address),
|
|
36
34
|
]);
|
|
37
35
|
// Values dont exist for these historic runtimes
|
|
38
36
|
const miscFrozen = api.registry.createType('Balance', 0), feeFrozen = api.registry.createType('Balance', 0);
|
|
@@ -56,11 +54,11 @@ class AccountsBalanceInfoService extends AbstractService_1.AbstractService {
|
|
|
56
54
|
throw new http_errors_1.BadRequest('Account not found');
|
|
57
55
|
}
|
|
58
56
|
}
|
|
59
|
-
else if (!
|
|
57
|
+
else if (!historicApi.query.system.account.at) {
|
|
60
58
|
const [header, accountInfo, locks] = await Promise.all([
|
|
61
59
|
api.rpc.chain.getHeader(hash),
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
historicApi.query.system.account(address),
|
|
61
|
+
historicApi.query.balances.locks(address),
|
|
64
62
|
]);
|
|
65
63
|
const { data: { free, reserved, feeFrozen, miscFrozen }, nonce, } = accountInfo;
|
|
66
64
|
const at = {
|
|
@@ -85,16 +83,16 @@ class AccountsBalanceInfoService extends AbstractService_1.AbstractService {
|
|
|
85
83
|
}
|
|
86
84
|
let locks, header, accountInfo, accountData;
|
|
87
85
|
// We assume the first token is the native token
|
|
88
|
-
if (token.toUpperCase() ===
|
|
86
|
+
if (token.toUpperCase() === historicApi.registry.chainTokens[0].toUpperCase()) {
|
|
89
87
|
[header, locks, accountInfo] = await Promise.all([
|
|
90
88
|
api.rpc.chain.getHeader(hash),
|
|
91
|
-
|
|
92
|
-
|
|
89
|
+
historicApi.query.balances.locks(address),
|
|
90
|
+
historicApi.query.system.account(address),
|
|
93
91
|
]);
|
|
94
92
|
accountData =
|
|
95
93
|
accountInfo.data != null
|
|
96
94
|
? accountInfo.data
|
|
97
|
-
: await
|
|
95
|
+
: await historicApi.query.balances.account(address);
|
|
98
96
|
}
|
|
99
97
|
else {
|
|
100
98
|
// Assume we are using ORML token pallet
|
|
@@ -102,11 +100,11 @@ class AccountsBalanceInfoService extends AbstractService_1.AbstractService {
|
|
|
102
100
|
try {
|
|
103
101
|
[header, locksAny, accountDataAny, accountInfo] = await Promise.all([
|
|
104
102
|
api.rpc.chain.getHeader(hash),
|
|
105
|
-
|
|
106
|
-
|
|
103
|
+
historicApi.query.tokens.locks(address, { Token: token }),
|
|
104
|
+
historicApi.query.tokens.accounts(address, {
|
|
107
105
|
Token: token,
|
|
108
106
|
}),
|
|
109
|
-
|
|
107
|
+
historicApi.query.system.account(address),
|
|
110
108
|
]);
|
|
111
109
|
}
|
|
112
110
|
catch {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsBalanceInfoService.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsBalanceInfoService.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AccountsBalanceInfoService.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsBalanceInfoService.ts"],"names":[],"mappings":";;;AASA,6CAAyC;AAGzC,wDAAqD;AAErD,MAAa,0BAA2B,SAAQ,iCAAe;IAC9D;;;;;;;OAOG;IACH,KAAK,CAAC,uBAAuB,CAC5B,IAAe,EACf,WAAqC,EACrC,OAAe,EACf,KAAa;QAEb,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACrB;;;;;;;;;WASG;QACH,IAAI,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,EAAE;YAC3C,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC7B,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,CAAqB;gBACnE,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;gBACzC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAqB;gBACvE,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAmB;aAChE,CAAC,CAAC;YAEH,gDAAgD;YAChD,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,EACvD,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAEnD,MAAM,EAAE,GAAG;gBACV,IAAI;gBACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;aAC7C,CAAC;YAEF,IAAI,IAAI,EAAE;gBACT,OAAO;oBACN,EAAE;oBACF,KAAK;oBACL,WAAW,EAAE,KAAK;oBAClB,IAAI;oBACJ,QAAQ;oBACR,UAAU;oBACV,SAAS;oBACT,KAAK;iBACL,CAAC;aACF;iBAAM;gBACN,MAAM,IAAI,wBAAU,CAAC,mBAAmB,CAAC,CAAC;aAC1C;SACD;aAAM,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,EAAE;YAChD,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACtD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC7B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;gBACzC,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;aACzC,CAAC,CAAC;YAEH,MAAM,EACL,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,EAC/C,KAAK,GACL,GAAG,WAAW,CAAC;YAEhB,MAAM,EAAE,GAAG;gBACV,IAAI;gBACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;aAC7C,CAAC;YAEF,IAAI,WAAW,IAAI,KAAK,EAAE;gBACzB,OAAO;oBACN,EAAE;oBACF,KAAK;oBACL,WAAW,EAAE,KAAK;oBAClB,IAAI;oBACJ,QAAQ;oBACR,UAAU;oBACV,SAAS;oBACT,KAAK;iBACL,CAAC;aACF;iBAAM;gBACN,MAAM,IAAI,wBAAU,CAAC,mBAAmB,CAAC,CAAC;aAC1C;SACD;QAED,IAAI,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC;QAC5C,gDAAgD;QAChD,IACC,KAAK,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,EACxE;YACD,CAAC,MAAM,EAAE,KAAK,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAChD,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;gBAC7B,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC;gBACzC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACzC,CAAC,CAAC;YAEH,WAAW;gBACV,WAAW,CAAC,IAAI,IAAI,IAAI;oBACvB,CAAC,CAAC,WAAW,CAAC,IAAI;oBAClB,CAAC,CAAC,MAAM,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;SACtD;aAAM;YACN,wCAAwC;YACxC,IAAI,QAAQ,EAAE,cAAc,CAAC;YAC7B,IAAI;gBACH,CAAC,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACnE,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC7B,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;oBACzD,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE;wBAC1C,KAAK,EAAE,KAAK;qBACZ,CAAC;oBACF,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;iBACzC,CAAC,CAAC;aACH;YAAC,MAAM;gBACP,MAAM,IAAI,wBAAU,CACnB,qEAAqE;oBACpE,wCAAwC,CACzC,CAAC;aACF;YAED,6EAA6E;YAC7E,KAAK,GAAG,QAA4B,CAAC;YACrC,WAAW,GAAG,cAA6B,CAAC;SAC5C;QAED,MAAM,EAAE,GAAG;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SAC7C,CAAC;QAEF,IAAI,WAAW,IAAI,KAAK,IAAI,WAAW,EAAE;YACxC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,WAAW,CAAC;YAC9D,MAAM,EAAE,KAAK,EAAE,GAAG,WAAW,CAAC;YAE9B,OAAO;gBACN,EAAE;gBACF,KAAK;gBACL,WAAW,EAAE,KAAK;gBAClB,IAAI;gBACJ,QAAQ;gBACR,UAAU;gBACV,SAAS;gBACT,KAAK;aACL,CAAC;SACF;aAAM;YACN,MAAM,IAAI,wBAAU,CAAC,mBAAmB,CAAC,CAAC;SAC1C;IACF,CAAC;CACD;AAzJD,gEAyJC"}
|
|
@@ -4,52 +4,93 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const sanitizeNumbers_1 = require("../../sanitize/sanitizeNumbers");
|
|
7
|
-
const metadata_1 = require("../../test-helpers/metadata/metadata");
|
|
8
7
|
const registries_1 = require("../../test-helpers/registries");
|
|
9
|
-
const typeFactory_1 = require("../../test-helpers/typeFactory");
|
|
10
8
|
const mock_1 = require("../test-helpers/mock");
|
|
11
9
|
const balanceInfo789629_json_1 = __importDefault(require("../test-helpers/responses/accounts/balanceInfo789629.json"));
|
|
12
10
|
const AccountsBalanceInfoService_1 = require("./AccountsBalanceInfoService");
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
11
|
+
const locksAt = (_address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Vec<BalanceLock>', '0x047374616b696e672000e8764817000000000000000000000002'));
|
|
12
|
+
const accountAt = (_address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('AccountInfo', '0x0600000003dbb656ab7400000000000000000000000000000000000000000000000000000000e8764817000000000000000000000000e87648170000000000000000000000'));
|
|
13
|
+
const freeBalanceAt = () => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Balance', 123456789));
|
|
14
|
+
const mockHistoricApi = {
|
|
15
|
+
registry: registries_1.polkadotRegistry,
|
|
18
16
|
query: {
|
|
19
17
|
balances: {
|
|
20
|
-
freeBalance:
|
|
18
|
+
freeBalance: freeBalanceAt,
|
|
21
19
|
reservedBalance: async () => registries_1.polkadotRegistry.createType('Balance', 1),
|
|
22
|
-
locks:
|
|
20
|
+
locks: locksAt,
|
|
23
21
|
},
|
|
24
22
|
system: {
|
|
25
23
|
accountNonce: async () => registries_1.polkadotRegistry.createType('Index', 1),
|
|
24
|
+
account: accountAt,
|
|
26
25
|
},
|
|
27
26
|
},
|
|
28
27
|
};
|
|
28
|
+
const mockApi = {
|
|
29
|
+
...mock_1.defaultMockApi,
|
|
30
|
+
at: (_hash) => mockHistoricApi,
|
|
31
|
+
};
|
|
32
|
+
const accountsBalanceInfoService = new AccountsBalanceInfoService_1.AccountsBalanceInfoService(mockApi);
|
|
29
33
|
describe('AccountsBalanceInfoService', () => {
|
|
30
34
|
describe('fetchAccountBalanceInfo', () => {
|
|
31
35
|
it('works when ApiPromise works (block 789629)', async () => {
|
|
32
|
-
|
|
36
|
+
const tempHistoricApi = { ...mockHistoricApi };
|
|
37
|
+
tempHistoricApi.query.balances.freeBalance = undefined;
|
|
38
|
+
const tempMockApi = {
|
|
39
|
+
...mock_1.defaultMockApi,
|
|
40
|
+
at: (_hash) => tempHistoricApi,
|
|
41
|
+
};
|
|
42
|
+
const tempAccountsBalanceInfoService = new AccountsBalanceInfoService_1.AccountsBalanceInfoService(tempMockApi);
|
|
43
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await tempAccountsBalanceInfoService.fetchAccountBalanceInfo(mock_1.blockHash789629, mockHistoricApi, mock_1.testAddress, 'DOT'))).toStrictEqual(balanceInfo789629_json_1.default);
|
|
44
|
+
});
|
|
45
|
+
it('Correctly queries historical blocks', async () => {
|
|
46
|
+
const result = await accountsBalanceInfoService.fetchAccountBalanceInfo(mock_1.blockHash789629, mockHistoricApi, mock_1.testAddress, 'DOT');
|
|
47
|
+
const expectedResponse = {
|
|
48
|
+
at: {
|
|
49
|
+
hash: '0x7b713de604a99857f6c25eacc115a4f28d2611a23d9ddff99ab0e4f1c17a8578',
|
|
50
|
+
height: '789629',
|
|
51
|
+
},
|
|
52
|
+
feeFrozen: '100000000000',
|
|
53
|
+
free: '501090793179',
|
|
54
|
+
locks: [
|
|
55
|
+
{
|
|
56
|
+
amount: '100000000000',
|
|
57
|
+
id: '0x7374616b696e6720',
|
|
58
|
+
reasons: 'All',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
miscFrozen: '100000000000',
|
|
62
|
+
nonce: '6',
|
|
63
|
+
reserved: '0',
|
|
64
|
+
tokenSymbol: 'DOT',
|
|
65
|
+
};
|
|
66
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(result)).toStrictEqual(expectedResponse);
|
|
33
67
|
});
|
|
34
68
|
describe('token recognition', () => {
|
|
69
|
+
const tokenHistoricApi = { ...mockHistoricApi };
|
|
70
|
+
Object.assign(tokenHistoricApi.query.system.account, { at: true });
|
|
71
|
+
tokenHistoricApi.query.balances.freeBalance = undefined;
|
|
72
|
+
const tokenMockApi = {
|
|
73
|
+
...mock_1.defaultMockApi,
|
|
74
|
+
at: (_hash) => tokenHistoricApi,
|
|
75
|
+
};
|
|
76
|
+
const tokenAccountsBalanceInfoService = new AccountsBalanceInfoService_1.AccountsBalanceInfoService(tokenMockApi);
|
|
35
77
|
let tempQueryTokens, tempQueryBalance, mockTokensLocksAt, mockTokenAccountAt, mockBalancesLocksAt;
|
|
36
78
|
beforeAll(() => {
|
|
37
79
|
// Important: these temp values should never be reassinged. They are used so we can assign
|
|
38
80
|
// the mockApi properties back to their original values after this sub-section of tests run.
|
|
39
|
-
tempQueryTokens =
|
|
40
|
-
tempQueryBalance =
|
|
41
|
-
const tokensAccountAt = async (
|
|
81
|
+
tempQueryTokens = tokenHistoricApi.query.tokens;
|
|
82
|
+
tempQueryBalance = tokenHistoricApi.query.balances;
|
|
83
|
+
const tokensAccountAt = async (address) => (await tokenHistoricApi.query.system.account(address)).data;
|
|
42
84
|
// Wrap our functions in a jest mock so we can collect data on how they are called
|
|
43
|
-
mockTokensLocksAt = jest.fn(
|
|
85
|
+
mockTokensLocksAt = jest.fn(tokenHistoricApi.query.balances.locks);
|
|
44
86
|
mockTokenAccountAt = jest.fn(tokensAccountAt);
|
|
45
|
-
|
|
46
|
-
locks:
|
|
47
|
-
accounts:
|
|
48
|
-
};
|
|
49
|
-
mockBalancesLocksAt = jest.fn(mock_1.mockApi.query.balances.locks.at);
|
|
50
|
-
mock_1.mockApi.query.balances = {
|
|
51
|
-
locks: { at: mockBalancesLocksAt },
|
|
87
|
+
tokenHistoricApi.query.tokens = {
|
|
88
|
+
locks: mockTokensLocksAt,
|
|
89
|
+
accounts: mockTokenAccountAt,
|
|
52
90
|
};
|
|
91
|
+
mockBalancesLocksAt = jest.fn(tokenHistoricApi.query.balances.locks);
|
|
92
|
+
tokenHistoricApi.query.balances.locks =
|
|
93
|
+
mockBalancesLocksAt;
|
|
53
94
|
});
|
|
54
95
|
afterEach(() => {
|
|
55
96
|
// Clear data about how the mocks where called after each `it` test.
|
|
@@ -58,45 +99,25 @@ describe('AccountsBalanceInfoService', () => {
|
|
|
58
99
|
mockBalancesLocksAt.mockClear();
|
|
59
100
|
});
|
|
60
101
|
afterAll(() => {
|
|
61
|
-
|
|
62
|
-
|
|
102
|
+
tokenHistoricApi.query.tokens = tempQueryTokens;
|
|
103
|
+
tokenHistoricApi.query.balances = tempQueryBalance;
|
|
63
104
|
});
|
|
64
105
|
it('only has `["DOT"]` (all uppercase chars) for the mockApi registry', () => {
|
|
65
|
-
expect(
|
|
66
|
-
expect(
|
|
106
|
+
expect(tokenHistoricApi.registry.chainTokens).toStrictEqual(['DOT']);
|
|
107
|
+
expect(tokenHistoricApi.registry.chainDecimals).toStrictEqual([12]);
|
|
67
108
|
});
|
|
68
109
|
it('querrys tokens pallet storage with a non-native token', async () => {
|
|
69
|
-
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await
|
|
110
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await tokenAccountsBalanceInfoService.fetchAccountBalanceInfo(mock_1.blockHash789629, tokenHistoricApi, mock_1.testAddress, 'fOoToKeN')).tokenSymbol).toEqual('fOoToKeN');
|
|
70
111
|
expect(mockTokensLocksAt).toBeCalled();
|
|
71
112
|
expect(mockTokenAccountAt).toBeCalled();
|
|
72
113
|
expect(mockBalancesLocksAt).not.toBeCalled();
|
|
73
114
|
});
|
|
74
115
|
it('does not query tokens pallet storage with the native token', async () => {
|
|
75
|
-
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await
|
|
116
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await tokenAccountsBalanceInfoService.fetchAccountBalanceInfo(mock_1.blockHash789629, tokenHistoricApi, mock_1.testAddress, 'doT')).tokenSymbol).toEqual('doT');
|
|
76
117
|
expect(mockTokensLocksAt).not.toBeCalled();
|
|
77
118
|
expect(mockTokenAccountAt).not.toBeCalled();
|
|
78
119
|
expect(mockBalancesLocksAt).toBeCalled();
|
|
79
120
|
});
|
|
80
|
-
it('Correctly queries historical blocks', async () => {
|
|
81
|
-
// Set the at to a historical runtime, before the storage key format changed
|
|
82
|
-
mock_1.mockApi.at = () => Promise.resolve().then(() => historicalMockApi);
|
|
83
|
-
const result = await accountsBalanceInfoService.fetchAccountBalanceInfo(mock_1.blockHash789629, mock_1.testAddress, 'DOT');
|
|
84
|
-
const expectedResponse = {
|
|
85
|
-
at: {
|
|
86
|
-
hash: '0x7b713de604a99857f6c25eacc115a4f28d2611a23d9ddff99ab0e4f1c17a8578',
|
|
87
|
-
height: '789629',
|
|
88
|
-
},
|
|
89
|
-
feeFrozen: '0',
|
|
90
|
-
free: '123456789',
|
|
91
|
-
locks: [],
|
|
92
|
-
miscFrozen: '0',
|
|
93
|
-
nonce: '1',
|
|
94
|
-
reserved: '1',
|
|
95
|
-
tokenSymbol: 'DOT',
|
|
96
|
-
};
|
|
97
|
-
expect((0, sanitizeNumbers_1.sanitizeNumbers)(result)).toStrictEqual(expectedResponse);
|
|
98
|
-
mock_1.mockApi.at = async () => (0, typeFactory_1.createApiWithAugmentations)(metadata_1.polkadotMetadata.toHex());
|
|
99
|
-
});
|
|
100
121
|
});
|
|
101
122
|
});
|
|
102
123
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsBalanceInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsBalanceInfoService.spec.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"AccountsBalanceInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsBalanceInfoService.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1,4 @@
|
|
|
1
|
-
|
|
1
|
+
import { Option } from '@polkadot/types';
|
|
2
|
+
import { AccountId, Hash, StakingLedger } from '@polkadot/types/interfaces';
|
|
3
|
+
export declare const bondedAt: (_hash: Hash, _address: string) => Promise<Option<AccountId>>;
|
|
4
|
+
export declare const ledgerAt: (_hash: Hash, _address: string) => Promise<Option<StakingLedger>>;
|
|
@@ -3,29 +3,45 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
|
|
7
|
-
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
|
|
6
|
+
exports.ledgerAt = exports.bondedAt = void 0;
|
|
8
7
|
const http_errors_1 = require("http-errors");
|
|
9
8
|
const sanitizeNumbers_1 = require("../../sanitize/sanitizeNumbers");
|
|
10
9
|
const registries_1 = require("../../test-helpers/registries");
|
|
11
10
|
const mock_1 = require("../test-helpers/mock");
|
|
12
11
|
const stakingInfo789629_json_1 = __importDefault(require("../test-helpers/responses/accounts/stakingInfo789629.json"));
|
|
13
12
|
const AccountsStakingInfoService_1 = require("./AccountsStakingInfoService");
|
|
14
|
-
const
|
|
13
|
+
const bondedAt = (_hash, _address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<AccountId>', mock_1.testAddressController));
|
|
14
|
+
exports.bondedAt = bondedAt;
|
|
15
|
+
const ledgerAt = (_hash, _address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<StakingLedger>', '0x2c2a55b5e0d28cc772b47bb9b25981cbb69eca73f7c3388fb6464e7d24be470e0700e87648170700e8764817008c000000000100000002000000030000000400000005000000060000000700000008000000090000001700000018000000190000001a0000001b0000001c0000001d0000001e0000001f000000200000002100000022000000230000002400000025000000260000002700000028000000290000002a0000002b0000002c0000002d0000002e0000002f000000'));
|
|
16
|
+
exports.ledgerAt = ledgerAt;
|
|
17
|
+
const payeeAt = (_hash, _address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('RewardDestination', 'Controller'));
|
|
18
|
+
const slashingSpansAt = (_hash, _address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('SlashingSpans'));
|
|
19
|
+
const mockApi = {
|
|
20
|
+
...mock_1.defaultMockApi,
|
|
21
|
+
query: {
|
|
22
|
+
staking: {
|
|
23
|
+
bonded: { at: exports.bondedAt },
|
|
24
|
+
ledger: { at: exports.ledgerAt },
|
|
25
|
+
payee: { at: payeeAt },
|
|
26
|
+
slashingSpans: { at: slashingSpansAt },
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
const accountStakingInfoService = new AccountsStakingInfoService_1.AccountsStakingInfoService(mockApi);
|
|
15
31
|
describe('AccountsStakingInfoService', () => {
|
|
16
32
|
describe('fetchAccountStakingInfo', () => {
|
|
17
33
|
it('works with a valid stash address (block 789629)', async () => {
|
|
18
34
|
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await accountStakingInfoService.fetchAccountStakingInfo(mock_1.blockHash789629, mock_1.testAddress))).toStrictEqual(stakingInfo789629_json_1.default);
|
|
19
35
|
});
|
|
20
36
|
it('throws a 400 when the given address is not a stash', async () => {
|
|
21
|
-
|
|
37
|
+
mockApi.query.staking.bonded.at = () => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<AccountId>', null));
|
|
22
38
|
await expect(accountStakingInfoService.fetchAccountStakingInfo(mock_1.blockHash789629, 'NotStash')).rejects.toStrictEqual(new http_errors_1.BadRequest('The address NotStash is not a stash address.'));
|
|
23
|
-
|
|
39
|
+
mockApi.query.staking.bonded.at = exports.bondedAt;
|
|
24
40
|
});
|
|
25
41
|
it('throws a 404 when the staking ledger cannot be found', async () => {
|
|
26
|
-
|
|
42
|
+
mockApi.query.staking.ledger.at = () => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<StakingLedger>', null));
|
|
27
43
|
await expect(accountStakingInfoService.fetchAccountStakingInfo(mock_1.blockHash789629, mock_1.testAddress)).rejects.toStrictEqual(new http_errors_1.InternalServerError(`Staking ledger could not be found for controller address "${mock_1.testAddressController.toString()}"`));
|
|
28
|
-
|
|
44
|
+
mockApi.query.staking.ledger.at = exports.ledgerAt;
|
|
29
45
|
});
|
|
30
46
|
});
|
|
31
47
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsStakingInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsStakingInfoService.spec.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AccountsStakingInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsStakingInfoService.spec.ts"],"names":[],"mappings":";;;;;;AAKA,6CAA8D;AAE9D,oEAAiE;AACjE,8DAAiE;AACjE,+CAK8B;AAC9B,uHAAuF;AACvF,6EAA0E;AAEnE,MAAM,QAAQ,GAAG,CACvB,KAAW,EACX,QAAgB,EACa,EAAE,CAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC3B,6BAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,4BAAqB,CAAC,CACvE,CAAC;AANU,QAAA,QAAQ,YAMlB;AAEI,MAAM,QAAQ,GAAG,CACvB,KAAW,EACX,QAAgB,EACiB,EAAE,CACnC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC3B,6BAAgB,CAAC,UAAU,CAC1B,uBAAuB,EACvB,wXAAwX,CACxX,CACD,CAAC;AATU,QAAA,QAAQ,YASlB;AAEH,MAAM,OAAO,GAAG,CAAC,KAAW,EAAE,QAAgB,EAAE,EAAE,CACjD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC3B,6BAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,YAAY,CAAC,CAC9D,CAAC;AAEH,MAAM,eAAe,GAAG,CAAC,KAAW,EAAE,QAAgB,EAAE,EAAE,CACzD,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,6BAAgB,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC;AAE5E,MAAM,OAAO,GAAG;IACf,GAAG,qBAAc;IACjB,KAAK,EAAE;QACN,OAAO,EAAE;YACR,MAAM,EAAE,EAAE,EAAE,EAAE,gBAAQ,EAAE;YACxB,MAAM,EAAE,EAAE,EAAE,EAAE,gBAAQ,EAAE;YACxB,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE;YACtB,aAAa,EAAE,EAAE,EAAE,EAAE,eAAe,EAAE;SACtC;KACD;CACwB,CAAC;AAE3B,MAAM,yBAAyB,GAAG,IAAI,uDAA0B,CAAC,OAAO,CAAC,CAAC;AAE1E,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC3C,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAChE,MAAM,CACL,IAAA,iCAAe,EACd,MAAM,yBAAyB,CAAC,uBAAuB,CACtD,sBAAe,EACf,kBAAW,CACX,CACD,CACD,CAAC,aAAa,CAAC,gCAAc,CAAC,CAAC;QACjC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAc,CAAC,EAAE,GAAG,GAAG,EAAE,CAC/C,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC3B,6BAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,IAAI,CAAC,CACtD,CAAC;YAEH,MAAM,MAAM,CACX,yBAAyB,CAAC,uBAAuB,CAChD,sBAAe,EACf,UAAU,CACV,CACD,CAAC,OAAO,CAAC,aAAa,CACtB,IAAI,wBAAU,CAAC,8CAA8C,CAAC,CAC9D,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAc,CAAC,EAAE,GAAG,gBAAQ,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAc,CAAC,EAAE,GAAG,GAAG,EAAE,CAC/C,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAC3B,6BAAgB,CAAC,UAAU,CAAC,uBAAuB,EAAE,IAAI,CAAC,CAC1D,CAAC;YAEH,MAAM,MAAM,CACX,yBAAyB,CAAC,uBAAuB,CAChD,sBAAe,EACf,kBAAW,CACX,CACD,CAAC,OAAO,CAAC,aAAa,CACtB,IAAI,iCAAmB,CACtB,6DAA6D,4BAAqB,CAAC,QAAQ,EAAE,GAAG,CAChG,CACD,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAc,CAAC,EAAE,GAAG,gBAAQ,CAAC;QACrD,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AccountsVestingInfoService = void 0;
|
|
4
|
+
const http_errors_1 = require("http-errors");
|
|
4
5
|
const AbstractService_1 = require("../AbstractService");
|
|
5
6
|
class AccountsVestingInfoService extends AbstractService_1.AbstractService {
|
|
6
7
|
/**
|
|
@@ -11,18 +12,31 @@ class AccountsVestingInfoService extends AbstractService_1.AbstractService {
|
|
|
11
12
|
*/
|
|
12
13
|
async fetchAccountVestingInfo(hash, address) {
|
|
13
14
|
const { api } = this;
|
|
15
|
+
const historicApi = await api.at(hash);
|
|
16
|
+
if (!historicApi.query.vesting) {
|
|
17
|
+
throw new http_errors_1.BadRequest(`Vesting pallet does not exist on the specified blocks runtime version`);
|
|
18
|
+
}
|
|
14
19
|
const [{ number }, vesting] = await Promise.all([
|
|
15
20
|
api.rpc.chain.getHeader(hash),
|
|
16
|
-
|
|
21
|
+
historicApi.query.vesting.vesting(address),
|
|
17
22
|
]);
|
|
18
23
|
const at = {
|
|
19
24
|
hash,
|
|
20
25
|
height: number.unwrap().toString(10),
|
|
21
26
|
};
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
27
|
+
if (vesting.isNone) {
|
|
28
|
+
return {
|
|
29
|
+
at,
|
|
30
|
+
vesting: [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
const unwrapVesting = vesting.unwrap();
|
|
35
|
+
return {
|
|
36
|
+
at,
|
|
37
|
+
vesting: Array.isArray(unwrapVesting) ? unwrapVesting : [unwrapVesting],
|
|
38
|
+
};
|
|
39
|
+
}
|
|
26
40
|
}
|
|
27
41
|
}
|
|
28
42
|
exports.AccountsVestingInfoService = AccountsVestingInfoService;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsVestingInfoService.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsVestingInfoService.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"AccountsVestingInfoService.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsVestingInfoService.ts"],"names":[],"mappings":";;;AACA,6CAAyC;AAGzC,wDAAqD;AAErD,MAAa,0BAA2B,SAAQ,iCAAe;IAC9D;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB,CAC5B,IAAe,EACf,OAAe;QAEf,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QAErB,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;QAEvC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE;YAC/B,MAAM,IAAI,wBAAU,CACnB,uEAAuE,CACvE,CAAC;SACF;QAED,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAC/C,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC;YAC7B,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;SAC1C,CAAC,CAAC;QAEH,MAAM,EAAE,GAAG;YACV,IAAI;YACJ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;SACpC,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,EAAE;YACnB,OAAO;gBACN,EAAE;gBACF,OAAO,EAAE,EAAE;aACX,CAAC;SACF;aAAM;YACN,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAEvC,OAAO;gBACN,EAAE;gBACF,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;aACvE,CAAC;SACF;IACF,CAAC;CACD;AA7CD,gEA6CC"}
|
|
@@ -4,14 +4,59 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
const sanitizeNumbers_1 = require("../../sanitize/sanitizeNumbers");
|
|
7
|
+
const polkadotV9110Metadata_1 = require("../../test-helpers/metadata/polkadotV9110Metadata");
|
|
8
|
+
const registries_1 = require("../../test-helpers/registries");
|
|
9
|
+
const typeFactory_1 = require("../../test-helpers/typeFactory");
|
|
7
10
|
const mock_1 = require("../test-helpers/mock");
|
|
8
11
|
const vestingInfo789629_json_1 = __importDefault(require("../test-helpers/responses/accounts/vestingInfo789629.json"));
|
|
9
12
|
const AccountsVestingInfoService_1 = require("./AccountsVestingInfoService");
|
|
10
|
-
const
|
|
13
|
+
const typeFactorApiV9110 = (0, typeFactory_1.createApiWithAugmentations)(polkadotV9110Metadata_1.polkadotMetadataRpcV9110);
|
|
14
|
+
const factory = new typeFactory_1.TypeFactory(typeFactorApiV9110);
|
|
15
|
+
const vestingRes = {
|
|
16
|
+
locked: '1749990000000000',
|
|
17
|
+
perBlock: '166475460',
|
|
18
|
+
startingBlock: '4961000',
|
|
19
|
+
};
|
|
20
|
+
const vestingAt = (_address) => Promise.resolve().then(() => {
|
|
21
|
+
const vestingInfo = typeFactorApiV9110.createType('PalletVestingVestingInfo', vestingRes);
|
|
22
|
+
const vecVestingInfo = factory.vecOf([vestingInfo]);
|
|
23
|
+
return factory.optionOf(vecVestingInfo);
|
|
24
|
+
});
|
|
25
|
+
const historicVestingAt = (_address) => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<VestingInfo>', vestingRes));
|
|
26
|
+
const mockHistoricApi = {
|
|
27
|
+
query: {
|
|
28
|
+
vesting: {
|
|
29
|
+
vesting: vestingAt,
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
const mockApi = {
|
|
34
|
+
...mock_1.defaultMockApi,
|
|
35
|
+
at: (_hash) => mockHistoricApi,
|
|
36
|
+
};
|
|
37
|
+
const accountsVestingInfoService = new AccountsVestingInfoService_1.AccountsVestingInfoService(mockApi);
|
|
11
38
|
describe('AccountVestingInfoService', () => {
|
|
12
39
|
describe('fetchAccountVestingInfo', () => {
|
|
13
|
-
it('works when ApiPromise works (block 789629)', async () => {
|
|
40
|
+
it('works when ApiPromise works (block 789629) with V14 metadata', async () => {
|
|
41
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await accountsVestingInfoService.fetchAccountVestingInfo(mock_1.blockHash789629, mock_1.testAddress))).toStrictEqual(vestingInfo789629_json_1.default);
|
|
42
|
+
});
|
|
43
|
+
it('Vesting should return an empty array for None responses', async () => {
|
|
44
|
+
const tempVest = () => Promise.resolve().then(() => registries_1.polkadotRegistry.createType('Option<VestingInfo>', null));
|
|
45
|
+
mockHistoricApi.query.vesting.vesting = tempVest;
|
|
46
|
+
const expectedResponse = {
|
|
47
|
+
at: {
|
|
48
|
+
hash: '0x7b713de604a99857f6c25eacc115a4f28d2611a23d9ddff99ab0e4f1c17a8578',
|
|
49
|
+
height: '789629',
|
|
50
|
+
},
|
|
51
|
+
vesting: [],
|
|
52
|
+
};
|
|
53
|
+
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await accountsVestingInfoService.fetchAccountVestingInfo(mock_1.blockHash789629, mock_1.testAddress))).toStrictEqual(expectedResponse);
|
|
54
|
+
mockHistoricApi.query.vesting.vesting = vestingAt;
|
|
55
|
+
});
|
|
56
|
+
it('Should correctly adjust `Option<VestingInfo>` for pre V14 blocks to return an array', async () => {
|
|
57
|
+
mockHistoricApi.query.vesting.vesting = historicVestingAt;
|
|
14
58
|
expect((0, sanitizeNumbers_1.sanitizeNumbers)(await accountsVestingInfoService.fetchAccountVestingInfo(mock_1.blockHash789629, mock_1.testAddress))).toStrictEqual(vestingInfo789629_json_1.default);
|
|
59
|
+
mockHistoricApi.query.vesting.vesting = vestingAt;
|
|
15
60
|
});
|
|
16
61
|
});
|
|
17
62
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccountsVestingInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsVestingInfoService.spec.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"AccountsVestingInfoService.spec.js","sourceRoot":"","sources":["../../../../src/services/accounts/AccountsVestingInfoService.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ApiPromise } from '@polkadot/api';
|
|
2
|
+
import { ApiDecoration } from '@polkadot/api/types';
|
|
2
3
|
import { BlockHash, Header } from '@polkadot/types/interfaces';
|
|
3
4
|
import LRU from 'lru-cache';
|
|
4
5
|
import { BlockWeightStore } from '../../types/chains-config';
|
|
@@ -31,7 +32,7 @@ export declare class BlocksService extends AbstractService {
|
|
|
31
32
|
* @param hash `BlockHash` of the block to fetch.
|
|
32
33
|
* @param FetchBlockOptions options for additonal information.
|
|
33
34
|
*/
|
|
34
|
-
fetchBlock(hash: BlockHash, { eventDocs, extrinsicDocs, checkFinalized, queryFinalizedHead, omitFinalizedTag, }: FetchBlockOptions): Promise<IBlock>;
|
|
35
|
+
fetchBlock(hash: BlockHash, historicApi: ApiDecoration<'promise'>, { eventDocs, extrinsicDocs, checkFinalized, queryFinalizedHead, omitFinalizedTag, }: FetchBlockOptions): Promise<IBlock>;
|
|
35
36
|
/**
|
|
36
37
|
* Return the header of a block
|
|
37
38
|
*
|