Holders to Requesters and no defaults, small fixes

pull/882/head
kompotkot 2023-08-07 12:10:21 +00:00
rodzic 927eb85c94
commit eab292e815
5 zmienionych plików z 75 dodań i 72 usunięć

Wyświetl plik

@ -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'])

Wyświetl plik

@ -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(

Wyświetl plik

@ -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)

Wyświetl plik

@ -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

Wyświetl plik

@ -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: