Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix contract without abi shouldn't be returned #78

Merged
merged 2 commits into from
Jan 23, 2025
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix contract without abi shouldn't be returned
  • Loading branch information
moisses89 committed Jan 23, 2025
commit 1665dc9a363245eef64c89dc612b4330d22a51e6
4 changes: 2 additions & 2 deletions app/datasources/db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ class Contract(SqlQueryBase, TimeStampedSQLModel, table=True):
chain_id: int = Field(default=None)

@classmethod
def get_contracts_query(
def get_contracts_with_abi_query(
cls, address: bytes, chain_ids: list[int] | None = None
) -> SelectBase["Contract"]:
"""
Expand All @@ -221,7 +221,7 @@ def get_contracts_query(
:param chain_ids: list of chain_ids, `None` for all chains
:return:
"""
query = select(cls).where(cls.address == address)
query = select(cls).where(cls.address == address, cls.abi_id.isnot(None)) # type: ignore
if chain_ids:
query = query.where(col(cls.chain_id).in_(chain_ids)).order_by(
col(cls.chain_id).desc()
Expand Down
11 changes: 11 additions & 0 deletions app/routers/contracts.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,17 @@ async def list_contracts(
chain_ids: Annotated[list[int] | None, Query()] = None,
session: AsyncSession = Depends(get_database_session),
) -> PaginatedResponse[Contract]:
"""
List all contracts for all the chains, or for the provided chains
Empty responses indicate that no contract was found

:param request:
:param address:
:param pagination_params:
:param chain_ids:
:param session:
:return:
"""
if not fast_is_checksum_address(address):
raise HTTPException(status_code=400, detail="Address is not checksumed")

Expand Down
2 changes: 1 addition & 1 deletion app/routers/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ class ContractsPublic(BaseModel):
display_name: str | None
chain_id: int
project: ProjectPublic | None
abi: AbiPublic | None
abi: AbiPublic
modified: datetime

class Config:
Expand Down
4 changes: 2 additions & 2 deletions app/services/contract.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ async def get_contracts(
:return:
"""
page = await self.pagination.get_page(
session, Contract.get_contracts_query(address, chain_ids)
session, Contract.get_contracts_with_abi_query(address, chain_ids)
)
count = await self.pagination.get_count(
session, Contract.get_contracts_query(address, chain_ids)
session, Contract.get_contracts_with_abi_query(address, chain_ids)
)
return page, count
18 changes: 12 additions & 6 deletions app/tests/routers/test_contracts.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,16 +20,22 @@ def setUpClass(cls):

@database_session
async def test_view_contracts(self, session: AsyncSession):
address_expected = "0x6eEF70Da339a98102a642969B3956DEa71A1096e"
address = HexBytes(address_expected)
contract = Contract(address=address, name="A Test Contracts", chain_id=1)
await contract.create(session)
response = self.client.get(
f"/api/v1/contracts/{address_expected}",
)
self.assertEqual(response.status_code, 200)
response_json = response.json()
self.assertEqual(response_json["count"], 0)
source = AbiSource(name="Etherscan", url="https://api.etherscan.io/api")
await source.create(session)
abi = Abi(abi_json=mock_abi_json, source_id=source.id)
await abi.create(session)
address_expected = "0x6eEF70Da339a98102a642969B3956DEa71A1096e"
address = HexBytes(address_expected)
contract = Contract(
address=address, name="A Test Contracts", chain_id=1, abi=abi
)
await contract.create(session)
contract.abi_id = abi.id
await contract.update(session)
response = self.client.get(
f"/api/v1/contracts/{address_expected}",
)
Expand Down
Loading