@oracle-agent/oracle 0.24.9 → 0.24.10

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.
@@ -1 +1,3 @@
1
- import{createHash as Xr,randomBytes as Zr,timingSafeEqual as Qr}from"node:crypto";import{base58 as _e}from"@scure/base";import{Interface as er,MaxUint256 as rr,isAddress as tr,keccak256 as Xt,toUtf8Bytes as Zt}from"ethers";import{Interface as Qe,isAddress as Lt}from"ethers";import{isAddress as Tt}from"ethers";import{createHash as De,createHmac as je,timingSafeEqual as Ge}from"node:crypto";import{readFileSync as Pe}from"node:fs";import{homedir as We}from"node:os";import{join as U}from"node:path";function Ve(){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=We();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let t=(process.env.ORACLE_CONFIG_DIR||U(r,".config","oracle")).trim();return[e,U(t,"exec.env")].filter(Boolean)}return[e,U(r,".config","oracle","exec.env"),U(r,".config","mad-desk","exec.env")].filter(Boolean)}function _(e,r,t){let n=e??process.env[r]??process.env[t];if(!String(n||"").trim())for(let i of Ve())try{let o=Pe(i,"utf8"),a=o.match(new RegExp(`^${r}=(.*)$`,"m"))||o.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 L(e,r,t="guard"){let n=Number(r);if(r==null||!Number.isFinite(n))throw new Error(`${t}: current time must be a finite number (got ${Ue(r)})`);let i=Number(e?.issuedAtMs),o=Number(e?.expiresAtMs);if(!Number.isFinite(o))throw new Error(`${t}: expiresAtMs is required and must be a finite number`);if(n>o)throw new Error(`${t} expired at ${o}, now ${n}`);if(e?.issuedAtMs!=null){if(!Number.isFinite(i))throw new Error(`${t}: issuedAtMs must be a finite number when present`);if(o<=i)throw new Error(`${t}: expiry must be after issuance`)}return{now:n,issuedAtMs:i,expiresAtMs:o}}function Ue(e){return e===null?"null":e===void 0?"undefined":typeof e=="number"?String(e):`${typeof e} ${JSON.stringify(String(e)).slice(0,24)}`}var se=100;function Q(e){return Array.isArray(e)?`[${e.map(Q).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${Q(e[r])}`).join(",")}}`:JSON.stringify(e??null)}function He(e,{required:r=!1}={}){try{return _(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(t){if(r)throw t;return null}}function ze(e){let{signature:r,...t}=e;return t}function Je(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 De("sha256").update(Buffer.from(r.slice(2),"hex")).digest("hex")}function Ke(e,r){let t=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(r??""),"utf8");return t.length!==n.length||t.length===0?!1:Ge(t,n)}function Xe(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 o=10;o+64<=r.length;o+=64)n.push(r.slice(o,o+64));let i=o=>n[o]==null?null:BigInt("0x"+n[o]);switch(t){case"0x414bf389":return i(6);case"0x04e45aaf":return i(5);case"0xc04b8d59":{let o=i(0);if(o==null)return null;let a=Number(o)/32;return!Number.isInteger(a)||a<0?null:i(a+4)}case"0xb858183f":{let o=i(0);if(o==null)return null;let a=Number(o)/32;return!Number.isInteger(a)||a<0?null:i(a+3)}case"0xa026383e":return i(6);case"0x38ed1739":case"0x5c11d795":return i(1);case"0x7ff36ab5":case"0xb6f9de95":return i(0);case"0x18cbafe5":case"0x791ac947":return i(1);default:return null}}function Y(e,{nowMs:r=Date.now(),chainId:t,venue:n,secret:i,tx:o,requireSigned:a=!1}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");let u=He(i,{required:a});if(a&&!u)throw new Error("auto-slippage attestation secret required for signing or broadcast");if(u){let d=je("sha256",u).update(Q(ze(e))).digest("hex");if(!Ke(e.signature,d))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 f=Number(e.selectedBps),s=Number(e.capBps);if(!Number.isInteger(f)||f<0||f>se)throw new Error("auto-slippage selected tolerance exceeds hard 100 bps cap");if(!Number.isInteger(s)||s<0||s>se||f>s)throw new Error("auto-slippage cap exceeds hard 100 bps cap");try{L({expiresAtMs:e.expiresAtMs,issuedAtMs:e.quotedAtMs},r,"auto-slippage quote")}catch(d){throw new Error(`${d.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 m=BigInt(e.quoteAmountOut??0),l=BigInt(e.minAmountOut??0);if(m<=0n||l<=0n)throw new Error("auto-slippage guard amounts must be positive");let p=m*BigInt(1e4-f),c=p/10000n;if(p%10000n!==0n&&(c+=1n),l<c)throw new Error("auto-slippage guard is under-protected relative to its fresh quote");if(o?.data&&e.minAmountOut!=null){let d=Xe(o.data);if(e.calldataHash!=null){if(String(e.calldataHash)!==Je(o.data))throw new Error("auto-slippage guard is not bound to this call: calldata hash mismatch");if(d!=null&&d!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is hash-bound but the calldata encodes ${d}, not the guard floor ${e.minAmountOut}`)}else{if(d==null){let h=String(o.data).slice(0,10);throw new Error(`auto-slippage: cannot verify the output floor encoded by selector ${h}; refusing rather than trusting unbound calldata at an allowlisted venue`)}if(d!==BigInt(e.minAmountOut))throw new Error(`auto-slippage guard is not bound to this call: guard minAmountOut ${e.minAmountOut} but calldata encodes ${d}`)}}return!0}var $t=new Qe(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as Ye,isAddress as kt}from"ethers";var Ut=new Ye(["function approve(address spender,uint256 amount) returns (bool)"]),Dt=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});function ce(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=String(e??"").trim();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)}`)}}var nn=new er(["function approve(address spender,uint256 amount) returns (bool)"]);function ue(e,r){let t=String(e||"").trim();if(!tr(t))throw new Error(`${r} must be an address`);return t.toLowerCase()}function nr(e,r="approval amount",{allowZero:t=!1}={}){let n=ce(e,r);if(t?n<0n:n<=0n)throw new Error(`${r} must be positive`);if(n>=rr)throw new Error("unlimited approvals are refused; use an exact bounded amount");return n.toString()}var fe=new Set(["0x095ea7b3","0x39509351","0x61f49ed6","0xeb5625d9","0xf9255c1f","0x87517c45","0xd505accf","0x8fcbaf0c","0x2b67b570","0x2a2d80d1"]),or=new Set(["0x39509351","0xf9255c1f"]);function B(e){let r=String(e||"").toLowerCase();return r.length<10?!1:fe.has(r.slice(0,10))}function de(e){if(!B(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)||[],i=s=>n[s]?"0x"+n[s].slice(24):null,o=s=>n[s]?BigInt("0x"+n[s]):null,a=null,u=null,f=null;switch(t){case"0x095ea7b3":case"0x39509351":a=i(0),u=o(1);break;case"0x61f49ed6":case"0xeb5625d9":case"0xf9255c1f":f=i(0),a=i(1),u=o(2);break;case"0xd505accf":a=i(1),u=o(2);break;case"0x8fcbaf0c":{a=i(1),u=o(4)===0n?0n:(1n<<256n)-1n;break}case"0x87517c45":f=i(0),a=i(1),u=o(2);break;default:throw new Error(`approval selector ${t} is recognised but not decodable; refusing to bound it`)}if(a==null||u==null)throw new Error("invalid approve calldata");return{spender:ue(a,"approval spender"),token:f==null?null:ue(f,"approval token"),amount:nr(u,"approval amount",{allowZero:!0}),selector:t,additive:or.has(t)}}import{createHash as ir,createHmac as ar,timingSafeEqual as sr}from"node:crypto";var cr=2,ee=300*1e3,pe=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function ur(e){let r=e==null||e===""?ee:Number(e);return!Number.isFinite(r)||r<0?ee:Math.min(r,pe)}function re(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(re).join(",")}]`:`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${re(e[t])}`).join(",")}}`}function le(e){let r=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return r.length>=16?r:""}function me(e=process.env){return le(process.env)||le(e)}function fr(e=process.env){return String(process.env.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"||String(e?.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"}function dr(e){let{oraclePrepared:r,prepareHash:t,prepareMac:n,note:i,...o}=e||{};return o}function lr(e){let r=dr(e);return ir("sha256").update(re(r)).digest("hex")}function pr(e,r=me()){return r?ar("sha256",r).update(String(e)).digest("hex"):""}function mr(e,r){try{let t=Buffer.from(String(e),"hex"),n=Buffer.from(String(r),"hex");return t.length===0||t.length!==n.length?!1:sr(t,n)}catch{return!1}}function we(e,{maxAgeMs:r=ee,nowMs:t=Date.now(),providers:n=null,kinds:i=null,label:o="operator",env:a=process.env}={}){if(!e||typeof e!="object")throw new Error(`${o}: prepared envelope object required`);if(e.oraclePrepared!==!0)throw new Error(`${o}: prepared integrity envelope missing \u2014 use an @oracle-agent/oracle prepare result`);if(Number(e.prepareVersion)!==cr)throw new Error(`${o}: unsupported prepareVersion ${e.prepareVersion}`);let u=lr(e);if(String(e.prepareHash||"")!==u)throw new Error(`${o}: prepareHash mismatch \u2014 payload was altered after prepare`);let f=me(a),s=String(e.prepareMac||"");if(fr(a)||s||f){if(!f)throw new Error(`${o}: prepareMac present or ORACLE_STAMP_REQUIRE_MAC=1 but ORACLE_STAMP_HMAC_SECRET missing in signer`);let h=pr(u,f);if(!s||!mr(s,h))throw new Error(`${o}: prepareMac mismatch \u2014 stamp not from trusted preparer`)}let m=Number(e.preparedAt),l=Number(e.expiresAt),p=ur(r),c=t-m,d=l-m;if(!Number.isFinite(c)||!Number.isFinite(l)||!Number.isFinite(d)||c<0||d<=0||d>pe||c>p||t>l)throw new Error(`${o}: prepare envelope expired or clock-skewed (ageMs=${c}, max=${p})`);if(n&&!new Set(n).has(e.provider))throw new Error(`${o}: provider ${e.provider} not allowed here`);if(i&&!new Set(i).has(e.kind))throw new Error(`${o}: kind ${e.kind} not allowed here`);return!0}var D=e=>String(e||"").toLowerCase(),wr=new Set(["chainId","from","to","data","value","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","l1FeeWei","operatorFeeWei","nonce","type","accessList","slippageBps","expiresAtMs"]),hr=new Set([10n,8453n,84532n,42161n,421614n,11155420n,7777777n]);function y(e){try{return hr.has(BigInt(e))}catch{return!1}}var S=(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`)}},he=(e,r)=>{let t=Number(e);if(!Number.isFinite(t))throw new Error(`policy: ${r} must be finite`);return t},M=(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 j(e,r,{nowMs:t=Date.now(),networkFees:n,requireNetworkFees:i=!1}={}){if(!e||!r)throw new Error("policy: artifact and policy required");if(Object.keys(e).some(c=>!wr.has(c)))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].includes(Number(e.type)))throw new Error("policy: unsupported EVM transaction type");let o=(c,d)=>{try{return BigInt(c)===BigInt(d)}catch{return String(c)===String(d)}};if(!Array.isArray(r.chains)||r.chains.length===0)throw new Error("policy: chain allowlist is empty");if(!r.chains.some(c=>o(c,e.chainId)))throw new Error("policy: chain not allowed");if(M(e.to,r.destinations,"destination",D),M(String(e.data||"0x").slice(0,10),r.selectors,"selector",c=>String(c).toLowerCase()),M(e.from,r.owners,"owner",D),B(e.data)){let c;try{c=de(e.data)}catch(h){throw new Error(`policy: malformed approval calldata: ${h?.message||h}`)}M(c.spender,r.spenders,"spender",D),M(c.token||e.to,r.erc20Tokens,"ERC-20 token",D);let d=S(r.maxApproval,"maxApproval");if(BigInt(c.amount)>d)throw new Error("policy: approval exceeds cap");if(c.additive)throw new Error("policy: additive approval cannot be bounded; use approve() with an absolute amount")}if(S(e.value,"value")>S(r.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let a=S(e.gasLimit,"gasLimit");if(a>S(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");let u=e.maxFeePerGas??e.gasPrice,f=S(u,"feePerGas")*a,s=0n;try{if(y(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+=S(e.l1FeeWei,"l1FeeWei")),e.operatorFeeWei!==void 0&&(s+=S(e.operatorFeeWei,"operatorFeeWei")),y(e.chainId)&&(i||n!=null)){if(!n||n.l1FeeWei===void 0||n.operatorFeeWei===void 0)throw new Error("policy: rollup fee estimate required");let c=S(n.l1FeeWei,"estimated l1FeeWei")+S(n.operatorFeeWei,"estimated operatorFeeWei");if(s<c)throw new Error("policy: rollup fee attestation understates estimate")}if(f+s>S(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");let l=he(r.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<=t)throw new Error("policy: artifact expired");let p=he(r.maxTtlMs??12e4,"maxTtlMs");if(p<=0||e.expiresAtMs-t>p)throw new Error("policy: artifact TTL exceeds cap");return!0}import{createHash as ge}from"node:crypto";import{Address as gr,NETWORK as xr,OutScript as xe,RawTx as br,SigHash as be,TEST_NETWORK as Er,Transaction as Sr}from"@scure/btc-signer";var Ee=(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`)}},vr=(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},Ar=e=>Array.isArray(e)||e instanceof Uint8Array?e.length>0:e!=null,yr=e=>/^(bc1|tb1|bcrt1)/i.test(String(e)),F=e=>yr(e)?String(e).toLowerCase():String(e),te=(e,r)=>Array.isArray(r)&&r.some(t=>F(t)===F(e)),Tr=(e,r)=>Buffer.from(e||[]).equals(Buffer.from(r||[]));function Nr(e){let r=Buffer.from(br.encode(e)),t=ge("sha256").update(r).digest();return Buffer.from(ge("sha256").update(t).digest()).reverse().toString("hex")}function Ir(e){if(!e.nonWitnessUtxo)throw new Error("envelope: PSBT input nonWitnessUtxo required");if(Nr(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)||!Tr(e.witnessUtxo.script,r.script))throw new Error("envelope: Bitcoin witness UTXO mismatch");return r}function Br(e,r){if(e.action!=="transfer")throw new Error("envelope: BTC decoder requires transfer action");let t=e?.artifact;if(Object.keys(t).some(l=>!["network","psbt"].includes(l)))throw new Error("envelope: unexpected BTC artifact field");if(!te(t.network,r.chains))throw new Error("policy: chain not allowed");let n=["bitcoin","mainnet"].includes(String(t.network).toLowerCase())?xr:["testnet","signet","regtest"].includes(String(t.network).toLowerCase())?Er:null;if(!n)throw new Error("envelope: unsupported Bitcoin network");let i;try{i=Sr.fromPSBT(vr(t.psbt,"PSBT"))}catch(l){throw new Error(`envelope: invalid PSBT: ${l?.message||l}`)}if(i.inputsLength===0||i.outputsLength===0)throw new Error("envelope: PSBT inputs and outputs required");let o=gr(n);for(let l=0;l<i.inputsLength;l++){let p=i.getInput(l);for(let h of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(Ar(p[h]))throw new Error("envelope: signed or finalized PSBT refused");if(p.sighashType!==void 0&&p.sighashType!==be.DEFAULT&&p.sighashType!==be.ALL)throw new Error("envelope: Bitcoin sighash must bind all inputs and outputs");let c=Ir(p),d;try{let h=xe.decode(c.script);if(!["wpkh"].includes(h.type))throw new Error("unsupported input");d=o.encode(h)}catch{throw new Error("envelope: unsupported Bitcoin input script")}if(!te(d,r.owners)||F(d)!==F(e.owner))throw new Error("envelope: Bitcoin input owner mismatch")}let a=new Set([e.owner,...r.changeAddresses||[]].map(l=>F(l))),u=0n,f=!1,s=[];for(let l=0;l<i.outputsLength;l++){let p=i.getOutput(l),c;try{c=o.encode(xe.decode(p.script))}catch{throw new Error("envelope: unsupported Bitcoin output script")}let d=F(c);if(s.push(`${c}:${p.amount}`),d===F(e.destination)){f=!0,u+=p.amount;continue}if(te(c,r.destinations)){u+=p.amount;continue}if(!a.has(d))throw new Error("policy: Bitcoin output destination not allowed")}if(!f)throw new Error("envelope: Bitcoin destination mismatch");let m;try{m=i.fee}catch{throw new Error("envelope: PSBT fee cannot be decoded")}if(m<0n||m>Ee(r.maxFeeSats,"maxFeeSats"))throw new Error("policy: Bitcoin fee exceeds cap");if(u>Ee(r.maxValueSats,"maxValueSats"))throw new Error("policy: Bitcoin value exceeds cap");return Object.freeze({unit:"sats",value:u.toString(),notional:(u+m).toString(),fee:m.toString(),outputs:Object.freeze(s)})}function Se(e,r){let{unit:t,value:n,notional:i,fee:o}=Br(e,r);return Object.freeze({unit:t,value:n,notional:i,fee:o})}import{getCompiledTransactionMessageDecoder as Fr}from"@solana/transaction-messages";var Or="11111111111111111111111111111111",Lr=5000n,$=(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`)}},Cr=(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},G=(e,r)=>Array.isArray(r)&&r.some(t=>String(t)===String(e));function _r(e,r){if(e.action!=="transfer")throw new Error("envelope: Solana decoder requires transfer action");let t=e?.artifact;if(Object.keys(t).some(d=>!["cluster","messageBase64","exactFeeLamports"].includes(d)))throw new Error("envelope: unexpected Solana artifact field");if(!G(t.cluster,r.chains))throw new Error("policy: chain not allowed");let n;try{n=Fr().decode(Cr(t.messageBase64,"Solana message"))}catch(d){throw new Error(`envelope: invalid Solana message: ${d?.message||d}`)}if(n.version!=="legacy"&&Array.isArray(n.addressTableLookups)&&n.addressTableLookups.length)throw new Error("envelope: unresolved Solana address tables refused");if(n.header.numSignerAccounts!==1||n.staticAccounts[0]!==e.owner||!G(e.owner,r.owners))throw new Error("envelope: Solana owner mismatch");let i=0n,o=!1,a=[];if(!Array.isArray(n.instructions)||n.instructions.length===0)throw new Error("envelope: Solana instructions required");for(let d of n.instructions){let h=n.staticAccounts[d.programAddressIndex];if(!h||!G(h,r.programs))throw new Error("policy: Solana program not allowed");if(h!==Or)throw new Error("envelope: unsupported Solana program decoder");a.push(h);let w=d.accountIndices||[];if(w.length!==2||n.staticAccounts[w[0]]!==e.owner)throw new Error("envelope: Solana transfer owner mismatch");let E=n.staticAccounts[w[1]];if(E!==e.destination||!G(E,r.destinations))throw new Error("envelope: Solana destination mismatch");let A=Buffer.from(d.data||[]);if(A.length!==12||A.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");i+=A.readBigUInt64LE(4),o=!0}if(!o)throw new Error("envelope: Solana destination mismatch");if(i>$(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");let u=$(r.lamportsPerSignature,"lamportsPerSignature");if(u<Lr)throw new Error("policy: Solana per-signature fee is below the network minimum");let f=r.maxLamportsPerSignature===void 0?u:$(r.maxLamportsPerSignature,"maxLamportsPerSignature");if(u>f)throw new Error("policy: Solana per-signature fee exceeds cap");let s=e?.artifact?.exactFeeLamports,m=BigInt(n.header.numSignerAccounts),l=m*u,p=m*f;if(s!==void 0){let d=$(s,"exactFeeLamports");if(d<l)throw new Error("policy: Solana exact fee below the base signature fee");if(d>p)throw new Error("policy: Solana exact fee exceeds the per-signature bound")}let c=p;if(c>$(r.maxFeeLamports,"maxFeeLamports"))throw new Error("policy: Solana fee exceeds cap");return Object.freeze({unit:"lamports",value:i.toString(),notional:(i+c).toString(),fee:c.toString(),programs:Object.freeze(a)})}function ve(e,r){let{unit:t,value:n,notional:i,fee:o}=_r(e,r);return Object.freeze({unit:t,value:n,notional:i,fee:o})}var ye=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol"]);var oe=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0}),Mr=new Set(["0x0000000000000000000000000000000000000000","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"]),Te=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),$r=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"}});var H=(e,r,t=256)=>{if(typeof e!="string"||!e||e.length>t)throw new Error(`envelope: bounded ${r} required`);return e},g=(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`)}},Ae=(e,r)=>{let t=Number(e);if(!Number.isFinite(t))throw new Error(`policy: ${r} must be finite`);return t},qr=(e,r)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${r} allowlist is empty`);return e},x=(e,r,t)=>{if(!qr(r,t).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${t} not allowed`)},ne=(e,r,t)=>{Array.isArray(r)&&r.length&&x(e,r,t)},N=(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},R=e=>String(e||"0x").slice(0,10).toLowerCase(),Ne=e=>g(e.gasLimit,"gasLimit")*g(e.maxFeePerGas??e.gasPrice,"feePerGas")+g(e.l1FeeWei??0,"l1FeeWei")+g(e.operatorFeeWei??0,"operatorFeeWei");function z(e,r,t,{dynamicTail:n=!1}={}){let i=String(e||"").toLowerCase();if(!/^0x[0-9a-f]*$/.test(i)||i.length<10+r*64)throw new Error(`envelope: malformed ${t} calldata`);if(!n&&i.length!==10+r*64)throw new Error(`envelope: malformed ${t} calldata`);return{hex:i,word:o=>i.slice(10+o*64,10+(o+1)*64)}}function v(e,r){if(!/^0{24}[0-9a-f]{40}$/.test(e))throw new Error(`envelope: malformed ${r} address`);return`0x${e.slice(24)}`}function T(e,r){try{return BigInt(`0x${e}`)}catch{throw new Error(`envelope: malformed ${r} integer`)}}function Rr(e){if(R(e)!=="0x095ea7b3")return null;let r=z(e,2,"approval");return{kind:"approval",spender:v(r.word(0),"approval spender"),amount:T(r.word(1),"approval amount")}}function kr(e,r){let t=r==="router02-exact-input-single"?7:8,n=z(e,t,"Uniswap v3 exactInputSingle"),i=t===7?4:5;return{kind:"action",action:"swap",inputToken:v(n.word(0),"input token"),outputToken:v(n.word(1),"output token"),recipient:v(n.word(3),"recipient"),amountIn:T(n.word(i),"amountIn"),minimumOut:T(n.word(i+1),"amountOutMinimum")}}function Pr(e){let r=z(e,12,"Across depositV3",{dynamicTail:!0}),t=T(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 i=Number(BigInt(`0x${r.hex.slice(n,n+64)}`));if(!Number.isSafeInteger(i))throw new Error("envelope: malformed Across depositV3 message length");let o=Math.ceil(i/32)*64;if(r.hex.length!==n+64+o)throw new Error("envelope: malformed Across depositV3 trailing bytes");return{kind:"action",action:"bridge",depositor:v(r.word(0),"depositor"),recipient:v(r.word(1),"recipient"),inputToken:v(r.word(2),"input token"),outputToken:v(r.word(3),"output token"),amountIn:T(r.word(4),"inputAmount"),minimumOut:T(r.word(5),"outputAmount"),destinationChainId:T(r.word(6),"destinationChainId")}}function Wr(e,r){let t=R(e),n=Te[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.action==="swap")return{...kr(e,n.layout),selector:t,provider:n.provider};if(n.action==="bridge")return{...Pr(e),selector:t,provider:n.provider};throw new Error("envelope: unsupported reviewed EVM action")}function Vr(e){let r=z(e,4,"SeaDrop mintPublic");return{kind:"mint",action:"mint",contract:v(r.word(0),"mint NFT contract"),feeRecipient:v(r.word(1),"mint fee recipient"),recipient:v(r.word(2),"mint recipient"),quantity:T(r.word(3),"mint quantity")}}function Ur(e,r){let t=R(e),n=$r[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{...Vr(e),selector:t,provider:n.provider};throw new Error("envelope: unsupported reviewed NFT action")}function q(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 Ie(e,r,t,{nowMs:n=Date.now(),networkFees:i,requireNetworkFees:o=!1}={}){let a=N(e.owner,"owner"),u=e.artifact,f=Number(u?.chainId??q(e)[0]?.chainId);if(!Number.isSafeInteger(f)||f<=0)throw new Error("envelope: explicit batch chainId required");if(x(f,r.chains,"chain"),u?.owner!==void 0&&N(u.owner,"batch owner")!==a)throw new Error("envelope: explicit batch owner mismatch");let s=q(e);if(!s.length||s.length>8)throw new Error("envelope: bounded EVM transaction batch required");let m=0n,l=0n,p=0n;for(let c of s){if(!c||typeof c!="object"||Array.isArray(c))throw new Error("envelope: structured EVM transaction required");if(Number(c.chainId)!==f)throw new Error("envelope: every batch leg must use the same chain");if(N(c.from,"transaction owner")!==a)throw new Error("envelope: every batch leg must use the same owner");if(x(R(c.data),r.selectors,"selector"),m+=g(c.value??0,"value"),l+=g(c.gasLimit,"gasLimit"),p+=Ne(c),y(f)&&(c.l1FeeWei===void 0||c.operatorFeeWei===void 0))throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(m>g(r.maxValueWei,"maxValueWei"))throw new Error("policy: aggregate value exceeds cap");if(l>g(r.maxGasLimit,"maxGasLimit"))throw new Error("policy: aggregate gas exceeds cap");if(p>g(r.maxFeeWei,"maxFeeWei"))throw new Error("policy: aggregate fee exceeds cap");return{transactions:s,chainId:f,owner:a,totalValue:m,totalGas:l,totalFee:p}}function Be(e,r,{nowMs:t=Date.now(),routeAttestationSecret:n}={}){let i=String(e?.surface||"");if(i!=="evm-swap"&&i!=="evm-bridge")throw new Error("envelope: strict EVM swap/bridge surface required");let o=H(e.provider,"provider",64).toLowerCase();x(o,r.providers,"provider");let a=Ie(e,r,i,{nowMs:t}),u=[],f=-1;for(let c=0;c<a.transactions.length;c++){let d=a.transactions[c],h=Rr(d.data),w;if(h){if(f!==-1)throw new Error("envelope: approval must be before action");if(g(d.value??0,"value")!==0n)throw new Error("envelope: approval cannot transfer native value");let O=N(d.to,"approval token");if(x(O,r.tokens,"token"),x(h.spender,r.spenders,"spender"),h.amount>g(r.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap");w={...h,token:O,index:c}}else{if(f!==-1)throw new Error("envelope: exactly one swap/bridge action is supported per batch");x(d.to,r.destinations,"destination"),w={...Wr(d.data,o),target:N(d.to,"action target"),index:c},f=c}let E=g(d.value??0,"value"),A=g(d.gasLimit,"gasLimit");u.push({...w,value:E,gas:A,fee:Ne(d)})}if(f<0)throw new Error("envelope: reviewed swap/bridge action required");let s=u[f],m=i==="evm-swap"?"swap":"bridge";if(s.action!==m||e.action!==m)throw new Error("envelope: surface/action/calldata mismatch");if(N(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(x(s.inputToken,r.tokens,"input token"),x(s.outputToken,r.tokens,"output token"),s.amountIn<=0n||s.amountIn>g(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(Y(e.autoSlippage,{nowMs:t,chainId:a.chainId,venue:o,tx:a.transactions[f],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!==g(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"))throw new Error("policy: decoded minimum output does not match authenticated quote");if(s.action==="bridge"&&g(e.toChainId,"toChainId")!==s.destinationChainId)throw new Error("envelope: decoded bridge destination chain mismatch");let l=u.filter(c=>c.kind==="approval");if(!Mr.has(s.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(s.value!==s.amountIn)throw new Error("envelope: native value must exactly match decoded amountIn");let p=Object.freeze({quoteAmountOut:g(e.autoSlippage.quoteAmountOut,"authenticated quote amountOut"),minAmountOut:g(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"),selectedBps:Number(e.autoSlippage.selectedBps),quotedAtMs:Number(e.autoSlippage.quotedAtMs),expiresAtMs:Number(e.autoSlippage.expiresAtMs)});return{...a,decoded:u,action:s,provider:o,authenticatedQuote:p}}function Fe(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 action");let n=H(e.provider||e.artifact?.provider||"opensea-nft","provider",64).toLowerCase();ne(n,r.providers,"provider");let i=e.artifact?.oraclePrepared===!0?e.artifact:e.prepared;i?.oraclePrepared===!0&&we(i,{nowMs:t,providers:Array.isArray(r.providers)&&r.providers.length?r.providers:null,kinds:["nft-mint"],label:"local-signer"});let o=Ie(e,r,"evm-nft",{nowMs:t});if(o.transactions.length!==1)throw new Error("envelope: mint supports exactly one transaction");let a=o.transactions[0],u=R(a.data);x(u,r.selectors,"selector"),x(a.to,r.destinations,"destination");let f=Ur(a.data,n),s=N(e.contract??e.artifact?.contract,"NFT contract");if(ne(s,r.nftContracts,"NFT contract"),f.contract!==s)throw new Error("envelope: mint calldata NFT contract mismatch");if(f.recipient!==o.owner)throw new Error("envelope: mint calldata recipient mismatch");ne(f.feeRecipient,r.nftFeeRecipients,"mint fee recipient");let m=g(e.quantity??e.artifact?.quantity,"quantity");if(m<=0n||m>g(r.maxMintQuantity??1,"maxMintQuantity"))throw new Error("policy: mint quantity exceeds cap");if(f.quantity!==m)throw new Error("envelope: mint calldata quantity mismatch");let l=g(e.totalWei??e.artifact?.totalWei,"totalWei");if(o.totalValue!==l)throw new Error("envelope: mint value does not match declared totalWei");if((e.priceWei!==void 0||e.artifact?.priceWei!==void 0)&&g(e.priceWei??e.artifact.priceWei,"priceWei")*m!==l)throw new Error("envelope: mint price does not match declared totalWei");if(l>g(r.maxMintTotalWei??r.maxValueWei,"maxMintTotalWei"))throw new Error("policy: mint total exceeds cap");return{...o,provider:n,decoded:[{...f,target:N(a.to,"mint target"),value:o.totalValue,gas:o.totalGas,fee:o.totalFee}]}}function Oe(e,{localsWaiver:r=!1}={}){if(!(e in oe))throw new Error("fee: unknown action");return r?0:oe[e]}function k(e,r,{nowMs:t=Date.now(),verifyFeeWaiver:n,routeAttestationSecret:i,networkFees:o,requireNetworkFees:a=!1}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let u=H(e.surface,"surface",16);if(!ye.has(u))throw new Error("envelope: unsupported public surface");let f=H(e.action,"action",32);x(u,r.surfaces,"surface"),x(f,r.actions,"action"),x(e.owner,r.owners,"owner"),x(e.destination,r.destinations,"destination");let s=Ae(r.maxTtlMs,"maxTtlMs"),m=Ae(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>m)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(u==="evm-swap"||u==="evm-bridge")Be(e,r,{nowMs:t,routeAttestationSecret:i});else if(u==="evm-nft")Fe(e,r,{nowMs:t});else if(u==="evm"){if(!["transfer","approve"].includes(f))throw new Error("envelope: generic evm requires transfer or approve; use strict evm-nft for mint action");if(f==="swap"||f==="bridge")throw new Error("envelope: surface/action mismatch; use strict decoded surface");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");j({...l,slippageBps:e.slippageBps,expiresAtMs:e.expiresAtMs},r,{nowMs:t,networkFees:o,requireNetworkFees:a});let d=String(l.data||"0x").toLowerCase(),h=g(l.value,"EVM value");if(d==="0x"){if(h===0n)throw new Error("envelope: native EVM transfer value required")}else if(B(d)){if(h!==0n)throw new Error("envelope: EVM approval cannot transfer native value")}else throw new Error("envelope: unsupported generic EVM calldata")}else u==="btc"?Se(e,r):u==="sol"&&ve(e,r);let p=Number(e.fee?.oracleFeeBps)===0&&oe[f]!==0;if(e.fee?.waiver||p&&!e.fee?.waiverAttestation)throw new Error("fee: verified waiver attestation required");if(p&&(typeof n!="function"||n(e.fee.waiverAttestation,e)!==!0))throw new Error("fee: waiver attestation invalid");let c=Oe(f,{localsWaiver:p});if(Number(e.fee?.oracleFeeBps)!==c)throw new Error("fee: final artifact fee mismatch");return!0}var J=Object.freeze([...ye]),Dr=Object.freeze({...Te});function jr(e={}){let r={};for(let t of J){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:(i,o)=>n.simulate(structuredClone(i),structuredClone(o)),sign:(i,o)=>n.sign(structuredClone(i),structuredClone(o)),broadcast:(i,o,a)=>n.broadcast(i,structuredClone(o),structuredClone(a))})}}return Object.freeze(r)}function Gr(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 An}from"@noble/curves/ed25519.js";import{base58 as Hr}from"@scure/base";import{RawTx as Nn,SigHash as In,Transaction as zr}from"@scure/btc-signer";import{Transaction as Jr}from"ethers";var Le=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 Kr(e){let r=0,t=0,n=0;for(;n<e.length&&n<3;){let i=e[n++];if(r|=(i&127)<<t,(i&128)===0)return{value:r,offset:n};t+=7}return null}function Ce(e,r){try{if(String(e).startsWith("evm"))return Jr.from(r).hash;if(e==="btc"){let t=Le(r);if(!t)return null;let n=zr.fromPSBT(t);return n.finalize(),n.extract(),n.id}if(e==="sol"){let t=Le(r);if(!t)return null;let n=Kr(t);if(!n||n.value!==1)return null;let i=t.subarray(n.offset,n.offset+64);return i.length===64?Hr.encode(i):null}}catch{}return null}var Yr=e=>String(e||"").toLowerCase();function I(e){return Xr("sha256").update(JSON.stringify(e)).digest("hex")}function X(e,r,t={}){return j(e,r,t)}async function et(e,r={}){if(!y(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 Me(e,r,t=!1){if(!y(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),i=BigInt(r.l1FeeWei)+BigInt(r.operatorFeeWei);if(n<i)throw new Error("policy: rollup fee attestation understates estimate")}return!0}function rt(e,r={}){return renderConfirmationArtifact(e,I(e),r)}var P=class{#e=new Map;constructor({now:r=Date.now}={}){this.now=r}issue({artifact:r,owner:t,ttlMs:n=6e4}){if(!Number.isFinite(n)||!Number.isInteger(n)||n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let i=Zr(32).toString("hex");return this.#e.set(i,{digest:I(r),owner:Yr(t),expiresAtMs:this.now()+n}),i}consume(r,t){let n=this.#e.get(String(r));if(!n)throw new Error("confirmation: used or unknown nonce");if(n.expiresAtMs<=this.now())throw this.#e.delete(String(r)),new Error("confirmation: expired nonce");let i=Buffer.from(n.digest,"hex"),o=Buffer.from(I(t),"hex");if(!Qr(i,o))throw new Error("confirmation: artifact mismatch");return this.#e.delete(String(r)),n}clear(){this.#e.clear()}};function tt(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(B(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 nt(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 K(e,r){let t=String(r||"");if(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=_e.decode(t);return n.length===64&&_e.encode(n)===t}catch{return!1}return!1}function $e(e,r,t){return!K(e,r)||!K(e,t)?!1:e==="sol"?String(r)===String(t):String(r).toLowerCase()===String(t).toLowerCase()}function ot(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 ie({artifact:e,envelope:r,nonce:t,deps:n,policy:i,confirmation:o,consumeNonce:a,nowMs:u}){let f=ot(i);if(n.autonomous===!0){if(n.env?.ORACLE_AUTONOMOUS_TRADING!=="1")throw new Error("signer: autonomous execution requires ORACLE_AUTONOMOUS_TRADING=1");if(f!=="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,u())!==!0)throw new Error("signer: autonomous trigger attestation required");return o}if(f!=="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);if(!o||!Number.isFinite(o.expiresAtMs)||o.expiresAtMs<=u())throw new Error("confirmation: expired nonce");return o}function it(e){return e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function at(e,r){return e&&it(e.surface)?q(e):[r]}function st(e,r){let t=e?.hash??null,n=e?.transactionHash??null;if(t!=null&&n!=null&&!$e(r,t,n))throw new Error("signer: receipt reports conflicting transaction hashes");return t||n||null}function ct(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:nt(t,n)}}async function ae(e,r,t){if(!t.isArmed())throw new Error("signer: disarmed");let n=e?.version===1&&e?.surface?e:null,i=n?n.artifact:(()=>{let{tradeId:w,...E}=e||{};return E})(),o=at(n,i),a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,u=()=>typeof t.nowMs=="function"?t.nowMs():t.nowMs??Date.now(),f=await ie({artifact:e,envelope:n,nonce:r,deps:t,policy:a,confirmation:null,consumeNonce:!0,nowMs:u}),s=I(e),m=(w={})=>{n?k(n,a,w):(X(i,a,{nowMs:w.nowMs,networkFees:w.networkFees,requireNetworkFees:w.requireNetworkFees}),tt(i))},l=async w=>{let E=n&&!String(n.surface||"").startsWith("evm")?void 0:await et(w,t);return{nowMs:u(),verifyFeeWaiver:t.verifyFeeWaiver,routeAttestationSecret:t.routeAttestationSecret,networkFees:E,requireNetworkFees:y(w?.chainId)}};m({nowMs:u(),verifyFeeWaiver:t.verifyFeeWaiver,routeAttestationSecret:t.routeAttestationSecret});for(let w of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof t[w]!="function")throw new Error(`signer: ${w} is required`);let p=t.reserveLedger(n||e,a);if(!p)throw new Error("signer: ledger reservation required");let c=!1,d=[];try{for(let w of o){if(typeof t.simulate!="function"||await t.simulate(w,n)!==!0)throw new Error("signer: strict affirmative simulation required");let E=await l(w);if(Me(w,E.networkFees,E.requireNetworkFees),!t.isArmed())throw new Error("signer: disarmed before signing");a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,f=await ie({artifact:e,envelope:n,nonce:r,deps:t,policy:a,confirmation:f,consumeNonce:!1,nowMs:u}),m(E),t.validateReservation(p,a,n&&typeof t.decodeEconomics=="function"?t.decodeEconomics(n,a):void 0),c=!0;let A=await t.sign(w,n);if(typeof t.verifySigned!="function"||await t.verifySigned(A,w,n)!==!0)throw new Error("signer: signed bytes do not match confirmed artifact");if(!t.isArmed())throw new Error("signer: disarmed before broadcast");if(I(e)!==s)throw new Error("signer: artifact mutated after signing");a=typeof t.readPolicy=="function"?t.readPolicy():t.policy,f=await ie({artifact:e,envelope:n,nonce:r,deps:t,policy:a,confirmation:f,consumeNonce:!1,nowMs:u});let O=await l(w);Me(w,O.networkFees,O.requireNetworkFees),m(O),t.validateReservation(p,a,n&&typeof t.decodeEconomics=="function"?t.decodeEconomics(n,a):void 0);let Z=await t.broadcast(A,w,n),W=Z?.status,C=n?.surface||"evm",V=st(Z,C),ke=Ce(C,A);if(!$e(C,V,ke))throw new Error("signer: receipt transaction hash does not match signed bytes");if(W===0||W==="0x0")throw K(C,V)?(t.settleFailedLedger(p),new Error("signer: broadcast did not return a successful receipt")):new Error("signer: failed broadcast requires a valid transaction hash");if(W!==1&&W!=="0x1")throw new Error("signer: broadcast did not return a successful receipt");if(!K(C,V))throw new Error("signer: successful broadcast requires a valid transaction hash");d.push(ct(Z,V))}}catch(w){throw c||t.releaseLedger(p),w}if(t.commitLedger(p),d.length===1){let w={receipt:d[0]};return n?.surface==="evm-bridge"&&(w.originStatus="success",w.destinationStatus="unverified",w.destinationSuccess=!1,w.note="Origin-chain receipts do not prove destination-chain settlement."),w}let h={receipts:d,status:"success"};return n?.surface==="evm-bridge"&&(h.originStatus="success",h.destinationStatus="unverified",h.destinationSuccess=!1,h.note="Origin-chain receipts do not prove destination-chain settlement."),h}import ut from"node:http";import{timingSafeEqual as ft}from"node:crypto";var qe=new Set(["127.0.0.1","::1","localhost"]),dt=(e,r)=>{let t=Buffer.from(String(e)),n=Buffer.from(String(r));return t.length===n.length&&ft(t,n)},b=(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 lt(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 Re=e=>new Promise((r,t)=>{let n=0,i=[],o=!1;e.on("data",a=>{n+=a.length,n>64*1024&&!o?(o=!0,t(new Error("request refused")),e.resume()):o||i.push(a)}),e.on("end",()=>{if(!o)try{r(JSON.parse(Buffer.concat(i).toString()||"{}"))}catch{t(new Error("request refused"))}}),e.on("error",t)});function pt(e={}){let r=e.host||"127.0.0.1";if(!qe.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 o of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof e[o]!="function")throw new Error(`signer: ${o} is required`);if(typeof e.disarm!="function")throw new Error("signer: disarm callback is required");let t=e.confirmations||new P,n=e.origin||`http://${r}`;return ut.createServer(async(o,a)=>{try{let u=String(o.headers.authorization||"").replace(/^Bearer /i,"");if(!dt(u,e.token))return b(a,401,{error:"unauthorized"});let f=lt(o.headers.host);if(!qe.has(f))return b(a,403,{error:"host refused"});if(o.headers.origin&&o.headers.origin!==n)return b(a,403,{error:"origin refused"});if(o.method==="GET"&&o.url==="/status"){let s=typeof e.readPolicy=="function"?e.readPolicy():e.policy,m=new Set(J),l=Array.isArray(s?.surfaces)?s.surfaces.filter(p=>typeof p=="string"&&m.has(p)):[];return b(a,200,{ok:!0,service:"oracle-signer",armed:e.isArmed?.()===!0,surfaces:l,sessionExpiresAtMs:e.sessionExpiresAtMs||null})}if(o.method==="POST"&&o.url==="/disarm")return e.disarm(),t.clear(),b(a,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(o.method))return b(a,405,{error:"request refused"});if(o.method==="POST"&&String(o.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return b(a,415,{error:"request refused"});if(o.method==="POST"&&o.url==="/confirm"){if(e.autonomous===!0)return b(a,403,{error:"autonomous signer does not issue human confirmation nonces"});let s=await Re(o),m=I(s.artifact),l=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(l?.confirmationMode!=="exact-human")return b(a,403,{error:"exact-human policy required"});let p=typeof e.nowMs=="function"?e.nowMs():Date.now();if(s.artifact?.version===1&&s.artifact?.surface)k(s.artifact,l,{nowMs:p,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:c,...d}=s.artifact||{};X(d,l,{nowMs:p})}return typeof e.confirmArtifact!="function"?b(a,403,{error:"local human confirmation unavailable"}):await e.confirmArtifact(s.artifact,m,l)!==!0?b(a,400,{error:"exact human confirmation refused"}):b(a,200,{confirmationNonce:t.issue({artifact:s.artifact,owner:s.artifact?.owner??s.artifact?.from,ttlMs:s.ttlMs})})}if(o.method==="POST"&&o.url==="/execute"){let s=await Re(o),m=await ae(s.artifact,s.confirmationNonce,{...e,confirmations:t});return b(a,200,m)}return b(a,404,{error:"not found"})}catch(u){return e.onError?.(String(u?.message||u)),b(a,400,{error:"request refused"})}})}export{P as ConfirmationStore,J as PUBLIC_SIGNER_SURFACES,Dr as REVIEWED_EVM_SELECTORS,I as artifactDigest,X as assertExactPolicy,pt as createSignerServer,jr as createSurfaceAdapters,q as evmTransactions,ae as executeConfirmedArtifact,rt as inspectArtifactForConfirmation,Be as inspectEvmBatch,Fe as inspectEvmNft,Oe as publicFeeBps,Gr as surfaceAdapterFor,k as validateSurfaceEnvelope};
1
+ import{createHash as Gr,randomBytes as zr,timingSafeEqual as Kr}from"node:crypto";import{base58 as tt}from"@scure/base";import{Interface as St,MaxUint256 as At,isAddress as yt,keccak256 as zn,toUtf8Bytes as Kn}from"ethers";import{Interface as bt,isAddress as On}from"ethers";import{isAddress as An}from"ethers";import{createHash as dt,createHmac as pt,timingSafeEqual as lt}from"node:crypto";import{readFileSync as st}from"node:fs";import{homedir as ct}from"node:os";import{join as Q}from"node:path";function ut(){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=ct();if(process.env.ORACLE_PUBLIC_DESKTOP==="1"){let r=(process.env.ORACLE_CONFIG_DIR||Q(t,".config","oracle")).trim();return[e,Q(r,"exec.env")].filter(Boolean)}return[e,Q(t,".config","oracle","exec.env"),Q(t,".config","mad-desk","exec.env")].filter(Boolean)}function D(e,t,r){let n=e??process.env[t]??process.env[r];if(!String(n||"").trim())for(let o of ut())try{let i=st(o,"utf8"),a=i.match(new RegExp(`^${t}=(.*)$`,"m"))||i.match(new RegExp(`^${r}=(.*)$`,"m"));if(a&&(n=a[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 U(e,t,r="guard"){let n=Number(t);if(t==null||!Number.isFinite(n))throw new Error(`${r}: current time must be a finite number (got ${ft(t)})`);let 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 ft(e){return e===null?"null":e===void 0?"undefined":typeof e=="number"?String(e):`${typeof e} ${JSON.stringify(String(e)).slice(0,24)}`}var be=100;function se(e){return Array.isArray(e)?`[${e.map(se).join(",")}]`:e&&typeof e=="object"?`{${Object.keys(e).sort().map(t=>`${JSON.stringify(t)}:${se(e[t])}`).join(",")}}`:JSON.stringify(e??null)}function mt(e,{required:t=!1}={}){try{return D(e,"ORACLE_ROUTE_ATTESTATION_SECRET","MAD_ROUTE_ATTESTATION_SECRET")}catch(r){if(t)throw r;return null}}function wt(e){let{signature:t,...r}=e;return r}function ht(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 dt("sha256").update(Buffer.from(t.slice(2),"hex")).digest("hex")}function gt(e,t){let r=Buffer.from(String(e??""),"utf8"),n=Buffer.from(String(t??""),"utf8");return r.length!==n.length||r.length===0?!1:lt(r,n)}function Et(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 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 ce(e,{nowMs:t=Date.now(),chainId:r,venue:n,secret:o,tx:i,requireSigned:a=!1}={}){if(!e||e.mode!=="auto")throw new Error("bounded auto-slippage guard required");let c=mt(o,{required:a});if(a&&!c)throw new Error("auto-slippage attestation secret required for signing or broadcast");if(c){let p=pt("sha256",c).update(se(wt(e))).digest("hex");if(!gt(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),s=Number(e.capBps);if(!Number.isInteger(u)||u<0||u>be)throw new Error("auto-slippage selected tolerance exceeds hard 100 bps cap");if(!Number.isInteger(s)||s<0||s>be||u>s)throw new Error("auto-slippage cap exceeds hard 100 bps cap");try{U({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 m=BigInt(e.quoteAmountOut??0),f=BigInt(e.minAmountOut??0);if(m<=0n||f<=0n)throw new Error("auto-slippage guard amounts must be positive");let d=m*BigInt(1e4-u),l=d/10000n;if(d%10000n!==0n&&(l+=1n),f<l)throw new Error("auto-slippage guard is under-protected relative to its fresh quote");if(i?.data&&e.minAmountOut!=null){let p=Et(i.data);if(e.calldataHash!=null){if(String(e.calldataHash)!==ht(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 Mn=new bt(["function approve(address spender,uint256 amount) returns (bool)"]);import{Interface as vt,isAddress as Rn}from"ethers";var Wn=new vt(["function approve(address spender,uint256 amount) returns (bool)"]),Jn=Object.freeze({42161:"0x1c3fa76e6e1088bce750f23a5bfcffa1efef6a41",43114:"0x8f550e53dfe96c055d5bdb267c21f268fcaf63b2"});function ve(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=String(e??"").trim();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)}`)}}var to=new St(["function approve(address spender,uint256 amount) returns (bool)"]);function Se(e,t){let r=String(e||"").trim();if(!yt(r))throw new Error(`${t} must be an address`);return r.toLowerCase()}function Tt(e,t="approval amount",{allowZero:r=!1}={}){let n=ve(e,t);if(r?n<0n:n<=0n)throw new Error(`${t} must be positive`);if(n>=At)throw new Error("unlimited approvals are refused; use an exact bounded amount");return n.toString()}var Ae=new Set(["0x095ea7b3","0x39509351","0x61f49ed6","0xeb5625d9","0xf9255c1f","0x87517c45","0xd505accf","0x8fcbaf0c","0x2b67b570","0x2a2d80d1"]),Nt=new Set(["0x39509351","0xf9255c1f"]);function $(e){let t=String(e||"").toLowerCase();return t.length<10?!1:Ae.has(t.slice(0,10))}function ye(e){if(!$(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=s=>n[s]?"0x"+n[s].slice(24):null,i=s=>n[s]?BigInt("0x"+n[s]):null,a=null,c=null,u=null;switch(r){case"0x095ea7b3":case"0x39509351":a=o(0),c=i(1);break;case"0x61f49ed6":case"0xeb5625d9":case"0xf9255c1f":u=o(0),a=o(1),c=i(2);break;case"0xd505accf":a=o(1),c=i(2);break;case"0x8fcbaf0c":{a=o(1),c=i(4)===0n?0n:(1n<<256n)-1n;break}case"0x87517c45":u=o(0),a=o(1),c=i(2);break;default:throw new Error(`approval selector ${r} is recognised but not decodable; refusing to bound it`)}if(a==null||c==null)throw new Error("invalid approve calldata");return{spender:Se(a,"approval spender"),token:u==null?null:Se(u,"approval token"),amount:Tt(c,"approval amount",{allowZero:!0}),selector:r,additive:Nt.has(r)}}import{createHash as It,createHmac as Bt,timingSafeEqual as Ot}from"node:crypto";var Lt=2,ue=300*1e3,Ne=(()=>{let e=Number(process.env.ORACLE_PREPARE_HARD_MAX_AGE_MS);return Number.isFinite(e)&&e>0?e:1800*1e3})();function _t(e){let t=e==null||e===""?ue:Number(e);return!Number.isFinite(t)||t<0?ue:Math.min(t,Ne)}function fe(e){return e===null||typeof e!="object"?JSON.stringify(e):Array.isArray(e)?`[${e.map(fe).join(",")}]`:`{${Object.keys(e).sort().map(r=>`${JSON.stringify(r)}:${fe(e[r])}`).join(",")}}`}function Te(e){let t=String(e?.ORACLE_STAMP_HMAC_SECRET||"").trim();return t.length>=16?t:""}function Ie(e=process.env){return Te(process.env)||Te(e)}function Ft(e=process.env){return String(process.env.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"||String(e?.ORACLE_STAMP_REQUIRE_MAC||"").trim()==="1"}function Mt(e){let{oraclePrepared:t,prepareHash:r,prepareMac:n,note:o,...i}=e||{};return i}function Ct(e){let t=Mt(e);return It("sha256").update(fe(t)).digest("hex")}function kt(e,t=Ie()){return t?Bt("sha256",t).update(String(e)).digest("hex"):""}function Rt(e,t){try{let r=Buffer.from(String(e),"hex"),n=Buffer.from(String(t),"hex");return r.length===0||r.length!==n.length?!1:Ot(r,n)}catch{return!1}}function Be(e,{maxAgeMs:t=ue,nowMs:r=Date.now(),providers:n=null,kinds:o=null,label:i="operator",env:a=process.env}={}){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)!==Lt)throw new Error(`${i}: unsupported prepareVersion ${e.prepareVersion}`);let c=Ct(e);if(String(e.prepareHash||"")!==c)throw new Error(`${i}: prepareHash mismatch \u2014 payload was altered after prepare`);let u=Ie(a),s=String(e.prepareMac||"");if(Ft(a)||s||u){if(!u)throw new Error(`${i}: prepareMac present or ORACLE_STAMP_REQUIRE_MAC=1 but ORACLE_STAMP_HMAC_SECRET missing in signer`);let w=kt(c,u);if(!s||!Rt(s,w))throw new Error(`${i}: prepareMac mismatch \u2014 stamp not from trusted preparer`)}let m=Number(e.preparedAt),f=Number(e.expiresAt),d=_t(t),l=r-m,p=f-m;if(!Number.isFinite(l)||!Number.isFinite(f)||!Number.isFinite(p)||l<0||p<=0||p>Ne||l>d||r>f)throw new Error(`${i}: prepare envelope expired or clock-skewed (ageMs=${l}, max=${d})`);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 Y=e=>String(e||"").toLowerCase(),qt=new Set(["chainId","from","to","data","value","gasLimit","gasPrice","maxFeePerGas","maxPriorityFeePerGas","l1FeeWei","operatorFeeWei","nonce","type","accessList","slippageBps","expiresAtMs"]),Pt=new Set([10n,8453n,84532n,42161n,421614n,11155420n,7777777n]);function q(e){try{return Pt.has(BigInt(e))}catch{return!1}}var T=(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`)}},Oe=(e,t)=>{let r=Number(e);if(!Number.isFinite(r))throw new Error(`policy: ${t} must be finite`);return r},j=(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 ee(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(l=>!qt.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].includes(Number(e.type)))throw new Error("policy: unsupported EVM transaction type");let i=(l,p)=>{try{return BigInt(l)===BigInt(p)}catch{return String(l)===String(p)}};if(!Array.isArray(t.chains)||t.chains.length===0)throw new Error("policy: chain allowlist is empty");if(!t.chains.some(l=>i(l,e.chainId)))throw new Error("policy: chain not allowed");if(j(e.to,t.destinations,"destination",Y),j(String(e.data||"0x").slice(0,10),t.selectors,"selector",l=>String(l).toLowerCase()),j(e.from,t.owners,"owner",Y),$(e.data)){let l;try{l=ye(e.data)}catch(w){throw new Error(`policy: malformed approval calldata: ${w?.message||w}`)}j(l.spender,t.spenders,"spender",Y),j(l.token||e.to,t.erc20Tokens,"ERC-20 token",Y);let p=T(t.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(T(e.value,"value")>T(t.maxValueWei,"maxValueWei"))throw new Error("policy: value exceeds cap");let a=T(e.gasLimit,"gasLimit");if(a>T(t.maxGasLimit,"maxGasLimit"))throw new Error("policy: gas exceeds cap");let c=e.maxFeePerGas??e.gasPrice,u=T(c,"feePerGas")*a,s=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&&(s+=T(e.l1FeeWei,"l1FeeWei")),e.operatorFeeWei!==void 0&&(s+=T(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 l=T(n.l1FeeWei,"estimated l1FeeWei")+T(n.operatorFeeWei,"estimated operatorFeeWei");if(s<l)throw new Error("policy: rollup fee attestation understates estimate")}if(u+s>T(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: fee exceeds cap");let f=Oe(t.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>f)throw new Error("policy: slippage attestation exceeds cap");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r)throw new Error("policy: artifact expired");let d=Oe(t.maxTtlMs??12e4,"maxTtlMs");if(d<=0||e.expiresAtMs-r>d)throw new Error("policy: artifact TTL exceeds cap");return!0}import{createHash as Le}from"node:crypto";import{Address as $t,NETWORK as Wt,OutScript as _e,RawTx as Jt,SigHash as Fe,TEST_NETWORK as Ut,Transaction as Vt}from"@scure/btc-signer";var Me=(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`)}},Dt=(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},jt=e=>Array.isArray(e)||e instanceof Uint8Array?e.length>0:e!=null,Ht=e=>/^(bc1|tb1|bcrt1)/i.test(String(e)),W=e=>Ht(e)?String(e).toLowerCase():String(e),de=(e,t)=>Array.isArray(t)&&t.some(r=>W(r)===W(e)),Gt=(e,t)=>Buffer.from(e||[]).equals(Buffer.from(t||[]));function zt(e){let t=Buffer.from(Jt.encode(e)),r=Le("sha256").update(t).digest();return Buffer.from(Le("sha256").update(r).digest()).reverse().toString("hex")}function Kt(e){if(!e.nonWitnessUtxo)throw new Error("envelope: PSBT input nonWitnessUtxo required");if(zt(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)||!Gt(e.witnessUtxo.script,t.script))throw new Error("envelope: Bitcoin witness UTXO mismatch");return t}function Xt(e,t){if(e.action!=="transfer")throw new Error("envelope: BTC decoder requires transfer action");let r=e?.artifact;if(Object.keys(r).some(f=>!["network","psbt"].includes(f)))throw new Error("envelope: unexpected BTC artifact field");if(!de(r.network,t.chains))throw new Error("policy: chain not allowed");let n=["bitcoin","mainnet"].includes(String(r.network).toLowerCase())?Wt:["testnet","signet","regtest"].includes(String(r.network).toLowerCase())?Ut:null;if(!n)throw new Error("envelope: unsupported Bitcoin network");let o;try{o=Vt.fromPSBT(Dt(r.psbt,"PSBT"))}catch(f){throw new Error(`envelope: invalid PSBT: ${f?.message||f}`)}if(o.inputsLength===0||o.outputsLength===0)throw new Error("envelope: PSBT inputs and outputs required");let i=$t(n);for(let f=0;f<o.inputsLength;f++){let d=o.getInput(f);for(let w of["partialSig","tapKeySig","tapScriptSig","finalScriptSig","finalScriptWitness"])if(jt(d[w]))throw new Error("envelope: signed or finalized PSBT refused");if(d.sighashType!==void 0&&d.sighashType!==Fe.DEFAULT&&d.sighashType!==Fe.ALL)throw new Error("envelope: Bitcoin sighash must bind all inputs and outputs");let l=Kt(d),p;try{let w=_e.decode(l.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(!de(p,t.owners)||W(p)!==W(e.owner))throw new Error("envelope: Bitcoin input owner mismatch")}let a=new Set([e.owner,...t.changeAddresses||[]].map(f=>W(f))),c=0n,u=!1,s=[];for(let f=0;f<o.outputsLength;f++){let d=o.getOutput(f),l;try{l=i.encode(_e.decode(d.script))}catch{throw new Error("envelope: unsupported Bitcoin output script")}let p=W(l);if(s.push(`${l}:${d.amount}`),p===W(e.destination)){u=!0,c+=d.amount;continue}if(de(l,t.destinations)){c+=d.amount;continue}if(!a.has(p))throw new Error("policy: Bitcoin output destination not allowed")}if(!u)throw new Error("envelope: Bitcoin destination mismatch");let m;try{m=o.fee}catch{throw new Error("envelope: PSBT fee cannot be decoded")}if(m<0n||m>Me(t.maxFeeSats,"maxFeeSats"))throw new Error("policy: Bitcoin fee exceeds cap");if(c>Me(t.maxValueSats,"maxValueSats"))throw new Error("policy: Bitcoin value exceeds cap");return Object.freeze({unit:"sats",value:c.toString(),notional:(c+m).toString(),fee:m.toString(),outputs:Object.freeze(s)})}function Ce(e,t){let{unit:r,value:n,notional:o,fee:i}=Xt(e,t);return Object.freeze({unit:r,value:n,notional:o,fee:i})}import{createHash as le}from"node:crypto";import{base58 as We}from"@scure/base";import{getCompiledTransactionMessageDecoder as Zt}from"@solana/transaction-messages";var me="11111111111111111111111111111111",Qt="ComputeBudget111111111111111111111111111111",Yt="So11111111111111111111111111111111111111112",Je="TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA";var Ue="ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL",er=5000n,tr=2039280n,rr=37095705934669439343138083508754565189542113879843219016388785533085940283555n,x=57896044618658097711785492504343953926634992332820282019728792003956564819949n,ke=19681161376707505956807079304988542015446066515923890162744021073123829784752n,Re=e=>le("sha256").update(`global:${e}`).digest().subarray(0,8).toString("hex"),nr=new Map([[Re("route"),{name:"route",prefixBytes:0}],[Re("shared_accounts_route"),{name:"shared_accounts_route",prefixBytes:1}]]),A=(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`)}},or=(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},L=(e,t)=>Array.isArray(t)&&t.some(r=>String(r)===String(e)),N=e=>String(e||""),ir=e=>Array.isArray(e.solMints)&&e.solMints.length?e.solMints:e.tokens,re=e=>le("sha256").update(e).digest("hex");function te(e,t){try{let r=Buffer.from(We.decode(String(e||"")));if(r.length!==32)throw new Error("wrong length");return r}catch{throw new Error(`envelope: invalid Solana ${t}`)}}function S(e){let t=e%x;return t>=0n?t:x+t}function B(e,t){let r=e;for(;t-- >0n;)r=r*r%x;return r}function ar(e){let r=e*e%x*e%x,n=B(r,2n)*r%x,o=B(n,1n)*e%x,i=B(o,5n)*o%x,a=B(i,10n)*i%x,c=B(a,20n)*a%x,u=B(c,40n)*c%x,s=B(u,80n)*u%x,m=B(s,80n)*u%x,f=B(m,10n)*i%x;return B(f,2n)*e%x}function sr(e,t){let r=S(t*t*t),n=S(r*r*t),o=ar(e*n),i=S(e*r*o),a=S(t*i*i),c=i,u=S(i*ke),s=a===e,m=a===S(-e),f=a===S(-e*ke);return s&&(i=c),(m||f)&&(i=u),(S(i)&1n)===1n&&(i=S(-i)),!s&&!m?null:i}function cr(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=S(t*t),n=sr(S(r-1n),S(rr*r+1n));return n===null?!1:!(n===0n&&(e[31]&128)!==0)}function ur(e,t){let r=Buffer.concat([...e,te(t,"program id"),Buffer.from("ProgramDerivedAddress")]),n=le("sha256").update(r).digest();if(cr(n))throw new Error("envelope: derived Solana program address is on curve");return We.encode(n)}function we(e,t,r=Je){let n=[te(e,"owner"),te(r,"token program"),te(t,"mint")];for(let o=255;o>=0;o--)try{return ur([...n,Buffer.from([o])],Ue)}catch(i){if(!/on curve/.test(String(i?.message||i)))throw i}throw new Error("envelope: unable to derive associated token account")}function fr(e,t){return(t.accountIndices||[]).map(r=>N(e.staticAccounts[r]))}function H(e){return Buffer.from(e.data||[])}function dr(e,t){return N(e.staticAccounts[t.programAddressIndex])}function Ve(e,t){return Number(t)<e.header.numSignerAccounts}function pr(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 G(e){return e.accountIndices||[]}function pe(e,t){if(!Array.isArray(e)||!e.length)throw new Error(`policy: ${t} allowlist required`);return e.map(String)}function qe(e,t){let r=G(t).map(n=>{let o=Ve(e,n)?"s":"n",i=pr(e,n)?"w":"r";return`${n}:${N(e.staticAccounts[n])}:${o}:${i}`});return re(Buffer.from(r.join(`
2
+ `)))}function Pe(e,t,r){if(t+8>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readBigUInt64LE(t)}function lr(e,t,r){if(t+2>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readUInt16LE(t)}function mr(e,t,r){if(t+4>e.length)throw new Error(`envelope: malformed Jupiter ${r}`);return e.readUInt32LE(t)}function wr(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||{},a=0,c=0,u=[];for(let s=0;s<t;s++){if(a>=e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let m=e[a++];if(!o.includes(m))throw new Error("policy: Jupiter route variant not allowed");if(!Object.hasOwn(i,String(m)))throw new Error("policy: Jupiter route variant payload size required");let f=Number(i[String(m)]);if(!Number.isSafeInteger(f)||f<0||f>16)throw new Error("policy: Jupiter route variant payload size invalid");if(a+f+3>e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");let d=e.subarray(a,a+f);a+=f;let l=d.toString("hex"),p=r.jupiterRouteVariantPayloads?.[String(m)];if(!Array.isArray(p)||!p.map(String).includes(l))throw new Error("policy: Jupiter route variant payload not allowed");let w=e[a++],h=e[a++],E=e[a++];if(w<1||w>100)throw new Error("envelope: Jupiter route-plan percent invalid");if(h!==s||E!==s+1)throw new Error("envelope: unsupported Jupiter route-plan token index");c+=w,u.push(Object.freeze({swapVariant:m,variantPayloadHex:l,percent:w,inputIndex:h,outputIndex:E}))}if(a!==e.length)throw new Error("envelope: opaque or unsupported Jupiter route-plan payload");if(c!==100*t)throw new Error("envelope: Jupiter route-plan percent total mismatch");return Object.freeze(u)}function hr(e,t){let r=H({data:e}),n=r.subarray(0,8).toString("hex"),o=nr.get(n);if(!o)throw new Error("envelope: unsupported Jupiter instruction discriminator");let i=19,a=o.prefixBytes===1?r[8]:null;if(o.prefixBytes===1&&r.length<9)throw new Error("envelope: malformed Jupiter shared route payload");let c=8+o.prefixBytes,u=c+4,s=r.length-i;if(s<=u)throw new Error("envelope: malformed Jupiter route payload");let m=mr(r,c,"route plan length"),f=r.subarray(u,s),d=wr(f,m,t);return Object.freeze({instruction:o.name,routeId:a,routePlanSteps:m,routePlan:d,routePlanHash:re(f),inAmount:Pe(r,s,"in_amount"),quotedOutAmount:Pe(r,s+8,"quoted_out_amount"),slippageBps:lr(r,s+16,"slippage_bps"),platformFeeBps:r[s+18],instructionHash:re(r)})}function gr(e,t,r){let n=fr(e,t),o=(i,a)=>{let c=n[i];if(!c)throw new Error(`envelope: Jupiter ${a} account missing`);return c};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 $e(e,t){return e&&e!==t?e:null}function y(e,t,r){let n=N(e.staticAccounts[t]);if(!n)throw new Error(`envelope: Jupiter ${r} missing`);return n}function Er(e,t){let r=H(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 xr(e,t,r,n,o,i){let a=H(t);if(a.length!==1||a[0]!==1)throw new Error("envelope: unsupported Jupiter ATA helper");let c=G(t);if(c.length!==6)throw new Error("envelope: malformed Jupiter ATA helper");let u=y(e,c[0],"ATA payer"),s=y(e,c[1],"ATA account"),m=y(e,c[2],"ATA owner"),f=y(e,c[3],"ATA mint"),d=y(e,c[4],"ATA system program"),l=y(e,c[5],"ATA token program");if(u!==r.owner)throw new Error("envelope: Jupiter ATA payer must equal owner");if(m!==r.owner)throw new Error("envelope: Jupiter ATA owner must equal owner");if(d!==me)throw new Error("envelope: Jupiter ATA system program mismatch");if(l!==o)throw new Error("envelope: Jupiter ATA token program mismatch");if(f!==n.inputMint&&f!==n.outputMint)throw new Error("envelope: Jupiter ATA mint mismatch");if(s!==we(r.owner,f,o))throw new Error("envelope: Jupiter ATA account mismatch");return{ata:s,debit:i}}function br(e,t,r,n,o){let i=G(t),a=H(t);if(i.length!==2||a.length!==12||a.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Jupiter system helper");let c=y(e,i[0],"wrap payer"),u=y(e,i[1],"wrap target"),s=a.readBigUInt64LE(4);if(c!==r.owner||u!==n)throw new Error("envelope: unsupported Jupiter wrap transfer");if(s!==o)throw new Error("envelope: Jupiter wrap transfer amount mismatch");return s}function vr(e,t,r,n){let o=G(t),i=H(t);if(i.length!==1)throw new Error("envelope: unsupported Jupiter token helper");if(i[0]===17){if(o.length!==1||y(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=y(e,o[0],"closeAccount source"),c=y(e,o[1],"closeAccount destination"),u=y(e,o[2],"closeAccount authority");if(a!==n||c!==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 Sr(e,t,r,n,o,i,a){let c=we(t.owner,t.artifact.inputMint,a);if(o.userSourceTokenAccount!==c)throw new Error("envelope: Jupiter source token account is not owner ATA");let u=A(r.jupiterAtaRentLamports,"jupiterAtaRentLamports");if(u<tr)throw new Error("policy: Jupiter ATA rent below the token-account rent-exempt minimum");let s=new Map,m=0n,f=!1,d=!1;for(let l of e.instructions){if(l===n)continue;let p=dr(e,l);if(p===Qt)Er(l,r);else if(p===Ue){let{ata:w,debit:h}=xr(e,l,t,t.artifact,a,u);s.set(w,h)}else if(p===me)m+=br(e,l,t,c,i);else if(p===a){let w=vr(e,l,t,c);w.kind==="syncNative"&&(f=!0),w.kind==="closeAccount"&&(d=!0)}else throw new Error("envelope: unsupported Jupiter helper instruction")}if(m>0n&&(!f||!d))throw new Error("envelope: Jupiter native wrap helpers incomplete");if(m!==0n&&m!==i)throw new Error("envelope: Jupiter native wrap amount mismatch");return[...s.values()].reduce((l,p)=>l+p,0n)}function Ar(e){let t;try{t=Zt().decode(or(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 yr(e,t,r){if(e.header.numSignerAccounts!==1||N(e.staticAccounts[0])!==t.owner||!L(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 n=[];for(let o of e.instructions){let i=N(e.staticAccounts[o.programAddressIndex]);if(!i||!L(i,r.programs))throw new Error("policy: Solana program not allowed");n.push(i)}return n}function Tr(e,t,r){let n=A(r.lamportsPerSignature,"lamportsPerSignature");if(n<er)throw new Error("policy: Solana per-signature fee is below the network minimum");let o=r.maxLamportsPerSignature===void 0?n:A(r.maxLamportsPerSignature,"maxLamportsPerSignature");if(n>o)throw new Error("policy: Solana per-signature fee exceeds cap");let i=BigInt(e.header.numSignerAccounts),a=i*n,c=i*o;if(t.exactFeeLamports!==void 0){let s=A(t.exactFeeLamports,"exactFeeLamports");if(s<a)throw new Error("policy: Solana exact fee below the base signature fee");if(s>c)throw new Error("policy: Solana exact fee exceeds the per-signature bound")}let u=c;if(u>A(r.maxFeeLamports,"maxFeeLamports"))throw new Error("policy: Solana fee exceeds cap");return u}function Nr(e,t,r,n){let o=0n,i=!1;for(let a of e.instructions){if(N(e.staticAccounts[a.programAddressIndex])!==me)throw new Error("envelope: unsupported Solana program decoder");let u=a.accountIndices||[];if(u.length!==2||N(e.staticAccounts[u[0]])!==t.owner)throw new Error("envelope: Solana transfer owner mismatch");let s=N(e.staticAccounts[u[1]]);if(s!==t.destination||!L(s,r.destinations))throw new Error("envelope: Solana destination mismatch");let m=Buffer.from(a.data||[]);if(m.length!==12||m.readUInt32LE(0)!==2)throw new Error("envelope: unsupported Solana system instruction");o+=m.readBigUInt64LE(4),i=!0}if(!i)throw new Error("envelope: Solana destination mismatch");if(o>A(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:o,programs:n}}function Ir(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!==Yt)throw new Error("envelope: Jupiter local signer requires native SOL input");if(o.outputMint!==t.destination||!L(o.outputMint,r.destinations))throw new Error("envelope: Jupiter output mint destination mismatch");let i=ir(r);if(!L(o.inputMint,i)||!L(o.outputMint,i))throw new Error("policy: Solana token not allowed");let a=A(o.inAmount,"inAmount"),c=A(o.outAmount,"outAmount"),u=A(o.otherAmountThreshold,"otherAmountThreshold");if(a<=0n||a>A(r.maxPerTradeLamports,"maxPerTradeLamports"))throw new Error("policy: Solana swap amount exceeds per-trade cap");if(a>A(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");if(c<=0n||u<=0n||u>c)throw new Error("envelope: Jupiter quote floor invalid");if(Number(o.slippageBps)!==Number(t.slippageBps))throw new Error("policy: Solana slippage mismatch");let s=N(o.jupiterProgram);if(!s||!L(s,r.programs)||!n.includes(s))throw new Error("policy: Jupiter program not allowed or absent");let m=e.instructions.filter(O=>N(e.staticAccounts[O.programAddressIndex])===s);if(m.length!==1)throw new Error("envelope: exactly one Jupiter swap instruction required");let f=m[0],d=hr(f.data,r);if(d.instruction==="shared_accounts_route"){let O=Array.isArray(r.jupiterSharedRouteIds)?r.jupiterSharedRouteIds.map(Number):[];if(!O.length)throw new Error("policy: Jupiter shared route id allowlist required");if(!O.includes(Number(d.routeId)))throw new Error("policy: Jupiter shared route id not allowed")}else if(d.routeId!=null)throw new Error("envelope: unexpected Jupiter shared route id");if(!pe(r.jupiterRoutePlanHashes,"Jupiter route-plan hash").includes(d.routePlanHash))throw new Error("policy: Jupiter route-plan hash not allowed");if(d.inAmount!==a)throw new Error("envelope: Jupiter route in_amount mismatch");if(d.quotedOutAmount!==c)throw new Error("envelope: Jupiter route quoted_out_amount mismatch");if(d.slippageBps!==Number(o.slippageBps))throw new Error("envelope: Jupiter route slippage mismatch");let l=d.quotedOutAmount-d.quotedOutAmount*BigInt(d.slippageBps)/10000n;if(u!==l)throw new Error("envelope: Jupiter otherAmountThreshold does not match serialized min-out");if(d.platformFeeBps!==0)throw new Error("policy: Jupiter platform fee not allowed");let p=gr(e,f,d),w=G(f),h=d.instruction==="shared_accounts_route"?2:1;if(!Ve(e,w[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!==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 E=Array.isArray(r.tokenPrograms)&&r.tokenPrograms.length?r.tokenPrograms:[Je];if(!L(p.tokenProgram,E))throw new Error("policy: Solana token program not allowed");let M=we(t.owner,o.outputMint,p.tokenProgram);if(p.userDestinationTokenAccount!==M)throw new Error("envelope: Jupiter destination token account is not owner ATA");let C=$e(p.destinationTokenAccount,s);if(C&&C!==M)throw new Error("envelope: Jupiter optional destination account redirects proceeds");if($e(p.platformFeeAccount,s))throw new Error("policy: Jupiter platform fee account not allowed");if(!pe(r.jupiterRouteAccountHashes,"Jupiter route account hash").includes(qe(e,f)))throw new Error("policy: Jupiter route account hash not allowed");let k=re(Buffer.from([d.instruction,d.routeId??"",d.routePlanHash,qe(e,f)].join(`
3
+ `)));if(!pe(r.jupiterRouteReviewHashes,"Jupiter route review hash").includes(k))throw new Error("policy: Jupiter route review hash not allowed");let J=Sr(e,t,r,f,p,a,p.tokenProgram),R=a+J;if(R>A(r.maxValueLamports,"maxValueLamports"))throw new Error("policy: Solana value exceeds cap");return{value:R,programs:n}}function Br(e,t){if(e.action!=="transfer"&&e.action!=="swap")throw new Error("envelope: Solana decoder requires transfer or swap action");let r=e?.artifact,n=e.action==="transfer"?["cluster","messageBase64","exactFeeLamports"]:["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(!L(r.cluster,t.chains))throw new Error("policy: chain not allowed");let o=Ar(r),i=yr(o,e,t),a=e.action==="transfer"?Nr(o,e,t,i):Ir(o,e,t,i),c=Tr(o,r,t);return Object.freeze({unit:"lamports",value:a.value.toString(),notional:(a.value+c).toString(),fee:c.toString(),programs:Object.freeze(a.programs)})}function De(e,t){let{unit:r,value:n,notional:o,fee:i}=Br(e,t);return Object.freeze({unit:r,value:n,notional:o,fee:i})}var He=new Set(["evm","evm-swap","evm-bridge","evm-nft","btc","sol"]);var ge=Object.freeze({swap:5,bridge:5,perps:0,nft:0,mint:0,transfer:0,approve:0}),Or=new Set(["0x0000000000000000000000000000000000000000","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"]),Ge=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"},"0x7b939232":{provider:"across-v3",action:"bridge",layout:"across-deposit-v3"}}),Lr=Object.freeze({"0x161ac21f":{provider:"opensea-nft",action:"mint",layout:"seadrop-mint-public"}}),_r=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 ne=(e,t,r=256)=>{if(typeof e!="string"||!e||e.length>r)throw new Error(`envelope: bounded ${t} required`);return e},g=(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`)}},je=(e,t)=>{let r=Number(e);if(!Number.isFinite(r))throw new Error(`policy: ${t} must be finite`);return r},Fr=(e,t)=>{if(!Array.isArray(e)||e.length===0)throw new Error(`policy: ${t} allowlist is empty`);return e},b=(e,t,r)=>{if(!Fr(t,r).map(n=>String(n).toLowerCase()).includes(String(e).toLowerCase()))throw new Error(`policy: ${r} not allowed`)},he=(e,t,r)=>{Array.isArray(t)&&t.length&&b(e,t,r)},F=(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},V=e=>String(e||"0x").slice(0,10).toLowerCase(),ze=e=>g(e.gasLimit,"gasLimit")*g(e.maxFeePerGas??e.gasPrice,"feePerGas")+g(e.l1FeeWei??0,"l1FeeWei")+g(e.operatorFeeWei??0,"operatorFeeWei");function K(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 I(e,t){if(!/^0{24}[0-9a-f]{40}$/.test(e))throw new Error(`envelope: malformed ${t} address`);return`0x${e.slice(24)}`}function _(e,t){try{return BigInt(`0x${e}`)}catch{throw new Error(`envelope: malformed ${t} integer`)}}function Mr(e){if(V(e)!=="0x095ea7b3")return null;let t=K(e,2,"approval");return{kind:"approval",spender:I(t.word(0),"approval spender"),amount:_(t.word(1),"approval amount")}}function Cr(e,t){let r=t==="router02-exact-input-single"?7:8,n=K(e,r,"Uniswap v3 exactInputSingle"),o=r===7?4:5;return{kind:"action",action:"swap",inputToken:I(n.word(0),"input token"),outputToken:I(n.word(1),"output token"),recipient:I(n.word(3),"recipient"),amountIn:_(n.word(o),"amountIn"),minimumOut:_(n.word(o+1),"amountOutMinimum")}}function kr(e){let t=K(e,12,"Across depositV3",{dynamicTail:!0}),r=_(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:I(t.word(0),"depositor"),recipient:I(t.word(1),"recipient"),inputToken:I(t.word(2),"input token"),outputToken:I(t.word(3),"output token"),amountIn:_(t.word(4),"inputAmount"),minimumOut:_(t.word(5),"outputAmount"),destinationChainId:_(t.word(6),"destinationChainId")}}function Rr(e,t){let r=V(e),n=Ge[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.action==="swap")return{...Cr(e,n.layout),selector:r,provider:n.provider};if(n.action==="bridge")return{...kr(e),selector:r,provider:n.provider};throw new Error("envelope: unsupported reviewed EVM action")}function qr(e){let t=K(e,4,"SeaDrop mintPublic");return{kind:"mint",action:"mint",contract:I(t.word(0),"mint NFT contract"),feeRecipient:I(t.word(1),"mint fee recipient"),recipient:I(t.word(2),"mint recipient"),quantity:_(t.word(3),"mint quantity")}}function Pr(e,t){let r=V(e);if(String(t).toLowerCase()==="nft-mint")return $r(e);let n=Lr[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{...qr(e),selector:r,provider:n.provider};throw new Error("envelope: unsupported reviewed NFT action")}function $r(e){let t=V(e);if(t==="0x40c10f19")throw new Error("envelope: ambiguous mint(address,uint256) calldata is not a built-in signer surface");let r=_r[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=K(e,1,"generic NFT mint");return{kind:"mint",action:"mint",selector:t,provider:"nft-mint",quantity:_(n.word(0),"mint quantity")}}throw new Error("envelope: unsupported generic NFT mint calldata")}function z(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 Ke(e,t,r,{nowMs:n=Date.now(),networkFees:o,requireNetworkFees:i=!1}={}){let a=F(e.owner,"owner"),c=e.artifact,u=Number(c?.chainId??z(e)[0]?.chainId);if(!Number.isSafeInteger(u)||u<=0)throw new Error("envelope: explicit batch chainId required");if(b(u,t.chains,"chain"),c?.owner!==void 0&&F(c.owner,"batch owner")!==a)throw new Error("envelope: explicit batch owner mismatch");let s=z(e);if(!s.length||s.length>8)throw new Error("envelope: bounded EVM transaction batch required");let m=0n,f=0n,d=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)!==u)throw new Error("envelope: every batch leg must use the same chain");if(F(l.from,"transaction owner")!==a)throw new Error("envelope: every batch leg must use the same owner");if(b(V(l.data),t.selectors,"selector"),m+=g(l.value??0,"value"),f+=g(l.gasLimit,"gasLimit"),d+=ze(l),q(u)&&(l.l1FeeWei===void 0||l.operatorFeeWei===void 0))throw new Error("policy: rollup EVM artifacts require l1FeeWei and operatorFeeWei")}if(m>g(t.maxValueWei,"maxValueWei"))throw new Error("policy: aggregate value exceeds cap");if(f>g(t.maxGasLimit,"maxGasLimit"))throw new Error("policy: aggregate gas exceeds cap");if(d>g(t.maxFeeWei,"maxFeeWei"))throw new Error("policy: aggregate fee exceeds cap");return{transactions:s,chainId:u,owner:a,totalValue:m,totalGas:f,totalFee:d}}function Xe(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=ne(e.provider,"provider",64).toLowerCase();b(i,t.providers,"provider");let a=Ke(e,t,o,{nowMs:r}),c=[],u=-1;for(let p=0;p<a.transactions.length;p++){let w=a.transactions[p],h=Mr(w.data),E;if(h){if(u!==-1)throw new Error("envelope: approval must be before action");if(g(w.value??0,"value")!==0n)throw new Error("envelope: approval cannot transfer native value");let k=F(w.to,"approval token");if(b(k,t.tokens,"token"),b(h.spender,t.spenders,"spender"),h.amount>g(t.maxApproval,"maxApproval"))throw new Error("policy: approval exceeds cap");E={...h,token:k,index:p}}else{if(u!==-1)throw new Error("envelope: exactly one swap/bridge action is supported per batch");b(w.to,t.destinations,"destination"),E={...Rr(w.data,i),target:F(w.to,"action target"),index:p},u=p}let M=g(w.value??0,"value"),C=g(w.gasLimit,"gasLimit");c.push({...E,value:M,gas:C,fee:ze(w)})}if(u<0)throw new Error("envelope: reviewed swap/bridge action required");let s=c[u],m=o==="evm-swap"?"swap":"bridge";if(s.action!==m||e.action!==m)throw new Error("envelope: surface/action/calldata mismatch");if(F(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(b(s.inputToken,t.tokens,"input token"),b(s.outputToken,t.tokens,"output token"),s.amountIn<=0n||s.amountIn>g(t.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(ce(e.autoSlippage,{nowMs:r,chainId:a.chainId,venue:i,tx:a.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(s.minimumOut!==g(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"))throw new Error("policy: decoded minimum output does not match authenticated quote");if(s.action==="bridge"&&g(e.toChainId,"toChainId")!==s.destinationChainId)throw new Error("envelope: decoded bridge destination chain mismatch");let f=c.filter(p=>p.kind==="approval");if(!new Set([...Or,...Array.isArray(t.nativeInputTokens)?t.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(f.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:g(e.autoSlippage.quoteAmountOut,"authenticated quote amountOut"),minAmountOut:g(e.autoSlippage.minAmountOut,"authenticated quote minAmountOut"),selectedBps:Number(e.autoSlippage.selectedBps),quotedAtMs:Number(e.autoSlippage.quotedAtMs),expiresAtMs:Number(e.autoSlippage.expiresAtMs)});return{...a,decoded:c,action:s,provider:i,authenticatedQuote:l}}function Ze(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 action");let n=ne(e.provider||e.artifact?.provider||"opensea-nft","provider",64).toLowerCase();he(n,t.providers,"provider");let o=e.artifact?.oraclePrepared===!0?e.artifact:e.prepared;o?.oraclePrepared===!0&&Be(o,{nowMs:r,providers:Array.isArray(t.providers)&&t.providers.length?t.providers:null,kinds:["nft-mint"],label:"local-signer"});let i=Ke(e,t,"evm-nft",{nowMs:r});if(i.transactions.length!==1)throw new Error("envelope: mint supports exactly one transaction");let a=i.transactions[0],c=V(a.data);b(c,t.selectors,"selector"),b(a.to,t.destinations,"destination");let u=Pr(a.data,n),s=F(e.contract??e.artifact?.contract,"NFT contract");if(he(s,t.nftContracts,"NFT contract"),(u.contract||F(a.to,"NFT contract"))!==s)throw new Error("envelope: mint calldata NFT contract mismatch");if(u.recipient&&u.recipient!==i.owner)throw new Error("envelope: mint calldata recipient mismatch");u.feeRecipient&&he(u.feeRecipient,t.nftFeeRecipients,"mint fee recipient");let f=g(e.quantity??e.artifact?.quantity,"quantity");if(f<=0n||f>g(t.maxMintQuantity??1,"maxMintQuantity"))throw new Error("policy: mint quantity exceeds cap");if(u.quantity!==f)throw new Error("envelope: mint calldata quantity mismatch");let d=g(e.totalWei??e.artifact?.totalWei,"totalWei");if(i.totalValue!==d)throw new Error("envelope: mint value does not match declared totalWei");if((e.priceWei!==void 0||e.artifact?.priceWei!==void 0)&&g(e.priceWei??e.artifact.priceWei,"priceWei")*f!==d)throw new Error("envelope: mint price does not match declared totalWei");if(d>g(t.maxMintTotalWei??t.maxValueWei,"maxMintTotalWei"))throw new Error("policy: mint total exceeds cap");return{...i,provider:n,decoded:[{...u,target:F(a.to,"mint target"),value:i.totalValue,gas:i.totalGas,fee:i.totalFee}]}}function Qe(e,{localsWaiver:t=!1}={}){if(!(e in ge))throw new Error("fee: unknown action");return t?0:ge[e]}function X(e,t,{nowMs:r=Date.now(),verifyFeeWaiver:n,routeAttestationSecret:o,networkFees:i,requireNetworkFees:a=!1}={}){if(!e||e.version!==1)throw new Error("envelope: version 1 required");let c=ne(e.surface,"surface",16);if(!He.has(c))throw new Error("envelope: unsupported public surface");let u=ne(e.action,"action",32);b(c,t.surfaces,"surface"),b(u,t.actions,"action"),b(e.owner,t.owners,"owner"),b(e.destination,t.destinations,"destination");let s=je(t.maxTtlMs,"maxTtlMs"),m=je(t.maxSlippageBps,"maxSlippageBps");if(!Number.isFinite(e.expiresAtMs)||e.expiresAtMs<=r||e.expiresAtMs-r>s)throw new Error("policy: TTL outside bounds");if(!Number.isFinite(e.slippageBps)||e.slippageBps<0||e.slippageBps>m)throw new Error("policy: slippage exceeds cap");let f=e.artifact;if(!f||typeof f!="object"||Array.isArray(f))throw new Error("envelope: structured artifact required");if(c==="evm-swap"||c==="evm-bridge")Xe(e,t,{nowMs:r,routeAttestationSecret:o});else if(c==="evm-nft")Ze(e,t,{nowMs:r});else if(c==="evm"){if(!["transfer","approve"].includes(u))throw new Error("envelope: generic evm requires transfer or approve; use strict evm-nft for mint action");if(u==="swap"||u==="bridge")throw new Error("envelope: surface/action mismatch; use strict decoded surface");if(String(f.to).toLowerCase()!==String(e.destination).toLowerCase())throw new Error("envelope: destination mismatch");if(String(f.from).toLowerCase()!==String(e.owner).toLowerCase())throw new Error("envelope: artifact from mismatch with owner");ee({...f,slippageBps:e.slippageBps,expiresAtMs:e.expiresAtMs},t,{nowMs:r,networkFees:i,requireNetworkFees:a});let p=String(f.data||"0x").toLowerCase(),w=g(f.value,"EVM value");if(p==="0x"){if(w===0n)throw new Error("envelope: native EVM transfer value required")}else if($(p)){if(w!==0n)throw new Error("envelope: EVM approval cannot transfer native value")}else throw new Error("envelope: unsupported generic EVM calldata")}else c==="btc"?Ce(e,t):c==="sol"&&De(e,t);let d=Number(e.fee?.oracleFeeBps)===0&&ge[u]!==0;if(e.fee?.waiver||d&&!e.fee?.waiverAttestation)throw new Error("fee: verified waiver attestation required");if(d&&(typeof n!="function"||n(e.fee.waiverAttestation,e)!==!0))throw new Error("fee: waiver attestation invalid");let l=Qe(u,{localsWaiver:d});if(Number(e.fee?.oracleFeeBps)!==l)throw new Error("fee: final artifact fee mismatch");return!0}var oe=Object.freeze([...He]),Wr=Object.freeze({...Ge});function Jr(e={}){let t={};for(let r of oe){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,a)=>n.broadcast(o,structuredClone(i),structuredClone(a))})}}return Object.freeze(t)}function Ur(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 Ao}from"@noble/curves/ed25519.js";import{base58 as Vr}from"@scure/base";import{RawTx as No,SigHash as Io,Transaction as Dr}from"@scure/btc-signer";import{Transaction as jr}from"ethers";var Ye=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 Hr(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 et(e,t){try{if(String(e).startsWith("evm"))return jr.from(t).hash;if(e==="btc"){let r=Ye(t);if(!r)return null;let n=Dr.fromPSBT(r);return n.finalize(),n.extract(),n.id}if(e==="sol"){let r=Ye(t);if(!r)return null;let n=Hr(r);if(!n||n.value!==1)return null;let o=r.subarray(n.offset,n.offset+64);return o.length===64?Vr.encode(o):null}}catch{}return null}var Xr=e=>String(e||"").toLowerCase();function P(e){return Gr("sha256").update(JSON.stringify(e)).digest("hex")}function ae(e,t,r={}){return ee(e,t,r)}async function Zr(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 rt(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 Qr(e,t={}){return renderConfirmationArtifact(e,P(e),t)}var Z=class{#e=new Map;constructor({now:t=Date.now}={}){this.now=t}issue({artifact:t,owner:r,ttlMs:n=6e4}){if(!Number.isFinite(n)||!Number.isInteger(n)||n<=0||n>12e4)throw new Error("confirmation: ttl out of range");let o=zr(32).toString("hex");return this.#e.set(o,{digest:P(t),owner:Xr(r),expiresAtMs:this.now()+n}),o}consume(t,r){let n=this.#e.get(String(t));if(!n)throw new Error("confirmation: used or unknown nonce");if(n.expiresAtMs<=this.now())throw this.#e.delete(String(t)),new Error("confirmation: expired nonce");let o=Buffer.from(n.digest,"hex"),i=Buffer.from(P(r),"hex");if(!Kr(o,i))throw new Error("confirmation: artifact mismatch");return this.#e.delete(String(t)),n}clear(){this.#e.clear()}};function Yr(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($(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 en(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 ie(e,t){let r=String(t||"");if(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=tt.decode(r);return n.length===64&&tt.encode(n)===r}catch{return!1}return!1}function nt(e,t,r){return!ie(e,t)||!ie(e,r)?!1:e==="sol"?String(t)===String(r):String(t).toLowerCase()===String(r).toLowerCase()}function tn(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 Ee({artifact:e,envelope:t,nonce:r,deps:n,policy:o,confirmation:i,consumeNonce:a,nowMs:c}){let u=tn(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,c())!==!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(a)return n.confirmations.consume(r,e);if(!i||!Number.isFinite(i.expiresAtMs)||i.expiresAtMs<=c())throw new Error("confirmation: expired nonce");return i}function rn(e){return e==="evm-swap"||e==="evm-bridge"||e==="evm-nft"}function nn(e,t){return e&&rn(e.surface)?z(e):[t]}function on(e,t){let r=e?.hash??null,n=e?.transactionHash??null;if(r!=null&&n!=null&&!nt(t,r,n))throw new Error("signer: receipt reports conflicting transaction hashes");return r||n||null}function an(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:en(r,n)}}async function xe(e,t,r){if(!r.isArmed())throw new Error("signer: disarmed");let n=e?.version===1&&e?.surface?e:null,o=n?n.artifact:(()=>{let{tradeId:h,...E}=e||{};return E})(),i=nn(n,o),a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,c=()=>typeof r.nowMs=="function"?r.nowMs():r.nowMs??Date.now(),u=await Ee({artifact:e,envelope:n,nonce:t,deps:r,policy:a,confirmation:null,consumeNonce:!0,nowMs:c}),s=P(e),m=(h={})=>{n?X(n,a,h):(ae(o,a,{nowMs:h.nowMs,networkFees:h.networkFees,requireNetworkFees:h.requireNetworkFees}),Yr(o))},f=async h=>{let E=n&&!String(n.surface||"").startsWith("evm")?void 0:await Zr(h,r);return{nowMs:c(),verifyFeeWaiver:r.verifyFeeWaiver,routeAttestationSecret:r.routeAttestationSecret,networkFees:E,requireNetworkFees:q(h?.chainId)}};m({nowMs:c(),verifyFeeWaiver:r.verifyFeeWaiver,routeAttestationSecret:r.routeAttestationSecret});for(let h of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof r[h]!="function")throw new Error(`signer: ${h} is required`);let d=r.reserveLedger(n||e,a);if(!d)throw new Error("signer: ledger reservation required");let l=!1,p=[];try{for(let h of i){if(typeof r.simulate!="function"||await r.simulate(h,n)!==!0)throw new Error("signer: strict affirmative simulation required");let E=await f(h);if(rt(h,E.networkFees,E.requireNetworkFees),!r.isArmed())throw new Error("signer: disarmed before signing");a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,u=await Ee({artifact:e,envelope:n,nonce:t,deps:r,policy:a,confirmation:u,consumeNonce:!1,nowMs:c}),m(E),r.validateReservation(d,a,n&&typeof r.decodeEconomics=="function"?r.decodeEconomics(n,a):void 0),l=!0;let M=await r.sign(h,n);if(typeof r.verifySigned!="function"||await r.verifySigned(M,h,n)!==!0)throw new Error("signer: signed bytes do not match confirmed artifact");if(!r.isArmed())throw new Error("signer: disarmed before broadcast");if(P(e)!==s)throw new Error("signer: artifact mutated after signing");a=typeof r.readPolicy=="function"?r.readPolicy():r.policy,u=await Ee({artifact:e,envelope:n,nonce:t,deps:r,policy:a,confirmation:u,consumeNonce:!1,nowMs:c});let C=await f(h);rt(h,C.networkFees,C.requireNetworkFees),m(C),r.validateReservation(d,a,n&&typeof r.decodeEconomics=="function"?r.decodeEconomics(n,a):void 0);let k=await r.broadcast(M,h,n),J=k?.status,R=n?.surface||"evm",O=on(k,R),at=et(R,M);if(!nt(R,O,at))throw new Error("signer: receipt transaction hash does not match signed bytes");if(J===0||J==="0x0")throw ie(R,O)?(r.settleFailedLedger(d),new Error("signer: broadcast did not return a successful receipt")):new Error("signer: failed broadcast requires a valid transaction hash");if(J!==1&&J!=="0x1")throw new Error("signer: broadcast did not return a successful receipt");if(!ie(R,O))throw new Error("signer: successful broadcast requires a valid transaction hash");p.push(an(k,O))}}catch(h){throw l||r.releaseLedger(d),h}if(r.commitLedger(d),p.length===1){let h={receipt:p[0]};return n?.surface==="evm-bridge"&&(h.originStatus="success",h.destinationStatus="unverified",h.destinationSuccess=!1,h.note="Origin-chain receipts do not prove destination-chain settlement."),h}let w={receipts:p,status:"success"};return n?.surface==="evm-bridge"&&(w.originStatus="success",w.destinationStatus="unverified",w.destinationSuccess=!1,w.note="Origin-chain receipts do not prove destination-chain settlement."),w}import sn from"node:http";import{timingSafeEqual as cn}from"node:crypto";var ot=new Set(["127.0.0.1","::1","localhost"]),un=(e,t)=>{let r=Buffer.from(String(e)),n=Buffer.from(String(t));return r.length===n.length&&cn(r,n)},v=(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 fn(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 it=e=>new Promise((t,r)=>{let n=0,o=[],i=!1;e.on("data",a=>{n+=a.length,n>64*1024&&!i?(i=!0,r(new Error("request refused")),e.resume()):i||o.push(a)}),e.on("end",()=>{if(!i)try{t(JSON.parse(Buffer.concat(o).toString()||"{}"))}catch{r(new Error("request refused"))}}),e.on("error",r)});function dn(e={}){let t=e.host||"127.0.0.1";if(!ot.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 i of["reserveLedger","validateReservation","commitLedger","releaseLedger","settleFailedLedger"])if(typeof e[i]!="function")throw new Error(`signer: ${i} is required`);if(typeof e.disarm!="function")throw new Error("signer: disarm callback is required");let r=e.confirmations||new Z,n=e.origin||`http://${t}`;return sn.createServer(async(i,a)=>{try{let c=String(i.headers.authorization||"").replace(/^Bearer /i,"");if(!un(c,e.token))return v(a,401,{error:"unauthorized"});let u=fn(i.headers.host);if(!ot.has(u))return v(a,403,{error:"host refused"});if(i.headers.origin&&i.headers.origin!==n)return v(a,403,{error:"origin refused"});if(i.method==="GET"&&i.url==="/status"){let s=typeof e.readPolicy=="function"?e.readPolicy():e.policy,m=new Set(oe),f=Array.isArray(s?.surfaces)?s.surfaces.filter(d=>typeof d=="string"&&m.has(d)):[];return v(a,200,{ok:!0,service:"oracle-signer",armed:e.isArmed?.()===!0,surfaces:f,sessionExpiresAtMs:e.sessionExpiresAtMs||null})}if(i.method==="POST"&&i.url==="/disarm")return e.disarm(),r.clear(),v(a,200,{ok:!0,armed:!1});if(!["GET","POST"].includes(i.method))return v(a,405,{error:"request refused"});if(i.method==="POST"&&String(i.headers["content-type"]||"").split(";",1)[0].trim().toLowerCase()!=="application/json")return v(a,415,{error:"request refused"});if(i.method==="POST"&&i.url==="/confirm"){if(e.autonomous===!0)return v(a,403,{error:"autonomous signer does not issue human confirmation nonces"});let s=await it(i),m=P(s.artifact),f=typeof e.readPolicy=="function"?e.readPolicy():e.policy;if(f?.confirmationMode!=="exact-human")return v(a,403,{error:"exact-human policy required"});let d=typeof e.nowMs=="function"?e.nowMs():Date.now();if(s.artifact?.version===1&&s.artifact?.surface)X(s.artifact,f,{nowMs:d,verifyFeeWaiver:e.verifyFeeWaiver});else{let{tradeId:l,...p}=s.artifact||{};ae(p,f,{nowMs:d})}return typeof e.confirmArtifact!="function"?v(a,403,{error:"local human confirmation unavailable"}):await e.confirmArtifact(s.artifact,m,f)!==!0?v(a,400,{error:"exact human confirmation refused"}):v(a,200,{confirmationNonce:r.issue({artifact:s.artifact,owner:s.artifact?.owner??s.artifact?.from,ttlMs:s.ttlMs})})}if(i.method==="POST"&&i.url==="/execute"){let s=await it(i),m=await xe(s.artifact,s.confirmationNonce,{...e,confirmations:r});return v(a,200,m)}return v(a,404,{error:"not found"})}catch(c){return e.onError?.(String(c?.message||c)),v(a,400,{error:"request refused"})}})}export{Z as ConfirmationStore,oe as PUBLIC_SIGNER_SURFACES,Wr as REVIEWED_EVM_SELECTORS,P as artifactDigest,ae as assertExactPolicy,dn as createSignerServer,Jr as createSurfaceAdapters,z as evmTransactions,xe as executeConfirmedArtifact,Qr as inspectArtifactForConfirmation,Xe as inspectEvmBatch,Ze as inspectEvmNft,Qe as publicFeeBps,Ur as surfaceAdapterFor,X as validateSurfaceEnvelope};