Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
163e0b8
Problem: evm mempool is not tested
mmsqe Aug 21, 2025
3003b8c
crosscheck
mmsqe Aug 22, 2025
fd7fb5f
point to align reject
mmsqe Aug 22, 2025
7c1aa7a
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Aug 24, 2025
cc913f2
test_move_precompile_to
mmsqe Aug 25, 2025
1332553
align token_pairs query
mmsqe Aug 25, 2025
f4dee7c
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Aug 26, 2025
53bd60d
unhappy case
mmsqe Aug 26, 2025
9d0d2c0
Problem: multi transfer is not crosschecked
mmsqe Aug 29, 2025
6b06413
add buffer
mmsqe Aug 29, 2025
c68c78f
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 1, 2025
45351e9
bump deps
mmsqe Sep 1, 2025
92c8d7f
bankv2
mmsqe Sep 1, 2025
9fc2bf6
fix test
mmsqe Sep 1, 2025
6aedaba
Merge branch 'release/v5' into mempool
mmsqe Sep 2, 2025
5d868a6
Merge remote-tracking branch 'origin/multi_transfer' into mempool
mmsqe Sep 2, 2025
c3087b4
log geth instead
mmsqe Sep 2, 2025
b4e798b
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 3, 2025
bb8e288
bump deps
mmsqe Sep 3, 2025
7814715
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 3, 2025
c7aab84
cleanup
mmsqe Sep 3, 2025
77d2172
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 3, 2025
d949b6f
wait longer
mmsqe Sep 4, 2025
25bc610
test ts
mmsqe Sep 3, 2025
96d9a3f
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 5, 2025
fbbbfab
test stm
mmsqe Sep 5, 2025
ece9fa5
Problem: max_gas_wanted is not tested
mmsqe Sep 10, 2025
6a692a3
separate test
mmsqe Sep 10, 2025
99009f4
fix max_gas_wanted
mmsqe Sep 10, 2025
7a9f263
Merge branch 'gas_wanted' into mempool
mmsqe Sep 10, 2025
b97b1b3
fix max_gas_wanted
mmsqe Sep 11, 2025
ff888a2
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 12, 2025
ee8e93e
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 16, 2025
c6db53f
Merge remote-tracking branch 'origin/release/v5' into mempool
mmsqe Sep 20, 2025
49f910e
perf: avoid duplicated feemarket params load
mmsqe Sep 20, 2025
0256346
fix: source flag for key add
mmsqe Sep 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/tests-e2e-nix.yml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,13 @@ jobs:
os: [macos-latest]
runs-on: ${{ matrix.os }}
steps:
- name: Remove existing Nix build users (macOS fix)
run: |
for i in $(seq 1 32); do
if dscl . -read /Users/_nixbld$i &>/dev/null; then
sudo dscl . -delete /Users/_nixbld$i
fi
done
- uses: actions/checkout@v3
with:
fetch-depth: 0
Expand Down
1 change: 1 addition & 0 deletions integration_tests/configs/ERC20.bin
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
60a06040523461022357610ee28038038061001981610227565b9283398101906040818303126102235780516001600160401b0381116102235781019082601f830112156102235781516001600160401b03811161020f5761006a601f8201601f1916602001610227565b9381855260208285010111610223576020815f92828096018388015e8501015201516001600160a01b03811681036102235781516001600160401b03811161020f575f54600181811c91168015610205575b60208210146101f157601f811161018f575b50602092601f821160011461013057928192935f92610125575b50508160011b915f199060031b1c1916175f555b608052604051610c95908161024d8239608051818181610198015281816106680152610a940152f35b015190505f806100e8565b601f198216935f8052805f20915f5b868110610177575083600195961061015f575b505050811b015f556100fc565b01515f1960f88460031b161c191690555f8080610152565b9192602060018192868501518155019401920161013f565b5f80527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563601f830160051c810191602084106101e7575b601f0160051c01905b8181106101dc57506100ce565b5f81556001016101cf565b90915081906101c6565b634e487b7160e01b5f52602260045260245ffd5b90607f16906100bc565b634e487b7160e01b5f52604160045260245ffd5b5f80fd5b6040519190601f01601f191682016001600160401b0381118382101761020f5760405256fe60806040526004361015610011575f80fd5b5f3560e01c806306fdde03146100c4578063095ea7b3146100bf57806318160ddd146100ba57806323b872dd146100b5578063313ce567146100b057806370a08231146100ab57806376cdb03b146100a657806395d89b41146100a1578063a9059cbb1461009c578063c370b042146100975763dd62ed3e14610092575f80fd5b61090a565b6108d1565b610704565b61068c565b61061e565b610560565b6104d9565b6103bd565b61033a565b610216565b610112565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f602080809581815201938051918291828752018686015e5f8582860101520116010190565b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc576101c86101bc61016a6101966101546107c6565b6040519283915f6020840152602183019061099b565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610780565b7f0000000000000000000000000000000000000000000000000000000000000000610b83565b604051918291826100c9565b0390f35b5f80fd5b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101cc57565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101cc57565b346101cc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc5761024d6101d0565b602435331561030e5773ffffffffffffffffffffffffffffffffffffffff82169182156102e2576102a88291335f52600160205260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b5560405190815233907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590602090a3602060405160018152f35b7f94280d62000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7fe602df05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc5760206103b061016a61019661037b6107c6565b6040519283917f030000000000000000000000000000000000000000000000000000000000000087840152602183019061099b565b0151604051908152602090f35b346101cc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc576103f46101d0565b6103fc6101f3565b6044359073ffffffffffffffffffffffffffffffffffffffff83165f5260016020526104493360405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8410610489575b61047d93506109ad565b60405160018152602090f35b8284106104a5576104a08361047d95033383610bdb565b610473565b82847ffb8f41b2000000000000000000000000000000000000000000000000000000005f523360045260245260445260645ffd5b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc57602061054f61016a61019661051a6107c6565b6040519283917f020000000000000000000000000000000000000000000000000000000000000087840152602183019061099b565b01516040515f9190911a8152602090f35b346101cc5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc576101c8602061060c7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000006101966105c36101d0565b61016a6105ce6107c6565b6040519485937f04000000000000000000000000000000000000000000000000000000000000008986015260601b166021840152603583019061099b565b01516040519081529081906020820190565b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc57602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc576101c86101bc61016a6101966106ce6107c6565b6040519283917f01000000000000000000000000000000000000000000000000000000000000006020840152602183019061099b565b346101cc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc5761074861073e6101d0565b60243590336109ad565b602060405160018152f35b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176107c157604052565b610753565b604051905f5f548060011c916001821680156108c7575b60208410811461089a57838652859260208401919081156108635750600114610810575b5061080e92500383610780565b565b5f80805291507f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b84831061084c575061080e9350015f610801565b805482840152869350602090920191600101610838565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682525061080e93151560051b0190505f610801565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b92607f16926107dd565b346101cc575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc576101c86101bc6107c6565b346101cc5760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101cc5760206109926109466101d0565b73ffffffffffffffffffffffffffffffffffffffff6109636101f3565b91165f526001835260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b54604051908152f35b805191908290602001825e015f815290565b9073ffffffffffffffffffffffffffffffffffffffff8216918215610afa5773ffffffffffffffffffffffffffffffffffffffff8216938415610ace57610ab87fffffffffffffffffffffffffffffffffffffffff000000000000000000000000610a92610ac99461016a7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9784610a436107c6565b916040519687957f0500000000000000000000000000000000000000000000000000000000000000602088015260601b16602186015260601b166035840152866049840152606983019061099b565b7f0000000000000000000000000000000000000000000000000000000000000000610c49565b506040519081529081906020820190565b0390a3565b7fec442f05000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b7f96c6fd1e000000000000000000000000000000000000000000000000000000005f525f60045260245ffd5b3d15610b7e573d9067ffffffffffffffff82116107c15760405191610b7360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610780565b82523d5f602084013e565b606090565b5f918291602082519201905afa610b98610b26565b9015610ba15790565b610bd7906040519182917f0bcb658c000000000000000000000000000000000000000000000000000000008352600483016100c9565b0390fd5b73ffffffffffffffffffffffffffffffffffffffff1690811561030e5773ffffffffffffffffffffffffffffffffffffffff8116156102e257610c46915f52600160205260405f209073ffffffffffffffffffffffffffffffffffffffff165f5260205260405f2090565b55565b5f91829182602083519301915af1610b98610b2656fea26469706673582212206c349a091a8d116c46a490fccb327923675dd9203b2a952fe99cdb4b058beab664736f6c634300081e0033
6 changes: 1 addition & 5 deletions integration_tests/configs/chains.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,7 @@
evm_denom: 'uom',
cmd: 'mantrachaind',
evm_chain_id: 7888,
evm: {
params: {
allow_unprotected_txs: true,
},
},
evm: {},
feemarket: {
params: {
base_fee: '0.010000000000000000',
Expand Down
3 changes: 2 additions & 1 deletion integration_tests/configs/default.jsonnet
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ local chain = (import 'chains.jsonnet')[std.extVar('CHAIN_CONFIG')];
'app-config': {
evm: {
'evm-chain-id': chain.evm_chain_id,
'block-executor': 'block-stm',
},
grpc: {
'skip-check-header': true,
Expand All @@ -24,7 +25,7 @@ local chain = (import 'chains.jsonnet')[std.extVar('CHAIN_CONFIG')];
enable: true,
address: '127.0.0.1:{EVMRPC_PORT}',
'ws-address': '127.0.0.1:{EVMRPC_PORT_WS}',
api: 'eth,net,web3,debug',
api: 'eth,net,web3,debug,txpool',
'feehistory-cap': 100,
'block-range-cap': 10000,
'logs-cap': 10000,
Expand Down
19 changes: 9 additions & 10 deletions integration_tests/cosmoscli.py
Original file line number Diff line number Diff line change
Expand Up @@ -219,26 +219,25 @@ def sign_tx_json(self, tx, signer, max_priority_price=None, **kwargs):
fp.flush()
return self.sign_tx(fp.name, signer, **kwargs)

def create_account(self, name, mnemonic=None, coin_type=60, **kwargs):
def create_account(self, name, mnemonic=None, **kwargs):
"create new keypair in node's keyring"
if coin_type == 60:
kwargs["key_type"] = "eth_secp256k1"
if kwargs.get("coin_type", 60) == 60:
kwargs.update({"coin_type": 60, "key_type": "eth_secp256k1"})
default_kwargs = self.get_kwargs()
args = {**default_kwargs, **kwargs}
if mnemonic is None:
output = self.raw(
"keys",
"add",
name,
**(default_kwargs | kwargs),
)
if kwargs.get("source"):
output = self.raw("keys", "add", name, "--recover", **args)
else:
output = self.raw("keys", "add", name, **args)
else:
output = self.raw(
"keys",
"add",
name,
"--recover",
stdin=mnemonic.encode() + b"\n",
**(default_kwargs | kwargs),
**args,
)
return json.loads(output)

Expand Down
72 changes: 34 additions & 38 deletions integration_tests/test_basic.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import pytest
import web3
from eth_account import Account
from eth_bloom import BloomFilter
from eth_contract.erc20 import ERC20
from eth_contract.utils import send_transaction as send_transaction_async
Expand All @@ -20,6 +21,7 @@
address_to_bytes32,
assert_balance,
assert_transfer,
bech32_to_eth,
build_batch_tx,
build_contract,
contract_address,
Expand Down Expand Up @@ -166,47 +168,32 @@ def test_connect_transaction(connect_mantra):
def test_transaction(mantra, connect_mantra, diff=1):
w3 = connect_mantra.w3
gas_price = w3.eth.gas_price
gas = 21000
sender = ADDRS["community"]
receiver = ADDRS["signer1"]

# send transaction
txhash_1 = send_transaction(
w3,
{"to": receiver, "value": 10000, "gasPrice": gas_price},
)["transactionHash"]
data = {"to": ADDRS["community"], "value": 10000, "gasPrice": gas_price, "gas": gas}
txhash_1 = send_transaction(w3, data)["transactionHash"]
tx1 = w3.eth.get_transaction(txhash_1)
assert tx1["transactionIndex"] == 0

initial_block_number = w3.eth.get_block_number()
with pytest.raises(web3.exceptions.Web3RPCError, match="tx already in mempool"):
data["nonce"] = w3.eth.get_transaction_count(sender) - 1
send_transaction(w3, data)

# tx already in mempool
with pytest.raises(web3.exceptions.Web3RPCError) as exc:
send_transaction(
w3,
{
"to": receiver,
"value": 10000,
"gasPrice": gas_price,
"nonce": w3.eth.get_transaction_count(sender) - 1,
},
)
assert "tx already in mempool" in str(exc)
data["nonce"] = w3.eth.get_transaction_count(sender) + 1
txhash = send_transaction(w3, data, check=False)

# invalid sequence
with pytest.raises(web3.exceptions.Web3RPCError) as exc:
send_transaction(
w3,
{
"to": receiver,
"value": 10000,
"gasPrice": w3.eth.gas_price,
"nonce": w3.eth.get_transaction_count(sender) + 1,
},
)
assert "invalid sequence" in str(exc)
data["nonce"] = w3.eth.get_transaction_count(sender)
receipt = send_transaction(w3, data)
assert receipt["status"] == 1

# out of gas
with pytest.raises(web3.exceptions.Web3RPCError) as exc:
# tx queued due to nonce gap should be success now
receipt = w3.eth.wait_for_transaction_receipt(txhash)
assert receipt["status"] == 1

with pytest.raises(web3.exceptions.Web3RPCError, match="intrinsic gas too low"):
send_transaction(
w3,
{
Expand All @@ -216,22 +203,17 @@ def test_transaction(mantra, connect_mantra, diff=1):
"gas": 1,
},
)["transactionHash"]
assert "intrinsic gas too low" in str(exc)

# insufficient fee
with pytest.raises(web3.exceptions.Web3RPCError) as exc:
with pytest.raises(web3.exceptions.Web3RPCError, match="insufficient fee"):
send_transaction(
w3,
{
"to": receiver,
"value": 10000,
"gas": gas,
"gasPrice": 1,
},
)["transactionHash"]
assert "insufficient fee" in str(exc)

# check all failed transactions are not included in blockchain
assert w3.eth.get_block_number() - initial_block_number <= diff

# Deploy multiple contracts
contracts = {
Expand Down Expand Up @@ -592,3 +574,17 @@ def test_textual(mantra, connect_mantra, tmp_path):
sign_mode="textual",
)
assert rsp["code"] == 0, rsp["raw_log"]


@pytest.mark.connect
def test_connect_key_source(connect_mantra, tmp_path):
test_key_src(None, connect_mantra, tmp_path)


def test_key_src(mantra, connect_mantra, tmp_path):
cli = connect_mantra.cosmos_cli(tmp_path)
acct, mnemonic = Account.create_with_mnemonic(num_words=24)
src = tmp_path / "mnemonic.txt"
src.write_text(mnemonic)
addr = cli.create_account("user", source=src)["address"]
assert bech32_to_eth(addr) == acct.address
2 changes: 0 additions & 2 deletions integration_tests/test_call.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
from .utils import Greeter, build_and_deploy_contract_async


@pytest.mark.skip(reason="skipping temporary_contract_code test")
def test_temporary_contract_code(mantra):
state = 100
w3: Web3 = mantra.w3
Expand Down Expand Up @@ -34,7 +33,6 @@ def test_temporary_contract_code(mantra):
assert (state,) == w3.codec.decode(("uint256",), result)


@pytest.mark.skip(reason="skipping override_state test")
def test_override_state(mantra):
w3: Web3 = mantra.w3
greeter = Greeter("Greeter")
Expand Down
33 changes: 30 additions & 3 deletions integration_tests/test_contract.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import asyncio
import json
import time
from pathlib import Path

import pytest
Expand Down Expand Up @@ -48,6 +49,7 @@
build_and_deploy_contract_async,
build_contract,
build_deploy_contract_async,
derive_new_account,
w3_wait_for_new_blocks_async,
)

Expand Down Expand Up @@ -315,14 +317,12 @@ async def test_4337(mantra, connect_mantra):
)


# TODO: rm flaky and enlarge num after evm mempool is ready
@pytest.mark.flaky(max_runs=5)
async def test_deploy_multi(mantra):
w3 = mantra.async_w3
name = "community"
key = KEYS[name]
owner = ADDRS[name]
num = 2
num = 10
res = build_contract("ERC20MinterBurnerDecimals")
args_list = [(w3, res, (f"MyToken{i}", f"MTK{i}", 18), key) for i in range(num)]
tx_results = await asyncio.gather(
Expand All @@ -344,6 +344,33 @@ async def test_deploy_multi(mantra):
assert await ERC20.fns.balanceOf(owner).call(w3, to=token) == total


async def test_transfer_multi(geth):
w3 = geth.async_w3
contract = await build_and_deploy_contract_async(
w3, "TestERC20A", key=KEYS["validator"]
)
token = contract.address
owner = ACCOUNTS["validator"]
transfer_amt = 1
base_gas_price = await w3.eth.gas_price
nonce_start = await w3.eth.get_transaction_count(owner.address)
tasks = []

receivers = [derive_new_account(4 + i).address for i in range(8)]
begin = time.time()
for i in range(10000):
receiver = receivers[i % 8]
nonce = nonce_start + i
gas_price = base_gas_price
tasks.append(
ERC20.fns.transfer(receiver, transfer_amt).transact(
w3, owner, to=token, nonce=nonce, gasPrice=gas_price
)
)
await asyncio.gather(*tasks)
print("total time", time.time() - begin)


async def test_upgrade(mantra):
w3 = mantra.async_w3
owner = ADDRS["community"]
Expand Down
12 changes: 10 additions & 2 deletions integration_tests/test_debug_traceblock.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import pytest
import requests
import web3
from pystarport import ports

from .utils import (
Expand Down Expand Up @@ -34,8 +36,14 @@ def test_traceblock(mantra):
"nonce": nonce + n,
}
signed = sign_transaction(w3, tx, acc.key)
txhash = w3.eth.send_raw_transaction(signed.raw_transaction)
txhashes.append(txhash)
if n == total - 1:
with pytest.raises(
web3.exceptions.Web3RPCError, match="insufficient funds"
):
w3.eth.send_raw_transaction(signed.raw_transaction)
else:
txhash = w3.eth.send_raw_transaction(signed.raw_transaction)
txhashes.append(txhash)
for txhash in txhashes[0 : total - 1]:
res = w3.eth.wait_for_transaction_receipt(txhash)
assert res.status == 1
Expand Down
2 changes: 2 additions & 0 deletions integration_tests/test_eip1559.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ async def test_dynamic_fee_tx(mantra, connect_mantra, update_params=True):
before = await w3.eth.get_balance(ADDRS["community"])
tip_price = 10000000000
max_price = 1000000000000 + tip_price
begin = await w3.eth.block_number
await w3_wait_for_block_async(w3, begin + 1)
tx = {
"to": "0x0000000000000000000000000000000000000000",
"value": amount,
Expand Down
13 changes: 8 additions & 5 deletions integration_tests/test_eip7702.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,14 @@ async def test_eoa(cluster):
data = {"to": sender, "value": 10000, "gasPrice": gas_price, "gas": gas}
data["nonce"] = cluster.w3.eth.get_transaction_count(sender) + 1

hash = send_transaction_sync(cluster.w3, data, key=key, check=False)

if isinstance(cluster, Geth):
send_transaction_sync(cluster.w3, data, key=key, check=False)
with pytest.raises(web3.exceptions.TransactionNotFound):
await cluster.w3.eth.get_transaction_receipt(hash)
else:
with pytest.raises(web3.exceptions.Web3RPCError, match="invalid sequence"):
send_transaction_sync(cluster.w3, data, key=key, check=False)
with pytest.raises(web3.exceptions.RequestTimedOut):
await cluster.w3.eth.get_transaction_receipt(hash)

# clear code
clear_tx = dict(tx)
Expand All @@ -83,5 +86,5 @@ async def test_eoa(cluster):
assert reset_code.hex().startswith(""), "Code was not clear!"

# TODO: https://github.com/cosmos/evm/issues/493
# data = {"to": sender, "value": 10000, "gasPrice": gas_price, "gas": gas}
# send_transaction_sync(cluster.w3, data, key=key)["transactionHash"]
data = {"to": sender, "value": 10000, "gasPrice": gas_price, "gas": gas}
send_transaction_sync(cluster.w3, data, key=key)["transactionHash"]
Loading
Loading