ORRANGE / Architecture

Private Identity

In ORRANGE, your private identity is the STRK20 user identity — a deterministic, Ready-derived account address. It is not a Shadow Account.

Terminology

This implementation uses two interchangeable terms for the same thing:

  • STRK20 Private Identity — used in the product UI.
  • Private Treasury Identity — the same address in the treasury context (the source of every AI-executed private transfer).

How it is derived

Privy public key


computeReadyAccountAddress(publicKey, classHash)


Ready-derived account address  ← STRK20 user identity


owns private notes · registers viewing key · sources every private transfer

For the Privy lane, ORRANGE derives the counterfactual Ready account address from the Privy wallet’s Starknet public key using computeReadyAccountAddress(salt = public key, Ready v0.4.0 class hash, deployer = 0). This derived address is the real on-chain account. It is not Privy’s wallet.address, which differs.

It is the STRK20 user

The integration passes this address as the STRK20 SDK user. That user:

  • is the owner of private notes (discoverNotes(user, viewingKey, …)),
  • registers the viewing key, and
  • is the source account of every private transfer.

In the treasury, this identity is recorded as the policy’s selfTransferAddress: a proposal whose recipient equals it is rejected deterministically as a meaningless self-transfer.

The Ready/Wallet-API lane

When you connect an external privacy wallet (Ready) instead of the Privy lane, the connected account is the STRK20 identity — there is no separate derivation. The wallet owns the viewing key and performs discovery against the same identity.

What we do not use

No Shadow Account. The STRK20 SDK includes a separate shadow_account_anonymizer — an on-chain anonymizer sub-account keyed bycompute_identity_key(user, viewingKey, anonymizerAddress) plus a dapp name, exposed via ShadowAccountsBuilder.invoke. ORRANGE does not integrate it: the adapter never passes a shadowAccountAnonymizerAddress. The Ready-derived address above is the private identity — not the SDK’s Shadow Account concept. This is verified by theaiShadowAccount test in the repository.

For how this identity feeds the treasury copilot’s policy, see AI + Policy Architecture.