PageSourceSearch

https://www.evvm.info/assets/js/44bc9683.cd8fd50d.js

js evvm.info collected 2026-10-05 08:29:08 UTC 20,530 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdocumentation=globalThis.webpackChunkdocumentation||[]).push([[804],{8453:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>c});var i=r(6540);const s={},t=i.createContext(s);function o(e){const n=i.useContext(t);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),i.createElement(t.Provider,{value:n},e.children)}},9540:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>d,contentTitle:()=>c,default:()=>h,frontMatter:()=>o,metadata:()=>i,toc:()=>a});const i=JSON.parse('{"id":"Contracts/Treasury/TreasuryCrosschain/ExternalChainStation/fisherBridgeReceive","title":"fisherBridgeReceive","description":"Receives and validates Fisher bridge transactions from host chain on external chains","source":"@site/docs/04-Contracts/04-Treasury/02-TreasuryCrosschain/03-ExternalChainStation/03-fisherBridgeReceive.md","sourceDirName":"04-Contracts/04-Treasury/02-TreasuryCrosschain/03-ExternalChainStation","slug":"/Contracts/Treasury/TreasuryCrosschain/ExternalChainStation/fisherBridgeReceive","permalink":"/docs/Contracts/Treasury/TreasuryCrosschain/ExternalChainStation/fisherBridgeReceive","draft":false,"unlisted":false,"editUrl":"https://github.com/EVVM-org/documentation-website/tree/main/docs/04-Contracts/04-Treasury/02-TreasuryCrosschain/03-ExternalChainStation/03-fisherBridgeReceive.md","tags":[],"version":"current","sidebarPosition":3,"frontMatter":{"description":"Receives and validates Fisher bridge transactions from host chain on external chains","sidebar_position":3},"sidebar":"docsSidebar","previous":{"title":"depositCoin","permalink":"/docs/Contracts/Treasury/TreasuryCrosschain/ExternalChainStation/depositCoin"},"next":{"title":"fisherBridgeSendERC20","permalink":"/docs/Contracts/Treasury/TreasuryCrosschain/ExternalChainStation/fisherBridgeSendERC20"}}');var s=r(4848),t=r(8453);const o={description:"Receives and validates Fisher bridge transactions from host chain on external chains",sidebar_position:3},c="fisherBridgeReceive",d={},a=[{value:"Parameters",id:"parameters",level:2},{value:"Access Control",id:"access-control",level:2},{value:"Workflow",id:"workflow",level:2},{value:"1. Nonce Validation",id:"1-nonce-validation",level:3},{value:"2. Signature Verification",id:"2-signature-verification",level:3},{value:"3. Mark Nonce as Used",id:"3-mark-nonce-as-used",level:3},{value:"Validation-Only Function",id:"validation-only-function",level:2},{value:"Signature Message Format",id:"signature-message-format",level:2},{value:"Fisher Bridge Architecture",id:"fisher-bridge-architecture",level:2},{value:"Cross-Chain Coordination",id:"cross-chain-coordination",level:3},{value:"Nonce Synchronization",id:"nonce-synchronization",level:3},{value:"Security Features",id:"security-features",level:2},{value:"Signature Security",id:"signature-security",level:3},{value:"Access Control",id:"access-control-1",level:3},{value:"Nonce Management",id:"nonce-management",level:3},{value:"Integration with External Services",id:"integration-with-external-services",level:2},{value:"Monitor Host Chain Events",id:"monitor-host-chain-events",level:3},{value:"Execute Token Transfers",id:"execute-token-transfers",level:3},{value:"Error Handling",id:"error-handling",level:3},{value:"Error Conditions",id:"error-conditions",level:2},{value:"Usage Flow",id:"usage-flow",level:2},{value:"Coordination Requirements",id:"coordination-requirements",level:2},{value:"Signature Consistency",id:"signature-consistency",level:3},{value:"Service Integration",id:"service-integration",level:3}];function l(e){const n={a:"a",admonition:"admonition",br:"br",code:"code",h1:"h1",h2:"h2",h3:"h3",header:"header",li:"li",ol:"ol",p:"p",pre:"pre",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.header,{children:(0,s.jsx)(n.h1,{id:"fisherbridgereceive",children:"fisherBridgeReceive"})}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Function Type"}),": ",(0,s.jsx)(n.code,{children:"external"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.strong,{children:"Function Signature"}),": ",(0,s.jsx)(n.code,{children:"fisherBridgeReceive(address,address,address,uint256,uint256,uint256,bytes)"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.strong,{children:"Access Control"}),": ",(0,s.jsx)(n.code,{children:"onlyFisherExecutor"}),(0,s.jsx)(n.br,{}),"\n",(0,s.jsx)(n.strong,{children:"Returns"}),": ",(0,s.jsx)(n.code,{children:"void"})]}),"\n",(0,s.jsx)(n.p,{children:"Receives and validates Fisher bridge transactions from host chain. Verifies EIP-191 signature using asyncNonce system (independent from Core.sol) and marks nonce as used to prevent replay attacks."}),"\n",(0,s.jsx)(n.h2,{id:"parameters",children:"Parameters"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Parameter"}),(0,s.jsx)(n.th,{children:"Type"}),(0,s.jsx)(n.th,{children:"Description"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"from"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"address"})}),(0,s.jsx)(n.td,{children:"Original sender on the host chain (user requesting withdrawal)"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"addressToReceive"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"address"})}
1),(0,s.jsx)(n.td,{children:"Recipient address on the external chain"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"tokenAddress"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"address"})}),(0,s.jsxs)(n.td,{children:["Token contract address or ",(0,s.jsx)(n.code,{children:"address(0)"})," for native coin"]})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"priorityFee"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"uint256"})}),(0,s.jsx)(n.td,{children:"Fee amount paid to the fisher executor"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"amount"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"uint256"})}),(0,s.jsx)(n.td,{children:"Amount to transfer to the recipient"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"nonce"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"uint256"})}),(0,s.jsx)(n.td,{children:"User-managed sequential nonce for replay protection"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"signature"})}),(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"bytes"})}),(0,s.jsxs)(n.td,{children:["Cryptographic signature (",(0,s.jsx)(n.a,{href:"https://eips.ethereum.org/EIPS/eip-191",children:"EIP-191"}),") from the ",(0,s.jsx)(n.code,{children:"from"})," address authorizing this transaction."]})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"access-control",children:"Access Control"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-solidity",children:"modifier onlyFisherExecutor() {\n    if (msg.sender != fisherExecutor.current) {\n        revert();\n    }\n    _;\n}\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Only addresses with the current ",(0,s.jsx)(n.code,{children:"fisherExecutor"})," role can call this function."]}),"\n",(0,s.jsx)(n.h2,{id:"workflow",children:"Workflow"}),"\n",(0,s.jsx)(n.h3,{id:"1-nonce-validation",children:"1. Nonce Validation"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-solidity",children:"if (asyncNonce[from][nonce]) revert CoreError.AsyncNonceAlreadyUsed();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Checks if nonce has already been used. The External Chain Station uses ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce]"})," mapping instead of Core.sol's nonce system (which doesn't exist on external chains)."]}),"\n",(0,s.jsx)(n.h3,{id:"2-signature-verification",children:"2. Signature Verification"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-solidity",children:"if (\n    SignatureRecover.recoverSigner(\n        AdvancedStrings.buildSignaturePayload(\n            evvmID,\n            hostChainAddress.currentAddress,\n            Hash.hashDataForFisherBridge(\n                addressToReceive,\n                tokenAddress,\n                priorityFee,\n                amount\n            ),\n            fisherExecutor.current,\n            nonce,\n            true\n        ),\n        signature\n    ) != from\n) revert CoreError.InvalidSignature();\n"})}),"\n",(0,s.jsxs)(n.p,{children:["Validates EIP-191 signature by recovering the signer and comparing to ",(0,s.jsx)(n.code,{children:"from"})," address. Uses ",(0,s.jsx)(n.code,{children:"SignatureRecover.recoverSigner()"})," with payload built by ",(0,s.jsx)(n.code,{children:"AdvancedStrings.buildSignaturePayload()"}),"."]}),"\n",(0,s.jsx)(n.h3,{id:"3-mark-nonce-as-used",children:"3. Mark Nonce as Used"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-solidity",children:"asyncNonce[from][nonce] = true;\n"})}),"\n",(0,s.jsx)(n.p,{children:"Marks this nonce as consumed to prevent replay attacks."}),"\n",(0,s.jsx)(n.h2,{id:"validation-only-function",children:"Validation-Only Function"}),"\n",(0,s.jsxs)(n.p,{children:["This function serves as a validation endpoint and ",(0,s.jsx)(n.strong,{children:"does not perform token transfers"}),". Its purpose:"]}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Signature Validation"}),": Cryptographically verifies user authorization for Fisher bridge operations"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Nonce Management"}),": Tracks sequential nonces to prevent replay attacks"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Access Control"}),": Ensures only authorized Fisher executors can validate transactions"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Cross-Chain Coordination"}),": Provides secure validation for off-chain Fisher bridge processes"]}),"\n"]}),"\n",(0,s.jsxs)(n.p,{children:[(0,s.jsx)(n.strong,{children:"Note"}
1),": Actual token transfers on the external chain must be handled by separate Fisher bridge mechanisms that coordinate with this validation system."]}),"\n",(0,s.jsx)(n.h2,{id:"signature-message-format",children:"Signature Message Format"}),"\n",(0,s.jsx)(n.admonition,{type:"info",children:(0,s.jsxs)(n.p,{children:["For more information about the signature structure, refer to the ",(0,s.jsx)(n.a,{href:"/docs/SignatureStructures/Treasury/FisherBridgeSignatureStructure",children:"Fisher Bridge Signature Structure"}),"."]})}),"\n",(0,s.jsx)(n.h2,{id:"fisher-bridge-architecture",children:"Fisher Bridge Architecture"}),"\n",(0,s.jsx)(n.h3,{id:"cross-chain-coordination",children:"Cross-Chain Coordination"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Host Chain"}),": User authorizes withdrawal via ",(0,s.jsx)(n.code,{children:"fisherBridgeSend"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Event Emission"}),": Host chain emits ",(0,s.jsx)(n.code,{children:"FisherBridgeSend"})," event"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"External Chain"}),": Fisher executor calls ",(0,s.jsx)(n.code,{children:"fisherBridgeReceive"})," with same signature"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Validation"}),": External station validates signature and nonce"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Execution"}),": Off-chain services execute the actual token transfer"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"nonce-synchronization",children:"Nonce Synchronization"}),"\n",(0,s.jsxs)(n.p,{children:["The External Chain Station uses an independent ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce]"})," mapping:"]}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"NOT Core.sol"}),": External chains don't have Core.sol, so this is a separate nonce system"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"User-Managed"}),": Each user maintains their own sequential nonces"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Replay Protection"}),": Once ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce]"})," is true, that signature cannot be reused"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Coordination"}),": Both host and external chain stations mark the same nonce as used"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"security-features",children:"Security Features"}),"\n",(0,s.jsx)(n.h3,{id:"signature-security",children:"Signature Security"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"EIP-191 Compliance"}),": Standard Ethereum signed message format"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"SignatureRecover"}),": Uses ",(0,s.jsx)(n.code,{children:"SignatureRecover.recoverSigner()"})," to validate signatures"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"AdvancedStrings"}),": Payload built with ",(0,s.jsx)(n.code,{children:"AdvancedStrings.buildSignaturePayload()"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Replay Protection"}),": ",(0,s.jsx)(n.code,{children:"asyncNonce"})," mapping prevents signature reuse"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"User Authorization"}),": Cryptographic proof of user consent"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Address Binding"}),": Signature tied to specific sender address"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"access-control-1",children:"Access Control"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Fisher Authorization"}),": Only authorized executors can validate signatures"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Distributed Validation"}),": Same signature validates on both chains"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"nonce-management",children:"Nonce Management"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"AsyncNonce System"}),": Uses ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce]"})," mapping (NOT Core.sol)"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Independent System"}),": External Chain doesn't have Core.sol"]}
1),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Mark as Used"}),": Sets ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce] = true"})," after validation"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Per-User Tracking"}),": Individual nonce tracking for each user"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"integration-with-external-services",children:"Integration with External Services"}),"\n",(0,s.jsx)(n.p,{children:"Since this function only validates signatures, external services must:"}),"\n",(0,s.jsx)(n.h3,{id:"monitor-host-chain-events",children:"Monitor Host Chain Events"}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-solidity",children:"event FisherBridgeSend(\n    address indexed from,\n    address indexed addressToReceive,\n    address indexed tokenAddress,\n    uint256 priorityFee,\n    uint256 amount,\n    uint256 nonce\n);\n"})}),"\n",(0,s.jsx)(n.h3,{id:"execute-token-transfers",children:"Execute Token Transfers"}),"\n",(0,s.jsx)(n.p,{children:"Based on validated parameters:"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Native Coins"}),": Transfer ",(0,s.jsx)(n.code,{children:"amount"})," of native currency to ",(0,s.jsx)(n.code,{children:"addressToReceive"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"ERC20 Tokens"}),": Transfer ",(0,s.jsx)(n.code,{children:"amount"})," of ",(0,s.jsx)(n.code,{children:"tokenAddress"})," tokens to ",(0,s.jsx)(n.code,{children:"addressToReceive"})]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Priority Fees"}),": Handle fee distribution to fisher executor"]}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"error-handling",children:"Error Handling"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Signature Validation"}),": Use this function to verify user authorization (see ",(0,s.jsx)(n.a,{href:"/docs/SignatureStructures/Treasury/FisherBridgeSignatureStructure",children:"signature format"}),")"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Nonce Tracking"}),": Ensure nonce synchronization with host chain"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Transfer Validation"}),": Verify successful token transfers"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"error-conditions",children:"Error Conditions"}),"\n",(0,s.jsxs)(n.table,{children:[(0,s.jsx)(n.thead,{children:(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.th,{children:"Error"}),(0,s.jsx)(n.th,{children:"Condition"})]})}),(0,s.jsxs)(n.tbody,{children:[(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"CoreError.AsyncNonceAlreadyUsed()"})}),(0,s.jsx)(n.td,{children:"Nonce has already been used for this user"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:(0,s.jsx)(n.code,{children:"CoreError.InvalidSignature()"})}),(0,s.jsx)(n.td,{children:"Signature verification fails"})]}),(0,s.jsxs)(n.tr,{children:[(0,s.jsx)(n.td,{children:"Access Control Revert"}),(0,s.jsx)(n.td,{children:"Called by unauthorized address (not current fisher executor)"})]})]})]}),"\n",(0,s.jsx)(n.h2,{id:"usage-flow",children:"Usage Flow"}),"\n",(0,s.jsxs)(n.ol,{children:["\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Host Chain"}),": User calls ",(0,s.jsx)(n.code,{children:"fisherBridgeSend"})," with signature"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Event Monitoring"}),": External services detect ",(0,s.jsx)(n.code,{children:"FisherBridgeSend"})," event"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Signature Validation"}),": Fisher calls ",(0,s.jsx)(n.code,{children:"fisherBridgeReceive"})," with same parameters"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Nonce Increment"}),": External station increments user's nonce"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Token Transfer"}),": External services execute actual transfer"]}),"\n",(0,s.jsxs)(n.li,{children:[(0,s.jsx)(n.strong,{children:"Fee Distribution"}
1),": Priority fees handled by external coordination"]}),"\n"]}),"\n",(0,s.jsx)(n.h2,{id:"coordination-requirements",children:"Coordination Requirements"}),"\n",(0,s.jsx)(n.p,{children:"For proper fisher bridge operation:"}),"\n",(0,s.jsx)(n.h3,{id:"signature-consistency",children:"Signature Consistency"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Same signature used on both host and external chains"}),"\n",(0,s.jsx)(n.li,{children:"Identical parameter values across chains"}),"\n",(0,s.jsx)(n.li,{children:"Synchronized nonce values"}),"\n"]}),"\n",(0,s.jsx)(n.h3,{id:"service-integration",children:"Service Integration"}),"\n",(0,s.jsxs)(n.ul,{children:["\n",(0,s.jsx)(n.li,{children:"Off-chain monitoring of host chain events"}),"\n",(0,s.jsx)(n.li,{children:"External token transfer execution"}),"\n",(0,s.jsx)(n.li,{children:"Priority fee distribution mechanisms"}),"\n",(0,s.jsx)(n.li,{children:"Error handling and retry logic"}),"\n"]}),"\n",(0,s.jsx)(n.admonition,{title:"Off-chain Coordination Required",type:"info",children:(0,s.jsx)(n.p,{children:"This function only validates signatures and manages nonces. Actual token transfers on the external chain require off-chain services that coordinate between the validation and execution steps."})}),"\n",(0,s.jsx)(n.admonition,{title:"AsyncNonce System",type:"warning",children:(0,s.jsxs)(n.p,{children:["The External Chain Station uses ",(0,s.jsx)(n.code,{children:"asyncNonce[from][nonce]"})," mapping instead of Core.sol's nonce system. This is because Core.sol doesn't exist on external chains. Users must manage their own sequential nonces, and each nonce can only be used once."]})})]})}function h(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.