From d79eb3a940ea2985d150f2ac3a940e1cfe83deb6 Mon Sep 17 00:00:00 2001 From: Kristina Nikolaeva Date: Mon, 24 Feb 2025 20:01:54 +0100 Subject: [PATCH] fix scheduled trx tests for devnet --- .../test_send_scheduled_transactions.py | 514 +++--------------- utils/web3client.py | 7 +- 2 files changed, 65 insertions(+), 456 deletions(-) diff --git a/integration/tests/basic/solana_signature/test_send_scheduled_transactions.py b/integration/tests/basic/solana_signature/test_send_scheduled_transactions.py index f726bb1e4..6a9f8723c 100644 --- a/integration/tests/basic/solana_signature/test_send_scheduled_transactions.py +++ b/integration/tests/basic/solana_signature/test_send_scheduled_transactions.py @@ -4,16 +4,13 @@ import eth_abi import pytest from eth_utils import abi -from solana.rpc.commitment import Confirmed -from solana.transaction import Transaction -from solders.pubkey import Pubkey -from spl.token.instructions import get_associated_token_address, create_associated_token_account from utils.consts import wSOL, LAMPORT_PER_SOL +from utils.helpers import wait_condition from utils.models.result import EthGetBlockByHashResult -from utils.neon_user import NeonUser from utils.scheduled_trx import ScheduledTransaction, CreateTreeAccMultipleData, ScheduledTrxEstimateRequest +from utils.web3client import BASE_MAX_PRIORITY_FEE @allure.feature("Solana native") @@ -34,8 +31,8 @@ def test_send_simple_single_trx(self, web3_client_sol, neon_user, common_contrac neon_user, treasury_pool, tx.encode(), wSOL["address_spl"], chain_id=evm_loader.sol_chain_id ) web3_client_sol.wait_for_transaction_receipt(tx.hash(), timeout=180) + wait_condition(lambda: hex(tx.nonce) in web3_client_sol.get_pending_transactions(neon_user.checksum_address)) pending_trx = web3_client_sol.get_pending_transactions(neon_user.checksum_address) - assert len(pending_trx) >= 1 assert pending_trx[hex(tx.nonce)][0]["status"] in ("Done", "InProgress") assert common_contract.functions.getNumber().call() == contract_data @@ -45,20 +42,32 @@ def test_multiple_scheduled_trx(self, web3_client_sol, neon_user, common_contrac data = abi.function_signature_to_4byte_selector("setNumber(uint256)") + eth_abi.encode( ["uint256"], [contract_data] ) - trx_estimate_obj_list = [] - for i in range(4): - trx_estimate_obj_list.append( - ScheduledTrxEstimateRequest(neon_user.checksum_address, common_contract.address, data) - ) - estimate_result = web3_client_sol.estimate_scheduled(neon_user.solana_account.pubkey(), trx_estimate_obj_list) + + max_priority_fee_per_gas = BASE_MAX_PRIORITY_FEE + max_fee_per_gas = web3_client_sol.get_max_fee_per_gas() + gas_limit = 30000000 + trxs = [] for i in range(4): - trxs.append(ScheduledTransaction.from_estimate_result(i, trx_estimate_obj_list[i], estimate_result)) + trxs.append( + ScheduledTransaction( + neon_user.neon_address, + None, + nonce, + index=i, + target=common_contract.address, + call_data=data, + max_fee_per_gas=max_fee_per_gas, + max_priority_fee_per_gas=max_priority_fee_per_gas, + gas_limit=gas_limit, + chain_id=web3_client_sol.chain_id, + ) + ) tree_acc_data = CreateTreeAccMultipleData( nonce=nonce, - max_fee_per_gas=estimate_result["maxFeePerGas"], - max_priority_fee_per_gas=estimate_result["maxPriorityFeePerGas"], + max_fee_per_gas=max_fee_per_gas, + max_priority_fee_per_gas=max_priority_fee_per_gas, ) tree_acc_data.add_trx(trxs[0], 3, 0) @@ -76,8 +85,8 @@ def test_multiple_scheduled_trx(self, web3_client_sol, neon_user, common_contrac ) web3_client_sol.send_all_scheduled_transactions(trxs) for trx in trxs: - resp = web3_client_sol.wait_for_transaction_receipt(trx.hash()) - assert resp["status"] == 1 + resp = web3_client_sol.wait_for_transaction_receipt(trx.hash(), timeout=180) + assert resp["status"] == 1, f"Trx {trx.hash().hex()} failed: receipt - {resp}" pending_trx = web3_client_sol.get_pending_transactions(neon_user.checksum_address) assert len(pending_trx) >= 1 assert pending_trx[hex(nonce)][0]["status"] == "Done" @@ -88,11 +97,10 @@ def test_multiple_scheduled_trx_with_failed_trx( ): nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2500000000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - + max_priority_fee_per_gas = BASE_MAX_PRIORITY_FEE + max_fee_per_gas = web3_client_sol.get_max_fee_per_gas() gas_limit = 30000000 + call_data_trx0 = abi.function_signature_to_4byte_selector("doAssert()") call_data_trx1 = abi.function_signature_to_4byte_selector("indexedArgs()") @@ -106,6 +114,7 @@ def test_multiple_scheduled_trx_with_failed_trx( max_fee_per_gas=max_fee_per_gas, max_priority_fee_per_gas=max_priority_fee_per_gas, gas_limit=gas_limit, + chain_id=web3_client_sol.chain_id, ) tx1 = ScheduledTransaction( neon_user.neon_address, @@ -117,6 +126,7 @@ def test_multiple_scheduled_trx_with_failed_trx( max_fee_per_gas=max_fee_per_gas, max_priority_fee_per_gas=max_priority_fee_per_gas, gas_limit=gas_limit, + chain_id=web3_client_sol.chain_id, ) tree_acc_data = CreateTreeAccMultipleData( nonce=nonce, max_fee_per_gas=max_fee_per_gas, max_priority_fee_per_gas=max_priority_fee_per_gas @@ -155,13 +165,14 @@ def test_create_2_tree_accounts_with_the_same_nonce( ) tree_acc.add_trx(tx0, 0xFFFF, 0) - evm_loader.create_tree_account_multiple( + tree_account = evm_loader.create_tree_account_multiple( neon_user, treasury_pool, tree_acc.data, wSOL["address_spl"], payer_nonce=nonce ) with pytest.raises(AssertionError, match="transaction with the same nonce already exists"): evm_loader.create_tree_account_multiple( neon_user, treasury_pool, tree_acc.data, wSOL["address_spl"], payer_nonce=nonce ) + wait_condition(lambda: not evm_loader.account_exists(tree_account)) @pytest.mark.skip("NDEV-3453") def test_scheduled_trx_send_tokens_to_neon_chain_contract( @@ -245,21 +256,31 @@ def test_scheduled_trx_with_timestamp( abi.function_signature_to_4byte_selector("addDataToMapping(uint256,uint256)") + eth_abi.encode(["uint256", "uint256"], [v1, v2]) ) + max_priority_fee_per_gas = BASE_MAX_PRIORITY_FEE + max_fee_per_gas = web3_client_sol.get_max_fee_per_gas() + gas_limit = 30000000 - trx_estimate_obj_list = [] - for i in range(trx_count): - trx_estimate_obj_list.append( - ScheduledTrxEstimateRequest(neon_user.checksum_address, contract.address, call_data[i]) - ) - estimate_result = web3_client_sol.estimate_scheduled(neon_user.solana_account.pubkey(), trx_estimate_obj_list) trxs = [] for i in range(trx_count): - trxs.append(ScheduledTransaction.from_estimate_result(i, trx_estimate_obj_list[i], estimate_result)) + trxs.append( + ScheduledTransaction( + neon_user.neon_address, + None, + nonce, + index=i, + target=contract.address, + call_data=call_data[i], + max_fee_per_gas=max_fee_per_gas, + max_priority_fee_per_gas=max_priority_fee_per_gas, + gas_limit=gas_limit, + chain_id=web3_client_sol.chain_id, + ) + ) tree_acc_data = CreateTreeAccMultipleData( nonce=nonce, - max_fee_per_gas=estimate_result["maxFeePerGas"], - max_priority_fee_per_gas=estimate_result["maxPriorityFeePerGas"], + max_fee_per_gas=max_fee_per_gas, + max_priority_fee_per_gas=max_priority_fee_per_gas, ) tree_acc_data.add_trx(trxs[0], 1, 0) if trx_count > 2: @@ -272,8 +293,8 @@ def test_scheduled_trx_with_timestamp( web3_client_sol.send_all_scheduled_transactions(trxs) for trx in trxs: - receipt = web3_client_sol.wait_for_transaction_receipt(trx.hash()) - assert receipt["status"] == 1 + receipt = web3_client_sol.wait_for_transaction_receipt(trx.hash(), timeout=180) + assert receipt["status"] == 1, f"Trx {trx.hash().hex()} failed: receipt - {receipt}" response = json_rpc_client.send_rpc(method="eth_getBlockByHash", params=[receipt["blockHash"].hex(), False]) tx_block_timestamp = EthGetBlockByHashResult(**response).result.timestamp @@ -292,10 +313,9 @@ def test_scheduled_trx_with_small_gas_limit( call_data = abi.function_signature_to_4byte_selector("addDataToMapping(uint256,uint256)") + eth_abi.encode( ["uint256", "uint256"], [1, 2] ) - gas_limit = 3000000 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2500000000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas + gas_limit = 3000 + max_priority_fee_per_gas = BASE_MAX_PRIORITY_FEE + max_fee_per_gas = web3_client_sol.get_max_fee_per_gas() tx0 = ScheduledTransaction( neon_user.neon_address, @@ -307,17 +327,16 @@ def test_scheduled_trx_with_small_gas_limit( max_fee_per_gas=max_fee_per_gas, max_priority_fee_per_gas=max_priority_fee_per_gas, gas_limit=gas_limit, + chain_id=web3_client_sol.chain_id, ) tree_acc_data = CreateTreeAccMultipleData( nonce=nonce, max_fee_per_gas=max_fee_per_gas, max_priority_fee_per_gas=max_priority_fee_per_gas ) tree_acc_data.add_trx(tx0, 0xFFFF, 0) - evm_loader.create_tree_account_multiple(neon_user, treasury_pool, tree_acc_data.data, wSOL["address_spl"]) - web3_client_sol.send_scheduled_transaction(tx0) - receipt = web3_client_sol.wait_for_transaction_receipt(tx0.hash()) - assert receipt["status"] == 0, f"failed trx - receipt: {receipt}" + with pytest.raises(AssertionError, match="Transaction Tree - transaction requires at least 25'000 gas limit"): + evm_loader.create_tree_account_multiple(neon_user, treasury_pool, tree_acc_data.data, wSOL["address_spl"]) def test_long_chain_iterative_scheduled_trx( self, web3_client_sol, neon_user, treasury_pool, evm_loader, json_rpc_client, counter_contract @@ -356,415 +375,4 @@ def test_long_chain_iterative_scheduled_trx( for trx in trxs: receipt = web3_client_sol.wait_for_transaction_receipt(trx.hash()) - assert receipt["status"] == 1, f"Trx failed: receipt - {receipt}" - - -@allure.feature("Solana native") -@allure.story("Test sending scheduled transaction ERC20ForSplNew") -class TestScheduledTrxERC20new: - - def test_scheduled_trx_pda_balance( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - recipient = NeonUser(evm_loader.loader_id) - - my_pda = Pubkey(erc20_spl_mintable_new.contract.functions.solanaAccount(neon_user.checksum_address).call()) - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - - erc20_spl_mintable_new.pop_up_balance(evm_loader, recipient=neon_user, pda_amount=1000, ata_amount=1000) - - balance_pda = erc20_spl_mintable_new.contract.functions.balanceOfPDA(neon_user.checksum_address).call() - assert ( - int(evm_loader.get_token_account_balance(my_pda, commitment=Confirmed).value.amount) == balance_pda == 1000 - ) - - data = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, 1000] - ) - trx_estimate_obj = ScheduledTrxEstimateRequest(neon_user.checksum_address, erc20_spl_mintable_new.address, data) - estimate_result = web3_client_sol.estimate_scheduled(neon_user.solana_account.pubkey(), [trx_estimate_obj]) - - tx = ScheduledTransaction.from_estimate_result(0, trx_estimate_obj, estimate_result) - - evm_loader.create_tree_account( - neon_user, treasury_pool, tx.encode(), wSOL["address_spl"], chain_id=evm_loader.sol_chain_id - ) - web3_client_sol.wait_for_transaction_receipt(tx.hash(), timeout=180) - - balance_ata = erc20_spl_mintable_new.contract.functions.balanceOfATA(neon_user.checksum_address).call() - - assert erc20_spl_mintable_new.get_balance(recipient.checksum_address) == 1000 - assert erc20_spl_mintable_new.get_balance(neon_user.checksum_address) == balance_ata == 1000 - - assert int(evm_loader.get_token_account_balance(my_pda, commitment=Confirmed).value.amount) == 0 - assert int(evm_loader.get_token_account_balance(my_ata, commitment=Confirmed).value.amount) == 1000 - - def test_scheduled_trx_no_pda_balance_uses_ata( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - recipient = NeonUser(evm_loader.loader_id) - - my_pda = Pubkey(erc20_spl_mintable_new.contract.functions.solanaAccount(neon_user.checksum_address).call()) - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - - erc20_spl_mintable_new.pop_up_balance(evm_loader, recipient=neon_user, pda_amount=1000, ata_amount=1000) - - assert int(evm_loader.get_token_account_balance(my_ata, commitment=Confirmed).value.amount) == 1000 - - data = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, 2000] - ) - - gas_limit = 3000000 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2500000000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - tx0 = ScheduledTransaction( - nonce=nonce, - index=0, - target=erc20_spl_mintable_new.address, - call_data=data, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - gas_limit=gas_limit, - payer=neon_user.checksum_address, - sender=None, - ) - - evm_loader.create_tree_account( - neon_user, treasury_pool, tx0.encode(), wSOL["address_spl"], chain_id=evm_loader.sol_chain_id - ) - web3_client_sol.wait_for_transaction_receipt(tx0.hash(), timeout=180) - - assert erc20_spl_mintable_new.get_balance(recipient.checksum_address) == 2000 - assert erc20_spl_mintable_new.get_balance(neon_user.checksum_address) == 0 - - assert int(evm_loader.get_token_account_balance(my_pda, commitment=Confirmed).value.amount) == 0 - assert int(evm_loader.get_token_account_balance(my_ata, commitment=Confirmed).value.amount) == 0 - - def test_scheduled_trx_both_pda_and_ata_used( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - recipient = NeonUser(evm_loader.loader_id) - amount_to_transfer = 1_000 - - my_pda = Pubkey(erc20_spl_mintable_new.contract.functions.solanaAccount(neon_user.checksum_address).call()) - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - - erc20_spl_mintable_new.pop_up_balance( - evm_loader, recipient=neon_user, pda_amount=amount_to_transfer, ata_amount=amount_to_transfer - ) - - for account in (my_pda, my_ata): - assert int(evm_loader.get_token_account_balance(account, commitment=Confirmed).value.amount) == 1000 - - data = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, 2000] - ) - - gas_limit = 3000000 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2500000000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - tx0 = ScheduledTransaction( - nonce=nonce, - index=0, - target=erc20_spl_mintable_new.address, - call_data=data, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - gas_limit=gas_limit, - payer=neon_user.checksum_address, - sender=None, - ) - - evm_loader.create_tree_account( - neon_user, treasury_pool, tx0.encode(), wSOL["address_spl"], chain_id=evm_loader.sol_chain_id - ) - web3_client_sol.wait_for_transaction_receipt(tx0.hash(), timeout=180) - - balance_pda = erc20_spl_mintable_new.contract.functions.balanceOfPDA(neon_user.checksum_address).call() - balance_ata = erc20_spl_mintable_new.contract.functions.balanceOfATA(neon_user.checksum_address).call() - - assert erc20_spl_mintable_new.get_balance(recipient.checksum_address) == 2000 - assert balance_pda == balance_ata == 0 - - def test_scheduled_trx_transferSolana_ata_balance_not_used( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - - erc20_spl_mintable_new.pop_up_balance(evm_loader, recipient=neon_user, pda_amount=5, ata_amount=2000) - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - - data = abi.function_signature_to_4byte_selector("transferSolana(address,uint256)") + eth_abi.encode( - ["bytes", "uint256"], [bytes(my_ata), 10] - ) - - gas_limit = 3000000 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2500000000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - tx0 = ScheduledTransaction( - nonce=nonce, - index=0, - target=erc20_spl_mintable_new.address, - call_data=data, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - gas_limit=gas_limit, - payer=neon_user.checksum_address, - sender=None, - ) - - evm_loader.create_tree_account( - neon_user, treasury_pool, tx0.encode(), wSOL["address_spl"], chain_id=evm_loader.sol_chain_id - ) - resp = web3_client_sol.wait_for_transaction_receipt(tx0.hash(), timeout=180) - - assert resp["status"] == 0, resp - - @pytest.mark.xfail(reason="NDEV-3575") - def test_multiple_transactions_with_transfer_from_solana( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - - trx = Transaction() - trx.add( - create_associated_token_account( - neon_user.solana_account.pubkey(), neon_user.solana_account.pubkey(), token_mint - ) - ) - evm_loader.send_tx_and_check_status_ok(trx, neon_user.solana_account) - amount = 1000 - - erc20_spl_mintable_new.approve(erc20_spl_mintable_new.account, neon_user.checksum_address, amount) - - call_data = abi.function_signature_to_4byte_selector( - "transferSolanaFrom(address,bytes,uint64)" - ) + eth_abi.encode( - ["address", "bytes", "uint64"], - [erc20_spl_mintable_new.account.address, bytes(my_ata), amount], - ) - - gas_limit = 3_000_000 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2_500_000_000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - tx = ScheduledTransaction( - nonce=nonce, - index=0, - target=erc20_spl_mintable_new.address, - call_data=call_data, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - gas_limit=gas_limit, - payer=neon_user.checksum_address, - sender=None, - ) - - tree_acc_data = CreateTreeAccMultipleData( - nonce=nonce, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - ) - - tree_acc_data.add_trx(tx, 0xFFFF, 0) - - evm_loader.create_tree_account_multiple( - neon_user, treasury_pool, tree_acc_data.data, wSOL["address_spl"], chain_id=web3_client_sol.chain_id - ) - web3_client_sol.send_scheduled_transaction(tx) - - resp = web3_client_sol.wait_for_transaction_receipt(tx.hash(), timeout=180) - assert resp["status"] == 1, resp - - def test_multiple_transactions_with_tree_actions_dependent_trx( - self, - web3_client_sol, - neon_user, - erc20_spl_mintable_new, - evm_loader, - treasury_pool, - sol_client, - ): - # ┌───────┐ ┌──────┐ - # │ t0 ✓ ├─>┤ t2 ✓ │ - # │ s=0 │ │ s=1 │ - # └───────┘ └──────┘ - # ┌───────┐ ┌──────┐ - # │ t1 ✓ ├─>┤ t3 ✓ │ - # │ s=0 │ │ s=1 │ - # └───────┘ └──────┘ - recipient = NeonUser(evm_loader.loader_id) # Recipient #1 - - erc20_spl_mintable_new.approve(erc20_spl_mintable_new.account, neon_user.checksum_address, 800) - - top_up_in_trx = 400 - amount_to_recipient = 400 - - data_0 = data_1 = abi.function_signature_to_4byte_selector( - "transferFrom(address,address,uint256)" - ) + eth_abi.encode( - ["address", "address", "uint256"], - [erc20_spl_mintable_new.account.address, neon_user.checksum_address, top_up_in_trx], - ) - - data_2 = data_3 = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, amount_to_recipient] - ) - - call_data: list = [data_0, data_1, data_2, data_3] - - # TODO Use estimate result method to count transaction fees. Waiting for developers to fix it. - - gas_limit = 3_000_000 - trx_count = 4 - base_fee_per_gas = web3_client_sol.base_fee_per_gas() - max_priority_fee_per_gas = 2_500_000_000 - max_fee_per_gas = base_fee_per_gas * 2 + max_priority_fee_per_gas - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - trxs = [] - for i in range(trx_count): - trxs.append( - ScheduledTransaction( - nonce=nonce, - index=i, - target=erc20_spl_mintable_new.address, - call_data=call_data[i], - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - gas_limit=gas_limit, - payer=neon_user.checksum_address, - sender=None, - ) - ) - - tree_acc_data = CreateTreeAccMultipleData( - nonce=nonce, - max_fee_per_gas=max_fee_per_gas, - max_priority_fee_per_gas=max_priority_fee_per_gas, - ) - - tree_acc_data.add_trx(trxs[0], 2, 0) - tree_acc_data.add_trx(trxs[1], 3, 0) - tree_acc_data.add_trx(trxs[2], 0xFFFF, 1) - tree_acc_data.add_trx(trxs[3], 0xFFFF, 1) - - evm_loader.create_tree_account_multiple( - neon_user, treasury_pool, tree_acc_data.data, wSOL["address_spl"], chain_id=web3_client_sol.chain_id - ) - web3_client_sol.send_all_scheduled_transactions(trxs) - - for trx in trxs: - assert ( - web3_client_sol.wait_for_transaction_receipt(trx.hash(), timeout=180)["status"] == 1 - ), f"transaction_{trx.index} failed" - - balance_user_1 = erc20_spl_mintable_new.get_balance(neon_user.checksum_address) - balance_user_2 = erc20_spl_mintable_new.get_balance(recipient.checksum_address) - - balance_user_1_pda = erc20_spl_mintable_new.contract.functions.balanceOfPDA(neon_user.checksum_address).call() - balance_user_1_ata = erc20_spl_mintable_new.contract.functions.balanceOfATA(neon_user.checksum_address).call() - balance_user_2_pda = erc20_spl_mintable_new.contract.functions.balanceOfPDA(recipient.checksum_address).call() - balance_user_2_ata = erc20_spl_mintable_new.contract.functions.balanceOfATA(recipient.checksum_address).call() - - assert balance_user_1 == balance_user_1_ata == balance_user_1_pda == 0 - assert balance_user_2_ata == 0 - assert balance_user_2 == balance_user_2_pda == 800 - - def test_multiple_transactions_with_tree_actions_independent( - self, web3_client_sol, neon_user, erc20_spl_mintable_new, evm_loader, treasury_pool - ): - - recipient = NeonUser(evm_loader.loader_id) - - amount_to_transfer = 1_000 - - my_pda = Pubkey(erc20_spl_mintable_new.contract.functions.solanaAccount(neon_user.checksum_address).call()) - token_mint = Pubkey(erc20_spl_mintable_new.contract.functions.tokenMint().call()) - my_ata = get_associated_token_address(neon_user.solana_account.pubkey(), token_mint) - nonce = web3_client_sol.get_nonce(neon_user.checksum_address) - - erc20_spl_mintable_new.pop_up_balance( - evm_loader, recipient=neon_user, pda_amount=amount_to_transfer, ata_amount=amount_to_transfer - ) - - assert ( - int(evm_loader.get_token_account_balance(my_ata, commitment=Confirmed).value.amount) == amount_to_transfer - ) - assert ( - int(evm_loader.get_token_account_balance(my_pda, commitment=Confirmed).value.amount) == amount_to_transfer - ) - - transfer_amount = 200 - burn_amount = 100 - approve_amount = 1000 - trx_count = 4 - - data_0 = abi.function_signature_to_4byte_selector("approve(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [neon_user.checksum_address, approve_amount] - ) - data_1 = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, transfer_amount] - ) - data_2 = abi.function_signature_to_4byte_selector("burn(uint256)") + eth_abi.encode(["uint256"], [burn_amount]) - data_3 = abi.function_signature_to_4byte_selector("transfer(address,uint256)") + eth_abi.encode( - ["address", "uint256"], [recipient.checksum_address, transfer_amount] - ) - call_data: list = [data_0, data_1, data_2, data_3] - - # TODO Use estimate result method to count transaction fees. Waiting for developers to fix it. - trx_estimate_obj_list: list[ScheduledTrxEstimateRequest] = [] - for i in range(trx_count): - trx_estimate_obj_list.append( - ScheduledTrxEstimateRequest(neon_user.checksum_address, erc20_spl_mintable_new.address, call_data[i]) - ) - estimate_result = web3_client_sol.estimate_scheduled(neon_user.solana_account.pubkey(), trx_estimate_obj_list) - - trxs = [] - for i in range(trx_count): - trxs.append(ScheduledTransaction.from_estimate_result(i, trx_estimate_obj_list[i], estimate_result)) - - tree_acc_data = CreateTreeAccMultipleData( - nonce=nonce, - max_fee_per_gas=estimate_result["maxFeePerGas"], - max_priority_fee_per_gas=estimate_result["maxPriorityFeePerGas"], - ) - tree_acc_data.add_trx(trxs[0], 0xFFFF, 0) - tree_acc_data.add_trx(trxs[1], 0xFFFF, 0) - tree_acc_data.add_trx(trxs[2], 0xFFFF, 0) - tree_acc_data.add_trx(trxs[3], 0xFFFF, 0) - - evm_loader.create_tree_account_multiple( - neon_user, treasury_pool, tree_acc_data.data, wSOL["address_spl"], chain_id=web3_client_sol.chain_id - ) - web3_client_sol.send_all_scheduled_transactions(trxs) - for trx in trxs: - assert ( - web3_client_sol.wait_for_transaction_receipt(trx.hash(), timeout=180)["status"] == 1 - ), f"transaction_{trx.index} failed" - - balance_pda = erc20_spl_mintable_new.contract.functions.balanceOfPDA(neon_user.checksum_address).call() - balance_ata = erc20_spl_mintable_new.contract.functions.balanceOfATA(neon_user.checksum_address).call() - - assert erc20_spl_mintable_new.get_balance(recipient.checksum_address) == transfer_amount * 2 - assert balance_pda == amount_to_transfer - transfer_amount * 2 - burn_amount - assert balance_ata == amount_to_transfer + assert receipt["status"] == 1, f"Trx {trx.hash().hex()} failed: receipt - {receipt}" diff --git a/utils/web3client.py b/utils/web3client.py index 40fd1f7c4..14b67496a 100644 --- a/utils/web3client.py +++ b/utils/web3client.py @@ -22,6 +22,8 @@ LOG = logging.getLogger(__name__) +BASE_MAX_PRIORITY_FEE = 2_500_000_000 + class Web3Client: def __init__( @@ -124,9 +126,8 @@ def base_fee_per_gas(self) -> int: base_fee = latest_block.baseFeePerGas # noqa return base_fee - def max_fee_per_gas(self) -> int: - max_priority_fee = self._web3.eth._max_priority_fee() # noqa - return (3 * self.base_fee_per_gas()) + max_priority_fee + def get_max_fee_per_gas(self, max_priority_fee_per_gas=BASE_MAX_PRIORITY_FEE) -> int: + return (2 * self.base_fee_per_gas()) + max_priority_fee_per_gas @allure.step("Get max priority fee per gas") def max_priority_fee_per_gas(self) -> int: