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 {
        ETH_DEPOSIT_INITIATED,
        ETH_WITHDRAWAL_FINALIZED,
        ERC20_DEPOSIT_INITIATED,
        ERC20_WITHDRAWAL_FINALIZED,
    }:
        # Make sure that we are decoding a supported event.
        return DEFAULT_DECODING_OUTPUT
    # Read information from event's topics & data
    if context.tx_log.topics[0] in {ETH_DEPOSIT_INITIATED, ETH_WITHDRAWAL_FINALIZED}:
        asset = A_ETH.resolve_to_crypto_asset()
        raw_amount = hex_or_bytes_to_int(context.tx_log.data[:32])
        amount = asset_normalized_value(raw_amount, asset)
        from_address = hex_or_bytes_to_address(context.tx_log.topics[1])
        to_address = hex_or_bytes_to_address(context.tx_log.topics[2])
    else:  # ERC20_DEPOSIT_INITIATED and ERC20_WITHDRAWAL_FINALIZED
        ethereum_token_address = hex_or_bytes_to_address(context.tx_log.topics[1])
        asset = EvmToken(evm_address_to_identifier(
            address=ethereum_token_address,
            chain_id=ChainID.ETHEREUM,
            token_type=EvmTokenKind.ERC20,
        ))
        raw_amount = hex_or_bytes_to_int(context.tx_log.data[32:64])
        amount = asset_normalized_value(raw_amount, asset)
        from_address = hex_or_bytes_to_address(context.tx_log.topics[3])
        to_address = hex_or_bytes_to_address(context.tx_log.data[:32])
    expected_event_type, new_event_type, from_chain, to_chain, expected_location_label = bridge_prepare_data(  # noqa: E501
        tx_log=context.tx_log,
        deposit_events=(ETH_DEPOSIT_INITIATED, ERC20_DEPOSIT_INITIATED),
        main_chain=ChainID.ETHEREUM,
        l2_chain=ChainID.OPTIMISM,
        from_address=from_address,
        to_address=to_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 == BRIDGE_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