Repository: ethereum/web3.py

Issue:
Fix logger for AsyncHTTPProvider
AsyncHTTPProvider is getting the logger for `web3.providers.HTTPProvider` but should instead use `web3.providers.AsyncHTTPProvider`

Discussion:

Patch:
diff --git a/docs/middleware.rst b/docs/middleware.rst
index 430f960e..3cfcb7bb 100644
--- a/docs/middleware.rst
+++ b/docs/middleware.rst
@@ -537,6 +537,7 @@ Signing
 ~~~~~~~
 
 .. py:method:: web3.middleware.construct_sign_and_send_raw_middleware(private_key_or_account)
+               web3.middleware.async_construct_sign_and_send_raw_middleware(private_key_or_account)
 
 This middleware automatically captures transactions, signs them, and sends them as raw transactions.
 The ``from`` field on the transaction, or ``w3.eth.default_account`` must be set to the address of the private key for
@@ -573,6 +574,27 @@ this middleware to have any effect.
     >>> w3.middleware_onion.add(construct_sign_and_send_raw_middleware(acct))
     >>> w3.eth.default_account = acct.address
 
+    >>> # use `eth_sendTransaction` to automatically sign and send the raw transaction
+    >>> w3.eth.send_transaction(tx_dict)
+    HexBytes('0x09511acf75918fd03de58141d2fd409af4fd6d3dce48eb3aa1656c8f3c2c5c21')
+
+Similarly, with AsyncWeb3:
+
+.. code-block:: python
+
+    >>> from web3 import AsyncWeb3
+    >>> async_w3 = AsyncWeb3(AsyncHTTPProvider('HTTP_ENDPOINT'))
+    >>> from web3.middleware import async_construct_sign_and_send_raw_middleware
+    >>> from eth_account import Account
+    >>> import os
+    >>> acct = async_w3.eth.account.from_key(os.environ.get('PRIVATE_KEY'))
+    >>> async_w3.middleware_onion.add(await async_construct_sign_and_send_raw_middleware(acct))
+    >>> async_w3.eth.default_account = acct.address
+
+    >>> # use `eth_sendTransaction` to automatically sign and send the raw transaction
+    >>> await async_w3.eth.send_transaction(tx_dict)
+    HexBytes('0x09511acf75918fd03de58141d2fd409af4fd6d3dce48eb3aa1656c8f3c2c5c21')
+
 Now you can send a transaction from acct.address without having to build and sign each raw transaction.
 
 When making use of this signing middleware, when sending dynamic fee transactions (recommended over legacy transactions),
diff --git a/ens/abis.py b/ens/abis.py
index d994209c..cd6c71c7 100644
--- a/ens/abis.py
+++ b/ens/abis.py
@@ -518,52 +518,342 @@ FIFS_REGISTRAR = [
     },
 ]
 
-RESOLVER = [
+PUBLIC_RESOLVER_2 = [
+    {
+        "inputs": [{"internalType": "contract ENS", "name": "_ens", "type": "address"}],
+        "payable": False,
+        "stateMutability": "nonpayable",
+        "type": "constructor",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": True,
+                "internalType": "uint256",
+                "name": "contentType",
+                "type": "uint256",
+            },
+        ],
+        "name": "ABIChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "address",
+                "name": "a",
+                "type": "address",
+            },
+        ],
+        "name": "AddrChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "uint256",
+                "name": "coinType",
+                "type": "uint256",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes",
+                "name": "newAddress",
+                "type": "bytes",
+            },
+        ],
+        "name": "AddressChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": True,
+                "internalType": "address",
+                "name": "owner",
+                "type": "address",
+            },
+            {
+                "indexed": True,
+                "internalType": "address",
+                "name": "target",
+                "type": "address",
+            },
+            {
+                "indexed": False,
+                "internalType": "bool",
+                "name": "isAuthorised",
+                "type": "bool",
+            },
+        ],
+        "name": "AuthorisationChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes",
+                "name": "hash",
+                "type": "bytes",
+            },
+        ],
+        "name": "ContenthashChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes",
+                "name": "name",
+                "type": "bytes",
+            },
+            {
+                "indexed": False,
+                "internalType": "uint16",
+                "name": "resource",
+                "type": "uint16",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes",
+                "name": "record",
+                "type": "bytes",
+            },
+        ],
+        "name": "DNSRecordChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes",
+                "name": "name",
+                "type": "bytes",
+            },
+            {
+                "indexed": False,
+                "internalType": "uint16",
+                "name": "resource",
+                "type": "uint16",
+            },
+        ],
+        "name": "DNSRecordDeleted",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            }
+        ],
+        "name": "DNSZoneCleared",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": True,
+                "internalType": "bytes4",
+                "name": "interfaceID",
+                "type": "bytes4",
+            },
+            {
+                "indexed": False,
+                "internalType": "address",
+                "name": "implementer",
+                "type": "address",
+            },
+        ],
+        "name": "InterfaceChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "string",
+                "name": "name",
+                "type": "string",
+            },
+        ],
+        "name": "NameChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes32",
+                "name": "x",
+                "type": "bytes32",
+            },
+            {
+                "indexed": False,
+                "internalType": "bytes32",
+                "name": "y",
+                "type": "bytes32",
+            },
+        ],
+        "name": "PubkeyChanged",
+        "type": "event",
+    },
+    {
+        "anonymous": False,
+        "inputs": [
+            {
+                "indexed": True,
+                "internalType": "bytes32",
+                "name": "node",
+                "type": "bytes32",
+            },
+            {
+                "indexed": True,
+                "internalType": "string",
+                "name": "indexedKey",
+                "type": "string",
+            },
+            {
+                "indexed": False,
+                "internalType": "string",
+                "name": "key",
+                "type": "string",
+            },
+        ],
+        "name": "TextChanged",
+        "type": "event",
+    },
     {
         "constant": True,
-        "inputs": [{"name": "interfaceID", "type": "bytes4"}],
-        "name": "supportsInterface",
-        "outputs": [{"name": "", "type": "bool"}],
+        "inputs": [
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "uint256", "name": "contentTypes", "type": "uint256"},
+        ],
+        "name": "ABI",
+        "outputs": [
+            {"internalType": "uint256", "name": "", "type": "uint256"},
+            {"internalType": "bytes", "name": "", "type": "bytes"},
+        ],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
     },
     {
-        "constant": False,
+        "constant": True,
+        "inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"}],
+        "name": "addr",
+        "outputs": [{"internalType": "address payable", "name": "", "type": "address"}],
+        "payable": False,
+        "stateMutability": "view",
+        "type": "function",
+    },
+    {
+        "constant": True,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "key", "type": "string"},
-            {"name": "value", "type": "string"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "uint256", "name": "coinType", "type": "uint256"},
         ],
-        "name": "setText",
-        "outputs": [],
+        "name": "addr",
+        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
         "payable": False,
-        "stateMutability": "nonpayable",
+        "stateMutability": "view",
         "type": "function",
     },
     {
         "constant": True,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "contentTypes", "type": "uint256"},
-        ],
-        "name": "ABI",
-        "outputs": [
-            {"name": "contentType", "type": "uint256"},
-            {"name": "data", "type": "bytes"},
+            {"internalType": "bytes32", "name": "", "type": "bytes32"},
+            {"internalType": "address", "name": "", "type": "address"},
+            {"internalType": "address", "name": "", "type": "address"},
         ],
+        "name": "authorisations",
+        "outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
     },
     {
         "constant": False,
-        "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "x", "type": "bytes32"},
-            {"name": "y", "type": "bytes32"},
-        ],
-        "name": "setPubkey",
+        "inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"}],
+        "name": "clearDNSZone",
         "outputs": [],
         "payable": False,
         "stateMutability": "nonpayable",
@@ -571,18 +861,22 @@ RESOLVER = [
     },
     {
         "constant": True,
-        "inputs": [{"name": "node", "type": "bytes32"}],
-        "name": "content",
-        "outputs": [{"name": "ret", "type": "bytes32"}],
+        "inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"}],
+        "name": "contenthash",
+        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
     },
     {
         "constant": True,
-        "inputs": [{"name": "node", "type": "bytes32"}],
-        "name": "addr",
-        "outputs": [{"name": "ret", "type": "address"}],
+        "inputs": [
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "name", "type": "bytes32"},
+            {"internalType": "uint16", "name": "resource", "type": "uint16"},
+        ],
+        "name": "dnsRecord",
+        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
@@ -590,33 +884,53 @@ RESOLVER = [
     {
         "constant": True,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "key", "type": "string"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "name", "type": "bytes32"},
         ],
-        "name": "text",
-        "outputs": [{"name": "ret", "type": "string"}],
+        "name": "hasDNSRecords",
+        "outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
     },
     {
-        "constant": False,
+        "constant": True,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "contentType", "type": "uint256"},
-            {"name": "data", "type": "bytes"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes4", "name": "interfaceID", "type": "bytes4"},
         ],
-        "name": "setABI",
-        "outputs": [],
+        "name": "interfaceImplementer",
+        "outputs": [{"internalType": "address", "name": "", "type": "address"}],
+        "payable": False,
+        "stateMutability": "view",
+        "type": "function",
+    },
+    {
+        "constant": False,
+        "inputs": [{"internalType": "bytes[]", "name": "data", "type": "bytes[]"}],
+        "name": "multicall",
+        "outputs": [{"internalType": "bytes[]", "name": "results", "type": "bytes[]"}],
         "payable": False,
         "stateMutability": "nonpayable",
         "type": "function",
     },
     {
         "constant": True,
-        "inputs": [{"name": "node", "type": "bytes32"}],
+        "inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"}],
         "name": "name",
-        "outputs": [{"name": "ret", "type": "string"}],
+        "outputs": [{"internalType": "string", "name": "", "type": "string"}],
+        "payable": False,
+        "stateMutability": "view",
+        "type": "function",
+    },
+    {
+        "constant": True,
+        "inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"}],
+        "name": "pubkey",
+        "outputs": [
+            {"internalType": "bytes32", "name": "x", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "y", "type": "bytes32"},
+        ],
         "payable": False,
         "stateMutability": "view",
         "type": "function",
@@ -624,10 +938,11 @@ RESOLVER = [
     {
         "constant": False,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "name", "type": "string"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "uint256", "name": "contentType", "type": "uint256"},
+            {"internalType": "bytes", "name": "data", "type": "bytes"},
         ],
-        "name": "setName",
+        "name": "setABI",
         "outputs": [],
         "payable": False,
         "stateMutability": "nonpayable",
@@ -636,31 +951,36 @@ RESOLVER = [
     {
         "constant": False,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "hash", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "uint256", "name": "coinType", "type": "uint256"},
+            {"internalType": "bytes", "name": "a", "type": "bytes"},
         ],
-        "name": "setContent",
+        "name": "setAddr",
         "outputs": [],
         "payable": False,
         "stateMutability": "nonpayable",
         "type": "function",
     },
     {
-        "constant": True,
-        "inputs": [{"name": "node", "type": "bytes32"}],
-        "name": "pubkey",
-        "outputs": [{"name": "x", "type": "bytes32"}, {"name": "y", "type": "bytes32"}],
+        "constant": False,
+        "inputs": [
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "address", "name": "a", "type": "address"},
+        ],
+        "name": "setAddr",
+        "outputs": [],
         "payable": False,
-        "stateMutability": "view",
+        "stateMutability": "nonpayable",
         "type": "function",
     },
     {
         "constant": False,
         "inputs": [
-            {"name": "node", "type": "bytes32"},
-            {"name": "addr", "type": "address"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "address", "name": "target", "type": "address"},
+            {"internalType": "bool", "name": "isAuthorised", "type": "bool"},
         ],
-        "name": "setAddr",
+        "name": "setAuthorisation",
         "outputs": [],
         "payable": False,
         "stateMutability": "nonpayable",
@@ -669,86 +989,123 @@ RESOLVER = [
     {
         "constant": False,
         "inputs": [
-            {"internalType": "bytes", "name": "name", "type": "bytes"},
-            {"internalType": "bytes", "name": "data", "type": "bytes"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes", "name": "hash", "type": "bytes"},
         ],
-        "name": "resolve",
-        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
-        "stateMutability": "view",
+        "name": "setContenthash",
+        "outputs": [],
+        "payable": False,
+        "stateMutability": "nonpayable",
         "type": "function",
     },
     {
         "constant": False,
         "inputs": [
-            {"internalType": "bytes", "name": "response", "type": "bytes"},
-            {"internalType": "bytes", "name": "extraData", "type": "bytes"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes", "name": "data", "type": "bytes"},
         ],
-        "name": "resolveWithProof",
-        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
-        "stateMutability": "view",
+        "name": "setDNSRecords",
+        "outputs": [],
+        "payable": False,
+        "stateMutability": "nonpayable",
         "type": "function",
     },
     {
-        "inputs": [{"name": "ensAddr", "type": "address"}],
+        "constant": False,
+        "inputs": [
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes4", "name": "interfaceID", "type": "bytes4"},
+            {"internalType": "address", "name": "implementer", "type": "address"},
+        ],
+        "name": "setInterface",
+        "outputs": [],
         "payable": False,
         "stateMutability": "nonpayable",
-        "type": "constructor",
+        "type": "function",
     },
     {
-        "anonymous": False,
+        "constant": False,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": False, "name": "a", "type": "address"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "string", "name": "name", "type": "string"},
         ],
-        "name": "AddrChanged",
-        "type": "event",
+        "name": "setName",
+        "outputs": [],
+        "payable": False,
+        "stateMutability": "nonpayable",
+        "type": "function",
     },
     {
-        "anonymous": False,
+        "constant": False,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": False, "name": "hash", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "x", "type": "bytes32"},
+            {"internalType": "bytes32", "name": "y", "type": "bytes32"},
         ],
-        "name": "ContentChanged",
-        "type": "event",
+        "name": "setPubkey",
+        "outputs": [],
+        "payable": False,
+        "stateMutability": "nonpayable",
+        "type": "function",
     },
     {
-        "anonymous": False,
+        "constant": False,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": False, "name": "name", "type": "string"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "string", "name": "key", "type": "string"},
+            {"internalType": "string", "name": "value", "type": "string"},
         ],
-        "name": "NameChanged",
-        "type": "event",
+        "name": "setText",
+        "outputs": [],
+        "payable": False,
+        "stateMutability": "nonpayable",
+        "type": "function",
     },
     {
-        "anonymous": False,
+        "constant": True,
+        "inputs": [{"internalType": "bytes4", "name": "interfaceID", "type": "bytes4"}],
+        "name": "supportsInterface",
+        "outputs": [{"internalType": "bool", "name": "", "type": "bool"}],
+        "payable": False,
+        "stateMutability": "pure",
+        "type": "function",
+    },
+    {
+        "constant": True,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": True, "name": "contentType", "type": "uint256"},
+            {"internalType": "bytes32", "name": "node", "type": "bytes32"},
+            {"internalType": "string", "name": "key", "type": "string"},
         ],
-        "name": "ABIChanged",
-        "type": "event",
+        "name": "text",
+        "outputs": [{"internalType": "string", "name": "", "type": "string"}],
+        "payable": False,
+        "stateMutability": "view",
+        "type": "function",
     },
+]
+
+PUBLIC_RESOLVER_2_EXTENDED = PUBLIC_RESOLVER_2 + [
     {
-        "anonymous": False,
+        "constant": False,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": False, "name": "x", "type": "bytes32"},
-            {"indexed": False, "name": "y", "type": "bytes32"},
+            {"internalType": "bytes", "name": "name", "type": "bytes"},
+            {"internalType": "bytes", "name": "data", "type": "bytes"},
         ],
-        "name": "PubkeyChanged",
-        "type": "event",
+        "name": "resolve",
+        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
+        "stateMutability": "view",
+        "type": "function",
     },
     {
-        "anonymous": False,
+        "constant": False,
         "inputs": [
-            {"indexed": True, "name": "node", "type": "bytes32"},
-            {"indexed": True, "name": "indexedKey", "type": "string"},
-            {"indexed": False, "name": "key", "type": "string"},
+            {"internalType": "bytes", "name": "response", "type": "bytes"},
+            {"internalType": "bytes", "name": "extraData", "type": "bytes"},
         ],
-        "name": "TextChanged",
-        "type": "event",
+        "name": "resolveWithProof",
+        "outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],
+        "stateMutability": "view",
+        "type": "function",
     },
 ]
 
diff --git a/ens/async_ens.py b/ens/async_ens.py
index 78d16065..b27fc429 100644
--- a/ens/async_ens.py
+++ b/ens/async_ens.py
@@ -107,7 +107,9 @@ class AsyncENS(BaseENS):
 
         ens_addr = addr if addr else ENS_MAINNET_ADDR
         self.ens = self.w3.eth.contract(abi=abis.ENS, address=ens_addr)
-        self._resolver_contract = self.w3.eth.contract(abi=abis.RESOLVER)
+        self._resolver_contract = self.w3.eth.contract(
+            abi=abis.PUBLIC_RESOLVER_2_EXTENDED
+        )
         self._reverse_resolver_contract = self.w3.eth.contract(
             abi=abis.REVERSE_RESOLVER
         )
diff --git a/ens/base_ens.py b/ens/base_ens.py
index aa277c2e..f8442f72 100644
--- a/ens/base_ens.py
+++ b/ens/base_ens.py
@@ -104,7 +104,12 @@ class BaseENS:
         extended_resolver: Union["Contract", "AsyncContract"],
         fn_name: str,
     ) -> Any:
-        func = extended_resolver.get_function_by_name(fn_name)
+        # avoid getting 2 resolver functions named `addr`
+        func = (
+            extended_resolver.get_function_by_signature("addr(bytes32)")
+            if fn_name == "addr"
+            else extended_resolver.get_function_by_name(fn_name)
+        )
         output_types = get_abi_output_types(func.abi)
         decoded = self.w3.codec.decode(output_types, contract_call_result)
 
diff --git a/ens/ens.py b/ens/ens.py
index ee612306..4c78d6d9 100644
--- a/ens/ens.py
+++ b/ens/ens.py
@@ -107,7 +107,9 @@ class ENS(BaseENS):
 
         ens_addr = addr if addr else ENS_MAINNET_ADDR
         self.ens = self.w3.eth.contract(abi=abis.ENS, address=ens_addr)
-        self._resolver_contract = self.w3.eth.contract(abi=abis.RESOLVER)
+        self._resolver_contract = self.w3.eth.contract(
+            abi=abis.PUBLIC_RESOLVER_2_EXTENDED
+        )
         self._reverse_resolver_contract = self.w3.eth.contract(
             abi=abis.REVERSE_RESOLVER
         )
diff --git a/newsfragments/1839.feature.rst b/newsfragments/1839.feature.rst
new file mode 100644
index 00000000..489357d8
--- /dev/null
+++ b/newsfragments/1839.feature.rst
@@ -0,0 +1,1 @@
+Update ENS Resolver ABI
\ No newline at end of file
diff --git a/newsfragments/2936.bugfix.rst b/newsfragments/2936.bugfix.rst
new file mode 100644
index 00000000..1079499c
--- /dev/null
+++ b/newsfragments/2936.bugfix.rst
@@ -0,0 +1,1 @@
+Fix for a possible bug in ``construct_sign_and_send_raw_middleware`` where the signed transaction was sent as bytes and expected to be converted to hex by formatting later on. It is now explicitly sent as the hex string hash within the middleware.
diff --git a/newsfragments/3025.feature.rst b/newsfragments/3025.feature.rst
new file mode 100644
index 00000000..bab751e1
--- /dev/null
+++ b/newsfragments/3025.feature.rst
@@ -0,0 +1,1 @@
+Add async support for the sign-and-send raw transaction middleware via ``construct_async_sign_and_send_raw_middleware()``.
diff --git a/newsfragments/3026.bugfix.rst b/newsfragments/3026.bugfix.rst
new file mode 100644
index 00000000..718955fe
--- /dev/null
+++ b/newsfragments/3026.bugfix.rst
@@ -0,0 +1,1 @@
+Properly initialize logger in ``AsyncHTTPProvider``.
\ No newline at end of file
diff --git a/web3/_utils/async_transactions.py b/web3/_utils/async_transactions.py
index 1f413b7e..f602d8e4 100644
--- a/web3/_utils/async_transactions.py
+++ b/web3/_utils/async_transactions.py
@@ -11,9 +11,10 @@ from eth_abi import (
 )
 from eth_typing import (
     URI,
+    ChecksumAddress,
 )
 from eth_utils.toolz import (
-    curry,
+    assoc,
     merge,
 )
 from hexbytes import (
@@ -78,7 +79,7 @@ TRANSACTION_DEFAULTS = {
     "value": 0,
     "data": b"",
     "gas": _estimate_gas,
-    "gasPrice": lambda w3, tx: w3.eth.generate_gas_price(tx),
+    "gasPrice": lambda async_w3, tx: async_w3.eth.generate_gas_price(tx),
     "maxFeePerGas": _max_fee_per_gas,
     "maxPriorityFeePerGas": _max_priority_fee_gas,
     "chainId": _chain_id,
@@ -113,12 +114,21 @@ async def get_buffered_gas_estimate(
     return min(gas_limit, gas_estimate + gas_buffer)
 
 
-@curry
-async def fill_transaction_defaults(
+async def async_fill_nonce(async_w3: "AsyncWeb3", transaction: TxParams) -> TxParams:
+    if "from" in transaction and "nonce" not in transaction:
+        tx_count = await async_w3.eth.get_transaction_count(
+            cast(ChecksumAddress, transaction["from"]),
+            block_identifier="pending",
+        )
+        return assoc(transaction, "nonce", tx_count)
+    return transaction
+
+
+async def async_fill_transaction_defaults(
     async_w3: "AsyncWeb3", transaction: TxParams
 ) -> TxParams:
     """
-    if w3 is None, fill as much as possible while offline
+    if async_w3 is None, fill as much as possible while offline
     """
     strategy_based_gas_price = async_w3.eth.generate_gas_price(transaction)
 
diff --git a/web3/contract/async_contract.py b/web3/contract/async_contract.py
index 5b907751..fd347930 100644
--- a/web3/contract/async_contract.py
+++ b/web3/contract/async_contract.py
@@ -32,7 +32,7 @@ from web3._utils.abi import (
     receive_func_abi_exists,
 )
 from web3._utils.async_transactions import (
-    fill_transaction_defaults as async_fill_transaction_defaults,
+    async_fill_transaction_defaults,
 )
 from web3._utils.compat import (
     Self,
diff --git a/web3/contract/utils.py b/web3/contract/utils.py
index 969f1384..f0dd8b14 100644
--- a/web3/contract/utils.py
+++ b/web3/contract/utils.py
@@ -29,7 +29,7 @@ from web3._utils.abi import (
     recursive_dict_to_namedtuple,
 )
 from web3._utils.async_transactions import (
-    fill_transaction_defaults as async_fill_transaction_defaults,
+    async_fill_transaction_defaults,
 )
 from web3._utils.contracts import (
     find_matching_fn_abi,
diff --git a/web3/middleware/signing.py b/web3/middleware/signing.py
index 04f59163..0ccc629f 100644
--- a/web3/middleware/signing.py
+++ b/web3/middleware/signing.py
@@ -27,6 +27,7 @@ from eth_typing import (
     HexStr,
 )
 from eth_utils import (
+    to_checksum_address,
     to_dict,
 )
 from eth_utils.curried import (
@@ -36,6 +37,10 @@ from eth_utils.toolz import (
     compose,
 )
 
+from web3._utils.async_transactions import (
+    async_fill_nonce,
+    async_fill_transaction_defaults,
+)
 from web3._utils.method_formatters import (
     STANDARD_NORMALIZERS,
 )
@@ -48,6 +53,8 @@ from web3._utils.transactions import (
     fill_transaction_defaults,
 )
 from web3.types import (
+    AsyncMiddleware,
+    AsyncMiddlewareCoroutine,
     Middleware,
     RPCEndpoint,
     RPCResponse,
@@ -55,7 +62,10 @@ from web3.types import (
 )
 
 if TYPE_CHECKING:
-    from web3 import Web3  # noqa: F401
+    from web3 import (  # noqa: F401
+        AsyncWeb3,
+        Web3,
+    )
 
 T = TypeVar("T")
 
@@ -168,8 +178,62 @@ def construct_sign_and_send_raw_middleware(
             account = accounts[transaction["from"]]
             raw_tx = account.sign_transaction(transaction).rawTransaction
 
-            return make_request(RPCEndpoint("eth_sendRawTransaction"), [raw_tx])
+            return make_request(RPCEndpoint("eth_sendRawTransaction"), [raw_tx.hex()])
 
         return middleware
 
     return sign_and_send_raw_middleware
+
+
+# -- async -- #
+
+
+async def async_construct_sign_and_send_raw_middleware(
+    private_key_or_account: Union[_PrivateKey, Collection[_PrivateKey]]
+) -> AsyncMiddleware:
+    """
+    Capture transactions & sign and send as raw transactions
+
+    Keyword arguments:
+    private_key_or_account -- A single private key or a tuple,
+    list or set of private keys. Keys can be any of the following formats:
+      - An eth_account.LocalAccount object
+      - An eth_keys.PrivateKey object
+      - A raw private key as a hex string or byte string
+    """
+    accounts = gen_normalized_accounts(private_key_or_account)
+
+    async def async_sign_and_send_raw_middleware(
+        make_request: Callable[[RPCEndpoint, Any], Any], async_w3: "AsyncWeb3"
+    ) -> AsyncMiddlewareCoroutine:
+        async def middleware(method: RPCEndpoint, params: Any) -> RPCResponse:
+            if method != "eth_sendTransaction":
+                # quick exit if not `eth_sendTransaction`
+                return await make_request(method, params)
+
+            formatted_transaction = format_transaction(params[0])
+            filled_transaction = await async_fill_transaction_defaults(
+                async_w3,
+                formatted_transaction,
+            )
+            filled_transaction = await async_fill_nonce(
+                async_w3,
+                filled_transaction,
+            )
+
+            tx_from = filled_transaction.get("from", None)
+
+            if tx_from is None or (tx_from is not None and tx_from not in accounts):
+                return await make_request(method, params)
+
+            account = accounts[to_checksum_address(tx_from)]
+            raw_tx = account.sign_transaction(filled_transaction).rawTransaction
+
+            return await make_request(
+                RPCEndpoint("eth_sendRawTransaction"),
+                [raw_tx.hex()],
+            )
+
+        return middleware
+
+    return async_sign_and_send_raw_middleware
diff --git a/web3/providers/__init__.py b/web3/providers/__init__.py
index d9c3952d..5bd3a75a 100644
--- a/web3/providers/__init__.py
+++ b/web3/providers/__init__.py
@@ -1,6 +1,9 @@
 from .async_base import (  # noqa: F401
     AsyncBaseProvider,
 )
+from .async_rpc import (  # noqa: F401
+    AsyncHTTPProvider,
+)
 from .base import (  # noqa: F401
     BaseProvider,
     JSONBaseProvider,
diff --git a/web3/providers/async_rpc.py b/web3/providers/async_rpc.py
index 6a3dba0e..e5ab8cb7 100644
--- a/web3/providers/async_rpc.py
+++ b/web3/providers/async_rpc.py
@@ -44,7 +44,7 @@ from .async_base import (
 
 
 class AsyncHTTPProvider(AsyncJSONBaseProvider):
-    logger = logging.getLogger("web3.providers.HTTPProvider")
+    logger = logging.getLogger("web3.providers.AsyncHTTPProvider")
     endpoint_uri = None
     _request_kwargs = None
     # type ignored b/c conflict with _middlewares attr on AsyncBaseProvider


Test patch:
diff --git a/tests/core/middleware/test_transaction_signing.py b/tests/core/middleware/test_transaction_signing.py
index 18384445..e1dc9e5a 100644
--- a/tests/core/middleware/test_transaction_signing.py
+++ b/tests/core/middleware/test_transaction_signing.py
@@ -12,6 +12,7 @@ from eth_tester.exceptions import (
 )
 from eth_utils import (
     ValidationError as EthUtilsValidationError,
+    is_hexstr,
     to_bytes,
     to_hex,
 )
@@ -25,24 +26,30 @@ from eth_utils.toolz import (
 from hexbytes import (
     HexBytes,
 )
+import pytest_asyncio
 
 from web3 import (
+    AsyncWeb3,
     Web3,
 )
 from web3.exceptions import (
     InvalidAddress,
 )
 from web3.middleware import (
+    async_construct_result_generator_middleware,
     construct_result_generator_middleware,
     construct_sign_and_send_raw_middleware,
 )
 from web3.middleware.signing import (
+    async_construct_sign_and_send_raw_middleware,
     gen_normalized_accounts,
 )
 from web3.providers import (
+    AsyncBaseProvider,
     BaseProvider,
 )
 from web3.providers.eth_tester import (
+    AsyncEthereumTesterProvider,
     EthereumTesterProvider,
 )
 
@@ -89,7 +96,7 @@ class DummyProvider(BaseProvider):
         raise NotImplementedError(f"Cannot make request for {method}:{params}")
 
 
-@pytest.fixture()
+@pytest.fixture
 def result_generator_middleware():
     return construct_result_generator_middleware(
         {
@@ -100,12 +107,12 @@ def result_generator_middleware():
     )
 
 
-@pytest.fixture()
+@pytest.fixture
 def w3_base():
     return Web3(provider=DummyProvider(), middlewares=[])
 
 
-@pytest.fixture()
+@pytest.fixture
 def w3_dummy(w3_base, result_generator_middleware):
     w3_base.middleware_onion.add(result_generator_middleware)
     return w3_base
@@ -115,90 +122,147 @@ def hex_to_bytes(s):
     return to_bytes(hexstr=s)
 
 
-@pytest.mark.parametrize(
-    "method,key_object,from_,expected",
+TEST_SIGN_AND_SEND_RAW_MIDDLEWARE_PARAMS = (
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE, ADDRESS_2, NotImplementedError),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE,
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        MIXED_KEY_MIXED_TYPE,
+        ADDRESS_2,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        MIXED_KEY_MIXED_TYPE,
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    ("eth_sendTransaction", SAME_KEY_SAME_TYPE, ADDRESS_2, NotImplementedError),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_SAME_TYPE,
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        MIXED_KEY_SAME_TYPE,
+        ADDRESS_2,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        MIXED_KEY_SAME_TYPE,
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE[0],
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE[1],
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE[2],
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE[3],
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_MIXED_TYPE[4],
+        ADDRESS_1,
+        "eth_sendRawTransaction",
+    ),
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[0], ADDRESS_2, NotImplementedError),
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[1], ADDRESS_2, NotImplementedError),
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[2], ADDRESS_2, NotImplementedError),
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[3], ADDRESS_2, NotImplementedError),
+    ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[4], ADDRESS_2, NotImplementedError),
+    ("eth_call", MIXED_KEY_MIXED_TYPE, ADDRESS_1, NotImplementedError),
+    (
+        "eth_sendTransaction",
+        SAME_KEY_SAME_TYPE,
+        hex_to_bytes(ADDRESS_1),
+        "eth_sendRawTransaction",
+    ),
+)
+TEST_SIGNED_TRANSACTION_PARAMS = (
+    (
+        {"gas": 21000, "gasPrice": 10**9, "value": 1},
+        -1,
+        MIXED_KEY_MIXED_TYPE,
+        ADDRESS_1,
+    ),
+    (
+        {"value": 1},
+        -1,
+        MIXED_KEY_MIXED_TYPE,
+        ADDRESS_1,
+    ),
+    # expect validation error + unmanaged account
+    (
+        {"gas": 21000, "value": 10},
+        ValidationError,
+        SAME_KEY_MIXED_TYPE,
+        ADDRESS_2,
+    ),
     (
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE, ADDRESS_2, NotImplementedError),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE,
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            MIXED_KEY_MIXED_TYPE,
-            ADDRESS_2,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            MIXED_KEY_MIXED_TYPE,
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        ("eth_sendTransaction", SAME_KEY_SAME_TYPE, ADDRESS_2, NotImplementedError),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_SAME_TYPE,
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            MIXED_KEY_SAME_TYPE,
-            ADDRESS_2,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            MIXED_KEY_SAME_TYPE,
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE[0],
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE[1],
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE[2],
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE[3],
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_MIXED_TYPE[4],
-            ADDRESS_1,
-            "eth_sendRawTransaction",
-        ),
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[0], ADDRESS_2, NotImplementedError),
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[1], ADDRESS_2, NotImplementedError),
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[2], ADDRESS_2, NotImplementedError),
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[3], ADDRESS_2, NotImplementedError),
-        ("eth_sendTransaction", SAME_KEY_MIXED_TYPE[4], ADDRESS_2, NotImplementedError),
-        ("eth_call", MIXED_KEY_MIXED_TYPE, ADDRESS_1, NotImplementedError),
-        (
-            "eth_sendTransaction",
-            SAME_KEY_SAME_TYPE,
-            hex_to_bytes(ADDRESS_1),
-            "eth_sendRawTransaction",
-        ),
+        {"gas": 21000, "value": 10},
+        InvalidAddress,
+        SAME_KEY_MIXED_TYPE,
+        "0x0000",
     ),
+    (
+        {"gas": 21000, "gasPrice": 0, "value": 1},
+        EthUtilsValidationError,
+        MIXED_KEY_MIXED_TYPE,
+        ADDRESS_1,
+    ),
+    (
+        {
+            "type": "0x2",
+            "value": 22,
+            "maxFeePerGas": 2000000000,
+            "maxPriorityFeePerGas": 10**9,
+        },
+        -1,
+        SAME_KEY_MIXED_TYPE,
+        ADDRESS_1,
+    ),
+    (
+        {
+            "value": 22,
+            "maxFeePerGas": 20**9,
+            "maxPriorityFeePerGas": 10**9,
+        },
+        -1,
+        SAME_KEY_MIXED_TYPE,
+        ADDRESS_1,
+    ),
+)
+
+
+@pytest.mark.parametrize(
+    "method,key_object,from_,expected",
+    TEST_SIGN_AND_SEND_RAW_MIDDLEWARE_PARAMS,
 )
 def test_sign_and_send_raw_middleware(w3_dummy, method, from_, expected, key_object):
     w3_dummy.middleware_onion.add(construct_sign_and_send_raw_middleware(key_object))
@@ -247,7 +311,7 @@ def assert_method_and_txn_signed(actual, expected):
     raw_txn = actual[1][0]
     actual_method = actual[0]
     assert actual_method == expected
-    assert isinstance(raw_txn, bytes)
+    assert is_hexstr(raw_txn)
 
 
 @pytest.fixture()
@@ -279,7 +343,7 @@ def test_gen_normalized_accounts_type_error(w3):
         gen_normalized_accounts(1234567890)
 
 
-@pytest.fixture()
+@pytest.fixture
 def fund_account(w3):
     # fund local account
     tx_value = w3.to_wei(10, "ether")
@@ -292,60 +356,7 @@ def fund_account(w3):
 
 @pytest.mark.parametrize(
     "transaction,expected,key_object,from_",
-    (
-        (
-            {"gas": 21000, "gasPrice": 10**9, "value": 1},
-            -1,
-            MIXED_KEY_MIXED_TYPE,
-            ADDRESS_1,
-        ),
-        (
-            {"value": 1},
-            -1,
-            MIXED_KEY_MIXED_TYPE,
-            ADDRESS_1,
-        ),
-        # expect validation error + unmanaged account
-        (
-            {"gas": 21000, "value": 10},
-            ValidationError,
-            SAME_KEY_MIXED_TYPE,
-            ADDRESS_2,
-        ),
-        (
-            {"gas": 21000, "value": 10},
-            InvalidAddress,
-            SAME_KEY_MIXED_TYPE,
-            "0x0000",
-        ),
-        (
-            {"gas": 21000, "gasPrice": 0, "value": 1},
-            EthUtilsValidationError,
-            MIXED_KEY_MIXED_TYPE,
-            ADDRESS_1,
-        ),
-        (
-            {
-                "type": "0x2",
-                "value": 22,
-                "maxFeePerGas": 2000000000,
-                "maxPriorityFeePerGas": 10**9,
-            },
-            -1,
-            SAME_KEY_MIXED_TYPE,
-            ADDRESS_1,
-        ),
-        (
-            {
-                "value": 22,
-                "maxFeePerGas": 20**9,
-                "maxPriorityFeePerGas": 10**9,
-            },
-            -1,
-            SAME_KEY_MIXED_TYPE,
-            ADDRESS_1,
-        ),
-    ),
+    TEST_SIGNED_TRANSACTION_PARAMS,
     ids=[
         "with set gas",
         "with no set gas",
@@ -407,4 +418,200 @@ def test_sign_and_send_raw_middleware_with_byte_addresses(
     raw_txn = actual[1][0]
     actual_method = actual[0]
     assert actual_method == "eth_sendRawTransaction"
-    assert isinstance(raw_txn, bytes)
+    assert is_hexstr(raw_txn)
+
+
+# -- async -- #
+
+
+@pytest_asyncio.fixture
+async def async_result_generator_middleware():
+    return await async_construct_result_generator_middleware(
+        {
+            "eth_sendRawTransaction": lambda *args: args,
+            "net_version": lambda *_: 1,
+            "eth_chainId": lambda *_: "0x02",
+        }
+    )
+
+
+class AsyncDummyProvider(AsyncBaseProvider):
+    async def coro_request(self, method, params):
+        raise NotImplementedError(f"Cannot make request for {method}:{params}")
+
+
+@pytest.fixture
+def async_w3_base():
+    return AsyncWeb3(provider=AsyncDummyProvider(), middlewares=[])
+
+
+@pytest.fixture
+def async_w3_dummy(async_w3_base, async_result_generator_middleware):
+    async_w3_base.middleware_onion.add(async_result_generator_middleware)
+    return async_w3_base
+
+
+@pytest.fixture
+def async_w3():
+    return AsyncWeb3(AsyncEthereumTesterProvider())
+
+
+@pytest_asyncio.fixture
+async def async_fund_account(async_w3):
+    # fund local account
+    accounts = await async_w3.eth.accounts
+    tx_value = async_w3.to_wei(10, "ether")
+    for address in (ADDRESS_1, ADDRESS_2):
+        await async_w3.eth.send_transaction(
+            {"to": address, "from": accounts[0], "gas": 21000, "value": tx_value}
+        )
+        acct_bal = await async_w3.eth.get_balance(address)
+        assert acct_bal == tx_value
+
+
+@pytest.mark.parametrize(
+    "method,key_object,from_,expected",
+    TEST_SIGN_AND_SEND_RAW_MIDDLEWARE_PARAMS,
+)
+@pytest.mark.asyncio
+async def test_async_sign_and_send_raw_middleware(
+    async_w3_dummy,
+    method,
+    from_,
+    expected,
+    key_object,
+):
+    async_w3_dummy.middleware_onion.add(
+        await async_construct_sign_and_send_raw_middleware(key_object)
+    )
+
+    legacy_transaction = {
+        "to": "0x7E5F4552091A69125d5DfCb7b8C2659029395Bdf",
+        "from": from_,
+        "gas": 21000,
+        "gasPrice": 10**9,
+        "value": 1,
+        "nonce": 0,
+    }
+    if isinstance(expected, type) and issubclass(expected, Exception):
+        with pytest.raises(expected):
+            await async_w3_dummy.manager.coro_request(
+                method,
+                [legacy_transaction],
+            )
+    else:
+        # assert with legacy txn params
+        actual = await async_w3_dummy.manager.coro_request(
+            method,
+            [legacy_transaction],
+        )
+        assert_method_and_txn_signed(actual, expected)
+
+        # assert with dynamic fee transaction params and explicit type
+        dynamic_fee_transaction = dissoc(legacy_transaction, "gasPrice")
+        dynamic_fee_transaction = assoc(
+            dynamic_fee_transaction, "maxFeePerGas", 2000000000
+        )
+        dynamic_fee_transaction = assoc(
+            dynamic_fee_transaction, "maxPriorityFeePerGas", 1000000000
+        )
+        dynamic_fee_transaction = assoc(dynamic_fee_transaction, "type", "0x2")
+
+        actual_dynamic_fee_call = await async_w3_dummy.manager.coro_request(
+            method, [dynamic_fee_transaction]
+        )
+        assert_method_and_txn_signed(actual_dynamic_fee_call, expected)
+
+        # assert with dynamic fee transaction params and no explicit type
+        dynamic_fee_transaction_no_type = dissoc(dynamic_fee_transaction, "type")
+
+        actual_dynamic_fee_call_no_type = await async_w3_dummy.manager.coro_request(
+            method, [dynamic_fee_transaction_no_type]
+        )
+        assert_method_and_txn_signed(actual_dynamic_fee_call_no_type, expected)
+
+
+@pytest.mark.parametrize(
+    "transaction,expected,key_object,from_",
+    TEST_SIGNED_TRANSACTION_PARAMS,
+    ids=[
+        "with set gas",
+        "with no set gas",
+        "with mismatched sender",
+        "with invalid sender",
+        "with gasPrice lower than base fee",
+        "with txn type and dynamic fee txn params",
+        "with dynamic fee txn params and no type",
+    ],
+)
+@pytest.mark.asyncio
+async def test_async_signed_transaction(
+    async_w3,
+    async_fund_account,
+    transaction,
+    expected,
+    key_object,
+    from_,
+):
+    async_w3.middleware_onion.add(
+        await async_construct_sign_and_send_raw_middleware(key_object)
+    )
+
+    # Drop any falsy addresses
+    accounts = await async_w3.eth.accounts
+    to_from = valfilter(bool, {"to": accounts[0], "from": from_})
+
+    _transaction = merge(transaction, to_from)
+
+    if isinstance(expected, type) and issubclass(expected, Exception):
+        with pytest.raises(expected):
+            await async_w3.eth.send_transaction(_transaction)
+    else:
+        start_balance = await async_w3.eth.get_balance(
+            _transaction.get("from", accounts[0])
+        )
+        await async_w3.eth.send_transaction(_transaction)
+        assert (
+            await async_w3.eth.get_balance(_transaction.get("from"))
+            <= start_balance + expected
+        )
+
+
+@pytest.mark.parametrize(
+    "from_converter,to_converter",
+    (
+        (identity, identity),
+        (hex_to_bytes, identity),
+        (identity, hex_to_bytes),
+        (hex_to_bytes, hex_to_bytes),
+    ),
+)
+@pytest.mark.asyncio
+async def test_async_sign_and_send_raw_middleware_with_byte_addresses(
+    async_w3_dummy, from_converter, to_converter
+):
+    private_key = PRIVATE_KEY_1
+    from_ = from_converter(ADDRESS_1)
+    to_ = to_converter(ADDRESS_2)
+
+    async_w3_dummy.middleware_onion.add(
+        await async_construct_sign_and_send_raw_middleware(private_key)
+    )
+
+    actual = await async_w3_dummy.manager.coro_request(
+        "eth_sendTransaction",
+        [
+            {
+                "to": to_,
+                "from": from_,
+                "gas": 21000,
+                "gasPrice": 0,
+                "value": 1,
+                "nonce": 0,
+            }
+        ],
+    )
+    raw_txn = actual[1][0]
+    actual_method = actual[0]
+    assert actual_method == "eth_sendRawTransaction"
+    assert is_hexstr(raw_txn)
diff --git a/tests/core/utilities/test_async_transaction.py b/tests/core/utilities/test_async_transaction.py
index a3edee9a..e7ca7678 100644
--- a/tests/core/utilities/test_async_transaction.py
+++ b/tests/core/utilities/test_async_transaction.py
@@ -5,7 +5,7 @@ from eth_typing import (
 )
 
 from web3._utils.async_transactions import (
-    fill_transaction_defaults,
+    async_fill_transaction_defaults,
     get_block_gas_limit,
     get_buffered_gas_estimate,
 )
@@ -52,7 +52,7 @@ async def test_get_buffered_gas_estimate(async_w3):
 
 @pytest.mark.asyncio()
 async def test_fill_transaction_defaults_for_all_params(async_w3):
-    default_transaction = await fill_transaction_defaults(async_w3, {})
+    default_transaction = await async_fill_transaction_defaults(async_w3, {})
 
     block = await async_w3.eth.get_block("latest")
     assert default_transaction == {
@@ -72,7 +72,7 @@ async def test_fill_transaction_defaults_nondynamic_tranaction_fee(async_w3):
     gasPrice_transaction = {
         "gasPrice": 10,
     }
-    default_transaction = await fill_transaction_defaults(
+    default_transaction = await async_fill_transaction_defaults(
         async_w3, gasPrice_transaction
     )
 
@@ -86,7 +86,7 @@ async def test_fill_transaction_defaults_for_zero_gas_price(async_w3):
 
     async_w3.eth.set_gas_price_strategy(gas_price_strategy)
 
-    default_transaction = await fill_transaction_defaults(async_w3, {})
+    default_transaction = await async_fill_transaction_defaults(async_w3, {})
 
     assert default_transaction == {
         "chainId": await async_w3.eth.chain_id,