def write_access_list(w: HashWriter, access_list: list[EthereumAccessList]) -> None: payload_length = sum(access_list_item_length(i) for i in access_list) rlp.write_header(w, payload_length, rlp.LIST_HEADER_BYTE) for item in access_list: address_bytes = bytes_from_address(item.address) address_length = rlp.length(address_bytes) keys_length = rlp.length(item.storage_keys) rlp.write_header(w, address_length + keys_length, rlp.LIST_HEADER_BYTE) rlp.write(w, address_bytes) rlp.write(w, item.storage_keys)
def get_total_length(msg: EthereumSignTx, data_total: int) -> int: length = 0 if msg.tx_type is not None: length += rlp.length(msg.tx_type) fields: tuple[rlp.RLPItem, ...] = ( msg.nonce, msg.gas_price, msg.gas_limit, bytes_from_address(msg.to), msg.value, msg.chain_id, 0, 0, ) for field in fields: length += rlp.length(field) length += rlp.header_length(data_total, msg.data_initial_chunk) length += data_total return length
def get_total_length(msg: EthereumSignTxEIP1559, data_total: int) -> int: length = 0 fields: tuple[rlp.RLPItem, ...] = ( msg.nonce, msg.gas_limit, bytes_from_address(msg.to), msg.value, msg.chain_id, msg.max_gas_fee, msg.max_priority_fee, ) for field in fields: length += rlp.length(field) length += rlp.header_length(data_total, msg.data_initial_chunk) length += data_total length += access_list_length(msg.access_list) return length
def access_list_item_length(item: EthereumAccessList) -> int: address_length = rlp.length(bytes_from_address(item.address)) keys_length = rlp.length(item.storage_keys) return (rlp.header_length(address_length + keys_length) + address_length + keys_length)
def test_rlp_length(self): for i, o in self.vectors: length = rlp.length(i) self.assertEqual(length, len(o) // 2)