@oracle-agent/oracle 0.35.43 → 0.35.45

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/dist/agent-sessions.mjs +24 -24
  2. package/dist/assets/skills/oracle-desk-product/SKILL.md +1 -1
  3. package/dist/bin/desk-server.mjs +28 -28
  4. package/dist/bin/oracle-data-mcp.mjs +19 -19
  5. package/dist/bin/oracle-gateway.mjs +48 -48
  6. package/dist/bin/oracle-investigate.mjs +5 -5
  7. package/dist/bin/oracle-launch-radar-shadow.mjs +6 -6
  8. package/dist/bin/oracle-mev-arb-shadow.mjs +6 -6
  9. package/dist/bin/oracle-mev-shadow.mjs +6 -6
  10. package/dist/bin/oracle-public-server.mjs +5 -5
  11. package/dist/bin/oracle-route.mjs +26 -26
  12. package/dist/bin/oracle-scan.mjs +11 -11
  13. package/dist/bin/oracle.mjs +13 -12
  14. package/dist/cli/commands/account.mjs +39 -0
  15. package/dist/cli/commands/agent-session.mjs +23 -23
  16. package/dist/cli/commands/airdrop.mjs +10 -10
  17. package/dist/cli/commands/chat.mjs +218 -217
  18. package/dist/cli/commands/data.mjs +244 -8
  19. package/dist/cli/commands/doctor.mjs +7 -7
  20. package/dist/cli/commands/eval.mjs +157 -153
  21. package/dist/cli/commands/extension-policy.mjs +1 -1
  22. package/dist/cli/commands/farm.mjs +19 -19
  23. package/dist/cli/commands/fees.mjs +3 -3
  24. package/dist/cli/commands/follow.mjs +36 -36
  25. package/dist/cli/commands/mcp.mjs +6 -6
  26. package/dist/cli/commands/mint.mjs +11 -11
  27. package/dist/cli/commands/model.mjs +222 -221
  28. package/dist/cli/commands/quickstart.mjs +7 -7
  29. package/dist/cli/commands/receipt.mjs +11 -11
  30. package/dist/cli/commands/resolve.mjs +12 -12
  31. package/dist/cli/commands/session-vault.mjs +5 -5
  32. package/dist/cli/commands/sign.mjs +12 -12
  33. package/dist/cli/commands/signer.mjs +25 -25
  34. package/dist/cli/commands/snipe.mjs +11 -11
  35. package/dist/cli/commands/strategy.mjs +5 -5
  36. package/dist/cli/commands/swap.mjs +15 -15
  37. package/dist/cli/commands/venues.mjs +2 -2
  38. package/dist/data/desk-data.mjs +26 -26
  39. package/dist/data/names.mjs +3 -3
  40. package/dist/data/providers/farming.mjs +2 -2
  41. package/dist/data/providers/lp-destination-discovery.mjs +4 -4
  42. package/dist/index.mjs +44 -44
  43. package/dist/investigator/index.mjs +2 -2
  44. package/dist/launch-radar/index.mjs +5 -5
  45. package/dist/local-signer/anvil-attestation-worker.mjs +1 -1
  46. package/dist/local-signer/index.mjs +7 -3
  47. package/dist/local-signer/runtime.mjs +22 -22
  48. package/dist/nft/universal-mint-router.mjs +4 -4
  49. package/dist/notifications/index.mjs +7 -7
  50. package/dist/router/index.mjs +3 -3
  51. package/dist/router/prepare-bridge.mjs +2 -2
  52. package/dist/router/prepare-route.mjs +3 -3
  53. package/dist/scanner/index.mjs +4 -4
  54. package/dist/strategy/index.mjs +3 -3
  55. package/dist/tui/standalone-client.mjs +90 -88
  56. package/package.json +1 -1
  57. package/public/eval-report.json +347 -13
  58. package/public/oracle-splash/docs/browser-and-web/index.html +2 -2
  59. package/public/oracle-splash/docs/connectors/index.html +2 -2
  60. package/public/oracle-splash/docs/getting-started/index.html +2 -2
  61. package/public/oracle-splash/docs/index.html +3 -3
  62. package/public/oracle-splash/docs/reference/index.html +2 -2
  63. package/public/oracle-splash/docs/security/index.html +2 -2
  64. package/public/oracle-splash/docs/using-oracle/index.html +2 -2
  65. package/public/oracle-splash/download/index.html +3 -3
  66. package/public/oracle-splash/downloads/index.html +1 -1
  67. package/public/oracle-splash/index.html +6 -6
  68. package/server.json +2 -2
@@ -1,3 +1,7 @@
1
- var cr=(e,r,t)=>()=>{if(t)throw t[0];try{return e&&(r=e(e=0)),r}catch(n){throw t=[n],n}};import{createHash as Nr,createHmac as Vi,timingSafeEqual as Ki}from"node:crypto";function Lr(e){let r=e==null||e===""?Le:Number(e);return!Number.isFinite(r)||r<0?Le:Math.min(r,Ye)}function Ce(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(Ce).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${Ce(e[t])}`).join(",")}}`}function Cr(e){let{prepareHash:r,prepareMac:t,note:n,...o}=e||{};return o}function Br(e){let r=Cr(e);return Nr("sha256").update(Ce(r)).digest("hex")}function Xe(e,{maxAgeMs:r=Le,nowMs:t=Date.now(),providers:n=null,kinds:o=null,label:i="operator"}={}){if(!e||typeof e!="object")throw new Error(`${i}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${i}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==Pr)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let a=Br(e);if(String(e.prepareHash||"")!==a)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let f=Number(e.preparedAt),c=Number(e.expiresAt),s=Lr(r),u=t-f,d=c-f;if(!Number.isFinite(u)||!Number.isFinite(c)||!Number.isFinite(d)||u<0||d<=0||d>Ye||u>s||t>=c)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${u}, max=${s})`);if(n&&!new Set(n).has(e.provider))throw new Error(`${i}: provider ${e.provider} not allowed here`);if(o&&!new Set(o).has(e.kind))throw new Error(`${i}: kind ${e.kind} not allowed here`);return!0}var Pr,Le,Ye,xe=cr(()=>{Pr=2,Le=300*1e3,Ye=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{createHash as yo,randomBytes as bo,timingSafeEqual as xo}from"node:crypto";import{base58 as Qt}from"@scure/base";import{Interface as jt}from"ethers";import{Interface as vr,MaxUint256 as Tr,isAddress as Ir,keccak256 as Ri,toUtf8Bytes as Di}from"ethers";import{Interface as Ar,isAddress as bi}from"ethers";import{isAddress as pi}from"ethers";import{createHash as pr,createHmac as mr,timingSafeEqual as wr}from"node:crypto";import{readFileSync as ur}from"node:fs";import{homedir as dr}from"node:os";import{join as be}from"node:path";function lr(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let t=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return t?[t]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),r=dr();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let t=(process.env.ORACLE_CONFIG_DIR||be(r,".config","oracle")).trim();return[e,be(t,"exec.env")].filter(Boolean)}return[e,be(r,".config","oracle","exec.env"),be(r,".config","mad-desk","exec.env")].filter(Boolean)}function se(e,r,t){let n=e??process.env[r]??process.env[t];if(!String(n||"").trim())for(let o of lr())try{let i=ur(o,"utf8"),a=i.match(new RegExp(`^${r}=(.*)$`,"m"))||i.match(new RegExp(`^${t}=(.*)$`,"m"));if(a&&(n=a[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${r} required for attestation. Set it in the environment, or place ${r}=<value> in ~/.config/oracle/exec.env`);return n}function te(e,r,t="guard"){if(typeof r!="number"||!Number.isFinite(r))throw new Error(`${t}: current time must be a finite number (got ${fr(r)})`);let n=r,o=Number(e?.issuedAtMs),i=Number(e?.expiresAtMs);if(!Number.isFinite(i))throw new Error(`${t}: expiresAtMs is required and must be a finite number`);if(n>i)throw new Error(`${t} expired at ${i}, now ${n}`);if(e?.issuedAtMs!=null){if(!Number.isFinite(o))throw new Error(`${t}: issuedAtMs must be a finite number when present`);if(i<=o)throw new Error(`${t}: expiry must be after issuance`)}return{now:n,issuedAtMs:o,expiresAtMs:i}}function fr(e){return e===null?"null":e===void 0?"undefined":typeof e=="number"?String(e):`${typeof e} ${JSON.stringify(String(e)).slice(0,24)}`}var Je=100;function Ne(e){return Array.isArray(e)?`[${e.map(Ne).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Ne(e[r])}`).join(",")}}`:JSON.stringify(e??null)}function hr(e,{required:r=!1}={}){try{return se(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(t){if(r)throw t;return null}}function gr(e){let{signature:r,...t}=e;return t}function yr(e){let r=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(r)||r.length<10||r.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return pr("sha256").update(Buffer.from(r.slice(2),"hex")).digest("hex")}function br(e,r){let t=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(r??""),"utf8");return t.length!==n.length||t.length===0?!1:wr(t,n)}function xr(e){let r=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(r)||r.length<10||r.length%2!==0)return null;let t=r.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=r.length;i+=64)n.push(r.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(t){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let a=Number(i)/32;return!Number.isInteger(a)||a<0?null:o(a+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function Pe(e,{nowMs:r=Date.now(),chainId:t,venue:n,secret:o,tx:i,requireSigned:a=!1}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");let f=hr(o,{required:a});if(a&&!f)throw new Error("auto-slippage attestation secret required for signing or broadcast");if(f){let p=mr("sha256",f).update(Ne(gr(e))).digest("hex");if(!br(e.signature,p))throw new Error("auto-slippage guard signature mismatch \u2014 the guard was not issued by this Oracle")}else if(e.signature)throw new Error("auto-slippage guard carries a signature but no attestation secret is configured");let c=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(c)||c<0||c>Je)throw new Error("auto-slippage selected tolerance exceeds hard 100 bps cap");if(!Number.isInteger(s)||s<0||s>Je||c>s)throw new Error("auto-slippage cap exceeds hard 100 bps cap");try{te({expiresAtMs:e.expiresAtMs,issuedAtMs:e.quotedAtMs},r,"auto-slippage quote")}catch(p){throw new Error(`${p.message}; re-quote before signing`)}if(t!=null&&Number(e.chainId)!==Number(t))throw new Error("auto-slippage guard chain mismatch");if(n&&String(e.venue).toLowerCase()!==String(n).toLowerCase())throw new Error("auto-slippage guard venue mismatch");let u=BigInt(e.quoteAmountOut??0),d=BigInt(e.minAmountOut??0);if(u<=0n||d<=0n)throw new Error("auto-slippage guard amounts must be positive");let w=u*BigInt(1e4-c),l=w/10000n;if(w%10000n!==0n&&(l+=1n),d<l)throw new Error("auto-slippage guard is under-protected relative to its fresh quote");if(i?.data&&e.minAmountOut!=null){let p=xr(i.data);if(e.calldataHash!=null){if(String(e.calldataHash)!==yr(i.data))throw new Error("auto-slippage guard is not bound to this call: calldata hash mismatch");if(p!=null&&p!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is hash-bound but the calldata encodes ${p}, not the guard floor ${e.minAmountOut}`)}else{if(p==null){let m=String(i.data).slice(0,10);throw new Error(`auto-slippage: cannot verify the output floor encoded by selector ${m}; refusing rather than trusting unbound calldata at an allowlisted venue`)}if(p!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is not bound to this call: guard minAmountOut ${e.minAmountOut} but calldata encodes ${p}`)}}return!0}var Si=new Ar(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Sr,isAddress as Ii}from"ethers";var Pi=new Sr(["function approve(address spender,uint256 amount) returns (bool)"]),Li=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});function O(e,r="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${r} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${r} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${r} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${r} must be a number or decimal string`);return e}throw new Error(`${r} must be a number or decimal string`)}function F(e,r="value"){if(typeof e!="string"||e==="")throw new Error(`${r} must be a string`);return e}function J(e,r="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${r} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${r} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let t=O(e,r);if(t==="")throw new Error(`${r} is required`);if(!/^-?\d+$/.test(t)&&!/^0x[0-9a-fA-F]+$/.test(t))throw new Error(`${r} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(t)}`);try{return BigInt(t)}catch{throw new Error(`${r} must be an integer, got ${JSON.stringify(t)}`)}}function M(e,r="amount"){let t=J(e,r);if(t<=0n)throw new Error(`${r} must be positive`);return t}function k(e,r,t="amount"){let n=O(e,t);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${t} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[a="0",f=""]=i.split(".");if(f.length>r)throw new Error(`${t} has more than ${r} decimal places, which would lose precision`);let c=BigInt((a||"0")+f.padEnd(r,"0"));return o?-c:c}var zi=new vr(["function approve(address spender,uint256 amount) returns (bool)"]);function Ge(e,r){let t=String(e||"").trim();if(!Ir(t))throw new Error(`${r} must be an address`);return t.toLowerCase()}function Or(e,r="approval amount",{allowZero:t=!1}={}){let n=J(e,r);if(t?n<0n:n<=0n)throw new Error(`${r} must be positive`);if(n>=Tr)throw new Error("unlimited approvals are refused; use an exact bounded amount");return n.toString()}var Ve=new Set(["0x095ea7b3","0x39509351","0x61f49ed6","0xeb5625d9","0xf9255c1f","0x87517c45","0xd505accf","0x8fcbaf0c","0x2b67b570","0x2a2d80d1"]),kr=new Set(["0x39509351","0xf9255c1f"]);function Q(e){let r=String(e||"").toLowerCase();return r.length<10?!1:Ve.has(r.slice(0,10))}function Ke(e){if(!Q(e))throw new Error("approval calldata required");let r=String(e||"").toLowerCase(),t=r.slice(0,10),n=r.slice(10).match(/.{1,64}/g)||[],o=s=>n[s]?"0x"+n[s].slice(24):null,i=s=>n[s]?BigInt("0x"+n[s]):null,a=null,f=null,c=null;switch(t){case"0x095ea7b3":case"0x39509351":a=o(0),f=i(1);break;case"0x61f49ed6":case"0xeb5625d9":case"0xf9255c1f":c=o(0),a=o(1),f=i(2);break;case"0xd505accf":a=o(1),f=i(2);break;case"0x8fcbaf0c":{a=o(1),f=i(4)===0n?0n:(1n<<256n)-1n;break}case"0x87517c45":c=o(0),a=o(1),f=i(2);break;default:throw new Error(`approval selector ${t} is recognised but not decodable; refusing to bound it`)}if(a==null||f==null)throw new Error("invalid approve calldata");return{spender:Ge(a,"approval spender"),token:c==null?null:Ge(c,"approval token"),amount:Or(f,"approval amount",{allowZero:!0}),selector:t,additive:kr.has(t)}}xe();var ce=e=>String(e||"").toLowerCase(),_r=new Set(["chainId","from","to","data","value","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","l1FeeWei","operatorFeeWei","nonce","type","accessList","authorizationList","slippageBps","expiresAtMs"]),Fr=new Set([10n,8453n,84532n,42161n,421614n,11155420n,7777777n]);function K(e){try{return Fr.has(BigInt(e))}catch{return!1}}var $=(e,r)=>{if(e==null||e==="")throw new Error(`policy: ${r} required`);try{let t=BigInt(e);if(t<0n)throw 0;return t}catch{throw new Error(`policy: ${r} must be a non-negative integer`)}},Qe=(e,r)=>{let t=Number(e);if(!Number.isFinite(t))throw new Error(`policy: ${r} must be finite`);return t},re=(e,r,t,n=String)=>{if(!Array.isArray(r)||r.length===0)throw new Error(`policy: ${t} allowlist is empty`);if(!r.map(n).includes(n(e)))throw new Error(`policy: ${t} not allowed`)};function Ee(e,r,{nowMs:t=Date.now(),networkFees:n,requireNetworkFees:o=!1}={}){if(!e||!r)throw new Error("policy: artifact and policy required");if(Object.keys(e).some(l=>!_r.has(l)))throw new Error("policy: unexpected EVM artifact field");if(e.gasPrice!=null&&(e.maxFeePerGas!=null||e.maxPriorityFeePerGas!=null))throw new Error("policy: ambiguous EVM fee fields");if(e.type!=null&&![0,1,2,4].includes(Number(e.type)))throw new Error("policy: unsupported EVM transaction type");if(Number(e.type)===4){if(!Array.isArray(e.authorizationList)||e.authorizationList.length===0||e.authorizationList.length>8)throw new Error("policy: type-4 requires 1-8 authorizationList entries");for(let[l,p]of e.authorizationList.entries()){if(!p||typeof p!="object")throw new Error(`policy: authorizationList[${l}] required`);re(p.address,r.destinations,"destination",ce);try{if(BigInt(p.chainId)!==BigInt(e.chainId))throw new Error("policy: type-4 authorization chainId must match transaction")}catch(m){throw String(m?.message||"").includes("authorization chainId")?m:new Error("policy: type-4 authorization chainId must match transaction")}}if(String(e.data||"0x").toLowerCase()!=="0x")throw new Error("policy: type-4 calldata must be empty");if($(e.value,"value")!==0n)throw new Error("policy: type-4 cannot transfer native value")}else if(e.authorizationList!=null)throw new Error("policy: authorizationList is only valid on type-4");let i=(l,p)=>{try{return BigInt(l)===BigInt(p)}catch{return String(l)===String(p)}};if(!Array.isArray(r.chains)||r.chains.length===0)throw new Error("policy: chain allowlist is empty");if(!r.chains.some(l=>i(l,e.chainId)))throw new Error("policy: chain not allowed");if(re(e.to,r.destinations,"destination",ce),re(String(e.data||"0x").slice(0,10),r.selectors,"selector",l=>String(l).toLowerCase()),re(e.from,r.owners,"owner",ce),Q(e.data)){let l;try{l=Ke(e.data)}catch(m){throw new Error(`policy: malformed approval calldata: ${m?.message||m}`)}re(l.spender,r.spenders,"spender",ce),re(l.token||e.to,r.erc20Tokens,"ERC-20 token",ce);let p=$(r.maxApproval,"maxApproval");if(BigInt(l.amount)>p)throw new Error("policy: approval exceeds cap");if(l.additive)throw new Error("policy: additive approval cannot be bounded; use approve() with an absolute amount")}if($(e.value,"value")>$(r.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let a=$(e.gasLimit,"gasLimit");if(a>$(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");let f=e.maxFeePerGas??e.gasPrice,c=$(f,"feePerGas")*a,s=0n;try{if(K(e.chainId)&&(e.l1FeeWei===void 0||e.operatorFeeWei===void 0))throw new Error("missing")}catch{throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(e.l1FeeWei!==void 0&&(s+=$(e.l1FeeWei,"l1FeeWei")),e.operatorFeeWei!==void 0&&(s+=$(e.operatorFeeWei,"operatorFeeWei")),K(e.chainId)&&(o||n!=null)){if(!n||n.l1FeeWei===void 0||n.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");let l=$(n.l1FeeWei,"estimated l1FeeWei")+$(n.operatorFeeWei,"estimated operatorFeeWei");if(s<l)throw new Error("policy: rollup fee attestation understates estimate")}if(c+s>$(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");let d=Qe(r.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>d)throw new Error("policy: slippage attestation exceeds cap");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=t)throw new Error("policy: artifact expired");let w=Qe(r.maxTtlMs??12e4,"maxTtlMs");if(w<=0||e.expiresAtMs-t>w)throw new Error("policy: artifact TTL exceeds cap");return!0}import{createHash as Ze}from"node:crypto";import{Address as Mr,NETWORK as $r,OutScript as et,RawTx as Rr,SigHash as tt,TEST_NETWORK as Dr,Transaction as qr}from"@scure/btc-signer";var rt=(e,r)=>{if(e==null||e==="")throw new Error(`policy: ${r} required`);try{let t=BigInt(e);if(t<0n)throw 0;return t}catch{throw new Error(`policy: ${r} must be a non-negative integer`)}},jr=(e,r)=>{if(typeof e!="string"||e.length===0||e.length>131072||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`envelope: invalid ${r}`);let t=Buffer.from(e,"base64");if(t.toString("base64")!==e)throw new Error(`envelope: invalid ${r}`);return t},Ur=e=>Array.isArray(e)||e instanceof Uint8Array?e.length>0:e!=null,Hr=e=>/^(bc1|tb1|bcrt1)/i.test(String(e)),Z=e=>Hr(e)?String(e).toLowerCase():String(e),Be=(e,r)=>Array.isArray(r)&&r.some(t=>Z(t)===Z(e)),Wr=(e,r)=>Buffer.from(e||[]).equals(Buffer.from(r||[]));function zr(e){let r=Buffer.from(Rr.encode(e)),t=Ze("sha256").update(r).digest();return Buffer.from(Ze("sha256").update(t).digest()).reverse().toString("hex")}function Jr(e){if(!e.nonWitnessUtxo)throw new Error("envelope: PSBT input nonWitnessUtxo required");if(zr(e.nonWitnessUtxo)!==Buffer.from(e.txid||[]).toString("hex"))throw new Error("envelope: Bitcoin prevout txid mismatch");let r=e.nonWitnessUtxo.outputs?.[e.index];if(!r)throw new Error("envelope: Bitcoin prevout output missing");if(!e.witnessUtxo)throw new Error("envelope: PSBT input witness UTXO required");if(BigInt(e.witnessUtxo.amount)!==BigInt(r.amount)||!Wr(e.witnessUtxo.script,r.script))throw new Error("envelope: Bitcoin witness UTXO mismatch");return r}function Gr(e,r){if(e.action!=="transfer")throw new Error("envelope: BTC decoder requires transfer action");let t=e?.artifact;if(Object.keys(t).some(d=>!["network","psbt"].includes(d)))throw new Error("envelope: unexpected BTC artifact field");if(!Be(t.network,r.chains))throw new Error("policy: chain not allowed");let n=["bitcoin","mainnet"].includes(String(t.network).toLowerCase())?$r:["testnet","signet","regtest"].includes(String(t.network).toLowerCase())?Dr:null;if(!n)throw new Error("envelope: unsupported Bitcoin network");let o;try{o=qr.fromPSBT(jr(t.psbt,"PSBT"))}catch(d){throw new Error(`envelope: invalid PSBT: ${d?.message||d}`)}if(o.inputsLength===0||o.outputsLength===0)throw new Error("envelope: PSBT inputs and outputs required");let i=Mr(n);for(let d=0;d<o.inputsLength;d++){let w=o.getInput(d);for(let m of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(Ur(w[m]))throw new Error("envelope: signed or finalized PSBT refused");if(w.sighashType!==void 0&&w.sighashType!==tt.DEFAULT&&w.sighashType!==tt.ALL)throw new Error("envelope: Bitcoin sighash must bind all inputs and outputs");let l=Jr(w),p;try{let m=et.decode(l.script);if(!["wpkh"].includes(m.type))throw new Error("unsupported input");p=i.encode(m)}catch{throw new Error("envelope: unsupported Bitcoin input script")}if(!Be(p,r.owners)||Z(p)!==Z(e.owner))throw new Error("envelope: Bitcoin input owner mismatch")}let a=new Set([e.owner,...r.changeAddresses||[]].map(d=>Z(d))),f=0n,c=!1,s=[];for(let d=0;d<o.outputsLength;d++){let w=o.getOutput(d),l;try{l=i.encode(et.decode(w.script))}catch{throw new Error("envelope: unsupported Bitcoin output script")}let p=Z(l);if(s.push(`${l}:${w.amount}`),p===Z(e.destination)){c=!0,f+=w.amount;continue}if(Be(l,r.destinations)){f+=w.amount;continue}if(!a.has(p))throw new Error("policy: Bitcoin output destination not allowed")}if(!c)throw new Error("envelope: Bitcoin destination mismatch");let u;try{u=o.fee}catch{throw new Error("envelope: PSBT fee cannot be decoded")}if(u<0n||u>rt(r.maxFeeSats,"maxFeeSats"))throw new Error("policy: Bitcoin fee exceeds cap");if(f>rt(r.maxValueSats,"maxValueSats"))throw new Error("policy: Bitcoin value exceeds cap");return Object.freeze({unit:"sats",value:f.toString(),notional:(f+u).toString(),fee:u.toString(),outputs:Object.freeze(s)})}function nt(e,r){let{unit:t,value:n,notional:o,fee:i}=Gr(e,r);return Object.freeze({unit:t,value:n,notional:o,fee:i})}import{createHash as Fe}from"node:crypto";import{base58 as ut}from"@scure/base";import{getCompiledTransactionMessageDecoder as Vr}from"@solana/transaction-messages";var ve="11111111111111111111111111111111",dt="ComputeBudget111111111111111111111111111111",Kr="So11111111111111111111111111111111111111112",lt="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";var ft="ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",Yr=5000n,Xr=2039280n,Qr=37095705934669439343138083508754565189542113879843219016388785533085940283555n,L=57896044618658097711785492504343953926634992332820282019728792003956564819949n,ot=19681161376707505956807079304988542015446066515923890162744021073123829784752n,it=e=>Fe("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),Zr=new Map([[it("route"),{name:"route",prefixBytes:0}],[it("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]),B=(e,r)=>{if(e==null||e==="")throw new Error(`policy: ${r} required`);try{let t=BigInt(e);if(t<0n)throw 0;return t}catch{throw new Error(`policy: ${r} must be a non-negative integer`)}},en=(e,r)=>{if(typeof e!="string"||e.length===0||e.length>131072||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`envelope: invalid ${r}`);let t=Buffer.from(e,"base64");if(t.toString("base64")!==e)throw new Error(`envelope: invalid ${r}`);return t},q=(e,r)=>Array.isArray(r)&&r.some(t=>String(t)===String(e)),I=e=>String(e||""),tn=e=>Array.isArray(e.solMints)&&e.solMints.length?e.solMints:e.tokens,Se=e=>Fe("sha256").update(e).digest("hex");function Ae(e,r){try{let t=Buffer.from(ut.decode(String(e||"")));if(t.length!==32)throw new Error("wrong length");return t}catch{throw new Error(`envelope: invalid Solana ${r}`)}}function R(e){let r=e%L;return r>=0n?r:L+r}function W(e,r){let t=e;for(;r-- >0n;)t=t*t%L;return t}function rn(e){let t=e*e%L*e%L,n=W(t,2n)*t%L,o=W(n,1n)*e%L,i=W(o,5n)*o%L,a=W(i,10n)*i%L,f=W(a,20n)*a%L,c=W(f,40n)*f%L,s=W(c,80n)*c%L,u=W(s,80n)*c%L,d=W(u,10n)*i%L;return W(d,2n)*e%L}function nn(e,r){let t=R(r*r*r),n=R(t*t*r),o=rn(e*n),i=R(e*t*o),a=R(r*i*i),f=i,c=R(i*ot),s=a===e,u=a===R(-e),d=a===R(-e*ot);return s&&(i=f),(u||d)&&(i=c),(R(i)&1n)===1n&&(i=R(-i)),!s&&!u?null:i}function on(e){if(!e||e.length!==32)return!1;let r=0n;for(let o=31;o>=0;o--)r=(r<<8n)+BigInt(o===31?e[o]&127:e[o]);let t=R(r*r),n=nn(R(t-1n),R(Qr*t+1n));return n===null?!1:!(n===0n&&(e[31]&128)!==0)}function an(e,r){let t=Buffer.concat([...e,Ae(r,"program id"),Buffer.from("ProgramDerivedAddress")]),n=Fe("sha256").update(t).digest();if(on(n))throw new Error("envelope: derived Solana program address is on curve");return ut.encode(n)}function Me(e,r,t=lt){let n=[Ae(e,"owner"),Ae(t,"token program"),Ae(r,"mint")];for(let o=255;o>=0;o--)try{return an([...n,Buffer.from([o])],ft)}catch(i){if(!/on curve/.test(String(i?.message||i)))throw i}throw new Error("envelope: unable to derive associated token account")}function sn(e,r){return(r.accountIndices||[]).map(t=>I(e.staticAccounts[t]))}function ue(e){return Buffer.from(e.data||[])}function cn(e,r){return I(e.staticAccounts[r.programAddressIndex])}function pt(e,r){return Number(r)<e.header.numSignerAccounts}function un(e,r){let t=e.header.numSignerAccounts,n=e.header.numReadonlySignerAccounts,o=e.header.numReadonlyNonSignerAccounts,i=e.staticAccounts.length;return Number(r)<t?Number(r)<t-n:Number(r)<i-o}function de(e){return e.accountIndices||[]}function _e(e,r){if(!Array.isArray(e)||!e.length)throw new Error(`policy: ${r} allowlist required`);return e.map(String)}function at(e,r){let t=de(r).map(n=>{let o=pt(e,n)?"s":"n",i=un(e,n)?"w":"r";return`${n}:${I(e.staticAccounts[n])}:${o}:${i}`});return Se(Buffer.from(t.join(`
2
- `)))}function st(e,r,t){if(r+8>e.length)throw new Error(`envelope: malformed Jupiter ${t}`);return e.readBigUInt64LE(r)}function dn(e,r,t){if(r+2>e.length)throw new Error(`envelope: malformed Jupiter ${t}`);return e.readUInt16LE(r)}function ln(e,r,t){if(r+4>e.length)throw new Error(`envelope: malformed Jupiter ${t}`);return e.readUInt32LE(r)}function fn(e,r,t){let n=t.maxJupiterRoutePlanSteps===void 0?1:Number(t.maxJupiterRoutePlanSteps);if(!Number.isSafeInteger(n)||n<1)throw new Error("policy: maxJupiterRoutePlanSteps must be a positive integer");if(r<1||r>n)throw new Error("policy: Jupiter route-plan step count exceeds reviewed cap");let o=Array.isArray(t.jupiterRouteVariants)?t.jupiterRouteVariants.map(Number):[];if(!o.length)throw new Error("policy: Jupiter route variant allowlist required");let i=t.jupiterRouteVariantPayloadBytes||{},a=0,f=0,c=[];for(let s=0;s<r;s++){if(a>=e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let u=e[a++];if(!o.includes(u))throw new Error("policy: Jupiter route variant not allowed");if(!Object.hasOwn(i,String(u)))throw new Error("policy: Jupiter route variant payload size required");let d=Number(i[String(u)]);if(!Number.isSafeInteger(d)||d<0||d>16)throw new Error("policy: Jupiter route variant payload size invalid");if(a+d+3>e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let w=e.subarray(a,a+d);a+=d;let l=w.toString("hex"),p=t.jupiterRouteVariantPayloads?.[String(u)];if(!Array.isArray(p)||!p.map(String).includes(l))throw new Error("policy: Jupiter route variant payload not allowed");let m=e[a++],h=e[a++],b=e[a++];if(m<1||m>100)throw new Error("envelope: Jupiter route-plan percent invalid");if(h!==s||b!==s+1)throw new Error("envelope: unsupported Jupiter route-plan token index");f+=m,c.push(Object.freeze({swapVariant:u,variantPayloadHex:l,percent:m,inputIndex:h,outputIndex:b}))}if(a!==e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");if(f!==100*r)throw new Error("envelope: Jupiter route-plan percent total mismatch");return Object.freeze(c)}function pn(e,r){let t=ue({data:e}),n=t.subarray(0,8).toString("hex"),o=Zr.get(n);if(!o)throw new Error("envelope: unsupported Jupiter instruction discriminator");let i=19,a=o.prefixBytes===1?t[8]:null;if(o.prefixBytes===1&&t.length<9)throw new Error("envelope: malformed Jupiter shared route payload");let f=8+o.prefixBytes,c=f+4,s=t.length-i;if(s<=c)throw new Error("envelope: malformed Jupiter route payload");let u=ln(t,f,"route plan length"),d=t.subarray(c,s),w=fn(d,u,r);return Object.freeze({instruction:o.name,routeId:a,routePlanSteps:u,routePlan:w,routePlanHash:Se(d),inAmount:st(t,s,"in_amount"),quotedOutAmount:st(t,s+8,"quoted_out_amount"),slippageBps:dn(t,s+16,"slippage_bps"),platformFeeBps:t[s+18],instructionHash:Se(t)})}function mn(e,r,t){let n=sn(e,r),o=(i,a)=>{let f=n[i];if(!f)throw new Error(`envelope: Jupiter ${a} account missing`);return f};if(t.instruction==="route"){if(n.length<9)throw new Error("envelope: Jupiter route account layout incomplete");return{tokenProgram:o(0,"tokenProgram"),userTransferAuthority:o(1,"userTransferAuthority"),userSourceTokenAccount:o(2,"userSourceTokenAccount"),userDestinationTokenAccount:o(3,"userDestinationTokenAccount"),destinationTokenAccount:o(4,"destinationTokenAccount"),destinationMint:o(5,"destinationMint"),platformFeeAccount:o(6,"platformFeeAccount"),eventAuthority:o(7,"eventAuthority"),program:o(8,"program")}}if(t.instruction==="shared_accounts_route"){if(n.length<13)throw new Error("envelope: Jupiter shared route account layout incomplete");return{tokenProgram:o(0,"tokenProgram"),programAuthority:o(1,"programAuthority"),userTransferAuthority:o(2,"userTransferAuthority"),userSourceTokenAccount:o(3,"sourceTokenAccount"),programSourceTokenAccount:o(4,"programSourceTokenAccount"),programDestinationTokenAccount:o(5,"programDestinationTokenAccount"),userDestinationTokenAccount:o(6,"destinationTokenAccount"),sourceMint:o(7,"sourceMint"),destinationMint:o(8,"destinationMint"),platformFeeAccount:o(9,"platformFeeAccount"),token2022Program:o(10,"token2022Program"),eventAuthority:o(11,"eventAuthority"),program:o(12,"program")}}throw new Error("envelope: unsupported Jupiter account layout")}function ct(e,r){return e&&e!==r?e:null}function D(e,r,t){let n=I(e.staticAccounts[r]);if(!n)throw new Error(`envelope: Jupiter ${t} missing`);return n}function wn(e,r){let t=ue(e);if(t.length===5&&t[0]===2){let n=t.readUInt32LE(1),o=r.maxComputeUnits===void 0?14e5:Number(r.maxComputeUnits);if(!Number.isSafeInteger(o)||o<=0)throw new Error("policy: maxComputeUnits must be positive");if(n>o)throw new Error("policy: Jupiter compute unit limit exceeds cap");return 0n}throw t.length===9&&t[0]===3?new Error("policy: Jupiter priority fee not allowed"):new Error("envelope: unsupported Jupiter compute-budget helper")}function hn(e,r,t,n,o,i){let a=ue(r);if(a.length!==1||a[0]!==1)throw new Error("envelope: unsupported Jupiter ATA helper");let f=de(r);if(f.length!==6)throw new Error("envelope: malformed Jupiter ATA helper");let c=D(e,f[0],"ATA payer"),s=D(e,f[1],"ATA account"),u=D(e,f[2],"ATA owner"),d=D(e,f[3],"ATA mint"),w=D(e,f[4],"ATA system program"),l=D(e,f[5],"ATA token program");if(c!==t.owner)throw new Error("envelope: Jupiter ATA payer must equal owner");if(u!==t.owner)throw new Error("envelope: Jupiter ATA owner must equal owner");if(w!==ve)throw new Error("envelope: Jupiter ATA system program mismatch");if(l!==o)throw new Error("envelope: Jupiter ATA token program mismatch");if(d!==n.inputMint&&d!==n.outputMint)throw new Error("envelope: Jupiter ATA mint mismatch");if(s!==Me(t.owner,d,o))throw new Error("envelope: Jupiter ATA account mismatch");return{ata:s,debit:i}}function gn(e,r,t,n,o){let i=de(r),a=ue(r);if(i.length!==2||a.length!==12||a.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Jupiter system helper");let f=D(e,i[0],"wrap payer"),c=D(e,i[1],"wrap target"),s=a.readBigUInt64LE(4);if(f!==t.owner||c!==n)throw new Error("envelope: unsupported Jupiter wrap transfer");if(s!==o)throw new Error("envelope: Jupiter wrap transfer amount mismatch");return s}function yn(e,r,t,n){let o=de(r),i=ue(r);if(i.length!==1)throw new Error("envelope: unsupported Jupiter token helper");if(i[0]===17){if(o.length!==1||D(e,o[0],"syncNative account")!==n)throw new Error("envelope: Jupiter syncNative account mismatch");return{kind:"syncNative"}}if(i[0]===9){if(o.length!==3)throw new Error("envelope: malformed Jupiter closeAccount helper");let a=D(e,o[0],"closeAccount source"),f=D(e,o[1],"closeAccount destination"),c=D(e,o[2],"closeAccount authority");if(a!==n||f!==t.owner||c!==t.owner)throw new Error("envelope: Jupiter closeAccount must return to owner");return{kind:"closeAccount"}}throw new Error("envelope: unsupported Jupiter token helper")}function bn(e,r,t,n,o,i,a){let f=Me(r.owner,r.artifact.inputMint,a);if(o.userSourceTokenAccount!==f)throw new Error("envelope: Jupiter source token account is not owner ATA");let c=B(t.jupiterAtaRentLamports,"jupiterAtaRentLamports");if(c<Xr)throw new Error("policy: Jupiter ATA rent below the token-account rent-exempt minimum");let s=new Map,u=0n,d=!1,w=!1;for(let l of e.instructions){if(l===n)continue;let p=cn(e,l);if(p===dt)wn(l,t);else if(p===ft){let{ata:m,debit:h}=hn(e,l,r,r.artifact,a,c);s.set(m,h)}else if(p===ve)u+=gn(e,l,r,f,i);else if(p===a){let m=yn(e,l,r,f);m.kind==="syncNative"&&(d=!0),m.kind==="closeAccount"&&(w=!0)}else throw new Error("envelope: unsupported Jupiter helper instruction")}if(u>0n&&(!d||!w))throw new Error("envelope: Jupiter native wrap helpers incomplete");if(u!==0n&&u!==i)throw new Error("envelope: Jupiter native wrap amount mismatch");return[...s.values()].reduce((l,p)=>l+p,0n)}function xn(e){let r;try{r=Vr().decode(en(e.messageBase64,"Solana message"))}catch(t){throw new Error(`envelope: invalid Solana message: ${t?.message||t}`)}if(r.version!=="legacy"&&Array.isArray(r.addressTableLookups)&&r.addressTableLookups.length)throw new Error("envelope: unresolved Solana address tables refused");return r}function En(e,r,t,n=1){if(e.header.numSignerAccounts!==n||I(e.staticAccounts[0])!==r.owner||!q(r.owner,t.owners))throw new Error("envelope: Solana owner mismatch");if(!Array.isArray(e.instructions)||e.instructions.length===0)throw new Error("envelope: Solana instructions required");let o=[];for(let i of e.instructions){let a=I(e.staticAccounts[i.programAddressIndex]);if(!a||!q(a,t.programs))throw new Error("policy: Solana program not allowed");o.push(a)}return o}function An(e,r,t){let n=B(t.lamportsPerSignature,"lamportsPerSignature");if(n<Yr)throw new Error("policy: Solana per-signature fee is below the network minimum");let o=t.maxLamportsPerSignature===void 0?n:B(t.maxLamportsPerSignature,"maxLamportsPerSignature");if(n>o)throw new Error("policy: Solana per-signature fee exceeds cap");let i=BigInt(e.header.numSignerAccounts),a=i*n,f=i*o;if(r.exactFeeLamports!==void 0){let s=B(r.exactFeeLamports,"exactFeeLamports");if(s<a)throw new Error("policy: Solana exact fee below the base signature fee");if(s>f)throw new Error("policy: Solana exact fee exceeds the per-signature bound")}let c=f;if(c>B(t.maxFeeLamports,"maxFeeLamports"))throw new Error("policy: Solana fee exceeds cap");return c}function Sn(e,r,t,n){let o=0n,i=!1;for(let a of e.instructions){if(I(e.staticAccounts[a.programAddressIndex])!==ve)throw new Error("envelope: unsupported Solana program decoder");let c=a.accountIndices||[];if(c.length!==2||I(e.staticAccounts[c[0]])!==r.owner)throw new Error("envelope: Solana transfer owner mismatch");let s=I(e.staticAccounts[c[1]]);if(s!==r.destination||!q(s,t.destinations))throw new Error("envelope: Solana destination mismatch");let u=Buffer.from(a.data||[]);if(u.length!==12||u.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");o+=u.readBigUInt64LE(4),i=!0}if(!i)throw new Error("envelope: Solana destination mismatch");if(o>B(t.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:o,programs:n}}function vn(e,r,t,n){let o=r.artifact,i=I(o.mintProgram);if(!q(i,t.solMintPrograms))throw new Error("policy: Solana mint program not allowed");let a=e.header.numSignerAccounts;if(a!==2&&a!==3)throw new Error("envelope: Solana mint requires the payer, asset, and at most one distinct minter");let f=I(e.staticAccounts[a-1]);if(f!==I(o.assetSigner))throw new Error("envelope: Solana mint asset signer mismatch");if(a===3){let d=I(e.staticAccounts[1]);if(!o.minter||d!==I(o.minter))throw new Error("envelope: Solana mint minter mismatch");if(d===f)throw new Error("envelope: Solana mint minter must not be the asset signer")}else if(o.minter&&I(o.minter)!==r.owner)throw new Error("envelope: Solana mint declares a minter the message does not sign");if(q(f,t.owners))throw new Error("envelope: Solana mint asset signer must not be a policy owner");let c=B(o.maxSpendLamports,"maxSpendLamports");if(c>B(t.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana mint spend exceeds cap");let s=0n,u=!1;for(let d of e.instructions){let w=I(e.staticAccounts[d.programAddressIndex]);if(w!==dt){if(w===ve){let l=d.accountIndices||[];if(l.length!==2||I(e.staticAccounts[l[0]])!==r.owner)throw new Error("envelope: Solana mint transfer owner mismatch");let p=I(e.staticAccounts[l[1]]);if(!q(p,t.destinations))throw new Error("envelope: Solana mint destination mismatch");let m=Buffer.from(d.data||[]);if(m.length!==12||m.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");s+=m.readBigUInt64LE(4);continue}if(w!==i)throw new Error("envelope: unsupported Solana program decoder");u=!0}}if(!u)throw new Error("envelope: Solana mint instruction required");if(s>c)throw new Error("policy: Solana mint visible spend exceeds the declared maximum");return{value:c,programs:n,unverifiableProgramSpend:!0,visibleSpendLamports:s.toString()}}function Tn(e,r,t,n){let o=r.artifact;if(o.provider!=="jupiter")throw new Error("envelope: Solana swap provider must be jupiter");if(o.inputMint!==Kr)throw new Error("envelope: Jupiter local signer requires native SOL input");if(o.outputMint!==r.destination||!q(o.outputMint,t.destinations))throw new Error("envelope: Jupiter output mint destination mismatch");let i=tn(t);if(!q(o.inputMint,i)||!q(o.outputMint,i))throw new Error("policy: Solana token not allowed");let a=B(o.inAmount,"inAmount"),f=B(o.outAmount,"outAmount"),c=B(o.otherAmountThreshold,"otherAmountThreshold");if(a<=0n||a>B(t.maxPerTradeLamports,"maxPerTradeLamports"))throw new Error("policy: Solana swap amount exceeds per-trade cap");if(a>B(t.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");if(f<=0n||c<=0n||c>f)throw new Error("envelope: Jupiter quote floor invalid");if(Number(o.slippageBps)!==Number(r.slippageBps))throw new Error("policy: Solana slippage mismatch");let s=I(o.jupiterProgram);if(!s||!q(s,t.programs)||!n.includes(s))throw new Error("policy: Jupiter program not allowed or absent");let u=e.instructions.filter(S=>I(e.staticAccounts[S.programAddressIndex])===s);if(u.length!==1)throw new Error("envelope: exactly one Jupiter swap instruction required");let d=u[0],w=pn(d.data,t);if(w.instruction==="shared_accounts_route"){let S=Array.isArray(t.jupiterSharedRouteIds)?t.jupiterSharedRouteIds.map(Number):[];if(!S.length)throw new Error("policy: Jupiter shared route id allowlist required");if(!S.includes(Number(w.routeId)))throw new Error("policy: Jupiter shared route id not allowed")}else if(w.routeId!=null)throw new Error("envelope: unexpected Jupiter shared route id");if(!_e(t.jupiterRoutePlanHashes,"Jupiter route-plan hash").includes(w.routePlanHash))throw new Error("policy: Jupiter route-plan hash not allowed");if(w.inAmount!==a)throw new Error("envelope: Jupiter route in_amount mismatch");if(w.quotedOutAmount!==f)throw new Error("envelope: Jupiter route quoted_out_amount mismatch");if(w.slippageBps!==Number(o.slippageBps))throw new Error("envelope: Jupiter route slippage mismatch");let l=w.quotedOutAmount-w.quotedOutAmount*BigInt(w.slippageBps)/10000n;if(c!==l)throw new Error("envelope: Jupiter otherAmountThreshold does not match serialized min-out");if(w.platformFeeBps!==0)throw new Error("policy: Jupiter platform fee not allowed");let p=mn(e,d,w),m=de(d),h=w.instruction==="shared_accounts_route"?2:1;if(!pt(e,m[h]))throw new Error("envelope: Jupiter transfer authority must be signer");if(p.program!==s)throw new Error("envelope: Jupiter program account mismatch");if(p.userTransferAuthority!==r.owner)throw new Error("envelope: Jupiter transfer authority must equal owner");if(p.destinationMint!==o.outputMint)throw new Error("envelope: Jupiter destination mint mismatch");if(p.sourceMint!==void 0&&p.sourceMint!==o.inputMint)throw new Error("envelope: Jupiter source mint mismatch");let b=Array.isArray(t.tokenPrograms)&&t.tokenPrograms.length?t.tokenPrograms:[lt];if(!q(p.tokenProgram,b))throw new Error("policy: Solana token program not allowed");let A=Me(r.owner,o.outputMint,p.tokenProgram);if(p.userDestinationTokenAccount!==A)throw new Error("envelope: Jupiter destination token account is not owner ATA");let g=ct(p.destinationTokenAccount,s);if(g&&g!==A)throw new Error("envelope: Jupiter optional destination account redirects proceeds");if(ct(p.platformFeeAccount,s))throw new Error("policy: Jupiter platform fee account not allowed");if(!_e(t.jupiterRouteAccountHashes,"Jupiter route account hash").includes(at(e,d)))throw new Error("policy: Jupiter route account hash not allowed");let x=Se(Buffer.from([w.instruction,w.routeId??"",w.routePlanHash,at(e,d)].join(`
3
- `)));if(!_e(t.jupiterRouteReviewHashes,"Jupiter route review hash").includes(x))throw new Error("policy: Jupiter route review hash not allowed");let v=bn(e,r,t,d,p,a,p.tokenProgram),P=a+v;if(P>B(t.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:P,programs:n}}function In(e,r){if(e.action!=="transfer"&&e.action!=="swap"&&e.action!=="mint")throw new Error("envelope: Solana decoder requires transfer, swap, or mint action");let t=e?.artifact,n=e.action==="transfer"?["cluster","messageBase64","exactFeeLamports"]:e.action==="mint"?["cluster","messageBase64","exactFeeLamports","mintProgram","assetSigner","maxSpendLamports","minter","cosignatures"]:["cluster","provider","messageBase64","exactFeeLamports","inputMint","outputMint","inAmount","outAmount","otherAmountThreshold","slippageBps","jupiterProgram"];if(Object.keys(t||{}).some(c=>!n.includes(c)))throw new Error("envelope: unexpected Solana artifact field");if(!q(t.cluster,r.chains))throw new Error("policy: chain not allowed");let o=xn(t),i=En(o,e,r,e.action==="mint"?o.header.numSignerAccounts:1),a=e.action==="transfer"?Sn(o,e,r,i):e.action==="mint"?vn(o,e,r,i):Tn(o,e,r,i),f=An(o,t,r);return Object.freeze({unit:"lamports",value:a.value.toString(),notional:(a.value+f).toString(),fee:f.toString(),programs:Object.freeze(a.programs),...a.unverifiableProgramSpend?{unverifiableProgramSpend:!0,visibleSpendLamports:a.visibleSpendLamports}:{}})}function mt(e,r){let{unit:t,value:n,notional:o,fee:i,unverifiableProgramSpend:a,visibleSpendLamports:f}=In(e,r);return Object.freeze(a?{unit:t,value:n,notional:o,fee:i,unverifiableProgramSpend:a,visibleSpendLamports:f}:{unit:t,value:n,notional:o,fee:i})}var fa=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,pa=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,ma=AbortSignal.prototype.throwIfAborted,wa=EventTarget.prototype.addEventListener,ha=EventTarget.prototype.removeEventListener,ga=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null;var ya=64*1024,ba=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});var kn=1e8;var Na=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});function $e(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let r=Number(e.slice(1));if(!Number.isSafeInteger(r)||r<0)return null;let t=r%10;if(t!==0&&t!==1)return null;let n=Math.floor(r/10),o=kn+r;return Number.isSafeInteger(o)?{encoding:r,outcome:n,side:t,coin:`#${r}`,assetId:o}:null}var Nn=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),Pn=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),Ln=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),Cn=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"}),Y=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`hl: bounded ${r} required`);return e};function Bn(e,r){let t=e.toString().padStart(r+1,"0");if(r===0)return t;let n=t.slice(0,-r),o=t.slice(-r).replace(/0+$/,"");return o?`${n}.${o}`:n}function wt(e,r){let t=O(e,`hl: ${r}`);if(!/^\d+(?:\.\d+)?$/.test(t))throw new Error(`hl: ${r} must be a positive decimal`);let[n,o=""]=t.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${r} must be positive`);return{raw:i,decimals:o.length}}function z(e,r){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${r} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>z(n,r)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${r} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${z(e[n],r)}`).join(",")}}`}function _n(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let r=e.orderType,t=e.orderWire;if(!t||typeof t!="object"||Array.isArray(t))throw new Error("hl: declared order wire required");if(r==="limit"){let i=t.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||z(t,"declared order type")!==z({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(r==="market"){if(z(t,"declared order type")!==z({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[r];if(!n)throw new Error("hl: unsupported declared order type");let o=t.trigger?.triggerPx;if(o==null||z(t,"declared order type")!==z({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function Fn(e,r,t){let n=wt(e.s,"signed size"),o=wt(e.p,"signed price"),i=n.decimals+o.decimals,a=n.raw*o.raw,f=k(r.notionalUsd,i,"hl: notionalUsd");if(f<=0n||a!==f)throw new Error("hl: signed notional must match");let c=k(t.maxNotionalUsd,i,"hl: maxNotionalUsd");if(a>c)throw new Error("hl: notional exceeds cap")}function Mn(e,r){let t=e.action.builder;if(t==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!t||typeof t!="object"||Array.isArray(t))throw new Error("hl: signed order builder must be structured");let n=Y(t.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(F(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(r.hlBuilders)?r.hlBuilders.map(f=>String(f).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=J(t.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let a=k(r.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>a)throw new Error("hl: order builder fee exceeds cap")}function ht(e,r,t){if(!Number.isSafeInteger(e.a)||e.a!==t)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(r.side==="buy"))throw new Error("hl: signed side must match exactly");if(O(e.s,"hl: signed size")!==O(r.size,"hl: size"))throw new Error("hl: signed size must match");if(O(e.p,"hl: signed price")!==O(r.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof r.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==r.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(z(e.t,"signed order type")!==z(r.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(r.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==r.clientOrderId)throw new Error("hl: signed client order id must match")}function gt(e,r,t,n,o){if(!Number.isSafeInteger(e.a)||e.a!==t)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(r.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(O(e.s,"hl: bracket protection size")!==O(r.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(O(e.p,"hl: bracket protection price")!==O(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(O(i.triggerPx,"hl: triggerPx")!==O(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function $n(e){let r=String(e||"").replace(/\/$/,"");if(!Nn.has(r))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return r}function Re(e){return $e(e)!=null}function Rn(e,r){let t=String(e||""),n=Array.isArray(r.coins)?r.coins.map(String):[];if(Re(t)){if(r.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(t)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(t)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Dn(e,r,t){let n=Array.isArray(t.hlMarkets)?t.hlMarkets:[];if(n.length){if(!n.some(a=>{if(typeof a=="string"){let[f,c]=String(a).split(":");return f===e&&Number(c)===r}return String(a?.coin)===e&&Number(a?.assetId)===r}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Re(e)){let i=Array.isArray(t.coins)?t.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(t.coins)?t.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function yt(e,r){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let t=e.artifact;if(!t||typeof t!="object"||Array.isArray(t))throw new Error("hl: structured artifact required");let n=Y(t.kind,"kind",48),o=Ln[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=$n(t.submitTo);if(Object.prototype.hasOwnProperty.call(t,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(t,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let a=Number(t.nonce);if(!Number.isSafeInteger(a)||a<=0)throw new Error("hl: nonce must be a positive integer");if(!t.action||typeof t.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(t.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(t.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(t.action.type!==Cn[n])throw new Error("hl: action type must match kind");let f=t.notionalUsd??0;if(Pn.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let c=Y(t.coin,"coin",64),s=t.assetId??t.assetIndex;if(!Number.isSafeInteger(s)||s<0)throw new Error("hl: assetId required");if(n==="hip4-order"||s>=1e8){let u=$e(c);if(!u||u.coin!==c)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(u.assetId!==s)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(Rn(c,r),Dn(c,s,r),n==="hip4-order"&&!Re(c))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(t.side!=="buy"&&t.side!=="sell")throw new Error("hl: side must be buy or sell");if(t.action.type!=="order"||!Array.isArray(t.action.orders))throw new Error("hl: signed orders are required");_n(t);let u=t.action.orders;if(n==="perp-bracket"){let d=t.takeProfitPx,w=t.stopLossPx,l=1+(d==null?0:1)+(w==null?0:1);if(l<2||u.length!==l||t.grouping!=="normalTpsl"||t.action.grouping!==t.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");ht(u[0],t,s);let p=1;d!=null&&gt(u[p++],t,s,d,"tp"),w!=null&&gt(u[p],t,s,w,"sl")}else{if(u.length!==1)throw new Error("hl: exactly one signed order is required");if(t.grouping!=="na"||t.action.grouping!==t.grouping)throw new Error("hl: signed grouping must match declared grouping");ht(u[0],t,s)}Fn(u[0],t,r),Mn(t,r),f=O(t.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let u=t.leverage;if(!Number.isSafeInteger(u)||u<1)throw new Error("hl: leverage must be a positive integer");let d=r.maxLeverage==null?50:r.maxLeverage;if(typeof d!="number"||!Number.isSafeInteger(d)||d<1)throw new Error("hl: maxLeverage must be a positive integer");if(u>d)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let u=t.action.cancels;if(!Array.isArray(u)||u.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(u[0].a)||u[0].a!==s)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(t.orderId)||t.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(u[0].o)||u[0].o!==t.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(t.action.asset)||t.action.asset!==s)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(t.action.leverage)||t.action.leverage!==t.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(t.marginMode))throw new Error("hl: declared margin mode required");let u=t.marginMode==="cross";if(typeof t.action.isCross!="boolean"||t.action.isCross!==u)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(t.action.asset)||t.action.asset!==s)throw new Error("hl: signed margin asset must match assetId");let u=Y(t.usd,"margin usd",64),d=k(u,6,"hl: margin usd");if(J(t.action.ntli,"hl: signed margin ntli")!==d)throw new Error("hl: signed margin amount must match usd");if(typeof t.isBuy!="boolean"||t.action.isBuy!==t.isBuy)throw new Error("hl: signed margin isBuy must match");let l=k(r.maxNotionalUsd,6,"hl: maxNotionalUsd"),p=d<0n?-d:d;if(p>l)throw new Error("hl: margin notional exceeds cap");f=Bn(p,6)}}if(n==="builder-fee-approval"){let c=Y(t.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(c))throw new Error("hl: builder address required");if(Y(t.action.builder,"signed builder",42).toLowerCase()!==c)throw new Error("hl: signed builder must match");if(!(Array.isArray(r.hlBuilders)?r.hlBuilders.map(p=>String(p).toLowerCase()):[]).includes(c))throw new Error("hl: builder not allowed");let u=Y(t.maxFeeRate,"maxFeeRate",32);if(Y(t.action.maxFeeRate,"signed maxFeeRate",32)!==u)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(u))throw new Error("hl: builder fee rate must be a percent");let d=k(u.slice(0,-1),12,"hl: builder fee percent"),w=k(r.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(w<0n||d*100n>w)throw new Error("hl: builder fee exceeds cap");if(Number(t.action.nonce)!==a)throw new Error("hl: signed builder nonce must match");let l=i.includes("testnet")?"Testnet":"Mainnet";if(t.hyperliquidChain!==l||t.action.hyperliquidChain!==t.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(t.signatureChainId!=="0x66eee"||t.action.signatureChainId!==t.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let c=n==="hype-undelegate";if(typeof t.action.isUndelegate!="boolean"||t.action.isUndelegate!==c)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(r.maxHypeWei!=null&&BigInt(String(t.action.wei??t.caps?.amountHype??"0"))>BigInt(r.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(f??t.action.wei??0),notional:String(f??0),fee:"0",kind:n,actionType:t.action.type,amount:String(t.action.wei??f??0),coin:t.coin||null,submitTo:i})}var Fa="0x"+"00".repeat(32);function qn(e){let r=typeof e=="bigint"?e:M(e,"poly: atomicUsdc");if(r<=0n)throw new Error("poly: order amounts must be positive integer micro-units");let t=r/1000000n,n=(r%1000000n).toString().padStart(6,"0").replace(/0+$/,"");return n?`${t.toString()}.${n}`:t.toString()}function bt(e,r){let t=M(e.makerAmount,"poly: makerAmount"),n=M(e.takerAmount,"poly: takerAmount");return qn(r==="BUY"?t:n)}var jn=new Set(["https://clob.polymarket.com/order"]),le=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),Da=Object.freeze(le.map(e=>e[0])),Un=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),Hn="0xe111180000d2663c0091e4f400237545b87b996b",Wn="0xe2222d279d744050d28e00520010520000310f59",xt=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`poly: bounded ${r} required`);return e};function Et(e){let r=String(e||"").replace(/\/$/,"");if(!jn.has(r))throw new Error("poly: submitTo must be the official Polymarket CLOB");return r}function At(e){let r=F(e,"poly: exchange").toLowerCase();if(!Un.has(r))throw new Error("poly: verifyingContract must be an official CTF Exchange");return r}function St(e,r){if(e?.surface!=="poly")throw new Error("poly: surface poly required");let t=e.artifact;if(!t||typeof t!="object"||Array.isArray(t))throw new Error("poly: structured artifact required");let n=xt(t.kind,"kind",48);if(n!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(F(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Et(t.submitTo),t.chainId!==137)throw new Error("poly: chainId must be Polygon 137");let o=t.domain;if(!o||typeof o!="object")throw new Error("poly: EIP-712 domain required");if(o.name!=="Polymarket CTF Exchange"||o.version!=="2"||o.chainId!==137)throw new Error("poly: EIP-712 domain must be official CTF Exchange v2 on Polygon");if(At(o.verifyingContract),At(t.exchange),F(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==F(t.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof t.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=t.negRisk?Wn:Hn;if(F(t.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let a=t.message||t.value;if(!a||typeof a!="object")throw new Error("poly: signed order message required");let f=t.types?.Order;if(!Array.isArray(f)||f.length!==le.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<le.length;S+=1)if(f[S]?.name!==le[S][0]||f[S]?.type!==le[S][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((t.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let c=String(e.owner||"").toLowerCase();if(F(a.maker,"poly: maker").toLowerCase()!==c)throw new Error("poly: maker must equal owner");if(F(a.signer,"poly: signer").toLowerCase()!==c)throw new Error("poly: signer must equal owner");if(a.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof a.builder!="string"||a.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(a.side!==0&&a.side!==1)throw new Error("poly: side must be BUY or SELL");let s=xt(t.tokenId,"tokenId",80);if(F(a.tokenId,"poly: tokenId")!==s)throw new Error("poly: tokenId mismatch");let u=Array.isArray(r.polyTokens)?r.polyTokens.map(String):[];if(u.length&&!u.includes(s)&&!u.includes("*"))throw new Error("poly: tokenId not allowed");let d=Number(a.side)===0?"BUY":"SELL";if(t.side&&t.side!==d)throw new Error("poly: side mismatch");let w=M(a.makerAmount,"poly: makerAmount"),l=M(a.takerAmount,"poly: takerAmount"),p=M(t.makerAmount,"poly: prepared makerAmount"),m=M(t.takerAmount,"poly: prepared takerAmount");if(w!==p)throw new Error("poly: signed makerAmount differs from prepared envelope");if(l!==m)throw new Error("poly: signed takerAmount differs from prepared envelope");let h=d==="BUY"?w:l,b=d==="BUY"?l:w,A=k(t.quantity,6,"poly: quantity");if(A<=0n||A!==b)throw new Error("poly: quantity must match CLOB v2 amounts");let g=k(t.price,6,"poly: price");if(g<=0n||g>=1000000n)throw new Error("poly: price must be within (0,1)");if(b*g!==h*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(k(t.notionalUsdc,6,"poly: notionalUsdc")!==h)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=bt(a,d);if(k(v,6,"poly: displayed notionalUsdc")!==h)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let P=r.maxNotionalUsd??r.maxNotionalUsdc;if(P!=null){let S=k(P,6,"poly: maxNotionalUsd");if(h>S)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:h.toString(),notional:h.toString(),fee:"0",kind:n,tokenId:s,side:d,makerAmount:w.toString(),takerAmount:l.toString(),price:String(t.price),quantity:String(t.quantity),notionalUsdc:v,submitTo:Et(t.submitTo)})}var zn=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Tt=14,vt=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`lighter: bounded ${r} required`);return e};function ne(e,r,t){if(!Number.isSafeInteger(e)||e!==r)throw new Error(`lighter: ${t} must be exact numeric ${r}`)}function It(e){let r=String(e||"").replace(/\/$/,"");if(!zn.has(r))throw new Error("lighter: submitTo must be the official Lighter sendTx");return r}function Ot(e,r={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let t=e.artifact;if(!t||typeof t!="object"||Array.isArray(t))throw new Error("lighter: structured artifact required");let n=vt(t.kind,"kind",48);if(n!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=It(t.submitTo),i=t.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let a=Number(J(t.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(a)||a<0)throw new Error("lighter: accountIndex required");let f=Number(J(t.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(f)||f<0)throw new Error("lighter: clientOrderIndex required");ne(t.orderType,0,"orderType"),ne(t.timeInForce,1,"timeInForce"),ne(t.reduceOnly,0,"reduceOnly"),ne(t.triggerPrice,0,"triggerPrice"),ne(t.orderExpiry,-1,"orderExpiry");let c=vt(t.symbol||t.coin,"symbol",32),s=Array.isArray(r.lighterMarkets)?r.lighterMarkets.map(String):[];if(s.length&&!s.includes(c)&&!s.includes(String(i))&&!s.includes("*"))throw new Error("lighter: market not allowed");if(t.side!=="buy"&&t.side!=="sell")throw new Error("lighter: side must be buy or sell");let u=M(t.baseAmount,"lighter: baseAmount"),d=M(t.price,"lighter: price");if(u>BigInt(Number.MAX_SAFE_INTEGER)||d>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let w=Number(u),l=Number(d),p=Number(t.sizeDecimals??0),m=Number(t.priceDecimals??0);if(!Number.isInteger(p)||p<0||p>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(m)||m<0||m>12)throw new Error("lighter: priceDecimals required");let h=p+m,b=u*d,A=k(t.notionalUsd,h,"lighter: notionalUsd");if(A<=0n)throw new Error("lighter: notionalUsd required");if(b!==A)throw new Error("lighter: notionalUsd must match size and price");let g=k(r.maxNotionalUsd??Number.MAX_SAFE_INTEGER,h,"lighter: maxNotionalUsd");if(b>g)throw new Error("lighter: notional exceeds cap");let x=O(t.notionalUsd,"lighter: notionalUsd");return ne(t.txType,Tt,"txType"),Object.freeze({unit:"usd",value:String(x),notional:String(x),fee:"0",kind:n,symbol:c,marketIndex:i,side:t.side,baseAmount:w,price:l,submitTo:o,actionType:"create-order",amount:String(x)})}import{TypedDataEncoder as Pt,getAddress as U}from"ethers";xe();import{TypedDataEncoder as Wa,getAddress as za,isAddress as Ja}from"ethers";var kt=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),De=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as ns,getAddress as os,isAddress as is}from"ethers";var Ka=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});xe();var Nt=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),fs=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var qe=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),ps=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var Gn=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]),Vn="0x0000000000000000000000000000000000000000";function je(e,r,t=256){if(typeof e!="string"||!e||e.length>t)throw new Error(`evm-order: bounded ${r} required`);return e}function Lt(e,r){let t=String(e||"").replace(/\/$/,"");if(!Gn.some(o=>t===`${o}/v4.0/${r}`||t===`${o}/v4.1/${r}`))throw new Error("evm-order: submitTo must be the official 1inch orderbook");return t}function Ct(e,r){let t={1:"https://api.cow.fi/mainnet/api/v1/orders",100:"https://api.cow.fi/xdai/api/v1/orders",42161:"https://api.cow.fi/arbitrum_one/api/v1/orders",8453:"https://api.cow.fi/base/api/v1/orders"}[Number(r)],n=String(e||"").replace(/\/$/,"");if(!t||n!==t)throw new Error("evm-order: cow submitTo must be official api.cow.fi");return n}function Bt(e,r){let t=e?.Order,n=r.Order;return!Array.isArray(t)||t.length!==n.length?!1:t.every((o,i)=>o?.name===n[i].name&&o?.type===n[i].type)}function _t(e,...r){let t=Array.isArray(e.tokens)?e.tokens.map(n=>String(n).toLowerCase()):[];if(!t.length)throw new Error("evm-order: tokens allowlist is empty");if(!t.includes("*")){for(let n of r)if(!t.includes(String(n).toLowerCase()))throw new Error("evm-order: token not allowed")}}function Ft(e,r,{allowZero:t=!1}={}){let n=String(r||"").toLowerCase();if(!n)throw new Error("evm-order: receiver required");if(n===Vn){if(!t)throw new Error("evm-order: receiver must equal owner");return}if(n!==e)throw new Error("evm-order: receiver must equal owner")}function Mt(e,r){if(e?.surface!=="evm-order")throw new Error("evm-order: surface evm-order required");if(e.action!=="order")throw new Error("evm-order: action must be order");let t=e.artifact;if(!t||typeof t!="object"||Array.isArray(t))throw new Error("evm-order: structured artifact required");let n=je(t.kind,"kind",32);if(n==="option")throw new Error("evm-order: option kind refused until official Derive/Lyra domain is pinned");if(n==="cow"){let d=Number(t.chainId??e.chainId);if(Ct(t.submitTo,d),je(e.destination,"destination",32)!=="cowswap")throw new Error("evm-order: cow destination must be cowswap");let w=Nt[d];if(!w)throw new Error(`evm-order: unsupported cow chainId ${d}`);let l=t.domain||t.typedData?.domain,p=t.types||t.typedData?.types,m=t.message||t.typedData?.message;if(!l||!p?.Order||!m)throw new Error("evm-order: CoW EIP-712 Order required");if(!Bt(p,qe))throw new Error("evm-order: cow types must be official GPv2 Order");if(Number(l.chainId)!==d)throw new Error("evm-order: cow domain chain mismatch");if(String(l.name)!=="Gnosis Protocol"||String(l.version)!=="v2")throw new Error("evm-order: cow domain must be official GPv2");if(U(l.verifyingContract)!==U(w))throw new Error("evm-order: cow verifyingContract must be official GPv2 settlement");let h=String(e.owner||"").toLowerCase();Ft(h,m.receiver),_t(r,m.sellToken,m.buyToken);let b=U(m.sellToken),A=String(m.feeAmount||"0"),g=(BigInt(m.sellAmount)+BigInt(A)).toString();return Object.freeze({unit:`erc20:${b.toLowerCase()}`,value:g,notional:g,fee:A,submitTo:Ct(t.submitTo,d),digest:Pt.hash(l,{Order:qe.Order},m),chainId:d,kind:"cow",receiver:U(m.receiver),sellAmount:String(m.sellAmount),buyAmount:String(m.buyAmount)})}if(n!=="1inch-limit")throw new Error("evm-order: unsupported kind");if(je(e.destination,"destination",32)!=="1inch-lop")throw new Error("evm-order: destination must be 1inch-lop");let o=Number(t.chainId??e.chainId),i=kt[o];if(!i)throw new Error(`evm-order: unsupported chainId ${o}`);Lt(t.submitTo,o);let a=t.domain||t.typedData?.domain,f=t.types||t.typedData?.types,c=t.message||t.typedData?.message;if(!a||!f?.Order||!c)throw new Error("evm-order: EIP-712 Order required");if(!Bt(f,De))throw new Error("evm-order: types must be official LOP v4 Order");if(Number(a.chainId)!==o)throw new Error("evm-order: domain chain mismatch");if(U(a.verifyingContract)!==U(i))throw new Error("evm-order: verifyingContract must be official LOP v4");if(a.name!=="1inch Limit Order Protocol"||String(a.version)!=="4")throw new Error("evm-order: EIP-712 domain must be official LOP v4");let s=String(e.owner||"").toLowerCase();if(U(c.maker).toLowerCase()!==s)throw new Error("evm-order: maker must equal owner");Ft(s,c.receiver,{allowZero:!0}),_t(r,c.makerAsset,c.takerAsset);let u=Pt.hash(a,{Order:De.Order},c);return Object.freeze({unit:`erc20:${U(c.makerAsset).toLowerCase()}`,value:String(c.makingAmount),notional:String(c.makingAmount),fee:"0",submitTo:Lt(t.submitTo,o),digest:u,chainId:o,kind:"1inch-limit",receiver:U(c.receiver),makerAsset:U(c.makerAsset),takerAsset:U(c.takerAsset),makingAmount:String(c.makingAmount),takingAmount:String(c.takingAmount)})}var Ut=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var Ue=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),Kn=new Set(["0x0000000000000000000000000000000000000000","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"]),Ht=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Yn=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Te=new jt(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),$t=new jt(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Xn=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var pe=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`envelope: bounded ${r} required`);return e},E=(e,r)=>{try{let t=BigInt(e);if(t<0n)throw 0;return t}catch{throw new Error(`envelope: ${r} must be a non-negative integer`)}},Rt=(e,r)=>{let t=Number(e);if(!Number.isFinite(t))throw new Error(`policy: ${r} must be finite`);return t},Qn=(e,r)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${r} allowlist is empty`);return e},N=(e,r,t)=>{if(!Qn(r,t).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${t} not allowed`)},fe=(e,r,t)=>{Array.isArray(r)&&r.length&&N(e,r,t)},T=(e,r)=>{let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new Error(`envelope: ${r} must be a 20-byte address`);return t},ee=e=>String(e||"0x").slice(0,10).toLowerCase(),Wt=e=>E(e.gasLimit,"gasLimit")*E(e.maxFeePerGas??e.gasPrice,"feePerGas")+E(e.l1FeeWei??0,"l1FeeWei")+E(e.operatorFeeWei??0,"operatorFeeWei");function oe(e,r,t,{dynamicTail:n=!1}={}){let o=String(e||"").toLowerCase();if(!/^0x[0-9a-f]*$/.test(o)||o.length<10+r*64)throw new Error(`envelope: malformed ${t} calldata`);if(!n&&o.length!==10+r*64)throw new Error(`envelope: malformed ${t} calldata`);return{hex:o,word:i=>o.slice(10+i*64,10+(i+1)*64)}}function C(e,r){if(!/^0{24}[0-9a-f]{40}$/.test(e))throw new Error(`envelope: malformed ${r} address`);return`0x${e.slice(24)}`}function H(e,r){try{return BigInt(`0x${e}`)}catch{throw new Error(`envelope: malformed ${r} integer`)}}function Zn(e){if(ee(e)!=="0x095ea7b3")return null;let r=oe(e,2,"approval");return{kind:"approval",spender:C(r.word(0),"approval spender"),amount:H(r.word(1),"approval amount")}}function zt(e,r){let t=r==="router02-exact-input-single"?7:8,n=oe(e,t,"Uniswap v3 exactInputSingle"),o=t===7?4:5;return{kind:"action",action:"swap",inputToken:C(n.word(0),"input token"),outputToken:C(n.word(1),"output token"),recipient:C(n.word(3),"recipient"),amountIn:H(n.word(o),"amountIn"),minimumOut:H(n.word(o+1),"amountOutMinimum")}}function eo(e){let r=oe(e,12,"Across depositV3",{dynamicTail:!0}),t=H(r.word(11),"message offset");if(t!==384n)throw new Error("envelope: malformed Across depositV3 message offset");let n=10+Number(t)*2;if(r.hex.length<n+64)throw new Error("envelope: malformed Across depositV3 message");let o=Number(BigInt(`0x${r.hex.slice(n,n+64)}`));if(!Number.isSafeInteger(o))throw new Error("envelope: malformed Across depositV3 message length");let i=Math.ceil(o/32)*64;if(r.hex.length!==n+64+i)throw new Error("envelope: malformed Across depositV3 trailing bytes");return{kind:"action",action:"bridge",depositor:C(r.word(0),"depositor"),recipient:C(r.word(1),"recipient"),inputToken:C(r.word(2),"input token"),outputToken:C(r.word(3),"output token"),amountIn:H(r.word(4),"inputAmount"),minimumOut:H(r.word(5),"outputAmount"),destinationChainId:H(r.word(6),"destinationChainId")}}function to(e){let r=String(e||"").replace(/^0x/i,"").toLowerCase();if(r.length<86||r.length%2!==0)throw new Error("envelope: malformed Uniswap path");let t=`0x${r.slice(0,40)}`,n=`0x${r.slice(r.length-40)}`;if(!/^0x[0-9a-f]{40}$/.test(t)||!/^0x[0-9a-f]{40}$/.test(n))throw new Error("envelope: malformed Uniswap path tokens");return{inputToken:t,outputToken:n}}function Dt(e,{hasDeadline:r}){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<74)throw new Error("envelope: malformed exactInput calldata");let n=[];for(let h=10;h+64<=t.length;h+=64)n.push(t.slice(h,h+64));let o=(h,b)=>{if(!n[h])throw new Error(`envelope: malformed ${b}`);return BigInt(`0x${n[h]}`)},i=Number(o(0,"exactInput struct offset"));if(i%32!==0)throw new Error("envelope: malformed exactInput struct offset");let a=i/32,f=Number(o(a,"path offset")),c=n[a+1],s=o(a+(r?3:2),"amountIn"),u=o(a+(r?4:3),"amountOutMinimum"),d=a+f/32;if(!Number.isInteger(d)||!n[d])throw new Error("envelope: malformed exactInput path");let w=Number(o(d,"path length")),l=t.slice(10+(d+1)*64,10+(d+1)*64+w*2),{inputToken:p,outputToken:m}=to(`0x${l}`);return{kind:"action",action:"swap",inputToken:p,outputToken:m,recipient:C(c,"recipient"),amountIn:s,minimumOut:u}}function ro(e){let r=oe(e,8,"Aerodrome exactInputSingle");return{kind:"action",action:"swap",inputToken:C(r.word(0),"input token"),outputToken:C(r.word(1),"output token"),recipient:C(r.word(3),"recipient"),amountIn:H(r.word(5),"amountIn"),minimumOut:H(r.word(6),"amountOutMinimum")}}function no(e){let r=String(e||"").toLowerCase();if(!r.startsWith("0x5ae401dc"))throw new Error("envelope: malformed Uniswap multicall");let t=[];for(let w=10;w+64<=r.length;w+=64)t.push(r.slice(w,w+64));let n=Number(BigInt(`0x${t[1]}`));if(n%32!==0)throw new Error("envelope: malformed multicall data offset");let o=n/32;if(Number(BigInt(`0x${t[o]}`))!==1)throw new Error("envelope: multicall must wrap exactly one swap");let a=Number(BigInt(`0x${t[o+1]}`)),f=o+1+a/32,c=Number(BigInt(`0x${t[f]}`)),u=`0x${r.slice(10+(f+1)*64,10+(f+1)*64+c*2)}`,d=ee(u);if(d!=="0x04e45aaf"&&d!=="0x414bf389")throw new Error("envelope: multicall inner call must be exactInputSingle");return zt(u,d==="0x04e45aaf"?"router02-exact-input-single":"swap-router-exact-input-single")}function oo(e,r){let t=ee(e),n=Ht[t];if(!n)throw new Error("envelope: opaque or unsupported EVM swap/bridge calldata");if(String(r).toLowerCase()!==n.provider)throw new Error("envelope: provider does not match reviewed selector");if(n.layout==="router02-exact-input-single"||n.layout==="swap-router-exact-input-single")return{...zt(e,n.layout),selector:t,provider:n.provider};if(n.layout==="exact-input-deadline")return{...Dt(e,{hasDeadline:!0}),selector:t,provider:n.provider};if(n.layout==="exact-input")return{...Dt(e,{hasDeadline:!1}),selector:t,provider:n.provider};if(n.layout==="multicall-deadline")return{...no(e),selector:t,provider:n.provider};if(n.layout==="aerodrome-exact-input-single")return{...ro(e),selector:t,provider:n.provider};if(n.action==="bridge")return{...eo(e),selector:t,provider:n.provider};throw new Error("envelope: unsupported reviewed EVM action")}function io(e){let r=oe(e,4,"SeaDrop mintPublic");return{kind:"mint",action:"mint",mintType:"public",contract:C(r.word(0),"mint NFT contract"),feeRecipient:C(r.word(1),"mint fee recipient"),recipient:C(r.word(2),"mint recipient"),quantity:H(r.word(3),"mint quantity")}}function ao(e){let r;try{r=$t.decodeFunctionData("mintAllowList",e)}catch{throw new Error("envelope: malformed SeaDrop mintAllowList calldata")}let t=r[4],n=[...r[5]].map(String);if(n.length<1||n.length>64||n.some(c=>!/^0x[0-9a-fA-F]{64}$/.test(c)))throw new Error("envelope: bounded canonical SeaDrop allowlist proof required");if($t.encodeFunctionData("mintAllowList",[r[0],r[1],r[2],r[3],t,n]).toLowerCase()!==String(e).toLowerCase())throw new Error("envelope: SeaDrop allowlist calldata must be canonical");let i=BigInt(t.startTime),a=BigInt(t.endTime);if(a<=i)throw new Error("envelope: SeaDrop allowlist stage time range is invalid");let f=BigInt(r[3]);if(BigInt(t.maxTotalMintableByWallet)<f)throw new Error("envelope: SeaDrop allowlist wallet cap is below quantity");return{kind:"mint",action:"mint",mintType:"allowlist",contract:T(r[0],"mint NFT contract"),feeRecipient:T(r[1],"mint fee recipient"),recipient:T(r[2],"mint recipient"),quantity:f,mintPrice:BigInt(t.mintPrice),startTime:i,endTime:a,dropStageIndex:BigInt(t.dropStageIndex),proof:n}}function so(e,r){let t=ee(e);if(String(r).toLowerCase()==="nft-mint")return co(e);let n=Yn[t];if(!n)throw new Error("envelope: opaque or unsupported NFT mint calldata");if(String(r).toLowerCase()!==n.provider)throw new Error("envelope: provider does not match reviewed NFT selector");if(n.layout==="seadrop-mint-public")return{...io(e),selector:t,provider:n.provider};if(n.layout==="seadrop-mint-allowlist")return{...ao(e),selector:t,provider:n.provider};throw new Error("envelope: unsupported reviewed NFT action")}function co(e){let r=ee(e);if(r==="0x40c10f19")throw new Error("envelope: ambiguous mint(address,uint256) calldata is not a built-in signer surface");let t=Xn[r];if(!t)throw new Error("envelope: opaque or unsupported NFT mint calldata");if(t.layout==="mint-no-args")return{kind:"mint",action:"mint",selector:r,provider:"nft-mint",quantity:1n};if(t.layout==="mint-quantity"){let n=oe(e,1,"generic NFT mint");return{kind:"mint",action:"mint",selector:r,provider:"nft-mint",quantity:H(n.word(0),"mint quantity")}}throw new Error("envelope: unsupported generic NFT mint calldata")}function me(e){let r=e?.artifact;if(Array.isArray(r?.transactions))return r.transactions;if(r?.transaction&&typeof r.transaction=="object")return[r.transaction];if(r?.data)return[r];throw new Error("envelope: ordered EVM transaction batch required")}function Jt(e,r,t,{nowMs:n=Date.now(),networkFees:o,requireNetworkFees:i=!1}={}){let a=T(e.owner,"owner"),f=e.artifact,c=Number(f?.chainId??me(e)[0]?.chainId);if(!Number.isSafeInteger(c)||c<=0)throw new Error("envelope: explicit batch chainId required");if(N(c,r.chains,"chain"),f?.owner!==void 0&&T(f.owner,"batch owner")!==a)throw new Error("envelope: explicit batch owner mismatch");let s=me(e);if(!s.length||s.length>8)throw new Error("envelope: bounded EVM transaction batch required");let u=0n,d=0n,w=0n;for(let l of s){if(!l||typeof l!="object"||Array.isArray(l))throw new Error("envelope: structured EVM transaction required");if(Number(l.chainId)!==c)throw new Error("envelope: every batch leg must use the same chain");if(T(l.from,"transaction owner")!==a)throw new Error("envelope: every batch leg must use the same owner");if(N(ee(l.data),r.selectors,"selector"),u+=E(l.value??0,"value"),d+=E(l.gasLimit,"gasLimit"),w+=Wt(l),K(c)&&(l.l1FeeWei===void 0||l.operatorFeeWei===void 0))throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(u>E(r.maxValueWei,"maxValueWei"))throw new Error("policy: aggregate value exceeds cap");if(d>E(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: aggregate gas exceeds cap");if(w>E(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: aggregate fee exceeds cap");return{transactions:s,chainId:c,owner:a,totalValue:u,totalGas:d,totalFee:w}}function Gt(e,r,{nowMs:t=Date.now(),routeAttestationSecret:n}={}){let o=String(e?.surface||"");if(o!=="evm-swap"&&o!=="evm-bridge")throw new Error("envelope: strict EVM swap/bridge surface required");let i=pe(e.provider,"provider",64).toLowerCase();N(i,r.providers,"provider");let a=Jt(e,r,o,{nowMs:t}),f=[],c=-1;for(let p=0;p<a.transactions.length;p++){let m=a.transactions[p],h=Zn(m.data),b;if(h){if(c!==-1)throw new Error("envelope: approval must be before action");if(E(m.value??0,"value")!==0n)throw new Error("envelope: approval cannot transfer native value");let x=T(m.to,"approval token");if(N(x,r.tokens,"token"),N(h.spender,r.spenders,"spender"),h.amount>E(r.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap");b={...h,token:x,index:p}}else{if(c!==-1)throw new Error("envelope: exactly one swap/bridge action is supported per batch");N(m.to,r.destinations,"destination"),b={...oo(m.data,i),target:T(m.to,"action target"),index:p},c=p}let A=E(m.value??0,"value"),g=E(m.gasLimit,"gasLimit");f.push({...b,value:A,gas:g,fee:Wt(m)})}if(c<0)throw new Error("envelope: reviewed swap/bridge action required");let s=f[c],u=o==="evm-swap"?"swap":"bridge";if(s.action!==u||e.action!==u)throw new Error("envelope: surface/action/calldata mismatch");if(T(e.destination,"destination")!==s.target)throw new Error("envelope: destination must equal decoded action target");if(s.recipient!==a.owner)throw new Error("envelope: decoded recipient must equal owner");if(s.depositor&&s.depositor!==a.owner)throw new Error("envelope: decoded bridge depositor must equal owner");if(N(s.inputToken,r.tokens,"input token"),N(s.outputToken,r.tokens,"output token"),s.amountIn<=0n||s.amountIn>E(r.maxPerTrade,"maxPerTrade"))throw new Error("policy: decoded amount exceeds per-trade cap");if(s.minimumOut<=0n)throw new Error("policy: decoded minimum output must be positive");if(Pe(e.autoSlippage,{nowMs:t,chainId:a.chainId,venue:i,tx:a.transactions[c],secret:n,requireSigned:!0}),Number(e.slippageBps)!==Number(e.autoSlippage.selectedBps))throw new Error("policy: slippageBps must equal the authenticated quote selectedBps");if(s.minimumOut!==E(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"))throw new Error("policy: decoded minimum output does not match authenticated quote");if(s.action==="bridge"&&E(e.toChainId,"toChainId")!==s.destinationChainId)throw new Error("envelope: decoded bridge destination chain mismatch");let d=f.filter(p=>p.kind==="approval");if(!new Set([...Kn,...Array.isArray(r.nativeInputTokens)?r.nativeInputTokens.map(p=>String(p).toLowerCase()):[]]).has(s.inputToken))throw new Error("envelope: strict local signer swap/bridge requires native input token; use wallet signing for token-unit rails");if(d.length)throw new Error("envelope: native-value action must not include token approval");if(s.value!==s.amountIn)throw new Error("envelope: native value must exactly match decoded amountIn");let l=Object.freeze({quoteAmountOut:E(e.autoSlippage.quoteAmountOut,"authenticated quote amountOut"),minAmountOut:E(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"),selectedBps:Number(e.autoSlippage.selectedBps),quotedAtMs:Number(e.autoSlippage.quotedAtMs),expiresAtMs:Number(e.autoSlippage.expiresAtMs)});return{...a,decoded:f,action:s,provider:i,authenticatedQuote:l}}function uo(e,r,{nowMs:t}){let n=e.anvilAttestation,o=e.artifact?.anvilAttestation;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("envelope: Anvil attestation is required");if(!o||JSON.stringify(o)!==JSON.stringify(n))throw new Error("envelope: Anvil attestation artifact mismatch");if(Number(n.version)!==1||n.source!=="anvil-snapshot-rpc-reviewed-runtime")throw new Error("envelope: unsupported Anvil attestation");if(Number(n.chainId)!==4663)throw new Error("envelope: Anvil attestation chain mismatch");let i=T(e.destination,"Anvil market"),a=T(e.contract,"NFT contract"),f=T(e.paymentToken,"payment token");if(T(n.market,"attested Anvil market")!==i)throw new Error("envelope: Anvil attestation market mismatch");if(T(n.collection,"attested NFT collection")!==a)throw new Error("envelope: Anvil attestation collection mismatch");if(T(n.paymentToken,"attested payment token")!==f)throw new Error("envelope: Anvil attestation payment token mismatch");let c=Number(e.paymentTokenDecimals??e.artifact?.paymentTokenDecimals);if(!Number.isSafeInteger(c)||c<0||c>255||Number(n.paymentTokenDecimals)!==c)throw new Error("envelope: Anvil payment token decimals mismatch");let s=E(e.nativeSwapFeeWei??e.artifact?.nativeSwapFeeWei,"nativeSwapFeeWei").toString();if(E(n.nativeSwapFeeWei,"attested nativeSwapFeeWei").toString()!==s)throw new Error("envelope: Anvil attestation native swap fee mismatch");let u=Number(n.snapshotFetchedAtMs),d=Number(n.snapshotExpiresAtMs);if(!Number.isFinite(u)||!Number.isFinite(d)||u>t||d<=t||d<=u)throw new Error("envelope: Anvil snapshot attestation is stale");let w=E(n.blockNumber,"attested blockNumber");if(w<=0n||!/^0x[0-9a-f]{64}$/.test(String(n.blockHash||"").toLowerCase()))throw new Error("envelope: Anvil block attestation is invalid");let l=String(n.runtimeCodeHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(l))throw new Error("envelope: Anvil runtime code hash is invalid");let p=Object.entries(r.anvilRuntimeCodeHashes||{}).find(([h])=>h.toLowerCase()===i)?.[1];if(!p||String(p).toLowerCase()!==l)throw new Error("policy: Anvil runtime code hash is not reviewed");let m=Object.entries(r.nftPaymentTokenCaps||{}).find(([h])=>h.toLowerCase()===f)?.[1];if(!m||Number(m.decimals)!==c)throw new Error("policy: Anvil payment token decimals are not reviewed");return Object.freeze({...n,market:i,collection:a,paymentToken:f,paymentTokenDecimals:c,runtimeCodeHash:l,blockNumber:w})}function qt(e,r){let t=e.artifact,n=e.anvilQuote,o=t?.anvilQuote;if(!n||typeof n!="object"||Array.isArray(n)||!o||JSON.stringify(o)!==JSON.stringify(n))throw new Error("envelope: exact Anvil quote artifact mismatch");if(e.preconditions?.exactQuoteConfirmed!==!0)throw new Error("envelope: exact Anvil quote confirmation required");let i=r==="buy"?[[n.totalCostRaw,"anvilQuote.totalCostRaw"],[e.maxPaymentTokenAmountRaw,"maxPaymentTokenAmountRaw"],[t?.maxPaymentTokenAmountRaw,"artifact maxPaymentTokenAmountRaw"],[e.exactQuoteTotalCostRaw,"exactQuoteTotalCostRaw"],[t?.exactQuoteTotalCostRaw,"artifact exactQuoteTotalCostRaw"],[e.preconditions?.confirmedTotalCostRaw,"confirmedTotalCostRaw"]]:[[n.netPayoutRaw,"anvilQuote.netPayoutRaw"],[e.minPayoutRaw,"minPayoutRaw"],[t?.minPayoutRaw,"artifact minPayoutRaw"],[e.exactQuoteNetPayoutRaw,"exactQuoteNetPayoutRaw"],[t?.exactQuoteNetPayoutRaw,"artifact exactQuoteNetPayoutRaw"],[e.preconditions?.confirmedNetPayoutRaw,"confirmedNetPayoutRaw"]],a=E(i[0][0],i[0][1]);for(let[f,c]of i.slice(1))if(E(f,c)!==a)throw new Error(`envelope: Anvil ${r} exact settlement limit mismatch`);return a}function Vt(e,r,{nowMs:t=Date.now()}={}){if(e?.surface!=="evm-nft")throw new Error("envelope: evm-nft surface required");if(!["mint","nft"].includes(e.action))throw new Error("envelope: evm-nft requires mint or NFT action");let n=pe(e.provider||e.artifact?.provider||"opensea-nft","provider",64).toLowerCase();fe(n,r.providers,"provider");let o=Jt(e,r,"evm-nft",{nowMs:t});if(n==="anvil-nft"){if(e.action!=="nft")throw new Error("envelope: Anvil requires NFT action");if(o.chainId!==4663)throw new Error("envelope: Anvil requires chain 4663");if(r.confirmationMode!=="exact-human")throw new Error("policy: Anvil requires exact-human confirmation");if(o.transactions.length!==1)throw new Error("envelope: Anvil requires one atomic action with pre-existing approval");if(Number(e.slippageBps)!==0)throw new Error("envelope: Anvil exact limit requires zero slippageBps");let[l]=o.transactions,p=T(e.destination,"Anvil market");if(T(l.to,"Anvil action target")!==p)throw new Error("envelope: Anvil action target mismatch");N(p,r.destinations,"destination");let m=T(e.contract??e.artifact?.contract,"NFT contract");if(fe(m,r.nftContracts,"NFT contract"),T(e.marketCollection??e.artifact?.marketCollection,"Anvil market collection")!==m)throw new Error("envelope: Anvil market collection mismatch");let b=T(e.paymentToken??e.artifact?.paymentToken,"payment token");fe(b,r.erc20Tokens,"ERC20 token");let A=uo(e,r,{nowMs:t}),g=E(e.tokenId??e.artifact?.tokenId,"tokenId"),x=E(e.nativeSwapFeeWei??e.artifact?.nativeSwapFeeWei,"nativeSwapFeeWei");if(o.totalValue!==x||E(l.value??0,"Anvil action value")!==x)throw new Error("envelope: Anvil native swap fee mismatch");if(x>E(r.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"))throw new Error("policy: Anvil native swap fee exceeds cap");let v=pe(e.nftAction,"nftAction",8).toLowerCase(),P;if(v==="buy"){let S=qt(e,v),X=Object.entries(r.nftPaymentTokenCaps||{}).find(([V])=>V.toLowerCase()===b)?.[1];if(!X)throw new Error("policy: Anvil payment-token cap required");if(S>E(X.maxPerTradeRaw,"maxPerTradeRaw"))throw new Error("policy: Anvil payment amount exceeds cap");if(e.preconditions?.allowanceVerified!==!0||E(e.preconditions?.allowanceRaw,"allowanceRaw")<S)throw new Error("envelope: Anvil pre-existing allowance proof required");let _=Te.decodeFunctionData("buySpecificNFT",l.data);if(Te.encodeFunctionData("buySpecificNFT",[_[0],_[1]]).toLowerCase()!==String(l.data).toLowerCase())throw new Error("envelope: non-canonical Anvil buy calldata");if(BigInt(_[0])!==g)throw new Error("envelope: Anvil tokenId mismatch");if(BigInt(_[1])!==S)throw new Error("envelope: Anvil maxCost mismatch");P={kind:"nft",action:"buy",tokenId:g,maxPaymentTokenAmountRaw:S,target:p}}else if(v==="sell"){let S=e.preconditions||{},X=T(S.approvedAddress,"NFT approval address");if(S.nftApprovalVerified!==!0||X!==p&&S.approvedForAll!==!0)throw new Error("envelope: Anvil pre-existing NFT approval proof required");let _=qt(e,v),G=Te.decodeFunctionData("sellNFT",l.data);if(Te.encodeFunctionData("sellNFT",[G[0],G[1]]).toLowerCase()!==String(l.data).toLowerCase())throw new Error("envelope: non-canonical Anvil sell calldata");if(BigInt(G[0])!==g)throw new Error("envelope: Anvil tokenId mismatch");if(BigInt(G[1])!==_)throw new Error("envelope: Anvil minPayout mismatch");P={kind:"nft",action:"sell",tokenId:g,minPayoutRaw:_,target:p}}else throw new Error("envelope: unsupported Anvil NFT action");return{...o,provider:n,nftAction:v,tokenId:g,paymentToken:b,paymentTokenDecimals:A.paymentTokenDecimals,anvilAttestation:A,decoded:[P]}}let i=e.artifact?.oraclePrepared===!0?e.artifact:e.prepared;if(i?.oraclePrepared===!0&&Xe(i,{nowMs:t,providers:Array.isArray(r.providers)&&r.providers.length?r.providers:null,kinds:["nft-mint"],label:"local-signer"}),o.transactions.length!==1)throw new Error("envelope: mint supports exactly one transaction");let a=o.transactions[0],f=ee(a.data);N(f,r.selectors,"selector"),N(a.to,r.destinations,"destination");let c=so(a.data,n),s=T(e.contract??e.artifact?.contract,"NFT contract");if(fe(s,r.nftContracts,"NFT contract"),(c.contract||T(a.to,"NFT contract"))!==s)throw new Error("envelope: mint calldata NFT contract mismatch");if(c.recipient&&c.recipient!==o.owner)throw new Error("envelope: mint calldata recipient mismatch");c.feeRecipient&&fe(c.feeRecipient,r.nftFeeRecipients,"mint fee recipient");let d=E(e.quantity??e.artifact?.quantity,"quantity");if(d<=0n||d>E(r.maxMintQuantity??1,"maxMintQuantity"))throw new Error("policy: mint quantity exceeds cap");if(c.quantity!==d)throw new Error("envelope: mint calldata quantity mismatch");let w=E(e.totalWei??e.artifact?.totalWei,"totalWei");if(o.totalValue!==w)throw new Error("envelope: mint value does not match declared totalWei");if(c.mintType==="allowlist"){let l=BigInt(Math.floor(t/1e3));if(c.startTime>l||c.endTime<=l)throw new Error("policy: SeaDrop allowlist stage is not open");if(c.mintPrice*d!==w)throw new Error("envelope: SeaDrop allowlist price does not match declared totalWei")}if((e.priceWei!==void 0||e.artifact?.priceWei!==void 0)&&E(e.priceWei??e.artifact.priceWei,"priceWei")*d!==w)throw new Error("envelope: mint price does not match declared totalWei");if(w>E(r.maxMintTotalWei??r.maxValueWei,"maxMintTotalWei"))throw new Error("policy: mint total exceeds cap");return{...o,provider:n,decoded:[{...c,target:T(a.to,"mint target"),value:o.totalValue,gas:o.totalGas,fee:o.totalFee}]}}function Kt(e,{localsWaiver:r=!1}={}){if(!(e in Ue))throw new Error("fee: unknown action");return r?0:Ue[e]}function ie(e,r,{nowMs:t=Date.now(),verifyFeeWaiver:n,routeAttestationSecret:o,networkFees:i,requireNetworkFees:a=!1}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let f=pe(e.surface,"surface",16);if(!Ut.has(f))throw new Error("envelope: unsupported public surface");let c=pe(e.action,"action",32);N(f,r.surfaces,"surface"),N(c,r.actions,"action"),N(e.owner,r.owners,"owner"),N(e.destination,r.destinations,"destination");let s=Rt(r.maxTtlMs,"maxTtlMs"),u=Rt(r.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=t||e.expiresAtMs-t>s)throw new Error("policy: TTL outside bounds");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>u)throw new Error("policy: slippage exceeds cap");let d=e.artifact;if(!d||typeof d!="object"||Array.isArray(d))throw new Error("envelope: structured artifact required");if(f==="evm-swap"||f==="evm-bridge")Gt(e,r,{nowMs:t,routeAttestationSecret:o});else if(f==="evm-nft")Vt(e,r,{nowMs:t});else if(f==="evm"){if(!["transfer","approve","delegate","identity"].includes(c))throw new Error(c==="mint"?"envelope: generic evm requires transfer or approve; use strict evm-nft for mint action":"envelope: generic evm requires transfer, approve, delegate, or identity");if(c==="swap"||c==="bridge")throw new Error("envelope: surface/action mismatch; use strict decoded surface");if(Number(d.type)===4&&c!=="delegate")throw new Error("envelope: type-4 requires delegate");if(String(d.to).toLowerCase()!==String(e.destination).toLowerCase())throw new Error("envelope: destination mismatch");if(String(d.from).toLowerCase()!==String(e.owner).toLowerCase())throw new Error("envelope: artifact from mismatch with owner");Ee({...d,slippageBps:e.slippageBps,expiresAtMs:e.expiresAtMs},r,{nowMs:t,networkFees:i,requireNetworkFees:a});let p=String(d.data||"0x").toLowerCase(),m=E(d.value,"EVM value");if(c==="delegate"){if(Number(d.type)!==4)throw new Error("envelope: delegate requires type-4");if(p!=="0x")throw new Error("envelope: 7702 delegate calldata must be empty");if(m!==0n)throw new Error("envelope: 7702 delegate cannot transfer native value")}else if(c==="identity"){if(m!==0n)throw new Error("envelope: ERC-8004 identity cannot transfer native value");let h=p.slice(0,10);if(h!=="0xf2c298be"&&h!=="0x0af28bd3")throw new Error("envelope: ERC-8004 selector not allowed")}else if(p==="0x"){if(m===0n)throw new Error("envelope: native EVM transfer value required")}else if(Q(p)){if(m!==0n)throw new Error("envelope: EVM approval cannot transfer native value")}else throw new Error("envelope: unsupported generic EVM calldata")}else f==="btc"?nt(e,r):f==="sol"?mt(e,r):f==="hl"?yt(e,r):f==="poly"?St(e,r):f==="lighter"?Ot(e,r):f==="evm-order"&&Mt(e,r);let w=Number(e.fee?.oracleFeeBps)===0&&Ue[c]!==0;if(e.fee?.waiver||w&&!e.fee?.waiverAttestation)throw new Error("fee: verified waiver attestation required");if(w&&(typeof n!="function"||n(e.fee.waiverAttestation,e)!==!0))throw new Error("fee: waiver attestation invalid");let l=Kt(c,{localsWaiver:w});if(Number(e.fee?.oracleFeeBps)!==l)throw new Error("fee: final artifact fee mismatch");return!0}var Ie=Object.freeze([...Ut]),lo=Object.freeze({...Ht});function fo(e={}){let r={};for(let t of Ie){let n=e[t];if(n){if(typeof n.simulate!="function"||typeof n.sign!="function"||typeof n.broadcast!="function")throw new Error(`adapter: ${t} requires simulate, sign, and broadcast functions`);r[t]=Object.freeze({simulate:(o,i)=>n.simulate(structuredClone(o),structuredClone(i)),sign:(o,i)=>n.sign(structuredClone(o),structuredClone(i)),broadcast:(o,i,a)=>n.broadcast(o,structuredClone(i),structuredClone(a))})}}return Object.freeze(r)}function po(e,r){let t=e?.surface||"evm",n=r?.[t];if(!n)throw new Error(`adapter: ${t} is not configured on this self-host`);return n}import{ed25519 as Ws}from"@noble/curves/ed25519.js";import{base58 as mo}from"@scure/base";import{RawTx as Gs,SigHash as Vs,Transaction as wo}from"@scure/btc-signer";import{Transaction as ho,keccak256 as He,verifyTypedData as Ys}from"ethers";import{encode as Cs}from"@msgpack/msgpack";import{keccak256 as _s,verifyTypedData as Fs}from"ethers";var Ms=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),$s=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var Yt=e=>{if(typeof e!="string"||e.length===0||e.length>262144||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))return null;let r=Buffer.from(e,"base64");return r.toString("base64")===e?r:null};function go(e){let r=0,t=0,n=0;for(;n<e.length&&n<3;){let o=e[n++];if(r|=(o&127)<<t,(o&128)===0)return{value:r,offset:n};t+=7}return null}function Xt(e,r){try{if(e==="evm-order")return He(r);if(String(e).startsWith("evm"))return ho.from(r).hash;if(e==="btc"){let t=Yt(r);if(!t)return null;let n=wo.fromPSBT(t);return n.finalize(),n.extract(),n.id}if(e==="sol"){let t=Yt(r);if(!t)return null;let n=go(t);if(!n||n.value!==1)return null;let o=t.subarray(n.offset,n.offset+64);return o.length===64?mo.encode(o):null}if(e==="hl"&&typeof r=="string"&&r.startsWith("0x"))return He(r);if(e==="poly"&&typeof r=="string"&&r.startsWith("0x"))return He(r)}catch{}return null}var Eo=e=>String(e||"").toLowerCase();function j(e){return yo("sha256").update(JSON.stringify(e)).digest("hex")}function he(e,r,t={}){return Ee(e,r,t)}async function Ao(e,r={}){if(!K(e?.chainId))return{l1FeeWei:"0",operatorFeeWei:"0"};if(typeof r.estimateNetworkFees!="function")throw new Error("policy: rollup fee estimate required");let t=await r.estimateNetworkFees(e);if(!t||t.l1FeeWei===void 0||t.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");return{l1FeeWei:String(t.l1FeeWei),operatorFeeWei:String(t.operatorFeeWei)}}function Zt(e,r,t=!1){if(!K(e?.chainId))return!0;if(e.l1FeeWei===void 0||e.operatorFeeWei===void 0)throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei");if(t||r!=null){if(!r||r.l1FeeWei===void 0||r.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");let n=BigInt(e.l1FeeWei)+BigInt(e.operatorFeeWei),o=BigInt(r.l1FeeWei)+BigInt(r.operatorFeeWei);if(n<o)throw new Error("policy: rollup fee attestation understates estimate")}return!0}function So(e,r={}){return renderConfirmationArtifact(e,j(e),r)}function er(e){if(e==null)return null;let r={tenantId:String(e.tenantId||"").trim(),runId:String(e.runId||"").trim(),handoffHash:String(e.handoffHash||""),idempotencyKey:String(e.idempotencyKey||""),legIndex:e.legIndex,legCount:e.legCount};if(!r.tenantId||!r.runId||!/^[0-9a-f]{64}$/.test(r.handoffHash)||!/^sha256:[0-9a-f]{64}$/.test(r.idempotencyKey)||!Number.isSafeInteger(r.legIndex)||r.legIndex<0||!Number.isSafeInteger(r.legCount)||r.legCount<1||r.legIndex>=r.legCount)throw new Error("confirmation: binding is invalid");return r}var we=class{#e=new Map;constructor({now:r=Date.now}={}){this.now=r}issue({artifact:r,owner:t,ttlMs:n=6e4,binding:o}){if(!Number.isFinite(n)||!Number.isInteger(n)||n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let i=bo(32).toString("hex");return this.#e.set(i,{digest:j(r),owner:Eo(t),expiresAtMs:this.now()+n,binding:er(o)}),i}consume(r,t,n){let o=this.#e.get(String(r));if(!o)throw new Error("confirmation: used or unknown nonce");if(o.expiresAtMs<=this.now())throw this.#e.delete(String(r)),new Error("confirmation: expired nonce");let i=Buffer.from(o.digest,"hex"),a=Buffer.from(j(t),"hex");if(!xo(i,a))throw new Error("confirmation: artifact mismatch");if(JSON.stringify(o.binding)!==JSON.stringify(er(n)))throw new Error("confirmation: execution binding mismatch");return this.#e.delete(String(r)),o}clear(){this.#e.clear()}};function vo(e){let r=String(e?.data||"0x").toLowerCase(),t=BigInt(e?.value??0);if(r==="0x"){if(t<=0n)throw new Error("signer: native EVM transfer value required");return!0}if(Q(r)){if(t!==0n)throw new Error("signer: EVM approval cannot transfer native value");return!0}throw new Error("signer: unsupported EVM calldata; use a versioned envelope")}function To(e={},r={}){let t={};for(let n of new Set([...Object.keys(e||{}),...Object.keys(r||{})]))t[n]=(BigInt(r?.[n]??0)-BigInt(e?.[n]??0)).toString();return t}function Io(e){return e==="evm"||e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function Oe(e,r){let t=String(r||"");if(e==="evm-order"||String(e).startsWith("evm"))return/^0x[0-9a-fA-F]{64}$/.test(t);if(e==="btc")return/^[0-9a-fA-F]{64}$/.test(t);if(e==="sol")try{let n=Qt.decode(t);return n.length===64&&Qt.encode(n)===t}catch{return!1}return e==="hl"?/^0x[0-9a-fA-F]{64}$/.test(t):e==="poly"?/^0x[0-9a-fA-F]{64}$/.test(t):!1}function tr(e,r,t){return!Oe(e,r)||!Oe(e,t)?!1:e==="sol"?String(r)===String(t):String(r).toLowerCase()===String(t).toLowerCase()}function Oo(e){let r=e?.confirmationMode;if(r!=="exact-human"&&r!=="auto-within-rails")throw new Error("signer: confirmationMode must be exact-human or auto-within-rails");return r}async function We({artifact:e,envelope:r,nonce:t,deps:n,policy:o,confirmation:i,consumeNonce:a,nowMs:f}){let c=Oo(o);if(n.autonomous===!0){if(n.env?.ORACLE_AUTONOMOUS_TRADING!=="1")throw new Error("signer: autonomous execution requires ORACLE_AUTONOMOUS_TRADING=1");if(c!=="auto-within-rails")throw new Error("signer: autonomous execution requires auto-within-rails policy");if(typeof n.verifyTriggerAttestation!="function"||await n.verifyTriggerAttestation(r?.triggerAttestation,e,f())!==!0)throw new Error("signer: autonomous trigger attestation required");return i}if(c!=="exact-human")throw new Error("signer: non-autonomous execution requires exact-human exact confirmation policy");if(!n.confirmations)throw new Error("signer: exact-human confirmation store required");if(a)return n.confirmations.consume(t,e,n.confirmationBinding);if(!i||!Number.isFinite(i.expiresAtMs)||i.expiresAtMs<=f())throw new Error("confirmation: expired nonce");return i}function ko(e){return e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function No(e,r){return e&&ko(e.surface)?me(e):[r]}function Po(e,r){let t=e?.hash??null,n=e?.transactionHash??null;if(t!=null&&n!=null&&!tr(r,t,n))throw new Error("signer: receipt reports conflicting transaction hashes");return t||n||null}function Lo(e,r){let t=e?.verifiedBefore??e?.before,n=e?.verifiedAfter??e?.after;return{transactionHash:r,status:e?.status,balanceDeltaVerified:!!(e?.verifiedBefore&&e?.verifiedAfter),delta:To(t,n)}}function Co(e){return Number.isSafeInteger(e)&&e>0?"commit":"settle-failed"}async function ke(e,r,t){if(!t.isArmed())throw new Error("signer: disarmed");let n=typeof t.armGeneration=="function",o=typeof t.broadcastWithArmFence=="function";if(n!==o)throw new Error("signer: arm generation and broadcast fence must be configured together");let i=n?t.armGeneration():null,a=e?.version===1&&e?.surface?e:null,f=a?a.artifact:(()=>{let{tradeId:g,...x}=e||{};return x})(),c=No(a,f),s=typeof t.readPolicy=="function"?t.readPolicy():t.policy,u=()=>typeof t.nowMs=="function"?t.nowMs():t.nowMs??Date.now(),d=await We({artifact:e,envelope:a,nonce:r,deps:t,policy:s,confirmation:null,consumeNonce:!0,nowMs:u}),w=j(e),l=(g={})=>{a?ie(a,s,g):(he(f,s,{nowMs:g.nowMs,networkFees:g.networkFees,requireNetworkFees:g.requireNetworkFees}),vo(f))},p=async g=>{let x=!a||Io(a.surface),v=x?await Ao(g,t):void 0;return{nowMs:u(),verifyFeeWaiver:t.verifyFeeWaiver,routeAttestationSecret:t.routeAttestationSecret,networkFees:v,requireNetworkFees:x&&K(g?.chainId)}};l({nowMs:u(),verifyFeeWaiver:t.verifyFeeWaiver,routeAttestationSecret:t.routeAttestationSecret});for(let g of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof t[g]!="function")throw new Error(`signer: ${g} is required`);let m=t.reserveLedger(a||e,s);if(!m)throw new Error("signer: ledger reservation required");let h=!1,b=[];try{for(let[g,x]of c.entries()){if(typeof t.simulate!="function"||await t.simulate(x,a)!==!0)throw new Error("signer: strict affirmative simulation required");let v=await p(x);if((v.requireNetworkFees||v.networkFees!=null)&&Zt(x,v.networkFees,v.requireNetworkFees),!t.isArmed())throw new Error("signer: disarmed before signing");s=typeof t.readPolicy=="function"?t.readPolicy():t.policy,d=await We({artifact:e,envelope:a,nonce:r,deps:t,policy:s,confirmation:d,consumeNonce:!1,nowMs:u}),l(v),t.validateReservation(m,s,a&&typeof t.decodeEconomics=="function"?t.decodeEconomics(a,s):void 0),h=!0;let P=await t.sign(x,a);if(typeof t.verifySigned!="function"||await t.verifySigned(P,x,a)!==!0)throw new Error("signer: signed bytes do not match confirmed artifact");let S=a?.surface||"evm",X=Xt(S,P);if(t.executionAttempt&&await t.executionAttempt.recordSigned({txIndex:g,txCount:c.length,surface:S,signedTransactionId:X}),!t.isArmed())throw new Error("signer: disarmed before broadcast");if(j(e)!==w)throw new Error("signer: artifact mutated after signing");s=typeof t.readPolicy=="function"?t.readPolicy():t.policy,d=await We({artifact:e,envelope:a,nonce:r,deps:t,policy:s,confirmation:d,consumeNonce:!1,nowMs:u});let _=await p(x);(_.requireNetworkFees||_.networkFees!=null)&&Zt(x,_.networkFees,_.requireNetworkFees),l(_),t.validateReservation(m,s,a&&typeof t.decodeEconomics=="function"?t.decodeEconomics(a,s):void 0),t.executionAttempt&&await t.executionAttempt.recordBroadcastAuthorized({txIndex:g});let G=()=>t.broadcast(P,x,a),V=o?await t.broadcastWithArmFence(i,G):await G(),ge=V?.status,ye=Po(V,S);if(!tr(S,ye,X))throw new Error("signer: receipt transaction hash does not match signed bytes");if(ge===0||ge==="0x0")throw Oe(S,ye)?(t.executionAttempt&&await t.executionAttempt.recordCanonicalReceipt({txIndex:g,receipt:V}),Co(b.length)==="commit"?t.commitLedger(m):t.settleFailedLedger(m),new Error("signer: broadcast did not return a successful receipt")):new Error("signer: failed broadcast requires a valid transaction hash");if(ge!==1&&ge!=="0x1")throw new Error("signer: broadcast did not return a successful receipt");if(!Oe(S,ye))throw new Error("signer: successful broadcast requires a valid transaction hash");t.executionAttempt&&await t.executionAttempt.recordCanonicalReceipt({txIndex:g,receipt:V}),b.push(Lo(V,ye))}}catch(g){throw h||t.releaseLedger(m),g}if(t.commitLedger(m),b.length===1){let g={receipt:b[0]};return a?.surface==="evm-bridge"&&(g.originStatus="success",g.destinationStatus="unverified",g.destinationSuccess=!1,g.note="Origin-chain receipts do not prove destination-chain settlement."),g}let A={receipts:b,status:"success"};return a?.surface==="evm-bridge"&&(A.originStatus="success",A.destinationStatus="unverified",A.destinationSuccess=!1,A.note="Origin-chain receipts do not prove destination-chain settlement."),A}import Bo from"node:http";import{timingSafeEqual as _o}from"node:crypto";var rr=new Set(["127.0.0.1","::1","localhost"]),Fo=(e,r)=>{let t=Buffer.from(String(e)),n=Buffer.from(String(r));return t.length===n.length&&_o(t,n)},y=(e,r,t)=>{let n=JSON.stringify(t);e.writeHead(r,{"content-type":"application/json","cache-control":"no-store","content-length":Buffer.byteLength(n)}),e.end(n)};function Mo(e){let r=String(e||"");if(r.startsWith("[")){let t=r.indexOf("]");if(t>1)return r.slice(1,t)}return r.split(":")[0]}var ae=e=>new Promise((r,t)=>{let n=0,o=[],i=!1;e.on("data",a=>{n+=a.length,n>64*1024&&!i?(i=!0,t(new Error("request refused")),e.resume()):i||o.push(a)}),e.on("end",()=>{if(!i)try{r(JSON.parse(Buffer.concat(o).toString()||"{}"))}catch{t(new Error("request refused"))}}),e.on("error",t)}),nr=e=>e?.idempotencyKey===void 0?void 0:{tenantId:e.tenantId,runId:e.runId,handoffHash:e.handoffHash,idempotencyKey:e.idempotencyKey,legIndex:e.legIndex,legCount:e.legCount},$o=e=>e==="btc"||e==="sol"||["evm","evm-swap","evm-bridge","evm-nft"].includes(e);function Ro(e={}){let r=e.host||"127.0.0.1";if(!rr.has(r))throw new Error("signer: loopback bind required");if(String(e.token||"").length<32)throw new Error("signer: strong auth token required");for(let s of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof e[s]!="function")throw new Error(`signer: ${s} is required`);if(typeof e.disarm!="function")throw new Error("signer: disarm callback is required");let t=e.confirmations||new we,n=e.pending||new Map,o=(s,u)=>{try{e.ledgerObserver?.[s]?.(u)}catch{}};function i(s){let u=s.artifact?.version===1&&s.artifact?.surface?s.artifact:null,d=u?.artifact||s.artifact||{};return{id:s.digest.slice(0,8),digest:s.digest,surface:u?.surface||"evm",action:u?.action||"evm",chain:d.chainId??d.network??null,to:d.to||u?.destination||null,value:d.value??d.message?.sellAmount??d.message?.makingAmount??null,receiver:d.message?.receiver||d.typedData?.message?.receiver||null,maker:d.message?.maker||d.typedData?.message?.maker||null,makingAmount:d.message?.makingAmount||d.typedData?.message?.makingAmount||null,takingAmount:d.message?.takingAmount||d.typedData?.message?.takingAmount||null,sellAmount:d.message?.sellAmount||d.typedData?.message?.sellAmount||null,buyAmount:d.message?.buyAmount||d.typedData?.message?.buyAmount||null,kind:d.kind||null,type:d.type??null,authorizationList:d.authorizationList||null,feeAmount:d.message?.feeAmount||d.typedData?.message?.feeAmount||null,createdAtMs:s.createdAtMs}}function a(s){let u=String(s||"").trim().toLowerCase().replace(/^0x/,"");return u?[...n.values()].filter(d=>d.digest.toLowerCase().startsWith(u)||d.digest.slice(0,8)===u):[...n.values()]}let f=e.origin||`http://${r}`;return Bo.createServer(async(s,u)=>{try{let d=String(s.headers.authorization||"").replace(/^Bearer /i,"");if(!Fo(d,e.token))return y(u,401,{error:"unauthorized"});let w=Mo(s.headers.host);if(!rr.has(w))return y(u,403,{error:"host refused"});if(s.headers.origin&&s.headers.origin!==f)return y(u,403,{error:"origin refused"});if(s.method==="GET"&&s.url==="/status"){let l=typeof e.readPolicy=="function"?e.readPolicy():e.policy,p=new Set(Ie),m=Array.isArray(l?.surfaces)?l.surfaces.filter(h=>typeof h=="string"&&p.has(h)):[];return y(u,200,{ok:!0,service:"oracle-signer",armed:e.isArmed?.()===!0,surfaces:m,sessionExpiresAtMs:e.sessionExpiresAtMs||null})}if(s.method==="POST"&&s.url==="/disarm")return await e.disarm(),t.clear(),n.clear(),y(u,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(s.method))return y(u,405,{error:"request refused"});if(s.method==="POST"&&String(s.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return y(u,415,{error:"request refused"});if(s.method==="GET"&&s.url==="/pending"){let l=[...n.values()].map(i);return y(u,200,{ok:!0,armed:e.isArmed?.()===!0,count:l.length,items:l})}if(s.method==="GET"&&String(s.url||"").startsWith("/execute/status?")){if(!e.executionOutbox)return y(u,503,{error:"execution outbox unavailable"});let l=new URL(String(s.url),f).searchParams.get("attemptKey"),p=await e.executionOutbox.inspect(l);return p?y(u,200,{ok:!0,attempt:p}):y(u,404,{error:"execution attempt not found"})}if(s.method==="POST"&&s.url==="/pending"){if(e.autonomous===!0)return y(u,403,{error:"autonomous signer does not queue human approvals"});let p=(await ae(s)).artifact;if(!p||typeof p!="object")return y(u,400,{error:"artifact required"});let m=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(m?.confirmationMode!=="exact-human")return y(u,403,{error:"exact-human policy required"});let h=typeof e.nowMs=="function"?e.nowMs():Date.now();if(p?.surface==="cex"){if(typeof e.inspectCex!="function")return y(u,403,{error:"cex execution unavailable"});e.inspectCex(p,m,h)}else if(p?.version===1&&p?.surface)ie(p,m,{nowMs:h,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:g,...x}=p||{};he(x,m,{nowMs:h})}let b=j(p),A=p?.surface==="cex"?Object.freeze(structuredClone(p)):p;return n.set(b,{artifact:A,digest:b,createdAtMs:h}),o("queued",{digest:b,createdAtMs:h}),y(u,200,{ok:!0,...i(n.get(b))})}if(s.method==="POST"&&s.url==="/ack"){if(e.autonomous===!0)return y(u,403,{error:"autonomous signer does not accept messaging acks"});let l=await ae(s),p=a(l.digest||l.id);if(p.length===0)return y(u,404,{error:"no pending artifact"});if(p.length>1)return y(u,409,{error:"ambiguous digest; pass more hex"});let m=p[0];if((typeof e.readPolicy=="function"?e.readPolicy():e.policy)?.confirmationMode!=="exact-human")return y(u,403,{error:"exact-human policy required"});if(e.isArmed?.()!==!0)return y(u,403,{error:"signer is disarmed"});let b=e.verifyOwnerProof||e.verifyCexOwnerProof;if(typeof b!="function"||b(l.ownerProof,{digest:m.digest})!==!0)return y(u,403,{error:"exact owner Allow proof required"});if(m.artifact?.surface==="cex"){if(typeof e.cexExecute!="function")return y(u,403,{error:"cex execution unavailable"});n.delete(m.digest),o("approved",{digest:m.digest});let x;try{x=await e.cexExecute(m.artifact)}catch(v){throw o("failed",{digest:m.digest,reason:String(v?.message||v)}),v}return o("executed",{digest:m.digest,owner:m.artifact?.owner??m.artifact?.from,result:x}),y(u,200,{ok:!0,executed:!0,digest:m.digest,id:m.digest.slice(0,8),result:x})}n.delete(m.digest);let A=t.issue({artifact:m.artifact,owner:m.artifact?.owner??m.artifact?.from,ttlMs:l.ttlMs});o("approved",{digest:m.digest});let g;try{g=await ke(m.artifact,A,{...e,confirmations:t})}catch(x){throw o("failed",{digest:m.digest,reason:String(x?.message||x)}),x}return o("executed",{digest:m.digest,owner:m.artifact?.owner??m.artifact?.from,result:g}),y(u,200,{ok:!0,executed:!0,confirmationNonce:A,digest:m.digest,id:m.digest.slice(0,8),result:g})}if(s.method==="POST"&&s.url==="/deny"){let l=await ae(s),p=a(l.digest||l.id);return p.length===0?y(u,404,{error:"no pending artifact"}):p.length>1?y(u,409,{error:"ambiguous digest; pass more hex"}):(n.delete(p[0].digest),o("denied",{digest:p[0].digest}),y(u,200,{ok:!0,denied:!0,id:p[0].digest.slice(0,8)}))}if(s.method==="POST"&&s.url==="/confirm"){if(e.autonomous===!0)return y(u,403,{error:"autonomous signer does not issue human confirmation nonces"});let l=await ae(s);if(l.artifact?.surface==="cex")return y(u,403,{error:"cex requires pending owner ack"});let p=j(l.artifact),m=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(m?.confirmationMode!=="exact-human")return y(u,403,{error:"exact-human policy required"});let h=typeof e.nowMs=="function"?e.nowMs():Date.now();if(l.artifact?.version===1&&l.artifact?.surface)ie(l.artifact,m,{nowMs:h,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:b,...A}=l.artifact||{};he(A,m,{nowMs:h})}return typeof e.confirmArtifact!="function"?y(u,403,{error:"local human confirmation unavailable"}):await e.confirmArtifact(l.artifact,p,m)!==!0?y(u,400,{error:"exact human confirmation refused"}):y(u,200,{confirmationNonce:t.issue({artifact:l.artifact,owner:l.artifact?.owner??l.artifact?.from,ttlMs:l.ttlMs,binding:nr(l)})})}if(s.method==="POST"&&s.url==="/execute/reconcile"){let l=await ae(s);if(!e.executionOutbox||typeof e.observeExecutionTransaction!="function")return y(u,503,{error:"execution reconciliation unavailable"});let p=await e.executionOutbox.reconcile({attemptKey:l.attemptKey,observeTransaction:e.observeExecutionTransaction,commitLedger:e.commitLedger,settleFailedLedger:e.settleFailedLedger});return y(u,200,{ok:!0,attempt:p})}if(s.method==="POST"&&s.url==="/execute"){let l=await ae(s);if(l.artifact?.surface==="cex")return y(u,403,{error:"cex requires pending owner ack"});let p=typeof e.executeArtifact=="function"?e.executeArtifact:ke;if(l.idempotencyKey!==void 0){if(!$o(l.artifact?.surface))return y(u,422,{error:"surface does not support durable Team execution reconciliation"});if(!e.executionOutbox)return y(u,503,{error:"execution outbox required for idempotent execution"});let h=await e.executionOutbox.begin({attemptKey:l.idempotencyKey,artifact:l.artifact,tenantId:l.tenantId,runId:l.runId,handoffHash:l.handoffHash,legIndex:l.legIndex,legCount:l.legCount});if(h.state==="recovery-required")return y(u,409,{error:"execution recovery-required; automatic replay refused",transactions:h.transactions||[]});if(h.state==="failed")return y(u,409,{error:"execution has a canonical failed receipt",receipts:h.receipts||[]});if(h.state==="completed")return n.delete(j(l.artifact)),y(u,200,h.result);let b=await e.executionOutbox.acquireExecutor({attemptKey:l.idempotencyKey}),A={recordSigned:g=>e.executionOutbox.recordSigned({attemptKey:l.idempotencyKey,leaseId:b,...g}),recordBroadcastAuthorized:g=>e.executionOutbox.recordBroadcastAuthorized({attemptKey:l.idempotencyKey,leaseId:b,...g}),recordCanonicalReceipt:g=>e.executionOutbox.recordCanonicalReceipt({attemptKey:l.idempotencyKey,leaseId:b,...g})};try{let g={...e,confirmations:t,confirmationBinding:nr(l),executionAttempt:A,reserveLedger:(v,P)=>e.reserveLedger(v,P,{retryReleasedTradeId:h.retryReleasedTradeId})},x=await p(l.artifact,l.confirmationNonce,g);return await e.executionOutbox.complete({attemptKey:l.idempotencyKey,leaseId:b,result:x}),n.delete(j(l.artifact)),y(u,200,x)}catch(g){throw await e.executionOutbox.failPreSubmission({attemptKey:l.idempotencyKey,leaseId:b,error:g}),g}finally{await e.executionOutbox.releaseExecutor({attemptKey:l.idempotencyKey,leaseId:b})}}let m=await p(l.artifact,l.confirmationNonce,{...e,confirmations:t});return n.delete(j(l.artifact)),y(u,200,m)}return y(u,404,{error:"not found"})}catch(d){e.onError?.(String(d?.message||d));let w=String(s.url||"");return w==="/pending"||w==="/ack"||w==="/deny"?y(u,400,{error:String(d?.message||"request refused").slice(0,300)}):y(u,400,{error:"request refused"})}})}import{createHmac as qo}from"node:crypto";import{HDNodeWallet as jo,Mnemonic as Uo,Wallet as sr}from"ethers";function Do(e){return BigInt(e).toString(16).padStart(64,"0")}function or(e){return e.slice(2).padStart(64,"0")}function ir(e,r,t){return`0x42842e0e${or(e)}${or(r)}${Do(t)}`}var Ho=/^(?:[a-z]+ ){11}[a-z]+$|^(?:[a-z]+ ){23}[a-z]+$/,Wo=/^(?:0x)?[0-9a-fA-F]{64}$/;function zo(e){let r=String(e||"").trim().toLowerCase().replace(/\s+/g," ");if(!Ho.test(r))return null;try{if(!Uo.isValidMnemonic(r))return null}catch{return null}return r}function Jo(e){let r=String(e||"").trim();return Wo.test(r)?r.startsWith("0x")?r:`0x${r}`:null}function Go(e,r){let t=Buffer.from(e.replace(/^0x/i,""),"hex");return`0x${qo("sha256",t).update(`oracle-mint-fanout:v1:${r}`).digest("hex")}`}function ze(e,r,t,n){return{index:e,address:String(r).toLowerCase(),path:t,kind:n}}function Vo(e,{childCount:r}={}){let t=Number(r);if(!Number.isInteger(t)||t<1)throw new Error("hd-fanout: childCount must be a positive integer");if(t>32)throw new Error(`hd-fanout: childCount exceeds hard max ${32}`);let n=zo(e);if(n){let i=[];for(let a=0;a<=t;a++){let f=`m/44'/60'/0'/0/${a}`,c=jo.fromPhrase(n,"",f);i.push(ze(a,c.address,f,"bip44"))}return{kind:"bip44",main:i[0],children:i.slice(1)}}let o=Jo(e);if(o){let i=new sr(o),a=[];for(let f=1;f<=t;f++){let c=new sr(Go(o,f));a.push(ze(f,c.address,`hmac:v1:${f}`,"hmac"))}return{kind:"hmac",main:ze(0,i.address,"vault-key","hmac"),children:a}}throw new Error("hd-fanout: secret must be a BIP-39 mnemonic or a 32-byte hex key")}function Ko(e,r){let t=String(r||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(t))throw new Error("hd-fanout: vault address required");if(e.main.address!==t)throw new Error(`hd-fanout: derived main ${e.main.address} does not match vault ${t} (BIP-44 index 0 must be the vault wallet, or use the raw-key HMAC path)`)}function Yo(e,{nonce:r,value:t}){let n={type:2,chainId:e.chainId,to:e.to,data:e.data&&e.data!=="0x"?e.data:"0x",value:BigInt(t??e.value??0),gasLimit:BigInt(e.gasLimit),maxFeePerGas:BigInt(e.maxFeePerGas),maxPriorityFeePerGas:BigInt(e.maxPriorityFeePerGas||0)};return r!=null&&(n.nonce=Number(r)),n}async function Xo(e,r){if(e.valueMode!=="remainder")return e.value;if(typeof r!="function")throw new Error("mint-fanout: getBalance required for remainder sweep");let t=BigInt(await r(e.from)),n=BigInt(e.gasLimit)*BigInt(e.maxFeePerGas);return(t>n?t-n:0n).toString()}function Qo(e,r){if(e.kind!=="sweep-nft"||!e.needsTokenId)return e;if(r==null||String(r).length===0)throw new Error(`mint-fanout: hop ${e.step} needs tokenId after mint`);return{...e,needsTokenId:!1,tokenId:String(r),data:ir(e.from,e.nftTo,BigInt(r))}}async function Zo(e,{byAddress:r,getNonce:t,getBalance:n,tokenIdsByChildIndex:o={}}={}){if(!e||e.signed)throw new Error("mint-fanout: unsigned plan required");if(!(r instanceof Map))throw new Error("mint-fanout: wallet map required");let i=[],a=new Map;for(let f of e.hops){let c=Qo(f,o[f.walletIndex]),s=String(c.from).toLowerCase(),u=r.get(s);if(!u)throw new Error(`mint-fanout: no local key for ${s}`);let d=await Xo(c,n),w=c.nonce;if(w==null){if(typeof t!="function")throw new Error("mint-fanout: getNonce required when hops omit nonce");a.has(s)||a.set(s,Number(await t(s))),w=a.get(s),a.set(s,w+1)}let l=Yo(c,{nonce:w,value:d}),p=await u.signTransaction(l);i.push({step:c.step,kind:c.kind,walletIndex:c.walletIndex,from:c.from,to:c.to,chainId:c.chainId,value:String(d),nonce:w,delayMsAfter:c.delayMsAfter||0,signedRaw:p})}return{execution:"signed-local",signed:!0,main:e.main,chainId:e.chainId,contract:e.contract,hopCount:i.length,hops:i}}async function ei(e,{broadcastFn:r,sleepFn:t=n=>new Promise(o=>setTimeout(o,n))}={}){if(!e?.signed)throw new Error("mint-fanout: signed plan required");if(typeof r!="function")throw new Error("mint-fanout: broadcastFn required");let n=[];for(let o of e.hops){let i=await r(o.signedRaw,o);if(!i?.hash)throw new Error(`mint-fanout: hop ${o.step} broadcast returned no hash`);n.push({step:o.step,kind:o.kind,from:o.from,hash:i.hash}),o.delayMsAfter>0&&await t(o.delayMsAfter)}return{ok:!0,receipts:n}}export{we as ConfirmationStore,Ie as PUBLIC_SIGNER_SURFACES,lo as REVIEWED_EVM_SELECTORS,j as artifactDigest,he as assertExactPolicy,Ko as assertMainMatchesVault,ei as broadcastMintFanout,Ro as createSignerServer,fo as createSurfaceAdapters,Vo as deriveFanoutAccounts,me as evmTransactions,ke as executeConfirmedArtifact,So as inspectArtifactForConfirmation,Gt as inspectEvmBatch,Vt as inspectEvmNft,Kt as publicFeeBps,Zo as signMintFanoutPlan,po as surfaceAdapterFor,ie as validateSurfaceEnvelope};
1
+ var ct=(e,t,r)=>()=>{if(r)throw r[0];try{return e&&(t=e(e=0)),t}catch(n){throw r=[n],n}};function We(e,t="$",r=""){if(e==null||typeof e=="boolean")return e;if(typeof e=="string"){let o=e.trim().split(/\s+/);if(tn.test(e)||rn.has(o.length)&&o.every(i=>/^[a-z]+$/i.test(i)))throw new Oe(t);return e}if(typeof e=="bigint")return e.toString();if(typeof e=="number"){if(!Number.isSafeInteger(e))throw new TypeError(`sign-time review: safe integer required at ${t}`);return e}if(Array.isArray(e))return e.map((o,i)=>We(o,`${t}[${i}]`,r));te(e,t);let n={};for(let o of Object.keys(e).sort()){let i=o.replace(/[^a-z0-9]/gi,"");if(en.test(i))throw new Oe(`${t}.${o}`);e[o]!==void 0&&(n[o]=We(e[o],`${t}.${o}`,o))}return n}function te(e,t){if(e==null||typeof e!="object"||Array.isArray(e)||Object.getPrototypeOf(e)!==Object.prototype)throw new TypeError(`sign-time review: ${t} must be a plain object`);return e}function pe(e,t){if(e==null||e==="")throw new TypeError(`sign-time review: ${t} required`);return e}function ie(e,t){let r=String(pe(e,t)).toLowerCase();if(!Xr.test(r))throw new TypeError(`sign-time review: ${t} must be an EVM address`);return r}function K(e,t,{positive:r=!1}={}){try{let n=BigInt(pe(e,t));if(n<0n||r&&n===0n)throw new Error;return n.toString()}catch{throw new TypeError(`sign-time review: ${t} must be an unsigned integer`)}}function He(e,t){if(typeof e!="string"||e.length===0||e.length>500||e!==e.trim())throw new TypeError(`sign-time review: ${t} must be non-empty text`);return e}function ft(e){if(e&&typeof e=="object"&&!Object.isFrozen(e)){for(let t of Object.values(e))ft(t);Object.freeze(e)}return e}function nn(e,t){if(typeof e=="boolean")return{passed:e,reason:e?"passed":"failed"};te(e,t);let r=e.passed??e.ok??e.allowed;if(typeof r!="boolean")throw new TypeError(`sign-time review: ${t} needs a boolean result`);let n=e.reason??e.message??e.name??(r?"passed":"failed");return{...e,passed:r,reason:He(String(n),`${t}.reason`)}}function on(e){if(!Array.isArray(e))throw new TypeError("sign-time review: policyChecks must be an array");let t=e.map((n,o)=>nn(n,`policyChecks[${o}]`)),r=t.filter(n=>!n.passed);return{checks:t,passed:t.length-r.length,failed:r.length,reasons:r.map(n=>n.reason)}}function an(e){if(e==null)return null;if(te(e,"simulation"),typeof e.status!="string"||!["ok","success","failed","error","unavailable","unknown"].includes(e.status))throw new TypeError("sign-time review: simulation.status is invalid");if(e.willRevert!==!0&&e.willRevert!==!1&&e.willRevert!==null)throw new TypeError("sign-time review: simulation.willRevert must be boolean or null");let t={status:e.status,willRevert:e.willRevert??null,summary:He(String(e.summary??"simulation result recorded"),"simulation.summary")};return e.gasEstimate!=null&&(t.gasEstimate=K(e.gasEstimate,"simulation.gasEstimate")),e.gasLimit!=null&&(t.gasLimit=K(e.gasLimit,"simulation.gasLimit")),t}function sn(e){if(e==null)return null;if(!Array.isArray(e)||e.length===0)throw new TypeError("sign-time review: assetDeltas must be a non-empty array");return e.map((t,r)=>{te(t,`assetDeltas[${r}]`);let n=K(t.before,`assetDeltas[${r}].before`),o=K(t.after,`assetDeltas[${r}].after`),i=(BigInt(o)-BigInt(n)).toString(),s;try{s=t.delta==null?i:BigInt(t.delta).toString()}catch{throw new TypeError(`sign-time review: assetDeltas[${r}].delta must be an integer`)}if(s!==i)throw new TypeError(`sign-time review: assetDeltas[${r}].delta does not match before/after`);return{...t,asset:He(String(pe(t.asset??t.token,`assetDeltas[${r}].asset`)),`assetDeltas[${r}].asset`),before:n,after:o,delta:s}})}function cn(e){if(e==null)return[];if(!Array.isArray(e))throw new TypeError("sign-time review: approvalDeltas must be an array");return e.map((t,r)=>{te(t,`approvalDeltas[${r}]`);let n=K(t.amount??t.after,`approvalDeltas[${r}].amount`);if(t.revokeLike!=null&&typeof t.revokeLike!="boolean")throw new TypeError(`sign-time review: approvalDeltas[${r}].revokeLike must be boolean`);return{token:ie(t.token,`approvalDeltas[${r}].token`),spender:ie(t.spender,`approvalDeltas[${r}].spender`),owner:ie(t.owner,`approvalDeltas[${r}].owner`),amount:n,revokeLike:t.revokeLike??BigInt(n)===0n}})}function pt(e={}){te(e,"input");let t=We(e),r=t.tx==null?t:te(t.tx,"tx"),n=K(t.chainId??r.chainId,"chainId",{positive:!0}),o=ie(t.account??t.from??r.from,"account/from"),i=ie(t.destination??t.to??r.to,"destination/to"),s=String(pe(t.prepareHash,"prepareHash")).toLowerCase();if(!Qr.test(s))throw new TypeError("sign-time review: prepareHash must be a 32-byte hash");let d=t.route??t.venue;if(d==null)throw new TypeError("sign-time review: route/venue required");let u=t.decodedCalldata??t.decodedAction;if(u==null)throw new TypeError("sign-time review: decodedCalldata or decodedAction required");let a=String(pe(t.calldata??t.data??r.data,"calldata/data")).toLowerCase();if(!Zr.test(a))throw new TypeError("sign-time review: calldata/data must be even-length hex");let c=t.policyChecks!==void 0&&t.policyChecks!==null,l=on(c?t.policyChecks:[]),m=an(t.simulation),f=sn(t.assetDeltas),p=cn(t.approvalDeltas),w=t.allowlistHits??[];if(!Array.isArray(w))throw new TypeError("sign-time review: allowlistHits must be an array");let h=m?.willRevert===!0||["failed","error"].includes(m?.status),b=m!=null&&m.willRevert===!1&&["ok","success"].includes(m.status),A=h||l.failed>0?"BLOCKED":b&&c&&l.checks.length>0&&f!=null?"READY":"UNKNOWN",g=typeof u=="string"?u:u.method??u.action??u.type??"transaction",E=`${A}: review ${g} on chain ${n}; policy ${l.passed} passed, ${l.failed} failed; ${f?.length??0} asset delta${f?.length===1?"":"s"}; local signature required`,v={reviewVersion:1,status:A,requiresLocalSignature:!0,signingLocal:!0,custody:"none",execution:"review-only",chainId:n,account:o,from:o,route:d,venue:t.venue??(typeof d=="string"?d:d.venue??d.provider??null),destination:i,to:i,...t.spender==null?{}:{spender:ie(t.spender,"spender")},prepareHash:s,...t.decodedCalldata!==void 0?{decodedCalldata:t.decodedCalldata}:{decodedAction:t.decodedAction},calldata:a,data:a,selector:a.length>=10?a.slice(0,10):null,value:K(t.value??r.value??0,"value"),...(t.gasEstimate??r.gasEstimate)==null?{}:{gasEstimate:K(t.gasEstimate??r.gasEstimate,"gasEstimate")},...(t.gasLimit??r.gasLimit)==null?{}:{gasLimit:K(t.gasLimit??r.gasLimit,"gasLimit")},simulation:m,policyChecks:l,allowlistHits:w,assetDeltas:f,approvalDeltas:p,summary:E};return ft(v)}var Xr,Zr,Qr,en,tn,rn,Oe,mt=ct(()=>{Xr=/^0x[0-9a-f]{40}$/,Zr=/^0x(?:[0-9a-f]{2})*$/,Qr=/^(?:0x)?[0-9a-f]{64}$/,en=/(privatekey|privkey|secretkey|seedphrase|mnemonic|passphrase|password|keystore|keymaterial|wif|xprv|xpriv|bearer|authorization|signature|apikey|credential)/i,tn=/\b(?:[5KL][1-9A-HJ-NP-Za-km-z]{50,51}|xprv[0-9A-Za-z]{50,})\b/,rn=new Set([12,15,18,21,24]),Oe=class extends Error{constructor(t){super(`sign-time review refused: secret-bearing field at ${t}`),this.name="SignTimeReviewSecretError",this.code="SIGN_TIME_REVIEW_SECRET"}}});import{createHash as Co,createHmac as ec,timingSafeEqual as tc}from"node:crypto";function _o(e){let t=e==null||e===""?Qe:Number(e);return!Number.isFinite(t)||t<0?Qe:Math.min(t,Vt)}function et(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(et).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${et(e[r])}`).join(",")}}`}function Bo(e){let{prepareHash:t,prepareMac:r,note:n,...o}=e||{};return o}function Fo(e){let t=Bo(e);return Co("sha256").update(et(t)).digest("hex")}function Kt(e,{maxAgeMs:t=Qe,nowMs:r=Date.now(),providers:n=null,kinds:o=null,label:i="operator"}={}){if(!e||typeof e!="object")throw new Error(`${i}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${i}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==Ro)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let s=Fo(e);if(String(e.prepareHash||"")!==s)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let d=Number(e.preparedAt),u=Number(e.expiresAt),a=_o(t),c=r-d,l=u-d;if(!Number.isFinite(c)||!Number.isFinite(u)||!Number.isFinite(l)||c<0||l<=0||l>Vt||c>a||r>=u)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${c}, max=${a})`);if(n&&!new Set(n).has(e.provider))throw new Error(`${i}: provider ${e.provider} not allowed here`);if(o&&!new Set(o).has(e.kind))throw new Error(`${i}: kind ${e.kind} not allowed here`);return!0}var Ro,Qe,Vt,_e=ct(()=>{Ro=2,Qe=300*1e3,Vt=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})()});import{Interface as zr,MaxUint256 as Jr,isAddress as Vr,keccak256 as La,toUtf8Bytes as $a}from"ethers";import{Interface as Hr,isAddress as fa}from"ethers";import{isAddress as aa}from"ethers";import{createHash as _r,createHmac as Br,timingSafeEqual as Fr}from"node:crypto";import{readFileSync as Lr}from"node:fs";import{homedir as $r}from"node:os";import{join as ke}from"node:path";function Cr(){if(process.env.ORACLE_TEST_ISOLATE_SECRETS==="1"){let r=(process.env.ORACLE_EXEC_ENV_FILE||"").trim();return r?[r]:[]}let e=(process.env.ORACLE_EXEC_ENV_FILE||process.env.MAD_EXEC_ENV_FILE||"").trim(),t=$r();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||ke(t,".config","oracle")).trim();return[e,ke(r,"exec.env")].filter(Boolean)}return[e,ke(t,".config","oracle","exec.env"),ke(t,".config","mad-desk","exec.env")].filter(Boolean)}function fe(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of Cr())try{let i=Lr(o,"utf8"),s=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(s&&(n=s[1].trim(),n))break}catch{}if(!String(n||"").trim())throw new Error(`${t} required for attestation. Set it in the environment, or place ${t}=<value> in ~/.config/oracle/exec.env`);return n}function oe(e,t,r="guard"){if(typeof t!="number"||!Number.isFinite(t))throw new Error(`${r}: current time must be a finite number (got ${Rr(t)})`);let n=t,o=Number(e?.issuedAtMs),i=Number(e?.expiresAtMs);if(!Number.isFinite(i))throw new Error(`${r}: expiresAtMs is required and must be a finite number`);if(n>i)throw new Error(`${r} expired at ${i}, now ${n}`);if(e?.issuedAtMs!=null){if(!Number.isFinite(o))throw new Error(`${r}: issuedAtMs must be a finite number when present`);if(i<=o)throw new Error(`${r}: expiry must be after issuance`)}return{now:n,issuedAtMs:o,expiresAtMs:i}}function Rr(e){return e===null?"null":e===void 0?"undefined":typeof e=="number"?String(e):`${typeof e} ${JSON.stringify(String(e)).slice(0,24)}`}var ut=100;function je(e){return Array.isArray(e)?`[${e.map(je).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${je(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function Mr(e,{required:t=!1}={}){try{return fe(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function Dr(e){let{signature:t,...r}=e;return r}function qr(e){let t=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(t)||t.length<10||t.length%2!==0)throw new Error("auto-slippage calldata must be even-length hex with a selector");return _r("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function jr(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:Fr(r,n)}function Ur(e){let t=String(e||"");if(!/^0x[0-9a-fA-F]+$/.test(t)||t.length<10||t.length%2!==0)return null;let r=t.slice(0,10).toLowerCase(),n=[];for(let i=10;i+64<=t.length;i+=64)n.push(t.slice(i,i+64));let o=i=>n[i]==null?null:BigInt("0x"+n[i]);switch(r){case"0x414bf389":return o(6);case"0x04e45aaf":return o(5);case"0xc04b8d59":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+4)}case"0xb858183f":{let i=o(0);if(i==null)return null;let s=Number(i)/32;return!Number.isInteger(s)||s<0?null:o(s+3)}case"0xa026383e":return o(6);case"0x38ed1739":case"0x5c11d795":return o(1);case"0x7ff36ab5":case"0xb6f9de95":return o(0);case"0x18cbafe5":case"0x791ac947":return o(1);default:return null}}function Ue(e,{nowMs:t=Date.now(),chainId:r,venue:n,secret:o,tx:i,requireSigned:s=!1}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");let d=Mr(o,{required:s});if(s&&!d)throw new Error("auto-slippage attestation secret required for signing or broadcast");if(d){let p=Br("sha256",d).update(je(Dr(e))).digest("hex");if(!jr(e.signature,p))throw new Error("auto-slippage guard signature mismatch \u2014 the guard was not issued by this Oracle")}else if(e.signature)throw new Error("auto-slippage guard carries a signature but no attestation secret is configured");let u=Number(e.selectedBps),a=Number(e.capBps);if(!Number.isInteger(u)||u<0||u>ut)throw new Error("auto-slippage selected tolerance exceeds hard 100 bps cap");if(!Number.isInteger(a)||a<0||a>ut||u>a)throw new Error("auto-slippage cap exceeds hard 100 bps cap");try{oe({expiresAtMs:e.expiresAtMs,issuedAtMs:e.quotedAtMs},t,"auto-slippage quote")}catch(p){throw new Error(`${p.message}; re-quote before signing`)}if(r!=null&&Number(e.chainId)!==Number(r))throw new Error("auto-slippage guard chain mismatch");if(n&&String(e.venue).toLowerCase()!==String(n).toLowerCase())throw new Error("auto-slippage guard venue mismatch");let c=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(c<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let m=c*BigInt(1e4-u),f=m/10000n;if(m%10000n!==0n&&(f+=1n),l<f)throw new Error("auto-slippage guard is under-protected relative to its fresh quote");if(i?.data&&e.minAmountOut!=null){let p=Ur(i.data);if(e.calldataHash!=null){if(String(e.calldataHash)!==qr(i.data))throw new Error("auto-slippage guard is not bound to this call: calldata hash mismatch");if(p!=null&&p!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is hash-bound but the calldata encodes ${p}, not the guard floor ${e.minAmountOut}`)}else{if(p==null){let w=String(i.data).slice(0,10);throw new Error(`auto-slippage: cannot verify the output floor encoded by selector ${w}; refusing rather than trusting unbound calldata at an allowlisted venue`)}if(p!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is not bound to this call: guard minAmountOut ${e.minAmountOut} but calldata encodes ${p}`)}}return!0}var ha=new Hr(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Gr,isAddress as ba}from"ethers";var Sa=new Gr(["function approve(address spender,uint256 amount) returns (bool)"]),va=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});function k(e,t="value"){if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`${t} must be a finite number`);if(Math.abs(e)>Number.MAX_SAFE_INTEGER)throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);if(Number.isInteger(e)&&!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return String(e)}if(typeof e=="string"){if(e!==e.trim())throw new Error(`${t} must be a number or decimal string`);return e}throw new Error(`${t} must be a number or decimal string`)}function B(e,t="value"){if(typeof e!="string"||e==="")throw new Error(`${t} must be a string`);return e}function J(e,t="amount"){if(typeof e=="bigint")return e;if(typeof e=="number"){if(!Number.isInteger(e))throw new Error(`${t} must be an integer`);if(!Number.isSafeInteger(e))throw new Error(`${t} exceeds safe integer precision \u2014 pass it as a decimal string or BigInt so the exact value is preserved`);return BigInt(e)}let r=k(e,t);if(r==="")throw new Error(`${t} is required`);if(!/^-?\d+$/.test(r)&&!/^0x[0-9a-fA-F]+$/.test(r))throw new Error(`${t} must be an integer in decimal or 0x-hex form, got ${JSON.stringify(r)}`);try{return BigInt(r)}catch{throw new Error(`${t} must be an integer, got ${JSON.stringify(r)}`)}}function F(e,t="amount"){let r=J(e,t);if(r<=0n)throw new Error(`${t} must be positive`);return r}function O(e,t,r="amount"){let n=k(e,r);if(!/^-?\d*(\.\d+)?$/.test(n)||n===""||n==="."||n==="-")throw new Error(`${r} must be a decimal number, got ${JSON.stringify(n)}`);let o=n.startsWith("-"),i=o?n.slice(1):n,[s="0",d=""]=i.split(".");if(d.length>t)throw new Error(`${r} has more than ${t} decimal places, which would lose precision`);let u=BigInt((s||"0")+d.padEnd(t,"0"));return o?-u:u}var Ma=new zr(["function approve(address spender,uint256 amount) returns (bool)"]);function lt(e,t){let r=String(e||"").trim();if(!Vr(r))throw new Error(`${t} must be an address`);return r.toLowerCase()}function Kr(e,t="approval amount",{allowZero:r=!1}={}){let n=J(e,t);if(r?n<0n:n<=0n)throw new Error(`${t} must be positive`);if(n>=Jr)throw new Error("unlimited approvals are refused; use an exact bounded amount");return n.toString()}var dt=new Set(["0x095ea7b3","0x39509351","0x61f49ed6","0xeb5625d9","0xf9255c1f","0x87517c45","0xd505accf","0x8fcbaf0c","0x2b67b570","0x2a2d80d1"]),Yr=new Set(["0x39509351","0xf9255c1f"]);function C(e){let t=String(e||"").toLowerCase();return t.length<10?!1:dt.has(t.slice(0,10))}function V(e){if(!C(e))throw new Error("approval calldata required");let t=String(e||"").toLowerCase(),r=t.slice(0,10),n=t.slice(10).match(/.{1,64}/g)||[],o=a=>n[a]?"0x"+n[a].slice(24):null,i=a=>n[a]?BigInt("0x"+n[a]):null,s=null,d=null,u=null;switch(r){case"0x095ea7b3":case"0x39509351":s=o(0),d=i(1);break;case"0x61f49ed6":case"0xeb5625d9":case"0xf9255c1f":u=o(0),s=o(1),d=i(2);break;case"0xd505accf":s=o(1),d=i(2);break;case"0x8fcbaf0c":{s=o(1),d=i(4)===0n?0n:(1n<<256n)-1n;break}case"0x87517c45":u=o(0),s=o(1),d=i(2);break;default:throw new Error(`approval selector ${r} is recognised but not decodable; refusing to bound it`)}if(s==null||d==null)throw new Error("invalid approve calldata");return{spender:lt(s,"approval spender"),token:u==null?null:lt(u,"approval token"),amount:Kr(d,"approval amount",{allowZero:!0}),selector:r,additive:Yr.has(r)}}mt();import{readFileSync as un,readdirSync as ln,existsSync as gt}from"node:fs";import{dirname as dn,join as ae}from"node:path";import{fileURLToPath as fn}from"node:url";var me=dn(fn(import.meta.url));function pn(){let e=[ae(me,"descriptors"),ae(me,"clear-sign","descriptors"),ae(me,"..","clear-sign","descriptors"),ae(me,"..","..","clear-sign","descriptors"),ae(me,"..","..","..","clear-sign","descriptors")];for(let t of e)if(gt(t))return t;return e[0]}var mn=pn(),wn=/^0x[0-9a-f]{8}/,hn=/^0x[0-9a-fA-F]{40}$/;function gn(e=mn){if(!gt(e))return[];let t=[];for(let r of ln(e).filter(n=>n.endsWith(".json")).sort()){let n=un(ae(e,r),"utf8"),o;try{o=JSON.parse(n)}catch(i){throw new Error(`clear-sign descriptor ${r} is not valid JSON: ${i.message}`)}t.push({file:r,doc:o})}return t}function yn(e,{to:t=null,chainId:r=null}={},n=gn()){let o=String(e||"").toLowerCase(),i=wn.test(o)?o.slice(0,10):null;if(!i)return null;let s=t&&hn.test(String(t))?String(t).toLowerCase():null;for(let{file:d,doc:u}of n){let a=u?.display?.formats||{};for(let[c,l]of Object.entries(a)){if(String(l?.$selector||"").toLowerCase()!==i)continue;let m=u?.context?.contract?.deployments||[],f=m.length===0,p=m.some(w=>(r==null||Number(w.chainId)===Number(r))&&s&&String(w.address||"").toLowerCase()===s);if(f||p)return{file:d,signature:c,format:l,doc:u,selector:i,generic:f}}}return null}function yt(e,t){let r=e.slice(t*64,t*64+64);return r.length===64?r:null}function bn(e,t){let r=yt(e,t);return r?`0x${r.slice(24)}`:null}function wt(e,t){let r=yt(e,t);return r?BigInt(`0x${r}`).toString():null}var En=(1n<<256n)-1n;function ht(e){if(e==null)return"unknown";let t=BigInt(e);return t>=En/2n?"UNLIMITED":t.toString()}function bt(e,{to:t=null,chainId:r=null}={},n=void 0){let o=yn(e,{to:t,chainId:r},n);if(!o)return null;let i=String(e||"").toLowerCase(),s=i.slice(10),d=[],u=[];for(let a of o.format.fields||[]){if(a.visible==="never")continue;let c=a.$wordIndex,l=null;Number.isInteger(c)&&(l=a.format==="addressName"||a.format==="raw-address"?bn(s,c):a.format==="amount"||a.format==="tokenAmount"?ht(wt(s,c)):wt(s,c)),l!=null&&(u.push({label:a.label,value:l}),d.push(`${a.label}: ${l}`))}if(C(i)){let a=null,c=null;try{a=V(i)}catch(l){let m=String(l?.message||l);if(/unlimited approvals are refused/i.test(m))c="ORACLE POLICY: unlimited approval \u2014 Oracle refuses to prepare this; bound the amount";else return{ok:!1,refused:`descriptor matched but reviewed decoder refused: ${m}`,intent:o.format.intent}}if(a){let l=u.find(p=>/spender/i.test(p.label))?.value?.toLowerCase();if(l&&a.spender&&l!==a.spender.toLowerCase())return{ok:!1,refused:"descriptor spender disagrees with reviewed decoder",intent:o.format.intent};let m=u.find(p=>/amount|allowance/i.test(p.label))?.value,f=ht(a.amount);if(m!=null&&a.amount!=null&&String(m)!==f)return{ok:!1,refused:"descriptor amount disagrees with reviewed decoder",intent:o.format.intent}}return c&&d.push(c),{ok:!0,intent:o.format.intent,signature:o.signature,selector:o.selector,descriptor:o.file,generic:o.generic,fields:u,lines:d,...c?{policyNote:c}:{}}}return{ok:!0,intent:o.format.intent,signature:o.signature,selector:o.selector,descriptor:o.file,generic:o.generic,fields:u,lines:d}}var xn=/^0x[0-9a-f]{40}$/;function we(e){let t=String(e??"").toLowerCase();return xn.test(t)?t:null}function An(e,{token:t,owner:r}){if(!C(e))return[];let n;try{n=V(e)}catch{return[]}let o={token:we(n.token??t),spender:we(n.spender),owner:we(r),amount:n.amount};return o.token&&o.spender&&o.owner&&o.amount!=null?[o]:[]}function Sn(e,t,r={}){let n=e?.version===1&&e?.surface?e:null,o=n?.surface||"evm";if(o!=="evm"&&o!=="evm-nft")return null;let i=n?.artifact||e||{},s=we(n?.owner??i.from),d=we(i.to??n?.destination),u=String(i.data??"0x").toLowerCase();if(!s||!d)return null;let a=[],c=r?.destinationAllowlist;if(Array.isArray(c)&&c.length){let l=c.map(m=>String(m).toLowerCase()).includes(d);a.push({name:"destination-allowlist",passed:l,reason:l?"destination is allowlisted":"destination is not on the allowlist"})}try{return pt({chainId:i.chainId,account:s,destination:d,calldata:u,value:i.value??0,prepareHash:t,route:n?.provider??n?.venue??o,decodedAction:n?.action??"transaction",...i.gasLimit==null?{}:{gasLimit:i.gasLimit},...a.length?{policyChecks:a}:{},approvalDeltas:An(u,{token:d,owner:s})})}catch{return null}}function Et(e,t,r={}){let n=Sn(e,t,r);if(!n)return[];let o=[`REVIEW status=${n.status} action=${n.decodedAction??"transaction"} selector=${n.selector??"none"}`,`REVIEW route=${typeof n.route=="string"?n.route:n.venue??"n/a"} value=${n.value} signing=local custody=${n.custody}`];n.policyChecks.checks.length&&o.push(`REVIEW policy passed=${n.policyChecks.passed} failed=${n.policyChecks.failed}${n.policyChecks.failed?` reasons=${n.policyChecks.reasons.join("; ")}`:""}`);for(let i of n.approvalDeltas)o.push(`REVIEW APPROVAL token=${i.token} spender=${i.spender} amount=${i.amount} revokeLike=${i.revokeLike}`);n.assetDeltas==null&&o.push("REVIEW assetDeltas=unavailable (no simulated balance change supplied)"),n.status!=="READY"&&o.push("REVIEW status is not READY: these facts are decoded, not proven safe.");try{let i=e?.artifact||e||{},s=bt(String(i.data??"0x"),{to:i.to??null,chainId:i.chainId??null});if(s?.ok){o.push(`CLEAR-SIGN intent=${s.intent} [${s.descriptor}]`);for(let d of s.lines)o.push(`CLEAR-SIGN ${d}`)}else s&&s.refused&&o.push(`CLEAR-SIGN REFUSED: ${s.refused}`)}catch{}return o}import{createHash as xt}from"node:crypto";import{Address as vn,NETWORK as Tn,OutScript as At,RawTx as In,SigHash as St,TEST_NETWORK as kn,Transaction as On}from"@scure/btc-signer";var vt=(e,t)=>{if(e==null||e==="")throw new Error(`policy: ${t} required`);try{let r=BigInt(e);if(r<0n)throw 0;return r}catch{throw new Error(`policy: ${t} must be a non-negative integer`)}},Nn=(e,t)=>{if(typeof e!="string"||e.length===0||e.length>131072||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`envelope: invalid ${t}`);let r=Buffer.from(e,"base64");if(r.toString("base64")!==e)throw new Error(`envelope: invalid ${t}`);return r},Pn=e=>Array.isArray(e)||e instanceof Uint8Array?e.length>0:e!=null,Ln=e=>/^(bc1|tb1|bcrt1)/i.test(String(e)),re=e=>Ln(e)?String(e).toLowerCase():String(e),Ge=(e,t)=>Array.isArray(t)&&t.some(r=>re(r)===re(e)),$n=(e,t)=>Buffer.from(e||[]).equals(Buffer.from(t||[]));function Cn(e){let t=Buffer.from(In.encode(e)),r=xt("sha256").update(t).digest();return Buffer.from(xt("sha256").update(r).digest()).reverse().toString("hex")}function Rn(e){if(!e.nonWitnessUtxo)throw new Error("envelope: PSBT input nonWitnessUtxo required");if(Cn(e.nonWitnessUtxo)!==Buffer.from(e.txid||[]).toString("hex"))throw new Error("envelope: Bitcoin prevout txid mismatch");let t=e.nonWitnessUtxo.outputs?.[e.index];if(!t)throw new Error("envelope: Bitcoin prevout output missing");if(!e.witnessUtxo)throw new Error("envelope: PSBT input witness UTXO required");if(BigInt(e.witnessUtxo.amount)!==BigInt(t.amount)||!$n(e.witnessUtxo.script,t.script))throw new Error("envelope: Bitcoin witness UTXO mismatch");return t}function ze(e,t){if(e.action!=="transfer")throw new Error("envelope: BTC decoder requires transfer action");let r=e?.artifact;if(Object.keys(r).some(l=>!["network","psbt"].includes(l)))throw new Error("envelope: unexpected BTC artifact field");if(!Ge(r.network,t.chains))throw new Error("policy: chain not allowed");let n=["bitcoin","mainnet"].includes(String(r.network).toLowerCase())?Tn:["testnet","signet","regtest"].includes(String(r.network).toLowerCase())?kn:null;if(!n)throw new Error("envelope: unsupported Bitcoin network");let o;try{o=On.fromPSBT(Nn(r.psbt,"PSBT"))}catch(l){throw new Error(`envelope: invalid PSBT: ${l?.message||l}`)}if(o.inputsLength===0||o.outputsLength===0)throw new Error("envelope: PSBT inputs and outputs required");let i=vn(n);for(let l=0;l<o.inputsLength;l++){let m=o.getInput(l);for(let w of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(Pn(m[w]))throw new Error("envelope: signed or finalized PSBT refused");if(m.sighashType!==void 0&&m.sighashType!==St.DEFAULT&&m.sighashType!==St.ALL)throw new Error("envelope: Bitcoin sighash must bind all inputs and outputs");let f=Rn(m),p;try{let w=At.decode(f.script);if(!["wpkh"].includes(w.type))throw new Error("unsupported input");p=i.encode(w)}catch{throw new Error("envelope: unsupported Bitcoin input script")}if(!Ge(p,t.owners)||re(p)!==re(e.owner))throw new Error("envelope: Bitcoin input owner mismatch")}let s=new Set([e.owner,...t.changeAddresses||[]].map(l=>re(l))),d=0n,u=!1,a=[];for(let l=0;l<o.outputsLength;l++){let m=o.getOutput(l),f;try{f=i.encode(At.decode(m.script))}catch{throw new Error("envelope: unsupported Bitcoin output script")}let p=re(f);if(a.push(`${f}:${m.amount}`),p===re(e.destination)){u=!0,d+=m.amount;continue}if(Ge(f,t.destinations)){d+=m.amount;continue}if(!s.has(p))throw new Error("policy: Bitcoin output destination not allowed")}if(!u)throw new Error("envelope: Bitcoin destination mismatch");let c;try{c=o.fee}catch{throw new Error("envelope: PSBT fee cannot be decoded")}if(c<0n||c>vt(t.maxFeeSats,"maxFeeSats"))throw new Error("policy: Bitcoin fee exceeds cap");if(d>vt(t.maxValueSats,"maxValueSats"))throw new Error("policy: Bitcoin value exceeds cap");return Object.freeze({unit:"sats",value:d.toString(),notional:(d+c).toString(),fee:c.toString(),outputs:Object.freeze(a)})}function Tt(e,t){let{unit:r,value:n,notional:o,fee:i}=ze(e,t);return Object.freeze({unit:r,value:n,notional:o,fee:i})}import{createHash as Ve}from"node:crypto";import{base58 as Lt}from"@scure/base";import{getCompiledTransactionMessageDecoder as _n}from"@solana/transaction-messages";var Le="11111111111111111111111111111111",$t="ComputeBudget111111111111111111111111111111",Bn="So11111111111111111111111111111111111111112",Ct="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";var Rt="ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",Fn=5000n,Mn=2039280n,Dn=37095705934669439343138083508754565189542113879843219016388785533085940283555n,L=57896044618658097711785492504343953926634992332820282019728792003956564819949n,It=19681161376707505956807079304988542015446066515923890162744021073123829784752n,kt=e=>Ve("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),qn=new Map([[kt("route"),{name:"route",prefixBytes:0}],[kt("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]),R=(e,t)=>{if(e==null||e==="")throw new Error(`policy: ${t} required`);try{let r=BigInt(e);if(r<0n)throw 0;return r}catch{throw new Error(`policy: ${t} must be a non-negative integer`)}},jn=(e,t)=>{if(typeof e!="string"||e.length===0||e.length>131072||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))throw new Error(`envelope: invalid ${t}`);let r=Buffer.from(e,"base64");if(r.toString("base64")!==e)throw new Error(`envelope: invalid ${t}`);return r},q=(e,t)=>Array.isArray(t)&&t.some(r=>String(r)===String(e)),I=e=>String(e||""),Un=e=>Array.isArray(e.solMints)&&e.solMints.length?e.solMints:e.tokens,Pe=e=>Ve("sha256").update(e).digest("hex");function Ne(e,t){try{let r=Buffer.from(Lt.decode(String(e||"")));if(r.length!==32)throw new Error("wrong length");return r}catch{throw new Error(`envelope: invalid Solana ${t}`)}}function M(e){let t=e%L;return t>=0n?t:L+t}function G(e,t){let r=e;for(;t-- >0n;)r=r*r%L;return r}function Wn(e){let r=e*e%L*e%L,n=G(r,2n)*r%L,o=G(n,1n)*e%L,i=G(o,5n)*o%L,s=G(i,10n)*i%L,d=G(s,20n)*s%L,u=G(d,40n)*d%L,a=G(u,80n)*u%L,c=G(a,80n)*u%L,l=G(c,10n)*i%L;return G(l,2n)*e%L}function Hn(e,t){let r=M(t*t*t),n=M(r*r*t),o=Wn(e*n),i=M(e*r*o),s=M(t*i*i),d=i,u=M(i*It),a=s===e,c=s===M(-e),l=s===M(-e*It);return a&&(i=d),(c||l)&&(i=u),(M(i)&1n)===1n&&(i=M(-i)),!a&&!c?null:i}function Gn(e){if(!e||e.length!==32)return!1;let t=0n;for(let o=31;o>=0;o--)t=(t<<8n)+BigInt(o===31?e[o]&127:e[o]);let r=M(t*t),n=Hn(M(r-1n),M(Dn*r+1n));return n===null?!1:!(n===0n&&(e[31]&128)!==0)}function zn(e,t){let r=Buffer.concat([...e,Ne(t,"program id"),Buffer.from("ProgramDerivedAddress")]),n=Ve("sha256").update(r).digest();if(Gn(n))throw new Error("envelope: derived Solana program address is on curve");return Lt.encode(n)}function Ke(e,t,r=Ct){let n=[Ne(e,"owner"),Ne(r,"token program"),Ne(t,"mint")];for(let o=255;o>=0;o--)try{return zn([...n,Buffer.from([o])],Rt)}catch(i){if(!/on curve/.test(String(i?.message||i)))throw i}throw new Error("envelope: unable to derive associated token account")}function Jn(e,t){return(t.accountIndices||[]).map(r=>I(e.staticAccounts[r]))}function he(e){return Buffer.from(e.data||[])}function Vn(e,t){return I(e.staticAccounts[t.programAddressIndex])}function _t(e,t){return Number(t)<e.header.numSignerAccounts}function Kn(e,t){let r=e.header.numSignerAccounts,n=e.header.numReadonlySignerAccounts,o=e.header.numReadonlyNonSignerAccounts,i=e.staticAccounts.length;return Number(t)<r?Number(t)<r-n:Number(t)<i-o}function ge(e){return e.accountIndices||[]}function Je(e,t){if(!Array.isArray(e)||!e.length)throw new Error(`policy: ${t} allowlist required`);return e.map(String)}function Ot(e,t){let r=ge(t).map(n=>{let o=_t(e,n)?"s":"n",i=Kn(e,n)?"w":"r";return`${n}:${I(e.staticAccounts[n])}:${o}:${i}`});return Pe(Buffer.from(r.join(`
2
+ `)))}function Nt(e,t,r){if(t+8>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readBigUInt64LE(t)}function Yn(e,t,r){if(t+2>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readUInt16LE(t)}function Xn(e,t,r){if(t+4>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readUInt32LE(t)}function Zn(e,t,r){let n=r.maxJupiterRoutePlanSteps===void 0?1:Number(r.maxJupiterRoutePlanSteps);if(!Number.isSafeInteger(n)||n<1)throw new Error("policy: maxJupiterRoutePlanSteps must be a positive integer");if(t<1||t>n)throw new Error("policy: Jupiter route-plan step count exceeds reviewed cap");let o=Array.isArray(r.jupiterRouteVariants)?r.jupiterRouteVariants.map(Number):[];if(!o.length)throw new Error("policy: Jupiter route variant allowlist required");let i=r.jupiterRouteVariantPayloadBytes||{},s=0,d=0,u=[];for(let a=0;a<t;a++){if(s>=e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let c=e[s++];if(!o.includes(c))throw new Error("policy: Jupiter route variant not allowed");if(!Object.hasOwn(i,String(c)))throw new Error("policy: Jupiter route variant payload size required");let l=Number(i[String(c)]);if(!Number.isSafeInteger(l)||l<0||l>16)throw new Error("policy: Jupiter route variant payload size invalid");if(s+l+3>e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let m=e.subarray(s,s+l);s+=l;let f=m.toString("hex"),p=r.jupiterRouteVariantPayloads?.[String(c)];if(!Array.isArray(p)||!p.map(String).includes(f))throw new Error("policy: Jupiter route variant payload not allowed");let w=e[s++],h=e[s++],b=e[s++];if(w<1||w>100)throw new Error("envelope: Jupiter route-plan percent invalid");if(h!==a||b!==a+1)throw new Error("envelope: unsupported Jupiter route-plan token index");d+=w,u.push(Object.freeze({swapVariant:c,variantPayloadHex:f,percent:w,inputIndex:h,outputIndex:b}))}if(s!==e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");if(d!==100*t)throw new Error("envelope: Jupiter route-plan percent total mismatch");return Object.freeze(u)}function Qn(e,t){let r=he({data:e}),n=r.subarray(0,8).toString("hex"),o=qn.get(n);if(!o)throw new Error("envelope: unsupported Jupiter instruction discriminator");let i=19,s=o.prefixBytes===1?r[8]:null;if(o.prefixBytes===1&&r.length<9)throw new Error("envelope: malformed Jupiter shared route payload");let d=8+o.prefixBytes,u=d+4,a=r.length-i;if(a<=u)throw new Error("envelope: malformed Jupiter route payload");let c=Xn(r,d,"route plan length"),l=r.subarray(u,a),m=Zn(l,c,t);return Object.freeze({instruction:o.name,routeId:s,routePlanSteps:c,routePlan:m,routePlanHash:Pe(l),inAmount:Nt(r,a,"in_amount"),quotedOutAmount:Nt(r,a+8,"quoted_out_amount"),slippageBps:Yn(r,a+16,"slippage_bps"),platformFeeBps:r[a+18],instructionHash:Pe(r)})}function eo(e,t,r){let n=Jn(e,t),o=(i,s)=>{let d=n[i];if(!d)throw new Error(`envelope: Jupiter ${s} account missing`);return d};if(r.instruction==="route"){if(n.length<9)throw new Error("envelope: Jupiter route account layout incomplete");return{tokenProgram:o(0,"tokenProgram"),userTransferAuthority:o(1,"userTransferAuthority"),userSourceTokenAccount:o(2,"userSourceTokenAccount"),userDestinationTokenAccount:o(3,"userDestinationTokenAccount"),destinationTokenAccount:o(4,"destinationTokenAccount"),destinationMint:o(5,"destinationMint"),platformFeeAccount:o(6,"platformFeeAccount"),eventAuthority:o(7,"eventAuthority"),program:o(8,"program")}}if(r.instruction==="shared_accounts_route"){if(n.length<13)throw new Error("envelope: Jupiter shared route account layout incomplete");return{tokenProgram:o(0,"tokenProgram"),programAuthority:o(1,"programAuthority"),userTransferAuthority:o(2,"userTransferAuthority"),userSourceTokenAccount:o(3,"sourceTokenAccount"),programSourceTokenAccount:o(4,"programSourceTokenAccount"),programDestinationTokenAccount:o(5,"programDestinationTokenAccount"),userDestinationTokenAccount:o(6,"destinationTokenAccount"),sourceMint:o(7,"sourceMint"),destinationMint:o(8,"destinationMint"),platformFeeAccount:o(9,"platformFeeAccount"),token2022Program:o(10,"token2022Program"),eventAuthority:o(11,"eventAuthority"),program:o(12,"program")}}throw new Error("envelope: unsupported Jupiter account layout")}function Pt(e,t){return e&&e!==t?e:null}function D(e,t,r){let n=I(e.staticAccounts[t]);if(!n)throw new Error(`envelope: Jupiter ${r} missing`);return n}function to(e,t){let r=he(e);if(r.length===5&&r[0]===2){let n=r.readUInt32LE(1),o=t.maxComputeUnits===void 0?14e5:Number(t.maxComputeUnits);if(!Number.isSafeInteger(o)||o<=0)throw new Error("policy: maxComputeUnits must be positive");if(n>o)throw new Error("policy: Jupiter compute unit limit exceeds cap");return 0n}throw r.length===9&&r[0]===3?new Error("policy: Jupiter priority fee not allowed"):new Error("envelope: unsupported Jupiter compute-budget helper")}function ro(e,t,r,n,o,i){let s=he(t);if(s.length!==1||s[0]!==1)throw new Error("envelope: unsupported Jupiter ATA helper");let d=ge(t);if(d.length!==6)throw new Error("envelope: malformed Jupiter ATA helper");let u=D(e,d[0],"ATA payer"),a=D(e,d[1],"ATA account"),c=D(e,d[2],"ATA owner"),l=D(e,d[3],"ATA mint"),m=D(e,d[4],"ATA system program"),f=D(e,d[5],"ATA token program");if(u!==r.owner)throw new Error("envelope: Jupiter ATA payer must equal owner");if(c!==r.owner)throw new Error("envelope: Jupiter ATA owner must equal owner");if(m!==Le)throw new Error("envelope: Jupiter ATA system program mismatch");if(f!==o)throw new Error("envelope: Jupiter ATA token program mismatch");if(l!==n.inputMint&&l!==n.outputMint)throw new Error("envelope: Jupiter ATA mint mismatch");if(a!==Ke(r.owner,l,o))throw new Error("envelope: Jupiter ATA account mismatch");return{ata:a,debit:i}}function no(e,t,r,n,o){let i=ge(t),s=he(t);if(i.length!==2||s.length!==12||s.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Jupiter system helper");let d=D(e,i[0],"wrap payer"),u=D(e,i[1],"wrap target"),a=s.readBigUInt64LE(4);if(d!==r.owner||u!==n)throw new Error("envelope: unsupported Jupiter wrap transfer");if(a!==o)throw new Error("envelope: Jupiter wrap transfer amount mismatch");return a}function oo(e,t,r,n){let o=ge(t),i=he(t);if(i.length!==1)throw new Error("envelope: unsupported Jupiter token helper");if(i[0]===17){if(o.length!==1||D(e,o[0],"syncNative account")!==n)throw new Error("envelope: Jupiter syncNative account mismatch");return{kind:"syncNative"}}if(i[0]===9){if(o.length!==3)throw new Error("envelope: malformed Jupiter closeAccount helper");let s=D(e,o[0],"closeAccount source"),d=D(e,o[1],"closeAccount destination"),u=D(e,o[2],"closeAccount authority");if(s!==n||d!==r.owner||u!==r.owner)throw new Error("envelope: Jupiter closeAccount must return to owner");return{kind:"closeAccount"}}throw new Error("envelope: unsupported Jupiter token helper")}function io(e,t,r,n,o,i,s){let d=Ke(t.owner,t.artifact.inputMint,s);if(o.userSourceTokenAccount!==d)throw new Error("envelope: Jupiter source token account is not owner ATA");let u=R(r.jupiterAtaRentLamports,"jupiterAtaRentLamports");if(u<Mn)throw new Error("policy: Jupiter ATA rent below the token-account rent-exempt minimum");let a=new Map,c=0n,l=!1,m=!1;for(let f of e.instructions){if(f===n)continue;let p=Vn(e,f);if(p===$t)to(f,r);else if(p===Rt){let{ata:w,debit:h}=ro(e,f,t,t.artifact,s,u);a.set(w,h)}else if(p===Le)c+=no(e,f,t,d,i);else if(p===s){let w=oo(e,f,t,d);w.kind==="syncNative"&&(l=!0),w.kind==="closeAccount"&&(m=!0)}else throw new Error("envelope: unsupported Jupiter helper instruction")}if(c>0n&&(!l||!m))throw new Error("envelope: Jupiter native wrap helpers incomplete");if(c!==0n&&c!==i)throw new Error("envelope: Jupiter native wrap amount mismatch");return[...a.values()].reduce((f,p)=>f+p,0n)}function ao(e){let t;try{t=_n().decode(jn(e.messageBase64,"Solana message"))}catch(r){throw new Error(`envelope: invalid Solana message: ${r?.message||r}`)}if(t.version!=="legacy"&&Array.isArray(t.addressTableLookups)&&t.addressTableLookups.length)throw new Error("envelope: unresolved Solana address tables refused");return t}function so(e,t,r,n=1){if(e.header.numSignerAccounts!==n||I(e.staticAccounts[0])!==t.owner||!q(t.owner,r.owners))throw new Error("envelope: Solana owner mismatch");if(!Array.isArray(e.instructions)||e.instructions.length===0)throw new Error("envelope: Solana instructions required");let o=[];for(let i of e.instructions){let s=I(e.staticAccounts[i.programAddressIndex]);if(!s||!q(s,r.programs))throw new Error("policy: Solana program not allowed");o.push(s)}return o}function co(e,t,r){let n=R(r.lamportsPerSignature,"lamportsPerSignature");if(n<Fn)throw new Error("policy: Solana per-signature fee is below the network minimum");let o=r.maxLamportsPerSignature===void 0?n:R(r.maxLamportsPerSignature,"maxLamportsPerSignature");if(n>o)throw new Error("policy: Solana per-signature fee exceeds cap");let i=BigInt(e.header.numSignerAccounts),s=i*n,d=i*o;if(t.exactFeeLamports!==void 0){let a=R(t.exactFeeLamports,"exactFeeLamports");if(a<s)throw new Error("policy: Solana exact fee below the base signature fee");if(a>d)throw new Error("policy: Solana exact fee exceeds the per-signature bound")}let u=d;if(u>R(r.maxFeeLamports,"maxFeeLamports"))throw new Error("policy: Solana fee exceeds cap");return u}function uo(e,t,r,n){let o=0n,i=!1;for(let s of e.instructions){if(I(e.staticAccounts[s.programAddressIndex])!==Le)throw new Error("envelope: unsupported Solana program decoder");let u=s.accountIndices||[];if(u.length!==2||I(e.staticAccounts[u[0]])!==t.owner)throw new Error("envelope: Solana transfer owner mismatch");let a=I(e.staticAccounts[u[1]]);if(a!==t.destination||!q(a,r.destinations))throw new Error("envelope: Solana destination mismatch");let c=Buffer.from(s.data||[]);if(c.length!==12||c.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");o+=c.readBigUInt64LE(4),i=!0}if(!i)throw new Error("envelope: Solana destination mismatch");if(o>R(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:o,programs:n}}function lo(e,t,r,n){let o=t.artifact,i=I(o.mintProgram);if(!q(i,r.solMintPrograms))throw new Error("policy: Solana mint program not allowed");let s=e.header.numSignerAccounts;if(s!==2&&s!==3)throw new Error("envelope: Solana mint requires the payer, asset, and at most one distinct minter");let d=I(e.staticAccounts[s-1]);if(d!==I(o.assetSigner))throw new Error("envelope: Solana mint asset signer mismatch");if(s===3){let l=I(e.staticAccounts[1]);if(!o.minter||l!==I(o.minter))throw new Error("envelope: Solana mint minter mismatch");if(l===d)throw new Error("envelope: Solana mint minter must not be the asset signer")}else if(o.minter&&I(o.minter)!==t.owner)throw new Error("envelope: Solana mint declares a minter the message does not sign");if(q(d,r.owners))throw new Error("envelope: Solana mint asset signer must not be a policy owner");let u=R(o.maxSpendLamports,"maxSpendLamports");if(u>R(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana mint spend exceeds cap");let a=0n,c=!1;for(let l of e.instructions){let m=I(e.staticAccounts[l.programAddressIndex]);if(m!==$t){if(m===Le){let f=l.accountIndices||[];if(f.length!==2||I(e.staticAccounts[f[0]])!==t.owner)throw new Error("envelope: Solana mint transfer owner mismatch");let p=I(e.staticAccounts[f[1]]);if(!q(p,r.destinations))throw new Error("envelope: Solana mint destination mismatch");let w=Buffer.from(l.data||[]);if(w.length!==12||w.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");a+=w.readBigUInt64LE(4);continue}if(m!==i)throw new Error("envelope: unsupported Solana program decoder");c=!0}}if(!c)throw new Error("envelope: Solana mint instruction required");if(a>u)throw new Error("policy: Solana mint visible spend exceeds the declared maximum");return{value:u,programs:n,unverifiableProgramSpend:!0,visibleSpendLamports:a.toString()}}function fo(e,t,r,n){let o=t.artifact;if(o.provider!=="jupiter")throw new Error("envelope: Solana swap provider must be jupiter");if(o.inputMint!==Bn)throw new Error("envelope: Jupiter local signer requires native SOL input");if(o.outputMint!==t.destination||!q(o.outputMint,r.destinations))throw new Error("envelope: Jupiter output mint destination mismatch");let i=Un(r);if(!q(o.inputMint,i)||!q(o.outputMint,i))throw new Error("policy: Solana token not allowed");let s=R(o.inAmount,"inAmount"),d=R(o.outAmount,"outAmount"),u=R(o.otherAmountThreshold,"otherAmountThreshold");if(s<=0n||s>R(r.maxPerTradeLamports,"maxPerTradeLamports"))throw new Error("policy: Solana swap amount exceeds per-trade cap");if(s>R(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");if(d<=0n||u<=0n||u>d)throw new Error("envelope: Jupiter quote floor invalid");if(Number(o.slippageBps)!==Number(t.slippageBps))throw new Error("policy: Solana slippage mismatch");let a=I(o.jupiterProgram);if(!a||!q(a,r.programs)||!n.includes(a))throw new Error("policy: Jupiter program not allowed or absent");let c=e.instructions.filter(S=>I(e.staticAccounts[S.programAddressIndex])===a);if(c.length!==1)throw new Error("envelope: exactly one Jupiter swap instruction required");let l=c[0],m=Qn(l.data,r);if(m.instruction==="shared_accounts_route"){let S=Array.isArray(r.jupiterSharedRouteIds)?r.jupiterSharedRouteIds.map(Number):[];if(!S.length)throw new Error("policy: Jupiter shared route id allowlist required");if(!S.includes(Number(m.routeId)))throw new Error("policy: Jupiter shared route id not allowed")}else if(m.routeId!=null)throw new Error("envelope: unexpected Jupiter shared route id");if(!Je(r.jupiterRoutePlanHashes,"Jupiter route-plan hash").includes(m.routePlanHash))throw new Error("policy: Jupiter route-plan hash not allowed");if(m.inAmount!==s)throw new Error("envelope: Jupiter route in_amount mismatch");if(m.quotedOutAmount!==d)throw new Error("envelope: Jupiter route quoted_out_amount mismatch");if(m.slippageBps!==Number(o.slippageBps))throw new Error("envelope: Jupiter route slippage mismatch");let f=m.quotedOutAmount-m.quotedOutAmount*BigInt(m.slippageBps)/10000n;if(u!==f)throw new Error("envelope: Jupiter otherAmountThreshold does not match serialized min-out");if(m.platformFeeBps!==0)throw new Error("policy: Jupiter platform fee not allowed");let p=eo(e,l,m),w=ge(l),h=m.instruction==="shared_accounts_route"?2:1;if(!_t(e,w[h]))throw new Error("envelope: Jupiter transfer authority must be signer");if(p.program!==a)throw new Error("envelope: Jupiter program account mismatch");if(p.userTransferAuthority!==t.owner)throw new Error("envelope: Jupiter transfer authority must equal owner");if(p.destinationMint!==o.outputMint)throw new Error("envelope: Jupiter destination mint mismatch");if(p.sourceMint!==void 0&&p.sourceMint!==o.inputMint)throw new Error("envelope: Jupiter source mint mismatch");let b=Array.isArray(r.tokenPrograms)&&r.tokenPrograms.length?r.tokenPrograms:[Ct];if(!q(p.tokenProgram,b))throw new Error("policy: Solana token program not allowed");let A=Ke(t.owner,o.outputMint,p.tokenProgram);if(p.userDestinationTokenAccount!==A)throw new Error("envelope: Jupiter destination token account is not owner ATA");let g=Pt(p.destinationTokenAccount,a);if(g&&g!==A)throw new Error("envelope: Jupiter optional destination account redirects proceeds");if(Pt(p.platformFeeAccount,a))throw new Error("policy: Jupiter platform fee account not allowed");if(!Je(r.jupiterRouteAccountHashes,"Jupiter route account hash").includes(Ot(e,l)))throw new Error("policy: Jupiter route account hash not allowed");let E=Pe(Buffer.from([m.instruction,m.routeId??"",m.routePlanHash,Ot(e,l)].join(`
3
+ `)));if(!Je(r.jupiterRouteReviewHashes,"Jupiter route review hash").includes(E))throw new Error("policy: Jupiter route review hash not allowed");let v=io(e,t,r,l,p,s,p.tokenProgram),P=s+v;if(P>R(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:P,programs:n}}function Ye(e,t){if(e.action!=="transfer"&&e.action!=="swap"&&e.action!=="mint")throw new Error("envelope: Solana decoder requires transfer, swap, or mint action");let r=e?.artifact,n=e.action==="transfer"?["cluster","messageBase64","exactFeeLamports"]:e.action==="mint"?["cluster","messageBase64","exactFeeLamports","mintProgram","assetSigner","maxSpendLamports","minter","cosignatures"]:["cluster","provider","messageBase64","exactFeeLamports","inputMint","outputMint","inAmount","outAmount","otherAmountThreshold","slippageBps","jupiterProgram"];if(Object.keys(r||{}).some(u=>!n.includes(u)))throw new Error("envelope: unexpected Solana artifact field");if(!q(r.cluster,t.chains))throw new Error("policy: chain not allowed");let o=ao(r),i=so(o,e,t,e.action==="mint"?o.header.numSignerAccounts:1),s=e.action==="transfer"?uo(o,e,t,i):e.action==="mint"?lo(o,e,t,i):fo(o,e,t,i),d=co(o,r,t);return Object.freeze({unit:"lamports",value:s.value.toString(),notional:(s.value+d).toString(),fee:d.toString(),programs:Object.freeze(s.programs),...s.unverifiableProgramSpend?{unverifiableProgramSpend:!0,visibleSpendLamports:s.visibleSpendLamports}:{}})}function Bt(e,t){let{unit:r,value:n,notional:o,fee:i,unverifiableProgramSpend:s,visibleSpendLamports:d}=Ye(e,t);return Object.freeze(s?{unit:r,value:n,notional:o,fee:i,unverifiableProgramSpend:s,visibleSpendLamports:d}:{unit:r,value:n,notional:o,fee:i})}import{AsyncLocalStorage as po}from"node:async_hooks";var os=new po;var ms=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"aborted")?.get,ws=Object.getOwnPropertyDescriptor(AbortSignal.prototype,"reason")?.get,hs=AbortSignal.prototype.throwIfAborted,gs=EventTarget.prototype.addEventListener,ys=EventTarget.prototype.removeEventListener,bs=typeof AbortSignal.any=="function"?AbortSignal.any.bind(AbortSignal):null;var Es=64*1024,xs=Object.freeze({depth:32,nodes:1e4,fields:1e4,arrayLength:1e4,bytes:1024*1024});var wo=1e8;var Ls=Object.freeze({tradexyz:"xyz",ventuals:"vntl",hypernova:"hyna",paradex:"para",entropy:"io",entropyio:"io"});function Xe(e){if(typeof e!="string"||!/^#(?:0|[1-9]\d*)$/.test(e))return null;let t=Number(e.slice(1));if(!Number.isSafeInteger(t)||t<0)return null;let r=t%10;if(r!==0&&r!==1)return null;let n=Math.floor(t/10),o=wo+t;return Number.isSafeInteger(o)?{encoding:t,outcome:n,side:r,coin:`#${t}`,assetId:o}:null}var ho=new Set(["https://api.hyperliquid.xyz/exchange","https://api.hyperliquid-testnet.xyz/exchange"]),go=new Set(["perp-order","hip3-order","hip4-order","perp-bracket"]),yo=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"leverage","perp-isolated-margin":"margin","builder-fee-approval":"approveBuilder","hype-stake-deposit":"stake","hype-stake-withdraw":"unstake","hype-delegate":"delegate","hype-undelegate":"delegate"}),bo=Object.freeze({"perp-order":"order","hip3-order":"order","hip4-order":"order","perp-bracket":"order","perp-cancel":"cancel","perp-leverage":"updateLeverage","perp-isolated-margin":"updateIsolatedMargin","builder-fee-approval":"approveBuilderFee","hype-stake-deposit":"cDeposit","hype-stake-withdraw":"cWithdraw","hype-delegate":"tokenDelegate","hype-undelegate":"tokenDelegate"}),Z=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`hl: bounded ${t} required`);return e};function Eo(e,t){let r=e.toString().padStart(t+1,"0");if(t===0)return r;let n=r.slice(0,-t),o=r.slice(-t).replace(/0+$/,"");return o?`${n}.${o}`:n}function Ft(e,t){let r=k(e,`hl: ${t}`);if(!/^\d+(?:\.\d+)?$/.test(r))throw new Error(`hl: ${t} must be a positive decimal`);let[n,o=""]=r.split("."),i=BigInt(n+o);if(i<=0n)throw new Error(`hl: ${t} must be positive`);return{raw:i,decimals:o.length}}function z(e,t){if(e===null||typeof e=="string"||typeof e=="boolean")return JSON.stringify(e);if(typeof e=="number"){if(!Number.isFinite(e))throw new Error(`hl: ${t} must be finite JSON`);return JSON.stringify(e)}if(Array.isArray(e))return`[${e.map(n=>z(n,t)).join(",")}]`;if(!e||typeof e!="object")throw new Error(`hl: ${t} must be structured JSON`);return`{${Object.keys(e).sort().map(n=>`${JSON.stringify(n)}:${z(e[n],t)}`).join(",")}}`}function xo(e){if(typeof e.orderType!="string"||!e.orderType)throw new Error("hl: order type must be a string");let t=e.orderType,r=e.orderWire;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: declared order wire required");if(t==="limit"){let i=r.limit?.tif;if(!["Gtc","Ioc","Alo"].includes(i)||z(r,"declared order type")!==z({limit:{tif:i}},"expected order type"))throw new Error("hl: limit order type must match its wire shape");return}if(t==="market"){if(z(r,"declared order type")!==z({limit:{tif:"Ioc"}},"expected order type"))throw new Error("hl: market order type must match its IOC wire shape");return}let n={stopMarket:{isMarket:!0,tpsl:"sl"},stopLimit:{isMarket:!1,tpsl:"sl"},takeProfitMarket:{isMarket:!0,tpsl:"tp"},takeProfitLimit:{isMarket:!1,tpsl:"tp"}}[t];if(!n)throw new Error("hl: unsupported declared order type");let o=r.trigger?.triggerPx;if(o==null||z(r,"declared order type")!==z({trigger:{isMarket:n.isMarket,triggerPx:o,tpsl:n.tpsl}},"expected order type"))throw new Error("hl: trigger order type must match its wire shape")}function Ao(e,t,r){let n=Ft(e.s,"signed size"),o=Ft(e.p,"signed price"),i=n.decimals+o.decimals,s=n.raw*o.raw,d=O(t.notionalUsd,i,"hl: notionalUsd");if(d<=0n||s!==d)throw new Error("hl: signed notional must match");let u=O(r.maxNotionalUsd,i,"hl: maxNotionalUsd");if(s>u)throw new Error("hl: notional exceeds cap")}function So(e,t){let r=e.action.builder;if(r==null){if(e.builder!=null)throw new Error("hl: declared builder requires a signed builder");return}if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: signed order builder must be structured");let n=Z(r.b,"order builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(n))throw new Error("hl: order builder address required");if(B(e.builder||"","hl: builder").toLowerCase()!==n)throw new Error("hl: signed order builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(d=>String(d).toLowerCase()):[]).includes(n))throw new Error("hl: order builder not allowed");let i=J(r.f,"hl: signed order builder fee");if(i<0n)throw new Error("hl: signed order builder fee must be non-negative");let s=O(t.maxBuilderFeeBps??0,1,"hl: maxBuilderFeeBps");if(i>s)throw new Error("hl: order builder fee exceeds cap")}function Mt(e,t,r){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: signed asset must match assetId");if(typeof e.b!="boolean"||e.b!==(t.side==="buy"))throw new Error("hl: signed side must match exactly");if(k(e.s,"hl: signed size")!==k(t.size,"hl: size"))throw new Error("hl: signed size must match");if(k(e.p,"hl: signed price")!==k(t.price,"hl: price"))throw new Error("hl: signed price must match");if(typeof t.reduceOnly!="boolean"||typeof e.r!="boolean"||e.r!==t.reduceOnly)throw new Error("hl: signed reduceOnly must match exactly");if(z(e.t,"signed order type")!==z(t.orderWire,"declared order type"))throw new Error("hl: signed order type must match declared order type");let n=Object.prototype.hasOwnProperty.call(e,"c");if(t.clientOrderId==null){if(n)throw new Error("hl: undeclared signed client order id")}else if(!n||typeof e.c!="string"||e.c!==t.clientOrderId)throw new Error("hl: signed client order id must match")}function Dt(e,t,r,n,o){if(!Number.isSafeInteger(e.a)||e.a!==r)throw new Error("hl: bracket protection asset must match");if(typeof e.b!="boolean"||e.b===(t.side==="buy"))throw new Error("hl: bracket protection side must oppose entry");if(k(e.s,"hl: bracket protection size")!==k(t.size,"hl: size"))throw new Error("hl: bracket protection size must match");if(k(e.p,"hl: bracket protection price")!==k(n,"hl: protection price"))throw new Error("hl: bracket protection price must match");if(e.r!==!0)throw new Error("hl: bracket protection must be reduce-only");let i=e.t?.trigger;if(!i||i.isMarket!==!0||i.tpsl!==o)throw new Error("hl: bracket protection trigger must match");if(k(i.triggerPx,"hl: triggerPx")!==k(n,"hl: protection price"))throw new Error("hl: bracket protection trigger must match")}function vo(e){let t=String(e||"").replace(/\/$/,"");if(!ho.has(t))throw new Error("hl: submitTo must be the official Hyperliquid exchange");return t}function Ze(e){return Xe(e)!=null}function To(e,t){let r=String(e||""),n=Array.isArray(t.coins)?t.coins.map(String):[];if(Ze(r)){if(t.hip4!==!0)throw new Error("hl: HIP-4 outcome orders are disabled without explicit policy enablement");if(n.includes(r)||n.includes("#*")||n.includes("*")||n.length===0)return!0;throw new Error("hl: outcome coin not allowed")}if(n.length&&!n.includes(r)&&!n.includes("*"))throw new Error("hl: coin not allowed");return!0}function Io(e,t,r){let n=Array.isArray(r.hlMarkets)?r.hlMarkets:[];if(n.length){if(!n.some(s=>{if(typeof s=="string"){let[d,u]=String(s).split(":");return d===e&&Number(u)===t}return String(s?.coin)===e&&Number(s?.assetId)===t}))throw new Error("hl: coin/assetId pair not allowed");return!0}if(Ze(e)){let i=Array.isArray(r.coins)?r.coins.map(String):[];if(i.includes("#*")||i.includes("*")||i.length===0)return!0;throw new Error("hl: restricted coin policy requires hlMarkets pairs")}let o=Array.isArray(r.coins)?r.coins.map(String):[];if(o.length&&!o.includes("*"))throw new Error("hl: restricted coin policy requires hlMarkets pairs");return!0}function $e(e,t){if(e?.surface!=="hl")throw new Error("hl: surface hl required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("hl: structured artifact required");let n=Z(r.kind,"kind",48),o=yo[n];if(!o)throw new Error("hl: unsupported Hyperliquid kind");if(e.action!==o)throw new Error("hl: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="hyperliquid")throw new Error("hl: destination must be hyperliquid");if(!/^0x[0-9a-fA-F]{40}$/.test(String(e.owner||"")))throw new Error("hl: owner required");let i=vo(r.submitTo);if(Object.prototype.hasOwnProperty.call(r,"vaultAddress"))throw new Error("hl: vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r,"expiresAfter"))throw new Error("hl: expiresAfter is not public");let s=Number(r.nonce);if(!Number.isSafeInteger(s)||s<=0)throw new Error("hl: nonce must be a positive integer");if(!r.action||typeof r.action!="object")throw new Error("hl: signed action required");if(Object.prototype.hasOwnProperty.call(r.action,"vaultAddress"))throw new Error("hl: action vaultAddress is not public");if(Object.prototype.hasOwnProperty.call(r.action,"expiresAfter"))throw new Error("hl: action expiresAfter is not public");if(r.action.type!==bo[n])throw new Error("hl: action type must match kind");let d=r.notionalUsd??0;if(go.has(n)||n==="perp-cancel"||n==="perp-leverage"||n==="perp-isolated-margin"){let u=Z(r.coin,"coin",64),a=r.assetId??r.assetIndex;if(!Number.isSafeInteger(a)||a<0)throw new Error("hl: assetId required");if(n==="hip4-order"||a>=1e8){let c=Xe(u);if(!c||c.coin!==u)throw new Error("hl: HIP-4 actions must use a canonical outcome coin");if(c.assetId!==a)throw new Error("hl: HIP-4 coin must bind to its canonical assetId")}if(To(u,t),Io(u,a,t),n==="hip4-order"&&!Ze(u))throw new Error("hl: HIP-4 orders must use an outcome coin");if(n==="perp-order"||n==="hip3-order"||n==="hip4-order"||n==="perp-bracket"){if(r.side!=="buy"&&r.side!=="sell")throw new Error("hl: side must be buy or sell");if(r.action.type!=="order"||!Array.isArray(r.action.orders))throw new Error("hl: signed orders are required");xo(r);let c=r.action.orders;if(n==="perp-bracket"){let l=r.takeProfitPx,m=r.stopLossPx,f=1+(l==null?0:1)+(m==null?0:1);if(f<2||c.length!==f||r.grouping!=="normalTpsl"||r.action.grouping!==r.grouping)throw new Error("hl: bracket must contain exactly the declared entry and protection legs");Mt(c[0],r,a);let p=1;l!=null&&Dt(c[p++],r,a,l,"tp"),m!=null&&Dt(c[p],r,a,m,"sl")}else{if(c.length!==1)throw new Error("hl: exactly one signed order is required");if(r.grouping!=="na"||r.action.grouping!==r.grouping)throw new Error("hl: signed grouping must match declared grouping");Mt(c[0],r,a)}Ao(c[0],r,t),So(r,t),d=k(r.notionalUsd,"hl: notionalUsd")}if(n==="perp-leverage"){let c=r.leverage;if(!Number.isSafeInteger(c)||c<1)throw new Error("hl: leverage must be a positive integer");let l=t.maxLeverage==null?50:t.maxLeverage;if(typeof l!="number"||!Number.isSafeInteger(l)||l<1)throw new Error("hl: maxLeverage must be a positive integer");if(c>l)throw new Error("hl: leverage exceeds cap")}if(n==="perp-cancel"){let c=r.action.cancels;if(!Array.isArray(c)||c.length!==1)throw new Error("hl: exactly one cancel is required");if(!Number.isSafeInteger(c[0].a)||c[0].a!==a)throw new Error("hl: signed cancel asset must match assetId");if(!Number.isSafeInteger(r.orderId)||r.orderId<0)throw new Error("hl: declared order id required");if(!Number.isSafeInteger(c[0].o)||c[0].o!==r.orderId)throw new Error("hl: signed cancel order id must match")}if(n==="perp-leverage"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==a)throw new Error("hl: signed leverage asset must match assetId");if(!Number.isSafeInteger(r.action.leverage)||r.action.leverage!==r.leverage)throw new Error("hl: signed leverage must match");if(!["cross","isolated"].includes(r.marginMode))throw new Error("hl: declared margin mode required");let c=r.marginMode==="cross";if(typeof r.action.isCross!="boolean"||r.action.isCross!==c)throw new Error("hl: signed isCross must match declared margin mode")}if(n==="perp-isolated-margin"){if(!Number.isSafeInteger(r.action.asset)||r.action.asset!==a)throw new Error("hl: signed margin asset must match assetId");let c=Z(r.usd,"margin usd",64),l=O(c,6,"hl: margin usd");if(J(r.action.ntli,"hl: signed margin ntli")!==l)throw new Error("hl: signed margin amount must match usd");if(typeof r.isBuy!="boolean"||r.action.isBuy!==r.isBuy)throw new Error("hl: signed margin isBuy must match");let f=O(t.maxNotionalUsd,6,"hl: maxNotionalUsd"),p=l<0n?-l:l;if(p>f)throw new Error("hl: margin notional exceeds cap");d=Eo(p,6)}}if(n==="builder-fee-approval"){let u=Z(r.builder,"builder",42).toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(u))throw new Error("hl: builder address required");if(Z(r.action.builder,"signed builder",42).toLowerCase()!==u)throw new Error("hl: signed builder must match");if(!(Array.isArray(t.hlBuilders)?t.hlBuilders.map(p=>String(p).toLowerCase()):[]).includes(u))throw new Error("hl: builder not allowed");let c=Z(r.maxFeeRate,"maxFeeRate",32);if(Z(r.action.maxFeeRate,"signed maxFeeRate",32)!==c)throw new Error("hl: signed builder fee must match");if(!/^\d+(?:\.\d+)?%$/.test(c))throw new Error("hl: builder fee rate must be a percent");let l=O(c.slice(0,-1),12,"hl: builder fee percent"),m=O(t.maxBuilderFeeBps,12,"hl: maxBuilderFeeBps");if(m<0n||l*100n>m)throw new Error("hl: builder fee exceeds cap");if(Number(r.action.nonce)!==s)throw new Error("hl: signed builder nonce must match");let f=i.includes("testnet")?"Testnet":"Mainnet";if(r.hyperliquidChain!==f||r.action.hyperliquidChain!==r.hyperliquidChain)throw new Error("hl: signed Hyperliquid chain must match destination");if(r.signatureChainId!=="0x66eee"||r.action.signatureChainId!==r.signatureChainId)throw new Error("hl: signed signature chain id must match")}if(n.startsWith("hype-stake")||n==="hype-delegate"||n==="hype-undelegate"){if(n==="hype-delegate"||n==="hype-undelegate"){let u=n==="hype-undelegate";if(typeof r.action.isUndelegate!="boolean"||r.action.isUndelegate!==u)throw new Error("hl: signed isUndelegate must match delegate kind exactly")}if(t.maxHypeWei!=null&&BigInt(String(r.action.wei??r.caps?.amountHype??"0"))>BigInt(t.maxHypeWei))throw new Error("hl: stake amount exceeds cap")}return Object.freeze({unit:"usd",value:String(d??r.action.wei??0),notional:String(d??0),fee:"0",kind:n,actionType:r.action.type,amount:String(r.action.wei??d??0),coin:r.coin||null,submitTo:i})}var Fs="0x"+"00".repeat(32);function ko(e){let t=typeof e=="bigint"?e:F(e,"poly: atomicUsdc");if(t<=0n)throw new Error("poly: order amounts must be positive integer micro-units");let r=t/1000000n,n=(t%1000000n).toString().padStart(6,"0").replace(/0+$/,"");return n?`${r.toString()}.${n}`:r.toString()}function qt(e,t){let r=F(e.makerAmount,"poly: makerAmount"),n=F(e.takerAmount,"poly: takerAmount");return ko(t==="BUY"?r:n)}var Oo=new Set(["https://clob.polymarket.com/order"]),ye=Object.freeze([["salt","uint256"],["maker","address"],["signer","address"],["tokenId","uint256"],["makerAmount","uint256"],["takerAmount","uint256"],["side","uint8"],["signatureType","uint8"],["timestamp","uint256"],["metadata","bytes32"],["builder","bytes32"]]),js=Object.freeze(ye.map(e=>e[0])),No=new Set(["0xe111180000d2663c0091e4f400237545b87b996b","0xe2222d279d744050d28e00520010520000310f59"]),Po="0xe111180000d2663c0091e4f400237545b87b996b",Lo="0xe2222d279d744050d28e00520010520000310f59",jt=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`poly: bounded ${t} required`);return e};function Ut(e){let t=String(e||"").replace(/\/$/,"");if(!Oo.has(t))throw new Error("poly: submitTo must be the official Polymarket CLOB");return t}function Wt(e){let t=B(e,"poly: exchange").toLowerCase();if(!No.has(t))throw new Error("poly: verifyingContract must be an official CTF Exchange");return t}function Ce(e,t){if(e?.surface!=="poly")throw new Error("poly: surface poly required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("poly: structured artifact required");let n=jt(r.kind,"kind",48);if(n!=="poly-order")throw new Error("poly: unsupported Polymarket kind");if(e.action!=="order")throw new Error("poly: surface/action/kind mismatch");if(B(e.destination,"poly: destination").toLowerCase()!=="polymarket")throw new Error("poly: destination must be polymarket");if(Ut(r.submitTo),r.chainId!==137)throw new Error("poly: chainId must be Polygon 137");let o=r.domain;if(!o||typeof o!="object")throw new Error("poly: EIP-712 domain required");if(o.name!=="Polymarket CTF Exchange"||o.version!=="2"||o.chainId!==137)throw new Error("poly: EIP-712 domain must be official CTF Exchange v2 on Polygon");if(Wt(o.verifyingContract),Wt(r.exchange),B(o.verifyingContract,"poly: verifyingContract").toLowerCase()!==B(r.exchange,"poly: exchange").toLowerCase())throw new Error("poly: exchange/domain mismatch");if(typeof r.negRisk!="boolean")throw new Error("poly: negRisk must be a boolean");let i=r.negRisk?Lo:Po;if(B(r.exchange,"poly: exchange").toLowerCase()!==i)throw new Error("poly: negRisk/exchange mismatch");let s=r.message||r.value;if(!s||typeof s!="object")throw new Error("poly: signed order message required");let d=r.types?.Order;if(!Array.isArray(d)||d.length!==ye.length)throw new Error("poly: EIP-712 Order type must be official CLOB v2");for(let S=0;S<ye.length;S+=1)if(d[S]?.name!==ye[S][0]||d[S]?.type!==ye[S][1])throw new Error("poly: EIP-712 Order type must be official CLOB v2");if((r.orderType||"GTC")!=="GTC")throw new Error("poly: only GTC is public");let u=String(e.owner||"").toLowerCase();if(B(s.maker,"poly: maker").toLowerCase()!==u)throw new Error("poly: maker must equal owner");if(B(s.signer,"poly: signer").toLowerCase()!==u)throw new Error("poly: signer must equal owner");if(s.signatureType!==0)throw new Error("poly: only EOA signatureType 0 is public");if(typeof s.builder!="string"||s.builder.toLowerCase()!==`0x${"00".repeat(32)}`)throw new Error("poly: builder must be zero");if(s.side!==0&&s.side!==1)throw new Error("poly: side must be BUY or SELL");let a=jt(r.tokenId,"tokenId",80);if(B(s.tokenId,"poly: tokenId")!==a)throw new Error("poly: tokenId mismatch");let c=Array.isArray(t.polyTokens)?t.polyTokens.map(String):[];if(c.length&&!c.includes(a)&&!c.includes("*"))throw new Error("poly: tokenId not allowed");let l=Number(s.side)===0?"BUY":"SELL";if(r.side&&r.side!==l)throw new Error("poly: side mismatch");let m=F(s.makerAmount,"poly: makerAmount"),f=F(s.takerAmount,"poly: takerAmount"),p=F(r.makerAmount,"poly: prepared makerAmount"),w=F(r.takerAmount,"poly: prepared takerAmount");if(m!==p)throw new Error("poly: signed makerAmount differs from prepared envelope");if(f!==w)throw new Error("poly: signed takerAmount differs from prepared envelope");let h=l==="BUY"?m:f,b=l==="BUY"?f:m,A=O(r.quantity,6,"poly: quantity");if(A<=0n||A!==b)throw new Error("poly: quantity must match CLOB v2 amounts");let g=O(r.price,6,"poly: price");if(g<=0n||g>=1000000n)throw new Error("poly: price must be within (0,1)");if(b*g!==h*1000000n)throw new Error("poly: price must match CLOB v2 amounts");if(O(r.notionalUsdc,6,"poly: notionalUsdc")!==h)throw new Error("poly: notionalUsdc must match CLOB v2 amounts");let v=qt(s,l);if(O(v,6,"poly: displayed notionalUsdc")!==h)throw new Error("poly: displayed notionalUsdc must match CLOB v2 amounts");let P=t.maxNotionalUsd??t.maxNotionalUsdc;if(P!=null){let S=O(P,6,"poly: maxNotionalUsd");if(h>S)throw new Error("poly: notional exceeds cap")}return Object.freeze({unit:"usdc",value:h.toString(),notional:h.toString(),fee:"0",kind:n,tokenId:a,side:l,makerAmount:m.toString(),takerAmount:f.toString(),price:String(r.price),quantity:String(r.quantity),notionalUsdc:v,submitTo:Ut(r.submitTo)})}var $o=new Set(["https://mainnet.zklighter.elliot.ai/api/v1/sendTx","https://testnet.zklighter.elliot.ai/api/v1/sendTx"]),Gt=14,Ht=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`lighter: bounded ${t} required`);return e};function se(e,t,r){if(!Number.isSafeInteger(e)||e!==t)throw new Error(`lighter: ${r} must be exact numeric ${t}`)}function zt(e){let t=String(e||"").replace(/\/$/,"");if(!$o.has(t))throw new Error("lighter: submitTo must be the official Lighter sendTx");return t}function Re(e,t={}){if(e?.surface!=="lighter")throw new Error("lighter: surface lighter required");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("lighter: structured artifact required");let n=Ht(r.kind,"kind",48);if(n!=="lighter-order")throw new Error("lighter: unsupported Lighter kind");if(e.action!=="order")throw new Error("lighter: surface/action/kind mismatch");if(String(e.destination).toLowerCase()!=="lighter")throw new Error("lighter: destination must be lighter");let o=zt(r.submitTo),i=r.marketIndex;if(typeof i!="number"||!Number.isSafeInteger(i)||i<0)throw new Error("lighter: marketIndex required");let s=Number(J(r.accountIndex,"lighter: accountIndex"));if(!Number.isSafeInteger(s)||s<0)throw new Error("lighter: accountIndex required");let d=Number(J(r.clientOrderIndex,"lighter: clientOrderIndex"));if(!Number.isSafeInteger(d)||d<0)throw new Error("lighter: clientOrderIndex required");se(r.orderType,0,"orderType"),se(r.timeInForce,1,"timeInForce"),se(r.reduceOnly,0,"reduceOnly"),se(r.triggerPrice,0,"triggerPrice"),se(r.orderExpiry,-1,"orderExpiry");let u=Ht(r.symbol||r.coin,"symbol",32),a=Array.isArray(t.lighterMarkets)?t.lighterMarkets.map(String):[];if(a.length&&!a.includes(u)&&!a.includes(String(i))&&!a.includes("*"))throw new Error("lighter: market not allowed");if(r.side!=="buy"&&r.side!=="sell")throw new Error("lighter: side must be buy or sell");let c=F(r.baseAmount,"lighter: baseAmount"),l=F(r.price,"lighter: price");if(c>BigInt(Number.MAX_SAFE_INTEGER)||l>BigInt(Number.MAX_SAFE_INTEGER))throw new Error("lighter: baseAmount and price must be safe integers");let m=Number(c),f=Number(l),p=Number(r.sizeDecimals??0),w=Number(r.priceDecimals??0);if(!Number.isInteger(p)||p<0||p>12)throw new Error("lighter: sizeDecimals required");if(!Number.isInteger(w)||w<0||w>12)throw new Error("lighter: priceDecimals required");let h=p+w,b=c*l,A=O(r.notionalUsd,h,"lighter: notionalUsd");if(A<=0n)throw new Error("lighter: notionalUsd required");if(b!==A)throw new Error("lighter: notionalUsd must match size and price");let g=O(t.maxNotionalUsd??Number.MAX_SAFE_INTEGER,h,"lighter: maxNotionalUsd");if(b>g)throw new Error("lighter: notional exceeds cap");let E=k(r.notionalUsd,"lighter: notionalUsd");return se(r.txType,Gt,"txType"),Object.freeze({unit:"usd",value:String(E),notional:String(E),fee:"0",kind:n,symbol:u,marketIndex:i,side:r.side,baseAmount:m,price:f,submitTo:o,actionType:"create-order",amount:String(E)})}function Jt(e,t,r,n=null){let o=e?.version===1&&e?.surface?e:null,i=o?.artifact||e||{},s=[`surface=${o?.surface||"evm"} action=${o?.action||"evm"}`,`chain=${i.chainId??i.network??i.cluster??"n/a"} owner=${o?.owner||i.from||"n/a"}`,`to=${i.to||o?.destination||"n/a"} calldata=${String(i.data||"0x")} value=${i.value??"n/a"}`,`gas=${i.gasLimit??"n/a"} maxFeePerGas=${i.maxFeePerGas??i.gasPrice??"n/a"} maxPriorityFeePerGas=${i.maxPriorityFeePerGas??"n/a"}`,`l1FeeWei=${i.l1FeeWei??"n/a"} operatorFeeWei=${i.operatorFeeWei??"n/a"}`,`nonce=${i.nonce??"n/a"} type=${i.type??"n/a"} accessList=${Array.isArray(i.accessList)?i.accessList.length:0}`,`slippageBps=${o?.slippageBps??i.slippageBps??"n/a"} expiresAtMs=${o?.expiresAtMs??i.expiresAtMs??"n/a"}`],d=(a,c)=>{if(s.push(`LEG ${c} chain=${a.chainId??"n/a"} from=${a.from??"n/a"} to=${a.to??"n/a"}`),s.push(`LEG ${c} calldata=${String(a.data||"0x")} value=${a.value??"n/a"}`),s.push(`LEG ${c} gas=${a.gasLimit??"n/a"} maxFeePerGas=${a.maxFeePerGas??a.gasPrice??"n/a"} maxPriorityFeePerGas=${a.maxPriorityFeePerGas??"n/a"}`),s.push(`LEG ${c} l1FeeWei=${a.l1FeeWei??"n/a"} operatorFeeWei=${a.operatorFeeWei??"n/a"} nonce=${a.nonce??"n/a"} type=${a.type??"n/a"}`),C(String(a.data||"0x")))try{let l=V(String(a.data||"0x"));s.push(`LEG ${c} APPROVAL token=${l.token||a.to||"n/a"} spender=${l.spender} amount=${l.amount}`)}catch{s.push(`LEG ${c} APPROVAL spender=undecodable amount=undecodable`)}},u=String(i.data||"0x");if(C(u))try{let a=V(u);s.push(`APPROVAL token=${a.token||i.to||"n/a"} spender=${a.spender} amount=${a.amount}`)}catch{s.push("APPROVAL spender=undecodable amount=undecodable")}if(Array.isArray(i.transactions)&&(s.push(`batchLegs=${i.transactions.length}`),i.transactions.forEach((a,c)=>d(a,c))),o?.surface==="btc"){let a=ze(o,r);s.push(`amount=${a.value} sats fee=${a.fee} sats outputs=${a.outputs.join(",")}`)}if(o?.surface==="sol"){let a=Ye(o,r);s.push(`amount=${a.value} lamports fee=${a.fee} lamports programs=${a.programs.join(",")}`)}if(o?.surface==="hl"){let a=$e(o,r);s.push(`hlKind=${a.kind} actionType=${a.actionType} coin=${a.coin||"n/a"} amount=${a.amount} notionalUsd=${a.notional} submitTo=${a.submitTo}`)}if(o?.surface==="poly"){let a=Ce(o,r);s.push(`polyKind=${a.kind} tokenId=${a.tokenId} side=${a.side} price=${a.price} quantity=${a.quantity} notionalUsdc=${a.notionalUsdc} submitTo=${a.submitTo}`)}if(o?.surface==="evm-nft"&&o?.provider==="anvil-nft"&&(s.push(`anvilAction=${o.nftAction} collection=${o.contract} tokenId=${o.tokenId} market=${o.destination}`),s.push(`paymentToken=${o.paymentToken} paymentTokenDecimals=${o.paymentTokenDecimals} maxPaymentTokenAmountRaw=${o.maxPaymentTokenAmountRaw??"n/a"} minPayoutRaw=${o.minPayoutRaw??"n/a"} nativeSwapFeeWei=${o.nativeSwapFeeWei}`),n&&(s.push(`SIGNER VERIFIED block=${n.blockNumber} blockHash=${n.blockHash} runtimeCodeHash=${n.runtimeCodeHash} signer=${n.signerAddress} collection=${n.collection} paymentToken=${n.paymentToken} paymentTokenDecimals=${n.paymentTokenDecimals} nativeSwapFeeWei=${n.nativeSwapFeeWei}`),s.push(`SIGNER DYNAMIC tokenId=${n.tokenId} owner=${n.tokenOwner} inventory=${n.inventoryMember} allowanceRaw=${n.allowanceRaw} approved=${n.approvedAddress} approvedForAll=${n.approvedForAll} quote=${JSON.stringify(n.quote)}`))),o?.surface==="lighter"){let a=Re(o,r);s.push(`lighterKind=${a.kind} actionType=${a.actionType} market=${a.symbol} amount=${a.amount} submitTo=${a.submitTo}`)}return`
4
+ Confirm exact action
5
+ ${[...s,...Et(e,t,r)].join(`
6
+ `)}
7
+ Type digest ${t}: `}import{createHash as di,randomBytes as fi,timingSafeEqual as pi}from"node:crypto";import{base58 as xr}from"@scure/base";import{Interface as lr}from"ethers";_e();var be=e=>String(e||"").toLowerCase(),Mo=new Set(["chainId","from","to","data","value","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","l1FeeWei","operatorFeeWei","nonce","type","accessList","authorizationList","slippageBps","expiresAtMs"]),Do=new Set([10n,8453n,84532n,42161n,421614n,11155420n,7777777n]);function Q(e){try{return Do.has(BigInt(e))}catch{return!1}}var j=(e,t)=>{if(e==null||e==="")throw new Error(`policy: ${t} required`);try{let r=BigInt(e);if(r<0n)throw 0;return r}catch{throw new Error(`policy: ${t} must be a non-negative integer`)}},Yt=(e,t)=>{let r=Number(e);if(!Number.isFinite(r))throw new Error(`policy: ${t} must be finite`);return r},ce=(e,t,r,n=String)=>{if(!Array.isArray(t)||t.length===0)throw new Error(`policy: ${r} allowlist is empty`);if(!t.map(n).includes(n(e)))throw new Error(`policy: ${r} not allowed`)};function Be(e,t,{nowMs:r=Date.now(),networkFees:n,requireNetworkFees:o=!1}={}){if(!e||!t)throw new Error("policy: artifact and policy required");if(Object.keys(e).some(f=>!Mo.has(f)))throw new Error("policy: unexpected EVM artifact field");if(e.gasPrice!=null&&(e.maxFeePerGas!=null||e.maxPriorityFeePerGas!=null))throw new Error("policy: ambiguous EVM fee fields");if(e.type!=null&&![0,1,2,4].includes(Number(e.type)))throw new Error("policy: unsupported EVM transaction type");if(Number(e.type)===4){if(!Array.isArray(e.authorizationList)||e.authorizationList.length===0||e.authorizationList.length>8)throw new Error("policy: type-4 requires 1-8 authorizationList entries");for(let[f,p]of e.authorizationList.entries()){if(!p||typeof p!="object")throw new Error(`policy: authorizationList[${f}] required`);ce(p.address,t.destinations,"destination",be);try{if(BigInt(p.chainId)!==BigInt(e.chainId))throw new Error("policy: type-4 authorization chainId must match transaction")}catch(w){throw String(w?.message||"").includes("authorization chainId")?w:new Error("policy: type-4 authorization chainId must match transaction")}}if(String(e.data||"0x").toLowerCase()!=="0x")throw new Error("policy: type-4 calldata must be empty");if(j(e.value,"value")!==0n)throw new Error("policy: type-4 cannot transfer native value")}else if(e.authorizationList!=null)throw new Error("policy: authorizationList is only valid on type-4");let i=(f,p)=>{try{return BigInt(f)===BigInt(p)}catch{return String(f)===String(p)}};if(!Array.isArray(t.chains)||t.chains.length===0)throw new Error("policy: chain allowlist is empty");if(!t.chains.some(f=>i(f,e.chainId)))throw new Error("policy: chain not allowed");if(ce(e.to,t.destinations,"destination",be),ce(String(e.data||"0x").slice(0,10),t.selectors,"selector",f=>String(f).toLowerCase()),ce(e.from,t.owners,"owner",be),C(e.data)){let f;try{f=V(e.data)}catch(w){throw new Error(`policy: malformed approval calldata: ${w?.message||w}`)}ce(f.spender,t.spenders,"spender",be),ce(f.token||e.to,t.erc20Tokens,"ERC-20 token",be);let p=j(t.maxApproval,"maxApproval");if(BigInt(f.amount)>p)throw new Error("policy: approval exceeds cap");if(f.additive)throw new Error("policy: additive approval cannot be bounded; use approve() with an absolute amount")}if(j(e.value,"value")>j(t.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let s=j(e.gasLimit,"gasLimit");if(s>j(t.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");let d=e.maxFeePerGas??e.gasPrice,u=j(d,"feePerGas")*s,a=0n;try{if(Q(e.chainId)&&(e.l1FeeWei===void 0||e.operatorFeeWei===void 0))throw new Error("missing")}catch{throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(e.l1FeeWei!==void 0&&(a+=j(e.l1FeeWei,"l1FeeWei")),e.operatorFeeWei!==void 0&&(a+=j(e.operatorFeeWei,"operatorFeeWei")),Q(e.chainId)&&(o||n!=null)){if(!n||n.l1FeeWei===void 0||n.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");let f=j(n.l1FeeWei,"estimated l1FeeWei")+j(n.operatorFeeWei,"estimated operatorFeeWei");if(a<f)throw new Error("policy: rollup fee attestation understates estimate")}if(u+a>j(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");let l=Yt(t.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>l)throw new Error("policy: slippage attestation exceeds cap");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r)throw new Error("policy: artifact expired");let m=Yt(t.maxTtlMs??12e4,"maxTtlMs");if(m<=0||e.expiresAtMs-r>m)throw new Error("policy: artifact TTL exceeds cap");return!0}import{TypedDataEncoder as Qt,getAddress as W}from"ethers";_e();import{TypedDataEncoder as ac,getAddress as sc,isAddress as cc}from"ethers";var Xt=Object.freeze({1:"0x111111125421cA6dc452d289314280a0f8842A65",8453:"0x111111125421cA6dc452d289314280a0f8842A65",42161:"0x111111125421cA6dc452d289314280a0f8842A65",10:"0x111111125421cA6dc452d289314280a0f8842A65",137:"0x111111125421cA6dc452d289314280a0f8842A65",56:"0x111111125421cA6dc452d289314280a0f8842A65"}),tt=Object.freeze({Order:[{name:"salt",type:"uint256"},{name:"maker",type:"address"},{name:"receiver",type:"address"},{name:"makerAsset",type:"address"},{name:"takerAsset",type:"address"},{name:"makingAmount",type:"uint256"},{name:"takingAmount",type:"uint256"},{name:"makerTraits",type:"uint256"}]});import{TypedDataEncoder as bc,getAddress as Ec,isAddress as xc}from"ethers";var dc=Object.freeze({READ:"read",PREPARE:"prepare",EXECUTE:"execute",AUTONOMOUS:"autonomous"});_e();var Zt=Object.freeze({1:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",100:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",42161:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41",8453:"0x9008D19f58AAbD9eD0D60971565AA8510560ab41"}),Oc=Object.freeze({1:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",100:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",42161:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110",8453:"0xC92E8bdf79f0507f65a392b0ab4667716BFE0110"});var rt=Object.freeze({Order:[{name:"sellToken",type:"address"},{name:"buyToken",type:"address"},{name:"receiver",type:"address"},{name:"sellAmount",type:"uint256"},{name:"buyAmount",type:"uint256"},{name:"validTo",type:"uint32"},{name:"appData",type:"bytes32"},{name:"feeAmount",type:"uint256"},{name:"kind",type:"string"},{name:"partiallyFillable",type:"bool"},{name:"sellTokenBalance",type:"string"},{name:"buyTokenBalance",type:"string"}]}),Nc=Object.freeze({OrderCancellations:[{name:"orderUids",type:"bytes[]"}]});var jo=Object.freeze(["https://limit-orders.1inch.io","https://api.1inch.dev/orderbook"]),Uo="0x0000000000000000000000000000000000000000";function nt(e,t,r=256){if(typeof e!="string"||!e||e.length>r)throw new Error(`evm-order: bounded ${t} required`);return e}function er(e,t){let r=String(e||"").replace(/\/$/,"");if(!jo.some(o=>r===`${o}/v4.0/${t}`||r===`${o}/v4.1/${t}`))throw new Error("evm-order: submitTo must be the official 1inch orderbook");return r}function tr(e,t){let r={1:"https://api.cow.fi/mainnet/api/v1/orders",100:"https://api.cow.fi/xdai/api/v1/orders",42161:"https://api.cow.fi/arbitrum_one/api/v1/orders",8453:"https://api.cow.fi/base/api/v1/orders"}[Number(t)],n=String(e||"").replace(/\/$/,"");if(!r||n!==r)throw new Error("evm-order: cow submitTo must be official api.cow.fi");return n}function rr(e,t){let r=e?.Order,n=t.Order;return!Array.isArray(r)||r.length!==n.length?!1:r.every((o,i)=>o?.name===n[i].name&&o?.type===n[i].type)}function nr(e,...t){let r=Array.isArray(e.tokens)?e.tokens.map(n=>String(n).toLowerCase()):[];if(!r.length)throw new Error("evm-order: tokens allowlist is empty");if(!r.includes("*")){for(let n of t)if(!r.includes(String(n).toLowerCase()))throw new Error("evm-order: token not allowed")}}function or(e,t,{allowZero:r=!1}={}){let n=String(t||"").toLowerCase();if(!n)throw new Error("evm-order: receiver required");if(n===Uo){if(!r)throw new Error("evm-order: receiver must equal owner");return}if(n!==e)throw new Error("evm-order: receiver must equal owner")}function ir(e,t){if(e?.surface!=="evm-order")throw new Error("evm-order: surface evm-order required");if(e.action!=="order")throw new Error("evm-order: action must be order");let r=e.artifact;if(!r||typeof r!="object"||Array.isArray(r))throw new Error("evm-order: structured artifact required");let n=nt(r.kind,"kind",32);if(n==="option")throw new Error("evm-order: option kind refused until official Derive/Lyra domain is pinned");if(n==="cow"){let l=Number(r.chainId??e.chainId);if(tr(r.submitTo,l),nt(e.destination,"destination",32)!=="cowswap")throw new Error("evm-order: cow destination must be cowswap");let m=Zt[l];if(!m)throw new Error(`evm-order: unsupported cow chainId ${l}`);let f=r.domain||r.typedData?.domain,p=r.types||r.typedData?.types,w=r.message||r.typedData?.message;if(!f||!p?.Order||!w)throw new Error("evm-order: CoW EIP-712 Order required");if(!rr(p,rt))throw new Error("evm-order: cow types must be official GPv2 Order");if(Number(f.chainId)!==l)throw new Error("evm-order: cow domain chain mismatch");if(String(f.name)!=="Gnosis Protocol"||String(f.version)!=="v2")throw new Error("evm-order: cow domain must be official GPv2");if(W(f.verifyingContract)!==W(m))throw new Error("evm-order: cow verifyingContract must be official GPv2 settlement");let h=String(e.owner||"").toLowerCase();or(h,w.receiver),nr(t,w.sellToken,w.buyToken);let b=W(w.sellToken),A=String(w.feeAmount||"0"),g=(BigInt(w.sellAmount)+BigInt(A)).toString();return Object.freeze({unit:`erc20:${b.toLowerCase()}`,value:g,notional:g,fee:A,submitTo:tr(r.submitTo,l),digest:Qt.hash(f,{Order:rt.Order},w),chainId:l,kind:"cow",receiver:W(w.receiver),sellAmount:String(w.sellAmount),buyAmount:String(w.buyAmount)})}if(n!=="1inch-limit")throw new Error("evm-order: unsupported kind");if(nt(e.destination,"destination",32)!=="1inch-lop")throw new Error("evm-order: destination must be 1inch-lop");let o=Number(r.chainId??e.chainId),i=Xt[o];if(!i)throw new Error(`evm-order: unsupported chainId ${o}`);er(r.submitTo,o);let s=r.domain||r.typedData?.domain,d=r.types||r.typedData?.types,u=r.message||r.typedData?.message;if(!s||!d?.Order||!u)throw new Error("evm-order: EIP-712 Order required");if(!rr(d,tt))throw new Error("evm-order: types must be official LOP v4 Order");if(Number(s.chainId)!==o)throw new Error("evm-order: domain chain mismatch");if(W(s.verifyingContract)!==W(i))throw new Error("evm-order: verifyingContract must be official LOP v4");if(s.name!=="1inch Limit Order Protocol"||String(s.version)!=="4")throw new Error("evm-order: EIP-712 domain must be official LOP v4");let a=String(e.owner||"").toLowerCase();if(W(u.maker).toLowerCase()!==a)throw new Error("evm-order: maker must equal owner");or(a,u.receiver,{allowZero:!0}),nr(t,u.makerAsset,u.takerAsset);let c=Qt.hash(s,{Order:tt.Order},u);return Object.freeze({unit:`erc20:${W(u.makerAsset).toLowerCase()}`,value:String(u.makingAmount),notional:String(u.makingAmount),fee:"0",submitTo:er(r.submitTo,o),digest:c,chainId:o,kind:"1inch-limit",receiver:W(u.receiver),makerAsset:W(u.makerAsset),takerAsset:W(u.takerAsset),makingAmount:String(u.makingAmount),takingAmount:String(u.takingAmount)})}var dr=new Set(["evm","evm-swap","evm-bridge","evm-nft","evm-order","btc","sol","hl","poly","lighter"]);var ot=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0,delegate:0,identity:0,order:0,cancel:0,leverage:0,margin:0,approveBuilder:0,stake:0,unstake:0}),Wo=new Set(["0x0000000000000000000000000000000000000000","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"]),fr=Object.freeze({"0x04e45aaf":{provider:"uniswap-v3",action:"swap",layout:"router02-exact-input-single"},"0x414bf389":{provider:"uniswap-v3",action:"swap",layout:"swap-router-exact-input-single"},"0xc04b8d59":{provider:"uniswap-v3",action:"swap",layout:"exact-input-deadline"},"0xb858183f":{provider:"uniswap-v3",action:"swap",layout:"exact-input"},"0x5ae401dc":{provider:"uniswap-v3",action:"swap",layout:"multicall-deadline"},"0xa026383e":{provider:"aerodrome",action:"swap",layout:"aerodrome-exact-input-single"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Ho=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"},"0xc2f6663a":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-allowlist"}}),Fe=new lr(["function buySpecificNFT(uint256 tokenId,uint256 maxCost) payable","function sellNFT(uint256 tokenId,uint256 minPayout) payable"]),ar=new lr(["function mintAllowList(address nftContract,address feeRecipient,address minterIfNotPayer,uint256 quantity,(uint80 mintPrice,uint48 maxTotalMintableByWallet,uint48 startTime,uint48 endTime,uint48 dropStageIndex,uint32 maxTokenSupplyForStage,uint16 feeBps,bool restrictFeeRecipients) mintParams,bytes32[] proof) payable"]),Go=Object.freeze({"0xa0712d68":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0x1249c58b":{provider:"nft-mint",action:"mint",layout:"mint-no-args"},"0x2db11544":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xefef39a1":{provider:"nft-mint",action:"mint",layout:"mint-quantity"},"0xa6f2ae3a":{provider:"nft-mint",action:"mint",layout:"mint-no-args"}});var xe=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`envelope: bounded ${t} required`);return e},x=(e,t)=>{try{let r=BigInt(e);if(r<0n)throw 0;return r}catch{throw new Error(`envelope: ${t} must be a non-negative integer`)}},sr=(e,t)=>{let r=Number(e);if(!Number.isFinite(r))throw new Error(`policy: ${t} must be finite`);return r},zo=(e,t)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${t} allowlist is empty`);return e},N=(e,t,r)=>{if(!zo(t,r).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${r} not allowed`)},Ee=(e,t,r)=>{Array.isArray(t)&&t.length&&N(e,t,r)},T=(e,t)=>{let r=String(e||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error(`envelope: ${t} must be a 20-byte address`);return r},ne=e=>String(e||"0x").slice(0,10).toLowerCase(),pr=e=>x(e.gasLimit,"gasLimit")*x(e.maxFeePerGas??e.gasPrice,"feePerGas")+x(e.l1FeeWei??0,"l1FeeWei")+x(e.operatorFeeWei??0,"operatorFeeWei");function ue(e,t,r,{dynamicTail:n=!1}={}){let o=String(e||"").toLowerCase();if(!/^0x[0-9a-f]*$/.test(o)||o.length<10+t*64)throw new Error(`envelope: malformed ${r} calldata`);if(!n&&o.length!==10+t*64)throw new Error(`envelope: malformed ${r} calldata`);return{hex:o,word:i=>o.slice(10+i*64,10+(i+1)*64)}}function $(e,t){if(!/^0{24}[0-9a-f]{40}$/.test(e))throw new Error(`envelope: malformed ${t} address`);return`0x${e.slice(24)}`}function H(e,t){try{return BigInt(`0x${e}`)}catch{throw new Error(`envelope: malformed ${t} integer`)}}function Jo(e){if(ne(e)!=="0x095ea7b3")return null;let t=ue(e,2,"approval");return{kind:"approval",spender:$(t.word(0),"approval spender"),amount:H(t.word(1),"approval amount")}}function mr(e,t){let r=t==="router02-exact-input-single"?7:8,n=ue(e,r,"Uniswap v3 exactInputSingle"),o=r===7?4:5;return{kind:"action",action:"swap",inputToken:$(n.word(0),"input token"),outputToken:$(n.word(1),"output token"),recipient:$(n.word(3),"recipient"),amountIn:H(n.word(o),"amountIn"),minimumOut:H(n.word(o+1),"amountOutMinimum")}}function Vo(e){let t=ue(e,12,"Across depositV3",{dynamicTail:!0}),r=H(t.word(11),"message offset");if(r!==384n)throw new Error("envelope: malformed Across depositV3 message offset");let n=10+Number(r)*2;if(t.hex.length<n+64)throw new Error("envelope: malformed Across depositV3 message");let o=Number(BigInt(`0x${t.hex.slice(n,n+64)}`));if(!Number.isSafeInteger(o))throw new Error("envelope: malformed Across depositV3 message length");let i=Math.ceil(o/32)*64;if(t.hex.length!==n+64+i)throw new Error("envelope: malformed Across depositV3 trailing bytes");return{kind:"action",action:"bridge",depositor:$(t.word(0),"depositor"),recipient:$(t.word(1),"recipient"),inputToken:$(t.word(2),"input token"),outputToken:$(t.word(3),"output token"),amountIn:H(t.word(4),"inputAmount"),minimumOut:H(t.word(5),"outputAmount"),destinationChainId:H(t.word(6),"destinationChainId")}}function Ko(e){let t=String(e||"").replace(/^0x/i,"").toLowerCase();if(t.length<86||t.length%2!==0)throw new Error("envelope: malformed Uniswap path");let r=`0x${t.slice(0,40)}`,n=`0x${t.slice(t.length-40)}`;if(!/^0x[0-9a-f]{40}$/.test(r)||!/^0x[0-9a-f]{40}$/.test(n))throw new Error("envelope: malformed Uniswap path tokens");return{inputToken:r,outputToken:n}}function cr(e,{hasDeadline:t}){let r=String(e||"").toLowerCase();if(!/^0x[0-9a-f]+$/.test(r)||r.length<74)throw new Error("envelope: malformed exactInput calldata");let n=[];for(let h=10;h+64<=r.length;h+=64)n.push(r.slice(h,h+64));let o=(h,b)=>{if(!n[h])throw new Error(`envelope: malformed ${b}`);return BigInt(`0x${n[h]}`)},i=Number(o(0,"exactInput struct offset"));if(i%32!==0)throw new Error("envelope: malformed exactInput struct offset");let s=i/32,d=Number(o(s,"path offset")),u=n[s+1],a=o(s+(t?3:2),"amountIn"),c=o(s+(t?4:3),"amountOutMinimum"),l=s+d/32;if(!Number.isInteger(l)||!n[l])throw new Error("envelope: malformed exactInput path");let m=Number(o(l,"path length")),f=r.slice(10+(l+1)*64,10+(l+1)*64+m*2),{inputToken:p,outputToken:w}=Ko(`0x${f}`);return{kind:"action",action:"swap",inputToken:p,outputToken:w,recipient:$(u,"recipient"),amountIn:a,minimumOut:c}}function Yo(e){let t=ue(e,8,"Aerodrome exactInputSingle");return{kind:"action",action:"swap",inputToken:$(t.word(0),"input token"),outputToken:$(t.word(1),"output token"),recipient:$(t.word(3),"recipient"),amountIn:H(t.word(5),"amountIn"),minimumOut:H(t.word(6),"amountOutMinimum")}}function Xo(e){let t=String(e||"").toLowerCase();if(!t.startsWith("0x5ae401dc"))throw new Error("envelope: malformed Uniswap multicall");let r=[];for(let m=10;m+64<=t.length;m+=64)r.push(t.slice(m,m+64));let n=Number(BigInt(`0x${r[1]}`));if(n%32!==0)throw new Error("envelope: malformed multicall data offset");let o=n/32;if(Number(BigInt(`0x${r[o]}`))!==1)throw new Error("envelope: multicall must wrap exactly one swap");let s=Number(BigInt(`0x${r[o+1]}`)),d=o+1+s/32,u=Number(BigInt(`0x${r[d]}`)),c=`0x${t.slice(10+(d+1)*64,10+(d+1)*64+u*2)}`,l=ne(c);if(l!=="0x04e45aaf"&&l!=="0x414bf389")throw new Error("envelope: multicall inner call must be exactInputSingle");return mr(c,l==="0x04e45aaf"?"router02-exact-input-single":"swap-router-exact-input-single")}function Zo(e,t){let r=ne(e),n=fr[r];if(!n)throw new Error("envelope: opaque or unsupported EVM swap/bridge calldata");if(String(t).toLowerCase()!==n.provider)throw new Error("envelope: provider does not match reviewed selector");if(n.layout==="router02-exact-input-single"||n.layout==="swap-router-exact-input-single")return{...mr(e,n.layout),selector:r,provider:n.provider};if(n.layout==="exact-input-deadline")return{...cr(e,{hasDeadline:!0}),selector:r,provider:n.provider};if(n.layout==="exact-input")return{...cr(e,{hasDeadline:!1}),selector:r,provider:n.provider};if(n.layout==="multicall-deadline")return{...Xo(e),selector:r,provider:n.provider};if(n.layout==="aerodrome-exact-input-single")return{...Yo(e),selector:r,provider:n.provider};if(n.action==="bridge")return{...Vo(e),selector:r,provider:n.provider};throw new Error("envelope: unsupported reviewed EVM action")}function Qo(e){let t=ue(e,4,"SeaDrop mintPublic");return{kind:"mint",action:"mint",mintType:"public",contract:$(t.word(0),"mint NFT contract"),feeRecipient:$(t.word(1),"mint fee recipient"),recipient:$(t.word(2),"mint recipient"),quantity:H(t.word(3),"mint quantity")}}function ei(e){let t;try{t=ar.decodeFunctionData("mintAllowList",e)}catch{throw new Error("envelope: malformed SeaDrop mintAllowList calldata")}let r=t[4],n=[...t[5]].map(String);if(n.length<1||n.length>64||n.some(u=>!/^0x[0-9a-fA-F]{64}$/.test(u)))throw new Error("envelope: bounded canonical SeaDrop allowlist proof required");if(ar.encodeFunctionData("mintAllowList",[t[0],t[1],t[2],t[3],r,n]).toLowerCase()!==String(e).toLowerCase())throw new Error("envelope: SeaDrop allowlist calldata must be canonical");let i=BigInt(r.startTime),s=BigInt(r.endTime);if(s<=i)throw new Error("envelope: SeaDrop allowlist stage time range is invalid");let d=BigInt(t[3]);if(BigInt(r.maxTotalMintableByWallet)<d)throw new Error("envelope: SeaDrop allowlist wallet cap is below quantity");return{kind:"mint",action:"mint",mintType:"allowlist",contract:T(t[0],"mint NFT contract"),feeRecipient:T(t[1],"mint fee recipient"),recipient:T(t[2],"mint recipient"),quantity:d,mintPrice:BigInt(r.mintPrice),startTime:i,endTime:s,dropStageIndex:BigInt(r.dropStageIndex),proof:n}}function ti(e,t){let r=ne(e);if(String(t).toLowerCase()==="nft-mint")return ri(e);let n=Ho[r];if(!n)throw new Error("envelope: opaque or unsupported NFT mint calldata");if(String(t).toLowerCase()!==n.provider)throw new Error("envelope: provider does not match reviewed NFT selector");if(n.layout==="seadrop-mint-public")return{...Qo(e),selector:r,provider:n.provider};if(n.layout==="seadrop-mint-allowlist")return{...ei(e),selector:r,provider:n.provider};throw new Error("envelope: unsupported reviewed NFT action")}function ri(e){let t=ne(e);if(t==="0x40c10f19")throw new Error("envelope: ambiguous mint(address,uint256) calldata is not a built-in signer surface");let r=Go[t];if(!r)throw new Error("envelope: opaque or unsupported NFT mint calldata");if(r.layout==="mint-no-args")return{kind:"mint",action:"mint",selector:t,provider:"nft-mint",quantity:1n};if(r.layout==="mint-quantity"){let n=ue(e,1,"generic NFT mint");return{kind:"mint",action:"mint",selector:t,provider:"nft-mint",quantity:H(n.word(0),"mint quantity")}}throw new Error("envelope: unsupported generic NFT mint calldata")}function Ae(e){let t=e?.artifact;if(Array.isArray(t?.transactions))return t.transactions;if(t?.transaction&&typeof t.transaction=="object")return[t.transaction];if(t?.data)return[t];throw new Error("envelope: ordered EVM transaction batch required")}function wr(e,t,r,{nowMs:n=Date.now(),networkFees:o,requireNetworkFees:i=!1}={}){let s=T(e.owner,"owner"),d=e.artifact,u=Number(d?.chainId??Ae(e)[0]?.chainId);if(!Number.isSafeInteger(u)||u<=0)throw new Error("envelope: explicit batch chainId required");if(N(u,t.chains,"chain"),d?.owner!==void 0&&T(d.owner,"batch owner")!==s)throw new Error("envelope: explicit batch owner mismatch");let a=Ae(e);if(!a.length||a.length>8)throw new Error("envelope: bounded EVM transaction batch required");let c=0n,l=0n,m=0n;for(let f of a){if(!f||typeof f!="object"||Array.isArray(f))throw new Error("envelope: structured EVM transaction required");if(Number(f.chainId)!==u)throw new Error("envelope: every batch leg must use the same chain");if(T(f.from,"transaction owner")!==s)throw new Error("envelope: every batch leg must use the same owner");if(N(ne(f.data),t.selectors,"selector"),c+=x(f.value??0,"value"),l+=x(f.gasLimit,"gasLimit"),m+=pr(f),Q(u)&&(f.l1FeeWei===void 0||f.operatorFeeWei===void 0))throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(c>x(t.maxValueWei,"maxValueWei"))throw new Error("policy: aggregate value exceeds cap");if(l>x(t.maxGasLimit,"maxGasLimit"))throw new Error("policy: aggregate gas exceeds cap");if(m>x(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: aggregate fee exceeds cap");return{transactions:a,chainId:u,owner:s,totalValue:c,totalGas:l,totalFee:m}}function hr(e,t,{nowMs:r=Date.now(),routeAttestationSecret:n}={}){let o=String(e?.surface||"");if(o!=="evm-swap"&&o!=="evm-bridge")throw new Error("envelope: strict EVM swap/bridge surface required");let i=xe(e.provider,"provider",64).toLowerCase();N(i,t.providers,"provider");let s=wr(e,t,o,{nowMs:r}),d=[],u=-1;for(let p=0;p<s.transactions.length;p++){let w=s.transactions[p],h=Jo(w.data),b;if(h){if(u!==-1)throw new Error("envelope: approval must be before action");if(x(w.value??0,"value")!==0n)throw new Error("envelope: approval cannot transfer native value");let E=T(w.to,"approval token");if(N(E,t.tokens,"token"),N(h.spender,t.spenders,"spender"),h.amount>x(t.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap");b={...h,token:E,index:p}}else{if(u!==-1)throw new Error("envelope: exactly one swap/bridge action is supported per batch");N(w.to,t.destinations,"destination"),b={...Zo(w.data,i),target:T(w.to,"action target"),index:p},u=p}let A=x(w.value??0,"value"),g=x(w.gasLimit,"gasLimit");d.push({...b,value:A,gas:g,fee:pr(w)})}if(u<0)throw new Error("envelope: reviewed swap/bridge action required");let a=d[u],c=o==="evm-swap"?"swap":"bridge";if(a.action!==c||e.action!==c)throw new Error("envelope: surface/action/calldata mismatch");if(T(e.destination,"destination")!==a.target)throw new Error("envelope: destination must equal decoded action target");if(a.recipient!==s.owner)throw new Error("envelope: decoded recipient must equal owner");if(a.depositor&&a.depositor!==s.owner)throw new Error("envelope: decoded bridge depositor must equal owner");if(N(a.inputToken,t.tokens,"input token"),N(a.outputToken,t.tokens,"output token"),a.amountIn<=0n||a.amountIn>x(t.maxPerTrade,"maxPerTrade"))throw new Error("policy: decoded amount exceeds per-trade cap");if(a.minimumOut<=0n)throw new Error("policy: decoded minimum output must be positive");if(Ue(e.autoSlippage,{nowMs:r,chainId:s.chainId,venue:i,tx:s.transactions[u],secret:n,requireSigned:!0}),Number(e.slippageBps)!==Number(e.autoSlippage.selectedBps))throw new Error("policy: slippageBps must equal the authenticated quote selectedBps");if(a.minimumOut!==x(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"))throw new Error("policy: decoded minimum output does not match authenticated quote");if(a.action==="bridge"&&x(e.toChainId,"toChainId")!==a.destinationChainId)throw new Error("envelope: decoded bridge destination chain mismatch");let l=d.filter(p=>p.kind==="approval");if(!new Set([...Wo,...Array.isArray(t.nativeInputTokens)?t.nativeInputTokens.map(p=>String(p).toLowerCase()):[]]).has(a.inputToken))throw new Error("envelope: strict local signer swap/bridge requires native input token; use wallet signing for token-unit rails");if(l.length)throw new Error("envelope: native-value action must not include token approval");if(a.value!==a.amountIn)throw new Error("envelope: native value must exactly match decoded amountIn");let f=Object.freeze({quoteAmountOut:x(e.autoSlippage.quoteAmountOut,"authenticated quote amountOut"),minAmountOut:x(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"),selectedBps:Number(e.autoSlippage.selectedBps),quotedAtMs:Number(e.autoSlippage.quotedAtMs),expiresAtMs:Number(e.autoSlippage.expiresAtMs)});return{...s,decoded:d,action:a,provider:i,authenticatedQuote:f}}function ni(e,t,{nowMs:r}){let n=e.anvilAttestation,o=e.artifact?.anvilAttestation;if(!n||typeof n!="object"||Array.isArray(n))throw new Error("envelope: Anvil attestation is required");if(!o||JSON.stringify(o)!==JSON.stringify(n))throw new Error("envelope: Anvil attestation artifact mismatch");if(Number(n.version)!==1||n.source!=="anvil-snapshot-rpc-reviewed-runtime")throw new Error("envelope: unsupported Anvil attestation");if(Number(n.chainId)!==4663)throw new Error("envelope: Anvil attestation chain mismatch");let i=T(e.destination,"Anvil market"),s=T(e.contract,"NFT contract"),d=T(e.paymentToken,"payment token");if(T(n.market,"attested Anvil market")!==i)throw new Error("envelope: Anvil attestation market mismatch");if(T(n.collection,"attested NFT collection")!==s)throw new Error("envelope: Anvil attestation collection mismatch");if(T(n.paymentToken,"attested payment token")!==d)throw new Error("envelope: Anvil attestation payment token mismatch");let u=Number(e.paymentTokenDecimals??e.artifact?.paymentTokenDecimals);if(!Number.isSafeInteger(u)||u<0||u>255||Number(n.paymentTokenDecimals)!==u)throw new Error("envelope: Anvil payment token decimals mismatch");let a=x(e.nativeSwapFeeWei??e.artifact?.nativeSwapFeeWei,"nativeSwapFeeWei").toString();if(x(n.nativeSwapFeeWei,"attested nativeSwapFeeWei").toString()!==a)throw new Error("envelope: Anvil attestation native swap fee mismatch");let c=Number(n.snapshotFetchedAtMs),l=Number(n.snapshotExpiresAtMs);if(!Number.isFinite(c)||!Number.isFinite(l)||c>r||l<=r||l<=c)throw new Error("envelope: Anvil snapshot attestation is stale");let m=x(n.blockNumber,"attested blockNumber");if(m<=0n||!/^0x[0-9a-f]{64}$/.test(String(n.blockHash||"").toLowerCase()))throw new Error("envelope: Anvil block attestation is invalid");let f=String(n.runtimeCodeHash||"").toLowerCase();if(!/^0x[0-9a-f]{64}$/.test(f))throw new Error("envelope: Anvil runtime code hash is invalid");let p=Object.entries(t.anvilRuntimeCodeHashes||{}).find(([h])=>h.toLowerCase()===i)?.[1];if(!p||String(p).toLowerCase()!==f)throw new Error("policy: Anvil runtime code hash is not reviewed");let w=Object.entries(t.nftPaymentTokenCaps||{}).find(([h])=>h.toLowerCase()===d)?.[1];if(!w||Number(w.decimals)!==u)throw new Error("policy: Anvil payment token decimals are not reviewed");return Object.freeze({...n,market:i,collection:s,paymentToken:d,paymentTokenDecimals:u,runtimeCodeHash:f,blockNumber:m})}function ur(e,t){let r=e.artifact,n=e.anvilQuote,o=r?.anvilQuote;if(!n||typeof n!="object"||Array.isArray(n)||!o||JSON.stringify(o)!==JSON.stringify(n))throw new Error("envelope: exact Anvil quote artifact mismatch");if(e.preconditions?.exactQuoteConfirmed!==!0)throw new Error("envelope: exact Anvil quote confirmation required");let i=t==="buy"?[[n.totalCostRaw,"anvilQuote.totalCostRaw"],[e.maxPaymentTokenAmountRaw,"maxPaymentTokenAmountRaw"],[r?.maxPaymentTokenAmountRaw,"artifact maxPaymentTokenAmountRaw"],[e.exactQuoteTotalCostRaw,"exactQuoteTotalCostRaw"],[r?.exactQuoteTotalCostRaw,"artifact exactQuoteTotalCostRaw"],[e.preconditions?.confirmedTotalCostRaw,"confirmedTotalCostRaw"]]:[[n.netPayoutRaw,"anvilQuote.netPayoutRaw"],[e.minPayoutRaw,"minPayoutRaw"],[r?.minPayoutRaw,"artifact minPayoutRaw"],[e.exactQuoteNetPayoutRaw,"exactQuoteNetPayoutRaw"],[r?.exactQuoteNetPayoutRaw,"artifact exactQuoteNetPayoutRaw"],[e.preconditions?.confirmedNetPayoutRaw,"confirmedNetPayoutRaw"]],s=x(i[0][0],i[0][1]);for(let[d,u]of i.slice(1))if(x(d,u)!==s)throw new Error(`envelope: Anvil ${t} exact settlement limit mismatch`);return s}function gr(e,t,{nowMs:r=Date.now()}={}){if(e?.surface!=="evm-nft")throw new Error("envelope: evm-nft surface required");if(!["mint","nft"].includes(e.action))throw new Error("envelope: evm-nft requires mint or NFT action");let n=xe(e.provider||e.artifact?.provider||"opensea-nft","provider",64).toLowerCase();Ee(n,t.providers,"provider");let o=wr(e,t,"evm-nft",{nowMs:r});if(n==="anvil-nft"){if(e.action!=="nft")throw new Error("envelope: Anvil requires NFT action");if(o.chainId!==4663)throw new Error("envelope: Anvil requires chain 4663");if(t.confirmationMode!=="exact-human")throw new Error("policy: Anvil requires exact-human confirmation");if(o.transactions.length!==1)throw new Error("envelope: Anvil requires one atomic action with pre-existing approval");if(Number(e.slippageBps)!==0)throw new Error("envelope: Anvil exact limit requires zero slippageBps");let[f]=o.transactions,p=T(e.destination,"Anvil market");if(T(f.to,"Anvil action target")!==p)throw new Error("envelope: Anvil action target mismatch");N(p,t.destinations,"destination");let w=T(e.contract??e.artifact?.contract,"NFT contract");if(Ee(w,t.nftContracts,"NFT contract"),T(e.marketCollection??e.artifact?.marketCollection,"Anvil market collection")!==w)throw new Error("envelope: Anvil market collection mismatch");let b=T(e.paymentToken??e.artifact?.paymentToken,"payment token");Ee(b,t.erc20Tokens,"ERC20 token");let A=ni(e,t,{nowMs:r}),g=x(e.tokenId??e.artifact?.tokenId,"tokenId"),E=x(e.nativeSwapFeeWei??e.artifact?.nativeSwapFeeWei,"nativeSwapFeeWei");if(o.totalValue!==E||x(f.value??0,"Anvil action value")!==E)throw new Error("envelope: Anvil native swap fee mismatch");if(E>x(t.maxNativeSwapFeeWei,"maxNativeSwapFeeWei"))throw new Error("policy: Anvil native swap fee exceeds cap");let v=xe(e.nftAction,"nftAction",8).toLowerCase(),P;if(v==="buy"){let S=ur(e,v),ee=Object.entries(t.nftPaymentTokenCaps||{}).find(([X])=>X.toLowerCase()===b)?.[1];if(!ee)throw new Error("policy: Anvil payment-token cap required");if(S>x(ee.maxPerTradeRaw,"maxPerTradeRaw"))throw new Error("policy: Anvil payment amount exceeds cap");if(e.preconditions?.allowanceVerified!==!0||x(e.preconditions?.allowanceRaw,"allowanceRaw")<S)throw new Error("envelope: Anvil pre-existing allowance proof required");let _=Fe.decodeFunctionData("buySpecificNFT",f.data);if(Fe.encodeFunctionData("buySpecificNFT",[_[0],_[1]]).toLowerCase()!==String(f.data).toLowerCase())throw new Error("envelope: non-canonical Anvil buy calldata");if(BigInt(_[0])!==g)throw new Error("envelope: Anvil tokenId mismatch");if(BigInt(_[1])!==S)throw new Error("envelope: Anvil maxCost mismatch");P={kind:"nft",action:"buy",tokenId:g,maxPaymentTokenAmountRaw:S,target:p}}else if(v==="sell"){let S=e.preconditions||{},ee=T(S.approvedAddress,"NFT approval address");if(S.nftApprovalVerified!==!0||ee!==p&&S.approvedForAll!==!0)throw new Error("envelope: Anvil pre-existing NFT approval proof required");let _=ur(e,v),Y=Fe.decodeFunctionData("sellNFT",f.data);if(Fe.encodeFunctionData("sellNFT",[Y[0],Y[1]]).toLowerCase()!==String(f.data).toLowerCase())throw new Error("envelope: non-canonical Anvil sell calldata");if(BigInt(Y[0])!==g)throw new Error("envelope: Anvil tokenId mismatch");if(BigInt(Y[1])!==_)throw new Error("envelope: Anvil minPayout mismatch");P={kind:"nft",action:"sell",tokenId:g,minPayoutRaw:_,target:p}}else throw new Error("envelope: unsupported Anvil NFT action");return{...o,provider:n,nftAction:v,tokenId:g,paymentToken:b,paymentTokenDecimals:A.paymentTokenDecimals,anvilAttestation:A,decoded:[P]}}let i=e.artifact?.oraclePrepared===!0?e.artifact:e.prepared;if(i?.oraclePrepared===!0&&Kt(i,{nowMs:r,providers:Array.isArray(t.providers)&&t.providers.length?t.providers:null,kinds:["nft-mint"],label:"local-signer"}),o.transactions.length!==1)throw new Error("envelope: mint supports exactly one transaction");let s=o.transactions[0],d=ne(s.data);N(d,t.selectors,"selector"),N(s.to,t.destinations,"destination");let u=ti(s.data,n),a=T(e.contract??e.artifact?.contract,"NFT contract");if(Ee(a,t.nftContracts,"NFT contract"),(u.contract||T(s.to,"NFT contract"))!==a)throw new Error("envelope: mint calldata NFT contract mismatch");if(u.recipient&&u.recipient!==o.owner)throw new Error("envelope: mint calldata recipient mismatch");u.feeRecipient&&Ee(u.feeRecipient,t.nftFeeRecipients,"mint fee recipient");let l=x(e.quantity??e.artifact?.quantity,"quantity");if(l<=0n||l>x(t.maxMintQuantity??1,"maxMintQuantity"))throw new Error("policy: mint quantity exceeds cap");if(u.quantity!==l)throw new Error("envelope: mint calldata quantity mismatch");let m=x(e.totalWei??e.artifact?.totalWei,"totalWei");if(o.totalValue!==m)throw new Error("envelope: mint value does not match declared totalWei");if(u.mintType==="allowlist"){let f=BigInt(Math.floor(r/1e3));if(u.startTime>f||u.endTime<=f)throw new Error("policy: SeaDrop allowlist stage is not open");if(u.mintPrice*l!==m)throw new Error("envelope: SeaDrop allowlist price does not match declared totalWei")}if((e.priceWei!==void 0||e.artifact?.priceWei!==void 0)&&x(e.priceWei??e.artifact.priceWei,"priceWei")*l!==m)throw new Error("envelope: mint price does not match declared totalWei");if(m>x(t.maxMintTotalWei??t.maxValueWei,"maxMintTotalWei"))throw new Error("policy: mint total exceeds cap");return{...o,provider:n,decoded:[{...u,target:T(s.to,"mint target"),value:o.totalValue,gas:o.totalGas,fee:o.totalFee}]}}function yr(e,{localsWaiver:t=!1}={}){if(!(e in ot))throw new Error("fee: unknown action");return t?0:ot[e]}function le(e,t,{nowMs:r=Date.now(),verifyFeeWaiver:n,routeAttestationSecret:o,networkFees:i,requireNetworkFees:s=!1}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let d=xe(e.surface,"surface",16);if(!dr.has(d))throw new Error("envelope: unsupported public surface");let u=xe(e.action,"action",32);N(d,t.surfaces,"surface"),N(u,t.actions,"action"),N(e.owner,t.owners,"owner"),N(e.destination,t.destinations,"destination");let a=sr(t.maxTtlMs,"maxTtlMs"),c=sr(t.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r||e.expiresAtMs-r>a)throw new Error("policy: TTL outside bounds");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>c)throw new Error("policy: slippage exceeds cap");let l=e.artifact;if(!l||typeof l!="object"||Array.isArray(l))throw new Error("envelope: structured artifact required");if(d==="evm-swap"||d==="evm-bridge")hr(e,t,{nowMs:r,routeAttestationSecret:o});else if(d==="evm-nft")gr(e,t,{nowMs:r});else if(d==="evm"){if(!["transfer","approve","delegate","identity"].includes(u))throw new Error(u==="mint"?"envelope: generic evm requires transfer or approve; use strict evm-nft for mint action":"envelope: generic evm requires transfer, approve, delegate, or identity");if(u==="swap"||u==="bridge")throw new Error("envelope: surface/action mismatch; use strict decoded surface");if(Number(l.type)===4&&u!=="delegate")throw new Error("envelope: type-4 requires delegate");if(String(l.to).toLowerCase()!==String(e.destination).toLowerCase())throw new Error("envelope: destination mismatch");if(String(l.from).toLowerCase()!==String(e.owner).toLowerCase())throw new Error("envelope: artifact from mismatch with owner");Be({...l,slippageBps:e.slippageBps,expiresAtMs:e.expiresAtMs},t,{nowMs:r,networkFees:i,requireNetworkFees:s});let p=String(l.data||"0x").toLowerCase(),w=x(l.value,"EVM value");if(u==="delegate"){if(Number(l.type)!==4)throw new Error("envelope: delegate requires type-4");if(p!=="0x")throw new Error("envelope: 7702 delegate calldata must be empty");if(w!==0n)throw new Error("envelope: 7702 delegate cannot transfer native value")}else if(u==="identity"){if(w!==0n)throw new Error("envelope: ERC-8004 identity cannot transfer native value");let h=p.slice(0,10);if(h!=="0xf2c298be"&&h!=="0x0af28bd3")throw new Error("envelope: ERC-8004 selector not allowed")}else if(p==="0x"){if(w===0n)throw new Error("envelope: native EVM transfer value required")}else if(C(p)){if(w!==0n)throw new Error("envelope: EVM approval cannot transfer native value")}else throw new Error("envelope: unsupported generic EVM calldata")}else d==="btc"?Tt(e,t):d==="sol"?Bt(e,t):d==="hl"?$e(e,t):d==="poly"?Ce(e,t):d==="lighter"?Re(e,t):d==="evm-order"&&ir(e,t);let m=Number(e.fee?.oracleFeeBps)===0&&ot[u]!==0;if(e.fee?.waiver||m&&!e.fee?.waiverAttestation)throw new Error("fee: verified waiver attestation required");if(m&&(typeof n!="function"||n(e.fee.waiverAttestation,e)!==!0))throw new Error("fee: waiver attestation invalid");let f=yr(u,{localsWaiver:m});if(Number(e.fee?.oracleFeeBps)!==f)throw new Error("fee: final artifact fee mismatch");return!0}var Me=Object.freeze([...dr]),oi=Object.freeze({...fr});function ii(e={}){let t={};for(let r of Me){let n=e[r];if(n){if(typeof n.simulate!="function"||typeof n.sign!="function"||typeof n.broadcast!="function")throw new Error(`adapter: ${r} requires simulate, sign, and broadcast functions`);t[r]=Object.freeze({simulate:(o,i)=>n.simulate(structuredClone(o),structuredClone(i)),sign:(o,i)=>n.sign(structuredClone(o),structuredClone(i)),broadcast:(o,i,s)=>n.broadcast(o,structuredClone(i),structuredClone(s))})}}return Object.freeze(t)}function ai(e,t){let r=e?.surface||"evm",n=t?.[r];if(!n)throw new Error(`adapter: ${r} is not configured on this self-host`);return n}import{ed25519 as au}from"@noble/curves/ed25519.js";import{base58 as si}from"@scure/base";import{RawTx as uu,SigHash as lu,Transaction as ci}from"@scure/btc-signer";import{Transaction as ui,keccak256 as it,verifyTypedData as fu}from"ethers";import{encode as Vc}from"@msgpack/msgpack";import{keccak256 as Yc,verifyTypedData as Xc}from"ethers";var Zc=Object.freeze({name:"Exchange",version:"1",chainId:1337,verifyingContract:"0x0000000000000000000000000000000000000000"}),Qc=Object.freeze({Agent:[{name:"source",type:"string"},{name:"connectionId",type:"bytes32"}]});var br=e=>{if(typeof e!="string"||e.length===0||e.length>262144||!/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/.test(e))return null;let t=Buffer.from(e,"base64");return t.toString("base64")===e?t:null};function li(e){let t=0,r=0,n=0;for(;n<e.length&&n<3;){let o=e[n++];if(t|=(o&127)<<r,(o&128)===0)return{value:t,offset:n};r+=7}return null}function Er(e,t){try{if(e==="evm-order")return it(t);if(String(e).startsWith("evm"))return ui.from(t).hash;if(e==="btc"){let r=br(t);if(!r)return null;let n=ci.fromPSBT(r);return n.finalize(),n.extract(),n.id}if(e==="sol"){let r=br(t);if(!r)return null;let n=li(r);if(!n||n.value!==1)return null;let o=r.subarray(n.offset,n.offset+64);return o.length===64?si.encode(o):null}if(e==="hl"&&typeof t=="string"&&t.startsWith("0x"))return it(t);if(e==="poly"&&typeof t=="string"&&t.startsWith("0x"))return it(t)}catch{}return null}var mi=e=>String(e||"").toLowerCase();function U(e){return di("sha256").update(JSON.stringify(e)).digest("hex")}function ve(e,t,r={}){return Be(e,t,r)}async function wi(e,t={}){if(!Q(e?.chainId))return{l1FeeWei:"0",operatorFeeWei:"0"};if(typeof t.estimateNetworkFees!="function")throw new Error("policy: rollup fee estimate required");let r=await t.estimateNetworkFees(e);if(!r||r.l1FeeWei===void 0||r.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");return{l1FeeWei:String(r.l1FeeWei),operatorFeeWei:String(r.operatorFeeWei)}}function Ar(e,t,r=!1){if(!Q(e?.chainId))return!0;if(e.l1FeeWei===void 0||e.operatorFeeWei===void 0)throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei");if(r||t!=null){if(!t||t.l1FeeWei===void 0||t.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");let n=BigInt(e.l1FeeWei)+BigInt(e.operatorFeeWei),o=BigInt(t.l1FeeWei)+BigInt(t.operatorFeeWei);if(n<o)throw new Error("policy: rollup fee attestation understates estimate")}return!0}function hi(e,t={}){return Jt(e,U(e),t)}function Sr(e){if(e==null)return null;let t={tenantId:String(e.tenantId||"").trim(),runId:String(e.runId||"").trim(),handoffHash:String(e.handoffHash||""),idempotencyKey:String(e.idempotencyKey||""),legIndex:e.legIndex,legCount:e.legCount};if(!t.tenantId||!t.runId||!/^[0-9a-f]{64}$/.test(t.handoffHash)||!/^sha256:[0-9a-f]{64}$/.test(t.idempotencyKey)||!Number.isSafeInteger(t.legIndex)||t.legIndex<0||!Number.isSafeInteger(t.legCount)||t.legCount<1||t.legIndex>=t.legCount)throw new Error("confirmation: binding is invalid");return t}var Se=class{#e=new Map;constructor({now:t=Date.now}={}){this.now=t}issue({artifact:t,owner:r,ttlMs:n=6e4,binding:o}){if(!Number.isFinite(n)||!Number.isInteger(n)||n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let i=fi(32).toString("hex");return this.#e.set(i,{digest:U(t),owner:mi(r),expiresAtMs:this.now()+n,binding:Sr(o)}),i}consume(t,r,n){let o=this.#e.get(String(t));if(!o)throw new Error("confirmation: used or unknown nonce");if(o.expiresAtMs<=this.now())throw this.#e.delete(String(t)),new Error("confirmation: expired nonce");let i=Buffer.from(o.digest,"hex"),s=Buffer.from(U(r),"hex");if(!pi(i,s))throw new Error("confirmation: artifact mismatch");if(JSON.stringify(o.binding)!==JSON.stringify(Sr(n)))throw new Error("confirmation: execution binding mismatch");return this.#e.delete(String(t)),o}clear(){this.#e.clear()}};function gi(e){let t=String(e?.data||"0x").toLowerCase(),r=BigInt(e?.value??0);if(t==="0x"){if(r<=0n)throw new Error("signer: native EVM transfer value required");return!0}if(C(t)){if(r!==0n)throw new Error("signer: EVM approval cannot transfer native value");return!0}throw new Error("signer: unsupported EVM calldata; use a versioned envelope")}function yi(e={},t={}){let r={};for(let n of new Set([...Object.keys(e||{}),...Object.keys(t||{})]))r[n]=(BigInt(t?.[n]??0)-BigInt(e?.[n]??0)).toString();return r}function bi(e){return e==="evm"||e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function De(e,t){let r=String(t||"");if(e==="evm-order"||String(e).startsWith("evm"))return/^0x[0-9a-fA-F]{64}$/.test(r);if(e==="btc")return/^[0-9a-fA-F]{64}$/.test(r);if(e==="sol")try{let n=xr.decode(r);return n.length===64&&xr.encode(n)===r}catch{return!1}return e==="hl"?/^0x[0-9a-fA-F]{64}$/.test(r):e==="poly"?/^0x[0-9a-fA-F]{64}$/.test(r):!1}function vr(e,t,r){return!De(e,t)||!De(e,r)?!1:e==="sol"?String(t)===String(r):String(t).toLowerCase()===String(r).toLowerCase()}function Ei(e){let t=e?.confirmationMode;if(t!=="exact-human"&&t!=="auto-within-rails")throw new Error("signer: confirmationMode must be exact-human or auto-within-rails");return t}async function at({artifact:e,envelope:t,nonce:r,deps:n,policy:o,confirmation:i,consumeNonce:s,nowMs:d}){let u=Ei(o);if(n.autonomous===!0){if(n.env?.ORACLE_AUTONOMOUS_TRADING!=="1")throw new Error("signer: autonomous execution requires ORACLE_AUTONOMOUS_TRADING=1");if(u!=="auto-within-rails")throw new Error("signer: autonomous execution requires auto-within-rails policy");if(typeof n.verifyTriggerAttestation!="function"||await n.verifyTriggerAttestation(t?.triggerAttestation,e,d())!==!0)throw new Error("signer: autonomous trigger attestation required");return i}if(u!=="exact-human")throw new Error("signer: non-autonomous execution requires exact-human exact confirmation policy");if(!n.confirmations)throw new Error("signer: exact-human confirmation store required");if(s)return n.confirmations.consume(r,e,n.confirmationBinding);if(!i||!Number.isFinite(i.expiresAtMs)||i.expiresAtMs<=d())throw new Error("confirmation: expired nonce");return i}function xi(e){return e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function Ai(e,t){return e&&xi(e.surface)?Ae(e):[t]}function Si(e,t){let r=e?.hash??null,n=e?.transactionHash??null;if(r!=null&&n!=null&&!vr(t,r,n))throw new Error("signer: receipt reports conflicting transaction hashes");return r||n||null}function vi(e,t){let r=e?.verifiedBefore??e?.before,n=e?.verifiedAfter??e?.after;return{transactionHash:t,status:e?.status,balanceDeltaVerified:!!(e?.verifiedBefore&&e?.verifiedAfter),delta:yi(r,n)}}function Ti(e){return Number.isSafeInteger(e)&&e>0?"commit":"settle-failed"}async function qe(e,t,r){if(!r.isArmed())throw new Error("signer: disarmed");let n=typeof r.armGeneration=="function",o=typeof r.broadcastWithArmFence=="function";if(n!==o)throw new Error("signer: arm generation and broadcast fence must be configured together");let i=n?r.armGeneration():null,s=e?.version===1&&e?.surface?e:null,d=s?s.artifact:(()=>{let{tradeId:g,...E}=e||{};return E})(),u=Ai(s,d),a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,c=()=>typeof r.nowMs=="function"?r.nowMs():r.nowMs??Date.now(),l=await at({artifact:e,envelope:s,nonce:t,deps:r,policy:a,confirmation:null,consumeNonce:!0,nowMs:c}),m=U(e),f=(g={})=>{s?le(s,a,g):(ve(d,a,{nowMs:g.nowMs,networkFees:g.networkFees,requireNetworkFees:g.requireNetworkFees}),gi(d))},p=async g=>{let E=!s||bi(s.surface),v=E?await wi(g,r):void 0;return{nowMs:c(),verifyFeeWaiver:r.verifyFeeWaiver,routeAttestationSecret:r.routeAttestationSecret,networkFees:v,requireNetworkFees:E&&Q(g?.chainId)}};f({nowMs:c(),verifyFeeWaiver:r.verifyFeeWaiver,routeAttestationSecret:r.routeAttestationSecret});for(let g of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof r[g]!="function")throw new Error(`signer: ${g} is required`);let w=r.reserveLedger(s||e,a);if(!w)throw new Error("signer: ledger reservation required");let h=!1,b=[];try{for(let[g,E]of u.entries()){if(typeof r.simulate!="function"||await r.simulate(E,s)!==!0)throw new Error("signer: strict affirmative simulation required");let v=await p(E);if((v.requireNetworkFees||v.networkFees!=null)&&Ar(E,v.networkFees,v.requireNetworkFees),!r.isArmed())throw new Error("signer: disarmed before signing");a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,l=await at({artifact:e,envelope:s,nonce:t,deps:r,policy:a,confirmation:l,consumeNonce:!1,nowMs:c}),f(v),r.validateReservation(w,a,s&&typeof r.decodeEconomics=="function"?r.decodeEconomics(s,a):void 0),h=!0;let P=await r.sign(E,s);if(typeof r.verifySigned!="function"||await r.verifySigned(P,E,s)!==!0)throw new Error("signer: signed bytes do not match confirmed artifact");let S=s?.surface||"evm",ee=Er(S,P);if(r.executionAttempt&&await r.executionAttempt.recordSigned({txIndex:g,txCount:u.length,surface:S,signedTransactionId:ee}),!r.isArmed())throw new Error("signer: disarmed before broadcast");if(U(e)!==m)throw new Error("signer: artifact mutated after signing");a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,l=await at({artifact:e,envelope:s,nonce:t,deps:r,policy:a,confirmation:l,consumeNonce:!1,nowMs:c});let _=await p(E);(_.requireNetworkFees||_.networkFees!=null)&&Ar(E,_.networkFees,_.requireNetworkFees),f(_),r.validateReservation(w,a,s&&typeof r.decodeEconomics=="function"?r.decodeEconomics(s,a):void 0),r.executionAttempt&&await r.executionAttempt.recordBroadcastAuthorized({txIndex:g});let Y=()=>r.broadcast(P,E,s),X=o?await r.broadcastWithArmFence(i,Y):await Y(),Te=X?.status,Ie=Si(X,S);if(!vr(S,Ie,ee))throw new Error("signer: receipt transaction hash does not match signed bytes");if(Te===0||Te==="0x0")throw De(S,Ie)?(r.executionAttempt&&await r.executionAttempt.recordCanonicalReceipt({txIndex:g,receipt:X}),Ti(b.length)==="commit"?r.commitLedger(w):r.settleFailedLedger(w),new Error("signer: broadcast did not return a successful receipt")):new Error("signer: failed broadcast requires a valid transaction hash");if(Te!==1&&Te!=="0x1")throw new Error("signer: broadcast did not return a successful receipt");if(!De(S,Ie))throw new Error("signer: successful broadcast requires a valid transaction hash");r.executionAttempt&&await r.executionAttempt.recordCanonicalReceipt({txIndex:g,receipt:X}),b.push(vi(X,Ie))}}catch(g){throw h||r.releaseLedger(w),g}if(r.commitLedger(w),b.length===1){let g={receipt:b[0]};return s?.surface==="evm-bridge"&&(g.originStatus="success",g.destinationStatus="unverified",g.destinationSuccess=!1,g.note="Origin-chain receipts do not prove destination-chain settlement."),g}let A={receipts:b,status:"success"};return s?.surface==="evm-bridge"&&(A.originStatus="success",A.destinationStatus="unverified",A.destinationSuccess=!1,A.note="Origin-chain receipts do not prove destination-chain settlement."),A}import Ii from"node:http";import{timingSafeEqual as ki}from"node:crypto";var Tr=new Set(["127.0.0.1","::1","localhost"]),Oi=(e,t)=>{let r=Buffer.from(String(e)),n=Buffer.from(String(t));return r.length===n.length&&ki(r,n)},y=(e,t,r)=>{let n=JSON.stringify(r);e.writeHead(t,{"content-type":"application/json","cache-control":"no-store","content-length":Buffer.byteLength(n)}),e.end(n)};function Ni(e){let t=String(e||"");if(t.startsWith("[")){let r=t.indexOf("]");if(r>1)return t.slice(1,r)}return t.split(":")[0]}var de=e=>new Promise((t,r)=>{let n=0,o=[],i=!1;e.on("data",s=>{n+=s.length,n>64*1024&&!i?(i=!0,r(new Error("request refused")),e.resume()):i||o.push(s)}),e.on("end",()=>{if(!i)try{t(JSON.parse(Buffer.concat(o).toString()||"{}"))}catch{r(new Error("request refused"))}}),e.on("error",r)}),Ir=e=>e?.idempotencyKey===void 0?void 0:{tenantId:e.tenantId,runId:e.runId,handoffHash:e.handoffHash,idempotencyKey:e.idempotencyKey,legIndex:e.legIndex,legCount:e.legCount},Pi=e=>e==="btc"||e==="sol"||["evm","evm-swap","evm-bridge","evm-nft"].includes(e);function Li(e={}){let t=e.host||"127.0.0.1";if(!Tr.has(t))throw new Error("signer: loopback bind required");if(String(e.token||"").length<32)throw new Error("signer: strong auth token required");for(let a of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof e[a]!="function")throw new Error(`signer: ${a} is required`);if(typeof e.disarm!="function")throw new Error("signer: disarm callback is required");let r=e.confirmations||new Se,n=e.pending||new Map,o=(a,c)=>{try{e.ledgerObserver?.[a]?.(c)}catch{}};function i(a){let c=a.artifact?.version===1&&a.artifact?.surface?a.artifact:null,l=c?.artifact||a.artifact||{};return{id:a.digest.slice(0,8),digest:a.digest,surface:c?.surface||"evm",action:c?.action||"evm",chain:l.chainId??l.network??null,to:l.to||c?.destination||null,value:l.value??l.message?.sellAmount??l.message?.makingAmount??null,receiver:l.message?.receiver||l.typedData?.message?.receiver||null,maker:l.message?.maker||l.typedData?.message?.maker||null,makingAmount:l.message?.makingAmount||l.typedData?.message?.makingAmount||null,takingAmount:l.message?.takingAmount||l.typedData?.message?.takingAmount||null,sellAmount:l.message?.sellAmount||l.typedData?.message?.sellAmount||null,buyAmount:l.message?.buyAmount||l.typedData?.message?.buyAmount||null,kind:l.kind||null,type:l.type??null,authorizationList:l.authorizationList||null,feeAmount:l.message?.feeAmount||l.typedData?.message?.feeAmount||null,createdAtMs:a.createdAtMs}}function s(a){let c=String(a||"").trim().toLowerCase().replace(/^0x/,"");return c?[...n.values()].filter(l=>l.digest.toLowerCase().startsWith(c)||l.digest.slice(0,8)===c):[...n.values()]}let d=e.origin||`http://${t}`;return Ii.createServer(async(a,c)=>{try{let l=String(a.headers.authorization||"").replace(/^Bearer /i,"");if(!Oi(l,e.token))return y(c,401,{error:"unauthorized"});let m=Ni(a.headers.host);if(!Tr.has(m))return y(c,403,{error:"host refused"});if(a.headers.origin&&a.headers.origin!==d)return y(c,403,{error:"origin refused"});if(a.method==="GET"&&a.url==="/status"){let f=typeof e.readPolicy=="function"?e.readPolicy():e.policy,p=new Set(Me),w=Array.isArray(f?.surfaces)?f.surfaces.filter(h=>typeof h=="string"&&p.has(h)):[];return y(c,200,{ok:!0,service:"oracle-signer",armed:e.isArmed?.()===!0,surfaces:w,sessionExpiresAtMs:e.sessionExpiresAtMs||null})}if(a.method==="POST"&&a.url==="/disarm")return await e.disarm(),r.clear(),n.clear(),y(c,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(a.method))return y(c,405,{error:"request refused"});if(a.method==="POST"&&String(a.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return y(c,415,{error:"request refused"});if(a.method==="GET"&&a.url==="/pending"){let f=[...n.values()].map(i);return y(c,200,{ok:!0,armed:e.isArmed?.()===!0,count:f.length,items:f})}if(a.method==="GET"&&String(a.url||"").startsWith("/execute/status?")){if(!e.executionOutbox)return y(c,503,{error:"execution outbox unavailable"});let f=new URL(String(a.url),d).searchParams.get("attemptKey"),p=await e.executionOutbox.inspect(f);return p?y(c,200,{ok:!0,attempt:p}):y(c,404,{error:"execution attempt not found"})}if(a.method==="POST"&&a.url==="/pending"){if(e.autonomous===!0)return y(c,403,{error:"autonomous signer does not queue human approvals"});let p=(await de(a)).artifact;if(!p||typeof p!="object")return y(c,400,{error:"artifact required"});let w=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(w?.confirmationMode!=="exact-human")return y(c,403,{error:"exact-human policy required"});let h=typeof e.nowMs=="function"?e.nowMs():Date.now();if(p?.surface==="cex"){if(typeof e.inspectCex!="function")return y(c,403,{error:"cex execution unavailable"});e.inspectCex(p,w,h)}else if(p?.version===1&&p?.surface)le(p,w,{nowMs:h,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:g,...E}=p||{};ve(E,w,{nowMs:h})}let b=U(p),A=p?.surface==="cex"?Object.freeze(structuredClone(p)):p;return n.set(b,{artifact:A,digest:b,createdAtMs:h}),o("queued",{digest:b,createdAtMs:h}),y(c,200,{ok:!0,...i(n.get(b))})}if(a.method==="POST"&&a.url==="/ack"){if(e.autonomous===!0)return y(c,403,{error:"autonomous signer does not accept messaging acks"});let f=await de(a),p=s(f.digest||f.id);if(p.length===0)return y(c,404,{error:"no pending artifact"});if(p.length>1)return y(c,409,{error:"ambiguous digest; pass more hex"});let w=p[0];if((typeof e.readPolicy=="function"?e.readPolicy():e.policy)?.confirmationMode!=="exact-human")return y(c,403,{error:"exact-human policy required"});if(e.isArmed?.()!==!0)return y(c,403,{error:"signer is disarmed"});let b=e.verifyOwnerProof||e.verifyCexOwnerProof;if(typeof b!="function"||b(f.ownerProof,{digest:w.digest})!==!0)return y(c,403,{error:"exact owner Allow proof required"});if(w.artifact?.surface==="cex"){if(typeof e.cexExecute!="function")return y(c,403,{error:"cex execution unavailable"});n.delete(w.digest),o("approved",{digest:w.digest});let E;try{E=await e.cexExecute(w.artifact)}catch(v){throw o("failed",{digest:w.digest,reason:String(v?.message||v)}),v}return o("executed",{digest:w.digest,owner:w.artifact?.owner??w.artifact?.from,result:E}),y(c,200,{ok:!0,executed:!0,digest:w.digest,id:w.digest.slice(0,8),result:E})}n.delete(w.digest);let A=r.issue({artifact:w.artifact,owner:w.artifact?.owner??w.artifact?.from,ttlMs:f.ttlMs});o("approved",{digest:w.digest});let g;try{g=await qe(w.artifact,A,{...e,confirmations:r})}catch(E){throw o("failed",{digest:w.digest,reason:String(E?.message||E)}),E}return o("executed",{digest:w.digest,owner:w.artifact?.owner??w.artifact?.from,result:g}),y(c,200,{ok:!0,executed:!0,confirmationNonce:A,digest:w.digest,id:w.digest.slice(0,8),result:g})}if(a.method==="POST"&&a.url==="/deny"){let f=await de(a),p=s(f.digest||f.id);return p.length===0?y(c,404,{error:"no pending artifact"}):p.length>1?y(c,409,{error:"ambiguous digest; pass more hex"}):(n.delete(p[0].digest),o("denied",{digest:p[0].digest}),y(c,200,{ok:!0,denied:!0,id:p[0].digest.slice(0,8)}))}if(a.method==="POST"&&a.url==="/confirm"){if(e.autonomous===!0)return y(c,403,{error:"autonomous signer does not issue human confirmation nonces"});let f=await de(a);if(f.artifact?.surface==="cex")return y(c,403,{error:"cex requires pending owner ack"});let p=U(f.artifact),w=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(w?.confirmationMode!=="exact-human")return y(c,403,{error:"exact-human policy required"});let h=typeof e.nowMs=="function"?e.nowMs():Date.now();if(f.artifact?.version===1&&f.artifact?.surface)le(f.artifact,w,{nowMs:h,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:b,...A}=f.artifact||{};ve(A,w,{nowMs:h})}return typeof e.confirmArtifact!="function"?y(c,403,{error:"local human confirmation unavailable"}):await e.confirmArtifact(f.artifact,p,w)!==!0?y(c,400,{error:"exact human confirmation refused"}):y(c,200,{confirmationNonce:r.issue({artifact:f.artifact,owner:f.artifact?.owner??f.artifact?.from,ttlMs:f.ttlMs,binding:Ir(f)})})}if(a.method==="POST"&&a.url==="/execute/reconcile"){let f=await de(a);if(!e.executionOutbox||typeof e.observeExecutionTransaction!="function")return y(c,503,{error:"execution reconciliation unavailable"});let p=await e.executionOutbox.reconcile({attemptKey:f.attemptKey,observeTransaction:e.observeExecutionTransaction,commitLedger:e.commitLedger,settleFailedLedger:e.settleFailedLedger});return y(c,200,{ok:!0,attempt:p})}if(a.method==="POST"&&a.url==="/execute"){let f=await de(a);if(f.artifact?.surface==="cex")return y(c,403,{error:"cex requires pending owner ack"});let p=typeof e.executeArtifact=="function"?e.executeArtifact:qe;if(f.idempotencyKey!==void 0){if(!Pi(f.artifact?.surface))return y(c,422,{error:"surface does not support durable Team execution reconciliation"});if(!e.executionOutbox)return y(c,503,{error:"execution outbox required for idempotent execution"});let h=await e.executionOutbox.begin({attemptKey:f.idempotencyKey,artifact:f.artifact,tenantId:f.tenantId,runId:f.runId,handoffHash:f.handoffHash,legIndex:f.legIndex,legCount:f.legCount});if(h.state==="recovery-required")return y(c,409,{error:"execution recovery-required; automatic replay refused",transactions:h.transactions||[]});if(h.state==="failed")return y(c,409,{error:"execution has a canonical failed receipt",receipts:h.receipts||[]});if(h.state==="completed")return n.delete(U(f.artifact)),y(c,200,h.result);let b=await e.executionOutbox.acquireExecutor({attemptKey:f.idempotencyKey}),A={recordSigned:g=>e.executionOutbox.recordSigned({attemptKey:f.idempotencyKey,leaseId:b,...g}),recordBroadcastAuthorized:g=>e.executionOutbox.recordBroadcastAuthorized({attemptKey:f.idempotencyKey,leaseId:b,...g}),recordCanonicalReceipt:g=>e.executionOutbox.recordCanonicalReceipt({attemptKey:f.idempotencyKey,leaseId:b,...g})};try{let g={...e,confirmations:r,confirmationBinding:Ir(f),executionAttempt:A,reserveLedger:(v,P)=>e.reserveLedger(v,P,{retryReleasedTradeId:h.retryReleasedTradeId})},E=await p(f.artifact,f.confirmationNonce,g);return await e.executionOutbox.complete({attemptKey:f.idempotencyKey,leaseId:b,result:E}),n.delete(U(f.artifact)),y(c,200,E)}catch(g){throw await e.executionOutbox.failPreSubmission({attemptKey:f.idempotencyKey,leaseId:b,error:g}),g}finally{await e.executionOutbox.releaseExecutor({attemptKey:f.idempotencyKey,leaseId:b})}}let w=await p(f.artifact,f.confirmationNonce,{...e,confirmations:r});return n.delete(U(f.artifact)),y(c,200,w)}return y(c,404,{error:"not found"})}catch(l){e.onError?.(String(l?.message||l));let m=String(a.url||"");return m==="/pending"||m==="/ack"||m==="/deny"?y(c,400,{error:String(l?.message||"request refused").slice(0,300)}):y(c,400,{error:"request refused"})}})}import{createHmac as Ci}from"node:crypto";import{HDNodeWallet as Ri,Mnemonic as _i,Wallet as Pr}from"ethers";function $i(e){return BigInt(e).toString(16).padStart(64,"0")}function kr(e){return e.slice(2).padStart(64,"0")}function Or(e,t,r){return`0x42842e0e${kr(e)}${kr(t)}${$i(r)}`}var Bi=/^(?:[a-z]+ ){11}[a-z]+$|^(?:[a-z]+ ){23}[a-z]+$/,Fi=/^(?:0x)?[0-9a-fA-F]{64}$/;function Mi(e){let t=String(e||"").trim().toLowerCase().replace(/\s+/g," ");if(!Bi.test(t))return null;try{if(!_i.isValidMnemonic(t))return null}catch{return null}return t}function Di(e){let t=String(e||"").trim();return Fi.test(t)?t.startsWith("0x")?t:`0x${t}`:null}function qi(e,t){let r=Buffer.from(e.replace(/^0x/i,""),"hex");return`0x${Ci("sha256",r).update(`oracle-mint-fanout:v1:${t}`).digest("hex")}`}function st(e,t,r,n){return{index:e,address:String(t).toLowerCase(),path:r,kind:n}}function ji(e,{childCount:t}={}){let r=Number(t);if(!Number.isInteger(r)||r<1)throw new Error("hd-fanout: childCount must be a positive integer");if(r>32)throw new Error(`hd-fanout: childCount exceeds hard max ${32}`);let n=Mi(e);if(n){let i=[];for(let s=0;s<=r;s++){let d=`m/44'/60'/0'/0/${s}`,u=Ri.fromPhrase(n,"",d);i.push(st(s,u.address,d,"bip44"))}return{kind:"bip44",main:i[0],children:i.slice(1)}}let o=Di(e);if(o){let i=new Pr(o),s=[];for(let d=1;d<=r;d++){let u=new Pr(qi(o,d));s.push(st(d,u.address,`hmac:v1:${d}`,"hmac"))}return{kind:"hmac",main:st(0,i.address,"vault-key","hmac"),children:s}}throw new Error("hd-fanout: secret must be a BIP-39 mnemonic or a 32-byte hex key")}function Ui(e,t){let r=String(t||"").toLowerCase();if(!/^0x[0-9a-f]{40}$/.test(r))throw new Error("hd-fanout: vault address required");if(e.main.address!==r)throw new Error(`hd-fanout: derived main ${e.main.address} does not match vault ${r} (BIP-44 index 0 must be the vault wallet, or use the raw-key HMAC path)`)}function Wi(e,{nonce:t,value:r}){let n={type:2,chainId:e.chainId,to:e.to,data:e.data&&e.data!=="0x"?e.data:"0x",value:BigInt(r??e.value??0),gasLimit:BigInt(e.gasLimit),maxFeePerGas:BigInt(e.maxFeePerGas),maxPriorityFeePerGas:BigInt(e.maxPriorityFeePerGas||0)};return t!=null&&(n.nonce=Number(t)),n}async function Hi(e,t){if(e.valueMode!=="remainder")return e.value;if(typeof t!="function")throw new Error("mint-fanout: getBalance required for remainder sweep");let r=BigInt(await t(e.from)),n=BigInt(e.gasLimit)*BigInt(e.maxFeePerGas);return(r>n?r-n:0n).toString()}function Gi(e,t){if(e.kind!=="sweep-nft"||!e.needsTokenId)return e;if(t==null||String(t).length===0)throw new Error(`mint-fanout: hop ${e.step} needs tokenId after mint`);return{...e,needsTokenId:!1,tokenId:String(t),data:Or(e.from,e.nftTo,BigInt(t))}}async function zi(e,{byAddress:t,getNonce:r,getBalance:n,tokenIdsByChildIndex:o={}}={}){if(!e||e.signed)throw new Error("mint-fanout: unsigned plan required");if(!(t instanceof Map))throw new Error("mint-fanout: wallet map required");let i=[],s=new Map;for(let d of e.hops){let u=Gi(d,o[d.walletIndex]),a=String(u.from).toLowerCase(),c=t.get(a);if(!c)throw new Error(`mint-fanout: no local key for ${a}`);let l=await Hi(u,n),m=u.nonce;if(m==null){if(typeof r!="function")throw new Error("mint-fanout: getNonce required when hops omit nonce");s.has(a)||s.set(a,Number(await r(a))),m=s.get(a),s.set(a,m+1)}let f=Wi(u,{nonce:m,value:l}),p=await c.signTransaction(f);i.push({step:u.step,kind:u.kind,walletIndex:u.walletIndex,from:u.from,to:u.to,chainId:u.chainId,value:String(l),nonce:m,delayMsAfter:u.delayMsAfter||0,signedRaw:p})}return{execution:"signed-local",signed:!0,main:e.main,chainId:e.chainId,contract:e.contract,hopCount:i.length,hops:i}}async function Ji(e,{broadcastFn:t,sleepFn:r=n=>new Promise(o=>setTimeout(o,n))}={}){if(!e?.signed)throw new Error("mint-fanout: signed plan required");if(typeof t!="function")throw new Error("mint-fanout: broadcastFn required");let n=[];for(let o of e.hops){let i=await t(o.signedRaw,o);if(!i?.hash)throw new Error(`mint-fanout: hop ${o.step} broadcast returned no hash`);n.push({step:o.step,kind:o.kind,from:o.from,hash:i.hash}),o.delayMsAfter>0&&await r(o.delayMsAfter)}return{ok:!0,receipts:n}}export{Se as ConfirmationStore,Me as PUBLIC_SIGNER_SURFACES,oi as REVIEWED_EVM_SELECTORS,U as artifactDigest,ve as assertExactPolicy,Ui as assertMainMatchesVault,Ji as broadcastMintFanout,Li as createSignerServer,ii as createSurfaceAdapters,ji as deriveFanoutAccounts,Ae as evmTransactions,qe as executeConfirmedArtifact,hi as inspectArtifactForConfirmation,hr as inspectEvmBatch,gr as inspectEvmNft,yr as publicFeeBps,zi as signMintFanoutPlan,ai as surfaceAdapterFor,le as validateSurfaceEnvelope};