moonworm/centipede/tests/test_tester_provider.py

185 wiersze
6.3 KiB
Python

import os
from typing import Tuple
import unittest
from eth_typing.evm import ChecksumAddress
from web3 import Web3, EthereumTesterProvider
from ens import ENS
from centipede.manage import deploy_ERC1155
from ..web3_util import (
build_transaction,
decode_transaction_input,
get_nonce,
submit_signed_raw_transaction,
submit_transaction,
wait_for_transaction_receipt,
)
PK = "0x58d23b55bc9cdce1f18c2500f40ff4ab7245df9a89505e9b1fa4851f623d241d"
PK_ADDRESS = "0xdc544d1aa88ff8bbd2f2aec754b1f1e99e1812fd"
def get_web3_test_provider() -> Web3:
return Web3(EthereumTesterProvider())
def airdrop_ether(web3: Web3, to_address: ChecksumAddress):
tx_hash = web3.eth.send_transaction(
{
"from": web3.eth.accounts[0],
"to": to_address,
"value": 100000000,
}
)
web3.eth.wait_for_transaction_receipt(tx_hash)
class CentipedeEthTesterTestCase(unittest.TestCase):
def setUp(self) -> None:
self.basedir = os.path.dirname(os.path.dirname(__file__))
self.web3 = get_web3_test_provider()
self.tester_address = Web3.toChecksumAddress(PK_ADDRESS)
self.tester_address_pk = PK
airdrop_ether(self.web3, self.tester_address)
def check_eth_send(
self,
sender_previous_balance,
receiver_previous_balance,
sender_current_balance,
receiver_current_balance,
send_value,
tx_receipt,
):
assert receiver_current_balance == receiver_previous_balance + send_value
assert (
sender_current_balance
== sender_previous_balance - send_value - tx_receipt["gasUsed"]
)
def test_submit_transaction(self) -> None:
sender = Web3.toChecksumAddress(PK_ADDRESS)
self.web3.eth.send_transaction
receiver = Web3.toChecksumAddress(self.web3.eth.accounts[1])
sender_previous_balance = self.web3.eth.get_balance(sender)
receiver_previous_balance = self.web3.eth.get_balance(receiver)
send_value = 10
transaction = {
"from": sender,
"to": receiver,
"value": send_value,
"nonce": get_nonce(self.web3, sender),
"gasPrice": 1,
}
transaction["gas"] = self.web3.eth.estimate_gas(transaction)
tx_hash = submit_transaction(
self.web3,
transaction,
PK,
)
tx_receipt = wait_for_transaction_receipt(self.web3, tx_hash)
sender_current_balance = self.web3.eth.get_balance(sender)
receiver_current_balance = self.web3.eth.get_balance(receiver)
self.check_eth_send(
sender_previous_balance,
receiver_previous_balance,
sender_current_balance,
receiver_current_balance,
send_value,
tx_receipt,
)
def test_submit_signed_transaction(self) -> None:
sender = Web3.toChecksumAddress(PK_ADDRESS)
self.web3.eth.send_transaction
receiver = Web3.toChecksumAddress(self.web3.eth.accounts[1])
sender_previous_balance = self.web3.eth.get_balance(sender)
receiver_previous_balance = self.web3.eth.get_balance(receiver)
send_value = 10
transaction = {
"from": sender,
"to": receiver,
"value": send_value,
"nonce": get_nonce(self.web3, sender),
"gasPrice": 1,
}
transaction["gas"] = self.web3.eth.estimate_gas(transaction)
signed_transaction = self.web3.eth.account.sign_transaction(
transaction, private_key=PK
)
tx_hash = submit_signed_raw_transaction(
self.web3, signed_transaction.rawTransaction
)
tx_receipt = wait_for_transaction_receipt(self.web3, tx_hash)
sender_current_balance = self.web3.eth.get_balance(sender)
receiver_current_balance = self.web3.eth.get_balance(receiver)
self.check_eth_send(
sender_previous_balance,
receiver_previous_balance,
sender_current_balance,
receiver_current_balance,
send_value,
tx_receipt,
)
def test_deploy_erc1155(self):
TOKEN_NAME = "CENTIPEDE-TEST"
TOKEN_SYMBOL = "CNTPD"
TOKEN_URI = "moonstream.to/centipede/"
_, contract_address = deploy_ERC1155(
self.web3,
TOKEN_NAME,
TOKEN_SYMBOL,
TOKEN_URI,
self.tester_address,
self.tester_address,
self.tester_address_pk,
)
base_dir = self.basedir
contract_abi_path = os.path.join(base_dir, "fixture/abis/CentipedeERC1155.json")
with open(contract_abi_path, "r") as ifp:
contract_abi = ifp.read()
contract = self.web3.eth.contract(contract_address, abi=contract_abi)
assert (
contract.functions["name"]().call() == TOKEN_NAME
), "Token name in blockchain != set token name while deploying"
assert (
contract.functions["symbol"]().call() == TOKEN_SYMBOL
), "Token name in blockchain != set token symbol while deploying"
transaction = build_transaction(
self.web3, contract.functions["create"]("1", b""), self.tester_address
)
tx_hash = submit_transaction(self.web3, transaction, self.tester_address_pk)
wait_for_transaction_receipt(self.web3, tx_hash)
assert (
contract.functions["uri"](1).call() == TOKEN_URI + "1"
), "Token with id 1 is not created or has different uri from that is expected"
def test_decode_tx_input(self):
base_dir = self.basedir
contract_abi_path = os.path.join(base_dir, "fixture/abis/CentipedeERC1155.json")
with open(contract_abi_path, "r") as ifp:
contract_abi = ifp.read()
tx_input = "0xf242432a0000000000000000000000004f9a8e7dddee5f9737bafad382fa3bb119fc80c4000000000000000000000000c2485a4a8fbabbb7c39fe7b459816f2f16c238840000000000000000000000000000000000000000000000000000000000000378000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000"
decode_transaction_input(self.web3, tx_input, contract_abi)
if __name__ == "__main__":
unittest.main()