Enables AI agents (e.g. OpenClaw) to understand and use Krump Verify for on-chain move verification against Story IP. Use when the user or agent needs to verify a dance move, pay via USDC.k or x402/EVVM receipt, call KrumpVerify contracts, integrate with ClawHub (clawhub.ai), or build similar EVVM/x402 apps on Story Aeneid.
Use this skill when working with ClawHub and Krump Verify: on-chain verification of dance moves against registered Story IP, with payment in USDC.k or via x402/EVVM payment receipts. Agents can perform verifications autonomously; humans can audit on-chain.
Building a similar app? See docs/BUILDING_WITH_EVVM_X402_STORY_AENEID.md for step-by-step EVVM/x402/USDC.k on Story Aeneid: architecture, failures (EVVM payment failed, IP registry, funding UX), and fixes.
Verified(ipId, verifier, receiptHash, timestamp) is emitted.https://aeneid.storyscan.io.verificationFee = 1e6 (1 USDC.k). Read from contract verificationFee().approve(KrumpVerify, verificationFee) on USDC.k contract.verifyMove(ipId, moveDataHash, proof) on KrumpVerify. Contract does transferFrom(msg.sender, treasury, verificationFee) then records receipt."pay" and (to, '', token, amount, 0n); executor address(0); use getNextCurrentSyncNonce(payer) and isAsyncExec: false.verifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId). No on-chain transfer; receipt is consumed once. msg.sender must equal the receipt’s payer.Use the receipt flow when the agent or user has already paid via x402 and has a receiptId (bytes32) to use.
"pay" then (to, identity, token, amount, priorityFee); executor must be 0x0; use sync nonce from Core and isAsyncExec: false.| Term | Type | Description |
|---|---|---|
| ipId | address | Story IP account address (from IP Asset Registry). Must be registered. |
| moveDataHash | bytes32 | keccak256 of move/video data (e.g. keccak256(toHex(utf8MoveData))). |
| proof | bytes | Optional; e.g. signature or reference. Can be 0x. |
| paymentReceiptId / receiptId | bytes32 | For receipt flow: id of the payment receipt submitted by relayer (0x + 64 hex). |
| receiptHash | bytes32 | Returned from verify; unique per (ipId, verifier, moveDataHash, timestamp, fee, proof). |
verificationFee(), paymentReceipts(bytes32) → (payer, amount, used), receiptUsed(bytes32).verifyMove(ipId, moveDataHash, proof), verifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId).submitPaymentReceipt(receiptId, payer, amount).Verified(ipId, verifier, receiptHash, timestamp), PaymentReceiptSubmitted(receiptId, payer, amount).Agents can discover a user’s unused receipts by querying PaymentReceiptSubmitted(payer=user) and filtering with paymentReceipts(receiptId).used == false.
0x012eD5BfDd306Fa7e959383A8dD63213b7c7AeA5 (override with VITE_KRUMP_VERIFY_ADDRESS).0x602789919332d242A1Cb70d462CEbb570a53A6Ac.0xa2e9245cE7D7B89554E86334a76fbE6ac5dc4617.0xd35890acdf3BFFd445C2c7fC57231bDE5cAFbde5.0x977126dd6B03cAa3A87532784E6B7757aBc9C1cc.0xa6a02E8e17b819328DDB16A0ad31dD83Dd14BA3b. EVVM Native x402 Adapter: 0xDf5eaED856c2f8f6930d5F3A5BCE5b5d7E4C73cc.relayer/ — RELAYER_PRIVATE_KEY, KRUMP_VERIFY_ADDRESS; runs on port 7350. Frontend VITE_X402_RELAYER_URL for local: http://localhost:7350.https://krump-x402-relayer.fly.dev. Set fly secrets set RELAYER_PRIVATE_KEY=0x...; frontend VITE_X402_RELAYER_URL=https://krump-x402-relayer.fly.dev.script/DeployAll.s.sol — deploys KrumpTreasury, KrumpVerify (with Story IP/License/Royalty set), KrumpVerifyNFT; deployer gets RECEIPT_SUBMITTER_ROLE. Optional RELAYER_ADDRESS in env to grant role to another address../deploy.sh or forge script script/DeployAll.s.sol:DeployAll --rpc-url https://aeneid.storyrpc.io --broadcast --gas-price 10000000000 --legacy. See DEPLOY.md.verifyMoveWithReceipt. Or it can approve USDC.k and call verifyMove.Verified / PaymentReceiptSubmitted events, and receiptUsed / paymentReceipts state.approve(USDC.k) then verifyMove(ipId, moveDataHash, proof).verifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId) (payer must be msg.sender).submitPaymentReceipt(receiptId, payer, amount); require amount >= verificationFee, payer != 0, receipt not already submitted.