Reference
Evidence
Every contract and every settled transaction, each naming the file its value comes from - so a reader who does not trust this page can check it against the chain and against the repository.
Nothing on this page is typed by hand into a paragraph. Each row is imported from src/lib/evidence.ts, which in turn imports the addresses from src/utils/constants.ts - the same constants the running application uses. A value that changes in the app changes here.
Every hash and address below is verified against a live RPC by node scripts/verify-evidence.mjs, which fails on a transaction that did not succeed or an address with no contract at it.
Transactions
Transaction register
11 entries · 5 mainnet · 6 sepoliaFirst mainnet shield (STRK)
mainnetRegisters the viewing key and deposits into the canonical mainnet pool: 0.1 STRK shielded, 6 STRK pool fee. 17 events, 4 from the pool.
- Hash
- 0x04c4bea05417ce1062adef39b3d3b300f831ec994bbb4166d6010c4838d49193Voyager
- Status
- SUCCEEDED
- Block
- 13,281,484
- Source
- src/lib/evidence.ts
Mainnet shield (USDC)
mainnetSecond mainnet deposit. 0.2 public USDC in, 0.0395 shielded after the pool fee. 15 events, 3 from the pool.
- Hash
- 0x059eb6c1bdddd048006f372b4db6602560dbfc722536b94d59ece8abb865586eVoyager
- Status
- SUCCEEDED
- Block
- 13,288,349
- Source
- src/lib/evidence.ts
Private tokens enabled on a second account
mainnetOne apply_actions: ViewingKeySet, then 8 STRK deposited, 6 to the pool fee and 2 shielded. 17 events, 4 from the pool.
- Hash
- 0xe08fd329091b483978c64f93288b7346b158e0dc485fd7c5f594899f0294Voyager
- Status
- SUCCEEDED
- Block
- 13,948,493
- Source
- src/lib/evidence.ts
Private tokens enabled on the owner account
mainnetViewingKeySet plus a 6 STRK deposit consumed exactly by the pool fee, so the account is registered with a zero shielded balance and no note is created. 16 events, 3 from the pool.
- Hash
- 0x428d5947280d2c670162aa7a3d666bcaa4d5256e016fab460c1b7a560609578Voyager
- Status
- SUCCEEDED
- Block
- 14,522,373
- Source
- src/lib/evidence.ts
Private send and unshield on mainnet
mainnetOne apply_actions proved by the STRK20 prover through Starkscan: ViewingKeySet, Deposit of 3 STRK, two EncNoteCreated (1 STRK sent privately to the owner account, 1 STRK kept shielded) and a Withdrawal of 1 STRK back to public. 5 events from the pool.
- Hash
- 0x6342cd9a1c1f4f9cd85f6561b3d78ed196c0ee3a332b8cc1feacd89e739360eVoyager
- Status
- SUCCEEDED
- Block
- 15,768,124
- Source
- src/lib/evidence.ts
A swipe settles privately
sepoliaCard authorization selling shielded STRK and paying the merchant in USDC in one transaction.
- Hash
- 0x1f815361cd9cb1b378f208c8def10dddf5452ead190cb199a1da37adf4fe5dfVoyager
- Status
- SUCCEEDED
- Block
- 14,130,415
- Source
- src/lib/evidence.ts
Repeat swipes do not link
sepoliaShadow spend through a per-merchant identity, so two visits to one merchant do not chain.
- Hash
- 0x48ccd889292f406734d97a27c53db53910fb0f9ef3c056668bd64e20ccb111bVoyager
- Status
- SUCCEEDED
- Block
- 14,130,089
- Source
- src/lib/evidence.ts
Money arrives already shielded
sepoliaUSDC bridged from Base Sepolia over CCTP V2, landing and shielding in the same flow.
- Hash
- 0x28b053d9a670650604bf8f7ae8b67fc7f296d2f4fa630a987e7a6f775b11fe2Voyager
- Status
- SUCCEEDED
- Block
- 14,139,603
- Source
- src/lib/evidence.ts
Dinner paid and a position opened, atomically
sepoliaPool withdrew 10.24 STRK; 0.24 paid the merchant, 10 entered the vault. AuthorizationSettled + PositionOpened + OpenNoteDeposited in one receipt.
- Hash
- 0x4d94fa79724d3e997604e4a42a54daab3cc68f4ec17672b3ca9644a843e2639Voyager
- Status
- SUCCEEDED / ACCEPTED_ON_L2
- Block
- 14,109,923
- Source
- src/lib/evidence.ts
The same dinner, paid from vault shares
sepoliaPositionRedeemed plus AuthorizationSettled. Vault total_assets went 10 STRK to 0; recipient up 0.24 STRK.
- Hash
- 0x45b8c5d7a7cae0a9f98d69e92c1120c0bee831e68f9795fde00e1f3ffa3f0e0Voyager
- Status
- SUCCEEDED / ACCEPTED_ON_L2
- Block
- 14,111,945
- Source
- src/lib/evidence.ts
Hosted card authorization loop
sepoliaAuthorizationSettled for 0.5 STRK. The /api/card/status/settlements endpoint returns this receipt.
- Hash
- 0x063b3fe7e13e9baca4d0a9ca9616b7b5e71504b38ed02bb3b98512935988acf4Voyager
- Status
- SUCCEEDED / ACCEPTED_ON_L1
- Source
- src/lib/evidence.ts
Contracts
Rows marked STARKWARE are not ours: the privacy pool and the shadow anonymizer are StarkWare's deployments, used rather than redeployed. The distinction matters when you are deciding whom to trust - that cryptography is audited, and the helpers around it are not.
Contract register
11 entries · 1 mainnet · 10 sepoliaSTRK20 privacy pool
mainnetStarkWareStarkWare’s canonical privacy pool. Every shield and unshield settles through it.
- Address
- 0x040337b1af3c663e86e333bab5a4b28da8d4652a15a69beee2b677776ffe812aVoyager
- Source
- src/utils/constants.ts
STRK20 privacy pool
sepoliaStarkWareThe same pool on Sepolia, verified on chain as “Starknet: Canonical Privacy Pool”.
- Address
- 0x0254a6b2997ef52e9f830ce1f543f6b29768295e8d17e2267d672c552cfe0d91Voyager
- Source
- src/utils/constants.ts
ShadowAccountAnonymizer
sepoliaStarkWareOfficial anonymizer giving a deterministic per-merchant spend identity. Not redeployed by us.
- Address
- 0x010a2285310c107c731d997afc147afb7495daff6397c2d242133d9fe8d9b147Voyager
- Source
- src/utils/constants.ts
CardSettlementAnonymizer
sepoliaSettles an approved swipe from the hosted account, with an on-chain replay map and daily limit.
- Address
- 0x074dcd5ee5e0fbfdcf25a7cbc3408711de19fccdf46e8f53c71d35e795f5390aVoyager
- Source
- strk20.json
CardProgramAnonymizer
sepoliaCard policy in a contract: per-swipe cap, daily cap, blocked categories.
- Address
- 0x059524ff1c689a45b92e0ff02c752b261805409ff5940721aa4c382ac6b572a4Voyager
- Source
- strk20.json
JIT converter
sepoliaSells shielded STRK for USDC at settlement time, on Ekubo-quoted calldata through a pinned AVNU router.
- Address
- 0x04a36f2fab9bbb37f190971755ed84c1be11e95c3664b5948f25854410669f99Voyager
- Source
- src/utils/constants.ts
EarnVault
sepoliaLending vault a swipe can open a position in. Exposes allowance so the pool can pull the share note.
- Address
- 0x076811f28a950b5c6ddaa02bd323b5fccb572676ff57bbc3b979a430f0acda8bVoyager
- Source
- src/utils/constants.ts
Earn adapter
sepoliaAdapter between the card program and the vault.
- Address
- 0x0137d48e53d94333568cedfe8c261b7f3c8ff9206636f6f759c87137da5631f7Voyager
- Source
- src/utils/constants.ts
ProgrammableSpendAnonymizer
sepoliaOpens a position and pays N recipients, then re-shields the change, in one privacy_invoke.
- Address
- 0x0604a76fd7f50d4856cadbc1b6c45908d3be856fde267435124b7a74a7dcbbb0Voyager
- Source
- src/utils/constants.ts
PrivateSpendAnonymizer
sepoliaPays a recipient and re-shields the change atomically.
- Address
- 0x054d94bbe6640e1258a1961ab1226fcb7cb0a9bfdcd72dab8857195e552dc334Voyager
- Source
- src/utils/constants.ts
PrivatePayoutAnonymizer
sepoliaOne-way outbound payout helper.
- Address
- 0x042fd2df34df378e33c2c0cbc3e0183974b2ca69c0d222da2326a5bfd64ec2c3Voyager
- Source
- src/utils/constants.ts
Retired
Listed rather than deleted. A deployment that was live and then abandoned is exactly what a reader deserves to find named, and this one's failure is the most instructive bug in the repository - see the vault.
Retired register
1 entryEarnVault (retired)
sepoliaRetiredThe first vault class. It had no allowance entrypoint, so the pool could not pull the share note and the atomic dinner-plus-lend reverted with “entrypoint does not exist”.
- Address
- 0x00474c6b220a15919770a58dad4b4ea19c30b9972a3620c5a16cee8f752068bbVoyager
- Source
- strk20.json
What this does not prove
The source repository is github.com/kamalbuilds/neobank, and the contract work is at starknet-shadow-account-starter.