SIGN IN SIGN UP

feat(singular): add $singularDeviceId subscriber attribute for Singular V2 (#4072)

### Checklist
- [x] If applicable, unit tests
- [ ] If applicable, create follow-up issues for the other native SDK
and hybrids

### Motivation

Singular's Event Endpoint V2 (mandatory for Singular accounts created on
or after
2026-07-15) requires an `sdid`. The SDID is generated by the Singular
SDK, so
`collectDeviceIdentifiers()` cannot derive it — the app has to hand it
to us.

Part of
[INT-101](https://linear.app/revenuecat/issue/INT-101/support-singular-event-endpoint-v2-with-sdid)
([Slack
thread](https://revenuecat.slack.com/archives/C03HPN9UE80/p1786706850769159)).

### Description

New reserved attribution attribute `$singularDeviceId` plus a
`setSingularDeviceID`
setter, following the existing Kochava/Airbridge/Solar Engine
attribution ID pattern.
The backend side (Singular V2 payload) lands separately in Khepri.

Only the local test/lint suites were run; CI covers the rest.

<!-- CURSOR_SUMMARY -->
---

> [!NOTE]
> **Low Risk**
> Additive subscriber-attribute API following an established pattern; no
changes to purchase, auth, or billing flows.
> 
> **Overview**
> Adds support for passing Singular’s **SDID** into RevenueCat via a new
reserved subscriber attribute **`$singularDeviceId`** and public
**`setSingularDeviceID`**, mirroring other attribution ID setters
(Kochava, Airbridge, Solar Engine). Apps must supply the ID from the
Singular SDK because **`collectDeviceIdentifiers()`** cannot produce
it—needed for **Singular Event Endpoint V2**.
> 
> The setter flows through **`PurchasesOrchestrator`** into
**`subscriberAttributesManager.setAttributionID`**. Public API surface
is updated (`api-defauts.txt`, api-tester), plus a unit test reusing the
existing attribution ID test helper.
> 
> <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit
0d1242dbe8b5516b6332ea33586d6b4d31d5a828. Bugbot is set up for automated
code reviews on this repo. Configure
[here](https://www.cursor.com/dashboard/bugbot).</sup>
<!-- /CURSOR_SUMMARY -->

---------

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: Álvaro Brey <alvaro.brey@revenuecat.com>
G
Guillem Corominas committed
68b12a7a5f10ff48595b119a54e57f3019617f12
Parent: 9e1e8eb
Committed by GitHub <noreply@github.com> on 8/25/2026, 3:23:51 PM