
MynaAgent
AI agent in a wallet tied to Japan's national ID. Claims benefits for you, proves you qualify in ZK
Demo
About
MynaAgent is an AI agent that runs as a mini app inside MynaWallet, and this weekend we built its first version. MynaWallet is our wallet app. You can only open it after verifying yourself with Japan's national ID, the My Number Card. Each card gets exactly one wallet address, so every address belongs to one verified person. MynaWallet was a finalist at ETHGlobal Tokyo 2023 and launched commercially in July 2026. We built the agent to handle many kinds of tasks for the verified person who holds the wallet. Its first job is claiming public benefits. Many public benefits in Japan are paid only if you apply. Miss the notice or forget the deadline, and the money never reaches you. MynaAgent applies for you. Ask it which benefits you can get. It searches the benefit office, explains what you will need to prove, and files the claim once you agree. In the demo, the benefit is for people aged 20 or older, so the claim needs a proof of age. You tap your card on your iPhone and enter its PIN. The phone makes a zero-knowledge proof that you are 20 or older, and the office receives that proof instead of your birth date or your certificate. A contract on Polygon checks the proof and pays the benefit in JPYC, a yen stablecoin, straight to your wallet in the same transaction. The office registers each benefit and its amount in the contract, and the demo benefit pays 500 JPYC. The payout rules depend on what MynaWallet already guarantees. The office knows the wallet belongs to a verified person, and one card maps to one wallet, so one payout per wallet means one payout per person. The agent holds no key, no money and no proof. The language model never sees the proof, only the result "proof ok". The contract decides who gets paid, and anyone can audit every payout without seeing names, addresses or birth dates. We think paying this way could also help the city that pays, though we have not confirmed that with any city. Paying by bank transfer means collecting each person's account details, and we expect that checking them and fixing mistyped numbers takes real work. MynaWallet is an account-abstraction wallet tied to a verified person, so the office pays that wallet directly, with no account number to collect or mistype. In July 2026, Japan's Cabinet approved a plan to connect AI agents to public services through the My Number Card. About 104.5 million people, 84% of the population, hold the card (Ministry of Internal Affairs and Communications, end of August 2026). Next on our roadmap is proving residency the same way, because city benefits are for the city's residents. After that we plan to add other procedures that need your national ID. Today everything runs on the Polygon Amoy testnet against a demo benefit office. MynaWallet's development environment uses JPKI test cards, so the demo uses one. We also ran the whole flow with a real My Number Card on the first version of our verifier.
How it's made
Two things existed before the weekend: MynaWallet, our team's app, and ZeroKeyMate, an earlier project by one of us that gave us the age circuit and the native prover. We built the rest this weekend: the contracts, the Worker, the agent mini app and the card flow in the wallet. The proof. The circuit is jpki_age from ZeroKeyMate, written in Noir. Inside the proof it checks four things. The card's signing certificate was signed by a J-LIS root (RSA-2048, SHA-256). The certificate follows the J-LIS signing certificate profile, including its signing policy. The card signed the claim hash and a nonce from the office. The birth date shows the holder is 20 or older in Japan time. This weekend we changed one check so that it also accepts JPKI test cards. We generate the proof with ProveKit's Groth16 backend (an experimental branch), built as a Rust library and called from an Expo module. It takes about 12 seconds on an iPhone 16 Pro, and the proof is 384 bytes. The contracts (Solidity, Foundry, Polygon Amoy). BenefitAgeGate checks that the proof belongs to this claim and is inside a 15-minute window. It also checks that the card chains to a root key hard-coded in the contract, and it only calls the verifier whose code hash it pinned at deploy time. BenefitOffice computes the claim hash itself from chain id, office, benefit, recipient and amount, so a proof can't be reused for another wallet. Then it verifies and pays JPYC in one transaction, about 669k gas. The benefit office is a Cloudflare Worker (Hono, viem, D1). It issues the challenge, checks the proof with eth_call, simulates claim() and only then sends it from an operator key. In BenefitOffice, the operator key can call only claim(). The same Worker forwards the agent's requests to Claude, with the system prompt and the tool list fixed on the server. The agent loop runs in a mini app inside MynaWallet. It runs the tools and keeps the proof out of the conversation, so the model only ever sees "proof ok". In the wallet (React Native, Expo) we added Myna.jpki.prove: a consent sheet, NFC reading and a TypeScript witness builder. The card signs twice in one NFC session. One signature goes into the proof. The other goes to MynaWallet's existing eKYC check. That check asks the JPKI service to verify the card, then compares the holder with the logged-in user, so you can't use someone else's card. Why Polygon. Benefits are paid in yen, so the payout has to be a yen stablecoin. We use JPYC, and Polygon is one of the chains JPYC is issued on (MynaWallet already handles JPYC on Polygon). For the hackathon we used the Amoy testnet, which has a JPYC test token.