Skip to content

Commit

Permalink
replace IConfig with concrete class
Browse files Browse the repository at this point in the history
  • Loading branch information
popenta committed Nov 15, 2024
1 parent 0f8ad56 commit a0f8e40
Show file tree
Hide file tree
Showing 8 changed files with 91 additions and 159 deletions.
24 changes: 6 additions & 18 deletions multiversx_sdk/account_management/account_transactions_factory.py
Original file line number Diff line number Diff line change
@@ -1,29 +1,17 @@
from typing import Dict, Protocol

from multiversx_sdk.builders.transaction_builder import TransactionBuilder
from multiversx_sdk.core.address import Address
from multiversx_sdk.core.transaction import Transaction


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
gas_limit_save_key_value: int
gas_limit_persist_per_byte: int
gas_limit_store_per_byte: int
gas_limit_set_guardian: int
gas_limit_guard_account: int
gas_limit_unguard_account: int
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig


class AccountTransactionsFactory:
def __init__(self, config: IConfig) -> None:
def __init__(self, config: TransactionsFactoryConfig) -> None:
self.config = config

def create_transaction_for_saving_key_value(self,
sender: Address,
key_value_pairs: Dict[bytes, bytes]) -> Transaction:
key_value_pairs: dict[bytes, bytes]) -> Transaction:
function = "SaveKeyValue"

extra_gas = self._compute_extra_gas_for_saving_key_value(key_value_pairs)
Expand Down Expand Up @@ -86,15 +74,15 @@ def create_transaction_for_unguarding_account(self, sender: Address) -> Transact

return transaction

def _compute_data_parts_for_saving_key_value(self, key_value_pairs: Dict[bytes, bytes]) -> list[str]:
def _compute_data_parts_for_saving_key_value(self, key_value_pairs: dict[bytes, bytes]) -> list[str]:
data_parts: list[str] = []

for key, value in key_value_pairs.items():
data_parts.extend([key.hex(), value.hex()])

return data_parts

def _compute_extra_gas_for_saving_key_value(self, key_value_pairs: Dict[bytes, bytes]) -> int:
def _compute_extra_gas_for_saving_key_value(self, key_value_pairs: dict[bytes, bytes]) -> int:
extra_gas = 0

for key, value in key_value_pairs.items():
Expand Down
16 changes: 6 additions & 10 deletions multiversx_sdk/builders/transaction_builder.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
from typing import List, Optional, Protocol
from typing import Optional

from multiversx_sdk.core import Address, Transaction
from multiversx_sdk.core.constants import ARGS_SEPARATOR


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig


class TransactionBuilder:
Expand All @@ -17,10 +13,10 @@ class TransactionBuilder:
"""

def __init__(self,
config: IConfig,
config: TransactionsFactoryConfig,
sender: Address,
receiver: Address,
data_parts: List[str],
data_parts: list[str],
gas_limit: int,
add_data_movement_gas: bool,
amount: Optional[int] = None) -> None:
Expand All @@ -41,7 +37,7 @@ def compute_gas_limit(self, payload: bytes) -> int:

return gas

def build_transaction_payload(self, parts: List[str]) -> bytes:
def build_transaction_payload(self, parts: list[str]) -> bytes:
data = ARGS_SEPARATOR.join(parts)
return data.encode("utf-8")

Expand Down
115 changes: 59 additions & 56 deletions multiversx_sdk/core/transactions_factory_config.py
Original file line number Diff line number Diff line change
@@ -1,61 +1,64 @@
from dataclasses import dataclass, field

from multiversx_sdk.core.address import Address
from multiversx_sdk.core.constants import DEFAULT_HRP


@dataclass
class TransactionsFactoryConfig:
def __init__(self, chain_id: str) -> None:
# General-purpose configuration
self.chain_id = chain_id
self.address_hrp = DEFAULT_HRP
self.min_gas_limit = 50_000
self.gas_limit_per_byte = 1_500

# Configuration for token operations
self.gas_limit_issue = 60_000_000
self.gas_limit_toggle_burn_role_globally = 60_000_000
self.gas_limit_esdt_local_mint = 300_000
self.gas_limit_esdt_local_burn = 300_000
self.gas_limit_set_special_role = 60_000_000
self.gas_limit_pausing = 60_000_000
self.gas_limit_freezing = 60_000_000
self.gas_limit_wiping = 60_000_000
self.gas_limit_esdt_nft_create = 3_000_000
self.gas_limit_esdt_nft_update_attributes = 1_000_000
self.gas_limit_esdt_nft_add_quantity = 1_000_000
self.gas_limit_esdt_nft_burn = 1_000_000
self.gas_limit_store_per_byte = 10_000
self.gas_limit_esdt_modify_royalties = 60_000_000
self.gas_limit_set_new_uris = 60_000_000
self.gas_limit_esdt_modify_creator = 60_000_000
self.gas_limit_esdt_metadata_update = 60_000_000
self.gas_limit_nft_metadata_recreate = 60_000_000
self.gas_limit_nft_change_to_dynamic = 60_000_000
self.gas_limit_update_token_id = 60_000_000
self.gas_limit_register_dynamic = 60_000_000
self.issue_cost = 50_000_000_000_000_000
self.esdt_contract_address = Address.new_from_bech32("erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u")

# Configuration for delegation operations
self.gas_limit_stake = 5_000_000
self.gas_limit_unstake = 5_000_000
self.gas_limit_unbond = 5_000_000
self.gas_limit_create_delegation_contract = 50_000_000
self.gas_limit_delegation_operations = 1_000_000
self.additional_gas_limit_per_validator_node = 6_000_000
self.additional_gas_for_delegation_operations = 10_000_000

# Configuration for token transfers
self.gas_limit_esdt_transfer = 200_000
self.gas_limit_esdt_nft_transfer = 200_000
self.gas_limit_multi_esdt_nft_transfer = 200_000

# Configuration for account operations
self.gas_limit_save_key_value = 100_000
self.gas_limit_persist_per_byte = 1_000
self.gas_limit_set_guardian = 250_000
self.gas_limit_guard_account = 250_000
self.gas_limit_unguard_account = 250_000

# Configuration for smart contract operations
self.gas_limit_claim_developer_rewards = 6_000_000
self.gas_limit_change_owner_address = 6_000_000
# General-purpose configuration
chain_id: str
address_hrp: str = DEFAULT_HRP
min_gas_limit: int = 50_000
gas_limit_per_byte: int = 1_500

# Configuration for token operations
gas_limit_issue: int = 60_000_000
gas_limit_toggle_burn_role_globally: int = 60_000_000
gas_limit_esdt_local_mint: int = 300_000
gas_limit_esdt_local_burn: int = 300_000
gas_limit_set_special_role: int = 60_000_000
gas_limit_pausing: int = 60_000_000
gas_limit_freezing: int = 60_000_000
gas_limit_wiping: int = 60_000_000
gas_limit_esdt_nft_create: int = 3_000_000
gas_limit_esdt_nft_update_attributes: int = 1_000_000
gas_limit_esdt_nft_add_quantity: int = 1_000_000
gas_limit_esdt_nft_burn: int = 1_000_000
gas_limit_store_per_byte: int = 10_000
gas_limit_esdt_modify_royalties: int = 60_000_000
gas_limit_set_new_uris: int = 60_000_000
gas_limit_esdt_modify_creator: int = 60_000_000
gas_limit_esdt_metadata_update: int = 60_000_000
gas_limit_nft_metadata_recreate: int = 60_000_000
gas_limit_nft_change_to_dynamic: int = 60_000_000
gas_limit_update_token_id: int = 60_000_000
gas_limit_register_dynamic: int = 60_000_000
issue_cost: int = 50_000_000_000_000_000
esdt_contract_address: Address = field(default_factory=lambda: Address.new_from_bech32(
"erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqzllls8a5w6u"))

# Configuration for delegation operations
gas_limit_stake: int = 5_000_000
gas_limit_unstake: int = 5_000_000
gas_limit_unbond: int = 5_000_000
gas_limit_create_delegation_contract: int = 50_000_000
gas_limit_delegation_operations: int = 1_000_000
additional_gas_limit_per_validator_node: int = 6_000_000
additional_gas_for_delegation_operations: int = 10_000_000

# Configuration for token transfers
gas_limit_esdt_transfer: int = 200_000
gas_limit_esdt_nft_transfer: int = 200_000
gas_limit_multi_esdt_nft_transfer: int = 200_000

# Configuration for account operations
gas_limit_save_key_value: int = 100_000
gas_limit_persist_per_byte: int = 1_000
gas_limit_set_guardian: int = 250_000
gas_limit_guard_account: int = 250_000
gas_limit_unguard_account: int = 250_000

# Configuration for smart contract operations
gas_limit_claim_developer_rewards: int = 6_000_000
gas_limit_change_owner_address: int = 6_000_000
19 changes: 4 additions & 15 deletions multiversx_sdk/delegation/delegation_transactions_factory.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Protocol, Sequence
from typing import Sequence

from multiversx_sdk.abi import Serializer
from multiversx_sdk.abi.biguint_value import BigUIntValue
Expand All @@ -7,24 +7,13 @@
from multiversx_sdk.core import Address, Transaction
from multiversx_sdk.core.constants import DELEGATION_MANAGER_SC_ADDRESS
from multiversx_sdk.core.interfaces import IValidatorPublicKey
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig
from multiversx_sdk.delegation.errors import ListsLengthMismatchError


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
gas_limit_stake: int
gas_limit_unstake: int
gas_limit_unbond: int
gas_limit_create_delegation_contract: int
gas_limit_delegation_operations: int
additional_gas_limit_per_validator_node: int
additional_gas_for_delegation_operations: int


class DelegationTransactionsFactory:
def __init__(self, config: IConfig) -> None:
def __init__(self, config: TransactionsFactoryConfig) -> None:
self.config = config
self.serializer = Serializer()

Expand Down
12 changes: 4 additions & 8 deletions multiversx_sdk/relayed/relayed_transactions_factory.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,17 @@
import base64
import json
from typing import Any, Protocol
from typing import Any

from multiversx_sdk.abi import AddressValue, BigUIntValue, Serializer
from multiversx_sdk.abi.bytes_value import BytesValue
from multiversx_sdk.core import Address, Transaction
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig
from multiversx_sdk.relayed.errors import InvalidInnerTransactionError


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int


class RelayedTransactionsFactory:
def __init__(self, config: IConfig) -> None:
def __init__(self, config: TransactionsFactoryConfig) -> None:
self._config = config

def create_relayed_v1_transaction(self,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from pathlib import Path
from typing import Any, Optional, Protocol, Sequence, Union
from typing import Any, Optional, Sequence, Union

from multiversx_sdk.abi.abi import Abi
from multiversx_sdk.abi.bytes_value import BytesValue
Expand All @@ -14,19 +14,13 @@
TokenTransfer, Transaction)
from multiversx_sdk.core.constants import (CONTRACT_DEPLOY_ADDRESS,
VM_TYPE_WASM_VM)
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig
from multiversx_sdk.smart_contracts.errors import ArgumentSerializationError


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
gas_limit_claim_developer_rewards: int
gas_limit_change_owner_address: int


class SmartContractTransactionsFactory:
def __init__(self, config: IConfig, abi: Optional[Abi] = None) -> None:
def __init__(self, config: TransactionsFactoryConfig, abi: Optional[Abi] = None) -> None:
self.config = config
self.abi = abi
self.serializer = Serializer()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import logging
from enum import Enum
from typing import Optional, Protocol
from typing import Optional

from multiversx_sdk.abi import Serializer
from multiversx_sdk.abi.biguint_value import BigUIntValue
Expand All @@ -9,39 +9,12 @@
from multiversx_sdk.builders.transaction_builder import TransactionBuilder
from multiversx_sdk.core import Address, Transaction
from multiversx_sdk.core.errors import BadUsageError
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig

logger = logging.getLogger(__name__)


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
gas_limit_issue: int
gas_limit_toggle_burn_role_globally: int
gas_limit_esdt_local_mint: int
gas_limit_esdt_local_burn: int
gas_limit_set_special_role: int
gas_limit_pausing: int
gas_limit_freezing: int
gas_limit_wiping: int
gas_limit_esdt_nft_create: int
gas_limit_esdt_nft_update_attributes: int
gas_limit_esdt_nft_add_quantity: int
gas_limit_esdt_nft_burn: int
gas_limit_store_per_byte: int
gas_limit_esdt_modify_royalties: int
gas_limit_esdt_modify_creator: int
gas_limit_esdt_metadata_update: int
gas_limit_set_new_uris: int
gas_limit_nft_metadata_recreate: int
gas_limit_nft_change_to_dynamic: int
gas_limit_update_token_id: int
gas_limit_register_dynamic: int
issue_cost: int
esdt_contract_address: Address


class TokenType(Enum):
NFT = "NFT"
SFT = "SFT"
Expand All @@ -50,7 +23,7 @@ class TokenType(Enum):


class TokenManagementTransactionsFactory:
def __init__(self, config: IConfig):
def __init__(self, config: TransactionsFactoryConfig):
self._config = config
self.serializer = Serializer()

Expand Down
15 changes: 4 additions & 11 deletions multiversx_sdk/transfers/transfer_transactions_factory.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from typing import Optional, Protocol
from typing import Optional

from multiversx_sdk.builders.token_transfers_data_builder import \
TokenTransfersDataBuilder
Expand All @@ -8,22 +8,15 @@
from multiversx_sdk.core.constants import \
EGLD_IDENTIFIER_FOR_MULTI_ESDTNFT_TRANSFER
from multiversx_sdk.core.errors import BadUsageError
from multiversx_sdk.core.transactions_factory_config import \
TransactionsFactoryConfig

ADDITIONAL_GAS_FOR_ESDT_TRANSFER = 100000
ADDITIONAL_GAS_FOR_ESDT_NFT_TRANSFER = 800000


class IConfig(Protocol):
chain_id: str
min_gas_limit: int
gas_limit_per_byte: int
gas_limit_esdt_transfer: int
gas_limit_esdt_nft_transfer: int
gas_limit_multi_esdt_nft_transfer: int


class TransferTransactionsFactory:
def __init__(self, config: IConfig) -> None:
def __init__(self, config: TransactionsFactoryConfig) -> None:
self.config = config
self.token_computer = TokenComputer()
self._data_args_builder = TokenTransfersDataBuilder(self.token_computer)
Expand Down

0 comments on commit a0f8e40

Please sign in to comment.