Skip to content

Commit 58236c0

Browse files
fix: scope data-decoder endpoint DB access to its own session context (#305)
1 parent 8a2fd4c commit 58236c0

2 files changed

Lines changed: 37 additions & 34 deletions

File tree

app/services/data_decoder.py

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,10 @@ async def get_data_decoded(
363363
data_str = data if isinstance(data, str) else to_0x_hex_str(data)
364364
try:
365365
logger.debug("Decoding data %s", data_str)
366-
fn_name, parameters = await self.decode_transaction_with_types(
367-
data, address=address, chain_id=chain_id
368-
)
366+
async with transactional_session_context():
367+
fn_name, parameters = await self.decode_transaction_with_types(
368+
data, address=address, chain_id=chain_id
369+
)
369370
decoded: DataDecoded = {"method": fn_name, "parameters": parameters}
370371
logger.debug("Decoded data %s into %s", data_str, decoded)
371372
return decoded
@@ -492,12 +493,13 @@ async def get_decoding_accuracy(
492493
if selector not in self.fn_selectors_with_abis:
493494
return DecodingAccuracyEnum.NO_MATCH
494495
if address is not None:
495-
if chain_id is not None and await self.get_contract_abi(
496-
address, chain_id=chain_id
497-
):
498-
return DecodingAccuracyEnum.FULL_MATCH
499-
if await self.get_contract_abi(address, None):
500-
return DecodingAccuracyEnum.PARTIAL_MATCH
496+
async with transactional_session_context():
497+
if chain_id is not None and await self.get_contract_abi(
498+
address, chain_id=chain_id
499+
):
500+
return DecodingAccuracyEnum.FULL_MATCH
501+
if await self.get_contract_abi(address, None):
502+
return DecodingAccuracyEnum.PARTIAL_MATCH
501503
return DecodingAccuracyEnum.ONLY_FUNCTION_MATCH
502504

503505
async def add_abi(self, abi: ABI) -> bool:

app/tests/routers/test_data_decoder.py

Lines changed: 26 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from web3 import Web3
1111

1212
from ...datasources.abis.gnosis_protocol import cowswap_settlement_v2_abi
13-
from ...datasources.db.database import db_session_context
13+
from ...datasources.db.database import db_session_context, transactional_session_context
1414
from ...datasources.db.models import Abi, AbiSource, Contract
1515
from ...main import app
1616
from ...services.abis import AbiService
@@ -120,33 +120,34 @@ async def test_view_data_decoder_with_chain_id_without_to(self):
120120
},
121121
)
122122

123-
@db_session_context
124123
async def test_view_data_decoder_with_chain_id(self):
125-
source = AbiSource(name="local", url="")
126-
await source.create()
127-
124+
# No outer context: the endpoint must scope its own session
128125
contract_address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"
129-
abi = Abi(abi_json=example_abi, relevance=101, source_id=source.id)
130-
await abi.create()
131-
contract = Contract(
132-
address=HexBytes(contract_address),
133-
abi=abi,
134-
name="SwappedContract",
135-
chain_id=1,
136-
)
137-
await contract.create()
126+
async with transactional_session_context():
127+
source = AbiSource(name="local", url="")
128+
await source.create()
138129

139-
swapped_abi = Abi(
140-
abi_json=example_swapped_abi, relevance=100, source_id=source.id
141-
)
142-
await swapped_abi.create()
143-
contract = Contract(
144-
address=HexBytes(contract_address),
145-
abi=swapped_abi,
146-
name="SwappedContract",
147-
chain_id=2,
148-
)
149-
await contract.create()
130+
abi = Abi(abi_json=example_abi, relevance=101, source_id=source.id)
131+
await abi.create()
132+
contract = Contract(
133+
address=HexBytes(contract_address),
134+
abi=abi,
135+
name="SwappedContract",
136+
chain_id=1,
137+
)
138+
await contract.create()
139+
140+
swapped_abi = Abi(
141+
abi_json=example_swapped_abi, relevance=100, source_id=source.id
142+
)
143+
await swapped_abi.create()
144+
contract = Contract(
145+
address=HexBytes(contract_address),
146+
abi=swapped_abi,
147+
name="SwappedContract",
148+
chain_id=2,
149+
)
150+
await contract.create()
150151

151152
example_data = (
152153
Web3()

0 commit comments

Comments
 (0)