diff --git a/README.md b/README.md index b867449ac..c191bed9e 100644 --- a/README.md +++ b/README.md @@ -104,6 +104,12 @@ a 32-byte hex string (`0x` followed by 64 hexadecimal digits) that denotes the b - [`/metadata/NUMBER` fetch chain metadata at the block identified by 'NUMBER`.](src/controllers/runtime/RuntimeMetadataController.ts) +- [`node/network` fetch information about the Substrate node's activity in the peer-to-peer network.](src/controllers/node/NodeNetworkController.ts) + +- [`node/transaction-pool` fetch pending extrinsics from the Substrate node.](src/controllers/node/NodeTransactionPoolController.ts) + +- [`/node/version` fetch information about the Substrates node's implementation and versioning.](src/controllers/node/NodeVersionController.ts) + - [`/claims/ADDRESS` fetch claims data for an Ethereum `ADDRESS`.](src/controllers/claims/ClaimsController.ts) - [`/claims/ADDRESS/NUMBER` fetch claims data for an Ethereum `ADDRESS` at the block identified by 'NUMBER`.](src/controllers/claims/ClaimsController.ts) diff --git a/openapi/openapi-proposal.yaml b/openapi/openapi-proposal.yaml index 889ce02a6..89336e33f 100755 --- a/openapi/openapi-proposal.yaml +++ b/openapi/openapi-proposal.yaml @@ -272,7 +272,7 @@ paths: get: tags: - node - summary: Get network information of the node. + summary: Get information about the Substrate node's activity in the peer-to-peer network. description: Returns network related information of the node. operationId: getNodeNetworking responses: @@ -286,7 +286,7 @@ paths: get: tags: - node - summary: Get the transaction pool of the node. + summary: Get pending extrinsics from the Substrate node. description: Returns the extrinsics that the node knows of that have not been included in a block. operationId: getNodeTransactionPool @@ -301,7 +301,7 @@ paths: get: tags: - node - summary: Get version information of the node. + summary: Get information about the Substrates node's implementation and versioning. description: Returns versioning information of the node. operationId: getNodeVersion responses: @@ -1507,17 +1507,15 @@ components: NodeVersion: type: object properties: - at: - $ref: '#/components/schemas/BlockIdentifiers' - clientImplVersion: + clientVersion: type: string - description: Node's implementation's version. + description: Node's binary version. clientImplName: type: string description: Node's implementation name. chain: type: string - description: Chain's spec name. + description: Node's chain name. description: Version information of the node. NodeRole: type: string @@ -1535,27 +1533,25 @@ components: description: Peer ID. roles: type: string - description: Roles. + description: Roles the peer is running protocolVersion: type: string - description: Protocol version. + description: Peer's protocol version. format: unsignedInteger bestHash: type: string - description: Peer best block hash. + description: Hash of the best block on the peer's canon chain. format: hex bestNumber: type: string - description: Peer + description: Height of the best block on the peer's canon chain. format: unsignedInteger NodeNetwork: type: object properties: - at: - $ref: '#/components/schemas/BlockIdentifiers' nodeRoles: $ref: '#/components/schemas/NodeRole' - peers: + numPeers: type: string description: Number of peers the node is connected to. format: unsignedInteger @@ -1577,7 +1573,7 @@ components: example. items: type: string - systemPeers: + peersInfo: type: array items: $ref: '#/components/schemas/PeerInfo' @@ -1841,12 +1837,19 @@ components: TransactionPool: type: object properties: - at: - $ref: '#/components/schemas/BlockIdentifiers' pool: type: array items: - $ref: '#/components/schemas/Extrinsic' + type: object + properties: + hash: + type: string + format: hex + description: H256 hash of the extrinsic. + encodedExtrinsic: + type: string + format: hex + description: Scale encoded extrinsic. PalletsResponses: oneOf: - type: object diff --git a/src/controllers/index.ts b/src/controllers/index.ts index 65560596c..c6d25d82b 100644 --- a/src/controllers/index.ts +++ b/src/controllers/index.ts @@ -4,3 +4,4 @@ export * from './blocks'; export * from './claims'; export * from './runtime'; export * from './pallets'; +export * from './node'; diff --git a/src/controllers/node/NodeNetworkController.ts b/src/controllers/node/NodeNetworkController.ts new file mode 100644 index 000000000..a9d132462 --- /dev/null +++ b/src/controllers/node/NodeNetworkController.ts @@ -0,0 +1,59 @@ +import { ApiPromise } from '@polkadot/api'; +import { RequestHandler } from 'express'; + +import { NodeNetworkService } from '../../services'; +import AbstractController from '../AbstractController'; + +/** + * GET information about the Substrate node's activity in the peer-to-peer network. + * + * Returns: + * - `nodeRoles`: Roles the node is running. + * - `numPeers`: Number of peers the node is connected to. + * - `isSyncing`: Whether or not the node is syncing. `False` indicates that the + * node is in sync. + * - `shouldHavePeers`: Whether or not the node should be connected to peers. Might + * be false for local chains or when running without discovery. + * - `localPeerId`: Local copy of the `PeerId`. + * - `localListenAddresses`: Multiaddresses that the local node is listening on. + * The addresses include a trailing `/p2p/` with the local PeerId, and are thus + * suitable to be passed to `system_addReservedPeer` or as a bootnode address + * for example. + * - `systemPeers`: array of + * - `peerId`: Peer ID. + * - `roles`: Roles the peer is running. + * - `protocolVersion`: Peer's protocol version. + * - `bestHash`: Hash of the best block on the peers canon chain. + * - `bestNumber`: Height of the best block on the peers canon chain. + * + * References: + * - `NodeRole`: https://github.com/paritytech/substrate/blob/master/client/rpc-api/src/system/helpers.rs#L80 + */ +export default class NodeNetworkController extends AbstractController< + NodeNetworkService +> { + constructor(api: ApiPromise) { + super(api, '/node/network', new NodeNetworkService(api)); + this.initRoutes(); + } + + protected initRoutes(): void { + this.safeMountAsyncGetHandlers([['', this.getNodeNetworking]]); + } + + /** + * GET information about the Substrate node's activity in the peer-to-peer network. + * + * @param _req Express Request + * @param res Express Response + */ + private getNodeNetworking: RequestHandler = async ( + _req, + res + ): Promise => { + NodeNetworkController.sanitizedSend( + res, + await this.service.fetchNetwork() + ); + }; +} diff --git a/src/controllers/node/NodeTransactionPoolController.ts b/src/controllers/node/NodeTransactionPoolController.ts new file mode 100644 index 000000000..f7003b6d6 --- /dev/null +++ b/src/controllers/node/NodeTransactionPoolController.ts @@ -0,0 +1,48 @@ +import { ApiPromise } from '@polkadot/api'; +import { RequestHandler } from 'express'; + +import { NodeTransactionPoolService } from '../../services'; +import AbstractController from '../AbstractController'; + +/** + * GET pending extrinsics from the Substrate node. + * + * Returns: + * - `pool`: array of + * - `hash`: H256 hash of the extrinsic. + * - `encodedExtrinsic`: Scale encoded extrinsic. + */ +export default class NodeTransactionPoolController extends AbstractController< + NodeTransactionPoolService +> { + constructor(api: ApiPromise) { + super( + api, + '/node/transaction-pool', + new NodeTransactionPoolService(api) + ); + this.initRoutes(); + } + + protected initRoutes(): void { + this.safeMountAsyncGetHandlers([['', this.getNodeTransactionPool]]); + } + + /** + ** GET pending extrinsics from the Substrate node. + * + * @param _req Express Request + * @param res Express Response + */ + private getNodeTransactionPool: RequestHandler = async ( + _req, + res + ): Promise => { + const hash = await this.api.rpc.chain.getFinalizedHead(); + + NodeTransactionPoolController.sanitizedSend( + res, + await this.service.fetchTransactionPool(hash) + ); + }; +} diff --git a/src/controllers/node/NodeVersionController.ts b/src/controllers/node/NodeVersionController.ts new file mode 100644 index 000000000..143bb5094 --- /dev/null +++ b/src/controllers/node/NodeVersionController.ts @@ -0,0 +1,39 @@ +import { ApiPromise } from '@polkadot/api'; +import { RequestHandler } from 'express'; + +import { NodeVersionService } from '../../services'; +import AbstractController from '../AbstractController'; + +/** + * GET information about the Substrates node's implementation and versioning. + * + * Returns: + * - `clientVersion`: Node binary version. + * - `clientImplName`: Node's implementation name. + * - `chain`: Node's chain name. + */ +export default class NodeVersionController extends AbstractController< + NodeVersionService +> { + constructor(api: ApiPromise) { + super(api, '/node/version', new NodeVersionService(api)); + this.initRoutes(); + } + + protected initRoutes(): void { + this.safeMountAsyncGetHandlers([['', this.getNodeVersion]]); + } + + /** + * GET information about the Substrates node's implementation and versioning. + * + * @param _req Express Request + * @param res Express Response + */ + getNodeVersion: RequestHandler = async (_req, res): Promise => { + NodeVersionController.sanitizedSend( + res, + await this.service.fetchVersion() + ); + }; +} diff --git a/src/controllers/node/index.ts b/src/controllers/node/index.ts new file mode 100644 index 000000000..a75808af9 --- /dev/null +++ b/src/controllers/node/index.ts @@ -0,0 +1,3 @@ +export { default as NodeNetwork } from './NodeNetworkController'; +export { default as NodeVersion } from './NodeVersionController'; +export { default as NodeTransactionPool } from './NodeTransactionPoolController'; diff --git a/src/main.ts b/src/main.ts index a0833297d..f96a1e80b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -66,6 +66,11 @@ async function main() { const stakingController = new controllers.PalletsStakingProgress(api); const vestingController = new controllers.AccountsVestingInfo(api); const metadataController = new controllers.Metadata(api); + const nodeNetworkController = new controllers.NodeNetwork(api); + const nodeVersionController = new controllers.NodeVersion(api); + const nodeTransactionPoolController = new controllers.NodeTransactionPool( + api + ); const claimsController = new controllers.Claims(api); const txArtifactsController = new controllers.TransactionMaterial(api); const txFeeEstimateController = new controllers.TransactionFeeEstimate(api); @@ -81,6 +86,9 @@ async function main() { stakingController, vestingController, metadataController, + nodeNetworkController, + nodeVersionController, + nodeTransactionPoolController, claimsController, txArtifactsController, txFeeEstimateController, diff --git a/src/services/index.ts b/src/services/index.ts index 1d6388c80..1b79b7f92 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -4,3 +4,4 @@ export * from './pallets'; export * from './transaction'; export * from './claims'; export * from './runtime'; +export * from './node'; diff --git a/src/services/node/NodeNetworkService.spec.ts b/src/services/node/NodeNetworkService.spec.ts new file mode 100644 index 000000000..9ba3ec8d7 --- /dev/null +++ b/src/services/node/NodeNetworkService.spec.ts @@ -0,0 +1,16 @@ +import { sanitizeNumbers } from '../../sanitize/sanitizeNumbers'; +import { mockApi } from '../test-helpers/mock'; +import * as nodeNetworkResponse from '../test-helpers/responses/node/network.json'; +import { NodeNetworkService } from '.'; + +const nodeNetworkService = new NodeNetworkService(mockApi); + +describe('NodeNetworkService', () => { + describe('fetchNetwork', () => { + it('works when ApiPromise works', async () => { + expect( + sanitizeNumbers(await nodeNetworkService.fetchNetwork()) + ).toStrictEqual(nodeNetworkResponse); + }); + }); +}); diff --git a/src/services/node/NodeNetworkService.ts b/src/services/node/NodeNetworkService.ts new file mode 100644 index 000000000..4e594ef7b --- /dev/null +++ b/src/services/node/NodeNetworkService.ts @@ -0,0 +1,36 @@ +import { INodeNetwork } from 'src/types/responses'; + +import { AbstractService } from '../AbstractService'; + +export class NodeNetworkService extends AbstractService { + async fetchNetwork(): Promise { + const [ + { peers: numPeers, isSyncing, shouldHavePeers }, + localPeerId, + nodeRoles, + localListenAddresses, + ] = await Promise.all([ + this.api.rpc.system.health(), + this.api.rpc.system.localPeerId(), + this.api.rpc.system.nodeRoles(), + this.api.rpc.system.localListenAddresses(), + ]); + + let peersInfo; + try { + peersInfo = await this.api.rpc.system.peers(); + } catch { + peersInfo = 'Cannot query system_peers from node.'; + } + + return { + nodeRoles, + numPeers, + isSyncing, + shouldHavePeers, + localPeerId, + localListenAddresses, + peersInfo, + }; + } +} diff --git a/src/services/node/NodeTransactionPoolService.spec.ts b/src/services/node/NodeTransactionPoolService.spec.ts new file mode 100644 index 000000000..11ad300d5 --- /dev/null +++ b/src/services/node/NodeTransactionPoolService.spec.ts @@ -0,0 +1,47 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +import { sanitizeNumbers } from '../../sanitize/sanitizeNumbers'; +import { + blockHash789629, + mockApi, + pendingExtrinsics, +} from '../test-helpers/mock'; +import * as transactionPoolResponse from '../test-helpers/responses/node/transactionPool.json'; +import { NodeTransactionPoolService } from '.'; + +const nodeTranstionPoolService = new NodeTransactionPoolService(mockApi); + +describe('NodeTransactionPoolService', () => { + describe('fetchTransactionPool', () => { + it('works when ApiPromiseWorks (no txs)', async () => { + expect( + sanitizeNumbers( + await nodeTranstionPoolService.fetchTransactionPool( + blockHash789629 + ) + ) + ).toStrictEqual({ pool: [] }); + }); + + it('works when ApiPromiseWorks (1 tx)', async () => { + const ext = mockApi.createType( + 'Extrinsic', + '0x4d0284d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d015c41b5e704d89787e5208b863fa815a146a19ade0cd95f2378815d72c52b2644c05f0dd6be3bf219b9963ac9ddeec8d379c0cd1d86d8f33f2c1d1a8006efc180050000001a00040500e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e0f0040767b10c403' + ); + + const pool = mockApi.createType('Vec', [ext]); + (mockApi.rpc.author as any).pendingExtrinsics = () => + Promise.resolve().then(() => pool); + + expect( + sanitizeNumbers( + await nodeTranstionPoolService.fetchTransactionPool( + blockHash789629 + ) + ) + ).toStrictEqual(transactionPoolResponse); + + (mockApi.rpc.author as any).pendingExtrinsics = pendingExtrinsics; + }); + }); +}); diff --git a/src/services/node/NodeTransactionPoolService.ts b/src/services/node/NodeTransactionPoolService.ts new file mode 100644 index 000000000..23e9e193e --- /dev/null +++ b/src/services/node/NodeTransactionPoolService.ts @@ -0,0 +1,23 @@ +import { BlockHash } from '@polkadot/types/interfaces'; +import { INodeTransactionPool } from 'src/types/responses'; + +import { AbstractService } from '../AbstractService'; + +export class NodeTransactionPoolService extends AbstractService { + async fetchTransactionPool(hash: BlockHash): Promise { + const api = await this.ensureMeta(hash); + + const extrinsics = await api.rpc.author.pendingExtrinsics(); + + const pool = extrinsics.map((ext) => { + return { + hash: ext.hash.toHex(), + encodedExtrinsic: ext.toHex(), + }; + }); + + return { + pool, + }; + } +} diff --git a/src/services/node/NodeVersionService.spec.ts b/src/services/node/NodeVersionService.spec.ts new file mode 100644 index 000000000..0825564f0 --- /dev/null +++ b/src/services/node/NodeVersionService.spec.ts @@ -0,0 +1,16 @@ +import { sanitizeNumbers } from '../../sanitize/sanitizeNumbers'; +import { mockApi } from '../test-helpers/mock'; +import * as nodeVersionResponse from '../test-helpers/responses/node/version.json'; +import { NodeVersionService } from '.'; + +const nodeVersionService = new NodeVersionService(mockApi); + +describe('NodeVersionService', () => { + describe('fetchVersion', () => { + it('works when ApiPromise works', async () => { + expect( + sanitizeNumbers(await nodeVersionService.fetchVersion()) + ).toStrictEqual(nodeVersionResponse); + }); + }); +}); diff --git a/src/services/node/NodeVersionService.ts b/src/services/node/NodeVersionService.ts new file mode 100644 index 000000000..b228a5a73 --- /dev/null +++ b/src/services/node/NodeVersionService.ts @@ -0,0 +1,23 @@ +import { INodeVersion } from 'src/types/responses'; + +import { AbstractService } from '../AbstractService'; + +export class NodeVersionService extends AbstractService { + async fetchVersion(): Promise { + const [ + { implName: clientImplName }, + chain, + clientVersion, + ] = await Promise.all([ + this.api.rpc.state.getRuntimeVersion(), + this.api.rpc.system.chain(), + this.api.rpc.system.version(), + ]); + + return { + clientVersion, + clientImplName, + chain, + }; + } +} diff --git a/src/services/node/index.ts b/src/services/node/index.ts new file mode 100644 index 000000000..e9d5a8a79 --- /dev/null +++ b/src/services/node/index.ts @@ -0,0 +1,3 @@ +export * from './NodeNetworkService'; +export * from './NodeVersionService'; +export * from './NodeTransactionPoolService'; diff --git a/src/services/test-helpers/mock/data/localListenAddresses.ts b/src/services/test-helpers/mock/data/localListenAddresses.ts new file mode 100644 index 000000000..645aae17e --- /dev/null +++ b/src/services/test-helpers/mock/data/localListenAddresses.ts @@ -0,0 +1,2 @@ +export const localListenAddressesHex = + '0x1045012f6970342f3132372e302e302e312f7463702f33303333332f7032702f313244334b6f6f57415a66686a79717a4674796435357665424a78545969516b5872614d584c704d4d6a355a6f3471756431485a49012f6970342f31302e3230312e302e322f7463702f33303333332f7032702f313244334b6f6f57415a66686a79717a4674796435357665424a78545969516b5872614d584c704d4d6a355a6f3471756431485a45012f6970342f31302e312e312e34332f7463702f33303333332f7032702f313244334b6f6f57415a66686a79717a4674796435357665424a78545969516b5872614d584c704d4d6a355a6f3471756431485a2d012f6970362f3a3a312f7463702f33303333332f7032702f313244334b6f6f57415a66686a79717a4674796435357665424a78545969516b5872614d584c704d4d6a355a6f3471756431485a'; diff --git a/src/services/test-helpers/mock/mockApi.ts b/src/services/test-helpers/mock/mockApi.ts index fc4f53ea8..cb66bb3fb 100644 --- a/src/services/test-helpers/mock/mockApi.ts +++ b/src/services/test-helpers/mock/mockApi.ts @@ -1,4 +1,5 @@ import { ApiPromise } from '@polkadot/api'; +import { Vec } from '@polkadot/types'; import { Option } from '@polkadot/types/codec'; import { AccountId, @@ -21,6 +22,7 @@ import { testAddressController, } from '.'; import { events789629 } from './data/events789629Hex'; +import { localListenAddressesHex } from './data/localListenAddresses'; import { validators789629Hex } from './data/validators789629Hex'; const eventsAt = (_hash: Hash) => @@ -47,6 +49,8 @@ const getRuntimeVersion = () => specName: polkadotRegistry.createType('Text', 'polkadot'), specVersion: polkadotRegistry.createType('u32', 16), transactionVersion: polkadotRegistry.createType('u32', 2), + implVersion: polkadotRegistry.createType('u32', 0), + implName: polkadotRegistry.createType('Text', 'parity-polkadot'), }; }); @@ -100,6 +104,11 @@ const currentIndexAt = (_hash: Hash) => polkadotRegistry.createType('SessionIndex', 330) ); +const version = () => + Promise.resolve().then(() => + polkadotRegistry.createType('Text', '0.8.22-c6ee8675-x86_64-linux-gnu') + ); + export const activeEraAt = (_hash: Hash): Promise> => Promise.resolve().then(() => polkadotRegistry.createType('Option', { @@ -195,6 +204,32 @@ export const submitExtrinsic = (_extrinsic: string): Promise => const getFinalizedHead = () => Promise.resolve().then(() => blockHash789629); +const health = () => + Promise.resolve().then(() => + polkadotRegistry.createType('Health', '0x7a000000000000000001') + ); + +const localListenAddresses = () => + Promise.resolve().then(() => + polkadotRegistry.createType('Vec', localListenAddressesHex) + ); + +const nodeRoles = () => + Promise.resolve().then(() => + polkadotRegistry.createType('Vec', '0x0400') + ); + +const localPeerId = () => + Promise.resolve().then(() => + polkadotRegistry.createType( + 'Text', + '0x313244334b6f6f57415a66686a79717a4674796435357665424a78545969516b5872614d584c704d4d6a355a6f3471756431485a' + ) + ); + +export const pendingExtrinsics = (): Promise> => + Promise.resolve().then(() => polkadotRegistry.createType('Vec')); + export const tx = (): Extrinsic => polkadotRegistry.createType('Extrinsic', balancesTransferValid); @@ -278,12 +313,18 @@ export const mockApi = ({ }, system: { chain, + health, + localListenAddresses, + nodeRoles, + localPeerId, + version, }, payment: { queryInfo: queryInfoBalancesTransfer, }, author: { submitExtrinsic, + pendingExtrinsics, }, }, derive: { diff --git a/src/services/test-helpers/responses/node/network.json b/src/services/test-helpers/responses/node/network.json new file mode 100644 index 000000000..a38dd5546 --- /dev/null +++ b/src/services/test-helpers/responses/node/network.json @@ -0,0 +1,18 @@ +{ + "nodeRoles": [ + { + "Full": null + } + ], + "isSyncing": false, + "numPeers": "122", + "shouldHavePeers": true, + "localPeerId": "12D3KooWAZfhjyqzFtyd55veBJxTYiQkXraMXLpMMj5Zo4qud1HZ", + "localListenAddresses": [ + "/ip4/127.0.0.1/tcp/30333/p2p/12D3KooWAZfhjyqzFtyd55veBJxTYiQkXraMXLpMMj5Zo4qud1HZ", + "/ip4/10.201.0.2/tcp/30333/p2p/12D3KooWAZfhjyqzFtyd55veBJxTYiQkXraMXLpMMj5Zo4qud1HZ", + "/ip4/10.1.1.43/tcp/30333/p2p/12D3KooWAZfhjyqzFtyd55veBJxTYiQkXraMXLpMMj5Zo4qud1HZ", + "/ip6/::1/tcp/30333/p2p/12D3KooWAZfhjyqzFtyd55veBJxTYiQkXraMXLpMMj5Zo4qud1HZ" + ], + "peersInfo": "Cannot query system_peers from node." +} diff --git a/src/services/test-helpers/responses/node/transactionPool.json b/src/services/test-helpers/responses/node/transactionPool.json new file mode 100644 index 000000000..3c465c05f --- /dev/null +++ b/src/services/test-helpers/responses/node/transactionPool.json @@ -0,0 +1,8 @@ +{ + "pool": [ + { + "hash": "0x20f81f961a114f74b4192a60016fb47b79dcb391b319f1625e9fcb3b87293161", + "encodedExtrinsic": "0x4d0284d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d015c41b5e704d89787e5208b863fa815a146a19ade0cd95f2378815d72c52b2644c05f0dd6be3bf219b9963ac9ddeec8d379c0cd1d86d8f33f2c1d1a8006efc180050000001a00040500e659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e0f0040767b10c403" + } + ] +} diff --git a/src/services/test-helpers/responses/node/version.json b/src/services/test-helpers/responses/node/version.json new file mode 100644 index 000000000..12eead6f4 --- /dev/null +++ b/src/services/test-helpers/responses/node/version.json @@ -0,0 +1,5 @@ +{ + "clientVersion": "0.8.22-c6ee8675-x86_64-linux-gnu", + "clientImplName": "parity-polkadot", + "chain": "Polkadot" +} diff --git a/src/types/responses/Extrinsic.ts b/src/types/responses/Extrinsic.ts index bdd93523f..1a75fc346 100644 --- a/src/types/responses/Extrinsic.ts +++ b/src/types/responses/Extrinsic.ts @@ -1,6 +1,6 @@ import { Compact } from '@polkadot/types'; -import Address from '@polkadot/types/generic/Address'; import { + Address, Balance, EcdsaSignature, Ed25519Signature, diff --git a/src/types/responses/NodeNetwork.ts b/src/types/responses/NodeNetwork.ts new file mode 100644 index 000000000..5b36af21a --- /dev/null +++ b/src/types/responses/NodeNetwork.ts @@ -0,0 +1,13 @@ +import { Text, u64, Vec } from '@polkadot/types'; +import { NodeRole, PeerInfo } from '@polkadot/types/interfaces'; +import Bool from '@polkadot/types/primitive/Bool'; + +export interface INodeNetwork { + nodeRoles: Vec; + numPeers: u64; + isSyncing: Bool; + shouldHavePeers: Bool; + localPeerId: Text; + localListenAddresses: Vec; + peersInfo: string | Vec; +} diff --git a/src/types/responses/NodeTransactionPool.ts b/src/types/responses/NodeTransactionPool.ts new file mode 100644 index 000000000..4f1d816c8 --- /dev/null +++ b/src/types/responses/NodeTransactionPool.ts @@ -0,0 +1,8 @@ +interface IPoolExtrinsic { + hash: string; + encodedExtrinsic: string; +} + +export interface INodeTransactionPool { + pool: IPoolExtrinsic[]; +} diff --git a/src/types/responses/NodeVersion.ts b/src/types/responses/NodeVersion.ts new file mode 100644 index 000000000..813cb065f --- /dev/null +++ b/src/types/responses/NodeVersion.ts @@ -0,0 +1,7 @@ +import { Text } from '@polkadot/types'; + +export interface INodeVersion { + clientVersion: Text; + clientImplName: Text; + chain: Text; +} diff --git a/src/types/responses/index.ts b/src/types/responses/index.ts index 23dc008c2..04adb48cb 100644 --- a/src/types/responses/index.ts +++ b/src/types/responses/index.ts @@ -9,3 +9,6 @@ export * from './AccountStakingInfo'; export * from './AccountVestingInfo'; export * from './TransactionMaterial'; export * from './Extrinsic'; +export * from './NodeNetwork'; +export * from './NodeVersion'; +export * from './NodeTransactionPool';