Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "sw-utils"
version = "v0.12.15"
version = "v0.13.0"
description = "StakeWise Python utils"
authors = ["StakeWise Labs <info@stakewise.io>"]
license = "GPL-3.0-or-later"
Expand Down
5 changes: 5 additions & 0 deletions sw_utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,11 @@
from .os_token_converter import OsTokenConverter
from .password import generate_password
from .protocol_config import build_protocol_config
from .release import (
is_meta_vault_upgraded_to_release,
is_vault_upgraded_to_pectra,
is_vault_upgraded_to_release,
)
from .signing import (
DepositData,
DepositMessage,
Expand Down
75 changes: 75 additions & 0 deletions sw_utils/networks.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from dataclasses import dataclass
from enum import IntEnum

from eth_typing import BlockNumber, ChecksumAddress, HexAddress, HexStr
from web3 import Web3
Expand All @@ -16,6 +17,23 @@
EMPTY_ADDR_HEX = HexAddress(HexStr('0x' + '00' * 20))


class ContractReleaseVersion(IntEnum):
V4 = 4 # Pectra release
V5 = 5 # Added redemptions, added sub-vaults registry for meta vaults


# Add alias for readability
PECTRA_CONTRACTS_RELEASE_VERSION = ContractReleaseVersion.V4


@dataclass
class ContractRelease:
version: ContractReleaseVersion
vault_version: int
genesis_vault_version: int
meta_vault_version: int


@dataclass
# pylint: disable-next=too-many-instance-attributes
class BaseNetworkConfig:
Expand Down Expand Up @@ -55,6 +73,7 @@ class BaseNetworkConfig:
NODES_MANAGER_GENESIS_BLOCK: BlockNumber
OS_TOKEN_REDEEMER_CONTRACT_ADDRESS: ChecksumAddress
VALIDATORS_CHECKER_CONTRACT_ADDRESS: ChecksumAddress
CONTRACTS_RELEASES: list[ContractRelease]

@property
def SECONDS_PER_BLOCK(self) -> int:
Expand All @@ -79,6 +98,20 @@ def SHAPELLA_FORK(self) -> ConsensusFork:
def PECTRA_SLOT(self) -> int:
return self.PECTRA_EPOCH * self.SLOTS_PER_EPOCH

@property
def CONTRACTS_RELEASE_VERSION_TO_RELEASE(self) -> dict[ContractReleaseVersion, ContractRelease]:
return {release.version: release for release in self.CONTRACTS_RELEASES}

@property
def CONTRACTS_RELEASE_V4(self) -> ContractRelease:
"""Pectra release"""
return self.CONTRACTS_RELEASE_VERSION_TO_RELEASE[ContractReleaseVersion.V4]

@property
def CONTRACTS_RELEASE_V5(self) -> ContractRelease:
"""Added redemptions, added sub-vaults registry for meta vaults"""
return self.CONTRACTS_RELEASE_VERSION_TO_RELEASE[ContractReleaseVersion.V5]


NETWORKS = {
MAINNET: BaseNetworkConfig(
Expand Down Expand Up @@ -146,6 +179,20 @@ def PECTRA_SLOT(self) -> int:
VALIDATORS_CHECKER_CONTRACT_ADDRESS=Web3.to_checksum_address(
'0x508e82B5119CCfB923C387d62D2Ae7B56Df79906'
),
CONTRACTS_RELEASES=[
ContractRelease(
version=ContractReleaseVersion.V4,
vault_version=5,
genesis_vault_version=5,
meta_vault_version=5,
),
ContractRelease(
version=ContractReleaseVersion.V5,
vault_version=5,
genesis_vault_version=5,
meta_vault_version=6,
),
],
),
HOODI: BaseNetworkConfig(
SLOTS_PER_EPOCH=32,
Expand Down Expand Up @@ -210,6 +257,20 @@ def PECTRA_SLOT(self) -> int:
VALIDATORS_CHECKER_CONTRACT_ADDRESS=Web3.to_checksum_address(
'0xF1b78B96212DCcbf8F34A83535e58864311Fb9eB'
),
CONTRACTS_RELEASES=[
ContractRelease(
version=ContractReleaseVersion.V4,
vault_version=5,
genesis_vault_version=5,
meta_vault_version=5,
),
ContractRelease(
version=ContractReleaseVersion.V5,
vault_version=5,
genesis_vault_version=5,
meta_vault_version=6,
),
],
),
GNOSIS: BaseNetworkConfig(
SLOTS_PER_EPOCH=16,
Expand Down Expand Up @@ -274,6 +335,20 @@ def PECTRA_SLOT(self) -> int:
VALIDATORS_CHECKER_CONTRACT_ADDRESS=Web3.to_checksum_address(
'0x80353898B72417AC5701a9809A9eF63F691BdE86'
),
CONTRACTS_RELEASES=[
ContractRelease(
version=ContractReleaseVersion.V4,
vault_version=3,
genesis_vault_version=4,
meta_vault_version=3,
),
ContractRelease(
version=ContractReleaseVersion.V5,
vault_version=3,
genesis_vault_version=4,
meta_vault_version=4,
),
],
),
}

Expand Down
17 changes: 0 additions & 17 deletions sw_utils/pectra.py

This file was deleted.

55 changes: 55 additions & 0 deletions sw_utils/release.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
from eth_typing import ChecksumAddress

from sw_utils.networks import (
NETWORKS,
PECTRA_CONTRACTS_RELEASE_VERSION,
ContractReleaseVersion,
)


def is_vault_upgraded_to_pectra(
network: str, vault_address: ChecksumAddress, vault_version: int
) -> bool:
# Up to Pectra release, meta vault version is the same as regular vault version,
# so we can use the same function for both meta and non-meta vaults
return is_vault_upgraded_to_release(
network=network,
vault_address=vault_address,
vault_version=vault_version,
release_version=PECTRA_CONTRACTS_RELEASE_VERSION,
)


def is_meta_vault_upgraded_to_release(
network: str,
vault_address: ChecksumAddress,
vault_version: int,
release_version: ContractReleaseVersion,
) -> bool:
return is_vault_upgraded_to_release(
network=network,
vault_address=vault_address,
vault_version=vault_version,
release_version=release_version,
is_meta_vault=True,
)


def is_vault_upgraded_to_release(
network: str,
vault_address: ChecksumAddress,
vault_version: int,
release_version: ContractReleaseVersion,
is_meta_vault: bool = False,
) -> bool:
network_config = NETWORKS[network]

release = network_config.CONTRACTS_RELEASE_VERSION_TO_RELEASE[release_version]
is_genesis_vault = vault_address == network_config.GENESIS_VAULT_CONTRACT_ADDRESS
if is_meta_vault:
min_version = release.meta_vault_version
elif is_genesis_vault:
min_version = release.genesis_vault_version
else:
min_version = release.vault_version
return vault_version >= min_version
Comment thread
cyc60 marked this conversation as resolved.
Loading