diff --git a/engineapi/alembic/versions/b4257b10daaf_call_request_types_and_metatx_holders.py b/engineapi/alembic/versions/b4257b10daaf_call_request_types_and_metatx_holders.py index a2f69860..5771e8da 100644 --- a/engineapi/alembic/versions/b4257b10daaf_call_request_types_and_metatx_holders.py +++ b/engineapi/alembic/versions/b4257b10daaf_call_request_types_and_metatx_holders.py @@ -1,4 +1,4 @@ -"""Call request types and Metatx holders +"""Call request types and Metatx requesters Revision ID: b4257b10daaf Revises: dedd8a7d0624 @@ -38,8 +38,7 @@ def upgrade(): op.create_foreign_key(op.f('fk_registered_contracts_blockchain_id_blockchains'), 'registered_contracts', 'blockchains', ['blockchain_id'], ['id'], ondelete='CASCADE') # Manual - Start - op.execute(f"INSERT INTO blockchains (id, name, chain_id, testnet) VALUES ('{str(uuid.uuid4())}', 'polygon', 137, FALSE);") - op.execute(f"INSERT INTO blockchains (id, name, chain_id, testnet) VALUES ('{str(uuid.uuid4())}', 'mumbai', 80001, TRUE);") + op.execute(f"INSERT INTO blockchains (id, name, chain_id, testnet) VALUES ('{str(uuid.uuid4())}', 'ethereum', 1, FALSE),('{str(uuid.uuid4())}', 'polygon', 137, FALSE),('{str(uuid.uuid4())}', 'mumbai', 80001, TRUE),('{str(uuid.uuid4())}', 'wyrm', 322, FALSE),('{str(uuid.uuid4())}', 'zksync_era', 324, FALSE),('{str(uuid.uuid4())}', 'zksync_era_testnet', 280, TRUE),('{str(uuid.uuid4())}', 'gnosis', 100, FALSE);") op.execute("UPDATE registered_contracts SET blockchain_id = (SELECT id FROM blockchains WHERE blockchains.name = registered_contracts.blockchain);") op.alter_column("registered_contracts", "blockchain_id", nullable=False) # Manual - End @@ -63,8 +62,7 @@ def upgrade(): op.create_foreign_key(op.f('fk_call_requests_call_request_type_id_call_request_types'), 'call_requests', 'call_request_types', ['call_request_type_id'], ['id'], ondelete='CASCADE') # Manual - Start - op.execute(f"INSERT INTO call_request_types (id, request_type, description) VALUES ('{str(uuid.uuid4())}', 'raw', 'A generic smart contract. You can ask users to submit arbitrary calldata to this contract.');") - op.execute(f"INSERT INTO call_request_types (id, request_type, description) VALUES ('{str(uuid.uuid4())}', 'dropper-v0.2.0', 'A Dropper v0.2.0 contract. You can authorize users to submit claims against this contract.');") + op.execute(f"INSERT INTO call_request_types (id, request_type, description) VALUES ('{str(uuid.uuid4())}', 'raw', 'A generic smart contract. You can ask users to submit arbitrary calldata to this contract.'),('{str(uuid.uuid4())}', 'dropper-v0.2.0', 'A Dropper v0.2.0 contract. You can authorize users to submit claims against this contract.');") op.execute("UPDATE call_requests SET call_request_type_id = (SELECT call_request_types.id FROM call_request_types INNER JOIN registered_contracts ON call_requests.registered_contract_id = registered_contracts.id WHERE call_request_types.request_type = registered_contracts.contract_type);") op.alter_column("call_requests", "call_request_type_id", nullable=False) # Manual - End @@ -73,25 +71,25 @@ def upgrade(): op.drop_column('registered_contracts', 'contract_type') # Holders - op.create_table('metatx_holders', + op.create_table('metatx_requesters', sa.Column('id', sa.UUID(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), server_default=sa.text("TIMEZONE('utc', statement_timestamp())"), nullable=False), - sa.PrimaryKeyConstraint('id', name=op.f('pk_metatx_holders')), - sa.UniqueConstraint('id', name=op.f('uq_metatx_holders_id')) + sa.PrimaryKeyConstraint('id', name=op.f('pk_metatx_requesters')), + sa.UniqueConstraint('id', name=op.f('uq_metatx_requesters_id')) ) - op.add_column('call_requests', sa.Column('metatx_holder_id', sa.UUID(), nullable=True)) - op.create_foreign_key(op.f('fk_call_requests_metatx_holder_id_metatx_holders'), 'call_requests', 'metatx_holders', ['metatx_holder_id'], ['id'], ondelete='CASCADE') - op.add_column('registered_contracts', sa.Column('metatx_holder_id', sa.UUID(), nullable=True)) - op.create_foreign_key(op.f('fk_registered_contracts_metatx_holder_id_metatx_holders'), 'registered_contracts', 'metatx_holders', ['metatx_holder_id'], ['id'], ondelete='CASCADE') + op.add_column('call_requests', sa.Column('metatx_requester_id', sa.UUID(), nullable=True)) + op.create_foreign_key(op.f('fk_call_requests_metatx_requester_id_metatx_requesters'), 'call_requests', 'metatx_requesters', ['metatx_requester_id'], ['id'], ondelete='CASCADE') + op.add_column('registered_contracts', sa.Column('metatx_requester_id', sa.UUID(), nullable=True)) + op.create_foreign_key(op.f('fk_registered_contracts_metatx_requester_id_metatx_requesters'), 'registered_contracts', 'metatx_requesters', ['metatx_requester_id'], ['id'], ondelete='CASCADE') # Manual - Start - op.execute("INSERT INTO metatx_holders (id) SELECT DISTINCT moonstream_user_id FROM registered_contracts ON CONFLICT (id) DO NOTHING;") - op.execute("INSERT INTO metatx_holders (id) SELECT DISTINCT moonstream_user_id FROM call_requests ON CONFLICT (id) DO NOTHING;") - op.execute("UPDATE registered_contracts SET metatx_holder_id = moonstream_user_id;") - op.execute("UPDATE call_requests SET metatx_holder_id = moonstream_user_id;") - op.alter_column("call_requests", "metatx_holder_id", nullable=False) - op.alter_column("registered_contracts", "metatx_holder_id", nullable=False) + op.execute("INSERT INTO metatx_requesters (id) SELECT DISTINCT moonstream_user_id FROM registered_contracts ON CONFLICT (id) DO NOTHING;") + op.execute("INSERT INTO metatx_requesters (id) SELECT DISTINCT moonstream_user_id FROM call_requests ON CONFLICT (id) DO NOTHING;") + op.execute("UPDATE registered_contracts SET metatx_requester_id = moonstream_user_id;") + op.execute("UPDATE call_requests SET metatx_requester_id = moonstream_user_id;") + op.alter_column("call_requests", "metatx_requester_id", nullable=False) + op.alter_column("registered_contracts", "metatx_requester_id", nullable=False) # Manual - End op.drop_index('ix_call_requests_moonstream_user_id', table_name='call_requests') @@ -100,7 +98,7 @@ def upgrade(): op.drop_column('registered_contracts', 'moonstream_user_id') # Other - op.create_unique_constraint(op.f('uq_registered_contracts_blockchain_id'), 'registered_contracts', ['blockchain_id', 'metatx_holder_id', 'address']) + op.create_unique_constraint(op.f('uq_registered_contracts_blockchain_id'), 'registered_contracts', ['blockchain_id', 'metatx_requester_id', 'address']) op.create_unique_constraint(op.f('uq_call_requests_id'), 'call_requests', ['id']) op.create_unique_constraint(op.f('uq_registered_contracts_id'), 'registered_contracts', ['id']) @@ -152,18 +150,18 @@ def downgrade(): op.create_index('ix_call_requests_moonstream_user_id', 'call_requests', ['moonstream_user_id'], unique=False) # Manual - Start - op.execute("UPDATE registered_contracts SET moonstream_user_id = metatx_holder_id;") - op.execute("UPDATE call_requests SET moonstream_user_id = metatx_holder_id;") + op.execute("UPDATE registered_contracts SET moonstream_user_id = metatx_requester_id;") + op.execute("UPDATE call_requests SET moonstream_user_id = metatx_requester_id;") op.alter_column("registered_contracts", "moonstream_user_id", nullable=False) op.alter_column("call_requests", "moonstream_user_id", nullable=False) # Manual - End - op.drop_constraint(op.f('fk_registered_contracts_metatx_holder_id_metatx_holders'), 'registered_contracts', type_='foreignkey') - op.drop_column('registered_contracts', 'metatx_holder_id') - op.drop_constraint(op.f('fk_call_requests_metatx_holder_id_metatx_holders'), 'call_requests', type_='foreignkey') - op.drop_column('call_requests', 'metatx_holder_id') + op.drop_constraint(op.f('fk_registered_contracts_metatx_requester_id_metatx_requesters'), 'registered_contracts', type_='foreignkey') + op.drop_column('registered_contracts', 'metatx_requester_id') + op.drop_constraint(op.f('fk_call_requests_metatx_requester_id_metatx_requesters'), 'call_requests', type_='foreignkey') + op.drop_column('call_requests', 'metatx_requester_id') - op.drop_table('metatx_holders') + op.drop_table('metatx_requesters') # Other op.create_unique_constraint('uq_registered_contracts_blockchain', 'registered_contracts', ['blockchain', 'moonstream_user_id', 'address', 'contract_type']) diff --git a/engineapi/engineapi/contracts_actions.py b/engineapi/engineapi/contracts_actions.py index 5c7a8476..37b76c17 100644 --- a/engineapi/engineapi/contracts_actions.py +++ b/engineapi/engineapi/contracts_actions.py @@ -18,7 +18,7 @@ from .models import ( Blockchain, CallRequest, CallRequestType, - MetatxHolder, + MetatxRequester, RegisteredContract, ) @@ -55,7 +55,7 @@ def parse_registered_contract_response( id=obj[0].id, blockchain=obj[1].name, address=obj[0].address, - metatx_holder_id=obj[0].metatx_holder_id, + metatx_requester_id=obj[0].metatx_requester_id, title=obj[0].title, description=obj[0].description, image_uri=obj[0].image_uri, @@ -71,7 +71,7 @@ def parse_call_request_response( id=obj[0].id, contract_id=obj[0].registered_contract_id, contract_address=obj[1].address, - metatx_holder_id=obj[0].metatx_holder_id, + metatx_requester_id=obj[0].metatx_requester_id, call_request_type=obj[2].request_type, caller=obj[0].caller, method=obj[0].method, @@ -122,7 +122,7 @@ def register_contract( db_session: Session, blockchain_name: str, address: str, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, title: Optional[str], description: Optional[str], image_uri: Optional[str], @@ -139,14 +139,18 @@ def register_contract( if blockchain is None: raise UnsupportedBlockchain("Unsupported blockchain specified") - metatx_holder_stmt = insert(MetatxHolder.__table__).values(id=metatx_holder_id) - metatx_holder_stmt_do_nothing_stmt = metatx_holder_stmt.on_conflict_do_nothing() - db_session.execute(metatx_holder_stmt_do_nothing_stmt) + metatx_requester_stmt = insert(MetatxRequester.__table__).values( + id=metatx_requester_id + ) + metatx_requester_stmt_do_nothing_stmt = ( + metatx_requester_stmt.on_conflict_do_nothing() + ) + db_session.execute(metatx_requester_stmt_do_nothing_stmt) contract = RegisteredContract( blockchain_id=blockchain.id, address=Web3.toChecksumAddress(address), - metatx_holder_id=metatx_holder_id, + metatx_requester_id=metatx_requester_id, title=title, description=description, image_uri=image_uri, @@ -166,7 +170,7 @@ def register_contract( def update_registered_contract( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, contract_id: uuid.UUID, title: Optional[str] = None, description: Optional[str] = None, @@ -174,7 +178,7 @@ def update_registered_contract( ignore_nulls: bool = True, ) -> Tuple[RegisteredContract, Blockchain]: """ - Update the registered contract with the given contract ID provided that the user with metatx_holder_id + Update the registered contract with the given contract ID provided that the user with metatx_requester_id has access to it. """ contract_with_blockchain = ( @@ -182,7 +186,7 @@ def update_registered_contract( .join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id) .filter( RegisteredContract.id == contract_id, - RegisteredContract.metatx_holder_id == metatx_holder_id, + RegisteredContract.metatx_requester_id == metatx_requester_id, ) .one() ) @@ -210,7 +214,7 @@ def update_registered_contract( def get_registered_contract( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, contract_id: uuid.UUID, ) -> Tuple[RegisteredContract, Blockchain]: """ @@ -219,7 +223,7 @@ def get_registered_contract( contract_with_blockchain = ( db_session.query(RegisteredContract, Blockchain) .join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id) - .filter(RegisteredContract.metatx_holder_id == metatx_holder_id) + .filter(RegisteredContract.metatx_requester_id == metatx_requester_id) .filter(RegisteredContract.id == contract_id) .one() ) @@ -230,7 +234,7 @@ def get_registered_contract( def lookup_registered_contracts( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, blockchain: Optional[str] = None, address: Optional[str] = None, limit: int = 10, @@ -242,7 +246,7 @@ def lookup_registered_contracts( query = ( db_session.query(RegisteredContract, Blockchain) .join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id) - .filter(RegisteredContract.metatx_holder_id == metatx_holder_id) + .filter(RegisteredContract.metatx_requester_id == metatx_requester_id) ) if blockchain is not None: @@ -263,7 +267,7 @@ def lookup_registered_contracts( def delete_registered_contract( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, registered_contract_id: uuid.UUID, ) -> Tuple[RegisteredContract, Blockchain]: """ @@ -273,7 +277,7 @@ def delete_registered_contract( contract_with_blockchain = ( db_session.query(RegisteredContract, Blockchain) .join(Blockchain, Blockchain.id == RegisteredContract.blockchain_id) - .filter(RegisteredContract.metatx_holder_id == metatx_holder_id) + .filter(RegisteredContract.metatx_requester_id == metatx_requester_id) .filter(RegisteredContract.id == registered_contract_id) .one() ) @@ -293,7 +297,7 @@ def delete_registered_contract( def request_calls( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, registered_contract_id: Optional[uuid.UUID], contract_address: Optional[str], call_specs: List[data.CallSpecification], @@ -317,7 +321,7 @@ def request_calls( # Check that the moonstream_user_id matches a RegisteredContract with the given id or address query = db_session.query(RegisteredContract).filter( - RegisteredContract.metatx_holder_id == metatx_holder_id + RegisteredContract.metatx_requester_id == metatx_requester_id ) if registered_contract_id is not None: @@ -331,7 +335,7 @@ def request_calls( try: registered_contract = query.one() except NoResultFound: - raise ValueError("Invalid registered_contract_id or metatx_holder_id") + raise ValueError("Invalid registered_contract_id or metatx_requester_id") # Normalize the caller argument using Web3.toChecksumAddress contract_type = ContractType(registered_contract.contract_type) @@ -487,7 +491,7 @@ def list_call_requests( def delete_requests( db_session: Session, - metatx_holder_id: uuid.UUID, + metatx_requester_id: uuid.UUID, request_ids: List[uuid.UUID] = [], ) -> int: """ @@ -496,7 +500,7 @@ def delete_requests( try: requests_to_delete_query = ( db_session.query(CallRequest) - .filter(CallRequest.metatx_holder_id == metatx_holder_id) + .filter(CallRequest.metatx_requester_id == metatx_requester_id) .filter(CallRequest.id.in_(request_ids)) ) requests_to_delete_num: int = requests_to_delete_query.delete( diff --git a/engineapi/engineapi/data.py b/engineapi/engineapi/data.py index 65be0006..b9f4dd61 100644 --- a/engineapi/engineapi/data.py +++ b/engineapi/engineapi/data.py @@ -254,14 +254,14 @@ class RegisteredContractResponse(BaseModel): id: UUID blockchain: Optional[str] = None address: str - metatx_holder_id: UUID + metatx_requester_id: UUID title: Optional[str] = None description: Optional[str] = None image_uri: Optional[str] = None created_at: datetime updated_at: datetime - @validator("id", "metatx_holder_id") + @validator("id", "metatx_requester_id") def validate_uuids(cls, v): return str(v) @@ -303,7 +303,7 @@ class CallRequestResponse(BaseModel): id: UUID contract_id: UUID contract_address: Optional[str] = None - metatx_holder_id: UUID + metatx_requester_id: UUID call_request_type: Optional[str] = None caller: str method: str @@ -315,7 +315,7 @@ class CallRequestResponse(BaseModel): class Config: orm_mode = True - @validator("id", "contract_id", "metatx_holder_id") + @validator("id", "contract_id", "metatx_requester_id") def validate_uuids(cls, v): return str(v) diff --git a/engineapi/engineapi/models.py b/engineapi/engineapi/models.py index 636c4e39..f750a8d2 100644 --- a/engineapi/engineapi/models.py +++ b/engineapi/engineapi/models.py @@ -181,17 +181,16 @@ class CallRequestType(Base): # type: ignore ) -class MetatxHolder(Base): # type: ignore +class MetatxRequester(Base): # type: ignore """ - MetatxHolder represents id of user from bugout authorization. + MetatxRequester represents id of user from bugout authorization. """ - __tablename__ = "metatx_holders" + __tablename__ = "metatx_requesters" id = Column( UUID(as_uuid=True), primary_key=True, - default=uuid.uuid4, unique=True, ) @@ -201,12 +200,12 @@ class MetatxHolder(Base): # type: ignore registered_contracts = relationship( "RegisteredContract", - back_populates="metatx_holder", + back_populates="metatx_requester", cascade="all, delete, delete-orphan", ) call_requests = relationship( "CallRequest", - back_populates="metatx_holder", + back_populates="metatx_requester", cascade="all, delete, delete-orphan", ) @@ -236,7 +235,7 @@ class RegisteredContract(Base): # type: ignore __table_args__ = ( UniqueConstraint( "blockchain_id", - "metatx_holder_id", + "metatx_requester_id", "address", ), ) @@ -247,9 +246,9 @@ class RegisteredContract(Base): # type: ignore default=uuid.uuid4, unique=True, ) - metatx_holder_id = Column( + metatx_requester_id = Column( UUID(as_uuid=True), - ForeignKey("metatx_holders.id", ondelete="CASCADE"), + ForeignKey("metatx_requesters.id", ondelete="CASCADE"), nullable=False, ) blockchain_id = Column( @@ -279,7 +278,9 @@ class RegisteredContract(Base): # type: ignore cascade="all, delete, delete-orphan", ) - metatx_holder = relationship("MetatxHolder", back_populates="registered_contracts") + metatx_requester = relationship( + "MetatxRequester", back_populates="registered_contracts" + ) blockchain = relationship("Blockchain", back_populates="registered_contracts") @@ -303,9 +304,9 @@ class CallRequest(Base): ForeignKey("call_request_types.id", ondelete="CASCADE"), nullable=False, ) - metatx_holder_id = Column( + metatx_requester_id = Column( UUID(as_uuid=True), - ForeignKey("metatx_holders.id", ondelete="CASCADE"), + ForeignKey("metatx_requesters.id", ondelete="CASCADE"), nullable=False, ) @@ -330,7 +331,7 @@ class CallRequest(Base): "RegisteredContract", back_populates="call_requests" ) call_request_type = relationship("CallRequestType", back_populates="call_requests") - metatx_holder = relationship("MetatxHolder", back_populates="call_requests") + metatx_requester = relationship("MetatxRequester", back_populates="call_requests") class Leaderboard(Base): # type: ignore diff --git a/engineapi/engineapi/routes/metatx.py b/engineapi/engineapi/routes/metatx.py index 35841266..02159000 100644 --- a/engineapi/engineapi/routes/metatx.py +++ b/engineapi/engineapi/routes/metatx.py @@ -103,7 +103,7 @@ async def list_registered_contracts_route( registered_contracts_with_blockchain = ( contracts_actions.lookup_registered_contracts( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, blockchain=blockchain, address=address, limit=limit, @@ -136,7 +136,7 @@ async def get_registered_contract_route( try: contract_with_blockchain = contracts_actions.get_registered_contract( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, contract_id=contract_id, ) except NoResultFound: @@ -167,7 +167,7 @@ async def register_contract_route( try: contract_with_blockchain = contracts_actions.register_contract( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, blockchain_name=contract.blockchain, address=contract.address, title=contract.title, @@ -206,7 +206,7 @@ async def update_contract_route( try: contract_with_blockchain = contracts_actions.update_registered_contract( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, contract_id=contract_id, title=update_info.title, description=update_info.description, @@ -243,7 +243,7 @@ async def delete_contract_route( try: deleted_contract_with_blockchain = contracts_actions.delete_registered_contract( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, registered_contract_id=contract_id, ) except Exception as err: @@ -356,7 +356,7 @@ async def create_requests( try: num_requests = contracts_actions.request_calls( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, registered_contract_id=data.contract_id, contract_address=data.contract_address, call_specs=data.specifications, @@ -386,7 +386,7 @@ async def delete_requests( try: deleted_requests = contracts_actions.delete_requests( db_session=db_session, - metatx_holder_id=request.state.user.id, + metatx_requester_id=request.state.user.id, request_ids=request_ids, ) except Exception as err: