def METHOD_NAME(self, context: DecoderContext) -> DecodingOutput:
    """Decodes a bridging event. Either a deposit or a withdrawal"""
    if context.tx_log.topics[0] not in {DEPOSIT_FINALIZED, WITHDRAWAL_INITIATED}:
        return DEFAULT_DECODING_OUTPUT
    # Read information from event's topics & data
    ethereum_token_address = hex_or_bytes_to_address(context.tx_log.topics[1])
    optimism_token_address = hex_or_bytes_to_address(context.tx_log.topics[2])
    from_address = hex_or_bytes_to_address(context.tx_log.topics[3])
    to_address = hex_or_bytes_to_address(context.tx_log.data[:32])
    raw_amount = hex_or_bytes_to_int(context.tx_log.data[32:64])
    if ethereum_token_address == ZERO_ADDRESS:
        # This means that ETH was bridged
        asset = A_OPTIMISM_ETH.resolve_to_evm_token()
    else:
        # Otherwise it is a ERC20 token bridging event
        try:
            asset = EvmToken(identifier=evm_address_to_identifier(
                address=optimism_token_address,
                chain_id=ChainID.OPTIMISM,
                token_type=EvmTokenKind.ERC20,
            ))
        except (UnknownAsset, WrongAssetType):
            # can't call `notify_user`` since we don't have any particular event here.
            log.error(f'Failed to resolve asset with address {optimism_token_address} to an optimism token')  # noqa: E501
            return DEFAULT_DECODING_OUTPUT
    amount = asset_normalized_value(asset=asset, amount=raw_amount)
    expected_event_type, new_event_type, from_chain, to_chain, expected_location_label = bridge_prepare_data(  # noqa: E501
        tx_log=context.tx_log,  # args are opposite here due to the way logs are
        deposit_events=(WITHDRAWAL_INITIATED,),
        main_chain=ChainID.OPTIMISM,
        l2_chain=ChainID.ETHEREUM,
        from_address=to_address,
        to_address=from_address,
    )
    # Find the corresponding transfer event and update it
    for event in context.decoded_events:
        if (
            event.event_type == expected_event_type and
            event.location_label == expected_location_label and
            event.address == ZERO_ADDRESS and
            event.asset == asset and
            event.balance.amount == amount
        ):
            bridge_match_transfer(
                event=event,
                from_address=from_address,
                to_address=to_address,
                from_chain=from_chain,
                to_chain=to_chain,
                amount=amount,
                asset=asset,
                expected_event_type=expected_event_type,
                new_event_type=new_event_type,
                counterparty=OPTIMISM_CPT_DETAILS,
            )
    return DEFAULT_DECODING_OUTPUT