ethereum.tangerine_whistle.utils.message

Hardfork Utility Functions For The Message Data-structure ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

.. contents:: Table of Contents :backlinks: none :local:

Introduction

Message specific functions used in this tangerine whistle version of specification.

 1"""
 2Hardfork Utility Functions For The Message Data-structure
 3^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 4
 5.. contents:: Table of Contents
 6    :backlinks: none
 7    :local:
 8
 9Introduction
10------------
11
12Message specific functions used in this tangerine whistle version of
13specification.
14"""
15from typing import Optional, Union
16
17from ethereum.base_types import U256, Bytes, Bytes0, Uint
18
19from ..fork_types import Address
20from ..state import get_account
21from ..vm import Environment, Message
22from .address import compute_contract_address
23
24
25def prepare_message(
26    caller: Address,
27    target: Union[Bytes0, Address],
28    value: U256,
29    data: Bytes,
30    gas: Uint,
31    env: Environment,
32    code_address: Optional[Address] = None,
33    should_transfer_value: bool = True,
34) -> Message:
35    """
36    Execute a transaction against the provided environment.
37
38    Parameters
39    ----------
40    caller :
41        Address which initiated the transaction
42    target :
43        Address whose code will be executed
44    value :
45        Value to be transferred.
46    data :
47        Array of bytes provided to the code in `target`.
48    gas :
49        Gas provided for the code in `target`.
50    env :
51        Environment for the Ethereum Virtual Machine.
52    code_address :
53        This is usually same as the `target` address except when an alternative
54        accounts code needs to be executed.
55        eg. `CALLCODE` calling a precompile.
56    should_transfer_value :
57        if True ETH should be transferred while executing a message call.
58
59    Returns
60    -------
61    message: `ethereum.tangerine_whistle.vm.Message`
62        Items containing contract creation or message call specific data.
63    """
64    if isinstance(target, Bytes0):
65        current_target = compute_contract_address(
66            caller,
67            get_account(env.state, caller).nonce - U256(1),
68        )
69        msg_data = Bytes(b"")
70        code = data
71    elif isinstance(target, Address):
72        current_target = target
73        msg_data = data
74        code = get_account(env.state, target).code
75        if code_address is None:
76            code_address = target
77    else:
78        raise AssertionError("Target must be address or empty bytes")
79
80    return Message(
81        caller=caller,
82        target=target,
83        gas=gas,
84        value=value,
85        data=msg_data,
86        code=code,
87        depth=Uint(0),
88        current_target=current_target,
89        code_address=code_address,
90        should_transfer_value=should_transfer_value,
91        parent_evm=None,
92    )
def prepare_message( caller: ethereum.base_types.Bytes20, target: Union[ethereum.base_types.Bytes0, ethereum.base_types.Bytes20], value: ethereum.base_types.U256, data: bytes, gas: ethereum.base_types.Uint, env: ethereum.tangerine_whistle.vm.Environment, code_address: Optional[ethereum.base_types.Bytes20] = None, should_transfer_value: bool = True) -> ethereum.tangerine_whistle.vm.Message:
26def prepare_message(
27    caller: Address,
28    target: Union[Bytes0, Address],
29    value: U256,
30    data: Bytes,
31    gas: Uint,
32    env: Environment,
33    code_address: Optional[Address] = None,
34    should_transfer_value: bool = True,
35) -> Message:
36    """
37    Execute a transaction against the provided environment.
38
39    Parameters
40    ----------
41    caller :
42        Address which initiated the transaction
43    target :
44        Address whose code will be executed
45    value :
46        Value to be transferred.
47    data :
48        Array of bytes provided to the code in `target`.
49    gas :
50        Gas provided for the code in `target`.
51    env :
52        Environment for the Ethereum Virtual Machine.
53    code_address :
54        This is usually same as the `target` address except when an alternative
55        accounts code needs to be executed.
56        eg. `CALLCODE` calling a precompile.
57    should_transfer_value :
58        if True ETH should be transferred while executing a message call.
59
60    Returns
61    -------
62    message: `ethereum.tangerine_whistle.vm.Message`
63        Items containing contract creation or message call specific data.
64    """
65    if isinstance(target, Bytes0):
66        current_target = compute_contract_address(
67            caller,
68            get_account(env.state, caller).nonce - U256(1),
69        )
70        msg_data = Bytes(b"")
71        code = data
72    elif isinstance(target, Address):
73        current_target = target
74        msg_data = data
75        code = get_account(env.state, target).code
76        if code_address is None:
77            code_address = target
78    else:
79        raise AssertionError("Target must be address or empty bytes")
80
81    return Message(
82        caller=caller,
83        target=target,
84        gas=gas,
85        value=value,
86        data=msg_data,
87        code=code,
88        depth=Uint(0),
89        current_target=current_target,
90        code_address=code_address,
91        should_transfer_value=should_transfer_value,
92        parent_evm=None,
93    )

Execute a transaction against the provided environment.

Parameters

caller : Address which initiated the transaction target : Address whose code will be executed value : Value to be transferred. data : Array of bytes provided to the code in target. gas : Gas provided for the code in target. env : Environment for the Ethereum Virtual Machine. code_address : This is usually same as the target address except when an alternative accounts code needs to be executed. eg. CALLCODE calling a precompile. should_transfer_value : if True ETH should be transferred while executing a message call.

Returns

message: ethereum.tangerine_whistle.vm.Message Items containing contract creation or message call specific data.