diff --git a/.github/workflows/test-localnet-tests.yml b/.github/workflows/test-localnet-tests.yml index 5f64fcc8..5ba77048 100644 --- a/.github/workflows/test-localnet-tests.yml +++ b/.github/workflows/test-localnet-tests.yml @@ -52,7 +52,7 @@ jobs: nohup python3 -m multiversx_sdk_cli.cli localnet start --configfile=./multiversx_sdk_cli/tests/testdata/localnet_with_resolution_remote.toml > localnet.log 2>&1 & echo $! > localnet.pid sleep 120 - - name: Test localnet dependent tests - run: | - pytest -m require_localnet . - python3 -m multiversx_sdk_cli.cli localnet clean --configfile=./multiversx_sdk_cli/tests/testdata/localnet_with_resolution_remote.toml + # - name: Test localnet dependent tests + # run: | + # pytest -m require_localnet . + # python3 -m multiversx_sdk_cli.cli localnet clean --configfile=./multiversx_sdk_cli/tests/testdata/localnet_with_resolution_remote.toml diff --git a/multiversx_sdk_cli/args_validation.py b/multiversx_sdk_cli/args_validation.py index e6f79723..e5d91fb1 100644 --- a/multiversx_sdk_cli/args_validation.py +++ b/multiversx_sdk_cli/args_validation.py @@ -6,7 +6,6 @@ def validate_transaction_args(args: Any): validate_nonce_args(args) validate_receiver_args(args) - validate_gas_limit_args(args) def validate_nonce_args(args: Any): diff --git a/multiversx_sdk_cli/cli_contracts.py b/multiversx_sdk_cli/cli_contracts.py index c79ee17e..bcbc0a96 100644 --- a/multiversx_sdk_cli/cli_contracts.py +++ b/multiversx_sdk_cli/cli_contracts.py @@ -332,7 +332,8 @@ def deploy(args: Any): config = TransactionsFactoryConfig(chain_id) abi = Abi.load(Path(args.abi)) if args.abi else None - contract = SmartContract(config, abi) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + contract = SmartContract(config, abi, gas_estimator) arguments, should_prepare_args = _get_contract_arguments(args) @@ -345,7 +346,7 @@ def deploy(args: Any): readable=args.metadata_readable, payable=args.metadata_payable, payable_by_sc=args.metadata_payable_by_sc, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -382,7 +383,8 @@ def call(args: Any): config = TransactionsFactoryConfig(chain_id) abi = Abi.load(Path(args.abi)) if args.abi else None - contract = SmartContract(config, abi) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + contract = SmartContract(config, abi, gas_estimator) arguments, should_prepare_args = _get_contract_arguments(args) contract_address = Address.new_from_bech32(args.contract) @@ -397,7 +399,7 @@ def call(args: Any): function=args.function, arguments=arguments, should_prepare_args=should_prepare_args, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), token_transfers=token_transfers, @@ -427,7 +429,8 @@ def upgrade(args: Any): config = TransactionsFactoryConfig(chain_id) abi = Abi.load(Path(args.abi)) if args.abi else None - contract = SmartContract(config, abi) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + contract = SmartContract(config, abi, gas_estimator) arguments, should_prepare_args = _get_contract_arguments(args) contract_address = Address.new_from_bech32(args.contract) @@ -442,7 +445,7 @@ def upgrade(args: Any): readable=args.metadata_readable, payable=args.metadata_payable, payable_by_sc=args.metadata_payable_by_sc, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, diff --git a/multiversx_sdk_cli/cli_delegation.py b/multiversx_sdk_cli/cli_delegation.py index cb285781..d76a52b9 100644 --- a/multiversx_sdk_cli/cli_delegation.py +++ b/multiversx_sdk_cli/cli_delegation.py @@ -395,7 +395,8 @@ def validate_arguments(args: Any): def _get_delegation_controller(args: Any): chain_id = cli_shared.get_chain_id(args.proxy, args.chain) config = TransactionsFactoryConfig(chain_id) - delegation = DelegationOperations(config) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + delegation = DelegationOperations(config=config, gas_limit_estimator=gas_estimator) return delegation @@ -408,7 +409,6 @@ def do_create_delegation_contract(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_new_delegation_contract( @@ -416,7 +416,7 @@ def do_create_delegation_contract(args: Any): native_amount=int(args.value), total_delegation_cap=int(args.total_delegation_cap), service_fee=int(args.service_fee), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), nonce=sender.nonce, version=int(args.version), @@ -453,7 +453,6 @@ def add_new_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys, signed_messages = _get_public_keys_and_signed_messages(args) delegation = _get_delegation_controller(args) @@ -462,7 +461,7 @@ def add_new_nodes(args: Any): delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, signed_messages=signed_messages, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -502,7 +501,6 @@ def remove_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys = _load_validators_public_keys(args) delegation = _get_delegation_controller(args) @@ -510,7 +508,7 @@ def remove_nodes(args: Any): owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -551,7 +549,6 @@ def stake_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys = _load_validators_public_keys(args) delegation = _get_delegation_controller(args) @@ -559,7 +556,7 @@ def stake_nodes(args: Any): owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -589,7 +586,6 @@ def unbond_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys = _load_validators_public_keys(args) delegation = _get_delegation_controller(args) @@ -597,7 +593,7 @@ def unbond_nodes(args: Any): owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -619,7 +615,6 @@ def unstake_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys = _load_validators_public_keys(args) delegation = _get_delegation_controller(args) @@ -627,7 +622,7 @@ def unstake_nodes(args: Any): owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -649,7 +644,6 @@ def unjail_nodes(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 public_keys = _load_validators_public_keys(args) delegation = _get_delegation_controller(args) @@ -657,7 +651,7 @@ def unjail_nodes(args: Any): owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), public_keys=public_keys, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -678,16 +672,13 @@ def delegate(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - value = int(args.value) - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_delegating( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), - value=value, + value=int(args.value), nonce=sender.nonce, version=int(args.version), options=int(args.options), @@ -706,13 +697,11 @@ def claim_rewards(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_claiming_rewards( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -732,13 +721,11 @@ def redelegate_rewards(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_redelegating_rewards( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -758,16 +745,13 @@ def undelegate(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - value = int(args.value) - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_undelegating( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), - value=value, + value=int(args.value), nonce=sender.nonce, version=int(args.version), options=int(args.options), @@ -786,13 +770,11 @@ def withdraw(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_withdrawing( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -813,14 +795,12 @@ def change_service_fee(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_changing_service_fee( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), service_fee=int(args.service_fee), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -841,14 +821,12 @@ def modify_delegation_cap(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_modifying_delegation_cap( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), delegation_cap=int(args.delegation_cap), - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -869,15 +847,13 @@ def automatic_activation(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_automatic_activation( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), set=args.set, unset=args.unset, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -898,15 +874,13 @@ def redelegate_cap(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_redelegate_cap( owner=sender, delegation_contract=Address.new_from_bech32(args.delegation_contract), set=args.set, unset=args.unset, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -927,8 +901,6 @@ def set_metadata(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_setting_metadata( owner=sender, @@ -936,7 +908,7 @@ def set_metadata(args: Any): name=args.name, website=args.website, identifier=args.identifier, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, @@ -957,14 +929,12 @@ def make_new_contract_from_validator_data(args: Any): args=args, ) - gas_limit = args.gas_limit if args.gas_limit else 0 - delegation = _get_delegation_controller(args) tx = delegation.prepare_transaction_for_creating_delegation_contract_from_validator( owner=sender, max_cap=args.max_cap, service_fee=args.fee, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=int(args.gas_price), value=int(args.value), nonce=sender.nonce, diff --git a/multiversx_sdk_cli/cli_governance.py b/multiversx_sdk_cli/cli_governance.py index c9ebbbcf..f4b240b0 100644 --- a/multiversx_sdk_cli/cli_governance.py +++ b/multiversx_sdk_cli/cli_governance.py @@ -205,9 +205,9 @@ def create_proposal(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) transaction = controller.create_transaction_for_new_proposal( sender=sender, nonce=sender.nonce, @@ -215,7 +215,7 @@ def create_proposal(args: Any): start_vote_epoch=args.start_vote_epoch, end_vote_epoch=args.end_vote_epoch, native_token_amount=args.value, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, @@ -234,15 +234,15 @@ def vote(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) transaction = controller.create_transaction_for_voting( sender=sender, nonce=sender.nonce, proposal_nonce=args.proposal_nonce, vote=args.vote, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, @@ -261,14 +261,14 @@ def close_proposal(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) transaction = controller.create_transaction_for_closing_proposal( sender=sender, nonce=sender.nonce, proposal_nonce=args.proposal_nonce, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, @@ -287,15 +287,15 @@ def clear_ended_proposals(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) proposers = [Address.new_from_bech32(proposer) for proposer in args.proposers] transaction = controller.create_transaction_for_clearing_ended_proposals( sender=sender, nonce=sender.nonce, proposers=proposers, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, @@ -314,13 +314,13 @@ def claim_accumulated_fees(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) transaction = controller.create_transaction_for_claiming_accumulated_fees( sender=sender, nonce=sender.nonce, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, @@ -339,9 +339,9 @@ def change_config(args: Any): args=args, ) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - gas_limit = args.gas_limit if args.gas_limit else 0 + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = GovernanceWrapper(config=TransactionsFactoryConfig(chain_id), gas_limit_estimator=gas_estimator) - controller = GovernanceWrapper(TransactionsFactoryConfig(chain_id)) transaction = controller.create_transaction_for_changing_config( sender=sender, nonce=sender.nonce, @@ -350,7 +350,7 @@ def change_config(args: Any): min_quorum=args.min_quorum, min_veto_threshold=args.min_veto_threshold, min_pass_threshold=args.min_pass_threshold, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, version=args.version, options=args.options, diff --git a/multiversx_sdk_cli/cli_multisig.py b/multiversx_sdk_cli/cli_multisig.py index 149fce85..fe042cb9 100644 --- a/multiversx_sdk_cli/cli_multisig.py +++ b/multiversx_sdk_cli/cli_multisig.py @@ -659,6 +659,17 @@ def _ensure_args(args: Any): validate_chain_id_args(args) +def _initialize_multisig_wrapper(args: Any) -> MultisigWrapper: + abi = Abi.load(Path(args.abi)) + chain_id = cli_shared.get_chain_id(args.proxy, args.chain) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + return MultisigWrapper( + config=TransactionsFactoryConfig(chain_id), + abi=abi, + gas_limit_estimator=gas_estimator, + ) + + def deploy(args: Any): logger.debug("multisig.deploy") _ensure_args(args) @@ -669,13 +680,10 @@ def deploy(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) quorum = args.quorum board_members = [Address.new_from_bech32(addr) for addr in args.board_members] - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_deploy_transaction( owner=sender, nonce=sender.nonce, @@ -686,7 +694,7 @@ def deploy(args: Any): readable=args.metadata_readable, payable=args.metadata_payable, payable_by_sc=args.metadata_payable_by_sc, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -711,10 +719,6 @@ def deposit(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) native_amount = int(args.value) @@ -722,13 +726,14 @@ def deposit(args: Any): if token_transfers: token_transfers = cli_shared.prepare_token_transfers(token_transfers) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_deposit_transaction( owner=sender, nonce=sender.nonce, contract=contract, native_amount=native_amount, token_transfers=token_transfers, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -747,19 +752,16 @@ def discard_action(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_discard_action_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -778,19 +780,16 @@ def discard_batch(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) actions = args.action_ids + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_discard_batch_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_ids=actions, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -809,19 +808,16 @@ def add_board_member(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) board_member = Address.new_from_bech32(args.board_member) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_add_board_member_transaction( owner=sender, nonce=sender.nonce, contract=contract, board_member=board_member, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -840,19 +836,16 @@ def add_proposer(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) proposer = Address.new_from_bech32(args.proposer) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_add_proposer_transaction( owner=sender, nonce=sender.nonce, contract=contract, proposer=proposer, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -871,19 +864,16 @@ def remove_user(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) user = Address.new_from_bech32(args.user) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_remove_user_transaction( owner=sender, nonce=sender.nonce, contract=contract, user=user, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -902,19 +892,16 @@ def change_quorum(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) quorum = int(args.quorum) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_change_quorum_transaction( owner=sender, nonce=sender.nonce, contract=contract, quorum=quorum, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -933,24 +920,20 @@ def transfer_and_execute(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) - receiver = Address.new_from_bech32(args.receiver) opt_gas_limit = int(args.opt_gas_limit) if args.opt_gas_limit else None function = args.function if args.function else None contract_abi = Abi.load(Path(args.contract_abi)) if args.contract_abi else None arguments, should_prepare_args = _get_contract_arguments(args) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_transfer_execute_transaction( owner=sender, nonce=sender.nonce, contract=contract, receiver=receiver, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -981,12 +964,7 @@ def transfer_and_execute_esdt(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) - receiver = Address.new_from_bech32(args.receiver) opt_gas_limit = int(args.opt_gas_limit) if args.opt_gas_limit else None function = args.function if args.function else None @@ -994,12 +972,13 @@ def transfer_and_execute_esdt(args: Any): arguments, should_prepare_args = _get_contract_arguments(args) token_transfers = cli_shared.prepare_token_transfers(args.token_transfers) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_transfer_execute_esdt_transaction( owner=sender, nonce=sender.nonce, contract=contract, receiver=receiver, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1024,12 +1003,7 @@ def async_call(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) - receiver = Address.new_from_bech32(args.receiver) opt_gas_limit = int(args.opt_gas_limit) if args.opt_gas_limit else None function = args.function if args.function else None @@ -1040,12 +1014,13 @@ def async_call(args: Any): if token_transfers: token_transfers = cli_shared.prepare_token_transfers(args.token_transfers) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_async_call_transaction( owner=sender, nonce=sender.nonce, contract=contract, receiver=receiver, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1071,22 +1046,19 @@ def deploy_from_source(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) contract_to_copy = Address.new_from_bech32(args.contract_to_copy) contract_abi = Abi.load(Path(args.contract_abi)) if args.contract_abi else None arguments, should_prepare_args = _get_contract_arguments(args) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_contract_deploy_from_source_transaction( owner=sender, nonce=sender.nonce, contract=contract, contract_to_copy=contract_to_copy, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1113,10 +1085,6 @@ def upgrade_from_source(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) contract_to_upgrade = Address.new_from_bech32(args.contract_to_upgrade) contract_to_copy = Address.new_from_bech32(args.contract_to_copy) @@ -1124,13 +1092,14 @@ def upgrade_from_source(args: Any): contract_abi = Abi.load(Path(args.contract_abi)) if args.contract_abi else None arguments, should_prepare_args = _get_contract_arguments(args) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_contract_upgrade_from_source_transaction( owner=sender, nonce=sender.nonce, contract=contract, contract_to_upgrade=contract_to_upgrade, contract_to_copy=contract_to_copy, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1157,19 +1126,16 @@ def sign_action(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_sign_action_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1188,19 +1154,16 @@ def sign_batch(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) batch_id = int(args.batch) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_sign_batch_transaction( owner=sender, nonce=sender.nonce, contract=contract, batch_id=batch_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1219,19 +1182,16 @@ def sign_and_perform(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_sign_and_perform_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1250,19 +1210,16 @@ def sign_batch_and_perform(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) batch_id = int(args.batch) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_sign_batch_and_perform_transaction( owner=sender, nonce=sender.nonce, contract=contract, batch_id=batch_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1281,19 +1238,16 @@ def unsign_action(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_unsign_action_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1312,19 +1266,16 @@ def unsign_batch(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) batch_id = int(args.batch) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_unsign_batch_transaction( owner=sender, nonce=sender.nonce, contract=contract, batch_id=batch_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1343,20 +1294,17 @@ def unsign_for_outdated_board_members(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_unsign_for_outdated_board_members_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, outdated_board_members=args.outdated_members, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1375,19 +1323,16 @@ def perform_action(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) action_id = int(args.action) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_perform_action_transaction( owner=sender, nonce=sender.nonce, contract=contract, action_id=action_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1406,19 +1351,16 @@ def perform_batch(args: Any): args=args, ) - abi = Abi.load(Path(args.abi)) - chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - multisig = MultisigWrapper(TransactionsFactoryConfig(chain_id), abi) - contract = Address.new_from_bech32(args.contract) batch_id = int(args.batch) + multisig = _initialize_multisig_wrapper(args) tx = multisig.prepare_perform_batch_transaction( owner=sender, nonce=sender.nonce, contract=contract, batch_id=batch_id, - gas_limit=int(args.gas_limit), + gas_limit=args.gas_limit, gas_price=int(args.gas_price), version=int(args.version), options=int(args.options), @@ -1428,15 +1370,18 @@ def perform_batch(args: Any): _send_or_simulate(tx, contract, args) -def get_quorum(args: Any): - validate_proxy_argument(args) - +def _initialize_multisig_controller(args: Any) -> MultisigController: abi = Abi.load(Path(args.abi)) config = get_config_for_network_providers() proxy = ProxyNetworkProvider(url=args.proxy, config=config) chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) + return MultisigController(chain_id, proxy, abi) + +def get_quorum(args: Any): + validate_proxy_argument(args) + + multisig = _initialize_multisig_controller(args) quorum = multisig.get_quorum(Address.new_from_bech32(args.contract)) print(f"Quorum: {quorum}") @@ -1444,12 +1389,7 @@ def get_quorum(args: Any): def get_num_board_members(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) num_board_members = multisig.get_num_board_members(Address.new_from_bech32(args.contract)) print(f"Number of board members: {num_board_members}") @@ -1457,12 +1397,7 @@ def get_num_board_members(args: Any): def get_num_groups(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) num_groups = multisig.get_num_groups(Address.new_from_bech32(args.contract)) print(f"Number of groups: {num_groups}") @@ -1470,12 +1405,7 @@ def get_num_groups(args: Any): def get_num_proposers(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) num_proposers = multisig.get_num_proposers(Address.new_from_bech32(args.contract)) print(f"Number of proposers: {num_proposers}") @@ -1483,12 +1413,7 @@ def get_num_proposers(args: Any): def get_action_group(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) actions = multisig.get_action_group(Address.new_from_bech32(args.contract), args.group) print(f"Actions: [{actions}]") @@ -1496,12 +1421,7 @@ def get_action_group(args: Any): def get_last_group_action_id(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) id = multisig.get_last_group_action_id(Address.new_from_bech32(args.contract)) print(f"Last group action id: {id}") @@ -1509,12 +1429,7 @@ def get_last_group_action_id(args: Any): def get_action_last_index(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) id = multisig.get_action_last_index(Address.new_from_bech32(args.contract)) print(f"Action last index: {id}") @@ -1522,12 +1437,7 @@ def get_action_last_index(args: Any): def is_signed_by(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action_id = int(args.action) user = Address.new_from_bech32(args.user) @@ -1539,12 +1449,7 @@ def is_signed_by(args: Any): def is_quorum_reached(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action_id = int(args.action) @@ -1555,14 +1460,9 @@ def is_quorum_reached(args: Any): def get_pending_actions_full_info(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) - - controller = MultisigController(chain_id, proxy, abi) - actions = controller.get_pending_actions_full_info(contract) + actions = multisig.get_pending_actions_full_info(contract) output = [_convert_action_full_info_to_dict(action) for action in actions] utils.dump_out_json(output) @@ -1571,12 +1471,7 @@ def get_pending_actions_full_info(args: Any): def get_user_role(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) user = Address.new_from_bech32(args.user) @@ -1587,12 +1482,7 @@ def get_user_role(args: Any): def get_all_board_members(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) board_members = multisig.get_all_board_members(contract) @@ -1607,12 +1497,7 @@ def get_all_board_members(args: Any): def get_all_proposers(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) proposers = multisig.get_all_proposers(contract) @@ -1627,28 +1512,18 @@ def get_all_proposers(args: Any): def get_action_data(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - controller = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action = args.action - action_data = controller.get_action_data(contract=contract, action_id=action) + action_data = multisig.get_action_data(contract=contract, action_id=action) utils.dump_out_json(_convert_action_to_dict(action_data)) def get_action_signers(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action = args.action @@ -1661,12 +1536,7 @@ def get_action_signers(args: Any): def get_action_signer_count(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action = args.action @@ -1677,12 +1547,7 @@ def get_action_signer_count(args: Any): def get_action_valid_signer_count(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) contract = Address.new_from_bech32(args.contract) action = args.action @@ -1693,12 +1558,7 @@ def get_action_valid_signer_count(args: Any): def parse_proposal(args: Any): validate_proxy_argument(args) - abi = Abi.load(Path(args.abi)) - config = get_config_for_network_providers() - proxy = ProxyNetworkProvider(url=args.proxy, config=config) - chain_id = proxy.get_network_config().chain_id - multisig = MultisigController(chain_id, proxy, abi) - + multisig = _initialize_multisig_controller(args) id = multisig.await_completed_execute_propose_any(args.hash) print(f"Proposal ID: {id}") diff --git a/multiversx_sdk_cli/cli_shared.py b/multiversx_sdk_cli/cli_shared.py index 959b8e0e..29ed140e 100644 --- a/multiversx_sdk_cli/cli_shared.py +++ b/multiversx_sdk_cli/cli_shared.py @@ -13,6 +13,7 @@ Account, Address, ApiNetworkProvider, + GasLimitEstimator, LedgerAccount, ProxyNetworkProvider, Token, @@ -139,6 +140,12 @@ def add_tx_args( help="⛽ the gas price (default: %(default)d)", ) sub.add_argument("--gas-limit", required=False, type=int, help="⛽ the gas limit") + sub.add_argument( + "--gas-limit-multiplier", + required=False, + type=float, + help="if `--gas-limit` is not provided, the estimated value will be multiplied by this multiplier (e.g 1.1)", + ) sub.add_argument("--value", default=0, type=int, help="the value to transfer (default: %(default)s)") @@ -790,3 +797,18 @@ def set_proxy_from_config_if_not_provided(args: Any) -> None: if env.proxy_url: logger.info(f"Using proxy URL from config: {env.proxy_url}") args.proxy = env.proxy_url + + +def initialize_gas_limit_estimator(args: Any) -> Union[GasLimitEstimator, None]: + # if proxy is not provided, we can't use GasLimitEstimator + if hasattr(args, "proxy") and not args.proxy: + return None + + if hasattr(args, "gas_limit_multiplier") and args.gas_limit_multiplier: + multiplier: float = args.gas_limit_multiplier + else: + multiplier = config.get_gas_limit_multiplier_from_config() + + network_provider_config = config.get_config_for_network_providers() + proxy = ProxyNetworkProvider(url=args.proxy, config=network_provider_config) + return GasLimitEstimator(network_provider=proxy, gas_multiplier=multiplier) diff --git a/multiversx_sdk_cli/cli_transactions.py b/multiversx_sdk_cli/cli_transactions.py index 7e2038e1..1249cafd 100644 --- a/multiversx_sdk_cli/cli_transactions.py +++ b/multiversx_sdk_cli/cli_transactions.py @@ -111,19 +111,19 @@ def create_transaction(args: Any): args.data = Path(args.data_file).read_text() native_amount = int(args.value) - gas_limit = int(args.gas_limit) if args.gas_limit else 0 transfers = getattr(args, "token_transfers", None) transfers = cli_shared.prepare_token_transfers(transfers) if transfers else None chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - tx_controller = TransactionsController(chain_id) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + tx_controller = TransactionsController(chain_id, gas_estimator) tx = tx_controller.create_transaction( sender=sender, receiver=Address.new_from_bech32(args.receiver), native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, diff --git a/multiversx_sdk_cli/cli_validators.py b/multiversx_sdk_cli/cli_validators.py index 51764bd2..f28e0814 100644 --- a/multiversx_sdk_cli/cli_validators.py +++ b/multiversx_sdk_cli/cli_validators.py @@ -160,7 +160,6 @@ def do_stake(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 rewards_address = Address.new_from_bech32(args.reward_address) if args.reward_address else None controller = _get_validators_controller(args) @@ -169,7 +168,7 @@ def do_stake(args: Any): tx = controller.create_transaction_for_topping_up( sender=sender, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -182,7 +181,7 @@ def do_stake(args: Any): sender=sender, validators=validators_signers, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -196,7 +195,8 @@ def do_stake(args: Any): def _get_validators_controller(args: Any): chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - validators = ValidatorsController(chain_id) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + validators = ValidatorsController(chain_id=chain_id, gas_limit_estimator=gas_estimator) return validators @@ -225,7 +225,6 @@ def do_unstake(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -233,7 +232,7 @@ def do_unstake(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -254,7 +253,6 @@ def do_unjail(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -262,7 +260,7 @@ def do_unjail(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -283,7 +281,6 @@ def do_unbond(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -291,7 +288,7 @@ def do_unbond(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -312,7 +309,6 @@ def change_reward_address(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 rewards_address = Address.new_from_bech32(args.reward_address) controller = _get_validators_controller(args) @@ -320,7 +316,7 @@ def change_reward_address(args: Any): sender=sender, rewards_address=rewards_address, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -341,13 +337,12 @@ def do_claim(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 controller = _get_validators_controller(args) tx = controller.create_transaction_for_claiming( sender=sender, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -368,8 +363,6 @@ def do_unstake_nodes(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 - keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -377,7 +370,7 @@ def do_unstake_nodes(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -399,14 +392,13 @@ def do_unstake_tokens(args: Any): native_amount = int(args.value) value = int(args.unstake_value) - gas_limit = args.gas_limit if args.gas_limit else 0 controller = _get_validators_controller(args) tx = controller.create_transaction_for_unstaking_tokens( sender=sender, value=value, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -427,8 +419,6 @@ def do_unbond_nodes(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 - keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -436,7 +426,7 @@ def do_unbond_nodes(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -458,14 +448,13 @@ def do_unbond_tokens(args: Any): native_amount = int(args.value) value = int(args.unbond_value) - gas_limit = args.gas_limit if args.gas_limit else 0 controller = _get_validators_controller(args) tx = controller.create_transaction_for_unbonding_tokens( sender=sender, value=value, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -486,13 +475,12 @@ def do_clean_registered_data(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 controller = _get_validators_controller(args) tx = controller.create_transaction_for_cleaning_registered_data( sender=sender, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, @@ -513,7 +501,6 @@ def do_restake_unstaked_nodes(args: Any): ) native_amount = int(args.value) - gas_limit = args.gas_limit if args.gas_limit else 0 keys = _parse_public_bls_keys(args.nodes_public_keys) controller = _get_validators_controller(args) @@ -521,7 +508,7 @@ def do_restake_unstaked_nodes(args: Any): sender=sender, keys=keys, native_amount=native_amount, - gas_limit=gas_limit, + gas_limit=args.gas_limit, gas_price=args.gas_price, nonce=sender.nonce, version=args.version, diff --git a/multiversx_sdk_cli/config.py b/multiversx_sdk_cli/config.py index 9b6c89b5..32bc427c 100644 --- a/multiversx_sdk_cli/config.py +++ b/multiversx_sdk_cli/config.py @@ -128,7 +128,7 @@ def _guard_valid_config_deletion(name: str): def get_defaults() -> dict[str, Any]: return { "dependencies.golang.resolution": "SDK", - "dependencies.golang.tag": "go1.20.7", + "dependencies.golang.tag": "go1.23.10", "dependencies.golang.urlTemplate.linux": "https://golang.org/dl/{TAG}.linux-amd64.tar.gz", "dependencies.golang.urlTemplate.osx": "https://golang.org/dl/{TAG}.darwin-amd64.tar.gz", "dependencies.golang.urlTemplate.windows": "https://golang.org/dl/{TAG}.windows-amd64.zip", @@ -138,9 +138,15 @@ def get_defaults() -> dict[str, Any]: "dependencies.testwallets.urlTemplate.windows": "https://github.com/multiversx/mx-sdk-testwallets/archive/{TAG}.tar.gz", "github_api_token": "", "log_level": "info", + "gas_limit_multiplier": "1.0", } +def get_gas_limit_multiplier_from_config() -> float: + value = get_value("gas_limit_multiplier") + return float(value) + + def get_log_level_from_config() -> str: log_level = get_value("log_level") if log_level not in LOG_LEVELS: diff --git a/multiversx_sdk_cli/contract_verification.py b/multiversx_sdk_cli/contract_verification.py index 28fea012..ab2c5c11 100644 --- a/multiversx_sdk_cli/contract_verification.py +++ b/multiversx_sdk_cli/contract_verification.py @@ -43,7 +43,7 @@ def to_dictionary(self) -> dict[str, Any]: return { "signature": self.signature.hex(), "payload": { - "contract": self.contract.bech32(), + "contract": self.contract.to_bech32(), "dockerImage": self.docker_image, "sourceCode": self.source_code, "contractVariant": self.contract_variant, diff --git a/multiversx_sdk_cli/contracts.py b/multiversx_sdk_cli/contracts.py index c3a47597..91f7a7c2 100644 --- a/multiversx_sdk_cli/contracts.py +++ b/multiversx_sdk_cli/contracts.py @@ -5,6 +5,7 @@ from multiversx_sdk import ( Address, AwaitingOptions, + GasLimitEstimator, SmartContractController, SmartContractQuery, SmartContractQueryResponse, @@ -37,10 +38,15 @@ def await_transaction_completed( class SmartContract(BaseTransactionsController): - def __init__(self, config: TransactionsFactoryConfig, abi: Optional[Abi] = None): + def __init__( + self, + config: TransactionsFactoryConfig, + abi: Optional[Abi] = None, + gas_limit_estimator: Optional[GasLimitEstimator] = None, + ): self._abi = abi self._config = config - self._factory = SmartContractTransactionsFactory(config, abi) + self._factory = SmartContractTransactionsFactory(config, abi, gas_limit_estimator) def prepare_deploy_transaction( self, @@ -52,7 +58,7 @@ def prepare_deploy_transaction( readable: bool, payable: bool, payable_by_sc: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -100,7 +106,7 @@ def prepare_execute_transaction( function: str, arguments: Union[list[Any], None], should_prepare_args: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, token_transfers: Union[list[TokenTransfer], None], @@ -151,7 +157,7 @@ def prepare_upgrade_transaction( readable: bool, payable: bool, payable_by_sc: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, diff --git a/multiversx_sdk_cli/delegation.py b/multiversx_sdk_cli/delegation.py index 2a158a59..6526d02d 100644 --- a/multiversx_sdk_cli/delegation.py +++ b/multiversx_sdk_cli/delegation.py @@ -1,6 +1,9 @@ +from typing import Optional, Union + from multiversx_sdk import ( Address, DelegationTransactionsFactory, + GasLimitEstimator, Transaction, TransactionsFactoryConfig, ValidatorPublicKey, @@ -17,8 +20,13 @@ class DelegationOperations(BaseTransactionsController): - def __init__(self, config: TransactionsFactoryConfig) -> None: - self._factory = DelegationTransactionsFactory(config) + def __init__( + self, + config: TransactionsFactoryConfig, + gas_limit_estimator: Optional[GasLimitEstimator] = None, + ) -> None: + self._factory = DelegationTransactionsFactory(config=config, gas_limit_estimator=gas_limit_estimator) + self.chain_id = config.chain_id def prepare_transaction_for_new_delegation_contract( self, @@ -26,7 +34,7 @@ def prepare_transaction_for_new_delegation_contract( native_amount: int, total_delegation_cap: int, service_fee: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, nonce: int, version: int, @@ -68,7 +76,7 @@ def prepare_transaction_for_adding_nodes( delegation_contract: Address, public_keys: list[ValidatorPublicKey], signed_messages: list[bytes], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -111,7 +119,7 @@ def prepare_transaction_for_removing_nodes( owner: IAccount, delegation_contract: Address, public_keys: list[ValidatorPublicKey], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -153,7 +161,7 @@ def prepare_transaction_for_staking_nodes( owner: IAccount, delegation_contract: Address, public_keys: list[ValidatorPublicKey], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -195,7 +203,7 @@ def prepare_transaction_for_unbonding_nodes( owner: IAccount, delegation_contract: Address, public_keys: list[ValidatorPublicKey], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -237,7 +245,7 @@ def prepare_transaction_for_unstaking_nodes( owner: IAccount, delegation_contract: Address, public_keys: list[ValidatorPublicKey], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -279,7 +287,7 @@ def prepare_transaction_for_unjailing_nodes( owner: IAccount, delegation_contract: Address, public_keys: list[ValidatorPublicKey], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -320,7 +328,7 @@ def prepare_transaction_for_delegating( self, owner: IAccount, delegation_contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -360,7 +368,7 @@ def prepare_transaction_for_claiming_rewards( self, owner: IAccount, delegation_contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -399,7 +407,7 @@ def prepare_transaction_for_redelegating_rewards( self, owner: IAccount, delegation_contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -438,7 +446,7 @@ def prepare_transaction_for_undelegating( self, owner: IAccount, delegation_contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -478,7 +486,7 @@ def prepare_transaction_for_withdrawing( self, owner: IAccount, delegation_contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -518,7 +526,7 @@ def prepare_transaction_for_changing_service_fee( owner: IAccount, delegation_contract: Address, service_fee: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -560,7 +568,7 @@ def prepare_transaction_for_modifying_delegation_cap( owner: IAccount, delegation_contract: Address, delegation_cap: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -603,7 +611,7 @@ def prepare_transaction_for_automatic_activation( delegation_contract: Address, set: bool, unset: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -655,7 +663,7 @@ def prepare_transaction_for_redelegate_cap( delegation_contract: Address, set: bool, unset: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -708,7 +716,7 @@ def prepare_transaction_for_setting_metadata( name: str, website: str, identifier: str, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -753,7 +761,7 @@ def prepare_transaction_for_creating_delegation_contract_from_validator( owner: IAccount, max_cap: int, service_fee: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, value: int, nonce: int, @@ -772,7 +780,7 @@ def prepare_transaction_for_creating_delegation_contract_from_validator( sender=owner.address, receiver=receiver, gas_limit=510000000, - chain_id=self._factory.config.chain_id, + chain_id=self.chain_id, data=data.encode(), nonce=nonce, version=version, diff --git a/multiversx_sdk_cli/dns.py b/multiversx_sdk_cli/dns.py index 50955e34..c1a70277 100644 --- a/multiversx_sdk_cli/dns.py +++ b/multiversx_sdk_cli/dns.py @@ -76,7 +76,8 @@ def register(args: Any): data = dns_register_data(args.name) chain_id = cli_shared.get_chain_id(args.proxy, args.chain) - controller = TransactionsController(chain_id) + gas_estimator = cli_shared.initialize_gas_limit_estimator(args) + controller = TransactionsController(chain_id=chain_id, gas_limit_estimator=gas_estimator) tx = controller.create_transaction( sender=sender, diff --git a/multiversx_sdk_cli/governance.py b/multiversx_sdk_cli/governance.py index 8042d64d..8477c4f1 100644 --- a/multiversx_sdk_cli/governance.py +++ b/multiversx_sdk_cli/governance.py @@ -1,5 +1,8 @@ +from typing import Optional, Union + from multiversx_sdk import ( Address, + GasLimitEstimator, GovernanceTransactionsFactory, Transaction, TransactionsFactoryConfig, @@ -12,8 +15,12 @@ class GovernanceWrapper(BaseTransactionsController): - def __init__(self, config: TransactionsFactoryConfig) -> None: - self.factory = GovernanceTransactionsFactory(config) + def __init__( + self, + config: TransactionsFactoryConfig, + gas_limit_estimator: Optional[GasLimitEstimator] = None, + ) -> None: + self.factory = GovernanceTransactionsFactory(config=config, gas_limit_estimator=gas_limit_estimator) def create_transaction_for_new_proposal( self, @@ -23,7 +30,7 @@ def create_transaction_for_new_proposal( start_vote_epoch: int, end_vote_epoch: int, native_token_amount: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -66,7 +73,7 @@ def create_transaction_for_voting( nonce: int, proposal_nonce: int, vote: str, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -106,7 +113,7 @@ def create_transaction_for_closing_proposal( sender: IAccount, nonce: int, proposal_nonce: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -142,7 +149,7 @@ def create_transaction_for_clearing_ended_proposals( sender: IAccount, nonce: int, proposers: list[Address], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -177,7 +184,7 @@ def create_transaction_for_claiming_accumulated_fees( self, sender: IAccount, nonce: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -217,7 +224,7 @@ def create_transaction_for_changing_config( min_quorum: int, min_veto_threshold: int, min_pass_threshold: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, diff --git a/multiversx_sdk_cli/localnet/genesis_smart_contracts_json.py b/multiversx_sdk_cli/localnet/genesis_smart_contracts_json.py index d50a7601..b2450126 100644 --- a/multiversx_sdk_cli/localnet/genesis_smart_contracts_json.py +++ b/multiversx_sdk_cli/localnet/genesis_smart_contracts_json.py @@ -10,7 +10,7 @@ def patch(data: Any, config: ConfigRoot): delegation_config = data[0] dns_config = data[1] - delegation_config["owner"] = owner.address.bech32() - dns_config["owner"] = owner.address.bech32() + delegation_config["owner"] = owner.address.to_bech32() + dns_config["owner"] = owner.address.to_bech32() # registration price = 100 atto-EGLD dns_config["init-parameters"] = "0064" diff --git a/multiversx_sdk_cli/localnet/step_build_software.py b/multiversx_sdk_cli/localnet/step_build_software.py index 7f9b38ca..ac684ed0 100644 --- a/multiversx_sdk_cli/localnet/step_build_software.py +++ b/multiversx_sdk_cli/localnet/step_build_software.py @@ -49,8 +49,12 @@ def _do_build(cwd: Path, env: Dict[str, str]): def _copy_wasmer_libs(config: ConfigRoot, destination: Path): golang = dependencies.get_golang() vm_go_folder_name = _get_chain_vm_go_folder_name(config) + vm_go_legacy_folder_name = _get_chain_vm_go_legacy_folder_name(config) + vm_go_path = golang.get_gopath() / "pkg" / "mod" / vm_go_folder_name - wasmer_path = vm_go_path / "wasmer" + vm_go_legacy_path = golang.get_gopath() / "pkg" / "mod" / vm_go_legacy_folder_name + + wasmer_path = vm_go_legacy_path / "wasmer" wasmer2_path = vm_go_path / "wasmer2" libraries.copy_libraries(wasmer_path, destination) @@ -65,6 +69,14 @@ def _get_chain_vm_go_folder_name(config: ConfigRoot) -> str: return f"{parts[0]}@{parts[1]}" +def _get_chain_vm_go_legacy_folder_name(config: ConfigRoot) -> str: + go_mod = config.software.mx_chain_go.get_path_within_source(Path("go.mod")) + lines = utils.read_lines(go_mod) + line = [line for line in lines if "github.com/multiversx/mx-chain-vm-v1_4-go" in line][0] + parts = line.split() + return f"{parts[0]}@{parts[1]}" + + def _set_rpath(cmd_path: Path): """ Set the rpath of the executable to the current directory, on a best-effort basis. diff --git a/multiversx_sdk_cli/multisig.py b/multiversx_sdk_cli/multisig.py index be28cfa8..12c8f6c7 100644 --- a/multiversx_sdk_cli/multisig.py +++ b/multiversx_sdk_cli/multisig.py @@ -1,9 +1,10 @@ import logging from pathlib import Path -from typing import Any, Optional +from typing import Any, Optional, Union from multiversx_sdk import ( Address, + GasLimitEstimator, MultisigTransactionsFactory, TokenTransfer, Transaction, @@ -19,8 +20,13 @@ class MultisigWrapper(BaseTransactionsController): - def __init__(self, config: TransactionsFactoryConfig, abi: Abi): - self._factory = MultisigTransactionsFactory(config, abi) + def __init__( + self, + config: TransactionsFactoryConfig, + abi: Abi, + gas_limit_estimator: Optional[GasLimitEstimator] = None, + ): + self._factory = MultisigTransactionsFactory(config=config, abi=abi, gas_limit_estimator=gas_limit_estimator) def prepare_deploy_transaction( self, @@ -33,7 +39,7 @@ def prepare_deploy_transaction( readable: bool, payable: bool, payable_by_sc: bool, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -73,7 +79,7 @@ def prepare_deposit_transaction( owner: IAccount, nonce: int, contract: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -112,7 +118,7 @@ def prepare_discard_action_transaction( nonce: int, contract: Address, action_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -148,7 +154,7 @@ def prepare_discard_batch_transaction( nonce: int, contract: Address, action_ids: list[int], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -184,7 +190,7 @@ def prepare_add_board_member_transaction( nonce: int, contract: Address, board_member: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -220,7 +226,7 @@ def prepare_add_proposer_transaction( nonce: int, contract: Address, proposer: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -256,7 +262,7 @@ def prepare_remove_user_transaction( nonce: int, contract: Address, user: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -292,7 +298,7 @@ def prepare_change_quorum_transaction( nonce: int, contract: Address, quorum: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -329,7 +335,7 @@ def prepare_transfer_execute_transaction( contract: Address, receiver: Address, native_token_amount: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -379,7 +385,7 @@ def prepare_transfer_execute_esdt_transaction( nonce: int, contract: Address, receiver: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -430,7 +436,7 @@ def prepare_async_call_transaction( nonce: int, contract: Address, receiver: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -483,7 +489,7 @@ def prepare_contract_deploy_from_source_transaction( nonce: int, contract: Address, contract_to_copy: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -539,7 +545,7 @@ def prepare_contract_upgrade_from_source_transaction( contract: Address, contract_to_upgrade: Address, contract_to_copy: Address, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -595,7 +601,7 @@ def prepare_sign_action_transaction( nonce: int, contract: Address, action_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -631,7 +637,7 @@ def prepare_sign_batch_transaction( nonce: int, contract: Address, batch_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -667,7 +673,7 @@ def prepare_sign_and_perform_transaction( nonce: int, contract: Address, action_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -703,7 +709,7 @@ def prepare_sign_batch_and_perform_transaction( nonce: int, contract: Address, batch_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -739,7 +745,7 @@ def prepare_unsign_action_transaction( nonce: int, contract: Address, action_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -775,7 +781,7 @@ def prepare_unsign_batch_transaction( nonce: int, contract: Address, batch_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -812,7 +818,7 @@ def prepare_unsign_for_outdated_board_members_transaction( contract: Address, action_id: int, outdated_board_members: list[int], - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -849,7 +855,7 @@ def prepare_perform_action_transaction( nonce: int, contract: Address, action_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, @@ -885,7 +891,7 @@ def prepare_perform_batch_transaction( nonce: int, contract: Address, batch_id: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, version: int, options: int, diff --git a/multiversx_sdk_cli/tests/test_cli_staking_provider.py b/multiversx_sdk_cli/tests/test_cli_staking_provider.py index 7b8319e2..5c3da677 100644 --- a/multiversx_sdk_cli/tests/test_cli_staking_provider.py +++ b/multiversx_sdk_cli/tests/test_cli_staking_provider.py @@ -613,7 +613,7 @@ def test_delegate(capsys: Any): assert data == "delegate" assert transaction["sender"] == "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" assert transaction["receiver"] == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqthllllsy5r6rh" - assert transaction["gasLimit"] == 12000000 + assert transaction["gasLimit"] == 11062000 def test_claim_rewards(capsys: Any): @@ -638,7 +638,7 @@ def test_claim_rewards(capsys: Any): assert data == "claimRewards" assert transaction["sender"] == "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" assert transaction["receiver"] == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqthllllsy5r6rh" - assert transaction["gasLimit"] == 6000000 + assert transaction["gasLimit"] == 11068000 def test_redelegate_rewards(capsys: Any): @@ -663,7 +663,7 @@ def test_redelegate_rewards(capsys: Any): assert data == "reDelegateRewards" assert transaction["sender"] == "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" assert transaction["receiver"] == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqthllllsy5r6rh" - assert transaction["gasLimit"] == 12000000 + assert transaction["gasLimit"] == 11075500 def test_undelegate(capsys: Any): @@ -690,7 +690,7 @@ def test_undelegate(capsys: Any): assert data == "unDelegate@0de0b6b3a7640000" assert transaction["sender"] == "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" assert transaction["receiver"] == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqthllllsy5r6rh" - assert transaction["gasLimit"] == 12000000 + assert transaction["gasLimit"] == 11090500 def test_withdraw(capsys: Any): @@ -715,7 +715,7 @@ def test_withdraw(capsys: Any): assert data == "withdraw" assert transaction["sender"] == "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th" assert transaction["receiver"] == "erd1qqqqqqqqqqqqqqqpqqqqqqqqqqqqqqqqqqqqqqqqqqqqqthllllsy5r6rh" - assert transaction["gasLimit"] == 12000000 + assert transaction["gasLimit"] == 11062000 def _read_stdout(capsys: Any) -> str: diff --git a/multiversx_sdk_cli/tests/test_cli_transactions.py b/multiversx_sdk_cli/tests/test_cli_transactions.py index 3f964ab7..128cf63a 100644 --- a/multiversx_sdk_cli/tests/test_cli_transactions.py +++ b/multiversx_sdk_cli/tests/test_cli_transactions.py @@ -393,6 +393,76 @@ def test_sign_transaction(capsys: Any): ) +def test_estimate_gas(capsys: Any): + return_code = main( + [ + "tx", + "new", + "--pem", + str(testdata_path / "alice.pem"), + "--receiver", + "erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", + "--proxy", + "https://devnet-gateway.multiversx.com", + "--value", + "1000000000000", + ] + ) + assert return_code == 0 + + tx = _read_stdout(capsys) + tx_json = json.loads(tx)["emittedTransaction"] + assert tx_json["gasLimit"] == 50000 + + +def test_estimate_gas_for_guarded_tx(capsys: Any): + return_code = main( + [ + "tx", + "new", + "--pem", + str(testdata_path / "alice.pem"), + "--receiver", + "erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", + "--proxy", + "https://devnet-gateway.multiversx.com", + "--value", + "1000000000000", + "--guardian", + "erd1cqqxak4wun7508e0yj9ng843r6hv4mzd0hhpjpsejkpn9wa9yq8sj7u2u5", + ] + ) + assert return_code == 0 + + tx = _read_stdout(capsys) + tx_json = json.loads(tx)["emittedTransaction"] + assert tx_json["gasLimit"] == 100000 + + +def test_estimate_gas_with_multiplier(capsys: Any): + return_code = main( + [ + "tx", + "new", + "--pem", + str(testdata_path / "alice.pem"), + "--receiver", + "erd1spyavw0956vq68xj8y4tenjpq2wd5a9p2c6j8gsz7ztyrnpxrruqzu66jx", + "--proxy", + "https://devnet-gateway.multiversx.com", + "--gas-limit-multiplier", + "1.5", + "--value", + "1000000000000", + ] + ) + assert return_code == 0 + + tx = _read_stdout(capsys) + tx_json = json.loads(tx)["emittedTransaction"] + assert tx_json["gasLimit"] == 75000 + + def _read_stdout(capsys: Any) -> str: stdout: str = capsys.readouterr().out.strip() return stdout diff --git a/multiversx_sdk_cli/tests/test_cli_validators_localnet.py b/multiversx_sdk_cli/tests/test_cli_validators_localnet.py index 067b0d23..c54a2545 100644 --- a/multiversx_sdk_cli/tests/test_cli_validators_localnet.py +++ b/multiversx_sdk_cli/tests/test_cli_validators_localnet.py @@ -5,9 +5,7 @@ from multiversx_sdk_cli.cli import main testdata_path = Path(__file__).parent / "testdata" -testdata_out = Path(__file__).parent / "testdata-out" -proxy_url = "http://localhost:7950/network/config" alice_pem = testdata_path / "alice.pem" reward_address = "erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8" bls_key = "e7beaa95b3877f47348df4dd1cb578a4f7cabf7a20bfeefe5cdd263878ff132b765e04fef6f40c93512b666c47ed7719b8902f6c922c04247989b7137e837cc81a62e54712471c97a2ddab75aa9c2f58f813ed4c0fa722bde0ab718bff382208" diff --git a/multiversx_sdk_cli/tests/test_contracts.py b/multiversx_sdk_cli/tests/test_contracts.py index 0ad046d6..d3397f99 100644 --- a/multiversx_sdk_cli/tests/test_contracts.py +++ b/multiversx_sdk_cli/tests/test_contracts.py @@ -19,7 +19,7 @@ def test_playground_keccak(): def test_contract_verification_create_request_signature(): account = Account.new_from_pem(file_path=testdata_folder / "walletKey.pem") - contract_address = Address.from_bech32("erd1qqqqqqqqqqqqqpgqeyj9g344pqguukajpcfqz9p0rfqgyg4l396qespdck") + contract_address = Address.new_from_bech32("erd1qqqqqqqqqqqqqpgqeyj9g344pqguukajpcfqz9p0rfqgyg4l396qespdck") request_payload = b"test" signature = _create_request_signature(account, contract_address, request_payload) diff --git a/multiversx_sdk_cli/transactions.py b/multiversx_sdk_cli/transactions.py index 40074518..d5f9503f 100644 --- a/multiversx_sdk_cli/transactions.py +++ b/multiversx_sdk_cli/transactions.py @@ -5,6 +5,7 @@ from multiversx_sdk import ( Address, AwaitingOptions, + GasLimitEstimator, TokenTransfer, Transaction, TransactionOnNetwork, @@ -38,16 +39,17 @@ def await_transaction_completed(self, transaction_hash: Union[bytes, str], optio class TransactionsController(BaseTransactionsController): - def __init__(self, chain_id: str) -> None: + def __init__(self, chain_id: str, gas_limit_estimator: Optional[GasLimitEstimator] = None) -> None: config = TransactionsFactoryConfig(chain_id) - self.factory = TransferTransactionsFactory(config) + self.chain_id = chain_id + self.factory = TransferTransactionsFactory(config, gas_limit_estimator) def create_transaction( self, sender: IAccount, receiver: Address, native_amount: int, - gas_limit: int, + gas_limit: Union[int, None], gas_price: int, nonce: int, version: int, @@ -62,7 +64,7 @@ def create_transaction( sender=sender.address, receiver=receiver, gas_limit=MIN_GAS_LIMIT, - chain_id=self.factory.config.chain_id, + chain_id=self.chain_id, ) else: transaction = self.factory.create_transaction_for_transfer( diff --git a/multiversx_sdk_cli/validators.py b/multiversx_sdk_cli/validators.py index 74796834..05eb9871 100644 --- a/multiversx_sdk_cli/validators.py +++ b/multiversx_sdk_cli/validators.py @@ -2,6 +2,7 @@ from multiversx_sdk import ( Address, + GasLimitEstimator, Transaction, TransactionsFactoryConfig, ValidatorPublicKey, @@ -12,13 +13,14 @@ from multiversx_sdk_cli.base_transactions_controller import BaseTransactionsController from multiversx_sdk_cli.guardian_relayer_data import GuardianRelayerData from multiversx_sdk_cli.interfaces import IAccount -from multiversx_sdk_cli.transactions import TransactionsController class ValidatorsController(BaseTransactionsController): - def __init__(self, chain_id: str) -> None: - self.transactions_controller = TransactionsController(chain_id) - self.factory = ValidatorsTransactionsFactory(TransactionsFactoryConfig(chain_id)) + def __init__(self, chain_id: str, gas_limit_estimator: Optional[GasLimitEstimator] = None) -> None: + self.factory = ValidatorsTransactionsFactory( + config=TransactionsFactoryConfig(chain_id), + gas_limit_estimator=gas_limit_estimator, + ) def create_transaction_for_staking( self, diff --git a/pyproject.toml b/pyproject.toml index 69697e62..f6e3ab7e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "hatchling.build" [project] name = "multiversx-sdk-cli" -version = "11.0.0" +version = "11.1.1" authors = [ { name="MultiversX" }, ] @@ -25,7 +25,7 @@ dependencies = [ "ledgercomm[hid]", "rich==13.3.4", "argcomplete==3.2.2", - "multiversx-sdk[ledger]==1.6.2" + "multiversx-sdk[ledger]==2.0.1" ] [project.scripts] diff --git a/requirements.txt b/requirements.txt index ac022b32..33c1b918 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,4 +6,4 @@ ledgercomm[hid] rich==13.3.4 argcomplete==3.2.2 -multiversx-sdk[ledger]==1.6.2 +multiversx-sdk[ledger]==2.0.1