Skills clawhub-krump-verify
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.
git clone https://github.com/openclaw/skills
T=$(mktemp -d) && git clone --depth=1 https://github.com/openclaw/skills "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/arunnadarasa/krumpverify" ~/.claude/skills/clawdbot-skills-clawhub-krump-verify && rm -rf "$T"
skills/arunnadarasa/krumpverify/SKILL.mdClawHub & Krump Verify for Agents
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.
What Krump Verify Does
- Verification: Prove a move (hash of move/video data) against a registered Story IP asset. Fee is paid to treasury; a receipt is recorded on-chain and
is emitted.Verified(ipId, verifier, receiptHash, timestamp) - Chain: Story Aeneid (chain ID 1315). Explorer:
.https://aeneid.storyscan.io - Fee: USDC.k (6 decimals). Default
= 1e6 (1 USDC.k). Read from contractverificationFee
.verificationFee()
Two Payment Flows
1. Direct (wallet pays on-chain)
- User/agent approves USDC.k for KrumpVerify:
on USDC.k contract.approve(KrumpVerify, verificationFee) - Call
on KrumpVerify. Contract doesverifyMove(ipId, moveDataHash, proof)
then records receipt.transferFrom(msg.sender, treasury, verificationFee)
2. Receipt (x402 / EVVM; agent-friendly)
- Fund EVVM (one-time per payer): Approve USDC.k for EVVM Treasury, then call Treasury.deposit(USDC.k, amount) so the payer has EVVM internal balance.
- Sign x402 + EVVM: User signs EIP-712 TransferWithAuthorization (domain = adapter) and an EVVM message: hash payload must include
and (to, '', token, amount, 0n); executor"pay"
; use getNextCurrentSyncNonce(payer) and isAsyncExec: false.address(0) - Relayer (with RECEIPT_SUBMITTER_ROLE) calls adapter payViaEVVMWithX402(...) then submitPaymentReceipt(receiptId, payer, amount).
- Payer calls
. No on-chain transfer; receipt is consumed once.verifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId)
must equal the receipt’smsg.sender
.payer
Use the receipt flow when the agent or user has already paid via x402 and has a
receiptId (bytes32) to use.
EVVM / x402 Pitfalls (Reference)
- "EVVM payment failed" on adapter: Hash payload must encode
then (to, identity, token, amount, priorityFee); executor must be 0x0; use sync nonce from Core and isAsyncExec: false."pay" - "IP registry not set": Contract’s IP Asset Registry (and License/Royalty if used) must be set at deploy or via setter.
- No EVVM balance: Payer must complete Fund EVVM (approve + deposit to EVVM Treasury) before Pay via x402.
Key Data Shapes
| Term | Type | Description |
|---|---|---|
| ipId | address | Story IP account address (from IP Asset Registry). Must be registered. |
| moveDataHash | bytes32 | of move/video data (e.g. ). |
| proof | bytes | Optional; e.g. signature or reference. Can be . |
| 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). |
Contract Surface (KrumpVerify)
- Read:
,verificationFee()
→ (payer, amount, used),paymentReceipts(bytes32)
.receiptUsed(bytes32) - Write (anyone):
,verifyMove(ipId, moveDataHash, proof)
.verifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId) - Write (RECEIPT_SUBMITTER_ROLE):
.submitPaymentReceipt(receiptId, payer, amount) - Events:
,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.
Default Addresses (Story Aeneid)
- KrumpVerify:
(override with0x012eD5BfDd306Fa7e959383A8dD63213b7c7AeA5
).VITE_KRUMP_VERIFY_ADDRESS - KrumpVerifyNFT:
.0x602789919332d242A1Cb70d462CEbb570a53A6Ac - KrumpTreasury:
.0xa2e9245cE7D7B89554E86334a76fbE6ac5dc4617 - USDC.k:
.0xd35890acdf3BFFd445C2c7fC57231bDE5cAFbde5 - EVVM Treasury:
.0x977126dd6B03cAa3A87532784E6B7757aBc9C1cc - EVVM Core:
. EVVM Native x402 Adapter:0xa6a02E8e17b819328DDB16A0ad31dD83Dd14BA3b
.0xDf5eaED856c2f8f6930d5F3A5BCE5b5d7E4C73cc
Relayer
- Local:
—relayer/
,RELAYER_PRIVATE_KEY
; runs on port 7350. FrontendKRUMP_VERIFY_ADDRESS
for local:VITE_X402_RELAYER_URL
.http://localhost:7350 - Production: Fly.io app krump-x402-relayer at
. Sethttps://krump-x402-relayer.fly.dev
; frontendfly secrets set RELAYER_PRIVATE_KEY=0x...
.VITE_X402_RELAYER_URL=https://krump-x402-relayer.fly.dev
Deploy (Contracts)
- Script:
— deploys KrumpTreasury, KrumpVerify (with Story IP/License/Royalty set), KrumpVerifyNFT; deployer gets RECEIPT_SUBMITTER_ROLE. Optionalscript/DeployAll.s.sol
in env to grant role to another address.RELAYER_ADDRESS - Command:
or./deploy.sh
. See DEPLOY.md.forge script script/DeployAll.s.sol:DeployAll --rpc-url https://aeneid.storyrpc.io --broadcast --gas-price 10000000000 --legacy
Agent Autonomy and Human Oversight
- Autonomous use: An agent with a wallet (or delegated signing) can pay via x402 (after Fund EVVM), have a relayer submit a receipt, then call
. Or it can approve USDC.k and callverifyMoveWithReceipt
.verifyMove - Human check: All verifications and payment receipts are on-chain; humans can audit via explorer,
/Verified
events, andPaymentReceiptSubmitted
/receiptUsed
state.paymentReceipts - Repo: Contract and frontend in this repo; frontend supports Fund EVVM, “Pay via x402”, “Load my receipts”, and “Verify with receipt”.
Quick Reference
- Verify with wallet payment:
thenapprove(USDC.k)
.verifyMove(ipId, moveDataHash, proof) - Verify with receipt:
(payer must beverifyMoveWithReceipt(ipId, moveDataHash, proof, paymentReceiptId)
).msg.sender - Submit receipt (relayer only):
; requiresubmitPaymentReceipt(receiptId, payer, amount)
, payer != 0, receipt not already submitted.amount >= verificationFee - EVVM/x402 build guide: docs/BUILDING_WITH_EVVM_X402_STORY_AENEID.md.
For full contract and env details, see repo README and DEPLOY.md and
src/KrumpVerify.sol.