Checksum address and check contract owner

pull/1062/head
kompotkot 2024-04-30 12:13:05 +00:00
rodzic e700efff5b
commit 12345e42a3
2 zmienionych plików z 40 dodań i 12 usunięć

Wyświetl plik

@ -432,14 +432,34 @@ def create_request_calls(
def get_call_request_from_tuple( def get_call_request_from_tuple(
db_session: Session, registered_contract_id, requests: Set[Tuple[str, str]] db_session: Session,
metatx_requester_id: uuid.UUID,
requests: Set[Tuple[str, str]],
contract_id: Optional[uuid.UUID] = None,
contract_address: Optional[str] = None,
) -> List[CallRequest]: ) -> List[CallRequest]:
existing_requests = ( if contract_id is None and contract_address is None:
raise ValueError(
"At least one of contract_id or contract_address must be specified"
)
query = (
db_session.query(CallRequest) db_session.query(CallRequest)
.filter(CallRequest.registered_contract_id == registered_contract_id) .join(
RegisteredContract,
CallRequest.registered_contract_id == RegisteredContract.id,
)
.filter(RegisteredContract.metatx_requester_id == metatx_requester_id)
.filter(tuple_(CallRequest.caller, CallRequest.request_id).in_(requests)) .filter(tuple_(CallRequest.caller, CallRequest.request_id).in_(requests))
.all()
) )
if contract_id is not None:
query = query.filter(RegisteredContract.id == contract_id)
if contract_address is not None:
query = query.filter(
RegisteredContract.address == Web3.toChecksumAddress(contract_address)
)
existing_requests = query.all()
return existing_requests return existing_requests

Wyświetl plik

@ -14,6 +14,7 @@ from bugout.data import BugoutUser
from fastapi import Body, Depends, FastAPI, Form, Path, Query, Request from fastapi import Body, Depends, FastAPI, Form, Path, Query, Request
from sqlalchemy.exc import NoResultFound from sqlalchemy.exc import NoResultFound
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from web3 import Web3
from .. import contracts_actions, data, db from .. import contracts_actions, data, db
from ..middleware import ( from ..middleware import (
@ -360,14 +361,21 @@ async def create_requests(
At least one of `contract_id` or `contract_address` must be provided in the request body. At least one of `contract_id` or `contract_address` must be provided in the request body.
""" """
if verify is True: if verify is True:
requests: Set[Tuple[str, str]] = { try:
(r.caller, r.request_id) for r in data.specifications requests: Set[Tuple[str, str]] = {
} (Web3.toChecksumAddress(r.caller), r.request_id)
existing_requests = contracts_actions.get_call_request_from_tuple( for r in data.specifications
db_session=db_session, }
registered_contract_id=data.contract_id, existing_requests = contracts_actions.get_call_request_from_tuple(
requests=requests, db_session=db_session,
) metatx_requester_id=user.id,
requests=requests,
contract_id=data.contract_id,
contract_address=data.contract_address,
)
except Exception as err:
logger.error(repr(err))
raise EngineHTTPException(status_code=500)
if len(existing_requests) != 0: if len(existing_requests) != 0:
existing_request_ids = [str(r.request_id) for r in existing_requests] existing_request_ids = [str(r.request_id) for r in existing_requests]