Permission and proof for autonomous agents on Monad.
MONAD | Gate binds an agent wallet to a human principal, lets that principal set a narrow action policy, blocks actions outside the policy, and emits an on-chain attestation for allowed actions.
- Identity — Atlas is registered to a human principal who remains liable.
- Deny — Run the preloaded
100 MONaction against a10 MONcap. - Allow — Click Set amount to 5 MON, then run it again.
- Prove — In live mode, open the transaction receipt on MonadVision.
The UI starts in safe demo mode, so this complete fail-to-pass story works without a wallet, RPC, or deployed contract.
monad-gate-blitz/
├── contracts/
│ ├── src/MonadGate.sol # Register, Policy, Gate, Attest
│ ├── test/MonadGate.t.sol # deny, allow, authorization tests
│ └── script/Deploy.s.sol
├── packages/abi/
│ ├── gate.json # frozen UI/contract interface
│ └── addresses.json # Monad testnet handoff
├── ui/ # React + TypeScript + ethers
└── docs/ # build, deployment, testing, lanes, demo
Start with:
docs/DOC-SYSTEM.mddocs/BUILD-SPEC.mddocs/IMPLEMENTATION-LANES.mddocs/OPEN-QUESTIONS.md
Requirements: Node 20+ and npm.
cd ui
npm install
npm run devOpen http://localhost:5173.
For a production check:
npm run buildCopy the environment template and add the deployed contract address:
cd ui
cp .env.example .envVITE_GATE_ADDRESS=0x...
VITE_EXPLORER_BASE=https://testnet.monadvision.com
VITE_RPC_URL=https://testnet-rpc.monad.xyzRestart the UI. A connected wallet will then send valid executeGated calls to Monad testnet. Registration and policy setup are intentionally principal-signed contract operations; the demo UI presents their current state and focuses the live interaction on the judge-facing fail/pass story.
Requirements: Foundry.
cd contracts
forge test -vv
forge script script/Deploy.s.sol:Deploy \
--rpc-url https://testnet-rpc.monad.xyz \
--broadcastUse a funded burner key through Foundry's secure wallet/keystore flow. Never commit a private key or .env.
registerAgent(agent, principal, label)
setPolicy(agent, maxSpend, allowedActionId, active)
executeGated(actionId, amount, resultHash)executeGated can only be called by the registered agent. It reverts unless the policy is active, the action ID matches, and the amount is at or below the cap. A successful call emits ActionAttested, tying together the agent, principal, action, amount, and off-chain result hash.
This hackathon build deliberately excludes multi-chain support, payments custody, full compliance workflows, agent swarms, and a marketing site. It is the smallest credible permission-and-proof layer for the Monad agent economy.