from __future__ import annotations
import os
from typing import Any
import requests
from matic.json_types import CheckpointedBlock
from matic.utils.polyfill import removeprefix, removesuffix
__all__ = [
'DEFAULT_ABI_STORE_URL',
'DEFAULT_PROOF_API_URL',
'get_abi',
'get_address',
'get_block_included',
'get_proof',
]
DEFAULT_ABI_STORE_URL: str = os.getenv(
'MATIC_ABI_STORE', 'https://static.matic.network/network'
)
"""Default url of ABI store. Can be altered if needed."""
DEFAULT_PROOF_API_URL: str = os.getenv('MATIC_PROOF_API', '')
"""Default url of proof API. Must be set to use fast proofs."""
[docs]def get_abi(
network: str,
version: str,
bridge_type: str,
contract_name: str,
base_url: str | None = None,
) -> dict[str, Any]:
"""Get ABI dict for contract."""
base_url = removesuffix(base_url or DEFAULT_ABI_STORE_URL, '/')
url = f'{base_url}/{network}/{version}/artifacts/{bridge_type}/{contract_name}.json'
return requests.get(url).json()['abi']
[docs]def get_address(
network: str, version: str, base_url: str | None = None
) -> dict[str, Any]:
"""Fetch dictionary with addresses of contracts deployed on network."""
base_url = removesuffix(base_url or DEFAULT_ABI_STORE_URL, '/')
url = f'{base_url}/{network}/{version}/index.json'
return requests.get(url).json()
def _create_proof_url(network: str, url: str, base_url: str | None = None) -> str:
base_url = removesuffix(base_url or DEFAULT_PROOF_API_URL, '/')
if not base_url:
raise RuntimeError('Please set DEFAULT_PROOF_API_URL or pass base_url.')
url = removeprefix(url, '/')
return f'{base_url}/{"matic" if network == "mainnet" else "mumbai"}/{url}'
[docs]def get_block_included(
network: str, block_number: int, base_url: str | None = None
) -> CheckpointedBlock:
"""Get block information by number."""
url = _create_proof_url(network, f'/block-included/{block_number}')
data = requests.get(url).json()
return CheckpointedBlock(
header_block_number=int(data['headerBlockNumber'], 16),
block_number=int(data['blockNumber']),
start=int(data['start']),
end=int(data['end']),
proposer=data['proposer'],
root=data['root'],
created_at=int(data['createdAt']),
message=data['message'],
)
[docs]def get_proof(
network: str, start: int, end: int, block_number: int, base_url: str | None = None
) -> bytes:
"""Get proof from API."""
url = _create_proof_url(
network,
f'/fast-merkle-proof?start={start}&end={end}&number={block_number}',
)
return bytes.fromhex(removeprefix(requests.get(url).json()['proof'], '0x'))