Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8018b3e
reference erdpy-eggs repositories
popenta Dec 20, 2022
559118e
remove IElrondProxy from transactions.py
popenta Dec 20, 2022
87136ad
use ProxyNetworkProvider for `get_hyperblock`
popenta Dec 21, 2022
30315ca
remove ElrondProxy
popenta Dec 22, 2022
bf2539d
fix
popenta Dec 22, 2022
08a022f
integrate erdpy_network in erdpy
popenta Dec 23, 2022
086c0cc
add args to main function + fix test
popenta Dec 27, 2022
8a31b89
Merge branch 'main' into erdpy-eggs-reference
popenta Dec 27, 2022
5c89c02
add tests and fixes
popenta Dec 27, 2022
ee4f5a1
add tests and small fixes
popenta Dec 28, 2022
5ff5370
modify version for referenced packages
popenta Dec 28, 2022
0a41247
Simple commit to trigger workflows.
andreibancioiu Dec 29, 2022
e65af3d
Trigger github workflow.
andreibancioiu Dec 29, 2022
054cf24
reference new release for erdpy_network_providers
popenta Jan 3, 2023
b2b2137
fix package referencing and renaming
popenta Jan 4, 2023
6762a6c
add default args to main function
popenta Jan 4, 2023
a4e22eb
list files in github actions
popenta Jan 4, 2023
bf52ba0
fix repo name
popenta Jan 4, 2023
440b859
fix name
popenta Jan 4, 2023
adaff8b
fix organisation name
popenta Jan 4, 2023
591fe9c
fix after migration
popenta Jan 4, 2023
876ebce
Merge pull request #173 from multiversx/fix-repo-name
popenta Jan 4, 2023
029a733
Merge branch 'main' into erdpy-eggs-reference
popenta Jan 4, 2023
0caa3cb
add new `.gitignore` for tests
popenta Jan 5, 2023
db5ae64
fix test
popenta Jan 5, 2023
14aced8
fix `erdpy contract templates`
popenta Jan 5, 2023
175406b
Merge pull request #174 from multiversx/contract-templates-fix
popenta Jan 5, 2023
a154824
Merge branch 'main' into erdpy-eggs-reference
popenta Jan 5, 2023
28a772a
fix vm repo name
popenta Jan 5, 2023
0266c8c
bump version
popenta Jan 6, 2023
f2ec42e
Merge pull request #177 from multiversx/vm-renaming-fix
popenta Jan 6, 2023
63c717b
Merge branch 'main' into erdpy-eggs-reference
popenta Jan 6, 2023
4a46672
fix after review
popenta Jan 6, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ __pycache__
*.py[cod]
*$py.class
.pytest_cache/
erdpy/tests/testdata-out
.idea


Expand Down
6 changes: 6 additions & 0 deletions erdpy/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,12 @@ 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

## [3.0.1]
- [Contract verify: fix CLI arguments & json request](https://github.com/ElrondNetwork/elrond-sdk-erdpy/pull/171)

Expand Down
2 changes: 1 addition & 1 deletion erdpy/_version.py
Original file line number Diff line number Diff line change
@@ -1 +1 @@
__version__ = "3.0.1"
__version__ = "3.0.3"
12 changes: 9 additions & 3 deletions erdpy/accounts.py
Original file line number Diff line number Diff line change
@@ -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_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, \
Expand All @@ -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,
Expand All @@ -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:
Expand Down
12 changes: 9 additions & 3 deletions erdpy/accounts_repository.py
Original file line number Diff line number Diff line change
@@ -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_providers.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
Expand Down Expand Up @@ -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):
Expand Down
12 changes: 6 additions & 6 deletions erdpy/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)

Expand All @@ -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 ...",
Expand Down Expand Up @@ -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)
19 changes: 9 additions & 10 deletions erdpy/cli_accounts.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@

from erdpy import cli_shared, utils
from erdpy.accounts import Address
from erdpy.proxy.core import ElrondProxy
from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider

logger = logging.getLogger("cli.accounts")

Expand Down Expand Up @@ -39,25 +39,24 @@ 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)
utils.dump_out_json(account.to_dictionary())


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)
transactions_as_dictionaries = [tx.to_dictionary() for tx in response]
utils.dump_out_json(transactions_as_dictionaries, args.outfile)
14 changes: 11 additions & 3 deletions erdpy/cli_block.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
from typing import Any

from erdpy import cli_shared, utils
from erdpy.proxy.core import ElrondProxy
from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider


def setup_parser(subparsers: Any) -> Any:
Expand All @@ -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)
Comment thread
andreibancioiu marked this conversation as resolved.
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)
6 changes: 3 additions & 3 deletions erdpy/cli_contracts.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.proxy.core import ElrondProxy
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
Expand Down Expand Up @@ -337,7 +337,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

Expand Down Expand Up @@ -408,7 +408,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)


Expand Down
44 changes: 9 additions & 35 deletions erdpy/cli_delegation.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
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.proxy import ElrondProxy
from erdpy_network_providers.proxy_network_provider import ProxyNetworkProvider
from erdpy.transactions import do_prepare_transaction


Expand All @@ -27,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
Expand Down Expand Up @@ -150,13 +147,16 @@ 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 = ElrondProxy(args.proxy)
proxy = ProxyNetworkProvider(args.proxy)

transaction = proxy.get_transaction(args.create_tx_hash, with_results=True)
utils.omit_fields(transaction, omit_fields)
_get_sc_address_from_tx(transaction)
transaction = proxy.get_transaction(args.create_tx_hash)
transaction_events = transaction.logs.events
if len(transaction_events) == 1:
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 staking provider SC Deploy transaction.")


def add_new_nodes(args: Any):
Expand Down Expand Up @@ -255,29 +255,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")
13 changes: 7 additions & 6 deletions erdpy/cli_dns.py
Original file line number Diff line number Diff line change
Expand Up @@ -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_providers.proxy_network_provider import ProxyNetworkProvider


def setup_parser(args: List[str], subparsers: Any) -> Any:
Expand Down Expand Up @@ -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):
Expand All @@ -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):
Expand Down
4 changes: 2 additions & 2 deletions erdpy/cli_ledger.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,15 @@ 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)
print('account index = %d | address index = %d | address: %s' % (0, i, address))
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()
Loading