Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
38 changes: 29 additions & 9 deletions bridge_indexer/handlers/rollup_message.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import orjson
from dipdup.models import IndexStatus
from pydantic import BaseModel
from pydantic import ValidationError
from pytezos import MichelsonRuntimeError
from pytezos import MichelsonType
from pytezos import michelson_to_micheline
Expand All @@ -20,14 +21,15 @@
from bridge_indexer.handlers.ticket import FAST_WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE
from bridge_indexer.handlers.ticket import WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE
from bridge_indexer.handlers.ticket import TicketService
from bridge_indexer.models import BridgeOperation, json_dumps_fallback
from bridge_indexer.models import BridgeOperation
from bridge_indexer.models import BridgeOperationStatus
from bridge_indexer.models import BridgeWithdrawOperation
from bridge_indexer.models import RollupCementedCommitment
from bridge_indexer.models import RollupInboxMessage
from bridge_indexer.models import RollupInboxMessageType
from bridge_indexer.models import RollupOutboxMessage
from bridge_indexer.models import TezosTicket
from bridge_indexer.models import json_dumps_fallback
from bridge_indexer.types.fast_withdrawal.tezos_parameters.default import (
DefaultParameter as ExecuteOutboxMessageFastWithdrawalDefaultParameter,
)
Expand All @@ -53,6 +55,10 @@
from bridge_indexer.types.rollup.tezos_storage import RollupStorage


_WITHDRAW_MICHELSON_TYPE = MichelsonType.match(michelson_to_micheline(WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE))
_FAST_WITHDRAW_MICHELSON_TYPE = MichelsonType.match(michelson_to_micheline(FAST_WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE))


class InboxMessageService:
@classmethod
async def _read_inbox_level(cls, inbox_level: int) -> AsyncGenerator[RollupInboxMessage, None]:
Expand Down Expand Up @@ -97,6 +103,26 @@ def estimate_outbox_message_cemented_level(cls, outbox_level: int, lcc_inbox_lev
async def find_by_index(cls, outbox_level: int, index: int):
return await RollupOutboxMessage.get(level=outbox_level, index=index)

@staticmethod
def extract_l1_amount(message: dict) -> int:
try:
parameters_micheline = message['transactions'][0]['parameters']
except (KeyError, IndexError, TypeError) as e:
raise ValueError(f'Outbox message has no transaction parameters: {message}') from e

for michelson_type, parameter_cls in (
(_WITHDRAW_MICHELSON_TYPE, ExecuteOutboxMessageTicketerWithdrawParameter),
(_FAST_WITHDRAW_MICHELSON_TYPE, ExecuteOutboxMessageFastWithdrawalDefaultParameter),
):
try:
parameters_data = michelson_type.from_micheline_value(parameters_micheline).to_python_object()
parameters = parameter_cls.model_validate(parameters_data)
except (ValueError, MichelsonRuntimeError, ValidationError):
continue
return parameters.ticket.amount

raise ValueError(f"Can't extract ticket.amount from outbox message: {message}")

async def update_proof(self):
head_data = await self._tzkt.get_head_block()
async for bridge_withdraw_operation in BridgeWithdrawOperation.filter(
Expand Down Expand Up @@ -423,10 +449,7 @@ async def from_outbox_message(self, ticket_service: TicketService) -> str:
transaction = outbox_message['message']['transactions'][0]
parameters_micheline = transaction['parameters']

micheline_expression = michelson_to_micheline(WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE)
michelson_type = MichelsonType.match(micheline_expression)

parameters_data = michelson_type.from_micheline_value(parameters_micheline).to_python_object()
parameters_data = _WITHDRAW_MICHELSON_TYPE.from_micheline_value(parameters_micheline).to_python_object()
parameters: ExecuteOutboxMessageTicketerWithdrawParameter = ExecuteOutboxMessageTicketerWithdrawParameter.model_validate(
parameters_data
)
Expand Down Expand Up @@ -463,10 +486,7 @@ async def from_fast_outbox_message(self, ticket_service: TicketService) -> str:
transaction = outbox_message['message']['transactions'][0]
parameters_micheline = transaction['parameters']

micheline_expression = michelson_to_micheline(FAST_WITHDRAW_MICHELSON_OUTBOX_MESSAGE_INTERFACE)
michelson_type = MichelsonType.match(micheline_expression)

parameters_data = michelson_type.from_micheline_value(parameters_micheline).to_python_object()
parameters_data = _FAST_WITHDRAW_MICHELSON_TYPE.from_micheline_value(parameters_micheline).to_python_object()
parameters: ExecuteOutboxMessageFastWithdrawalDefaultParameter = (
ExecuteOutboxMessageFastWithdrawalDefaultParameter.model_validate(parameters_data)
)
Expand Down
12 changes: 12 additions & 0 deletions bridge_indexer/handlers/tezos/on_rollup_execute.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from tortoise.exceptions import DoesNotExist

from bridge_indexer.handlers.bridge_matcher_locks import BridgeMatcherLocks
from bridge_indexer.handlers.rollup_message import OutboxMessageService
from bridge_indexer.models import BridgeOperation
from bridge_indexer.models import BridgeOperationKind
from bridge_indexer.models import BridgeOperationStatus
Expand Down Expand Up @@ -75,6 +76,16 @@ async def on_rollup_execute(
)
return

try:
amount = OutboxMessageService.extract_l1_amount(outbox_message.message)
except ValueError:
ctx.logger.warning(
'Could not extract ticket.amount from outbox message %s/%s',
outbox_message.level,
outbox_message.index,
)
amount = None

withdrawal = await TezosWithdrawOperation.create(
timestamp=execute.data.timestamp,
level=execute.data.level,
Expand All @@ -84,6 +95,7 @@ async def on_rollup_execute(
initiator=execute.data.initiator_address,
sender=execute.data.sender_address,
target=execute.data.target_address,
amount=amount,
outbox_message=outbox_message,
)

Expand Down
Loading