|
|
|
from .rpc.request import (
|
|
|
|
rpc_request
|
|
|
|
)
|
|
|
|
|
|
|
|
from .exceptions import (
|
|
|
|
InvalidRPCReplyError
|
|
|
|
)
|
|
|
|
|
|
|
|
_default_endpoint = 'http://localhost:9500'
|
|
|
|
_default_timeout = 30
|
|
|
|
|
|
|
|
#############################
|
|
|
|
# Node / network level RPCs #
|
|
|
|
#############################
|
|
|
|
def get_bad_blocks(endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
[WIP] Get list of bad blocks in memory of specific node
|
|
|
|
Known issues with RPC not returning correctly
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list of bad blocks in node memory
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#0ba3c7b6-6aa9-46b8-9c84-f8782e935951
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getCurrentBadBlocks'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def chain_id(endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Chain id of the chain
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int that represents the chain id
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/343dbe89b3c105f8104ab877769070ba6fdd0133/rpc/blockchain.go#L44
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_chainId'
|
|
|
|
try:
|
|
|
|
data = rpc_request(method, endpoint=endpoint, timeout=timeout)
|
|
|
|
return data['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_node_metadata(endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get config for the node
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
dict with the following keys:
|
|
|
|
blskey: :obj:`list` of BLS keys on the node
|
|
|
|
version: :obj:`str` representing the Harmony binary version
|
|
|
|
network: :obj:`str` the Network name that the node is on (Mainnet or Testnet)
|
|
|
|
chain-config: :obj:`dict` with the following keys (more are added over time):
|
|
|
|
chain-id: :obj:`int` Chain ID of the network
|
|
|
|
cross-tx-epoch: :obj:`int` Epoch at which cross shard transactions were enabled
|
|
|
|
cross-link-epoch: :obj:`int` Epoch at which cross links were enabled
|
|
|
|
staking-epoch: :obj:`int` Epoch at which staking was enabled
|
|
|
|
prestaking-epoch: :obj:`int` Epoch at which staking features without election were allowed
|
|
|
|
quick-unlock-epoch: :obj:`int` Epoch at which undelegations unlocked in one epoch
|
|
|
|
eip155-epoch: :obj:`int` Epoch at with EIP155 was enabled
|
|
|
|
s3-epoch: :obj:`int` Epoch at which Mainnet V0 was launched
|
|
|
|
receipt-log-epoch: :obj:`int` Epoch at which receipt logs were enabled
|
|
|
|
eth-compatible-chain-id: :obj:`int` EVM network compatible chain ID
|
|
|
|
eth-compatible-epoch: :obj:`int` Epoch at which EVM compatibility was launched
|
|
|
|
eth-compatible-shard-0-chain-id: :obj:`int` EVM network compatible chain ID on shard 0
|
|
|
|
five-seconds-epoch: :obj:`int` Epoch at which five second finality was enabled and block rewards adjusted to 17.5 ONE/block
|
|
|
|
istanbul-epoch: :obj:`int` Epoch at which Ethereum's Istanbul upgrade was added to Harmony
|
|
|
|
no-early-unlock-epoch: :obj:`int` Epoch at which early unlock of tokens was disabled (https://github.com/harmony-one/harmony/pull/3605)
|
|
|
|
redelegation-epoch: :obj:`int` Epoch at which redelegation was enabled (staking)
|
|
|
|
sixty-percent-epoch: :obj:`int` Epoch when internal voting power reduced from 68% to 60%
|
|
|
|
two-seconds-epoch: :obj:`int` Epoch at which two second finality was enabled and block rewards adjusted to 7 ONE/block
|
|
|
|
is-leader: :obj:`bool` Whether the node is currently leader or not
|
|
|
|
shard-id: :obj:`int` Shard that the node is on
|
|
|
|
current-epoch: :obj:`int` Current epoch
|
|
|
|
blocks-per-epoch: :obj:`int` Number of blocks per epoch (only available on Shard 0)
|
|
|
|
role: :obj:`str` Node type(Validator or ExplorerNode)
|
|
|
|
dns-zone: :obj:`str`: Name of the DNS zone
|
|
|
|
is-archival: :obj:`bool` Whether the node is currently in state pruning mode or not
|
|
|
|
node-unix-start-time: :obj:`int` Start time of node un Unix time
|
|
|
|
p2p-connectivity: :obj:`dict` with the following keys:
|
|
|
|
connected: :obj:`int` Number of connected peers
|
|
|
|
not-connected: :obj:`int` Number of peers which are known but not connected
|
|
|
|
total-known-peers: :obj:`int` Number of peers which are known
|
|
|
|
peerid: :obj:`str` PeerID, the pubkey for communication
|
|
|
|
consensus: :obj:`dict` with following keys:
|
|
|
|
blocknum: :obj:`int` Current block number of the consensus
|
|
|
|
finality: :obj:`int` The finality time in milliseconds of previous consensus
|
|
|
|
mode: :obj:`str` Current consensus mode
|
|
|
|
phase: :obj:`str` Current consensus phase
|
|
|
|
viewChangeId: :obj:`int` Current view changing ID
|
|
|
|
viewId: :obj:`int` Current view ID
|
|
|
|
sync-peers: dictionary of connected sync peers for each shard
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#03c39b56-8dfc-48ce-bdad-f85776dd8aec
|
|
|
|
https://github.com/harmony-one/harmony/blob/v1.10.2/internal/params/config.go#L233 for chain-config dict
|
|
|
|
https://github.com/harmony-one/harmony/blob/9f320436ff30d9babd957bc5f2e15a1818c86584/node/api.go#L110 for consensus dict
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getNodeMetadata'
|
|
|
|
try:
|
|
|
|
metadata = rpc_request(method, endpoint=endpoint, timeout=timeout)
|
|
|
|
return metadata['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_peer_info(endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get peer info for the node
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
if has peers, dict with the following keys:
|
|
|
|
blocked-peers: :obj:`list` list of blocked peers by peer ID
|
|
|
|
connected-peers: :obj:`list` list of connected peers by topic
|
|
|
|
peers: :obj:`list` list of connected peer IDs
|
|
|
|
topic: :obj:`list` topic of the connection, for example:
|
|
|
|
'harmony/0.0.1/client/beacon'
|
|
|
|
'harmony/0.0.1/node/beacon'
|
|
|
|
peerid: :obj:`str` Peer ID of the node
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
See also
|
|
|
|
--------
|
|
|
|
get_node_metadata
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getPeerInfo'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def protocol_version(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get the current Harmony protocol version this node supports
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
The current Harmony protocol version this node supports
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#cab9fcc2-e3cd-4bc9-b62a-13e4e046e2fd
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_protocolVersion'
|
|
|
|
try:
|
|
|
|
value = rpc_request(method, endpoint=endpoint, timeout=timeout)
|
|
|
|
return value['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_num_peers(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get number of peers connected to the node
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Number of connected peers
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#09287e0b-5b61-4d18-a0f1-3afcfc3369c1
|
|
|
|
"""
|
|
|
|
method = 'net_peerCount'
|
|
|
|
try: # Number of peers represented as a hex string
|
|
|
|
return int(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'], 16)
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_version(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get version of the EVM network (https://chainid.network/)
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Version if the network
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#09287e0b-5b61-4d18-a0f1-3afcfc3369c1
|
|
|
|
"""
|
|
|
|
method = 'net_version'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'], 16) # this is hexadecimal
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def in_sync(endpoint=_default_endpoint, timeout=_default_timeout) -> bool:
|
|
|
|
"""
|
|
|
|
Whether the shard chain is in sync or syncing (not out of sync)
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
bool, True if in sync
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L690
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_inSync'
|
|
|
|
try:
|
|
|
|
return bool(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def beacon_in_sync(endpoint=_default_endpoint, timeout=_default_timeout) -> bool:
|
|
|
|
"""
|
|
|
|
Whether the beacon chain is in sync or syncing (not out of sync)
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
bool, True if sync
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L695
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_beaconInSync'
|
|
|
|
try:
|
|
|
|
return bool(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_staking_epoch(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get epoch number when blockchain switches to EPoS election
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Epoch at which blockchain switches to EPoS election
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
---------
|
|
|
|
https://github.com/harmony-one/harmony/blob/v1.10.2/internal/params/config.go#L233
|
|
|
|
|
|
|
|
See also
|
|
|
|
------
|
|
|
|
get_node_metadata
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getNodeMetadata'
|
|
|
|
try:
|
|
|
|
data = rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
return int(data['chain-config']['staking-epoch'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_prestaking_epoch(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get epoch number when blockchain switches to allow staking features without election
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Epoch at which blockchain switches to allow staking features without election
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/v1.10.2/internal/params/config.go#L233
|
|
|
|
|
|
|
|
See also
|
|
|
|
------
|
|
|
|
get_node_metadata
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getNodeMetadata'
|
|
|
|
try:
|
|
|
|
data = rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
return int(data['chain-config']['prestaking-epoch'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
########################
|
|
|
|
# Sharding information #
|
|
|
|
########################
|
|
|
|
def get_shard(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get shard ID of the node
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Shard ID of node
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
See also
|
|
|
|
--------
|
|
|
|
get_node_metadata
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getNodeMetadata'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']['shard-id']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_sharding_structure(endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
Get network sharding structure
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list of dictionaries of shards; each shard has the following keys
|
|
|
|
shardID: :obj:`int` ID of the shard
|
|
|
|
current: :obj:`bool` True if the endpoint passed is the same shard as this one
|
|
|
|
http: :obj:`str` Link to the HTTP(s) API endpoint
|
|
|
|
wss: :obj:`str` Link to the Web socket endpoint
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#9669d49e-43c1-47d9-a3fd-e7786e5879df
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getShardingStructure'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
#############################
|
|
|
|
# Current status of network #
|
|
|
|
#############################
|
|
|
|
def get_leader_address(endpoint=_default_endpoint, timeout=_default_timeout) -> str:
|
|
|
|
"""
|
|
|
|
Get current leader one address
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
str
|
|
|
|
One address of current leader
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#8b08d18c-017b-4b44-a3c3-356f9c12dacd
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getLeader'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def is_last_block(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> bool:
|
|
|
|
"""
|
|
|
|
If the block at block_num is the last block
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to fetch
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
bool: True if the block is last epoch block, False otherwise
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L286
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num,
|
|
|
|
]
|
|
|
|
method = 'hmyv2_isLastBlock'
|
|
|
|
try:
|
|
|
|
return bool(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def epoch_last_block(epoch, endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Returns the number of the last block in the epoch
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
epoch: :obj:`int`
|
|
|
|
Epoch for which the last block is to be fetched
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int: Number of the last block in the epoch
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L294
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
epoch,
|
|
|
|
]
|
|
|
|
method = 'hmyv2_epochLastBlock'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_circulating_supply(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get current circulation supply of tokens in ONE
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
str
|
|
|
|
Current circulation supply (with decimal point)
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#8398e818-ac2d-4ad8-a3b4-a00927395044
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getCirculatingSupply'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_total_supply(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get total number of pre-mined tokens
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
str
|
|
|
|
Total number of pre-mined tokens, or None if no such tokens
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#3dcea518-9e9a-4a20-84f4-c7a0817b2196
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getTotalSupply'
|
|
|
|
try:
|
|
|
|
rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_number(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get current block number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Current block number
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#2602b6c4-a579-4b7c-bce8-85331e0db1a7
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_blockNumber'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_current_epoch(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get current epoch number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Current epoch number
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#9b8e98b0-46d1-4fa0-aaa6-317ff1ddba59
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getEpoch'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_last_cross_links(endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
Get last cross shard links
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list of dictionaries, one for each shard except the one at the endpoint; each representing
|
|
|
|
the last block on the beacon-chain
|
|
|
|
hash: :obj:`str` Parent block hash
|
|
|
|
block-number: :obj:`int` Block number
|
|
|
|
view-id: :obj:`int` View ID
|
|
|
|
signature: :obj:`str` Hex representation of aggregated signature
|
|
|
|
signature-bitmap: :obj:`str` Hex representation of aggregated signature bitmap
|
|
|
|
shard-id: :obj:`str` (other) shard ID
|
|
|
|
epoch-number: :obj:`int` Block epoch
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#4994cdf9-38c4-4b1d-90a8-290ddaa3040e
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getLastCrossLinks'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_gas_price(endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get network gas price
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Network gas price
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#1d53fd59-a89f-436c-a171-aec9d9623f48
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_gasPrice'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
##############
|
|
|
|
# Block RPCs #
|
|
|
|
##############
|
|
|
|
def get_latest_header(endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get block header of latest block
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
dict with the following keys:
|
|
|
|
blockHash: :obj:`str` Block hash
|
|
|
|
blockNumber: :obj:`int` Block number
|
|
|
|
shardID: :obj:`int` Shard ID
|
|
|
|
leader: :obj:`str` Wallet address of leader that proposed this block if prestaking, otherwise sha256 hash of leader's public bls key
|
|
|
|
viewID: :obj:`int` View ID of the block
|
|
|
|
epoch: :obj:`int` Epoch of block
|
|
|
|
timestamp: :obj:`str` Timestamp that the block was finalized in human readable format
|
|
|
|
unixtime: :obj:`int` Timestamp that the block was finalized in Unix time
|
|
|
|
lastCommitSig: :obj:`str` Hex representation of aggregated signatures of the previous block
|
|
|
|
lastCommitBitmap: :obj:`str` Hex representation of aggregated signature bitmap of the previous block
|
|
|
|
crossLinks: list of dicts describing the cross shard links, each dict to have the following keys:
|
|
|
|
block-number: :obj:`int` Number of the cross link block
|
|
|
|
epoch-number: :obj:`int` Epoch of the cross link block
|
|
|
|
hash: :obj:`str` Hash of the cross link block
|
|
|
|
shard-id: :obj:`int` Shard ID for the cross link (besides the shard at endpoint)
|
|
|
|
signature: :obj:`str` Aggregated signature of the cross link block
|
|
|
|
siganture-bitmap: :obj:`str` Aggregated signature bitmap of the cross link block
|
|
|
|
view-id: :obj:`int` View ID of the cross link block
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#73fc9b97-b048-4b85-8a93-4d2bf1da54a6
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_latestHeader'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_header_by_number(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get block header of block at block_num
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Number of the block whose header is requested
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
See get_latest_header for header structure
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#01148e4f-72bb-426d-a123-718a161eaec0
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getHeaderByNumber'
|
|
|
|
params = [
|
|
|
|
block_num
|
|
|
|
]
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_latest_chain_headers(endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get block header of latest block for beacon chain & shard chain
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
dict with two keys:
|
|
|
|
beacon-chain-header: :obj:`dict` with the following keys, applicable to the beacon chain (cross shard links)
|
|
|
|
shard-chain-header: :obj:`dict` with the following keys, applicable to the shard chain
|
|
|
|
difficulty: legacy
|
|
|
|
epoch: :obj:`int` Epoch of the block
|
|
|
|
extraData: legacy
|
|
|
|
gasLimit: legacy
|
|
|
|
gasUsed: legacy
|
|
|
|
hash: :obj:`int` Hash of the block
|
|
|
|
logsBloom: legacy
|
|
|
|
miner: legacy
|
|
|
|
mixHash: legacy
|
|
|
|
nonce: legacy
|
|
|
|
number: :obj:`int` Block number
|
|
|
|
parentHash: legacy
|
|
|
|
receiptsRoot: legacy
|
|
|
|
sha3Uncles: legacy
|
|
|
|
shardID :obj:`int` Shard ID
|
|
|
|
stateRoot: legacy
|
|
|
|
timestamp: legacy
|
|
|
|
transactionsRoot: legacy
|
|
|
|
viewID: View ID
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#7625493d-16bf-4611-8009-9635d063b4c0
|
|
|
|
"""
|
|
|
|
method = 'hmyv2_getLatestChainHeaders'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_by_number(block_num, full_tx=False, include_tx=False, include_staking_tx=False,
|
|
|
|
include_signers=False, endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get block by number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to fetch
|
|
|
|
full_tx: :obj:`bool`, optional
|
|
|
|
Include full transactions data for the block
|
|
|
|
include_tx: :obj:`bool`, optional
|
|
|
|
Include regular transactions for the block
|
|
|
|
include_staking_tx: :obj:`bool`, optional
|
|
|
|
Include staking transactions for the block
|
|
|
|
include_signers: :obj:`bool`, optional
|
|
|
|
Include list of signers for the block
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
dict with the following keys
|
|
|
|
difficulty: legacy
|
|
|
|
epoch: :obj:`int` Epoch number of block
|
|
|
|
extraData: :obj:`str` Hex representation of extra data in the block
|
|
|
|
gasLimit: :obj:`int` Maximum gas that can be used for transactions in the block
|
|
|
|
gasUsed: :obj:`int` Gas that was actually used for transactions in the block
|
|
|
|
hash: :obj:`str` Block hash
|
|
|
|
logsBloom: :obj:`str` Bloom logs
|
|
|
|
miner: :obj:`str` Wallet address of the leader that proposed this block
|
|
|
|
mixHash: legacy
|
|
|
|
nonce: legacy
|
|
|
|
number: :obj:`int` Block number
|
|
|
|
parentHash: :obj:`str` Hash of parent block
|
|
|
|
receiptsRoot: :obj:`str` Hash of transaction receipt root
|
|
|
|
signers: :obj:`list` List of signers (only if include_signers is set to True)
|
|
|
|
size: :obj:`int` Block size in bytes
|
|
|
|
stakingTransactions: :obj:`list`
|
|
|
|
if full_tx is True: List of dictionaries, each containing a staking transaction (see account.get_staking_transaction_history)
|
|
|
|
if full_tx is False: List of staking transaction hashes
|
|
|
|
stateRoot: :obj:`str` Hash of state root
|
|
|
|
timestamp: :obj:`int` Unix timestamp of the block
|
|
|
|
transactions: :obj:`list`
|
|
|
|
if full_tx is True: List of dictionaries, each containing a transaction (see account.get_transaction_history)
|
|
|
|
if full_tx is False: List of transaction hashes
|
|
|
|
transactionsRoot: :obj:`str` Hash of transactions root
|
|
|
|
uncles: :obj:`str` legacy
|
|
|
|
viewID: :obj:`int` View ID
|
|
|
|
transactionsInEthHash: :obj:`str` Transactions in ethereum hash
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#52f8a4ce-d357-46f1-83fd-d100989a8243
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num,
|
|
|
|
{
|
|
|
|
'inclTx': include_tx,
|
|
|
|
'fullTx': full_tx,
|
|
|
|
'inclStaking': include_staking_tx,
|
|
|
|
'withSigners': include_signers,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockByNumber'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_by_hash(block_hash, full_tx=False, include_tx=False, include_staking_tx=False,
|
|
|
|
include_signers=False, endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get block by hash
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_hash: :obj:`str`
|
|
|
|
Block hash to fetch
|
|
|
|
full_tx: :obj:`bool`, optional
|
|
|
|
Include full transactions data for the block
|
|
|
|
include_tx: :obj:`bool`, optional
|
|
|
|
Include regular transactions for the block
|
|
|
|
include_staking_tx: :obj:`bool`, optional
|
|
|
|
Include staking transactions for the block
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
See get_block_by_number for block structure
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#6a49ec47-1f74-4732-9f04-e5d76160bd5c
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_hash,
|
|
|
|
{
|
|
|
|
'inclTx': include_tx,
|
|
|
|
'fullTx': full_tx,
|
|
|
|
'inclStaking': include_staking_tx,
|
|
|
|
'withSigners': include_signers,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockByHash'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_transaction_count_by_number(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get transaction count for specific block number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to get transaction count for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
include_full_tx: :obj:`bool`, optional
|
|
|
|
Include list of full transactions data for each block
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Number of transactions in the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#26c5adfb-d757-4595-9eb7-c6efef63df32
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockTransactionCountByNumber'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_transaction_count_by_hash(block_hash, endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get transaction count for specific block hash
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_hash: :obj:`str`
|
|
|
|
Block hash to get transaction count
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
include_full_tx: :obj:`bool`, optional
|
|
|
|
Include list of full transactions data for each block
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Number of transactions in the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#66c68844-0208-49bb-a83b-08722bc113eb
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_hash
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockTransactionCountByHash'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_staking_transaction_count_by_number(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get staking transaction count for specific block number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to get transaction count for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
include_full_tx: :obj:`bool`, optional
|
|
|
|
Include list of full transactions data for each block
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Number of staking transactions in the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/transaction.go#L494
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockStakingTransactionCountByNumber'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_staking_transaction_count_by_hash(block_hash, endpoint=_default_endpoint, timeout=_default_timeout) -> int:
|
|
|
|
"""
|
|
|
|
Get staking transaction count for specific block hash
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_hash: :obj:`str`
|
|
|
|
Block hash to get transaction count
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
include_full_tx: :obj:`bool`, optional
|
|
|
|
Include list of full transactions data for each block
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int
|
|
|
|
Number of transactions in the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/transaction.go#L523
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_hash
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockStakingTransactionCountByHash'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_blocks(start_block, end_block, full_tx=False, include_tx=False, include_staking_tx=False,
|
|
|
|
include_signers=False, endpoint=_default_endpoint, timeout=_default_timeout
|
|
|
|
) -> list:
|
|
|
|
"""
|
|
|
|
Get list of blocks from a range
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
start_block: :obj:`int`
|
|
|
|
First block to fetch (inclusive)
|
|
|
|
end_block: :obj:`int`
|
|
|
|
Last block to fetch (inclusive)
|
|
|
|
full_tx: :obj:`bool`, optional
|
|
|
|
Include full transactions data for the block
|
|
|
|
include_tx: :obj:`bool`, optional
|
|
|
|
Include regular transactions for the block
|
|
|
|
include_staking_tx: :obj:`bool`, optional
|
|
|
|
Include staking transactions for the block
|
|
|
|
include_signers: :obj:`bool`, optional
|
|
|
|
Include list of signers for the block
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list of blocks, see get_block_by_number for block structure
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#ab9bdc59-e482-436c-ab2f-10df215cd0bd
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
start_block,
|
|
|
|
end_block,
|
|
|
|
{
|
|
|
|
'withSigners': include_signers,
|
|
|
|
'fullTx': full_tx,
|
|
|
|
'inclStaking': include_staking_tx,
|
|
|
|
'inclTx': include_tx
|
|
|
|
},
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlocks'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_signers(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
Get list of block signers for specific block number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to get signers for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list
|
|
|
|
List of one addresses that signed the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#1e4b5f41-9db6-4dea-92fb-4408db78e622
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockSigners'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_block_signers_keys(block_num, endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
Get list of block signer public bls keys for specific block number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to get signer keys for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list
|
|
|
|
List of bls public keys that signed the block
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#9f9c8298-1a4e-4901-beac-f34b59ed02f1
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getBlockSignerKeys'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def is_block_signer(block_num, address, endpoint=_default_endpoint, timeout=_default_timeout) -> bool:
|
|
|
|
"""
|
|
|
|
Determine if the account at address is a signer for the block at block_num
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
block_num: :obj:`int`
|
|
|
|
Block number to check
|
|
|
|
address: :obj:`str`
|
|
|
|
Address to check
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
bool: True if the address was a signer for block_num, False otherwise
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L368
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
block_num,
|
|
|
|
address
|
|
|
|
]
|
|
|
|
method = 'hmyv2_isBlockSigner'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_signed_blocks(address, endpoint=_default_endpoint, timeout=_default_timeout) -> bool:
|
|
|
|
"""
|
|
|
|
The number of blocks a particular validator signed for last blocksPeriod (1 epoch)
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
address: :obj:`str`
|
|
|
|
Address to check
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
int: Number of blocks signed by account at address for last blocksPeriod
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://github.com/harmony-one/harmony/blob/1a8494c069dc3f708fdf690456713a2411465199/rpc/blockchain.go#L406
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
address
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getSignedBlocks'
|
|
|
|
try:
|
|
|
|
return int(rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result'])
|
|
|
|
except (KeyError, TypeError) as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_validators(epoch, endpoint=_default_endpoint, timeout=_default_timeout) -> dict:
|
|
|
|
"""
|
|
|
|
Get list of validators for specific epoch number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
epoch: :obj:`int`
|
|
|
|
Epoch to get list of validators for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
dict with the following keys
|
|
|
|
shardID: :obj:`int` ID of the shard
|
|
|
|
validators: :obj:`list` of dictionaries, each with the following keys
|
|
|
|
address: :obj:`str` address of the validator
|
|
|
|
balance: :obj:`int` balance of the validator in ATTO
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#4dfe91ad-71fa-4c7d-83f3-d1c86a804da5
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
epoch
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getValidators'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|
|
|
|
|
|
|
|
def get_validator_keys(epoch, endpoint=_default_endpoint, timeout=_default_timeout) -> list:
|
|
|
|
"""
|
|
|
|
Get list of validator public bls keys for specific epoch number
|
|
|
|
|
|
|
|
Parameters
|
|
|
|
----------
|
|
|
|
epoch: :obj:`int`
|
|
|
|
Epoch to get list of validator keys for
|
|
|
|
endpoint: :obj:`str`, optional
|
|
|
|
Endpoint to send request to
|
|
|
|
timeout: :obj:`int`, optional
|
|
|
|
Timeout in seconds
|
|
|
|
|
|
|
|
Returns
|
|
|
|
-------
|
|
|
|
list
|
|
|
|
List of bls public keys in the validator committee
|
|
|
|
|
|
|
|
Raises
|
|
|
|
------
|
|
|
|
InvalidRPCReplyError
|
|
|
|
If received unknown result from endpoint
|
|
|
|
|
|
|
|
API Reference
|
|
|
|
-------------
|
|
|
|
https://api.hmny.io/#1439b580-fa3c-4d44-a79d-303390997a8c
|
|
|
|
"""
|
|
|
|
params = [
|
|
|
|
epoch
|
|
|
|
]
|
|
|
|
method = 'hmyv2_getValidatorKeys'
|
|
|
|
try:
|
|
|
|
return rpc_request(method, params=params, endpoint=endpoint, timeout=timeout)['result']
|
|
|
|
except KeyError as e:
|
|
|
|
raise InvalidRPCReplyError(method, endpoint) from e
|