Skip to main content

<<<<<<< HEAD

Lido Lido Python SDK

codecov Code style: black License: MIT

This repo provides a scratch of a Python project. Its purpose is to serve as starting point for the development of a Python project based on a minimal working structure.

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': [...],
}

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
  • Ropsten
  • Rinkeby

Development

Clone project:

git clone git@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

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.

lido-python-sdk-fork

fork lido-python-sdk

88a206396b11da0010ce47e201569b90c5d0945f

Metadata

Release files for lido-sdk-fork 2.5.3

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-fork 2.5.3
File Size Uploaded Provenance Actions
lido-sdk-fork-2.5.3.tar.gz 165.3 kB Without provenance Details for lido-sdk-fork-2.5.3.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for lido-sdk-fork 2.5.3
File Interpreter ABI Platform Actions
lido_sdk_fork-2.5.3-cp39-cp39-manylinux1_x86_64.whl CPython 3.9 CPython 3.9 Linux glibc 2.5+ x86-64 Details for lido_sdk_fork-2.5.3-cp39-cp39-manylinux1_x86_64.whl

Total release size: 642.3 kB

Release files / lido-sdk-fork-2.5.3.tar.gz

Download URL lido-sdk-fork-2.5.3.tar.gz
Size 165.3 kB
Tags Source
SHA-256 checksum
How to use checksums
c8decebdb8de6a4cef6dcfca58625dc318d9949dba8ef8ecf08aab805c104d8c
BLAKE2b-256 checksum
How to use checksums
330333c44a1be8f09dc48e03da5d97af5cebd5e7c7a575ca507019d3caaf0e4e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.5

Release files / lido_sdk_fork-2.5.3-cp39-cp39-manylinux1_x86_64.whl

Download URL lido_sdk_fork-2.5.3-cp39-cp39-manylinux1_x86_64.whl
Size 476.9 kB
Tags CPython 3.9 Linux glibc 2.5+ x86-64
SHA-256 checksum
How to use checksums
caa191ae0361b26278a9a36242b8412210927d28097d6f2ccc0df7c7253606a1
BLAKE2b-256 checksum
How to use checksums
2ee98e051bfc5b0d95d2cb6eea37caedec04dbb5f284d0c64af1de858952b6d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/4.0.1 CPython/3.9.5

Security for lido-sdk-fork 2.5.3

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Release history Release notifications | RSS feed

This release

2.5.3 This release

2 release files No provenance

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