Skip to main content

Lido Lido Python SDK

codecov Code style: black License: MIT

❗Python SDK supports only Curated Staking module. Check out KAPI project if you need all Lido keys.❗

Lido Python SDK - convenient interface to check validator's pub keys in Node Operators registry. Provides ability to download, verify and check for duplicates keys in curated module (Node Operators registry).

Installation

This library is available on PyPi:

pip install lido-sdk

Fast start

  1. Create Web3 provider. One of fast options to start is INFURA.
from web3 import Web3

w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/{INFURA_PROJECT_ID}'))
  1. Create Lido instance and provide web3 provider
from lido_sdk import Lido

lido = Lido(w3)
  1. Call one
response = lido.fetch_all_keys_and_validate()

if response['invalid_keys'] or response['duplicated_keys']:
    # This is not cool
    print('There is invalid or duplicated keys\n')
    print(response)
else:
    print('Everything is good!')

Params for Lido

Param name Default value Description
w3 required Web3 provider
MULTICALL_MAX_BUNCH 275 Count of calls in one multicall (not recommended to increase)
MULTICALL_MAX_WORKERS 6 Count of requests in parallel (not recommended to have more than 12)
MULTICALL_MAX_RETRIES 5 Count of retries before exception will be raised
MULTICALL_POOL_EXECUTOR_TIMEOUT 30 Thread pool timeout for multicall (seconds)
VALIDATE_POOL_EXECUTOR_TIMEOUT 10 Process pool timeout for keys validation (seconds)

Settings example if timeout exception was raised:

Lido(w3=w3, MULTICALL_MAX_BUNCH=100, MULTICALL_MAX_WORKERS=3)

Base methods

Everything you need is in Lido class.

  • Lido.get_operators_indexes(self) -> List[int]
    Returns: Node operators indexes in contract.
>>> lido.get_operators_indexes()

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
  • Lido.get_operators_data(self, operators_indexes: Optional[List[int]] = None) -> List[Operator]
    Receives: List of operators indexes. If nothing provided will take previous return from get_operators_indexes method.
    Returns: List of operators details.
>>> lido.get_operators_data([1])

[{'active': True, 'name': 'Certus One', 'rewardAddress': '0x8d689476eb446a1fb0065bffac32398ed7f89165', 'stakingLimit': 1000, 'stoppedValidators': 0, 'totalSigningKeys': 1000, 'usedSigningKeys': 1000, 'index': 1}]```
  • Lido.get_operators_keys(self, operators: Optional[List[Operator]] = None) -> List[OperatorKey] Receives: List of operators details. If nothing provided will take previous return from get_operators_data method. Returns: List of keys in contract.
>>> lido.get_operators_keys(operators_data)

[{'key': b'...', 'depositSignature': b'...', 'used': False, 'index': 6921, 'operator_index': 8}, ...]
  • Lido.update_keys(self) -> List[OperatorKey]
    Returns actual keys list. Works only in get_operators_keys was called before. Should be used to periodically update keys. Faster because not all keys are updated from the contract.
>>> lido.update_keys()

[{'key': b'...', 'depositSignature': b'...', 'used': False, 'index': 6521, 'operator_index': 5}]
  • Lido.validate_keys(self, keys: Optional[List[OperatorKey]] = None) -> List[OperatorKey]
    Receives: List of keys to validate. If nothing provided will take previous return from get_operators_keys method.
    Returns: List of invalid keys.
>>> lido.validate_keys()

[{'key': b'...', 'depositSignature': b'...', 'used': False, 'index': 6521, 'operator_index': 5}]
  • Lido.find_duplicated_keys(self, keys: Optional[List[OperatorKey]] = None) -> List[Tuple[OperatorKey, OperatorKey]]
    Receives: List of keys to compare. If nothing provided will take previous return from get_operators_keys method.
    Returns: List of same pairs keys.
>>> lido.find_duplicated_keys()

[
    (
        {'key': b'abc...', 'index': 222, 'operator_index': 5, ...}, 
        {'key': b'abc...', 'index': 111, 'operator_index': 5, ...}
    )
]
  • Lido.get_status(self) -> dict
    Returns dict with Lido current state.
>>> lido.get_status()

{
    'isStopped': False, 
    'totalPooledEther': 1045230979275869331637351, 
    'withdrawalCredentials': b'\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xb9\xd7\x93Hx\xb4\xfb\x96\x10\xb3\xfe\x8a^D\x1e\x8f\xad~)?', 
    'bufferedEther': 76467538672788331637351, 
    'feeBasisPoints': 1000, 
    'treasuryFeeBasisPoints': 0, 
    'insuranceFeeBasisPoints': 5000, 
    'operatorsFeeBasisPoints': 5000, 
    'depositedValidators': 29800, 
    'beaconValidators': 29800, 
    'beaconBalance': 968763440603081000000000, 
    'last_block': 13110151, 
    'last_blocktime': 1630103538,
}
  • Lido.fetch_all_keys_and_validate(self) -> Dict[str, list]
    Makes all steps below except get_status.
    Returns all invalid and duplicated keys.
>>> lido.fetch_all_keys_and_validate()

{
    'invalid_keys': [...],
    'duplicated_keys': [...],
}

Issues

There is issues with using blst lib on macos ARM cpu. But everything works on linux ARM cpu.

Main Features

Multicall Function Calls

  • Instead of making network requests one-by-one, this library combines many requests into one RPC call. It uses banteg/multicall.py, a Python wrapper for makerdao/multicall.
  • Fast validation system powered by blst

Automatic Testnet / Mainnet Switching

Depending on which network is configured in web3 object, a set of contracts will be used. Available networks:

  • Mainnet
  • Görli
  • Holesky

Development

Clone project:

git clone --recurse-submodules https://github.com/lidofinance/lido-python-sdk.git
cd lido-python-sdk

Create virtual env:

virtualenv .env --python=python3
source .env/bin/activate

Install all dependencies:

  poetry install

Activate virtual env

  poetry shell

Build blst locally (linux):

  cd blst/
  ./build.sh
  cd ..
  mkdir -p ./blst-lib/linux/
  cp ./blst/libblst.a           ./blst-lib/linux/
  cp ./blst/bindings/blst.h     ./blst-lib/
  cp ./blst/bindings/blst.hpp   ./blst-lib/
  cp ./blst/bindings/blst_aux.h ./blst-lib/
  python setup.py build_ext --inplace

Build blst locally (osx):

  cd blst/
  ./build.sh
  cd ..
  mkdir -p ./blst-lib/darwin/
  cp ./blst/libblst.a           ./blst-lib/darwin/
  cp ./blst/bindings/blst.h     ./blst-lib/
  cp ./blst/bindings/blst.hpp   ./blst-lib/
  cp ./blst/bindings/blst_aux.h ./blst-lib/
  python setup.py build_ext --inplace

Build blst locally (osx arm):

  cd blst/
  ./build.sh
  cd ..
  mkdir -p ./blst-lib/darwin-arm64/
  cp ./blst/libblst.a           ./blst-lib/darwin-arm64/
  cp ./blst/bindings/blst.h     ./blst-lib/
  cp ./blst/bindings/blst.hpp   ./blst-lib/
  cp ./blst/bindings/blst_aux.h ./blst-lib/
  python setup.py build_ext --inplace

How to test

Simply run in project root directory:

poetry run pytest .

Release new version

git tag v2.x.x  master
git push --tags

New version should be published after all pipelines passed.

Rebuild blst

Goto actions "Build blst and create PR". Note that darwin-arm64 binaries are not rebuilt automatically due to GitHub Actions not supporting macOS runners on arm yet Review PR and merge. Do a release.

Metadata

Release files for lido-sdk 4.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for lido-sdk 4.1.0
File Size Uploaded
lido-sdk-4.1.0.tar.gz 715.1 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for lido-sdk 4.1.0
File
lido_sdk-4.1.0-cp310-cp310-win_amd64.whl CPython 3.10 CPython 3.10 Windows x86-64 Details
lido_sdk-4.1.0-cp310-cp310-macosx_11_0_x86_64.whl CPython 3.10 CPython 3.10 macOS 11.0+ x86-64 Details
lido_sdk-4.1.0-cp39-cp39-win_amd64.whl CPython 3.9 CPython 3.9 Windows x86-64 Details
lido_sdk-4.1.0-cp39-cp39-macosx_11_0_x86_64.whl CPython 3.9 CPython 3.9 macOS 11.0+ x86-64 Details
lido_sdk-4.1.0-cp38-cp38-win_amd64.whl CPython 3.8 CPython 3.8 Windows x86-64 Details
lido_sdk-4.1.0-cp38-cp38-macosx_11_0_x86_64.whl CPython 3.8 CPython 3.8 macOS 11.0+ x86-64 Details
lido_sdk-4.1.0-cp37-cp37m-win_amd64.whl CPython 3.7 CPython 3.7 pymalloc Windows x86-64 Details
lido_sdk-4.1.0-cp37-cp37m-macosx_11_0_x86_64.whl CPython 3.7 CPython 3.7 pymalloc macOS 11.0+ x86-64 Details

Total release size: 2.0 MB

Release files / lido-sdk-4.1.0.tar.gz

Download URL lido-sdk-4.1.0.tar.gz
Size 715.1 kB
Tags Source
SHA-256 checksum
How to use checksums
91c4c4fbf487b8cb5d40b6afd08ca0997d2bb80bc6d2062b7f7711754ce4af61
BLAKE2b-256 checksum
How to use checksums
50b727c9c4ea72445a939e3a6f6281ff498a54a30aa9814ced8ada69fc7b936d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.18

Release files / lido_sdk-4.1.0-cp310-cp310-win_amd64.whl

Download URL lido_sdk-4.1.0-cp310-cp310-win_amd64.whl
Size 160.7 kB
Tags CPython 3.10 Windows x86-64
SHA-256 checksum
How to use checksums
ae458f19d46b303ed84fdeb7fb0d69954258b2c02c62fdc756a714d39cc5d7f4
BLAKE2b-256 checksum
How to use checksums
21710c47fd6a0d97e297334645e1e151529ee4003998c2c0726b25bda3f83761
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.11

Release files / lido_sdk-4.1.0-cp310-cp310-macosx_11_0_x86_64.whl

Download URL lido_sdk-4.1.0-cp310-cp310-macosx_11_0_x86_64.whl
Size 146.8 kB
Tags CPython 3.10 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
c3c92f4b78bd8ad7ba84f8a74015c03e53b58066b2815ce0e3e8231a777bb3c0
BLAKE2b-256 checksum
How to use checksums
aa91ffc7ba3529f0afff3d03571548e3b445f24b90552812055035ea845e4f9f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.10.13

Release files / lido_sdk-4.1.0-cp39-cp39-win_amd64.whl

Download URL lido_sdk-4.1.0-cp39-cp39-win_amd64.whl
Size 171.7 kB
Tags CPython 3.9 Windows x86-64
SHA-256 checksum
How to use checksums
854c4d9dfe55fe7928e8ee78e10744888dff87a76ab928b515d2f5fa48103fe3
BLAKE2b-256 checksum
How to use checksums
54409e273d2de26493ff44a8851adf03b148b52905fffce7675fbb08458779a3
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.13

Release files / lido_sdk-4.1.0-cp39-cp39-macosx_11_0_x86_64.whl

Download URL lido_sdk-4.1.0-cp39-cp39-macosx_11_0_x86_64.whl
Size 146.8 kB
Tags CPython 3.9 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
4ec8be4680bb9e4f3cf17e25ab0632fd9397a44af1ad4f88ebaafc9f6f073e54
BLAKE2b-256 checksum
How to use checksums
3f173266bd70d3c699bc0b65834b9818e10fe0d2d2b53c19517fced4a021be7c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.9.18

Release files / lido_sdk-4.1.0-cp38-cp38-win_amd64.whl

Download URL lido_sdk-4.1.0-cp38-cp38-win_amd64.whl
Size 170.9 kB
Tags CPython 3.8 Windows x86-64
SHA-256 checksum
How to use checksums
a6dddfb05d0b5ae6f5a0f3bccf10b17672e1958e1bd06c5d81c29d1ebdb4c20a
BLAKE2b-256 checksum
How to use checksums
0a852c954cf9319b2d4af1c634623f0751b14d94b6d45000116d5ea41d52755f
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.10

Release files / lido_sdk-4.1.0-cp38-cp38-macosx_11_0_x86_64.whl

Download URL lido_sdk-4.1.0-cp38-cp38-macosx_11_0_x86_64.whl
Size 147.1 kB
Tags CPython 3.8 macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
ab8898c1e900c0cba9f7d7551c1c4dbfd178ee4144208db6c4809c2bbec2cb7a
BLAKE2b-256 checksum
How to use checksums
fc57b8bee4b7fe6214292ba88e532b7fed2b3b84d4859c9ed279486bac58521b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.8.18

Release files / lido_sdk-4.1.0-cp37-cp37m-win_amd64.whl

Download URL lido_sdk-4.1.0-cp37-cp37m-win_amd64.whl
Size 170.5 kB
Tags CPython 3.7 CPython 3.7 pymalloc Windows x86-64
SHA-256 checksum
How to use checksums
0228220058c3162aba32c645d439915eb01317f4cdf9c3dd1ae3bc89f838ed78
BLAKE2b-256 checksum
How to use checksums
0dc937a5eccdf03272f818a4e50eb487906f7078c63a87dec376947b82a7256a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.7.9

Release files / lido_sdk-4.1.0-cp37-cp37m-macosx_11_0_x86_64.whl

Download URL lido_sdk-4.1.0-cp37-cp37m-macosx_11_0_x86_64.whl
Size 146.6 kB
Tags CPython 3.7 CPython 3.7 pymalloc macOS 11.0+ x86-64
SHA-256 checksum
How to use checksums
679d087401e87aa016169d9ddf843dd305475392d26e91475358fc0771ae5a60
BLAKE2b-256 checksum
How to use checksums
f73746071f935c9a5d692e102ed047d39ecdf4514d66df6a7121c7c15b113674
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.2 CPython/3.7.17

Release history Release notifications | RSS feed

This release

4.1.0 This release

9 release files

4.0.0

9 release files

3.0.4

9 release files

3.0.3

9 release files

2.7.0

9 release files

2.6.0

9 release files

2.5.4

9 release files

2.5.3

7 release files

2.5.1

7 release files

2.5.0

7 release files

2.4.7

7 release files

2.4.6

7 release files

2.4.5

7 release files

2.4.3

7 release files

2.4.2

7 release files

2.4.1

7 release files

2.4.0

7 release files

2.3.1

7 release files

2.2.2

7 release files

2.2.1

7 release files

2.1.2

7 release files

2.1.1

7 release files

2.1.0

7 release files

2.0.1

7 release files

1.0.1

7 release files

0.3.0

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page