Use `user-${email}` instead of raw `email` as the Openfort player label,
matching the flow-service convention. Openfort rejects colons in labels,
and both codepaths must use the same format so users get the same wallet
regardless of whether they on-ramp via rfunds.online or rspace.online.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- OpenfortProvider.findOrCreateWallet() searches by player name before
creating, ensuring the same email always maps to the same wallet
- Fund claims endpoint expires old pending claims before creating new ones
- Added expireFundClaim() to db layer
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace flow-service proxy for user-onramp with direct Coinbase + Openfort
provider calls. Eliminates double-hop dependency and simplifies deployment.
- Add CoinbaseOnrampProvider (Ed25519 JWT → CDP session → widget URL)
- Add OpenfortProvider (smart wallet creation on Base)
- Initialize providers from env vars in onInit()
- Update folk-flows-app to support Coinbase widget alongside Transak
- Add jose and @openfort/openfort-node dependencies
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>