[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H08MEQYDFT75F5EEEWSTAK":3,"skill-same:01M6H08MEQYDFT75F5EEEWSTAK":78},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":16,"sourceHtmlUrl":17,"categories":18,"keywords":19,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":44,"repositoryHtmlUrl":45,"repositoryHomepageUrl":6,"ownerHtmlUrl":46,"ownerBlogUrl":47,"ownerDescription":48,"updatedAt":49,"install":50,"resources":63},"01M6H08MEQYDFT75F5EEEWSTAK","send-a-cross-domain-message-and-verify-it",null,"Use when sending a message or value between L1 and L2 through the canonical messenger and you must confirm delivery on the destination, not just submission.","jiayaoqijia\u002Fcryptoskill","jiayaoqijia","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1453879?v=4","01M6GMYTX7Q7S504VC6E756ENR","YQ","01M6GMYV1QKJ1CC75MTTGT9PR0",81,"MIT","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it\u002FSKILL.md",[],[20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35],"verify","message","domain","it","send a cross domain message and verify it","send","just","use","delivery","you","canonical","messenger","l2","value","submission","when","2026-11-10 10:12:30",false,"---\nname: send-a-cross-domain-message-and-verify-it\ndescription: Use when sending a message or value between L1 and L2 through the canonical messenger and you must confirm delivery on the destination, not just submission.\n---\n\n# Send a cross-domain message and verify it\n\nSubmitting a cross-domain message is only the first half: the destination messenger relays it\nasynchronously, and a message can be sent successfully yet never execute (or execute and revert), so\nverification reads the destination's own delivery record.\n\n## Procedure\n\n1. Pick the canonical messenger, not a token bridge. OP Stack exposes `L1CrossDomainMessenger`\n   (0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1 on mainnet) and its L2 counterpart\n   (0x4200000000000000000000000000000000000007). Arbitrum uses its Inbox\u002FOutbox and retryable tickets.\n\n2. Send with a sufficient `minGasLimit` \u002F L2 gas limit for the destination call; too low and the relay\n   reverts and the message must be replayed.\n\n       cast send $L1_CROSS_DOMAIN_MESSENGER \\\n         \"sendMessage(address,bytes,uint32)\" $TARGET $CALLDATA 200000 \\\n         --value 0 --rpc-url $L1RPC --private-key $KEY\n\n3. Capture the `messageHash` from the `SentMessage` event on the source chain. On OP Stack the hash is\n   `keccak256(abi.encodeWithSignature(\"relayedMessage(bytes32)\", hash))`-related; read it from logs:\n\n       cast logs --address $L1_CROSS_DOMAIN_MESSENGER \"SentMessage(address,address,bytes,uint256,uint256)\" --rpc-url $L1RPC\n\n4. Verify delivery by reading the destination messenger's record, which is authoritative:\n\n       cast call $L2_CROSS_DOMAIN_MESSENGER \"successfulMessages(bytes32)(bool)\" $MSG_HASH --rpc-url $L2RPC\n\n   `true` means it executed; `false` after the message was sent means it is pending or failed.\n\n5. Confirm the *effect*, not just the flag. Read the state the destination call was supposed to change,\n   because a relayed-but-reverted message can leave `successfulMessages` untouched while the target is\n   unchanged.\n\n6. For Arbitrum retryable tickets, read the ticket's status; a failed ticket can be redeemed manually\n   with the same calldata, so treat \"created but not executed\" as recoverable:\n\n       cast call $ARB_RETRYABLE \"...\" ... --rpc-url $L1RPC   # or use the Arbitrum SDK status\n\n7. Record source tx, message hash, destination tx, and the verified state change together.\n\n## Pitfalls\n\n- Treating a successful L1 send as delivery; the relay is a separate step and can be delayed or fail.\n- Under-providing the destination gas limit — the classic reason an OP cross-domain message reverts.\n- Verifying `successfulMessages` on the wrong messenger (the L1 one when awaiting L2 delivery).\n- Confusing a token bridge message with a messenger message; the two have distinct contracts and\n  events.\n- Ignoring that a reverted Arbitrum retryable is still redeemable (and will expire if not), leaving\n  funds stranded.\n\n## Verification\n\n    cast call $L2_CROSS_DOMAIN_MESSENGER \"successfulMessages(bytes32)(bool)\" $MSG_HASH --rpc-url $L2RPC\n    cast receipt $DEST_TXHASH --rpc-url $L2RPC --field status\n    cast call $TARGET \"balanceOf(address)(uint256)\" $BENEFICIARY --rpc-url $L2RPC\n\nReport the source tx, the `SentMessage` hash, the destination delivery flag, and the observed target\nstate change, each with the call that produced it.\n","# Send a cross-domain message and verify it\n\nSubmitting a cross-domain message is only the first half: the destination messenger relays it\nasynchronously, and a message can be sent successfully yet never execute (or execute and revert), so\nverification reads the destination's own delivery record.\n\n## Procedure\n\n1. Pick the canonical messenger, not a token bridge. OP Stack exposes `L1CrossDomainMessenger`\n   (0x25ace71c97B33Cc4729CF772ae268934F7ab5fA1 on mainnet) and its L2 counterpart\n   (0x4200000000000000000000000000000000000007). Arbitrum uses its Inbox\u002FOutbox and retryable tickets.\n\n2. Send with a sufficient `minGasLimit` \u002F L2 gas limit for the destination call; too low and the relay\n   reverts and the message must be replayed.\n\n       cast send $L1_CROSS_DOMAIN_MESSENGER \\\n         \"sendMessage(address,bytes,uint32)\" $TARGET $CALLDATA 200000 \\\n         --value 0 --rpc-url $L1RPC --private-key $KEY\n\n3. Capture the `messageHash` from the `SentMessage` event on the source chain. On OP Stack the hash is\n   `keccak256(abi.encodeWithSignature(\"relayedMessage(bytes32)\", hash))`-related; read it from logs:\n\n       cast logs --address $L1_CROSS_DOMAIN_MESSENGER \"SentMessage(address,address,bytes,uint256,uint256)\" --rpc-url $L1RPC\n\n4. Verify delivery by reading the destination messenger's record, which is authoritative:\n\n       cast call $L2_CROSS_DOMAIN_MESSENGER \"successfulMessages(bytes32)(bool)\" $MSG_HASH --rpc-url $L2RPC\n\n   `true` means it executed; `false` after the message was sent means it is pending or failed.\n\n5. Confirm the *effect*, not just the flag. Read the state the destination call was supposed to change,\n   because a relayed-but-reverted message can leave `successfulMessages` untouched while the target is\n   unchanged.\n\n6. For Arbitrum retryable tickets, read the ticket's status; a failed ticket can be redeemed manually\n   with the same calldata, so treat \"created but not executed\" as recoverable:\n\n       cast call $ARB_RETRYABLE \"...\" ... --rpc-url $L1RPC   # or use the Arbitrum SDK status\n\n7. Record source tx, message hash, destination tx, and the verified state change together.\n\n## Pitfalls\n\n- Treating a successful L1 send as delivery; the relay is a separate step and can be delayed or fail.\n- Under-providing the destination gas limit — the classic reason an OP cross-domain message reverts.\n- Verifying `successfulMessages` on the wrong messenger (the L1 one when awaiting L2 delivery).\n- Confusing a token bridge message with a messenger message; the two have distinct contracts and\n  events.\n- Ignoring that a reverted Arbitrum retryable is still redeemable (and will expire if not), leaving\n  funds stranded.\n\n## Verification\n\n    cast call $L2_CROSS_DOMAIN_MESSENGER \"successfulMessages(bytes32)(bool)\" $MSG_HASH --rpc-url $L2RPC\n    cast receipt $DEST_TXHASH --rpc-url $L2RPC --field status\n    cast call $TARGET \"balanceOf(address)(uint256)\" $BENEFICIARY --rpc-url $L2RPC\n\nReport the source tx, the `SentMessage` hash, the destination delivery flag, and the observed target\nstate change, each with the call that produced it.\n",{"name":5,"description":7},"main","3df1d0d67b30ff15236561f8c0f9f06d33f42dfd","skills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it",17,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia","https:\u002F\u002Feth2030.com","Hardcore infra. Building @alt-research and applied cryptography.","2026-11-14 02:27:51",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add jiayaoqijia\u002Fcryptoskill --skill send-a-cross-domain-message-and-verify-it",{"tool":56,"command":57},"bunx","bunx skills add jiayaoqijia\u002Fcryptoskill --skill send-a-cross-domain-message-and-verify-it",{"tool":59,"command":60},"pnpm","pnpm dlx skills add jiayaoqijia\u002Fcryptoskill --skill send-a-cross-domain-message-and-verify-it","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it\u002FSKILL.md",true,[64,68,74],{"path":65,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":16},"LICENSE","许可证",1063,{"path":69,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":72,"sourceHtmlUrl":73},"SOURCE.md","REFERENCE","参考文档",367,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it\u002FSOURCE.md",{"path":75,"resourceType":70,"resourceTypeDesc":71,"sizeBytes":76,"sourceHtmlUrl":77},"TRUST.auto.yaml",2196,"https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-send-a-cross-domain-message-and-verify-it\u002FTRUST.auto.yaml",[79,107,130,148,161,171],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":83,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":36},"01M712C436EQYE43342Q4E7GG1","recipe-performance","Diagnose a specific MetaMask user flow's real-app performance and Sentry critical-user-flow telemetry with deterministic mm-harness recipes. Use for CUF boundaries, cold\u002Fwarm\u002Fbackground-resume behavior, latency regressions, lifecycle tags, duplicate or blocking network requests, long tasks, layout\u002Fpaint cost, screen redraws, React rerenders, or browser trace analysis where tests alone cannot prove the real app.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fwallets\u002Fmetamask-official-recipe-performance\u002FSKILL.md",[],[87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106],"performance","recipe performance","recipe","mm","sentry","harness","app","deterministic","recipes","flow","cold","critical","analysis","tasks","react","browser","layout","screen","network","metamask",{"skillNo":108,"name":109,"nameZh":6,"description":110,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":36},"01M70XT2F8A5CQZ81JBP98KSW3","mexc-spot-websocket","MEXC Spot WebSocket workflows for public streams, protobuf handling, depth maintenance, listen keys, and private streams without exposing API keys.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-websocket\u002FSKILL.md",[],[116,117,118,119,120,121,122,123,124,125,126,127,128,129],"mexc spot websocket","spot","websocket","api","workflows","public","listen","streams","depth","keys","for","api keys","maintenance","protobuf",{"skillNo":131,"name":132,"nameZh":6,"description":133,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":134,"sourceHtmlUrl":135,"categories":136,"keywords":137,"publishedAt":36},"01M70XT0MBXN3WZY1BKN0CPNKR","mexc-spot-rest","MEXC Spot REST workflows for public data, signed account requests, orders, wallet\u002Fadmin actions, and secure signing without exposing API keys.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-spot-rest\u002FSKILL.md",[],[138,117,139,140,141,142,143,127,126,125,144,145,146,121,147,120,119],"mexc spot rest","REST","admin","signing","Wallet","requests","actions","secure","data","orders",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":111,"licenseFileUrl":152,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":36},"01M70XSYSVZ2N0N91XCAR2CAK0","mexc-futures-websocket","MEXC Futures WebSocket workflows for public streams, private account\u002Forder\u002Fposition streams, ping\u002Fpong, subscriptions, and depth maintenance.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fexchanges\u002Fmncrftfrcnm-mexc-futures-websocket\u002FSKILL.md",[],[156,157,118,158,159,128,126,160,124,123,121,120],"mexc futures websocket","futures","position","ping","subscriptions",{"skillNo":162,"name":163,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":164,"sourceHtmlUrl":165,"categories":166,"keywords":167,"publishedAt":36},"01M6H0ZWHVE5W04WG2DKQE2SQC","0xklen-version-and-refresh-sanctions-lists","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-version-and-refresh-sanctions-lists\u002FSKILL.md",[],[168,169,170],"refresh","0xklen version and refresh sanctions lists","version",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":175,"sourceHtmlUrl":176,"categories":177,"keywords":178,"publishedAt":36},"01M6H0Z28Q3R8J0S799GJQWXM3","verify-tests-cover-changed-lines","Use when a PR adds code that the existing suite may not exercise. Measures patch coverage — the share of newly changed lines hit by tests — before approving.","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fjiayaoqijia\u002Fcryptoskill\u002Fblob\u002Fmain\u002Fskills\u002Fpayments\u002F0xklen-verify-tests-cover-changed-lines\u002FSKILL.md",[],[179,180,181,20,182,183,184,27,185,186,187],"tests","cover","verify tests cover changed lines","coverage","pr","exercise","patch","code","share"]