From 8018b3ef086394137ababad97042db71c9afca95 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 20 Dec 2022 11:26:18 +0200 Subject: [PATCH 01/26] reference erdpy-eggs repositories --- requirements.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/requirements.txt b/requirements.txt index f259f45b..fa8646f5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,7 @@ requests-cache pytest setuptools + +git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-core.git@v0.2.0#egg=erdpy_core +git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-wallet.git@v0.2.0#egg=erdpy_wallet +git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-network-providers.git@v0.3.0#egg=erdpy_network From 559118e98d874a5d44a74010d1bc049e2876922a Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 20 Dec 2022 17:17:54 +0200 Subject: [PATCH 02/26] remove IElrondProxy from transactions.py --- erdpy/cli_transactions.py | 9 +++---- erdpy/transactions.py | 50 +++++++++++++++++++++++++++++++-------- 2 files changed, 45 insertions(+), 14 deletions(-) diff --git a/erdpy/cli_transactions.py b/erdpy/cli_transactions.py index 51162a6b..a06e9659 100644 --- a/erdpy/cli_transactions.py +++ b/erdpy/cli_transactions.py @@ -3,7 +3,8 @@ from erdpy import cli_shared, utils from erdpy.cli_output import CLIOutputBuilder -from erdpy.proxy.core import ElrondProxy +# from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import Transaction, do_prepare_transaction @@ -70,7 +71,7 @@ def send_transaction(args: Any): tx = Transaction.load_from_file(args.infile) try: - tx.send(ElrondProxy(args.proxy)) + tx.send(ProxyNetworkProvider(args.proxy)) finally: output = CLIOutputBuilder().set_emitted_transaction(tx).build() utils.dump_out_json(output, outfile=args.outfile) @@ -79,8 +80,8 @@ def send_transaction(args: Any): def get_transaction(args: Any): args = utils.as_object(args) omit_fields = cli_shared.parse_omit_fields_arg(args) - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) - transaction = proxy.get_transaction(args.hash, args.sender, args.with_results) + transaction = proxy.get_transaction(args.hash) output = CLIOutputBuilder().set_transaction_on_network(transaction, omit_fields).build() utils.dump_out_json(output) diff --git a/erdpy/transactions.py b/erdpy/transactions.py index abeec062..a0072264 100644 --- a/erdpy/transactions.py +++ b/erdpy/transactions.py @@ -1,17 +1,32 @@ import base64 import json import logging +import time from collections import OrderedDict -from typing import Any, Dict, List, TextIO +from typing import Any, Dict, List, TextIO, Tuple from erdpy import config, errors, utils from erdpy.accounts import Account, Address, LedgerAccount from erdpy.cli_password import load_password -from erdpy.interfaces import IElrondProxy, ITransaction, ITransactionOnNetwork +from erdpy.interfaces import ITransaction, ITransactionOnNetwork logger = logging.getLogger("transactions") +class INetworkProvider: + def send_transaction(self, transaction: ITransaction) -> str: + ... + + def send_transactions(self, transactions: List[ITransaction]) -> Tuple[int, str]: + ... + + def send_wait_result(self) -> ITransactionOnNetwork: + ... + + def get_transaction(self, tx_hash: str) -> ITransactionOnNetwork: + ... + + class Transaction(ITransaction): def __init__(self): self.hash: str = "" @@ -91,25 +106,41 @@ def load_from_file(cls, f: TextIO): instance.receiverUsername = instance.receiver_username_encoded() return instance - def send(self, proxy: IElrondProxy): + def send(self, proxy: INetworkProvider): if not self.signature: raise errors.TransactionIsNotSigned() logger.info(f"Transaction.send: nonce={self.nonce}") - dictionary = self.to_dictionary() - self.hash = proxy.send_transaction(dictionary) + self.hash = proxy.send_transaction(self) logger.info(f"Hash: {self.hash}") utils.log_explorer_transaction(self.chainID, self.hash) return self.hash - def send_wait_result(self, proxy: IElrondProxy, timeout: int) -> ITransactionOnNetwork: + def send_wait_result(self, proxy: INetworkProvider, timeout: int) -> ITransactionOnNetwork: if not self.signature: raise errors.TransactionIsNotSigned() - txOnNetwork = proxy.send_transaction_and_wait_for_result(self.to_dictionary(), timeout) + txOnNetwork = self.__send_transaction_and_wait_for_result(proxy , self, timeout) self.hash = txOnNetwork.get_hash() return txOnNetwork + + def __send_transaction_and_wait_for_result(self, proxy: INetworkProvider, payload: Any, num_seconds_timeout: int = 100) -> ITransactionOnNetwork: + AWAIT_TRANSACTION_PERIOD = 5 + + tx_hash = proxy.send_transaction(payload) + num_periods_to_wait = int(num_seconds_timeout / AWAIT_TRANSACTION_PERIOD) + + for _ in range(0, num_periods_to_wait): + time.sleep(AWAIT_TRANSACTION_PERIOD) + + tx = proxy.get_transaction(tx_hash) + if tx.is_completed: + return tx + else: + logger.info("Transaction not yet done.") + + return ITransactionOnNetwork() def to_dictionary(self) -> Dict[str, Any]: dictionary: Dict[str, Any] = OrderedDict() @@ -197,10 +228,9 @@ def add(self, sender: Account, receiver_address: str, nonce: Any, value: Any, da def add_tx(self, tx): self.transactions.append(tx) - def send(self, proxy: IElrondProxy): + def send(self, proxy: INetworkProvider): logger.info(f"BunchOfTransactions.send: {len(self.transactions)} transactions") - payload = [transaction.to_dictionary() for transaction in self.transactions] - num_sent, hashes = proxy.send_transactions(payload) + num_sent, hashes = proxy.send_transactions(self.transactions) logger.info(f"Sent: {num_sent}") logger.info(f"TxsHashes: {hashes}") return num_sent, hashes From 87136ad7aa123fa7f96d0cff58c7e232cd7e9c18 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 21 Dec 2022 13:22:04 +0200 Subject: [PATCH 03/26] use ProxyNetworkProvider for `get_hyperblock` --- erdpy/cli_block.py | 14 +++++++++++--- erdpy/cli_transactions.py | 1 - 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/erdpy/cli_block.py b/erdpy/cli_block.py index d1bc42fb..ba3bcdb5 100644 --- a/erdpy/cli_block.py +++ b/erdpy/cli_block.py @@ -1,7 +1,7 @@ from typing import Any from erdpy import cli_shared, utils -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider def setup_parser(subparsers: Any) -> Any: @@ -18,6 +18,14 @@ def setup_parser(subparsers: Any) -> Any: def get_hyperblock(args: Any) -> Any: proxy_url = args.proxy - proxy = ElrondProxy(proxy_url) - response = proxy.get_hyperblock(args.key) + proxy = ProxyNetworkProvider(proxy_url) + key = args.key + + url = f"hyperblock/by-hash/{key}" + if str(key).isnumeric(): + url = f"hyperblock/by-nonce/{key}" + + response = proxy.do_get_generic(url) + response = response.get("hyperblock", {}) + utils.dump_out_json(response) diff --git a/erdpy/cli_transactions.py b/erdpy/cli_transactions.py index a06e9659..e841ded2 100644 --- a/erdpy/cli_transactions.py +++ b/erdpy/cli_transactions.py @@ -3,7 +3,6 @@ from erdpy import cli_shared, utils from erdpy.cli_output import CLIOutputBuilder -# from erdpy.proxy.core import ElrondProxy from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import Transaction, do_prepare_transaction From 30315caf16e6148bebc98874ba8504c067b1d388 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 22 Dec 2022 11:06:52 +0200 Subject: [PATCH 04/26] remove ElrondProxy --- .gitignore | 11 ++ erdpy/accounts.py | 12 +- erdpy/accounts_repository.py | 12 +- erdpy/cli_accounts.py | 12 +- erdpy/cli_contracts.py | 6 +- erdpy/cli_delegation.py | 6 +- erdpy/cli_dns.py | 13 +- erdpy/cli_network.py | 20 +-- erdpy/cli_shared.py | 6 +- erdpy/contracts.py | 36 ++--- erdpy/dns.py | 17 ++- erdpy/interfaces.py | 28 +--- erdpy/projects/eei_activation.py | 6 +- erdpy/proxy/__init__.py | 3 - erdpy/proxy/core.py | 167 ------------------------ erdpy/proxy/http_facade.py | 52 -------- erdpy/proxy/messages.py | 141 -------------------- erdpy/simulation.py | 12 +- erdpy/tests/test_accounts_repository.py | 9 +- examples/airdrop.py | 7 +- examples/contracts.py | 6 +- examples/staking.py | 6 +- pyrightconfig.json | 18 +++ requirements.txt | 2 +- 24 files changed, 141 insertions(+), 467 deletions(-) delete mode 100644 erdpy/proxy/__init__.py delete mode 100644 erdpy/proxy/core.py delete mode 100644 erdpy/proxy/http_facade.py delete mode 100644 erdpy/proxy/messages.py create mode 100644 pyrightconfig.json diff --git a/.gitignore b/.gitignore index 87f43eda..ee06ff85 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,14 @@ docs/_build/ # Tags generated by ctags tags +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Typings +typings diff --git a/erdpy/accounts.py b/erdpy/accounts.py index e3d4ce5b..9db100c2 100644 --- a/erdpy/accounts.py +++ b/erdpy/accounts.py @@ -1,11 +1,12 @@ import logging from pathlib import Path -from typing import Any, Optional +from typing import Any, Optional, Protocol import nacl.signing from erdpy import constants, errors from erdpy.interfaces import IAccount, IAddress, ITransaction +from erdpy_network.accounts import AccountOnNetwork from erdpy.ledger.config import compare_versions from erdpy.ledger.ledger_app_handler import SIGN_USING_HASH_VERSION from erdpy.ledger.ledger_functions import do_get_ledger_address, do_sign_transaction_with_ledger, do_get_ledger_version, \ @@ -16,6 +17,11 @@ logger = logging.getLogger("accounts") +class INetworkProvider(Protocol): + def get_account(self, address: IAddress) -> AccountOnNetwork: + ... + + class Account(IAccount): def __init__(self, address: Any = None, @@ -39,9 +45,9 @@ def __init__(self, self.secret_key = secret_key.hex() self.address = Address(address_from_key_file) - def sync_nonce(self, proxy: Any): + def sync_nonce(self, proxy: INetworkProvider): logger.info("Account.sync_nonce()") - self.nonce = proxy.get_account_nonce(self.address) + self.nonce = proxy.get_account(self.address).nonce logger.info(f"Account.sync_nonce() done: {self.nonce}") def sign_transaction(self, transaction: ITransaction) -> str: diff --git a/erdpy/accounts_repository.py b/erdpy/accounts_repository.py index f9e106fc..eafe3843 100644 --- a/erdpy/accounts_repository.py +++ b/erdpy/accounts_repository.py @@ -1,16 +1,22 @@ import logging from multiprocessing.pool import ThreadPool from pathlib import Path -from typing import List, Set, Union +from typing import List, Set, Union, Protocol from erdpy import utils from erdpy.accounts import Account, Address -from erdpy.interfaces import IElrondProxy +from erdpy_network.accounts import AccountOnNetwork +from erdpy.interfaces import IAddress from erdpy.wallet import pem logger = logging.getLogger("accounts") +class INetworkProvider(Protocol): + def get_account(self, address: IAddress) -> AccountOnNetwork: + ... + + class AccountsRepository: def __init__(self, accounts: List[Account]): self.accounts = accounts @@ -66,7 +72,7 @@ def get_all(self) -> List[Account]: def __len__(self): return len(self.accounts) - def sync_nonces(self, proxy: IElrondProxy, num_parallel: int = 10): + def sync_nonces(self, proxy: INetworkProvider, num_parallel: int = 10): logger.info("Sync nonces for", len(self.accounts), "accounts") def sync_nonce(account: Account): diff --git a/erdpy/cli_accounts.py b/erdpy/cli_accounts.py index 28b4ea50..b7540fdc 100644 --- a/erdpy/cli_accounts.py +++ b/erdpy/cli_accounts.py @@ -3,7 +3,7 @@ from erdpy import cli_shared, utils from erdpy.accounts import Address -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("cli.accounts") @@ -39,16 +39,16 @@ def _add_address_arg(sub: Any): def get_account(args: Any): proxy_url = args.proxy address = args.address - proxy = ElrondProxy(proxy_url) + proxy = ProxyNetworkProvider(proxy_url) account = proxy.get_account(Address(address)) omit_fields = cli_shared.parse_omit_fields_arg(args) if args.balance: - print(account.get("balance", 0)) + print(account.balance) elif args.nonce: - print(account.get("nonce", 0)) + print(account.nonce) elif args.username: - print(account.get("username", 0)) + print(account.username) else: utils.omit_fields(account, omit_fields) utils.dump_out_json(account) @@ -57,7 +57,7 @@ def get_account(args: Any): def get_account_transactions(args: Any): proxy_url = args.proxy address = args.address - proxy = ElrondProxy(proxy_url) + proxy = ProxyNetworkProvider(proxy_url) response = proxy.get_account_transactions(Address(address)) utils.dump_out_json(response, args.outfile) diff --git a/erdpy/cli_contracts.py b/erdpy/cli_contracts.py index 90917de0..139b8a16 100644 --- a/erdpy/cli_contracts.py +++ b/erdpy/cli_contracts.py @@ -10,7 +10,7 @@ from erdpy.contracts import CodeMetadata, SmartContract from erdpy.projects import load_project from erdpy.projects.core import get_project_paths_recursively -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import Transaction logger = logging.getLogger("cli.contracts") @@ -298,7 +298,7 @@ def _prepare_sender(args: Any) -> Account: sender.nonce = args.nonce if args.recall_nonce: - sender.sync_nonce(ElrondProxy(args.proxy)) + sender.sync_nonce(ProxyNetworkProvider(args.proxy)) return sender @@ -351,7 +351,7 @@ def query(args: Any): arguments = args.arguments contract = SmartContract(contract_address) - result = contract.query(ElrondProxy(args.proxy), function, arguments) + result = contract.query(ProxyNetworkProvider(args.proxy), function, arguments) utils.dump_out_json(result) diff --git a/erdpy/cli_delegation.py b/erdpy/cli_delegation.py index b7d64cf5..0c2fa6ad 100644 --- a/erdpy/cli_delegation.py +++ b/erdpy/cli_delegation.py @@ -4,7 +4,7 @@ from erdpy import cli_shared, errors, utils from erdpy.accounts import Address from erdpy.delegation import staking_provider -from erdpy.proxy import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import do_prepare_transaction @@ -152,9 +152,9 @@ def get_contract_address_by_deploy_tx_hash(args: Any): args = utils.as_object(args) omit_fields = cli_shared.parse_omit_fields_arg(args) - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) - transaction = proxy.get_transaction(args.create_tx_hash, with_results=True) + transaction = proxy.get_transaction(args.create_tx_hash) utils.omit_fields(transaction, omit_fields) _get_sc_address_from_tx(transaction) diff --git a/erdpy/cli_dns.py b/erdpy/cli_dns.py index 69090a01..fd7d1b97 100644 --- a/erdpy/cli_dns.py +++ b/erdpy/cli_dns.py @@ -2,9 +2,10 @@ from prettytable import PrettyTable from erdpy import cli_shared -from erdpy.dns import name_hash, dns_address_for_name, register, resolve, registration_cost, validate_name, version, compute_dns_address_for_shard_id +from erdpy.dns import (name_hash, dns_address_for_name, register, resolve, registration_cost, + validate_name, version, compute_dns_address_for_shard_id) from erdpy.accounts import Address -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider def setup_parser(args: List[str], subparsers: Any) -> Any: @@ -66,13 +67,13 @@ def _add_name_arg(sub: Any): def dns_resolve(args: Any): - addr = resolve(args.name, ElrondProxy(args.proxy)) + addr = resolve(args.name, ProxyNetworkProvider(args.proxy)) if addr.hex() != Address.zero().hex(): print(addr.bech32()) def dns_validate_name(args: Any): - validate_name(args.name, args.shard_id, ElrondProxy(args.proxy)) + validate_name(args.name, args.shard_id, ProxyNetworkProvider(args.proxy)) def get_name_hash(args: Any): @@ -92,11 +93,11 @@ def get_dns_address_for_name_hex(args: Any): def get_registration_cost(args: Any): - print(registration_cost(args.shard_id, ElrondProxy(args.proxy))) + print(registration_cost(args.shard_id, ProxyNetworkProvider(args.proxy))) def get_version(args: Any): - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) if args.all: t = PrettyTable(['Shard ID', 'Contract address (bech32)', 'Contract address (hex)', 'Version']) for shard_id in range(0, 256): diff --git a/erdpy/cli_network.py b/erdpy/cli_network.py index ea1b0b00..5b75120f 100644 --- a/erdpy/cli_network.py +++ b/erdpy/cli_network.py @@ -1,4 +1,4 @@ -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy import cli_shared import logging from typing import Any @@ -27,26 +27,26 @@ def setup_parser(subparsers: Any) -> Any: return subparsers -def get_num_shards(args): +def get_num_shards(args: Any): proxy_url = args.proxy - proxy = ElrondProxy(proxy_url) - num_shards = proxy.get_num_shards() + proxy = ProxyNetworkProvider(proxy_url) + num_shards = proxy.get_network_config().num_shards_without_meta print(num_shards) return num_shards -def get_last_block_nonce(args): +def get_last_block_nonce(args: Any): proxy_url = args.proxy shard = args.shard - proxy = ElrondProxy(proxy_url) - nonce = proxy.get_last_block_nonce(shard) + proxy = ProxyNetworkProvider(proxy_url) + nonce = proxy.get_network_status(shard).highest_final_nonce print(nonce) return nonce -def get_chain_id(args): +def get_chain_id(args: Any): proxy_url = args.proxy - proxy = ElrondProxy(proxy_url) - chain_id = proxy.get_chain_id() + proxy = ProxyNetworkProvider(proxy_url) + chain_id = proxy.get_network_config().chain_id print(chain_id) return chain_id diff --git a/erdpy/cli_shared.py b/erdpy/cli_shared.py index c0bb1cca..3d6e08a2 100644 --- a/erdpy/cli_shared.py +++ b/erdpy/cli_shared.py @@ -9,7 +9,7 @@ from erdpy.cli_output import CLIOutputBuilder from erdpy.cli_password import load_password from erdpy.ledger.ledger_functions import do_get_ledger_address -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.simulation import Simulator from erdpy.transactions import Transaction @@ -125,7 +125,7 @@ def prepare_nonce_in_args(args: Any): else: raise errors.NoWalletProvided() - account.sync_nonce(ElrondProxy(args.proxy)) + account.sync_nonce(ProxyNetworkProvider(args.proxy)) args.nonce = account.nonce @@ -146,7 +146,7 @@ def check_broadcast_args(args: Any): def send_or_simulate(tx: Transaction, args: Any, dump_output: bool = True) -> CLIOutputBuilder: - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) is_set_wait_result = hasattr(args, "wait_result") and args.wait_result is_set_send = hasattr(args, "send") and args.send diff --git a/erdpy/contracts.py b/erdpy/contracts.py index bca8b124..bf91aa75 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -1,12 +1,11 @@ import base64 import logging -from typing import Any, List, Optional, Tuple +from typing import Any, List, Optional, Tuple, Union from Cryptodome.Hash import keccak from erdpy import config, constants, errors from erdpy.accounts import Account, Address -from erdpy.interfaces import IElrondProxy from erdpy.transactions import Transaction from erdpy.utils import Object @@ -19,6 +18,11 @@ STR_PREFIX = "str:" +class INetworkProvider: + def query_contract(self, payload: Any) -> Any: + ... + + class QueryResult(Object): def __init__(self, as_base64: str, as_hex: str, as_number: int): self.base64 = as_base64 @@ -26,6 +30,15 @@ def __init__(self, as_base64: str, as_hex: str, as_number: int): self.number = as_number +class ContractQuery: + def __init__(self, contract: Address, function: str, value: int, caller: Union[Address, None], arguments: List[str]) -> None: + self.contract = contract + self.function = function + self.value = value + self.caller = caller + self.arguments = arguments + + class SmartContract: def __init__(self, address: Optional[Address] = None, bytecode=None, metadata=None): self.address = Address(address) @@ -136,7 +149,7 @@ def prepare_upgrade_transaction_data(self, arguments: List[Any]): def query( self, - proxy: IElrondProxy, + proxy: INetworkProvider, function: str, arguments: List[Any], value: int = 0, @@ -146,21 +159,14 @@ def query( return_data = response_data.get("returnData", []) or response_data.get("ReturnData", []) return [self._interpret_return_data(data) for data in return_data] - def query_detailed(self, proxy: IElrondProxy, function: str, arguments: List[Any], value: int = 0, caller: Optional[Address] = None) -> Any: + def query_detailed(self, proxy: INetworkProvider, function: str, arguments: List[Any], + value: int = 0, caller: Optional[Address] = None) -> Any: arguments = arguments or [] - prepared_arguments = [_prepare_argument(argument) for argument in arguments] - - payload = { - "scAddress": self.address.bech32(), - "funcName": function, - "args": prepared_arguments, - "value": str(value) - } + prepared_arguments = [argument.encode() for argument in arguments] - if caller: - payload["caller"] = caller.bech32() + query = ContractQuery(self.address, function, value, caller, prepared_arguments) - response = proxy.query_contract(payload) + response = proxy.query_contract(query) response_data = response.get("data", {}) return response_data diff --git a/erdpy/dns.py b/erdpy/dns.py index 6d87d44a..af89cc09 100644 --- a/erdpy/dns.py +++ b/erdpy/dns.py @@ -1,20 +1,23 @@ -from typing import Any, List +from typing import Any, List, Dict from Cryptodome.Hash import keccak from erdpy import cli_shared, utils from erdpy.accounts import Account, Address from erdpy.contracts import SmartContract -from erdpy.proxy.core import ElrondProxy from erdpy.transactions import do_prepare_transaction -from erdpy.interfaces import IElrondProxy MaxNumShards = 256 ShardIdentiferLen = 2 InitialDNSAddress = bytes([1] * 32) -def resolve(name: str, proxy: ElrondProxy) -> Address: +class INetworkProvider: + def query_contract(self, payload: Dict[str, Any]) -> Any: + ... + + +def resolve(name: str, proxy: INetworkProvider) -> Address: name_arg = "0x{}".format(str.encode(name).hex()) dns_address = dns_address_for_name(name) contract = SmartContract(dns_address) @@ -24,7 +27,7 @@ def resolve(name: str, proxy: ElrondProxy) -> Address: return Address(result[0].hex) -def validate_name(name: str, shard_id: int, proxy: ElrondProxy): +def validate_name(name: str, shard_id: int, proxy: INetworkProvider): name_arg = "0x{}".format(str.encode(name).hex()) dns_address = compute_dns_address_for_shard_id(shard_id) contract = SmartContract(dns_address) @@ -59,7 +62,7 @@ def name_hash(name: str) -> bytes: return keccak.new(digest_bits=256).update(str.encode(name)).digest() -def registration_cost(shard_id: int, proxy: ElrondProxy) -> int: +def registration_cost(shard_id: int, proxy: INetworkProvider) -> int: dns_address = compute_dns_address_for_shard_id(shard_id) contract = SmartContract(dns_address) result = contract.query(proxy, "getRegistrationCost", []) @@ -69,7 +72,7 @@ def registration_cost(shard_id: int, proxy: ElrondProxy) -> int: return int("0x{}".format(result[0])) -def version(shard_id: int, proxy: IElrondProxy) -> str: +def version(shard_id: int, proxy: INetworkProvider) -> str: dns_address = compute_dns_address_for_shard_id(shard_id) contract = SmartContract(dns_address) result = contract.query(proxy, "version", []) diff --git a/erdpy/interfaces.py b/erdpy/interfaces.py index 5b09f9ac..22fe534e 100644 --- a/erdpy/interfaces.py +++ b/erdpy/interfaces.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, List, Tuple +from typing import Any, Dict from erdpy.utils import ISerializable @@ -58,29 +58,3 @@ class ISimulateResponse(ISerializable): class ISimulateCostResponse(ISerializable): pass - - -class IElrondProxy: - def get_account_nonce(self, address: IAddress) -> int: - return 0 - - def get_transaction(self, tx_hash: str, sender_address: str = "", with_results: bool = False) -> ITransactionOnNetwork: - return ITransactionOnNetwork() - - def send_transaction(self, payload: Any) -> str: - return "" - - def simulate_transaction(self, payload: Any) -> ISimulateResponse: - return ISimulateResponse() - - def simulate_transaction_cost(self, payload: Any) -> ISimulateCostResponse: - return ISimulateCostResponse() - - def send_transactions(self, payload: List[Any]) -> Tuple[int, List[str]]: - return 0, [] - - def send_transaction_and_wait_for_result(self, payload: Any, num_seconds_timeout: int) -> ITransactionOnNetwork: - return ITransactionOnNetwork() - - def query_contract(self, payload: Any) -> Any: - return dict() diff --git a/erdpy/projects/eei_activation.py b/erdpy/projects/eei_activation.py index b805416b..d0965f0a 100644 --- a/erdpy/projects/eei_activation.py +++ b/erdpy/projects/eei_activation.py @@ -5,7 +5,7 @@ import requests import toml from erdpy.diskcache import DiskCache -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("eei") @@ -28,8 +28,8 @@ def is_flag_active(self, flag_name: str): def _fetch_current_epoch(self): logger.info(f"fetch_current_epoch: {self.proxy_url}") - proxy = ElrondProxy(self.proxy_url) - return proxy.get_epoch() + proxy = ProxyNetworkProvider(self.proxy_url) + return proxy.get_network_status().epoch_number def _fetch_enable_epochs(self): logger.info(f"fetch_enable_epochs: {self.enable_epochs_url}") diff --git a/erdpy/proxy/__init__.py b/erdpy/proxy/__init__.py deleted file mode 100644 index c8c111f9..00000000 --- a/erdpy/proxy/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from erdpy.proxy.core import ElrondProxy - -__all__ = ["ElrondProxy"] diff --git a/erdpy/proxy/core.py b/erdpy/proxy/core.py deleted file mode 100644 index b39e89e8..00000000 --- a/erdpy/proxy/core.py +++ /dev/null @@ -1,167 +0,0 @@ -import logging -import time -from typing import Any, List, Tuple, Union, cast - -from erdpy.accounts import Address -from erdpy.interfaces import IAddress, IElrondProxy, ISimulateCostResponse, ISimulateResponse, ITransactionOnNetwork -from erdpy.proxy.http_facade import do_get, do_post -from erdpy.proxy.messages import NetworkConfig, SimulateCostResponse, SimulateResponse, TransactionOnNetwork - -METACHAIN_ID = 4294967295 -ANY_SHARD_ID = 0 -AWAIT_TRANSACTION_PERIOD = 5 - -logger = logging.getLogger("proxy") - - -class ElrondProxy(IElrondProxy): - def __init__(self, url: str): - self.url = url - - def get_account_nonce(self, address: IAddress) -> int: - url = f"{self.url}/address/{address.bech32()}" - response = do_get(url) - nonce = response.get("account").get("nonce", 0) - return int(nonce) - - def get_account_balance(self, address: IAddress): - url = f"{self.url}/address/{address.bech32()}/balance" - response = do_get(url) - balance = response.get("balance", 0) - return int(balance) - - def get_account(self, address: IAddress): - url = f"{self.url}/address/{address.bech32()}" - response = do_get(url) - account = response.get("account", dict()) - return account - - def get_account_transactions(self, address: Address): - TRUNCATE_DATA_THRESHOLD = 75 - - url = f"{self.url}/address/{address.bech32()}/transactions" - response = do_get(url) - transactions = response.get("transactions", []) - for transaction in transactions: - data = transaction.get("data") or "" - data = (data[:TRUNCATE_DATA_THRESHOLD] + ' ... truncated ...') if len(data) > TRUNCATE_DATA_THRESHOLD else data - transaction["data"] = data - return transactions - - def get_esdt_tokens(self, address: str) -> List: - response = do_get(f"{self.url}/address/{address}/esdt") - esdts = response.get("esdts") - return cast(List, esdts) - - def get_esdt_balance(self, address: str, ticker: str) -> dict: - response = do_get(f"{self.url}/address/{address}/esdt/{ticker}") - token_data = response.get("tokenData") - return cast(dict, token_data) - - def get_all_tokens(self) -> List[str]: - response = do_get(f"{self.url}/network/esdts") - tokens = response.get("tokens", []) - return cast(List[str], tokens) - - def get_num_shards(self): - network_config = self.get_network_config() - return network_config.num_shards - - def get_epoch(self): - status = self._get_network_status(METACHAIN_ID) - nonce = status.get("erd_epoch_number", 0) - return nonce - - def get_last_block_nonce(self, shard_id: Union[str, int]): - if shard_id == "metachain": - metrics = self._get_network_status(METACHAIN_ID) - else: - metrics = self._get_network_status(shard_id) - - nonce = metrics.get("erd_highest_final_nonce", 0) - return nonce - - def get_gas_price(self): - network_config = self.get_network_config() - return network_config.min_gas_price - - def get_chain_id(self): - network_config = self.get_network_config() - return network_config.chain_id - - def _get_network_status(self, shard_id: Union[str, int]): - url = f"{self.url}/network/status/{shard_id}" - response = do_get(url) - payload = response.get("status") - return payload - - def get_network_config(self) -> NetworkConfig: - url = f"{self.url}/network/config" - response = do_get(url) - payload = response.get("config") - result = NetworkConfig(payload) - return result - - def send_transaction(self, payload: Any) -> str: - url = f"{self.url}/transaction/send" - response = do_post(url, payload) - tx_hash = str(response.get("txHash")) - return tx_hash - - def simulate_transaction(self, payload: Any) -> ISimulateResponse: - url = f"{self.url}/transaction/simulate" - response = do_post(url, payload) - return SimulateResponse(response) - - def simulate_transaction_cost(self, payload: Any) -> ISimulateCostResponse: - url = f"{self.url}/transaction/cost" - response = do_post(url, payload) - return SimulateCostResponse(response) - - def send_transactions(self, payload: List[Any]) -> Tuple[int, List[str]]: - url = f"{self.url}/transaction/send-multiple" - response = do_post(url, payload) - # Proxy and Observers have different response format: - num_sent = response.get("numOfSentTxs", 0) or response.get("txsSent", 0) - hashes = response.get("txsHashes") - return num_sent, hashes - - def query_contract(self, payload: Any) -> Any: - url = f"{self.url}/vm-values/query" - response = do_post(url, payload) - return response - - def get_transaction(self, tx_hash: str, sender_address: str = "", with_results: bool = False) -> ITransactionOnNetwork: - url = f"{self.url}/transaction/{tx_hash}" - url += f"?sender={sender_address or ''}" - url += f"&withResults={with_results}" - - response = do_get(url) - return TransactionOnNetwork(tx_hash, response) - - def get_hyperblock(self, key) -> Any: - url = f"{self.url}/hyperblock/by-hash/{key}" - if str(key).isnumeric(): - url = f"{self.url}/hyperblock/by-nonce/{key}" - - response = do_get(url) - response = response.get("hyperblock", {}) - return response - - def send_transaction_and_wait_for_result(self, payload: Any, num_seconds_timeout: int = 100) -> ITransactionOnNetwork: - url = f"{self.url}/transaction/send" - response = do_post(url, payload) - tx_hash = response.get("txHash") - num_periods_to_wait = int(num_seconds_timeout / AWAIT_TRANSACTION_PERIOD) - - for _ in range(0, num_periods_to_wait): - time.sleep(AWAIT_TRANSACTION_PERIOD) - - tx = self.get_transaction(tx_hash=tx_hash, with_results=True) - if tx.is_done(): - return tx - else: - logger.info("Transaction not yet done.") - - return ITransactionOnNetwork() - diff --git a/erdpy/proxy/http_facade.py b/erdpy/proxy/http_facade.py deleted file mode 100644 index 02aab53b..00000000 --- a/erdpy/proxy/http_facade.py +++ /dev/null @@ -1,52 +0,0 @@ -from typing import Any, Dict -import requests -from erdpy import errors -from erdpy.proxy.messages import GenericProxyResponse - - -def do_get(url: str) -> GenericProxyResponse: - try: - response = requests.get(url) - response.raise_for_status() - parsed = response.json() - return get_data(parsed, url) - except requests.HTTPError as err: - error_data = _extract_error_from_response(err.response) - raise errors.ProxyRequestError(url, error_data) - except requests.ConnectionError as err: - raise errors.ProxyRequestError(url, err) - except Exception as err: - raise errors.ProxyRequestError(url, err) - - -def do_post(url: str, payload: Any) -> GenericProxyResponse: - try: - response = requests.post(url, json=payload) - response.raise_for_status() - parsed = response.json() - return get_data(parsed, url) - except requests.HTTPError as err: - error_data = _extract_error_from_response(err.response) - raise errors.ProxyRequestError(url, error_data) - except requests.ConnectionError as err: - raise errors.ProxyRequestError(url, err) - except Exception as err: - raise errors.ProxyRequestError(url, err) - - -def get_data(parsed: Dict[str, Any], url: str) -> GenericProxyResponse: - err = parsed.get("error") - code = parsed.get("code") - - if not err and code == "successful": - data: Dict[str, Any] = parsed.get("data", dict()) - return GenericProxyResponse(data) - - raise errors.ProxyRequestError(url, f"code:{code}, error: {err}") - - -def _extract_error_from_response(response: Any): - try: - return response.json() - except Exception: - return response.text diff --git a/erdpy/proxy/messages.py b/erdpy/proxy/messages.py deleted file mode 100644 index 72dedd8b..00000000 --- a/erdpy/proxy/messages.py +++ /dev/null @@ -1,141 +0,0 @@ -import base64 -from typing import Any, Dict, List, Union - -from erdpy.interfaces import ISimulateCostResponse, ISimulateResponse, ITransactionOnNetwork -from erdpy.utils import ISerializable - - -class GenericProxyResponse(ISerializable): - def __init__(self, data: Any) -> None: - self.__dict__.update(data) - - def get(self, key: str, default: Any = None) -> Any: - return self.__dict__.get(key, default) - - -class NetworkConfig: - def __init__(self, data: Dict[str, Any]) -> None: - self.num_shards = data.get("erd_num_shards_without_meta", 0) - self.min_gas_price = data.get("erd_min_gas_price", 0) - self.chain_id = data.get("erd_chain_id", "?") - self.min_tx_version = data.get("erd_min_transaction_version", 0) - - -class TransactionOnNetwork(ITransactionOnNetwork): - def __init__(self, hash: str, response: GenericProxyResponse) -> None: - raw = response.get("transaction", dict()) - contract_results: List[Dict[str, Any]] = raw.get("smartContractResults", []) - - self.raw = raw - self.hash = hash - self.parsed_contract_results = [SmartContractResult(item) for item in contract_results] - self.parsed_logs: List[Log] = [] - - def is_done(self) -> bool: - hyperblock: int = self.raw.get("hyperblockNonce", 0) - return hyperblock > 0 - - def get_hash(self) -> str: - return self.hash - - def to_dictionary(self) -> Dict[str, Any]: - result: Dict[str, Any] = dict() - result.update(self.raw) - result["parsed"] = dict() - - if self.parsed_contract_results: - result["parsed"]["smartContractResults"] = self.parsed_contract_results - if self.parsed_logs: - result["parsed"]["logs"] = self.parsed_logs - - return result - - -class SmartContractResult(ISerializable): - def __init__(self, raw: Dict[str, Any]) -> None: - self.raw = raw - self.return_message = self._parse_return_message() - self.arguments = self._parse_arguments() - self.parsed_log = Log(raw.get("logs", {})) - - def _parse_return_message(self) -> str: - try: - data_parts = self._parse_data_parts() - return_message_encoded = data_parts[0] - return_message = bytes.fromhex(return_message_encoded).decode("ascii") - return return_message - except: - return "" - - def _parse_arguments(self) -> List[str]: - try: - data_parts = self._parse_data_parts() - arguments = data_parts[1:] - return arguments - except: - return [] - - def _parse_data_parts(self) -> List[str]: - data: str = self.raw.get("data", "").lstrip("@") - return data.split("@") - - def to_dictionary(self) -> Dict[str, Any]: - result: Dict[str, Any] = dict() - result.update(self.raw) - result["parsed"] = { - "returnMessage": self.return_message, - "arguments": self.arguments, - "log": self.parsed_log - } - - return result - - -class Log(ISerializable): - def __init__(self, raw: Dict[str, Any]) -> None: - self.raw = raw - - -class SimulateResponse(ISimulateResponse): - def __init__(self, response: GenericProxyResponse) -> None: - result: Dict[str, Any] = response.get("result") or dict() - contract_results: Dict[str, Any] = result.get("scResults") or dict() - - self.raw = response.to_dictionary() - self.parsed_contract_results = [SmartContractResult(item) for item in contract_results.values()] - - def to_dictionary(self) -> Dict[str, Any]: - result: Dict[str, Any] = dict() - result.update(self.raw) - result["parsed"] = dict() - - if self.parsed_contract_results: - result["parsed"]["smartContractResults"] = self.parsed_contract_results - - return result - - -class SimulateCostResponse(ISimulateCostResponse): - def __init__(self, response: GenericProxyResponse) -> None: - contract_results: Dict[str, Any] = response.get("smartContractResults") or dict() - - self.raw = response.to_dictionary() - self.parsed_contract_results = [SmartContractResult(item) for item in contract_results.values()] - - def to_dictionary(self) -> Dict[str, Any]: - result: Dict[str, Any] = dict() - result.update(self.raw) - result["parsed"] = dict() - - if self.parsed_contract_results: - result["parsed"]["smartContractResults"] = self.parsed_contract_results - - return result - - -def decode_hex_base64(input: Union[str, None]) -> str: - return bytes.fromhex(decode_base64(input)).decode('ascii') if input else "" - - -def decode_base64(input: Union[str, None]) -> str: - return base64.b64decode(input).decode() if input else "" diff --git a/erdpy/simulation.py b/erdpy/simulation.py index b1a345b8..6908a4f5 100644 --- a/erdpy/simulation.py +++ b/erdpy/simulation.py @@ -1,9 +1,17 @@ from collections import OrderedDict from typing import Any, Dict -from erdpy.interfaces import IElrondProxy, ISimulateCostResponse, ISimulateResponse, ITransaction +from erdpy.interfaces import ISimulateCostResponse, ISimulateResponse, ITransaction from erdpy.utils import ISerializable +class INetworkProvider: + def simulate_transaction(self, transaction: Dict[str, Any]) -> ISimulateResponse: + ... + + def simulate_transaction_cost(self, trasaction: Dict[str, Any]) -> ISimulateCostResponse: + ... + + class Simulation(ISerializable): def __init__(self, simulate_response: ISimulateResponse, simulate_cost_response: ISimulateCostResponse) -> None: self.simulation_response = simulate_response @@ -17,7 +25,7 @@ def to_dictionary(self) -> Dict[str, Any]: return dictionary class Simulator(): - def __init__(self, proxy: IElrondProxy) -> None: + def __init__(self, proxy: INetworkProvider) -> None: self.proxy = proxy def run(self, transaction: ITransaction) -> Simulation: diff --git a/erdpy/tests/test_accounts_repository.py b/erdpy/tests/test_accounts_repository.py index 9329e9ac..22ce72c5 100644 --- a/erdpy/tests/test_accounts_repository.py +++ b/erdpy/tests/test_accounts_repository.py @@ -1,12 +1,17 @@ from erdpy.accounts import Address from erdpy.accounts_repository import AccountsRepository -from erdpy.interfaces import IAddress, IElrondProxy +from erdpy.interfaces import IAddress from erdpy.workstation import get_tools_folder TESTNET_USERS_FOLDER = get_tools_folder() / "testwallets" / "latest" / "users" DUMMY_NONCE = 42 +class INetworkProvider: + def get_account_nonce(self, address: IAddress) -> int: + ... + + def test_create_from_folder(): repository = AccountsRepository.create_from_folder(TESTNET_USERS_FOLDER) assert len(repository) == 12 @@ -49,6 +54,6 @@ def test_sync_nonces(): assert account.nonce == DUMMY_NONCE -class ElrondProxyStub(IElrondProxy): +class ElrondProxyStub(INetworkProvider): def get_account_nonce(self, address: IAddress) -> int: return DUMMY_NONCE diff --git a/examples/airdrop.py b/examples/airdrop.py index bf9107cc..63d43750 100644 --- a/examples/airdrop.py +++ b/examples/airdrop.py @@ -6,8 +6,7 @@ from erdpy.accounts import Account, Address from erdpy.accounts_repository import AccountsRepository -from erdpy.proxy import ElrondProxy -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import BunchOfTransactions, Transaction @@ -31,7 +30,7 @@ def main(): parser.add_argument("--value", type=int, help="value, as a number (atoms of EGLD)") args = parser.parse_args() - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) network = proxy.get_network_config() accounts = AccountsRepository.create_from_folder(Path(args.accounts)) sender = cast(Account, accounts.get_account(Address(args.sender))) @@ -51,7 +50,7 @@ def main(): transaction.gasPrice = network.min_gas_price transaction.gasLimit = 50000 transaction.chainID = network.chain_id - transaction.version = network.min_tx_version + transaction.version = network.min_transaction_version transaction.sign(sender) sender.nonce += 1 diff --git a/examples/contracts.py b/examples/contracts.py index dd22ad44..23b7dfa4 100644 --- a/examples/contracts.py +++ b/examples/contracts.py @@ -5,7 +5,7 @@ from erdpy.accounts import Account, Address from erdpy.contracts import CodeMetadata, SmartContract -from erdpy.proxy.core import ElrondProxy +from erdpy_network.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("examples") @@ -30,7 +30,7 @@ logging.basicConfig(level=logging.DEBUG) - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) network = proxy.get_network_config() user = Account(pem_file=args.pem) @@ -49,7 +49,7 @@ def do_deploy(): gas_limit=5000000, value=0, chain=network.chain_id, - version=network.min_tx_version + version=network.min_transaction_version ) tx_on_network = tx.send_wait_result(proxy, 5000) diff --git a/examples/staking.py b/examples/staking.py index 7c37caf9..57c8b3ed 100644 --- a/examples/staking.py +++ b/examples/staking.py @@ -5,8 +5,8 @@ from erdpy.accounts import Account, Address from erdpy.cli_output import CLIOutputBuilder from erdpy.cli_password import load_password -from erdpy.proxy.core import ElrondProxy from erdpy.transactions import Transaction +from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.validators.core import VALIDATORS_SMART_CONTRACT_ADDRESS, prepare_transaction_data_for_stake logger = logging.getLogger("examples") @@ -35,7 +35,7 @@ def main(): parser.add_argument("--value", type=int, required=True, help="value, as a number (atoms of EGLD)") args = parser.parse_args() - proxy = ElrondProxy(args.proxy) + proxy = ProxyNetworkProvider(args.proxy) network = proxy.get_network_config() password = load_password(args) node_operator = Account(key_file=args.keyfile, password=password) @@ -52,7 +52,7 @@ def main(): tx.gasLimit = gas_limit tx.data = data tx.chainID = network.chain_id - tx.version = network.min_tx_version + tx.version = network.min_transaction_version tx.sign(node_operator) utils.dump_out_json(CLIOutputBuilder().set_emitted_transaction(tx).build()) diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 00000000..be41aee1 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,18 @@ +{ + "include": [ + "erdpy" + ], + "exclude": [ + "**/__pycache__" + ], + "ignore": [], + "defineConstant": { + "DEBUG": true + }, + "venvPath": ".", + "venv": ".venv", + "stubPath": "", + "reportMissingImports": true, + "reportMissingTypeStubs": false, + "reportUnknownParameterType": true +} diff --git a/requirements.txt b/requirements.txt index fa8646f5..121b6412 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,4 +18,4 @@ setuptools git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-core.git@v0.2.0#egg=erdpy_core git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-wallet.git@v0.2.0#egg=erdpy_wallet -git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-network-providers.git@v0.3.0#egg=erdpy_network +git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-network-providers.git@erdpy-addons#egg=erdpy_network From bf2539de17f9b6e4bc45a2bed619c254ea628fc5 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 22 Dec 2022 15:09:54 +0200 Subject: [PATCH 05/26] fix --- erdpy/contracts.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/erdpy/contracts.py b/erdpy/contracts.py index bf91aa75..3d5f4cc6 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -1,6 +1,6 @@ import base64 import logging -from typing import Any, List, Optional, Tuple, Union +from typing import Any, List, Optional, Tuple, Union, Protocol from Cryptodome.Hash import keccak @@ -18,8 +18,8 @@ STR_PREFIX = "str:" -class INetworkProvider: - def query_contract(self, payload: Any) -> Any: +class INetworkProvider(Protocol): + def query_contract(self, query: Any) -> Any: ... From 08a022f3471f5a8c6f730dfdd36d2f5461334a1c Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Fri, 23 Dec 2022 17:09:18 +0200 Subject: [PATCH 06/26] integrate erdpy_network in erdpy --- erdpy/cli_accounts.py | 7 +++---- erdpy/cli_delegation.py | 39 ++++++++------------------------------- erdpy/cli_ledger.py | 4 ++-- erdpy/cli_password.py | 3 ++- erdpy/cli_shared.py | 2 +- erdpy/contracts.py | 5 ++--- erdpy/dns.py | 8 ++++---- erdpy/interfaces.py | 8 -------- erdpy/simulation.py | 6 +++--- erdpy/transactions.py | 31 ++++++++++++++++++------------- erdpy/utils.py | 5 +++-- requirements.txt | 6 +++--- 12 files changed, 49 insertions(+), 75 deletions(-) diff --git a/erdpy/cli_accounts.py b/erdpy/cli_accounts.py index b7540fdc..c539c57c 100644 --- a/erdpy/cli_accounts.py +++ b/erdpy/cli_accounts.py @@ -41,7 +41,6 @@ def get_account(args: Any): address = args.address proxy = ProxyNetworkProvider(proxy_url) account = proxy.get_account(Address(address)) - omit_fields = cli_shared.parse_omit_fields_arg(args) if args.balance: print(account.balance) @@ -50,8 +49,7 @@ def get_account(args: Any): elif args.username: print(account.username) else: - utils.omit_fields(account, omit_fields) - utils.dump_out_json(account) + utils.dump_out_json(account.to_dictionary()) def get_account_transactions(args: Any): @@ -60,4 +58,5 @@ def get_account_transactions(args: Any): proxy = ProxyNetworkProvider(proxy_url) response = proxy.get_account_transactions(Address(address)) - utils.dump_out_json(response, args.outfile) + transactions_as_dictionaries = [tx.to_dictionary() for tx in response] + utils.dump_out_json(transactions_as_dictionaries, args.outfile) diff --git a/erdpy/cli_delegation.py b/erdpy/cli_delegation.py index 0c2fa6ad..0f45af18 100644 --- a/erdpy/cli_delegation.py +++ b/erdpy/cli_delegation.py @@ -1,8 +1,6 @@ -import binascii from typing import Any, List from erdpy import cli_shared, errors, utils -from erdpy.accounts import Address from erdpy.delegation import staking_provider from erdpy_network.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import do_prepare_transaction @@ -150,13 +148,18 @@ def do_create_delegation_contract(args: Any): def get_contract_address_by_deploy_tx_hash(args: Any): args = utils.as_object(args) - omit_fields = cli_shared.parse_omit_fields_arg(args) proxy = ProxyNetworkProvider(args.proxy) transaction = proxy.get_transaction(args.create_tx_hash) - utils.omit_fields(transaction, omit_fields) - _get_sc_address_from_tx(transaction) + transaction_events = transaction.logs.events + if len(transaction_events) == 1: + contract_address = transaction_events[0].address + print(contract_address.bech32()) + + return contract_address + else: + raise errors.ProgrammingError("Tx has more than one event. Make sure it's a SC Deploy transaction.") def add_new_nodes(args: Any): @@ -255,29 +258,3 @@ def set_metadata(args: Any): tx = do_prepare_transaction(args) cli_shared.send_or_simulate(tx, args) - - -def _get_sc_address_from_tx(data: Any): - if not isinstance(data, dict): - raise errors.ProgrammingError("error") - - sc_results = data.get('smartContractResults') - if sc_results is None: - raise errors.ProgrammingError("smart contract results missing") - - # TODO improve robustness of this code in case of failed transaction - try: - sc_result = sc_results[0] - data_field = sc_result['data'] - - data_field_split = data_field.split('@') - arg_1 = binascii.unhexlify(data_field_split[1]) - if not arg_1 == b'ok': - raise errors.ProgrammingError(arg_1.decode("utf-8")) - - sc_address = binascii.unhexlify(data_field_split[2]) - address = Address(sc_address) - print("Contract address: ", address) - except Exception: - raise errors.ProgrammingError( - "cannot get the smart contract address from transaction results, please try again") diff --git a/erdpy/cli_ledger.py b/erdpy/cli_ledger.py index fd40a503..47b78e50 100644 --- a/erdpy/cli_ledger.py +++ b/erdpy/cli_ledger.py @@ -20,7 +20,7 @@ def setup_parser(subparsers: Any) -> Any: return subparsers -def print_addresses(args): +def print_addresses(args: Any): ledger_app = ElrondLedgerApp() for i in range(args.num_addresses): address = ledger_app.get_address(0, i) @@ -28,7 +28,7 @@ def print_addresses(args): ledger_app.close() -def print_version(args): +def print_version(args: Any): ledger_app = ElrondLedgerApp() print("Elrond App version: " + ledger_app.get_version()) ledger_app.close() diff --git a/erdpy/cli_password.py b/erdpy/cli_password.py index 3412d4ca..f05b54a2 100644 --- a/erdpy/cli_password.py +++ b/erdpy/cli_password.py @@ -1,6 +1,7 @@ +from typing import Any from getpass import getpass -def load_password(args): +def load_password(args: Any): if args.passfile: with open(args.passfile) as pass_file: return pass_file.read().strip() diff --git a/erdpy/cli_shared.py b/erdpy/cli_shared.py index 3d6e08a2..7f7f38f4 100644 --- a/erdpy/cli_shared.py +++ b/erdpy/cli_shared.py @@ -178,7 +178,7 @@ def send_or_simulate(tx: Transaction, args: Any, dump_output: bool = True) -> CL def check_if_sign_method_required(args: List[str], checked_method: str) -> bool: methods = ["--pem", "--keyfile", "--ledger"] - rest_of_methods = [] + rest_of_methods: List[str] = [] for method in methods: if method != checked_method: rest_of_methods.append(method) diff --git a/erdpy/contracts.py b/erdpy/contracts.py index 3d5f4cc6..1283861d 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -156,7 +156,7 @@ def query( caller: Optional[Address] = None ) -> List[Any]: response_data = self.query_detailed(proxy, function, arguments, value, caller) - return_data = response_data.get("returnData", []) or response_data.get("ReturnData", []) + return_data = response_data.return_data return [self._interpret_return_data(data) for data in return_data] def query_detailed(self, proxy: INetworkProvider, function: str, arguments: List[Any], @@ -167,8 +167,7 @@ def query_detailed(self, proxy: INetworkProvider, function: str, arguments: List query = ContractQuery(self.address, function, value, caller, prepared_arguments) response = proxy.query_contract(query) - response_data = response.get("data", {}) - return response_data + return response def _interpret_return_data(self, data: str) -> Any: if not data: diff --git a/erdpy/dns.py b/erdpy/dns.py index af89cc09..ba0d2930 100644 --- a/erdpy/dns.py +++ b/erdpy/dns.py @@ -1,4 +1,4 @@ -from typing import Any, List, Dict +from typing import Any, List, Protocol from Cryptodome.Hash import keccak @@ -12,8 +12,8 @@ InitialDNSAddress = bytes([1] * 32) -class INetworkProvider: - def query_contract(self, payload: Dict[str, Any]) -> Any: +class INetworkProvider(Protocol): + def query_contract(self, query: Any) -> Any: ... @@ -52,7 +52,7 @@ def register(args: Any): def compute_all_dns_addresses() -> List[Address]: - addresses = [] + addresses: List[Address] = [] for i in range(0, 256): addresses.append(compute_dns_address_for_shard_id(i)) return addresses diff --git a/erdpy/interfaces.py b/erdpy/interfaces.py index 22fe534e..8d27636f 100644 --- a/erdpy/interfaces.py +++ b/erdpy/interfaces.py @@ -44,14 +44,6 @@ def sign_transaction(self, transaction: ITransaction) -> str: return "" -class ITransactionOnNetwork(ISerializable): - def is_done(self) -> bool: - return False - - def get_hash(self) -> str: - return "" - - class ISimulateResponse(ISerializable): pass diff --git a/erdpy/simulation.py b/erdpy/simulation.py index 6908a4f5..e7f352fa 100644 --- a/erdpy/simulation.py +++ b/erdpy/simulation.py @@ -1,14 +1,14 @@ from collections import OrderedDict -from typing import Any, Dict +from typing import Any, Dict, Protocol from erdpy.interfaces import ISimulateCostResponse, ISimulateResponse, ITransaction from erdpy.utils import ISerializable -class INetworkProvider: +class INetworkProvider(Protocol): def simulate_transaction(self, transaction: Dict[str, Any]) -> ISimulateResponse: ... - def simulate_transaction_cost(self, trasaction: Dict[str, Any]) -> ISimulateCostResponse: + def simulate_transaction_cost(self, transaction: Dict[str, Any]) -> ISimulateCostResponse: ... diff --git a/erdpy/transactions.py b/erdpy/transactions.py index a0072264..1aa0f3a7 100644 --- a/erdpy/transactions.py +++ b/erdpy/transactions.py @@ -3,24 +3,29 @@ import logging import time from collections import OrderedDict -from typing import Any, Dict, List, TextIO, Tuple +from typing import Any, Dict, List, TextIO, Tuple, Protocol, Sequence from erdpy import config, errors, utils from erdpy.accounts import Account, Address, LedgerAccount from erdpy.cli_password import load_password -from erdpy.interfaces import ITransaction, ITransactionOnNetwork +from erdpy.interfaces import ITransaction logger = logging.getLogger("transactions") -class INetworkProvider: - def send_transaction(self, transaction: ITransaction) -> str: +class ITransactionOnNetwork(Protocol): + hash: str + is_completed: bool + + def to_dictionary(self) -> Dict[str, Any]: ... - - def send_transactions(self, transactions: List[ITransaction]) -> Tuple[int, str]: + + +class INetworkProvider(Protocol): + def send_transaction(self, transaction: ITransaction) -> str: ... - def send_wait_result(self) -> ITransactionOnNetwork: + def send_transactions(self, transactions: Sequence[ITransaction]) -> Tuple[int, str]: ... def get_transaction(self, tx_hash: str) -> ITransactionOnNetwork: @@ -65,7 +70,7 @@ def receiver_username_decoded(self) -> str: return self._field_decoded("receiverUsername") def _field_encoded(self, field: str) -> str: - field_bytes = self.__dict__.get(field, None).encode("utf-8") + field_bytes = self.__dict__.get(field, "").encode("utf-8") encoded = base64.b64encode(field_bytes).decode() return encoded @@ -122,7 +127,7 @@ def send_wait_result(self, proxy: INetworkProvider, timeout: int) -> ITransactio raise errors.TransactionIsNotSigned() txOnNetwork = self.__send_transaction_and_wait_for_result(proxy , self, timeout) - self.hash = txOnNetwork.get_hash() + self.hash = txOnNetwork.hash return txOnNetwork def __send_transaction_and_wait_for_result(self, proxy: INetworkProvider, payload: Any, num_seconds_timeout: int = 100) -> ITransactionOnNetwork: @@ -140,7 +145,7 @@ def __send_transaction_and_wait_for_result(self, proxy: INetworkProvider, payloa else: logger.info("Transaction not yet done.") - return ITransactionOnNetwork() + raise errors.KnownError("Took too long to get transaction.") def to_dictionary(self) -> Dict[str, Any]: dictionary: Dict[str, Any] = OrderedDict() @@ -225,7 +230,7 @@ def add(self, sender: Account, receiver_address: str, nonce: Any, value: Any, da tx.sign(sender) self.transactions.append(tx) - def add_tx(self, tx): + def add_tx(self, tx: Transaction): self.transactions.append(tx) def send(self, proxy: INetworkProvider): @@ -251,8 +256,8 @@ def do_prepare_transaction(args: Any) -> Transaction: tx.value = args.value tx.receiver = args.receiver tx.sender = account.address.bech32() - tx.senderUsername = getattr(args, "sender_username", None) - tx.receiverUsername = getattr(args, "receiver_username", None) + tx.senderUsername = getattr(args, "sender_username", "") + tx.receiverUsername = getattr(args, "receiver_username", "") tx.gasPrice = int(args.gas_price) tx.gasLimit = int(args.gas_limit) tx.data = args.data diff --git a/erdpy/utils.py b/erdpy/utils.py index a7a639b1..1b8e765b 100644 --- a/erdpy/utils.py +++ b/erdpy/utils.py @@ -9,7 +9,7 @@ import tarfile import zipfile from pathlib import Path -from typing import Any, List, Union, Optional, cast, IO, Dict +from typing import Any, List, Union, Optional, cast, IO, Dict, Protocol, runtime_checkable import toml @@ -18,7 +18,8 @@ logger = logging.getLogger("utils") -class ISerializable: +@runtime_checkable +class ISerializable(Protocol): def to_dictionary(self) -> Dict[str, Any]: return self.__dict__ diff --git a/requirements.txt b/requirements.txt index 121b6412..db9e9bd1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,6 @@ pytest setuptools -git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-core.git@v0.2.0#egg=erdpy_core -git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-wallet.git@v0.2.0#egg=erdpy_wallet -git+https://github.com/ElrondNetwork/sdk-erdpy-eggs-network-providers.git@erdpy-addons#egg=erdpy_network +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.2.0#egg=erdpy_core +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.0#egg=erdpy_wallet +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@erdpy-addons#egg=erdpy_network From 086c0cc18f51bb50c46d729755bc8a0f5db2bfe1 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 27 Dec 2022 14:05:24 +0200 Subject: [PATCH 07/26] add args to main function + fix test --- erdpy/cli.py | 12 ++++++------ erdpy/tests/test_accounts_repository.py | 12 ++++++++++-- erdpy/transactions.py | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/erdpy/cli.py b/erdpy/cli.py index 23d1b369..8c12bc46 100644 --- a/erdpy/cli.py +++ b/erdpy/cli.py @@ -24,9 +24,9 @@ logger = logging.getLogger("cli") -def main(): +def main(cli_args: List[str]): try: - _do_main() + _do_main(cli_args) except errors.KnownError as err: logger.critical(err.get_pretty()) return 1 @@ -36,11 +36,11 @@ def main(): return 0 -def _do_main(): +def _do_main(cli_args: List[str]): logging.basicConfig(level=logging.INFO) scope.initialize() - argv_with_config_args = config.add_config_args(sys.argv[1:]) + argv_with_config_args = config.add_config_args(cli_args) parser = setup_parser(argv_with_config_args) args = parser.parse_args(argv_with_config_args) @@ -55,7 +55,7 @@ def _do_main(): args.func(args) -def setup_parser(args: List[str] = sys.argv[1:]): +def setup_parser(args: List[str]): parser = ArgumentParser( prog="erdpy", usage="erdpy [-h] [-v] [--verbose] COMMAND-GROUP [-h] COMMAND ...", @@ -108,5 +108,5 @@ def setup_parser(args: List[str] = sys.argv[1:]): if __name__ == "__main__": - ret = main() + ret = main(sys.argv[1:]) sys.exit(ret) diff --git a/erdpy/tests/test_accounts_repository.py b/erdpy/tests/test_accounts_repository.py index 22ce72c5..1751a09a 100644 --- a/erdpy/tests/test_accounts_repository.py +++ b/erdpy/tests/test_accounts_repository.py @@ -1,4 +1,6 @@ -from erdpy.accounts import Address +from typing import Protocol + +from erdpy.accounts import Address, AccountOnNetwork from erdpy.accounts_repository import AccountsRepository from erdpy.interfaces import IAddress from erdpy.workstation import get_tools_folder @@ -7,7 +9,7 @@ DUMMY_NONCE = 42 -class INetworkProvider: +class INetworkProvider(Protocol): def get_account_nonce(self, address: IAddress) -> int: ... @@ -57,3 +59,9 @@ def test_sync_nonces(): class ElrondProxyStub(INetworkProvider): def get_account_nonce(self, address: IAddress) -> int: return DUMMY_NONCE + + def get_account(self, address: IAddress) -> AccountOnNetwork: + account = AccountOnNetwork() + account.nonce = DUMMY_NONCE + + return account diff --git a/erdpy/transactions.py b/erdpy/transactions.py index 1aa0f3a7..0fefdb1f 100644 --- a/erdpy/transactions.py +++ b/erdpy/transactions.py @@ -103,7 +103,7 @@ def serialize_as_inner(self) -> str: @classmethod def load_from_file(cls, f: TextIO): data_json: bytes = f.read().encode() - fields = json.loads(data_json).get("tx") + fields = json.loads(data_json).get("tx") or json.loads(data_json).get("emittedTransaction") instance = cls() instance.__dict__.update(fields) instance.data = instance.data_decoded() From 5c89c02ca121a9622e8204b02ccf01901336a7c7 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 27 Dec 2022 19:20:08 +0200 Subject: [PATCH 08/26] add tests and fixes --- erdpy/cli_delegation.py | 2 - erdpy/contracts.py | 15 ++---- erdpy/tests/test_proxy.py | 110 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+), 14 deletions(-) create mode 100644 erdpy/tests/test_proxy.py diff --git a/erdpy/cli_delegation.py b/erdpy/cli_delegation.py index 0f45af18..c04946ef 100644 --- a/erdpy/cli_delegation.py +++ b/erdpy/cli_delegation.py @@ -156,8 +156,6 @@ def get_contract_address_by_deploy_tx_hash(args: Any): if len(transaction_events) == 1: contract_address = transaction_events[0].address print(contract_address.bech32()) - - return contract_address else: raise errors.ProgrammingError("Tx has more than one event. Make sure it's a SC Deploy transaction.") diff --git a/erdpy/contracts.py b/erdpy/contracts.py index 1283861d..c7263e95 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -1,6 +1,6 @@ import base64 import logging -from typing import Any, List, Optional, Tuple, Union, Protocol +from typing import Any, List, Optional, Tuple, Protocol from Cryptodome.Hash import keccak @@ -8,6 +8,7 @@ from erdpy.accounts import Account, Address from erdpy.transactions import Transaction from erdpy.utils import Object +from erdpy_network.proxy_network_provider import ContractQuery logger = logging.getLogger("contracts") @@ -30,15 +31,6 @@ def __init__(self, as_base64: str, as_hex: str, as_number: int): self.number = as_number -class ContractQuery: - def __init__(self, contract: Address, function: str, value: int, caller: Union[Address, None], arguments: List[str]) -> None: - self.contract = contract - self.function = function - self.value = value - self.caller = caller - self.arguments = arguments - - class SmartContract: def __init__(self, address: Optional[Address] = None, bytecode=None, metadata=None): self.address = Address(address) @@ -162,9 +154,8 @@ def query( def query_detailed(self, proxy: INetworkProvider, function: str, arguments: List[Any], value: int = 0, caller: Optional[Address] = None) -> Any: arguments = arguments or [] - prepared_arguments = [argument.encode() for argument in arguments] - query = ContractQuery(self.address, function, value, caller, prepared_arguments) + query = ContractQuery(self.address, function, value, arguments, caller) response = proxy.query_contract(query) return response diff --git a/erdpy/tests/test_proxy.py b/erdpy/tests/test_proxy.py new file mode 100644 index 00000000..29242980 --- /dev/null +++ b/erdpy/tests/test_proxy.py @@ -0,0 +1,110 @@ +import os +from erdpy.cli import main +from erdpy.accounts import Account +from erdpy_network.proxy_network_provider import ProxyNetworkProvider + + +def test_get_transactions(): + main( + [ + "account", + "get-transactions", + "--address", + "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + "--outfile", + "txs.txt", + ] + ) + assert os.path.isfile("txs.txt") == True + + +def test_get_account(): + result = main( + [ + "account", + "get", + "--address", + "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", + ] + ) + if not result: + assert True + else: + assert False + + +def test_get_hyperblock_by_nonce(): + result = main( + [ + "hyperblock", + "get", + "--key", + "3895403", + "--proxy", + "https://devnet-api.elrond.com", + ] + ) + if not result: + assert True + else: + assert False + + +def test_get_hyperblock_by_hash(): + result = main( + [ + "hyperblock", + "get", + "--key", + "85ccf29f51d7acf0fbb6cfcf2e4b89eee2f2264dd989edd5a870d33dacc24743", + "--proxy", + "https://devnet-api.elrond.com", + ] + ) + if not result: + assert True + else: + assert False + + +def test_sync_nonce(): + account = Account("erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th") + proxy = ProxyNetworkProvider("https://devnet-api.elrond.com") + account.sync_nonce(proxy) + + assert account.nonce >= 11480 + + +def test_query_contract(): + result = main( + [ + "contract", + "query", + "erd1qqqqqqqqqqqqqpgquykqja5c4v33zdmnwglj3jphqwrelzdn396qlc9g33", + "--function", + "getSum", + "--proxy", + "https://devnet-api.elrond.com", + ] + ) + if not result: + assert True + else: + assert False + + +def test_get_contract_address_by_deploy_tx_hash(): + result = main( + [ + "staking-provider", + "get-contract-address", + "--create-tx-hash", + "12b9820df0fd71fc4b81b13a5484a0038b256249aae358112892ba599808bf7e", + "--proxy", + "https://devnet-api.elrond.com", + ] + ) + if not result: + assert True + else: + assert False From ee4f5a1d748c8081c634c82c2c448235e4b7e3b8 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 28 Dec 2022 13:44:40 +0200 Subject: [PATCH 09/26] add tests and small fixes --- erdpy/cli_delegation.py | 3 +-- erdpy/tests/test_proxy.py | 42 ++++++++++++++++++++++++++++++++------- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/erdpy/cli_delegation.py b/erdpy/cli_delegation.py index c04946ef..cbdd67f1 100644 --- a/erdpy/cli_delegation.py +++ b/erdpy/cli_delegation.py @@ -25,7 +25,6 @@ def setup_parser(args: List[str], subparsers: Any) -> Any: sub.add_argument("--create-tx-hash", required=True, help="the hash") sub.add_argument("--sender", required=False, help="the sender address") cli_shared.add_proxy_arg(sub) - cli_shared.add_omit_fields_arg(sub) sub.set_defaults(func=get_contract_address_by_deploy_tx_hash) # add a new node @@ -157,7 +156,7 @@ def get_contract_address_by_deploy_tx_hash(args: Any): contract_address = transaction_events[0].address print(contract_address.bech32()) else: - raise errors.ProgrammingError("Tx has more than one event. Make sure it's a SC Deploy transaction.") + raise errors.ProgrammingError("Tx has more than one event. Make sure it's a staking provider SC Deploy transaction.") def add_new_nodes(args: Any): diff --git a/erdpy/tests/test_proxy.py b/erdpy/tests/test_proxy.py index 29242980..fa50e8b9 100644 --- a/erdpy/tests/test_proxy.py +++ b/erdpy/tests/test_proxy.py @@ -12,10 +12,10 @@ def test_get_transactions(): "--address", "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", "--outfile", - "txs.txt", + "testdata-out/SANDBOX/transactions.txt", ] ) - assert os.path.isfile("txs.txt") == True + assert os.path.isfile("testdata-out/SANDBOX/transactions.txt") == True def test_get_account(): @@ -93,17 +93,45 @@ def test_query_contract(): assert False -def test_get_contract_address_by_deploy_tx_hash(): +def test_get_num_shards(): + result = main(["network", "num-shards"]) + + if not result: + assert True + else: + assert False + + +def test_get_last_block_nonce(): + result = main(["network", "block-nonce", "--shard", "4294967295"]) + + if not result: + assert True + else: + assert False + + +def test_get_chain_id(): + result = main(["network", "chain"]) + + if not result: + assert True + else: + assert False + + +def test_get_transaction(): result = main( [ - "staking-provider", - "get-contract-address", - "--create-tx-hash", - "12b9820df0fd71fc4b81b13a5484a0038b256249aae358112892ba599808bf7e", + "tx", + "get", "--proxy", "https://devnet-api.elrond.com", + "--hash", + "2cb813be9d5e5040abb2522da75fa5c8d94f72caa510ff51d7525659f398298b", ] ) + if not result: assert True else: From 5ff5370b6a8cd6ee81b5e60f88922ffa92abe8a3 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 28 Dec 2022 15:30:53 +0200 Subject: [PATCH 10/26] modify version for referenced packages --- requirements.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index f5b9c24c..db754225 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,6 +18,6 @@ setuptools mx-sdk-build-contract-rs==4.0.0 -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.2.0#egg=erdpy_core -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.0#egg=erdpy_wallet +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.3.0#egg=erdpy_core +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.1#egg=erdpy_wallet git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@erdpy-addons#egg=erdpy_network From 0a412472f5fdb6ae95e772958b8943dfb17178f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 29 Dec 2022 21:09:28 +0200 Subject: [PATCH 11/26] Simple commit to trigger workflows. --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index db754225..ae2d4457 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,4 +20,5 @@ mx-sdk-build-contract-rs==4.0.0 git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.3.0#egg=erdpy_core git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.1#egg=erdpy_wallet +# TODO: use release tag. git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@erdpy-addons#egg=erdpy_network From e65af3d7a4bbb576a81e12e9c72cf4be9f638f36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Thu, 29 Dec 2022 21:22:22 +0200 Subject: [PATCH 12/26] Trigger github workflow. --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index ae2d4457..387a207b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -21,4 +21,4 @@ mx-sdk-build-contract-rs==4.0.0 git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.3.0#egg=erdpy_core git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.1#egg=erdpy_wallet # TODO: use release tag. -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@erdpy-addons#egg=erdpy_network +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@v0.6.0-alpha.1#egg=erdpy_network From 054cf24fe902082afbbd89ab2be7c0328eeec303 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Tue, 3 Jan 2023 11:52:03 +0200 Subject: [PATCH 13/26] reference new release for erdpy_network_providers --- requirements.txt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 387a207b..1f08487a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,5 +20,4 @@ mx-sdk-build-contract-rs==4.0.0 git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.3.0#egg=erdpy_core git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.1#egg=erdpy_wallet -# TODO: use release tag. -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@v0.6.0-alpha.1#egg=erdpy_network +git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@v0.6.0#egg=erdpy_network_providers From b2b213760a7e3e8c66d301cd232416d8515a5662 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 13:30:42 +0200 Subject: [PATCH 14/26] fix package referencing and renaming --- erdpy/accounts.py | 2 +- erdpy/accounts_repository.py | 2 +- erdpy/cli_accounts.py | 2 +- erdpy/cli_block.py | 2 +- erdpy/cli_contracts.py | 2 +- erdpy/cli_delegation.py | 2 +- erdpy/cli_dns.py | 2 +- erdpy/cli_network.py | 2 +- erdpy/cli_shared.py | 2 +- erdpy/cli_transactions.py | 2 +- erdpy/contracts.py | 2 +- erdpy/projects/eei_activation.py | 2 +- erdpy/tests/test_proxy.py | 2 +- examples/airdrop.py | 2 +- examples/contracts.py | 2 +- examples/staking.py | 2 +- requirements.txt | 4 +--- setup.py | 3 ++- 18 files changed, 19 insertions(+), 20 deletions(-) diff --git a/erdpy/accounts.py b/erdpy/accounts.py index 9db100c2..e7293501 100644 --- a/erdpy/accounts.py +++ b/erdpy/accounts.py @@ -6,7 +6,7 @@ from erdpy import constants, errors from erdpy.interfaces import IAccount, IAddress, ITransaction -from erdpy_network.accounts import AccountOnNetwork +from erdpy_network_providers.accounts import AccountOnNetwork from erdpy.ledger.config import compare_versions from erdpy.ledger.ledger_app_handler import SIGN_USING_HASH_VERSION from erdpy.ledger.ledger_functions import do_get_ledger_address, do_sign_transaction_with_ledger, do_get_ledger_version, \ diff --git a/erdpy/accounts_repository.py b/erdpy/accounts_repository.py index eafe3843..df336e90 100644 --- a/erdpy/accounts_repository.py +++ b/erdpy/accounts_repository.py @@ -5,7 +5,7 @@ from erdpy import utils from erdpy.accounts import Account, Address -from erdpy_network.accounts import AccountOnNetwork +from erdpy_network_providers.accounts import AccountOnNetwork from erdpy.interfaces import IAddress from erdpy.wallet import pem diff --git a/erdpy/cli_accounts.py b/erdpy/cli_accounts.py index c539c57c..6dfc2f75 100644 --- a/erdpy/cli_accounts.py +++ b/erdpy/cli_accounts.py @@ -3,7 +3,7 @@ from erdpy import cli_shared, utils from erdpy.accounts import Address -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("cli.accounts") diff --git a/erdpy/cli_block.py b/erdpy/cli_block.py index ba3bcdb5..6e0ef57e 100644 --- a/erdpy/cli_block.py +++ b/erdpy/cli_block.py @@ -1,7 +1,7 @@ from typing import Any from erdpy import cli_shared, utils -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider def setup_parser(subparsers: Any) -> Any: diff --git a/erdpy/cli_contracts.py b/erdpy/cli_contracts.py index 7a22a877..8ba7e729 100644 --- a/erdpy/cli_contracts.py +++ b/erdpy/cli_contracts.py @@ -11,7 +11,7 @@ from erdpy.contracts import CodeMetadata, SmartContract from erdpy.projects import load_project from erdpy.projects.core import get_project_paths_recursively -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import Transaction from erdpy.docker import is_docker_installed, run_docker from erdpy.errors import DockerMissingError diff --git a/erdpy/cli_delegation.py b/erdpy/cli_delegation.py index cbdd67f1..2a8488c1 100644 --- a/erdpy/cli_delegation.py +++ b/erdpy/cli_delegation.py @@ -2,7 +2,7 @@ from erdpy import cli_shared, errors, utils from erdpy.delegation import staking_provider -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import do_prepare_transaction diff --git a/erdpy/cli_dns.py b/erdpy/cli_dns.py index fd7d1b97..6bec3f09 100644 --- a/erdpy/cli_dns.py +++ b/erdpy/cli_dns.py @@ -5,7 +5,7 @@ from erdpy.dns import (name_hash, dns_address_for_name, register, resolve, registration_cost, validate_name, version, compute_dns_address_for_shard_id) from erdpy.accounts import Address -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider def setup_parser(args: List[str], subparsers: Any) -> Any: diff --git a/erdpy/cli_network.py b/erdpy/cli_network.py index 5b75120f..78a38a41 100644 --- a/erdpy/cli_network.py +++ b/erdpy/cli_network.py @@ -1,4 +1,4 @@ -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy import cli_shared import logging from typing import Any diff --git a/erdpy/cli_shared.py b/erdpy/cli_shared.py index 7f7f38f4..7060c756 100644 --- a/erdpy/cli_shared.py +++ b/erdpy/cli_shared.py @@ -9,7 +9,7 @@ from erdpy.cli_output import CLIOutputBuilder from erdpy.cli_password import load_password from erdpy.ledger.ledger_functions import do_get_ledger_address -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.simulation import Simulator from erdpy.transactions import Transaction diff --git a/erdpy/cli_transactions.py b/erdpy/cli_transactions.py index e841ded2..6eb02fcf 100644 --- a/erdpy/cli_transactions.py +++ b/erdpy/cli_transactions.py @@ -3,7 +3,7 @@ from erdpy import cli_shared, utils from erdpy.cli_output import CLIOutputBuilder -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import Transaction, do_prepare_transaction diff --git a/erdpy/contracts.py b/erdpy/contracts.py index c7263e95..67935dcf 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -8,7 +8,7 @@ from erdpy.accounts import Account, Address from erdpy.transactions import Transaction from erdpy.utils import Object -from erdpy_network.proxy_network_provider import ContractQuery +from erdpy_network_providers.proxy_network_provider import ContractQuery logger = logging.getLogger("contracts") diff --git a/erdpy/projects/eei_activation.py b/erdpy/projects/eei_activation.py index d0965f0a..fdf4adc9 100644 --- a/erdpy/projects/eei_activation.py +++ b/erdpy/projects/eei_activation.py @@ -5,7 +5,7 @@ import requests import toml from erdpy.diskcache import DiskCache -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("eei") diff --git a/erdpy/tests/test_proxy.py b/erdpy/tests/test_proxy.py index fa50e8b9..7a742c82 100644 --- a/erdpy/tests/test_proxy.py +++ b/erdpy/tests/test_proxy.py @@ -1,7 +1,7 @@ import os from erdpy.cli import main from erdpy.accounts import Account -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider def test_get_transactions(): diff --git a/examples/airdrop.py b/examples/airdrop.py index 63d43750..e9e250f7 100644 --- a/examples/airdrop.py +++ b/examples/airdrop.py @@ -6,7 +6,7 @@ from erdpy.accounts import Account, Address from erdpy.accounts_repository import AccountsRepository -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.transactions import BunchOfTransactions, Transaction diff --git a/examples/contracts.py b/examples/contracts.py index 23b7dfa4..8d3c572d 100644 --- a/examples/contracts.py +++ b/examples/contracts.py @@ -5,7 +5,7 @@ from erdpy.accounts import Account, Address from erdpy.contracts import CodeMetadata, SmartContract -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider logger = logging.getLogger("examples") diff --git a/examples/staking.py b/examples/staking.py index 57c8b3ed..7bdf1873 100644 --- a/examples/staking.py +++ b/examples/staking.py @@ -6,7 +6,7 @@ from erdpy.cli_output import CLIOutputBuilder from erdpy.cli_password import load_password from erdpy.transactions import Transaction -from erdpy_network.proxy_network_provider import ProxyNetworkProvider +from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider from erdpy.validators.core import VALIDATORS_SMART_CONTRACT_ADDRESS, prepare_transaction_data_for_stake logger = logging.getLogger("examples") diff --git a/requirements.txt b/requirements.txt index 1f08487a..a0fbf32e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,6 +18,4 @@ setuptools mx-sdk-build-contract-rs==4.0.0 -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-core.git@v0.3.0#egg=erdpy_core -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-wallet.git@v0.2.1#egg=erdpy_wallet -git+https://github.com/ElrondNetwork/mx-sdk-erdpy-network-providers.git@v0.6.0#egg=erdpy_network_providers +mx-sdk-erdpy-network-providers==0.6.2 diff --git a/setup.py b/setup.py index ff091a21..8c96b06d 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,8 @@ "ledgercomm[hid]", "semver", "requests-cache", - "mx-sdk-build-contract-rs==4.0.0" + "mx-sdk-build-contract-rs==4.0.0", + "mx-sdk-erdpy-network-providers==0.6.2" ], zip_safe=False, keywords=["Elrond"], From 6762a6c0f98fa0de022bd2b696b12924bbf15306 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 14:01:26 +0200 Subject: [PATCH 15/26] add default args to main function --- erdpy/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erdpy/cli.py b/erdpy/cli.py index 8c12bc46..c451695e 100644 --- a/erdpy/cli.py +++ b/erdpy/cli.py @@ -24,7 +24,7 @@ logger = logging.getLogger("cli") -def main(cli_args: List[str]): +def main(cli_args: List[str] = []): try: _do_main(cli_args) except errors.KnownError as err: From a4e22ebcfee955d40401a7270d9fd50b6be339cf Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 14:31:25 +0200 Subject: [PATCH 16/26] list files in github actions --- .github/workflows/erdpy.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/erdpy.yml b/.github/workflows/erdpy.yml index df947d7a..2a565aa4 100644 --- a/.github/workflows/erdpy.yml +++ b/.github/workflows/erdpy.yml @@ -63,6 +63,7 @@ jobs: - name: Setup test dependencies run: | python3 -m erdpy.cli deps install testwallets + ls -l /home/runner/elrondsdk/testwallets/latest/users/ - name: Run unit tests run: | export PYTHONPATH=. From bf52ba0b79f14955f23629b27a5a241632a27cc8 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 14:51:33 +0200 Subject: [PATCH 17/26] fix repo name --- .github/workflows/erdpy.yml | 1 - erdpy/dependencies/modules.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/erdpy.yml b/.github/workflows/erdpy.yml index 2a565aa4..df947d7a 100644 --- a/.github/workflows/erdpy.yml +++ b/.github/workflows/erdpy.yml @@ -63,7 +63,6 @@ jobs: - name: Setup test dependencies run: | python3 -m erdpy.cli deps install testwallets - ls -l /home/runner/elrondsdk/testwallets/latest/users/ - name: Run unit tests run: | export PYTHONPATH=. diff --git a/erdpy/dependencies/modules.py b/erdpy/dependencies/modules.py index 679a3f18..437488c3 100644 --- a/erdpy/dependencies/modules.py +++ b/erdpy/dependencies/modules.py @@ -407,7 +407,7 @@ class TestWalletsModule(StandaloneModule): def __init__(self, key: str): super().__init__(key, []) self.organisation = "ElrondNetwork" - self.repo_name = "elrond-sdk-testwallets" + self.repo_name = "mx-sdk-testwallets" def _post_install(self, tag: str): # We'll create a "latest" symlink From 440b85913c809bc4f32790687a0c18c493d01b04 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 14:54:52 +0200 Subject: [PATCH 18/26] fix name --- erdpy/dependencies/modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erdpy/dependencies/modules.py b/erdpy/dependencies/modules.py index 679a3f18..437488c3 100644 --- a/erdpy/dependencies/modules.py +++ b/erdpy/dependencies/modules.py @@ -407,7 +407,7 @@ class TestWalletsModule(StandaloneModule): def __init__(self, key: str): super().__init__(key, []) self.organisation = "ElrondNetwork" - self.repo_name = "elrond-sdk-testwallets" + self.repo_name = "mx-sdk-testwallets" def _post_install(self, tag: str): # We'll create a "latest" symlink From adaff8b9e3bf226286cdf3dfc1ce02ef9d226e7d Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 14:59:27 +0200 Subject: [PATCH 19/26] fix organisation name --- erdpy/dependencies/modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erdpy/dependencies/modules.py b/erdpy/dependencies/modules.py index 437488c3..71e48883 100644 --- a/erdpy/dependencies/modules.py +++ b/erdpy/dependencies/modules.py @@ -406,7 +406,7 @@ def _post_install(self, tag: str): class TestWalletsModule(StandaloneModule): def __init__(self, key: str): super().__init__(key, []) - self.organisation = "ElrondNetwork" + self.organisation = "multiversx" self.repo_name = "mx-sdk-testwallets" def _post_install(self, tag: str): From 591fe9cb55d4e5f86dae9acbae75b929c9f78192 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Wed, 4 Jan 2023 16:37:15 +0200 Subject: [PATCH 20/26] fix after migration --- erdpy/CHANGELOG.md | 3 +++ erdpy/_version.py | 2 +- erdpy/dependencies/modules.py | 4 ++-- erdpy/projects/templates_config.py | 2 +- setup.py | 6 +++--- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/erdpy/CHANGELOG.md b/erdpy/CHANGELOG.md index 968f54ee..c5c7316d 100644 --- a/erdpy/CHANGELOG.md +++ b/erdpy/CHANGELOG.md @@ -7,6 +7,9 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how ## [Unreleased] - TBD +## [3.0.2] + - Fixes after repository migrations + ## [3.0.1] - [Contract verify: fix CLI arguments & json request](https://github.com/ElrondNetwork/elrond-sdk-erdpy/pull/171) diff --git a/erdpy/_version.py b/erdpy/_version.py index 05527687..131942e7 100644 --- a/erdpy/_version.py +++ b/erdpy/_version.py @@ -1 +1 @@ -__version__ = "3.0.1" +__version__ = "3.0.2" diff --git a/erdpy/dependencies/modules.py b/erdpy/dependencies/modules.py index 71e48883..0e5899a8 100644 --- a/erdpy/dependencies/modules.py +++ b/erdpy/dependencies/modules.py @@ -150,8 +150,8 @@ def __init__(self, key: str, aliases: List[str] = None): aliases = list() super().__init__(key, aliases) - self.repo_name = 'wasm-vm' - self.organisation = 'ElrondNetwork' + self.repo_name = 'mx-vm-wasm-go' + self.organisation = 'multiversx' def _post_install(self, tag: str): dependencies.install_module('golang') diff --git a/erdpy/projects/templates_config.py b/erdpy/projects/templates_config.py index c278e6b1..8eb646b4 100644 --- a/erdpy/projects/templates_config.py +++ b/erdpy/projects/templates_config.py @@ -26,7 +26,7 @@ def get_templates_repositories(): key="elrond-wasm-rs", url=f"https://github.com/ElrondNetwork/elrond-wasm-rs/archive/{examples_rs_tag}.zip?t={timestamp}", github="ElrondNetwork/elrond-wasm-rs", - relative_path=f"elrond-wasm-rs-{examples_rs_tag_no_v}/contracts/examples" + relative_path=f"mx-sdk-rs-{examples_rs_tag_no_v}/contracts/examples" ) ] diff --git a/setup.py b/setup.py index ff091a21..69975db9 100644 --- a/setup.py +++ b/setup.py @@ -1,9 +1,9 @@ import setuptools with open("README.md", "r") as fh: - long_description = "https://github.com/ElrondNetwork/elrond-sdk-erdpy" + long_description = "https://github.com/multiversx/mx-sdk-erdpy" -VERSION = "3.0.1" +VERSION = "3.0.2" try: with open('./erdpy/_version.py', 'wt') as versionfile: @@ -18,7 +18,7 @@ description="Elrond Smart Contracts Tools and Python SDK", long_description=long_description, long_description_content_type="text/markdown", - url="https://github.com/ElrondNetwork/elrond-sdk-erdpy", + url="https://github.com/multiversx/mx-sdk-erdpy", author="Elrond Network", license="GPL", packages=setuptools.find_packages( From 0caa3cbe5ab32352c2e4f7dd2e244075d0ec49a3 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 5 Jan 2023 11:04:41 +0200 Subject: [PATCH 21/26] add new `.gitignore` for tests --- .gitignore | 1 - erdpy/tests/test_proxy.py | 4 ++-- erdpy/tests/testdata-out/.gitignore | 6 ++++++ 3 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 erdpy/tests/testdata-out/.gitignore diff --git a/.gitignore b/.gitignore index ee06ff85..2f359c4d 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ __pycache__ *.py[cod] *$py.class .pytest_cache/ -erdpy/tests/testdata-out .idea diff --git a/erdpy/tests/test_proxy.py b/erdpy/tests/test_proxy.py index 7a742c82..8cb6966e 100644 --- a/erdpy/tests/test_proxy.py +++ b/erdpy/tests/test_proxy.py @@ -12,10 +12,10 @@ def test_get_transactions(): "--address", "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", "--outfile", - "testdata-out/SANDBOX/transactions.txt", + "testdata-out/transactions.txt", ] ) - assert os.path.isfile("testdata-out/SANDBOX/transactions.txt") == True + assert os.path.isfile("testdata-out/transactions.txt") == True def test_get_account(): diff --git a/erdpy/tests/testdata-out/.gitignore b/erdpy/tests/testdata-out/.gitignore new file mode 100644 index 00000000..210accf2 --- /dev/null +++ b/erdpy/tests/testdata-out/.gitignore @@ -0,0 +1,6 @@ +# Ignore everything +* + +# But not these files... +!.gitignore + From db5ae6421e082341d5a58c37d91585ddc21737c0 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 5 Jan 2023 11:23:48 +0200 Subject: [PATCH 22/26] fix test --- erdpy/tests/test_proxy.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/erdpy/tests/test_proxy.py b/erdpy/tests/test_proxy.py index 8cb6966e..94e4ec79 100644 --- a/erdpy/tests/test_proxy.py +++ b/erdpy/tests/test_proxy.py @@ -1,10 +1,12 @@ -import os +from pathlib import Path from erdpy.cli import main from erdpy.accounts import Account from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider def test_get_transactions(): + output_file = Path(__file__).parent / "testdata-out" / "transactions.txt" + main( [ "account", @@ -12,10 +14,10 @@ def test_get_transactions(): "--address", "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th", "--outfile", - "testdata-out/transactions.txt", + str(output_file), ] ) - assert os.path.isfile("testdata-out/transactions.txt") == True + assert Path.is_file(output_file) == True def test_get_account(): From 14aced8b562ec1ca67c5a42d9b9bdb264f52d34c Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 5 Jan 2023 11:59:22 +0200 Subject: [PATCH 23/26] fix `erdpy contract templates` --- erdpy/config.py | 2 +- erdpy/projects/templates_config.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/erdpy/config.py b/erdpy/config.py index 9c1264a3..987bc03d 100644 --- a/erdpy/config.py +++ b/erdpy/config.py @@ -153,7 +153,7 @@ def get_defaults() -> Dict[str, Any]: "chainID": "T", "txVersion": "1", "dependencies.vmtools.tag": "latest", - "dependencies.elrond_wasm_rs.tag": "latest", + "dependencies.mx_sdk_rs.tag": "latest", "dependencies.vmtools.urlTemplate.linux": "https://github.com/ElrondNetwork/wasm-vm/archive/{TAG}.tar.gz", "dependencies.vmtools.urlTemplate.osx": "https://github.com/ElrondNetwork/wasm-vm/archive/{TAG}.tar.gz", "dependencies.llvm.tag": "v9-19feb", diff --git a/erdpy/projects/templates_config.py b/erdpy/projects/templates_config.py index 8eb646b4..e2ef3553 100644 --- a/erdpy/projects/templates_config.py +++ b/erdpy/projects/templates_config.py @@ -7,25 +7,25 @@ def get_templates_repositories(): timestamp = int(time.time()) - examples_rs_tag = config.get_dependency_tag('elrond_wasm_rs') + examples_rs_tag = config.get_dependency_tag('mx_sdk_rs') if examples_rs_tag == 'latest': - examples_rs_tag = query_latest_release_tag('ElrondNetwork/elrond-wasm-rs') + examples_rs_tag = query_latest_release_tag('multiversx/mx-sdk-rs') examples_rs_tag_no_v = remove_initial_v_from_version(examples_rs_tag) return [ TemplatesRepository( key="sc-examples", - url=f"https://github.com/ElrondNetwork/sc-examples/archive/master.zip?t={timestamp}", - github="ElrondNetwork/sc-examples", - relative_path="sc-examples-master" + url=f"https://github.com/multiversx/mx-sc-examples/archive/master.zip?t={timestamp}", + github="multiversx/mx-sc-examples", + relative_path="mx-sc-examples-master" ), TemplatesRepository( - key="elrond-wasm-rs", - url=f"https://github.com/ElrondNetwork/elrond-wasm-rs/archive/{examples_rs_tag}.zip?t={timestamp}", - github="ElrondNetwork/elrond-wasm-rs", + key="mx-sdk-rs", + url=f"https://github.com/multiversx/mx-sdk-rs/archive/{examples_rs_tag}.zip?t={timestamp}", + github="multiversx/mx-sdk-rs", relative_path=f"mx-sdk-rs-{examples_rs_tag_no_v}/contracts/examples" ) ] From 28a772aea56e08dc2a69a12059522c990e525dad Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Thu, 5 Jan 2023 17:11:22 +0200 Subject: [PATCH 24/26] fix vm repo name --- erdpy/dependencies/modules.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/erdpy/dependencies/modules.py b/erdpy/dependencies/modules.py index 0e5899a8..e6aa6817 100644 --- a/erdpy/dependencies/modules.py +++ b/erdpy/dependencies/modules.py @@ -150,7 +150,7 @@ def __init__(self, key: str, aliases: List[str] = None): aliases = list() super().__init__(key, aliases) - self.repo_name = 'mx-vm-wasm-go' + self.repo_name = 'mx-chain-vm-go' self.organisation = 'multiversx' def _post_install(self, tag: str): From 0266c8cfb3ac3dcbbb73c0eba2e14b65e88c455c Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Fri, 6 Jan 2023 10:20:11 +0200 Subject: [PATCH 25/26] bump version --- erdpy/CHANGELOG.md | 3 +++ erdpy/_version.py | 2 +- setup.py | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/erdpy/CHANGELOG.md b/erdpy/CHANGELOG.md index c5c7316d..9d2cf064 100644 --- a/erdpy/CHANGELOG.md +++ b/erdpy/CHANGELOG.md @@ -7,6 +7,9 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how ## [Unreleased] - TBD +## [3.0.3] + - Fixes after repository migrations + ## [3.0.2] - Fixes after repository migrations diff --git a/erdpy/_version.py b/erdpy/_version.py index 131942e7..8d1c8625 100644 --- a/erdpy/_version.py +++ b/erdpy/_version.py @@ -1 +1 @@ -__version__ = "3.0.2" +__version__ = "3.0.3" diff --git a/setup.py b/setup.py index 69975db9..fa670914 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ with open("README.md", "r") as fh: long_description = "https://github.com/multiversx/mx-sdk-erdpy" -VERSION = "3.0.2" +VERSION = "3.0.3" try: with open('./erdpy/_version.py', 'wt') as versionfile: From 4a466723e680bf0fa6d4d598b1f75a2bdc510792 Mon Sep 17 00:00:00 2001 From: Alexandru Popenta Date: Fri, 6 Jan 2023 12:12:58 +0200 Subject: [PATCH 26/26] fix after review --- erdpy/contracts.py | 28 +++++++++++++++++++++++-- erdpy/tests/test_accounts_repository.py | 7 ++----- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/erdpy/contracts.py b/erdpy/contracts.py index 67935dcf..bdd7021c 100644 --- a/erdpy/contracts.py +++ b/erdpy/contracts.py @@ -1,6 +1,6 @@ import base64 import logging -from typing import Any, List, Optional, Tuple, Protocol +from typing import Any, List, Optional, Tuple, Protocol, Sequence from Cryptodome.Hash import keccak @@ -8,7 +8,7 @@ from erdpy.accounts import Account, Address from erdpy.transactions import Transaction from erdpy.utils import Object -from erdpy_network_providers.proxy_network_provider import ContractQuery +from erdpy_network_providers.interface import IContractQuery logger = logging.getLogger("contracts") @@ -31,6 +31,30 @@ def __init__(self, as_base64: str, as_hex: str, as_number: int): self.number = as_number +class ContractQuery(IContractQuery): + def __init__(self, address: Address, function: str, value: int, arguments: List[bytes], caller: Optional[Address] = None): + self.contract = address + self.function = function + self.caller = caller + self.value = value + self.encoded_arguments = [item.hex() for item in arguments] + + def get_contract(self) -> Address: + return self.contract + + def get_function(self) -> str: + return self.function + + def get_encoded_arguments(self) -> Sequence[str]: + return self.encoded_arguments + + def get_caller(self) -> Optional[Address]: + return self.caller + + def get_value(self) -> int: + return self.value + + class SmartContract: def __init__(self, address: Optional[Address] = None, bytecode=None, metadata=None): self.address = Address(address) diff --git a/erdpy/tests/test_accounts_repository.py b/erdpy/tests/test_accounts_repository.py index 1751a09a..a9af78f2 100644 --- a/erdpy/tests/test_accounts_repository.py +++ b/erdpy/tests/test_accounts_repository.py @@ -10,7 +10,7 @@ class INetworkProvider(Protocol): - def get_account_nonce(self, address: IAddress) -> int: + def get_account(self, address: IAddress) -> AccountOnNetwork: ... @@ -56,10 +56,7 @@ def test_sync_nonces(): assert account.nonce == DUMMY_NONCE -class ElrondProxyStub(INetworkProvider): - def get_account_nonce(self, address: IAddress) -> int: - return DUMMY_NONCE - +class ElrondProxyStub(INetworkProvider): def get_account(self, address: IAddress) -> AccountOnNetwork: account = AccountOnNetwork() account.nonce = DUMMY_NONCE