@spicenet-io/spiceflow-ui 4.14.4 → 4.15.0

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.
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ "use strict";var Ge=Object.create;var fe=Object.defineProperty;var He=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var Xe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ve(t))!Qe.call(e,o)&&o!==r&&fe(e,o,{get:()=>t[o],enumerable:!(n=He(t,o))||n.enumerable});return e};var Ke=(e,t,r)=>(r=e!=null?Ge(Ye(e)):{},Xe(t||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));const C=require("react/jsx-runtime"),y=require("react"),B=require("@spicenet-io/spiceflow-core"),me=require("@tanstack/react-query"),v=require("viem"),T=require("@privy-io/react-auth"),pe=require("wagmi"),Ze=require("viem/actions");function J(e,t){return!e||!t?!1:B.isNativeToken(e)&&B.isNativeToken(t)?!0:v.isAddress(e)&&v.isAddress(t)?v.getAddress(e)===v.getAddress(t):e.toLowerCase()===t.toLowerCase()}const et="0xcA11bde05977b3631167028862bE2a173976CA11",tt={4114:"0x860aFc632a6D625B95d8B96f39ECC48E988c6962"},rt=new Set([5115]);function nt(e){const t=tt[e.id]??(rt.has(e.id)?void 0:et);return v.defineChain({id:e.id,name:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:{default:{http:[e.rpcUrl]}},blockExplorers:{default:{name:e.displayName,url:e.blockExplorer}},testnet:e.network==="testnet",...t?{contracts:{multicall3:{address:t}}}:{}})}const at=[1,8453,42161,4114,4663,56,137,143,11155111,421614,84532,5115,123420001114,688688,688689,46630],G=Object.fromEntries(at.map(e=>B.getChainMeta(e)).filter(e=>e!=null).map(e=>[e.id,{...e,viemChain:nt(e),supportedTokens:B.getTokensForChain(e.id)}])),ot=G;let he={};const re=new Map,ge=e=>{he={...e||{}},re.clear()},H=(e,t=he)=>{const r=t[e];return r&&typeof r=="string"&&r.length>0?r:G[e]?.rpcUrl||void 0},M=e=>G[e],V=e=>{const t=B.getChainMeta(e);return t?.displayName||t?.name||`Chain ${e}`},st=e=>{const t=B.getDelegateContract(e);if(!t)throw new Error(`Unsupported chain ID: ${e}`);return t},it=(e,t,r)=>{const n=M(e);return n?.blockExplorer?`${n.blockExplorer}/tx/${t}`:"#"};async function lt(e,t){const r=`0x${t.toString(16)}`;try{await e.request({method:"wallet_switchEthereumChain",params:[{chainId:r}]});return}catch(a){if(!(a?.code===4902||typeof a?.message=="string"&&a.message.includes("Unrecognized chain ID")))throw a}const n=M(t);if(!n)throw new Error(`Cannot add unknown chain ${t} to wallet`);const o=H(t);if(!o)throw new Error(`Configure SpiceFlowProvider rpcOverrides[${t}] before adding this chain.`);await e.request({method:"wallet_addEthereumChain",params:[{chainId:r,chainName:n.name||`Chain ${t}`,nativeCurrency:n.nativeCurrency||{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:[o],blockExplorerUrls:n.blockExplorer?[n.blockExplorer]:void 0}]})}const ye=(e,t)=>{const r=M(e);if(!r)throw new Error(`Unsupported chain ID: ${e}`);const n=H(e,t);if(!n)throw new Error(`No RPC URL configured for chain ID: ${e}`);const o=`${e}:${n}`,a=re.get(o);if(a)return a;const s=v.createPublicClient({chain:r.viemChain,transport:v.http(n,{timeout:15e3,retryCount:2,retryDelay:300}),batch:{multicall:{wait:16}}});return re.set(o,s),s},ct=e=>{const t={};return Object.values(G).forEach(r=>{const n=H(r.id,e);n&&(t[r.id]={name:r.name,chain:r.viemChain,rpcUrl:n})}),t},dt=(e,t=[])=>{const r=M(e);if(!r)return[];const n=[];if(![11155111,421614,688689].includes(e)){const a=t.find(s=>s.chainId===e&&s.isNative);a?n.push(a):n.push({address:B.ZERO_ADDRESS,name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:void 0,isNative:!0,chainId:e})}if(!r.supportedTokens)return n;const o=n.some(a=>a.isNative);return r.supportedTokens.forEach(a=>{if(o&&B.isNativeToken(a.address))return;const s=t.find(l=>l.chainId===e&&J(l.address,a.address));s?n.push(s):n.push({address:a.address,name:a.name,symbol:a.symbol,decimals:a.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:a.logo,isNative:!1,chainId:e})}),n},ut=async(e,t,r)=>{const n=M(e);if(!n)throw new Error(`Unsupported chain ID: ${e}`);const o=t.toLowerCase(),a=n.supportedTokens?.find(l=>J(l.address,o));let s;if(B.isNativeToken(o)){if(n.nativeCurrency?.decimals==null)throw new Error(`Native currency decimals not configured for chain ${e}`);s=n.nativeCurrency.decimals}else if(a)s=a.decimals;else{if(!v.isAddress(t,{strict:!1}))throw new Error(`Could not determine decimals for invalid token address: ${t}`);const l=ye(e,r);try{s=await Ze.readContract(l,{address:v.getAddress(t),abi:v.erc20Abi,functionName:"decimals"})}catch(p){throw Object.assign(new Error(`Could not determine decimals for token ${t} on chain ${e}. Check the token contract and RPC configuration, then try again.`),{cause:p})}}if(!Number.isInteger(s)||s<0||s>255)throw new Error(`Invalid token decimals for ${t} on chain ${e}. Expected an integer from 0 to 255.`);return s},ft=e=>{const t=e?.wallet;if(t?.address&&t.walletClientType==="privy"&&t.connectorType==="embedded"&&!t.imported)return t.address},be=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getWalletClient=="function"){const r=t===void 0?[void 0]:[String(t),t,void 0];let n=null;for(const o of r)try{const a=await e.getWalletClient(o);if(a)return a}catch(a){n=a}if(n)throw n}if(typeof e.getEthereumProvider=="function"){const r=await e.getEthereumProvider(),n=t?M(t)?.viemChain:void 0;return v.createWalletClient({account:e.address,chain:n,transport:v.custom(r)})}throw new Error("Wallet client not available")},mt=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getEthereumProvider=="function")return e.getEthereumProvider();const r=await be(e,t);return{request:n=>r.request(n)}},Y=e=>e?.address?{address:e.address,wallet:e,getWalletClient:t=>be(e,t),getEthereumProvider:t=>mt(e,t)}:null,ne=()=>{const e=pe.useAccount(),t=e.status==="connected"?e.address:void 0,r=e.connector;let n=null,o=null;try{n=T.useWallets(),{user:o}=T.usePrivy()}catch{n=null,o=null}const a=n?.wallets||[],s=T.getEmbeddedConnectedWallet(a),l=s?.address?.toLowerCase(),p=a.find(g=>g.connectorType!=="embedded"&&g.address?.toLowerCase()!==l),c=t?.toLowerCase(),m=t&&r&&!(c&&l&&c===l)?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,d=t&&r?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,f=Y(s),u=Y(m)||Y(p),w=f?.address||ft(o),i=Y(d)||u;return{embeddedWallet:f,externalWallet:u,embeddedAddress:w,externalAddress:u?.address,activeWallet:i,activeAddress:i?.address}},pt={base:0,raised:1,sticky:10,overlay:20,popover:40,modal:1e3,dropdown:1100,toast:1200,tooltip:1300},ht={none:"0",sm:"4px",md:"6px",card:"8px",input:"10px",shell:"9px",modal:"12px",pill:"9999px",circle:"50%"},F={out:"cubic-bezier(0.22, 1, 0.36, 1)",inOut:"cubic-bezier(0.65, 0, 0.35, 1)",linear:"linear"},P={fast:"120ms",normal:"150ms",slow:"300ms",progress:"400ms"},gt={interactive:`transform ${P.normal} ${F.out}, box-shadow ${P.normal} ${F.out}, background-color ${P.normal} ${F.out}, border-color ${P.normal} ${F.out}, color ${P.normal} ${F.out}`,color:`background-color ${P.normal} ${F.out}, border-color ${P.normal} ${F.out}, color ${P.normal} ${F.out}`,popover:`opacity ${P.normal} ${F.out}, transform ${P.normal} ${F.out}`},Q={ui:'"Helvetica Neue", sans-serif',mono:'"IBM Plex Mono", monospace'};class R extends Error{constructor(t,r,n={}){super(r),this.code=t,this.context=n,this.name="SpiceflowError",Error.captureStackTrace&&Error.captureStackTrace(this,R)}}function ae(e){return e instanceof R}const yt=["user rejected","user denied","user cancelled","rejected the request","action_rejected","4001"];function we(e){if(!e)return"";if(typeof e=="string")return e;const t=e,r=t.message||t.reason||"",n=t.details||"";return`${r} ${n}`.trim()}const ve=e=>{if(ae(e))return e.code==="WALLET_REJECTED";const t=we(e).toLowerCase();return yt.some(r=>t.includes(r))};let oe=null;function bt(e){return oe?.message===e?oe.detail:void 0}const wt=(e,t="Something went wrong. Please try again.")=>{if(ve(e))return"Transaction was rejected.";if(ae(e)){const r=e.message||t,{requestId:n,httpStatus:o,responseBody:a,endpoint:s}=e.context;return(n||o||s)&&(oe={message:r,detail:{requestId:n,httpStatus:o,responseBody:a,endpoint:s}}),r}return we(e)||t},vt=[...B.DELEGATE_ABI,...B.ERC20_ABI,...B.spicenetEscrowAbi,...B.uniV3SwapRouterAbi];function se(e,t=0){return t>4||e==null?[]:typeof e=="string"?e.match(/0x[0-9a-fA-F]{8,}/g)??[]:Array.isArray(e)?e.flatMap(r=>se(r,t+1)):typeof e=="object"?Object.values(e).flatMap(r=>se(r,t+1)):[]}function xe(e){try{const t=v.decodeErrorResult({abi:vt,data:e});if(t.errorName==="Error")return String(t.args?.[0]??"");if(t.errorName==="Panic")return`Panic(${t.args?.[0]})`;if(t.errorName==="CallReverted"){const r=t.args?.[4],n=r&&r!=="0x"?xe(r):void 0;return n?`Call reverted: ${n}`:"Call reverted (no reason returned)"}return t.errorName}catch{try{const t=v.hexToString(e).replace(/\x00+$/g,"").trim();return/^[\x20-\x7e]+$/.test(t)&&t.length>1?t:void 0}catch{return}}}function xt(e){for(const t of se(e)){if(!v.isHex(t))continue;const r=xe(t);if(r)return r}}function Ee(e,t){const r=t.match(/Output amount (\d+) is insufficient after fees (\d+) on chain (\d+)/);if(!r)return t;const[,n,o,a]=r,s=Number(a),l=BigInt(n),p=BigInt(o);let c;for(const x of e.intents){const b=x.chainBatches.find(h=>h.chainId===s);if(b){c=b;break}}const m=c?.tokenTransfers.find(x=>x.from==="escrow"&&J(x.to,e.user)&&!B.isNativeToken(x.token)),d=V(s);if(!m)return`Amount is too small to cover the estimated fee on ${d}.`;const f=B.getTokenByAddress(m.token,s),u=f?.decimals??18,w=f?.symbol??"tokens",i=v.formatUnits(l,u),g=v.formatUnits(p,u);return`Amount is too small to cover the estimated fee on ${d}. Amount: ${i} ${w}. Estimated fee: ${g} ${w}.`}function Et(e){return e?.code===4902||e?.name==="ChainNotConfiguredError"?"This network is not configured in your wallet. Please add it manually to continue.":e?.code===4001?"Network switch cancelled. Please switch manually in your wallet to continue.":"Unable to switch network. Please switch manually in your wallet to continue."}const Ct="https://tx-submission-api.spicenet.io",Ce=Ct;function $t(e,t){return typeof t=="bigint"?t.toString():t}function O(e,t=""){if(Array.isArray(e))e.forEach((r,n)=>O(r,`${t}[${n}]`));else if(e&&typeof e=="object")for(const[r,n]of Object.entries(e)){const o=t?`${t}.${r}`:r;if(!n&&(r==="user"||r==="to"||r==="from"||r==="address"))throw new R("INVALID_PARAMS",`Wallet not ready: ${o} is missing from the request. Wait a moment and retry, or log in again.`,{path:o});O(n,o)}}async function X(e,t){const r={...t?.headers},n=(t?.method??"GET").toUpperCase();(t?.body!=null||n!=="GET"&&n!=="HEAD")&&(r["x-request-id"]??(r["x-request-id"]=crypto.randomUUID()));const o=await fetch(e,{...t,headers:r}),a=o.headers.get("x-request-id")??"";return Object.assign(o,{requestId:a})}function j(e,t){if(!e)return t;const r=e.error,n=(typeof e.message=="string"?e.message:"")||(r&&typeof r=="object"&&"message"in r&&typeof r.message=="string"?r.message:"")||(typeof r=="string"?r:"")||t,o=xt(e);return o&&!n.includes(o)?`${n} \u2014 ${o}`:n}async function kt(e){try{return await e.json()}catch{return null}}function Bt(e){return(Array.isArray(e?.balances)?e.balances:[]).flatMap(t=>{if(!t||typeof t!="object")return[];const r=t;return[{receiptToken:typeof r.receiptToken=="string"?r.receiptToken:void 0,tokenName:String(r.tokenName??""),balanceAvailable:String(r.balanceAvailable??"0"),chainTokens:Array.isArray(r.chainTokens)?r.chainTokens.filter(n=>typeof n=="string"):r.chainTokens&&typeof r.chainTokens=="object"?r.chainTokens:r.chainTokenConfig&&typeof r.chainTokenConfig=="object"?r.chainTokenConfig:void 0,decimals:typeof r.decimals=="number"?r.decimals:void 0,balanceUsd:typeof r.balanceUsd=="number"||typeof r.balanceUsd=="string"?r.balanceUsd:null}]})}class At{constructor(){this.baseUrl=Ce,this.feeValidationAvailable=!1}setBaseUrl(t){t!==this.baseUrl&&(this.feeValidationAvailable=!1),this.baseUrl=t}getBaseUrl(){return this.baseUrl}async requestJson(t,r){const n=`${this.baseUrl}${t}`,o=await X(n,r.method&&r.method!=="GET"?{method:r.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(r.body,$t),signal:r.signal}:{signal:r.signal}),a=await o.json();if(!o.ok||a.success===!1||r.ok&&!r.ok(a)){const s=j(a,r.fallbackError(o.status));throw new R(r.code??"RELAYER_ERROR",r.mapError?r.mapError(s):s,{httpStatus:o.status,requestId:o.requestId,responseBody:JSON.stringify(a),endpoint:t,...r.context})}return a}async createLimitOrder(t){return this.requestJson("/orders",{method:"POST",body:t,fallbackError:r=>`Order registration failed: ${r}`})}async getLimitOrder(t){return this.requestJson(`/orders/${encodeURIComponent(t)}`,{fallbackError:r=>`Order lookup failed: ${r}`})}async listLimitOrders(t,r){const n=new URLSearchParams({user:t,...r?{after:r}:{}});return this.requestJson(`/orders?${n}`,{fallbackError:o=>`Order listing failed: ${o}`})}async cancelLimitOrder(t,r){return this.requestJson(`/orders/${encodeURIComponent(t)}/cancel`,{method:"POST",body:{signature:r},fallbackError:n=>`Order cancellation failed: ${n}`})}async createAction(t){return O(t),this.requestJson("/actions",{method:"POST",body:t,fallbackError:r=>`Relayer API error: ${r}`})}async estimateActionFees(t,r){O(t);const n=this.baseUrl,o=await this.requestJson("/actions/fees/estimate",{method:"POST",body:t,signal:r?.signal,fallbackError:a=>`Relayer fee estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.feeEstimate,mapError:a=>Ee(t,a)});return n===this.baseUrl&&(this.feeValidationAvailable=o.data?.supportsFeeValidation===!0),o.data.feeEstimate}canValidateActionFees(){return this.feeValidationAvailable}async validateActionFees(t,r){return O(t),(await this.requestJson("/actions/fees/validate",{method:"POST",body:t,signal:r?.signal,fallbackError:n=>`Relayer fee validation error: ${n}`,ok:n=>!!n.success&&!!n.data?.feeEstimate,mapError:n=>Ee(t,n)})).data.feeEstimate}async estimateBatchGas(t){O(t);const{signal:r,...n}=t,o=await this.requestJson("/actions/gas/estimate",{method:"POST",body:n,signal:r,fallbackError:a=>`Relayer gas estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.gasFee});return{gasFee:BigInt(o.data.gasFee),gasQuoteSource:o.data.gasQuoteSource,simulationVerified:o.data.simulationVerified===!0,platformFee:o.data.platformFee===void 0?void 0:BigInt(o.data.platformFee)}}async executeStep(t,r,n,o){const a=`${this.baseUrl}/actions/${t}/intents/${r}/steps/${n}`,s=`/actions/${t}/intents/${r}/steps/${n}`,l=crypto.randomUUID(),p=3e4,c=new Promise((f,u)=>setTimeout(()=>u(new R("RELAYER_EXECUTE_ERROR",`Execute step request timed out after ${p/1e3}s`,{actionId:t,intentIndex:r,stepIndex:n,endpoint:s,requestId:l})),p)),m=await Promise.race([X(a,{method:"POST",headers:{"Content-Type":"application/json","x-request-id":l},body:JSON.stringify(o)}),c]),d=await m.json();if(!m.ok||d.success===!1)throw new R("RELAYER_EXECUTE_ERROR",j(d,`Execute step error: ${m.status}`),{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t});if(d?.status==="error"||d?.status==="reverted"){const f=j(d,""),u=f?`: ${f}`:"";throw new R("RELAYER_EXECUTE_ERROR",`Step ${n} previously ${d.status}${u}`,{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t,intentIndex:r,stepIndex:n,stepStatus:d.status})}return{success:!0,status:d.status,transactionHash:d.transactionHash}}async checkStepStatus(t,r){const n=t.split("/"),o=n[0],a=n.length>=2?n[1]:"0",s=await this.requestJson(`/actions/${o}/intents/${a}/steps/${r}`,{fallbackError:l=>`Intent step status check failed: ${l}`,code:"RELAYER_STATUS_ERROR",context:{intentId:t}});return{success:!0,data:{status:s.status==="error"?"reverted":s.status,transactionHash:s.txid,error:j(s,"")}}}async createWallet(t,r){return this.requestJson(`/wallets/${t}`,{method:"PUT",body:r,fallbackError:n=>`Create wallet error: ${n}`})}async getWallet(t){return this.requestJson(`/wallets/${t}`,{fallbackError:r=>`Get wallet error: ${r}`})}async createWithdrawal(t){return this.requestJson("/withdrawals",{method:"POST",body:t,fallbackError:r=>`Create withdrawal error: ${r}`})}async getWithdrawal(t){return this.requestJson(`/withdrawals/${t}`,{fallbackError:r=>`Get withdrawal error: ${r}`})}async getRollupTimestamp(){return this.requestJson("/time",{fallbackError:t=>`Get rollup timestamp error: ${t}`})}}const W=new At;async function St(e){const t=`${W.getBaseUrl()}/wallets/${e}/balance`,r=await X(t,{cache:"no-store"}),n=await kt(r);if(!r.ok||n?.success===!1)throw new R("RELAYER_ERROR",j(n,`Unable to verify Spice balance: ${r.status}`),{httpStatus:r.status,requestId:r.requestId,responseBody:JSON.stringify(n),endpoint:`/wallets/${e}/balance`});return Bt(n)}const ie=new Map,K=new Set;function le(e){return JSON.stringify([W.getBaseUrl(),e.toLowerCase()])}function D(e,t){if(le(e)!==t)throw new Error("Wallet backend changed during registration. Please retry.")}function It(e){if(!(e instanceof R))return!1;const t=e.context.httpStatus;return t===400||t===404?`${e.message} ${String(e.context.responseBody??"")}`.toLowerCase().includes("not found"):!1}async function $e(e){const t=le(e);if(K.has(t))return!0;try{return await W.getWallet(e),D(e,t),K.add(t),!0}catch(r){if(!It(r))throw r;return!1}}async function ke(e,t){const r=le(e);if(K.has(r))return;const n=ie.get(r);if(n)return n;const o=(async()=>{const a=await $e(e);if(D(e,r),a)return;const{unix_timestamp:s}=await W.getRollupTimestamp();D(e,r);const l=`I am creating a new smart wallet and adding an admin wallet ethereum:0x${e.slice(2).toLowerCase()}. Nonce: ${s}`,p=await t(l);D(e,r);const c=typeof p=="string"?p:p.signature;if(!c)throw new Error("Wallet returned no smart wallet signature");await W.createWallet(e,{timestamp:s,signature:c}),D(e,r),K.add(r)})();ie.set(r,o);try{await o}finally{ie.delete(r)}}const Tt=(e,t)=>{const r=o=>t?t(o):V(o),n=[];return e.forEach((o,a)=>{const s=o.calls&&o.calls.length>0,l=o.tokenTransfers&&o.tokenTransfers.length>0;!s&&!l||n.push({stepId:a,status:a===0?"processing":"pending",chainId:o.chainId,chainName:r(o.chainId),description:"Processing transaction"})}),n},Be=()=>{const e=y.useContext(ee),t=e?.mode,{isConnected:r,address:n}=pe.useAccount();let o=null,a=null,s=null,l=null,p=null;try{o=T.usePrivy(),a=T.useSign7702Authorization(),s=T.useSignMessage(),l=T.useWallets()}catch(h){p=h instanceof Error?h.message:String(h)}if(p)return t==="ondemand"&&r&&n?{isReady:!0,isAuthenticated:!0,isConnected:!0,address:n,provider:"privy",actions:{signAuthorization:async()=>{throw new Error("Not available in ondemand mode")},signMessage:async()=>{throw new Error("Not available in ondemand mode")},getEthereumProvider:async()=>{throw new Error("Not available in ondemand mode")}}}:{isReady:!1,isAuthenticated:!1,isConnected:!1,provider:null,actions:{signAuthorization:async()=>{throw new Error("Privy not available")},signMessage:async()=>{throw new Error("Privy not available")},getEthereumProvider:async()=>{throw new Error("Privy not available")}}};const{ready:c=!1,authenticated:m=!1}=o||{},d=e?.embeddedWalletAddress,f=T.getEmbeddedConnectedWallet(l?.wallets||[]),u=d||f?.address,w=!!u&&!!f,i={isReady:t==="ondemand"?!0:c,isAuthenticated:t==="ondemand"?!0:m||w,isConnected:t==="ondemand"?r&&!!n||c&&(m||w)&&w:c&&w,address:t==="ondemand"&&r?n:u,provider:"privy"},g=async(h,$)=>{if(!f)throw new Error("Embedded wallet not available");const k=await f.getEthereumProvider(),{createWalletClient:S,custom:E}=await import("viem"),N=S({account:f.address,transport:E(k)});return $?.(),{signature:await N.signMessage({account:f.address,message:h})}},x=async h=>{if(s)try{return{signature:(await s.signMessage({message:h})).signature}}catch($){if(!f)throw $}if(!f)throw new Error("Privy sign message not available");return g(h)},b=async()=>{if(!u)throw new Error("Embedded wallet not available for smart wallet setup");await ke(u,x)};return{...i,actions:{prepareSigning:async()=>{if(!u)throw new Error("Embedded wallet not available");await $e(u)},signAuthorization:async(h,$)=>{if(!a)throw new Error("Privy sign authorization not available");try{await b(),$?.();const k=await a.signAuthorization({contractAddress:h.contractAddress,chainId:h.chainId,nonce:h.nonce},{address:u});return delete k.v,k}catch(k){const S=typeof k?.message=="string"?k.message:String(k?.message??k??"");throw S.includes("not configured")||S.includes("chain")?new Error(`Chain ${h.chainId} is not configured in PrivyProvider. Add this chain to your Privy dashboard or supportedChainIds.`):k}},signMessage:async(h,$)=>{if(typeof h=="object"&&"raw"in h){if(await b(),!f)throw new Error("Embedded wallet not available for raw signing");return g(h,$)}return $?.(),x(h)},getEthereumProvider:async()=>{if(!f)throw new Error("Embedded wallet not available");return f.getEthereumProvider()}}}},Ft="https://portal-api.spicenet.io/api/v1",ce=e=>e.replace(/\/+$/,""),Pt=(e,t)=>`${e}:${t}`;async function Rt(e,t){const r=new URLSearchParams({walletAddress:t,campaignId:"spicenet-portal",campaignGroup:"1"}),n=await fetch(`${e}/portal/mainnet/linked-portal-wallet?${r.toString()}`,{cache:"no-store"});if(!n.ok){if(n.status>=500){const o=new Error(`Failed to resolve linked portal wallet: ${n.status}`);throw o.status=n.status,o}return null}return(await n.json()).portalWalletAddress?.toLowerCase()??null}async function Nt(e,t,r){const n=new URLSearchParams({walletAddress:t,campaignId:r.campaignId,campaignGroup:r.campaignGroup,partnerId:r.partnerId}),o=await fetch(`${e}/portal/mainnet/whitelist/check?${n.toString()}`,{cache:"no-store"});if(!o.ok){const a=new Error(`Failed to check whitelist: ${o.status}`);throw a.status=o.status,a}return await o.json()}async function Wt(e,t,r,n){const o=await fetch(`${e}/portal/mainnet/link-wallet`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({campaignId:t.campaignId,campaignGroup:t.campaignGroup,partnerId:t.partnerId,externalWalletAddress:r,embeddedWalletAddress:n})});if(!o.ok)throw new Error(`Failed to link wallet: ${o.status}`)}function Ae({walletAddress:e,campaignId:t,campaignGroup:r,partnerId:n,apiBaseUrl:o=Ft,enabled:a=!0,staleTime:s=5*60*1e3,refetchInterval:l=!1}={}){const{isAuthenticated:p,isConnected:c}=Be(),{externalAddress:m,embeddedAddress:d}=ne(),f=e??m,u=typeof f=="string"?f.toLowerCase():void 0,w=typeof d=="string"?d.toLowerCase():void 0,i=typeof m=="string"?m.toLowerCase():void 0,g=a&&p&&c&&!!m&&!!u&&v.isAddress(u)&&!!t&&!!r&&!!n,x=y.useMemo(()=>["partner-whitelist","check",u,t,r,n,ce(o)],[u,t,r,n,o]),b=me.useQuery({queryKey:x,enabled:g,staleTime:s,refetchInterval:l,retry:(E,N)=>{const I=N?.status;return typeof I=="number"&&I>=400&&I<500?!1:E<3},retryDelay:E=>Math.min(1e3*2**E,15e3),queryFn:async()=>{if(!u||!v.isAddress(u))throw new Error("A valid wallet address is required");if(!t||!r||!n)throw new Error("campaignId, campaignGroup, and partnerId are required");const E=ce(o),N={campaignId:t,campaignGroup:r,partnerId:n},I=await Rt(E,u);return I?Nt(E,I,N):{walletAddress:u,campaignId:t,campaignGroup:r,partnerId:n,isWhitelisted:!1,isLinkedWallet:!1,whitelistedWalletAddress:null,externalWalletAddress:u}}}),h=a&&p&&c&&!!i&&v.isAddress(i)&&!!w&&v.isAddress(w)&&!!t&&!!r&&!!n,$=me.useMutation({mutationFn:E=>Wt(ce(o),{campaignId:t,campaignGroup:r,partnerId:n},E.external,E.embedded)}),k=y.useRef(new Set),S=$.mutate;return y.useEffect(()=>{if(!h||!i||!w||!t||!r||!n)return;const E=Pt(i,w);k.current.has(E)||(k.current.add(E),S({external:i,embedded:w}))},[h,i,w,t,r,n,S]),{isWhitelisted:b.data?.isWhitelisted??!1,whitelistCheck:b.data,checkedWalletAddress:u,externalWalletAddress:m,embeddedWalletAddress:d,isExternalWalletConnected:!!m,isWhitelistCheckEnabled:g,linkWallet:$,isWalletLinked:$.isSuccess,...b}}const Se={assets:[],loading:!1,refreshing:!1,error:null,updatedAt:null};function Ie(){const e=new Map,t=new Map,r=new WeakMap;let n=0;function o(){let a=Se;const s=new Map;let l,p=null,c=0,m=!1,d;const f=()=>s.forEach((i,g)=>g()),u=()=>{if(!d||!s.size)return Promise.resolve();if(p)return p;const i=++c;return a={...a,loading:a.updatedAt===null,refreshing:!0},f(),p=Promise.resolve().then(d).then(g=>{if(i!==c)return;const{assets:x,error:b=null}=Array.isArray(g)?{assets:g}:g;a={assets:x,loading:!1,refreshing:!1,error:b,updatedAt:Date.now()}},g=>{i===c&&(a={...a,loading:!1,refreshing:!1,error:g instanceof Error?g.message:"Unable to refresh balances"})}).finally(()=>{i===c&&(p=null,f(),m&&(m=!1,u()))}),p},w=()=>{clearInterval(l);const i=[...s.values()].filter(g=>g>0);i.length&&(l=setInterval(()=>void u(),Math.min(...i)))};return{snapshot:()=>a,refresh:u,invalidate:()=>p?(m=!0,p.then(()=>p??Promise.resolve())):u(),subscribe(i,g,x){return d=g,s.set(i,x),w(),u(),()=>{s.delete(i),w(),s.size||(c++,p=null,m=!1,a={...a,loading:!1,refreshing:!1})}}}}return{entry(a){let s=e.get(a);return s||(s=o(),e.set(a,s)),s},fetcherId(a){return r.has(a)||r.set(a,++n),r.get(a)},registerTokens(a){let s=!1;for(const l of a){const p=`${l.chainId}:${l.address.toLowerCase()}`;t.has(p)||(t.set(p,l),s=!0)}s&&e.forEach(l=>l.invalidate())},tokens:()=>[...t.values()],invalidate:()=>Promise.all([...e.values()].map(a=>a.invalidate())).then(()=>{})}}function Te(e,t){return e<=0n||t<=0n?0n:(e*t+10000n-1n)/10000n}function Ut(e,t,r){const n=(e>t?e-t:0n)*10000n/(10000n+r),o=Te(n,r),a=n>0n,s=a?o+t:0n;return{netAmount:n,spicenetFee:a?o:0n,totalFee:s,grossAmount:n+s,coversFees:a}}function Lt(e,t,r){if(e===t)return!0;const n=e>t?e:t;return n===0n?!1:(e>t?e-t:t-e)*10000n<=n*r}function de(e=4e3){if(!Number.isInteger(e)||e<0||e>1e4)throw new Error("feeToleranceBps must be an integer between 0 and 10000");return e}function Fe(e,t,r){const n=BigInt(de(r));return(e>t?e-t:t-e)*10000n<=e*n}function Mt(e,t,r){return["gasFee","spicenetFee","bridgeFee"].every(n=>Fe(e[n]??0n,t[n]??0n,r))}function qt(e,t){const r=v.formatUnits(e,t);return r.includes(".")?r.replace(/\.?0+$/,"")||"0":r}function Z(e){const t=BigInt(e.feeBreakdown.spicenetFee),r=BigInt(e.feeBreakdown.gasFee),n=BigInt(e.feeBreakdown.bridgeFee??"0"),o=t+r+n;return{spicenetFee:t,gasFee:r,bridgeFee:n,totalFee:o}}function Ot(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=Z(e);return t>0n||r>0n||n>0n}function jt(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=Z(e),o=t+n;return r>o?r:o}function Dt(e){const t=[];for(const r of e.intents)for(const n of r.batches)t.push(BigInt(n.quotedAmount));return t.length!==1?null:t[0]}function _t(e,t,r){return e.length===0||!e.every(n=>n.domain!=="spicenet"&&!n.tokenTransfers?.length)?null:{...t,grossAmount:r,netAmount:r,totalFee:0n,gasFee:0n,spicenetFee:0n,bridgeFee:0n,gasQuoteSource:"static_zero"}}function zt(e,t){const r=e.intents.flatMap(m=>m.batches).filter(Ot);if(r.length===0)return null;const n=r.filter(m=>m.chainId===t.chainId),o=n.length>0?n:r;if(o.length>1)return null;const a=o[0],{gasFee:s,spicenetFee:l,bridgeFee:p,totalFee:c}=Z(a);return{chainId:a.chainId,tokenAddress:t.tokenAddress,symbol:t.symbol,decimals:t.decimals,grossAmount:jt(a),netAmount:BigInt(a.quotedAmount),totalFee:c,gasFee:s,spicenetFee:l,bridgeFee:p,gasQuoteSource:a.gasQuoteSource}}const Pe=(e,t=4)=>!isFinite(e)||e===0?"0":e>0&&e<1e-6?e.toFixed(12).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e<1e-4?e.toFixed(8).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e.toFixed(t).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),Jt=e=>isFinite(e)?e>0&&e<.01?"<$0.01":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e):"$0.00",Re=(e,t=6,r=4)=>e.length<=t+r?e:`${e.slice(0,t)}...${e.slice(-r)}`,Gt=(e,t)=>{const r=e.replace(/[^0-9.]/g,"").split("."),n=r[0]??"",o=r.slice(1).join(""),a=typeof t=="number"?Math.max(0,Math.min(t,18)):null;return r.length===1?n:`${n}.${a===null?o:o.slice(0,a)}`},Ht=(e,t=6)=>!Number.isFinite(e)||e<=0?"0":e.toFixed(Math.min(Math.max(t,0),18)).replace(/\.?0+$/,""),Vt=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.error("Failed to copy to clipboard:",t),!1}};function Yt(e,t){return t?.length?t.some(r=>{const n=r.toLowerCase();return n===e.symbol.toLowerCase()||B.normalizeNativeTokenAddress(n).toLowerCase()===B.normalizeNativeTokenAddress(e.address).toLowerCase()||n===e.displaySymbol?.toLowerCase()||n===e.receiptTokenName?.toLowerCase()||n==="native"&&(e.isNative||B.isNativeToken(e.address))}):!0}function Ne(e){return e.displaySymbol||e.symbol}function We(e){return e.displayName||e.displaySymbol||e.name||e.symbol}function Qt(e,t){const r=e.location==="rollup"||e._source==="spice"||!!e.receiptTokenId&&!e.location&&!e._source,n=a=>a&&t?Object.entries(t).find(([s])=>s.toLowerCase()===a.toLowerCase())?.[1]:void 0,o=r?n(e.receiptTokenId)??n(e.receiptTokenName):void 0;return{symbol:o?.symbol||o?.name||Ne(e),name:o?.name||o?.symbol||We({...e,name:e.name||""}),logoURI:o?.logoURI===void 0?e.logoURI:o.logoURI||null}}function Xt(e){return e.displayChainName||V(e.chainId)}function Kt(e){if(e.balance===0n)return"0";const t=v.formatUnits(e.balance,e.decimals),r=Pe(Number(t));return Number(r)===0?t:r}const Ue=y.createContext(void 0);function Zt(){const e=y.useContext(Ue);return y.useCallback(t=>Qt(t,e),[e])}const er=["__spicenet_whitelist_blocked__"],Le="spiceflow-mode",Me=()=>{if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Le);return e==="7702"?"7702":e==="non7702"?"ondemand":e==="embedded"?"7702":e==="external"?"ondemand":null}catch{return null}},tr=e=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Le,e==="7702"?"7702":"non7702")}catch{}},rr=()=>Me()!==null,qe=y.createContext(null),ee=y.createContext(null),nr=({children:e,value:t,whitelist:r})=>{const n=!!r&&r.enabled!==!1,{isWhitelisted:o,isLoading:a,whitelistCheck:s}=Ae(n?r:{enabled:!1}),l=n&&!o,p=y.useMemo(()=>({...t,mode:l?"ondemand":t.mode,allowedTokens:l?er:t.allowedTokens,isUserWhitelisted:o,isWhitelistChecking:a,isWhitelistConfigured:n,isWhitelistGateActive:l,whitelistCheck:s}),[t,n,l,o,a,s]);return C.jsx(ee.Provider,{value:p,children:e})},ar=({feeToleranceBps:e,children:t,provider:r="privy",supportedChainIds:n,allowedTokens:o,network:a="testnet",mode:s,skipFlow:l=[],nativeChainId:p,appName:c="Spicenet",apiUrl:m,theme:d,rpcOverrides:f,swapper:u,liquidityVenues:w,additionalSourceTokens:i,whitelist:g,assetDisplay:x})=>{const b=de(e);y.useEffect(()=>{if(!m)return;const q=W.getBaseUrl();return W.setBaseUrl(m),()=>W.setBaseUrl(q)},[m]),y.useEffect(()=>(ge(f),()=>ge(void 0)),[f]);const h=y.useMemo(()=>B.getChainIdsByNetwork(a),[a]),$=n??h,k=d??null,[S,E]=y.useState(()=>s??Me()??"7702");y.useEffect(()=>{s&&E(s)},[s]);const N=y.useCallback(q=>{if(s){E(s);return}E(q),tr(q)},[s]),{embeddedAddress:I,externalAddress:A}=ne(),z=JSON.stringify(f),U=y.useMemo(Ie,[a,m,z,r]),L=y.useMemo(()=>({feeToleranceBps:b,inventory:U,provider:r,supportedChainIds:$,allowedTokens:o,skipFlow:l,mode:S,setMode:N,network:a,nativeChainId:p,appName:c,apiUrl:m,rpcOverrides:f,swapper:u,liquidityVenues:w,additionalSourceTokens:i,embeddedWalletAddress:I,externalWalletAddress:A,isUserWhitelisted:null,isWhitelistChecking:!1,isWhitelistConfigured:!1,isWhitelistGateActive:!1}),[U,b,r,$,o,l,S,N,a,p,c,m,f,u,w,i,I,A]);return C.jsx(qe.Provider,{value:k,children:C.jsx(ee.Provider,{value:L,children:C.jsx(nr,{value:L,whitelist:g,children:C.jsx(Ue.Provider,{value:x,children:t})})})})},or={spacing:{xs:"0.25rem",sm:"0.5rem",md:"1rem",lg:"1.5rem",xl:"2rem"},borderRadius:{sm:"0.25rem",md:"0.5rem",lg:"0.75rem",full:"9999px"},typography:{fontFamily:Q.ui,fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.75rem"},fontWeight:{normal:400,medium:500,semibold:600,bold:700}},shadows:{sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)",md:"0 4px 6px -1px rgb(0 0 0 / 0.1)",lg:"0 10px 15px -3px rgb(0 0 0 / 0.1)"},animation:{fast:"150ms ease-in-out",normal:"200ms ease-in-out",slow:"300ms ease-in-out"}},sr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#f3f4f6",background:"#ffffff",surface:"#f9fafb",surfaceHover:"#f3f4f6",border:"#e5e7eb",borderHover:"#d1d5db",text:"#111827",textSecondary:"#374151",textMuted:"#6b7280",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},ir={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#171717",background:"#141414",surface:"#1e1e1e",surfaceHover:"#2a2a2a",border:"#2d2d2d",borderHover:"#3a3a3a",text:"#ffffff",textSecondary:"#888888",textMuted:"#666666",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},Oe=(e="light")=>({mode:e,...or,colors:e==="light"?sr:ir});function te(e,t){const r=e.replace("#",""),n=Math.max(0,Math.round(parseInt(r.substring(0,2),16)*(1-t))),o=Math.max(0,Math.round(parseInt(r.substring(2,4),16)*(1-t))),a=Math.max(0,Math.round(parseInt(r.substring(4,6),16)*(1-t)));return`#${n.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function lr(e,t){return{shell:t?.shell??"#141414",shellBorder:t?.shellBorder??te(t?.shell??"#141414",.35),shellInnerBorder:t?.shellInnerBorder??te(t?.shell??"#141414",.55),cardBg:t?.cardBg??"#1e1e1e",inputBg:t?.inputBg??"#171717",hoverBg:t?.hoverBg??"#2a2a2a",textPrimary:t?.textPrimary??"#ffffff",textSecondary:t?.textSecondary??"#888888",inputText:t?.inputText??"#e0e0e0",inputPlaceholder:t?.inputPlaceholder??"#555555",cardBorder:t?.cardBorder??"rgba(255,255,255,0.08)",inputBorder:t?.inputBorder??"rgba(255,255,255,0.10)",buttonBorder:t?.buttonBorder??"rgba(255,255,255,0.12)",successBg:t?.successBg??"#0a1f18",successBorder:t?.successBorder??"#1a4a3a",successText:t?.successText??"#6ee7b7",warningBg:t?.warningBg??"#1f1a0d",warningBorder:t?.warningBorder??"#4a3820",warningText:t?.warningText??"#fbbf24",errorBg:t?.errorBg??"#1f0d0d",errorBorder:t?.errorBorder??"#4a2020",errorText:t?.errorText??"#f87171",infoBg:t?.infoBg??"#0d1325",infoBorder:t?.infoBorder??"#2a3a5a",infoText:t?.infoText??"#60a5fa"}}function cr(e){return{shell:"#ffffff",shellBorder:"#E9E9E9",shellInnerBorder:"#D5D5D5",cardBg:"#f9fafb",inputBg:"#ffffff",hoverBg:"#f3f4f6",textPrimary:"#111827",textSecondary:"#6b7280",inputText:"#111827",inputPlaceholder:"#9ca3af",cardBorder:"#e5e7eb",inputBorder:"#d1d5db",buttonBorder:"#0e0d0b",successBg:"#d1fae5",successBorder:"#6ee7b7",successText:"#065f46",warningBg:"#fef3c7",warningBorder:"#fde68a",warningText:"#92400e",errorBg:"#fef2f2",errorBorder:"#fecaca",errorText:"#dc2626",infoBg:"#dbeafe",infoBorder:"#93c5fd",infoText:"#1e40af"}}function je(e,t){const r=t?{...e,...t}:e,n=r.dark??!1,o=r.primaryColor,a=r.shell??(n?"#141414":"#ffffff");return{primaryColor:o,dark:n,fontFamily:r.fontFamily??'"Helvetica Neue", sans-serif',appName:r.appName??"Spicenet",logo:r.logo,borderRadius:r.borderRadius??"8px",shell:a,shellBorder:te(a,n?.35:.085),shellInnerBorder:te(a,n?.55:.165),card:r.card??(n?"#1e1e1e":"#f9fafb"),input:n?"#171717":"#ffffff",hover:n?"#2a2a2a":"#f3f4f6",text:r.text??(n?"#ffffff":"#111827"),textMuted:r.textMuted??(n?"#888888":"#6b7280"),inputText:n?"#e0e0e0":"#111827",inputPlaceholder:n?"#555555":"#9ca3af",border:r.border??(n?"rgba(255,255,255,0.08)":"#e5e7eb"),inputBorder:n?"rgba(255,255,255,0.10)":"#d1d5db",buttonBorder:n?"rgba(255,255,255,0.12)":"#0e0d0b",successBg:n?"#0a1f18":"#d1fae5",successBorder:n?"#1a4a3a":"#6ee7b7",successText:n?"#6ee7b7":"#065f46",warningBg:n?"#1f1a0d":"#fef3c7",warningBorder:n?"#4a3820":"#fde68a",warningText:n?"#fbbf24":"#92400e",errorBg:n?"#1f0d0d":"#fef2f2",errorBorder:n?"#4a2020":"#fecaca",errorText:n?"#f87171":"#dc2626",infoBg:n?"#0d1325":"#dbeafe",infoBorder:n?"#2a3a5a":"#93c5fd",infoText:n?"#60a5fa":"#1e40af"}}const dr=Q.mono;function De(e,t){const r=y.useContext(qe)??void 0;return y.useMemo(()=>{const n=r??{primaryColor:"#EA4B4B"},o={...e?.primaryColor?{primaryColor:e.primaryColor}:{},...e?.fontFamily?{fontFamily:e.fontFamily}:{},...t!==void 0?{dark:t}:{}},a=je(n,o),{dark:s,primaryColor:l,appName:p}=a,c=Oe(s?"dark":"light"),m={...c,colors:{...c.colors,primary:l,primaryHover:`${l}dd`},typography:{...c.typography,fontFamily:a.fontFamily}},d={shell:a.shell,shellBorder:a.shellBorder,shellInnerBorder:a.shellInnerBorder,cardBg:a.card,inputBg:a.input,hoverBg:a.hover,textPrimary:a.text,textSecondary:a.textMuted,inputText:a.inputText,inputPlaceholder:a.inputPlaceholder,cardBorder:a.border,inputBorder:a.inputBorder,buttonBorder:a.buttonBorder,successBg:a.successBg,successBorder:a.successBorder,successText:a.successText,warningBg:a.warningBg,warningBorder:a.warningBorder,warningText:a.warningText,errorBg:a.errorBg,errorBorder:a.errorBorder,errorText:a.errorText,infoBg:a.infoBg,infoBorder:a.infoBorder,infoText:a.infoText},f=e?.inputVariant?e.inputVariant==="dark":s;return{brand:r,theme:m,dark:s,appName:p,primaryColor:l,dk:d,palette:d,fontFamily:a.fontFamily,monoFont:dr,inputDark:f,cardBg:f?d.cardBg:"#E9E9E9",cardBorder:f?d.cardBorder:"#C6C6C6",textPrimary:d.textPrimary,textSecondary:d.textSecondary,subtitleText:f?d.textSecondary:"#979AA0"}},[r,e,t])}const _e="spiceflow-spinner-keyframes";function ur(){if(typeof document>"u"||document.getElementById(_e))return;const e=document.createElement("style");e.id=_e,e.textContent="@keyframes spiceflow-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",document.head.appendChild(e)}const ue=({size:e=16,borderWidth:t=2,color:r="currentColor",style:n})=>{const o=y.useRef(!1);return y.useEffect(()=>{o.current||(ur(),o.current=!0)},[]),C.jsx("div",{role:"status","aria-label":"Loading",style:{width:`${e}px`,height:`${e}px`,border:`${t}px solid ${r}`,borderTop:`${t}px solid transparent`,borderRadius:"50%",animation:"spiceflow-spin 1s linear infinite",flexShrink:0,...n}})},_=({variant:e="primary",size:t="md",loading:r=!1,fullWidth:n=!1,disabled:o,children:a,className:s="",style:l,theme:p,styles:c,dark:m,...d})=>{const{theme:f,dark:u,palette:w}=De(c,m),i=p||f,g=m??u,[x,b]=y.useState(!1),[h,$]=y.useState(!1),k=g?w.shell:"white",S=()=>{switch(e){case"primary":return{backgroundColor:c?.button?.backgroundColor||i.colors.primary,color:c?.button?.color||"#ffffff",border:`1px solid ${c?.button?.backgroundColor||i.colors.primary}`};case"secondary":return{backgroundColor:i.colors.secondary,color:i.colors.text,border:`1px solid ${i.colors.border}`};case"success":return{backgroundColor:i.colors.success,color:i.colors.text,border:`1px solid ${i.colors.success}`};case"error":return{backgroundColor:i.colors.error,color:i.colors.text,border:`1px solid ${i.colors.error}`};case"ghost":return{backgroundColor:"transparent",color:i.colors.textSecondary,border:`1px solid ${i.colors.border}`};case"outline":{const A=c?.button?.backgroundColor||i.colors.primary,z=c?.button?.color||(g?"#ffffff":"#0e0d0b"),U=c?.button?.borderColor||(g?`${i.colors.primary}88`:"#0e0d0b"),L=o||r,q=g?"1px":"1.5px",ze=c?.button?.disabledBackgroundColor||`${A}88`,Je=c?.button?.disabledColor||z;return{height:"56px",backgroundColor:L?ze:h?`${A}cc`:x?`${A}ee`:A,color:L?Je:z,border:`${q} solid ${U}`,borderRadius:c?.button?.borderRadius||"12px",fontSize:"22px",fontWeight:500,fontFamily:Q.mono,opacity:L?.78:1,transform:L?"none":h?"scale(0.98)":x?"translateY(-2px)":"none",boxShadow:L?`3px 3px 0px ${k}, 4px 4px 0px ${U}`:h?`2px 2px 0px ${U}`:x?`5px 5px 0px ${k}, 6px 6px 0px ${U}`:`3px 3px 0px ${k}, 4px 4px 0px ${U}`,transition:"transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease, border-color 150ms ease, color 150ms ease"}}default:return{}}},E=()=>{if(e==="outline")return{};switch(t){case"sm":return{padding:`${i.spacing.sm} ${i.spacing.md}`,fontSize:i.typography.fontSize.sm};case"md":return{padding:`${i.spacing.md} ${i.spacing.lg}`,fontSize:i.typography.fontSize.base};case"lg":return{padding:`${i.spacing.lg} ${i.spacing.xl}`,fontSize:i.typography.fontSize.lg};default:return{}}},N={borderRadius:c?.button?.borderRadius||i.borderRadius.md,fontWeight:c?.button?.fontWeight||i.typography.fontWeight.medium,fontFamily:c?.button?.fontFamily||i.typography.fontFamily,fontSize:c?.button?.fontSize||void 0,transition:"background-color 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease",cursor:o||r?"not-allowed":"pointer",opacity:(o||r)&&e!=="outline"?.6:1,width:n?"100%":"auto",display:"flex",alignItems:"center",justifyContent:"center",gap:i.spacing.sm,...S(),...E(),...c?.button?.fontSize&&{fontSize:c.button.fontSize}},I=o||r;return C.jsxs("button",{type:d.type??"button","data-spiceflow-focus":!0,"aria-busy":r||void 0,"aria-disabled":I||void 0,style:{...N,...l},className:s,disabled:I,onMouseEnter:A=>{b(!0),d.onMouseEnter?.(A)},onMouseLeave:A=>{b(!1),$(!1),d.onMouseLeave?.(A)},onMouseDown:A=>{$(!0),d.onMouseDown?.(A)},onMouseUp:A=>{$(!1),d.onMouseUp?.(A)},...d,children:[r&&C.jsx(ue,{size:16}),a]})},fr=({onAuthSuccess:e,onAuthError:t,theme:r="light",className:n="",buttonText:o="Login with Privy",autoTrigger:a=!1})=>{const s=Oe(r),[l,p]=y.useState(!1),[c,m]=y.useState(!1),{ready:d,authenticated:f,user:u}=T.usePrivy(),{login:w}=T.useLogin(),{logout:i}=T.useLogout();y.useEffect(()=>{p(!0)},[]),y.useEffect(()=>{a&&d&&!f&&l&&!c&&(m(!0),g())},[a,d,f,l,c]),y.useEffect(()=>{if(d&&f&&u&&e){const b=u.wallet?.address||u.email?.address;b&&e(b)}},[d,f,u,e]),y.useEffect(()=>{},[d,f,t]);const g=()=>{try{w()}catch(b){const h=`Login failed: ${String(b)}`;t?t(h):console.error(h)}},x=()=>{try{i()}catch(b){const h=`Logout failed: ${String(b)}`;t?t(h):console.error(h)}};if(!l)return C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",disabled:!0,theme:s,children:o})});if(!d)return C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",disabled:!0,theme:s,children:"Loading..."})});if(f&&u){const b=u.wallet?.address||u.email?.address,h=b?Re(b):"Connected";return C.jsx("div",{className:n,children:C.jsxs(_,{variant:"primary",onClick:x,theme:s,children:["Logout (",h,")"]})})}return a?C.jsx("div",{className:n,children:C.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"20px",flexDirection:"column",gap:"12px"},children:[C.jsx(ue,{size:40,borderWidth:3,color:"#3b82f6"}),C.jsx("p",{style:{color:"#6b7280",fontSize:"14px"},children:"Opening login..."})]})}):C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",onClick:g,theme:s,children:o})})};exports.Button=_,exports.CHAIN_CONFIGS=ot,exports.EMPTY_INVENTORY=Se,exports.PrivyLogin=fr,exports.RELAYER_API_URL=Ce,exports.SpiceFlowProvider=ar,exports.SpiceFlowProviderContext=ee,exports.SpiceflowError=R,exports.Spinner=ue,exports.addressesEqual=J,exports.amountsWithinBps=Lt,exports.buildDarkPalette=lr,exports.buildLightPalette=cr,exports.calculateBpsFee=Te,exports.copyToClipboard=Vt,exports.createInitialSteps=Tt,exports.createInventoryStore=Ie,exports.describeChainSwitchError=Et,exports.duration=P,exports.easing=F,exports.ensureSmartWallet=ke,exports.ensureWalletOnChain=lt,exports.feeAmountsWithinTolerance=Fe,exports.feeBreakdownsWithinTolerance=Mt,exports.font=Q,exports.formatAssetBalance=Kt,exports.formatBalance=Pe,exports.formatDecimalInput=Ht,exports.formatRawTokenInput=qt,exports.formatUsd=Jt,exports.getAllAssetsForChain=dt,exports.getAssetDisplayChainName=Xt,exports.getAssetDisplayName=We,exports.getAssetDisplaySymbol=Ne,exports.getBatchFees=Z,exports.getChainConfig=M,exports.getChainName=V,exports.getChainsForAssets=ct,exports.getClientForChain=ye,exports.getDelegateContractAddress=st,exports.getEscrowFreeFeePreview=_t,exports.getExplorerUrl=it,exports.getRelayerErrorDetail=bt,exports.getRpcUrlForChain=H,exports.getSingleNetOutput=Dt,exports.getSupplyFeePreview=zt,exports.getTokenDecimals=ut,exports.getWalletBalanceEntries=St,exports.hasStoredSpiceFlowMode=rr,exports.isAssetAllowed=Yt,exports.isSpiceflowError=ae,exports.isUserRejection=ve,exports.parseNumericInput=Gt,exports.radius=ht,exports.relayerFetch=X,exports.relayerService=W,exports.resolveFeeToleranceBps=de,exports.resolveTheme=je,exports.sanitizeError=wt,exports.splitFeeInclusiveAmount=Ut,exports.transition=gt,exports.truncateAddress=Re,exports.useAssetDisplay=Zt,exports.useIsUserWhitelisted=Ae,exports.useProviderWallets=ne,exports.useSpiceBrand=De,exports.useWallet=Be,exports.z=pt;
@@ -0,0 +1,2 @@
1
+ "use client";
2
+ import{jsx as $,jsxs as ae}from"react/jsx-runtime";import{useContext as oe,useMemo as O,useRef as we,useEffect as F,createContext as se,useCallback as ve,useState as D}from"react";import{isNativeToken as M,getChainMeta as xe,getTokensForChain as nt,ZERO_ADDRESS as at,getDelegateContract as ot,getTokenByAddress as st,DELEGATE_ABI as it,ERC20_ABI as lt,spicenetEscrowAbi as ct,uniV3SwapRouterAbi as dt,normalizeNativeTokenAddress as Ee,getChainIdsByNetwork as ut}from"@spicenet-io/spiceflow-core";import{useQuery as ft,useMutation as mt}from"@tanstack/react-query";import{isAddress as N,getAddress as ie,defineChain as pt,createPublicClient as ht,http as gt,erc20Abi as yt,createWalletClient as bt,custom as wt,formatUnits as G,isHex as vt,decodeErrorResult as xt,hexToString as Et}from"viem";import{useWallets as $e,usePrivy as le,getEmbeddedConnectedWallet as Ce,useSign7702Authorization as $t,useSignMessage as Ct,useLogin as kt,useLogout as Bt}from"@privy-io/react-auth";import{useAccount as ke}from"wagmi";import{readContract as It}from"viem/actions";function H(e,t){return!e||!t?!1:M(e)&&M(t)?!0:N(e)&&N(t)?ie(e)===ie(t):e.toLowerCase()===t.toLowerCase()}const St="0xcA11bde05977b3631167028862bE2a173976CA11",At={4114:"0x860aFc632a6D625B95d8B96f39ECC48E988c6962"},Tt=new Set([5115]);function Ft(e){const t=At[e.id]??(Tt.has(e.id)?void 0:St);return pt({id:e.id,name:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:{default:{http:[e.rpcUrl]}},blockExplorers:{default:{name:e.displayName,url:e.blockExplorer}},testnet:e.network==="testnet",...t?{contracts:{multicall3:{address:t}}}:{}})}const Pt=[1,8453,42161,4114,4663,56,137,143,11155111,421614,84532,5115,123420001114,688688,688689,46630],V=Object.fromEntries(Pt.map(e=>xe(e)).filter(e=>e!=null).map(e=>[e.id,{...e,viemChain:Ft(e),supportedTokens:nt(e.id)}])),Rt=V;let Be={};const ce=new Map,Ie=e=>{Be={...e||{}},ce.clear()},Y=(e,t=Be)=>{const r=t[e];return r&&typeof r=="string"&&r.length>0?r:V[e]?.rpcUrl||void 0},U=e=>V[e],Q=e=>{const t=xe(e);return t?.displayName||t?.name||`Chain ${e}`},Wt=e=>{const t=ot(e);if(!t)throw new Error(`Unsupported chain ID: ${e}`);return t},Nt=(e,t,r)=>{const n=U(e);return n?.blockExplorer?`${n.blockExplorer}/tx/${t}`:"#"};async function Ut(e,t){const r=`0x${t.toString(16)}`;try{await e.request({method:"wallet_switchEthereumChain",params:[{chainId:r}]});return}catch(a){if(!(a?.code===4902||typeof a?.message=="string"&&a.message.includes("Unrecognized chain ID")))throw a}const n=U(t);if(!n)throw new Error(`Cannot add unknown chain ${t} to wallet`);const o=Y(t);if(!o)throw new Error(`Configure SpiceFlowProvider rpcOverrides[${t}] before adding this chain.`);await e.request({method:"wallet_addEthereumChain",params:[{chainId:r,chainName:n.name||`Chain ${t}`,nativeCurrency:n.nativeCurrency||{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:[o],blockExplorerUrls:n.blockExplorer?[n.blockExplorer]:void 0}]})}const Se=(e,t)=>{const r=U(e);if(!r)throw new Error(`Unsupported chain ID: ${e}`);const n=Y(e,t);if(!n)throw new Error(`No RPC URL configured for chain ID: ${e}`);const o=`${e}:${n}`,a=ce.get(o);if(a)return a;const s=ht({chain:r.viemChain,transport:gt(n,{timeout:15e3,retryCount:2,retryDelay:300}),batch:{multicall:{wait:16}}});return ce.set(o,s),s},Lt=e=>{const t={};return Object.values(V).forEach(r=>{const n=Y(r.id,e);n&&(t[r.id]={name:r.name,chain:r.viemChain,rpcUrl:n})}),t},Ot=(e,t=[])=>{const r=U(e);if(!r)return[];const n=[];if(![11155111,421614,688689].includes(e)){const a=t.find(s=>s.chainId===e&&s.isNative);a?n.push(a):n.push({address:at,name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:void 0,isNative:!0,chainId:e})}if(!r.supportedTokens)return n;const o=n.some(a=>a.isNative);return r.supportedTokens.forEach(a=>{if(o&&M(a.address))return;const s=t.find(l=>l.chainId===e&&H(l.address,a.address));s?n.push(s):n.push({address:a.address,name:a.name,symbol:a.symbol,decimals:a.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:a.logo,isNative:!1,chainId:e})}),n},Mt=async(e,t,r)=>{const n=U(e);if(!n)throw new Error(`Unsupported chain ID: ${e}`);const o=t.toLowerCase(),a=n.supportedTokens?.find(l=>H(l.address,o));let s;if(M(o)){if(n.nativeCurrency?.decimals==null)throw new Error(`Native currency decimals not configured for chain ${e}`);s=n.nativeCurrency.decimals}else if(a)s=a.decimals;else{if(!N(t,{strict:!1}))throw new Error(`Could not determine decimals for invalid token address: ${t}`);const l=Se(e,r);try{s=await It(l,{address:ie(t),abi:yt,functionName:"decimals"})}catch(p){throw Object.assign(new Error(`Could not determine decimals for token ${t} on chain ${e}. Check the token contract and RPC configuration, then try again.`),{cause:p})}}if(!Number.isInteger(s)||s<0||s>255)throw new Error(`Invalid token decimals for ${t} on chain ${e}. Expected an integer from 0 to 255.`);return s},qt=e=>{const t=e?.wallet;if(t?.address&&t.walletClientType==="privy"&&t.connectorType==="embedded"&&!t.imported)return t.address},Ae=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getWalletClient=="function"){const r=t===void 0?[void 0]:[String(t),t,void 0];let n=null;for(const o of r)try{const a=await e.getWalletClient(o);if(a)return a}catch(a){n=a}if(n)throw n}if(typeof e.getEthereumProvider=="function"){const r=await e.getEthereumProvider(),n=t?U(t)?.viemChain:void 0;return bt({account:e.address,chain:n,transport:wt(r)})}throw new Error("Wallet client not available")},Dt=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getEthereumProvider=="function")return e.getEthereumProvider();const r=await Ae(e,t);return{request:n=>r.request(n)}},X=e=>e?.address?{address:e.address,wallet:e,getWalletClient:t=>Ae(e,t),getEthereumProvider:t=>Dt(e,t)}:null,de=()=>{const e=ke(),t=e.status==="connected"?e.address:void 0,r=e.connector;let n=null,o=null;try{n=$e(),{user:o}=le()}catch{n=null,o=null}const a=n?.wallets||[],s=Ce(a),l=s?.address?.toLowerCase(),p=a.find(g=>g.connectorType!=="embedded"&&g.address?.toLowerCase()!==l),c=t?.toLowerCase(),m=t&&r&&!(c&&l&&c===l)?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,d=t&&r?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,f=X(s),u=X(m)||X(p),b=f?.address||qt(o),i=X(d)||u;return{embeddedWallet:f,externalWallet:u,embeddedAddress:b,externalAddress:u?.address,activeWallet:i,activeAddress:i?.address}},zt={base:0,raised:1,sticky:10,overlay:20,popover:40,modal:1e3,dropdown:1100,toast:1200,tooltip:1300},_t={none:"0",sm:"4px",md:"6px",card:"8px",input:"10px",shell:"9px",modal:"12px",pill:"9999px",circle:"50%"},I={out:"cubic-bezier(0.22, 1, 0.36, 1)",inOut:"cubic-bezier(0.65, 0, 0.35, 1)",linear:"linear"},S={fast:"120ms",normal:"150ms",slow:"300ms",progress:"400ms"},jt={interactive:`transform ${S.normal} ${I.out}, box-shadow ${S.normal} ${I.out}, background-color ${S.normal} ${I.out}, border-color ${S.normal} ${I.out}, color ${S.normal} ${I.out}`,color:`background-color ${S.normal} ${I.out}, border-color ${S.normal} ${I.out}, color ${S.normal} ${I.out}`,popover:`opacity ${S.normal} ${I.out}, transform ${S.normal} ${I.out}`},K={ui:'"Helvetica Neue", sans-serif',mono:'"IBM Plex Mono", monospace'};class A extends Error{constructor(t,r,n={}){super(r),this.code=t,this.context=n,this.name="SpiceflowError",Error.captureStackTrace&&Error.captureStackTrace(this,A)}}function ue(e){return e instanceof A}const Jt=["user rejected","user denied","user cancelled","rejected the request","action_rejected","4001"];function Te(e){if(!e)return"";if(typeof e=="string")return e;const t=e,r=t.message||t.reason||"",n=t.details||"";return`${r} ${n}`.trim()}const Fe=e=>{if(ue(e))return e.code==="WALLET_REJECTED";const t=Te(e).toLowerCase();return Jt.some(r=>t.includes(r))};let fe=null;function Gt(e){return fe?.message===e?fe.detail:void 0}const Ht=(e,t="Something went wrong. Please try again.")=>{if(Fe(e))return"Transaction was rejected.";if(ue(e)){const r=e.message||t,{requestId:n,httpStatus:o,responseBody:a,endpoint:s}=e.context;return(n||o||s)&&(fe={message:r,detail:{requestId:n,httpStatus:o,responseBody:a,endpoint:s}}),r}return Te(e)||t},Vt=[...it,...lt,...ct,...dt];function me(e,t=0){return t>4||e==null?[]:typeof e=="string"?e.match(/0x[0-9a-fA-F]{8,}/g)??[]:Array.isArray(e)?e.flatMap(r=>me(r,t+1)):typeof e=="object"?Object.values(e).flatMap(r=>me(r,t+1)):[]}function Pe(e){try{const t=xt({abi:Vt,data:e});if(t.errorName==="Error")return String(t.args?.[0]??"");if(t.errorName==="Panic")return`Panic(${t.args?.[0]})`;if(t.errorName==="CallReverted"){const r=t.args?.[4],n=r&&r!=="0x"?Pe(r):void 0;return n?`Call reverted: ${n}`:"Call reverted (no reason returned)"}return t.errorName}catch{try{const t=Et(e).replace(/\x00+$/g,"").trim();return/^[\x20-\x7e]+$/.test(t)&&t.length>1?t:void 0}catch{return}}}function Yt(e){for(const t of me(e)){if(!vt(t))continue;const r=Pe(t);if(r)return r}}function Re(e,t){const r=t.match(/Output amount (\d+) is insufficient after fees (\d+) on chain (\d+)/);if(!r)return t;const[,n,o,a]=r,s=Number(a),l=BigInt(n),p=BigInt(o);let c;for(const w of e.intents){const y=w.chainBatches.find(h=>h.chainId===s);if(y){c=y;break}}const m=c?.tokenTransfers.find(w=>w.from==="escrow"&&H(w.to,e.user)&&!M(w.token)),d=Q(s);if(!m)return`Amount is too small to cover the estimated fee on ${d}.`;const f=st(m.token,s),u=f?.decimals??18,b=f?.symbol??"tokens",i=G(l,u),g=G(p,u);return`Amount is too small to cover the estimated fee on ${d}. Amount: ${i} ${b}. Estimated fee: ${g} ${b}.`}function Qt(e){return e?.code===4902||e?.name==="ChainNotConfiguredError"?"This network is not configured in your wallet. Please add it manually to continue.":e?.code===4001?"Network switch cancelled. Please switch manually in your wallet to continue.":"Unable to switch network. Please switch manually in your wallet to continue."}const Xt="https://tx-submission-api.spicenet.io",We=Xt;function Kt(e,t){return typeof t=="bigint"?t.toString():t}function q(e,t=""){if(Array.isArray(e))e.forEach((r,n)=>q(r,`${t}[${n}]`));else if(e&&typeof e=="object")for(const[r,n]of Object.entries(e)){const o=t?`${t}.${r}`:r;if(!n&&(r==="user"||r==="to"||r==="from"||r==="address"))throw new A("INVALID_PARAMS",`Wallet not ready: ${o} is missing from the request. Wait a moment and retry, or log in again.`,{path:o});q(n,o)}}async function Z(e,t){const r={...t?.headers},n=(t?.method??"GET").toUpperCase();(t?.body!=null||n!=="GET"&&n!=="HEAD")&&(r["x-request-id"]??(r["x-request-id"]=crypto.randomUUID()));const o=await fetch(e,{...t,headers:r}),a=o.headers.get("x-request-id")??"";return Object.assign(o,{requestId:a})}function z(e,t){if(!e)return t;const r=e.error,n=(typeof e.message=="string"?e.message:"")||(r&&typeof r=="object"&&"message"in r&&typeof r.message=="string"?r.message:"")||(typeof r=="string"?r:"")||t,o=Yt(e);return o&&!n.includes(o)?`${n} \u2014 ${o}`:n}async function Zt(e){try{return await e.json()}catch{return null}}function er(e){return(Array.isArray(e?.balances)?e.balances:[]).flatMap(t=>{if(!t||typeof t!="object")return[];const r=t;return[{receiptToken:typeof r.receiptToken=="string"?r.receiptToken:void 0,tokenName:String(r.tokenName??""),balanceAvailable:String(r.balanceAvailable??"0"),chainTokens:Array.isArray(r.chainTokens)?r.chainTokens.filter(n=>typeof n=="string"):r.chainTokens&&typeof r.chainTokens=="object"?r.chainTokens:r.chainTokenConfig&&typeof r.chainTokenConfig=="object"?r.chainTokenConfig:void 0,decimals:typeof r.decimals=="number"?r.decimals:void 0,balanceUsd:typeof r.balanceUsd=="number"||typeof r.balanceUsd=="string"?r.balanceUsd:null}]})}class tr{constructor(){this.baseUrl=We,this.feeValidationAvailable=!1}setBaseUrl(t){t!==this.baseUrl&&(this.feeValidationAvailable=!1),this.baseUrl=t}getBaseUrl(){return this.baseUrl}async requestJson(t,r){const n=`${this.baseUrl}${t}`,o=await Z(n,r.method&&r.method!=="GET"?{method:r.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(r.body,Kt),signal:r.signal}:{signal:r.signal}),a=await o.json();if(!o.ok||a.success===!1||r.ok&&!r.ok(a)){const s=z(a,r.fallbackError(o.status));throw new A(r.code??"RELAYER_ERROR",r.mapError?r.mapError(s):s,{httpStatus:o.status,requestId:o.requestId,responseBody:JSON.stringify(a),endpoint:t,...r.context})}return a}async createLimitOrder(t){return this.requestJson("/orders",{method:"POST",body:t,fallbackError:r=>`Order registration failed: ${r}`})}async getLimitOrder(t){return this.requestJson(`/orders/${encodeURIComponent(t)}`,{fallbackError:r=>`Order lookup failed: ${r}`})}async listLimitOrders(t,r){const n=new URLSearchParams({user:t,...r?{after:r}:{}});return this.requestJson(`/orders?${n}`,{fallbackError:o=>`Order listing failed: ${o}`})}async cancelLimitOrder(t,r){return this.requestJson(`/orders/${encodeURIComponent(t)}/cancel`,{method:"POST",body:{signature:r},fallbackError:n=>`Order cancellation failed: ${n}`})}async createAction(t){return q(t),this.requestJson("/actions",{method:"POST",body:t,fallbackError:r=>`Relayer API error: ${r}`})}async estimateActionFees(t,r){q(t);const n=this.baseUrl,o=await this.requestJson("/actions/fees/estimate",{method:"POST",body:t,signal:r?.signal,fallbackError:a=>`Relayer fee estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.feeEstimate,mapError:a=>Re(t,a)});return n===this.baseUrl&&(this.feeValidationAvailable=o.data?.supportsFeeValidation===!0),o.data.feeEstimate}canValidateActionFees(){return this.feeValidationAvailable}async validateActionFees(t,r){return q(t),(await this.requestJson("/actions/fees/validate",{method:"POST",body:t,signal:r?.signal,fallbackError:n=>`Relayer fee validation error: ${n}`,ok:n=>!!n.success&&!!n.data?.feeEstimate,mapError:n=>Re(t,n)})).data.feeEstimate}async estimateBatchGas(t){q(t);const{signal:r,...n}=t,o=await this.requestJson("/actions/gas/estimate",{method:"POST",body:n,signal:r,fallbackError:a=>`Relayer gas estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.gasFee});return{gasFee:BigInt(o.data.gasFee),gasQuoteSource:o.data.gasQuoteSource,simulationVerified:o.data.simulationVerified===!0,platformFee:o.data.platformFee===void 0?void 0:BigInt(o.data.platformFee)}}async executeStep(t,r,n,o){const a=`${this.baseUrl}/actions/${t}/intents/${r}/steps/${n}`,s=`/actions/${t}/intents/${r}/steps/${n}`,l=crypto.randomUUID(),p=3e4,c=new Promise((f,u)=>setTimeout(()=>u(new A("RELAYER_EXECUTE_ERROR",`Execute step request timed out after ${p/1e3}s`,{actionId:t,intentIndex:r,stepIndex:n,endpoint:s,requestId:l})),p)),m=await Promise.race([Z(a,{method:"POST",headers:{"Content-Type":"application/json","x-request-id":l},body:JSON.stringify(o)}),c]),d=await m.json();if(!m.ok||d.success===!1)throw new A("RELAYER_EXECUTE_ERROR",z(d,`Execute step error: ${m.status}`),{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t});if(d?.status==="error"||d?.status==="reverted"){const f=z(d,""),u=f?`: ${f}`:"";throw new A("RELAYER_EXECUTE_ERROR",`Step ${n} previously ${d.status}${u}`,{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t,intentIndex:r,stepIndex:n,stepStatus:d.status})}return{success:!0,status:d.status,transactionHash:d.transactionHash}}async checkStepStatus(t,r){const n=t.split("/"),o=n[0],a=n.length>=2?n[1]:"0",s=await this.requestJson(`/actions/${o}/intents/${a}/steps/${r}`,{fallbackError:l=>`Intent step status check failed: ${l}`,code:"RELAYER_STATUS_ERROR",context:{intentId:t}});return{success:!0,data:{status:s.status==="error"?"reverted":s.status,transactionHash:s.txid,error:z(s,"")}}}async createWallet(t,r){return this.requestJson(`/wallets/${t}`,{method:"PUT",body:r,fallbackError:n=>`Create wallet error: ${n}`})}async getWallet(t){return this.requestJson(`/wallets/${t}`,{fallbackError:r=>`Get wallet error: ${r}`})}async createWithdrawal(t){return this.requestJson("/withdrawals",{method:"POST",body:t,fallbackError:r=>`Create withdrawal error: ${r}`})}async getWithdrawal(t){return this.requestJson(`/withdrawals/${t}`,{fallbackError:r=>`Get withdrawal error: ${r}`})}async getRollupTimestamp(){return this.requestJson("/time",{fallbackError:t=>`Get rollup timestamp error: ${t}`})}}const P=new tr;async function rr(e){const t=`${P.getBaseUrl()}/wallets/${e}/balance`,r=await Z(t,{cache:"no-store"}),n=await Zt(r);if(!r.ok||n?.success===!1)throw new A("RELAYER_ERROR",z(n,`Unable to verify Spice balance: ${r.status}`),{httpStatus:r.status,requestId:r.requestId,responseBody:JSON.stringify(n),endpoint:`/wallets/${e}/balance`});return er(n)}const pe=new Map,ee=new Set;function he(e){return JSON.stringify([P.getBaseUrl(),e.toLowerCase()])}function _(e,t){if(he(e)!==t)throw new Error("Wallet backend changed during registration. Please retry.")}function nr(e){if(!(e instanceof A))return!1;const t=e.context.httpStatus;return t===400||t===404?`${e.message} ${String(e.context.responseBody??"")}`.toLowerCase().includes("not found"):!1}async function Ne(e){const t=he(e);if(ee.has(t))return!0;try{return await P.getWallet(e),_(e,t),ee.add(t),!0}catch(r){if(!nr(r))throw r;return!1}}async function Ue(e,t){const r=he(e);if(ee.has(r))return;const n=pe.get(r);if(n)return n;const o=(async()=>{const a=await Ne(e);if(_(e,r),a)return;const{unix_timestamp:s}=await P.getRollupTimestamp();_(e,r);const l=`I am creating a new smart wallet and adding an admin wallet ethereum:0x${e.slice(2).toLowerCase()}. Nonce: ${s}`,p=await t(l);_(e,r);const c=typeof p=="string"?p:p.signature;if(!c)throw new Error("Wallet returned no smart wallet signature");await P.createWallet(e,{timestamp:s,signature:c}),_(e,r),ee.add(r)})();pe.set(r,o);try{await o}finally{pe.delete(r)}}const ar=(e,t)=>{const r=o=>t?t(o):Q(o),n=[];return e.forEach((o,a)=>{const s=o.calls&&o.calls.length>0,l=o.tokenTransfers&&o.tokenTransfers.length>0;!s&&!l||n.push({stepId:a,status:a===0?"processing":"pending",chainId:o.chainId,chainName:r(o.chainId),description:"Processing transaction"})}),n},Le=()=>{const e=oe(re),t=e?.mode,{isConnected:r,address:n}=ke();let o=null,a=null,s=null,l=null,p=null;try{o=le(),a=$t(),s=Ct(),l=$e()}catch(h){p=h instanceof Error?h.message:String(h)}if(p)return t==="ondemand"&&r&&n?{isReady:!0,isAuthenticated:!0,isConnected:!0,address:n,provider:"privy",actions:{signAuthorization:async()=>{throw new Error("Not available in ondemand mode")},signMessage:async()=>{throw new Error("Not available in ondemand mode")},getEthereumProvider:async()=>{throw new Error("Not available in ondemand mode")}}}:{isReady:!1,isAuthenticated:!1,isConnected:!1,provider:null,actions:{signAuthorization:async()=>{throw new Error("Privy not available")},signMessage:async()=>{throw new Error("Privy not available")},getEthereumProvider:async()=>{throw new Error("Privy not available")}}};const{ready:c=!1,authenticated:m=!1}=o||{},d=e?.embeddedWalletAddress,f=Ce(l?.wallets||[]),u=d||f?.address,b=!!u&&!!f,i={isReady:t==="ondemand"?!0:c,isAuthenticated:t==="ondemand"?!0:m||b,isConnected:t==="ondemand"?r&&!!n||c&&(m||b)&&b:c&&b,address:t==="ondemand"&&r?n:u,provider:"privy"},g=async(h,x)=>{if(!f)throw new Error("Embedded wallet not available");const E=await f.getEthereumProvider(),{createWalletClient:k,custom:v}=await import("viem"),T=k({account:f.address,transport:v(E)});return x?.(),{signature:await T.signMessage({account:f.address,message:h})}},w=async h=>{if(s)try{return{signature:(await s.signMessage({message:h})).signature}}catch(x){if(!f)throw x}if(!f)throw new Error("Privy sign message not available");return g(h)},y=async()=>{if(!u)throw new Error("Embedded wallet not available for smart wallet setup");await Ue(u,w)};return{...i,actions:{prepareSigning:async()=>{if(!u)throw new Error("Embedded wallet not available");await Ne(u)},signAuthorization:async(h,x)=>{if(!a)throw new Error("Privy sign authorization not available");try{await y(),x?.();const E=await a.signAuthorization({contractAddress:h.contractAddress,chainId:h.chainId,nonce:h.nonce},{address:u});return delete E.v,E}catch(E){const k=typeof E?.message=="string"?E.message:String(E?.message??E??"");throw k.includes("not configured")||k.includes("chain")?new Error(`Chain ${h.chainId} is not configured in PrivyProvider. Add this chain to your Privy dashboard or supportedChainIds.`):E}},signMessage:async(h,x)=>{if(typeof h=="object"&&"raw"in h){if(await y(),!f)throw new Error("Embedded wallet not available for raw signing");return g(h,x)}return x?.(),w(h)},getEthereumProvider:async()=>{if(!f)throw new Error("Embedded wallet not available");return f.getEthereumProvider()}}}},or="https://portal-api.spicenet.io/api/v1",ge=e=>e.replace(/\/+$/,""),sr=(e,t)=>`${e}:${t}`;async function ir(e,t){const r=new URLSearchParams({walletAddress:t,campaignId:"spicenet-portal",campaignGroup:"1"}),n=await fetch(`${e}/portal/mainnet/linked-portal-wallet?${r.toString()}`,{cache:"no-store"});if(!n.ok){if(n.status>=500){const o=new Error(`Failed to resolve linked portal wallet: ${n.status}`);throw o.status=n.status,o}return null}return(await n.json()).portalWalletAddress?.toLowerCase()??null}async function lr(e,t,r){const n=new URLSearchParams({walletAddress:t,campaignId:r.campaignId,campaignGroup:r.campaignGroup,partnerId:r.partnerId}),o=await fetch(`${e}/portal/mainnet/whitelist/check?${n.toString()}`,{cache:"no-store"});if(!o.ok){const a=new Error(`Failed to check whitelist: ${o.status}`);throw a.status=o.status,a}return await o.json()}async function cr(e,t,r,n){const o=await fetch(`${e}/portal/mainnet/link-wallet`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({campaignId:t.campaignId,campaignGroup:t.campaignGroup,partnerId:t.partnerId,externalWalletAddress:r,embeddedWalletAddress:n})});if(!o.ok)throw new Error(`Failed to link wallet: ${o.status}`)}function Oe({walletAddress:e,campaignId:t,campaignGroup:r,partnerId:n,apiBaseUrl:o=or,enabled:a=!0,staleTime:s=5*60*1e3,refetchInterval:l=!1}={}){const{isAuthenticated:p,isConnected:c}=Le(),{externalAddress:m,embeddedAddress:d}=de(),f=e??m,u=typeof f=="string"?f.toLowerCase():void 0,b=typeof d=="string"?d.toLowerCase():void 0,i=typeof m=="string"?m.toLowerCase():void 0,g=a&&p&&c&&!!m&&!!u&&N(u)&&!!t&&!!r&&!!n,w=O(()=>["partner-whitelist","check",u,t,r,n,ge(o)],[u,t,r,n,o]),y=ft({queryKey:w,enabled:g,staleTime:s,refetchInterval:l,retry:(v,T)=>{const B=T?.status;return typeof B=="number"&&B>=400&&B<500?!1:v<3},retryDelay:v=>Math.min(1e3*2**v,15e3),queryFn:async()=>{if(!u||!N(u))throw new Error("A valid wallet address is required");if(!t||!r||!n)throw new Error("campaignId, campaignGroup, and partnerId are required");const v=ge(o),T={campaignId:t,campaignGroup:r,partnerId:n},B=await ir(v,u);return B?lr(v,B,T):{walletAddress:u,campaignId:t,campaignGroup:r,partnerId:n,isWhitelisted:!1,isLinkedWallet:!1,whitelistedWalletAddress:null,externalWalletAddress:u}}}),h=a&&p&&c&&!!i&&N(i)&&!!b&&N(b)&&!!t&&!!r&&!!n,x=mt({mutationFn:v=>cr(ge(o),{campaignId:t,campaignGroup:r,partnerId:n},v.external,v.embedded)}),E=we(new Set),k=x.mutate;return F(()=>{if(!h||!i||!b||!t||!r||!n)return;const v=sr(i,b);E.current.has(v)||(E.current.add(v),k({external:i,embedded:b}))},[h,i,b,t,r,n,k]),{isWhitelisted:y.data?.isWhitelisted??!1,whitelistCheck:y.data,checkedWalletAddress:u,externalWalletAddress:m,embeddedWalletAddress:d,isExternalWalletConnected:!!m,isWhitelistCheckEnabled:g,linkWallet:x,isWalletLinked:x.isSuccess,...y}}const Me={assets:[],loading:!1,refreshing:!1,error:null,updatedAt:null};function qe(){const e=new Map,t=new Map,r=new WeakMap;let n=0;function o(){let a=Me;const s=new Map;let l,p=null,c=0,m=!1,d;const f=()=>s.forEach((i,g)=>g()),u=()=>{if(!d||!s.size)return Promise.resolve();if(p)return p;const i=++c;return a={...a,loading:a.updatedAt===null,refreshing:!0},f(),p=Promise.resolve().then(d).then(g=>{if(i!==c)return;const{assets:w,error:y=null}=Array.isArray(g)?{assets:g}:g;a={assets:w,loading:!1,refreshing:!1,error:y,updatedAt:Date.now()}},g=>{i===c&&(a={...a,loading:!1,refreshing:!1,error:g instanceof Error?g.message:"Unable to refresh balances"})}).finally(()=>{i===c&&(p=null,f(),m&&(m=!1,u()))}),p},b=()=>{clearInterval(l);const i=[...s.values()].filter(g=>g>0);i.length&&(l=setInterval(()=>void u(),Math.min(...i)))};return{snapshot:()=>a,refresh:u,invalidate:()=>p?(m=!0,p.then(()=>p??Promise.resolve())):u(),subscribe(i,g,w){return d=g,s.set(i,w),b(),u(),()=>{s.delete(i),b(),s.size||(c++,p=null,m=!1,a={...a,loading:!1,refreshing:!1})}}}}return{entry(a){let s=e.get(a);return s||(s=o(),e.set(a,s)),s},fetcherId(a){return r.has(a)||r.set(a,++n),r.get(a)},registerTokens(a){let s=!1;for(const l of a){const p=`${l.chainId}:${l.address.toLowerCase()}`;t.has(p)||(t.set(p,l),s=!0)}s&&e.forEach(l=>l.invalidate())},tokens:()=>[...t.values()],invalidate:()=>Promise.all([...e.values()].map(a=>a.invalidate())).then(()=>{})}}function De(e,t){return e<=0n||t<=0n?0n:(e*t+10000n-1n)/10000n}function dr(e,t,r){const n=(e>t?e-t:0n)*10000n/(10000n+r),o=De(n,r),a=n>0n,s=a?o+t:0n;return{netAmount:n,spicenetFee:a?o:0n,totalFee:s,grossAmount:n+s,coversFees:a}}function ur(e,t,r){if(e===t)return!0;const n=e>t?e:t;return n===0n?!1:(e>t?e-t:t-e)*10000n<=n*r}function ye(e=4e3){if(!Number.isInteger(e)||e<0||e>1e4)throw new Error("feeToleranceBps must be an integer between 0 and 10000");return e}function ze(e,t,r){const n=BigInt(ye(r));return(e>t?e-t:t-e)*10000n<=e*n}function fr(e,t,r){return["gasFee","spicenetFee","bridgeFee"].every(n=>ze(e[n]??0n,t[n]??0n,r))}function mr(e,t){const r=G(e,t);return r.includes(".")?r.replace(/\.?0+$/,"")||"0":r}function te(e){const t=BigInt(e.feeBreakdown.spicenetFee),r=BigInt(e.feeBreakdown.gasFee),n=BigInt(e.feeBreakdown.bridgeFee??"0"),o=t+r+n;return{spicenetFee:t,gasFee:r,bridgeFee:n,totalFee:o}}function pr(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=te(e);return t>0n||r>0n||n>0n}function hr(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=te(e),o=t+n;return r>o?r:o}function gr(e){const t=[];for(const r of e.intents)for(const n of r.batches)t.push(BigInt(n.quotedAmount));return t.length!==1?null:t[0]}function yr(e,t,r){return e.length===0||!e.every(n=>n.domain!=="spicenet"&&!n.tokenTransfers?.length)?null:{...t,grossAmount:r,netAmount:r,totalFee:0n,gasFee:0n,spicenetFee:0n,bridgeFee:0n,gasQuoteSource:"static_zero"}}function br(e,t){const r=e.intents.flatMap(m=>m.batches).filter(pr);if(r.length===0)return null;const n=r.filter(m=>m.chainId===t.chainId),o=n.length>0?n:r;if(o.length>1)return null;const a=o[0],{gasFee:s,spicenetFee:l,bridgeFee:p,totalFee:c}=te(a);return{chainId:a.chainId,tokenAddress:t.tokenAddress,symbol:t.symbol,decimals:t.decimals,grossAmount:hr(a),netAmount:BigInt(a.quotedAmount),totalFee:c,gasFee:s,spicenetFee:l,bridgeFee:p,gasQuoteSource:a.gasQuoteSource}}const _e=(e,t=4)=>!isFinite(e)||e===0?"0":e>0&&e<1e-6?e.toFixed(12).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e<1e-4?e.toFixed(8).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e.toFixed(t).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),wr=e=>isFinite(e)?e>0&&e<.01?"<$0.01":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e):"$0.00",je=(e,t=6,r=4)=>e.length<=t+r?e:`${e.slice(0,t)}...${e.slice(-r)}`,vr=(e,t)=>{const r=e.replace(/[^0-9.]/g,"").split("."),n=r[0]??"",o=r.slice(1).join(""),a=typeof t=="number"?Math.max(0,Math.min(t,18)):null;return r.length===1?n:`${n}.${a===null?o:o.slice(0,a)}`},xr=(e,t=6)=>!Number.isFinite(e)||e<=0?"0":e.toFixed(Math.min(Math.max(t,0),18)).replace(/\.?0+$/,""),Er=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.error("Failed to copy to clipboard:",t),!1}};function $r(e,t){return t?.length?t.some(r=>{const n=r.toLowerCase();return n===e.symbol.toLowerCase()||Ee(n).toLowerCase()===Ee(e.address).toLowerCase()||n===e.displaySymbol?.toLowerCase()||n===e.receiptTokenName?.toLowerCase()||n==="native"&&(e.isNative||M(e.address))}):!0}function Je(e){return e.displaySymbol||e.symbol}function Ge(e){return e.displayName||e.displaySymbol||e.name||e.symbol}function Cr(e,t){const r=e.location==="rollup"||e._source==="spice"||!!e.receiptTokenId&&!e.location&&!e._source,n=a=>a&&t?Object.entries(t).find(([s])=>s.toLowerCase()===a.toLowerCase())?.[1]:void 0,o=r?n(e.receiptTokenId)??n(e.receiptTokenName):void 0;return{symbol:o?.symbol||o?.name||Je(e),name:o?.name||o?.symbol||Ge({...e,name:e.name||""}),logoURI:o?.logoURI===void 0?e.logoURI:o.logoURI||null}}function kr(e){return e.displayChainName||Q(e.chainId)}function Br(e){if(e.balance===0n)return"0";const t=G(e.balance,e.decimals),r=_e(Number(t));return Number(r)===0?t:r}const He=se(void 0);function Ir(){const e=oe(He);return ve(t=>Cr(t,e),[e])}const Sr=["__spicenet_whitelist_blocked__"],Ve="spiceflow-mode",Ye=()=>{if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Ve);return e==="7702"?"7702":e==="non7702"?"ondemand":e==="embedded"?"7702":e==="external"?"ondemand":null}catch{return null}},Ar=e=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Ve,e==="7702"?"7702":"non7702")}catch{}},Tr=()=>Ye()!==null,Qe=se(null),re=se(null),Fr=({children:e,value:t,whitelist:r})=>{const n=!!r&&r.enabled!==!1,{isWhitelisted:o,isLoading:a,whitelistCheck:s}=Oe(n?r:{enabled:!1}),l=n&&!o,p=O(()=>({...t,mode:l?"ondemand":t.mode,allowedTokens:l?Sr:t.allowedTokens,isUserWhitelisted:o,isWhitelistChecking:a,isWhitelistConfigured:n,isWhitelistGateActive:l,whitelistCheck:s}),[t,n,l,o,a,s]);return $(re.Provider,{value:p,children:e})},Pr=({feeToleranceBps:e,children:t,provider:r="privy",supportedChainIds:n,allowedTokens:o,network:a="testnet",mode:s,skipFlow:l=[],nativeChainId:p,appName:c="Spicenet",apiUrl:m,theme:d,rpcOverrides:f,swapper:u,liquidityVenues:b,additionalSourceTokens:i,whitelist:g,assetDisplay:w})=>{const y=ye(e);F(()=>{if(!m)return;const L=P.getBaseUrl();return P.setBaseUrl(m),()=>P.setBaseUrl(L)},[m]),F(()=>(Ie(f),()=>Ie(void 0)),[f]);const h=O(()=>ut(a),[a]),x=n??h,E=d??null,[k,v]=D(()=>s??Ye()??"7702");F(()=>{s&&v(s)},[s]);const T=ve(L=>{if(s){v(s);return}v(L),Ar(L)},[s]),{embeddedAddress:B,externalAddress:C}=de(),J=JSON.stringify(f),R=O(qe,[a,m,J,r]),W=O(()=>({feeToleranceBps:y,inventory:R,provider:r,supportedChainIds:x,allowedTokens:o,skipFlow:l,mode:k,setMode:T,network:a,nativeChainId:p,appName:c,apiUrl:m,rpcOverrides:f,swapper:u,liquidityVenues:b,additionalSourceTokens:i,embeddedWalletAddress:B,externalWalletAddress:C,isUserWhitelisted:null,isWhitelistChecking:!1,isWhitelistConfigured:!1,isWhitelistGateActive:!1}),[R,y,r,x,o,l,k,T,a,p,c,m,f,u,b,i,B,C]);return $(Qe.Provider,{value:E,children:$(re.Provider,{value:W,children:$(Fr,{value:W,whitelist:g,children:$(He.Provider,{value:w,children:t})})})})},Rr={spacing:{xs:"0.25rem",sm:"0.5rem",md:"1rem",lg:"1.5rem",xl:"2rem"},borderRadius:{sm:"0.25rem",md:"0.5rem",lg:"0.75rem",full:"9999px"},typography:{fontFamily:K.ui,fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.75rem"},fontWeight:{normal:400,medium:500,semibold:600,bold:700}},shadows:{sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)",md:"0 4px 6px -1px rgb(0 0 0 / 0.1)",lg:"0 10px 15px -3px rgb(0 0 0 / 0.1)"},animation:{fast:"150ms ease-in-out",normal:"200ms ease-in-out",slow:"300ms ease-in-out"}},Wr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#f3f4f6",background:"#ffffff",surface:"#f9fafb",surfaceHover:"#f3f4f6",border:"#e5e7eb",borderHover:"#d1d5db",text:"#111827",textSecondary:"#374151",textMuted:"#6b7280",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},Nr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#171717",background:"#141414",surface:"#1e1e1e",surfaceHover:"#2a2a2a",border:"#2d2d2d",borderHover:"#3a3a3a",text:"#ffffff",textSecondary:"#888888",textMuted:"#666666",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},Xe=(e="light")=>({mode:e,...Rr,colors:e==="light"?Wr:Nr});function ne(e,t){const r=e.replace("#",""),n=Math.max(0,Math.round(parseInt(r.substring(0,2),16)*(1-t))),o=Math.max(0,Math.round(parseInt(r.substring(2,4),16)*(1-t))),a=Math.max(0,Math.round(parseInt(r.substring(4,6),16)*(1-t)));return`#${n.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function Ur(e,t){return{shell:t?.shell??"#141414",shellBorder:t?.shellBorder??ne(t?.shell??"#141414",.35),shellInnerBorder:t?.shellInnerBorder??ne(t?.shell??"#141414",.55),cardBg:t?.cardBg??"#1e1e1e",inputBg:t?.inputBg??"#171717",hoverBg:t?.hoverBg??"#2a2a2a",textPrimary:t?.textPrimary??"#ffffff",textSecondary:t?.textSecondary??"#888888",inputText:t?.inputText??"#e0e0e0",inputPlaceholder:t?.inputPlaceholder??"#555555",cardBorder:t?.cardBorder??"rgba(255,255,255,0.08)",inputBorder:t?.inputBorder??"rgba(255,255,255,0.10)",buttonBorder:t?.buttonBorder??"rgba(255,255,255,0.12)",successBg:t?.successBg??"#0a1f18",successBorder:t?.successBorder??"#1a4a3a",successText:t?.successText??"#6ee7b7",warningBg:t?.warningBg??"#1f1a0d",warningBorder:t?.warningBorder??"#4a3820",warningText:t?.warningText??"#fbbf24",errorBg:t?.errorBg??"#1f0d0d",errorBorder:t?.errorBorder??"#4a2020",errorText:t?.errorText??"#f87171",infoBg:t?.infoBg??"#0d1325",infoBorder:t?.infoBorder??"#2a3a5a",infoText:t?.infoText??"#60a5fa"}}function Lr(e){return{shell:"#ffffff",shellBorder:"#E9E9E9",shellInnerBorder:"#D5D5D5",cardBg:"#f9fafb",inputBg:"#ffffff",hoverBg:"#f3f4f6",textPrimary:"#111827",textSecondary:"#6b7280",inputText:"#111827",inputPlaceholder:"#9ca3af",cardBorder:"#e5e7eb",inputBorder:"#d1d5db",buttonBorder:"#0e0d0b",successBg:"#d1fae5",successBorder:"#6ee7b7",successText:"#065f46",warningBg:"#fef3c7",warningBorder:"#fde68a",warningText:"#92400e",errorBg:"#fef2f2",errorBorder:"#fecaca",errorText:"#dc2626",infoBg:"#dbeafe",infoBorder:"#93c5fd",infoText:"#1e40af"}}function Ke(e,t){const r=t?{...e,...t}:e,n=r.dark??!1,o=r.primaryColor,a=r.shell??(n?"#141414":"#ffffff");return{primaryColor:o,dark:n,fontFamily:r.fontFamily??'"Helvetica Neue", sans-serif',appName:r.appName??"Spicenet",logo:r.logo,borderRadius:r.borderRadius??"8px",shell:a,shellBorder:ne(a,n?.35:.085),shellInnerBorder:ne(a,n?.55:.165),card:r.card??(n?"#1e1e1e":"#f9fafb"),input:n?"#171717":"#ffffff",hover:n?"#2a2a2a":"#f3f4f6",text:r.text??(n?"#ffffff":"#111827"),textMuted:r.textMuted??(n?"#888888":"#6b7280"),inputText:n?"#e0e0e0":"#111827",inputPlaceholder:n?"#555555":"#9ca3af",border:r.border??(n?"rgba(255,255,255,0.08)":"#e5e7eb"),inputBorder:n?"rgba(255,255,255,0.10)":"#d1d5db",buttonBorder:n?"rgba(255,255,255,0.12)":"#0e0d0b",successBg:n?"#0a1f18":"#d1fae5",successBorder:n?"#1a4a3a":"#6ee7b7",successText:n?"#6ee7b7":"#065f46",warningBg:n?"#1f1a0d":"#fef3c7",warningBorder:n?"#4a3820":"#fde68a",warningText:n?"#fbbf24":"#92400e",errorBg:n?"#1f0d0d":"#fef2f2",errorBorder:n?"#4a2020":"#fecaca",errorText:n?"#f87171":"#dc2626",infoBg:n?"#0d1325":"#dbeafe",infoBorder:n?"#2a3a5a":"#93c5fd",infoText:n?"#60a5fa":"#1e40af"}}const Or=K.mono;function Ze(e,t){const r=oe(Qe)??void 0;return O(()=>{const n=r??{primaryColor:"#EA4B4B"},o={...e?.primaryColor?{primaryColor:e.primaryColor}:{},...e?.fontFamily?{fontFamily:e.fontFamily}:{},...t!==void 0?{dark:t}:{}},a=Ke(n,o),{dark:s,primaryColor:l,appName:p}=a,c=Xe(s?"dark":"light"),m={...c,colors:{...c.colors,primary:l,primaryHover:`${l}dd`},typography:{...c.typography,fontFamily:a.fontFamily}},d={shell:a.shell,shellBorder:a.shellBorder,shellInnerBorder:a.shellInnerBorder,cardBg:a.card,inputBg:a.input,hoverBg:a.hover,textPrimary:a.text,textSecondary:a.textMuted,inputText:a.inputText,inputPlaceholder:a.inputPlaceholder,cardBorder:a.border,inputBorder:a.inputBorder,buttonBorder:a.buttonBorder,successBg:a.successBg,successBorder:a.successBorder,successText:a.successText,warningBg:a.warningBg,warningBorder:a.warningBorder,warningText:a.warningText,errorBg:a.errorBg,errorBorder:a.errorBorder,errorText:a.errorText,infoBg:a.infoBg,infoBorder:a.infoBorder,infoText:a.infoText},f=e?.inputVariant?e.inputVariant==="dark":s;return{brand:r,theme:m,dark:s,appName:p,primaryColor:l,dk:d,palette:d,fontFamily:a.fontFamily,monoFont:Or,inputDark:f,cardBg:f?d.cardBg:"#E9E9E9",cardBorder:f?d.cardBorder:"#C6C6C6",textPrimary:d.textPrimary,textSecondary:d.textSecondary,subtitleText:f?d.textSecondary:"#979AA0"}},[r,e,t])}const et="spiceflow-spinner-keyframes";function Mr(){if(typeof document>"u"||document.getElementById(et))return;const e=document.createElement("style");e.id=et,e.textContent="@keyframes spiceflow-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",document.head.appendChild(e)}const be=({size:e=16,borderWidth:t=2,color:r="currentColor",style:n})=>{const o=we(!1);return F(()=>{o.current||(Mr(),o.current=!0)},[]),$("div",{role:"status","aria-label":"Loading",style:{width:`${e}px`,height:`${e}px`,border:`${t}px solid ${r}`,borderTop:`${t}px solid transparent`,borderRadius:"50%",animation:"spiceflow-spin 1s linear infinite",flexShrink:0,...n}})},j=({variant:e="primary",size:t="md",loading:r=!1,fullWidth:n=!1,disabled:o,children:a,className:s="",style:l,theme:p,styles:c,dark:m,...d})=>{const{theme:f,dark:u,palette:b}=Ze(c,m),i=p||f,g=m??u,[w,y]=D(!1),[h,x]=D(!1),E=g?b.shell:"white",k=()=>{switch(e){case"primary":return{backgroundColor:c?.button?.backgroundColor||i.colors.primary,color:c?.button?.color||"#ffffff",border:`1px solid ${c?.button?.backgroundColor||i.colors.primary}`};case"secondary":return{backgroundColor:i.colors.secondary,color:i.colors.text,border:`1px solid ${i.colors.border}`};case"success":return{backgroundColor:i.colors.success,color:i.colors.text,border:`1px solid ${i.colors.success}`};case"error":return{backgroundColor:i.colors.error,color:i.colors.text,border:`1px solid ${i.colors.error}`};case"ghost":return{backgroundColor:"transparent",color:i.colors.textSecondary,border:`1px solid ${i.colors.border}`};case"outline":{const C=c?.button?.backgroundColor||i.colors.primary,J=c?.button?.color||(g?"#ffffff":"#0e0d0b"),R=c?.button?.borderColor||(g?`${i.colors.primary}88`:"#0e0d0b"),W=o||r,L=g?"1px":"1.5px",tt=c?.button?.disabledBackgroundColor||`${C}88`,rt=c?.button?.disabledColor||J;return{height:"56px",backgroundColor:W?tt:h?`${C}cc`:w?`${C}ee`:C,color:W?rt:J,border:`${L} solid ${R}`,borderRadius:c?.button?.borderRadius||"12px",fontSize:"22px",fontWeight:500,fontFamily:K.mono,opacity:W?.78:1,transform:W?"none":h?"scale(0.98)":w?"translateY(-2px)":"none",boxShadow:W?`3px 3px 0px ${E}, 4px 4px 0px ${R}`:h?`2px 2px 0px ${R}`:w?`5px 5px 0px ${E}, 6px 6px 0px ${R}`:`3px 3px 0px ${E}, 4px 4px 0px ${R}`,transition:"transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease, border-color 150ms ease, color 150ms ease"}}default:return{}}},v=()=>{if(e==="outline")return{};switch(t){case"sm":return{padding:`${i.spacing.sm} ${i.spacing.md}`,fontSize:i.typography.fontSize.sm};case"md":return{padding:`${i.spacing.md} ${i.spacing.lg}`,fontSize:i.typography.fontSize.base};case"lg":return{padding:`${i.spacing.lg} ${i.spacing.xl}`,fontSize:i.typography.fontSize.lg};default:return{}}},T={borderRadius:c?.button?.borderRadius||i.borderRadius.md,fontWeight:c?.button?.fontWeight||i.typography.fontWeight.medium,fontFamily:c?.button?.fontFamily||i.typography.fontFamily,fontSize:c?.button?.fontSize||void 0,transition:"background-color 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease",cursor:o||r?"not-allowed":"pointer",opacity:(o||r)&&e!=="outline"?.6:1,width:n?"100%":"auto",display:"flex",alignItems:"center",justifyContent:"center",gap:i.spacing.sm,...k(),...v(),...c?.button?.fontSize&&{fontSize:c.button.fontSize}},B=o||r;return ae("button",{type:d.type??"button","data-spiceflow-focus":!0,"aria-busy":r||void 0,"aria-disabled":B||void 0,style:{...T,...l},className:s,disabled:B,onMouseEnter:C=>{y(!0),d.onMouseEnter?.(C)},onMouseLeave:C=>{y(!1),x(!1),d.onMouseLeave?.(C)},onMouseDown:C=>{x(!0),d.onMouseDown?.(C)},onMouseUp:C=>{x(!1),d.onMouseUp?.(C)},...d,children:[r&&$(be,{size:16}),a]})},qr=({onAuthSuccess:e,onAuthError:t,theme:r="light",className:n="",buttonText:o="Login with Privy",autoTrigger:a=!1})=>{const s=Xe(r),[l,p]=D(!1),[c,m]=D(!1),{ready:d,authenticated:f,user:u}=le(),{login:b}=kt(),{logout:i}=Bt();F(()=>{p(!0)},[]),F(()=>{a&&d&&!f&&l&&!c&&(m(!0),g())},[a,d,f,l,c]),F(()=>{if(d&&f&&u&&e){const y=u.wallet?.address||u.email?.address;y&&e(y)}},[d,f,u,e]),F(()=>{},[d,f,t]);const g=()=>{try{b()}catch(y){const h=`Login failed: ${String(y)}`;t?t(h):console.error(h)}},w=()=>{try{i()}catch(y){const h=`Logout failed: ${String(y)}`;t?t(h):console.error(h)}};if(!l)return $("div",{className:n,children:$(j,{variant:"primary",disabled:!0,theme:s,children:o})});if(!d)return $("div",{className:n,children:$(j,{variant:"primary",disabled:!0,theme:s,children:"Loading..."})});if(f&&u){const y=u.wallet?.address||u.email?.address,h=y?je(y):"Connected";return $("div",{className:n,children:ae(j,{variant:"primary",onClick:w,theme:s,children:["Logout (",h,")"]})})}return a?$("div",{className:n,children:ae("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"20px",flexDirection:"column",gap:"12px"},children:[$(be,{size:40,borderWidth:3,color:"#3b82f6"}),$("p",{style:{color:"#6b7280",fontSize:"14px"},children:"Opening login..."})]})}):$("div",{className:n,children:$(j,{variant:"primary",onClick:g,theme:s,children:o})})};export{_e as $,jt as A,kr as B,Rt as C,Br as D,Me as E,vr as F,_t as G,be as H,Nt as I,j as J,de as K,Gt as L,Ot as M,te as N,ur as O,qr as P,br as Q,We as R,A as S,gr as T,yr as U,ze as V,fr as W,dr as X,je as Y,ye as Z,Fe as _,Se as a,xr as a0,wr as a1,Er as a2,Tr as a3,Ge as a4,Je as a5,Qt as a6,Ue as a7,Pr as a8,Oe as a9,Ur as aa,Lr as ab,Ke as ac,ue as ad,H as b,Mt as c,Y as d,re as e,qe as f,U as g,Lt as h,$r as i,Wt as j,P as k,De as l,rr as m,Q as n,Ir as o,K as p,Ze as q,Z as r,S as s,I as t,Le as u,Ut as v,ar as w,Ht as x,mr as y,zt as z};
@@ -0,0 +1,37 @@
1
+ import type { Address, Hex } from "viem";
2
+ import type { CreateActionRequest } from "@spicenet-io/spiceflow-core";
3
+ import type { AerodromeVenueConfig } from "../utils/crossChainRouter/liquidityVenues";
4
+ export type LimitOrderInput = {
5
+ chainId: number;
6
+ tokenIn: Address;
7
+ tokenOut: Address;
8
+ grossAmount: bigint;
9
+ minimumOutput: bigint;
10
+ expiresAt: number;
11
+ venue?: AerodromeVenueConfig;
12
+ };
13
+ export type PreparedLimitOrder = {
14
+ user: Address;
15
+ request: CreateActionRequest;
16
+ amountIn: bigint;
17
+ minimumOutput: bigint;
18
+ feeAmount: bigint;
19
+ path: Hex;
20
+ };
21
+ export type LimitOrder = {
22
+ id: string;
23
+ user: string;
24
+ status: "open" | "executing" | "filled" | "cancelled" | "expired" | "needs_attention";
25
+ receiptToken: string;
26
+ reservedAmount: string;
27
+ expiresAt: string;
28
+ createdAt: string;
29
+ chainId: number;
30
+ tokenIn: string;
31
+ tokenOut: string;
32
+ amountIn: string;
33
+ minimumOutput: string;
34
+ actionId: string | null;
35
+ transactionHash: string | null;
36
+ lastError: string | null;
37
+ };
@@ -1,3 +1,4 @@
1
+ import type { LimitOrder } from "../../types/limitOrders";
1
2
  import type { CreateActionRequest, CreateActionResponse, CreateWalletRequest, CreateWithdrawalRequest, CreateWithdrawalResponse, ExecuteStepRequest, FeeEstimateSummary, RollupTimestamp, WalletInfo, WithdrawalStatus } from "@spicenet-io/spiceflow-core";
2
3
  import { ChainAuthorization, ChainBatch } from "../../types/authorization";
3
4
  import { SwapStep } from "../../types/status";
@@ -12,6 +13,13 @@ export declare class RelayerService {
12
13
  setBaseUrl(url: string): void;
13
14
  getBaseUrl(): string;
14
15
  private requestJson;
16
+ createLimitOrder(request: CreateActionRequest): Promise<LimitOrder>;
17
+ getLimitOrder(id: string): Promise<LimitOrder>;
18
+ listLimitOrders(user: string, after?: string): Promise<{
19
+ orders: LimitOrder[];
20
+ nextCursor: string | null;
21
+ }>;
22
+ cancelLimitOrder(id: string, signature: `0x${string}`): Promise<LimitOrder>;
15
23
  createAction(request: CreateActionRequest): Promise<CreateActionResponse>;
16
24
  estimateActionFees(request: CreateActionRequest, opts?: {
17
25
  signal?: AbortSignal;
@@ -13,6 +13,9 @@ type SpicenetBatchParams = {
13
13
  amount: bigint;
14
14
  }>;
15
15
  requestTimestampMs?: number;
16
+ expiresAt?: number;
17
+ metadata?: string;
18
+ requestNonce?: `0x${string}`;
16
19
  };
17
- export declare function buildSpicenetWithdrawalBatch({ userAddress, destinationChainId, deliveryToken, deliveryAmount, withdrawalAmount, deliveryRecipient, deliveryTransfers, requestTimestampMs, }: SpicenetBatchParams): ChainBatch | null;
20
+ export declare function buildSpicenetWithdrawalBatch({ userAddress, destinationChainId, deliveryToken, deliveryAmount, withdrawalAmount, deliveryRecipient, deliveryTransfers, requestTimestampMs, expiresAt, metadata, requestNonce, }: SpicenetBatchParams): ChainBatch | null;
18
21
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spicenet-io/spiceflow-ui",
3
- "version": "4.14.4",
3
+ "version": "4.15.0",
4
4
  "description": "Spiceflow UI SDK",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -1,2 +0,0 @@
1
- "use client";
2
- import{jsx as $,jsxs as ae}from"react/jsx-runtime";import{useContext as oe,useMemo as M,useRef as we,useEffect as F,createContext as se,useCallback as ve,useState as O}from"react";import{isNativeToken as q,getChainMeta as xe,getTokensForChain as nt,ZERO_ADDRESS as at,getDelegateContract as ot,getTokenByAddress as st,DELEGATE_ABI as it,ERC20_ABI as lt,spicenetEscrowAbi as ct,uniV3SwapRouterAbi as dt,normalizeNativeTokenAddress as Ee,getChainIdsByNetwork as ut}from"@spicenet-io/spiceflow-core";import{useQuery as ft,useMutation as mt}from"@tanstack/react-query";import{isAddress as N,getAddress as ie,defineChain as pt,createPublicClient as ht,http as gt,erc20Abi as yt,createWalletClient as bt,custom as wt,formatUnits as J,isHex as vt,decodeErrorResult as xt,hexToString as Et}from"viem";import{useWallets as $e,usePrivy as le,getEmbeddedConnectedWallet as Ce,useSign7702Authorization as $t,useSignMessage as Ct,useLogin as Bt,useLogout as kt}from"@privy-io/react-auth";import{useAccount as Be}from"wagmi";import{readContract as It}from"viem/actions";function H(e,t){return!e||!t?!1:q(e)&&q(t)?!0:N(e)&&N(t)?ie(e)===ie(t):e.toLowerCase()===t.toLowerCase()}const At="0xcA11bde05977b3631167028862bE2a173976CA11",St={4114:"0x860aFc632a6D625B95d8B96f39ECC48E988c6962"},Tt=new Set([5115]);function Ft(e){const t=St[e.id]??(Tt.has(e.id)?void 0:At);return pt({id:e.id,name:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:{default:{http:[e.rpcUrl]}},blockExplorers:{default:{name:e.displayName,url:e.blockExplorer}},testnet:e.network==="testnet",...t?{contracts:{multicall3:{address:t}}}:{}})}const Pt=[1,8453,42161,4114,4663,56,137,143,11155111,421614,84532,5115,123420001114,688688,688689,46630],V=Object.fromEntries(Pt.map(e=>xe(e)).filter(e=>e!=null).map(e=>[e.id,{...e,viemChain:Ft(e),supportedTokens:nt(e.id)}])),Rt=V;let ke={};const ce=new Map,Ie=e=>{ke={...e||{}},ce.clear()},Y=(e,t=ke)=>{const r=t[e];return r&&typeof r=="string"&&r.length>0?r:V[e]?.rpcUrl||void 0},U=e=>V[e],Q=e=>{const t=xe(e);return t?.displayName||t?.name||`Chain ${e}`},Wt=e=>{const t=ot(e);if(!t)throw new Error(`Unsupported chain ID: ${e}`);return t},Nt=(e,t,r)=>{const n=U(e);return n?.blockExplorer?`${n.blockExplorer}/tx/${t}`:"#"};async function Ut(e,t){const r=`0x${t.toString(16)}`;try{await e.request({method:"wallet_switchEthereumChain",params:[{chainId:r}]});return}catch(a){if(!(a?.code===4902||typeof a?.message=="string"&&a.message.includes("Unrecognized chain ID")))throw a}const n=U(t);if(!n)throw new Error(`Cannot add unknown chain ${t} to wallet`);const o=Y(t);if(!o)throw new Error(`Configure SpiceFlowProvider rpcOverrides[${t}] before adding this chain.`);await e.request({method:"wallet_addEthereumChain",params:[{chainId:r,chainName:n.name||`Chain ${t}`,nativeCurrency:n.nativeCurrency||{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:[o],blockExplorerUrls:n.blockExplorer?[n.blockExplorer]:void 0}]})}const Ae=(e,t)=>{const r=U(e);if(!r)throw new Error(`Unsupported chain ID: ${e}`);const n=Y(e,t);if(!n)throw new Error(`No RPC URL configured for chain ID: ${e}`);const o=`${e}:${n}`,a=ce.get(o);if(a)return a;const s=ht({chain:r.viemChain,transport:gt(n,{timeout:15e3,retryCount:2,retryDelay:300}),batch:{multicall:{wait:16}}});return ce.set(o,s),s},Lt=e=>{const t={};return Object.values(V).forEach(r=>{const n=Y(r.id,e);n&&(t[r.id]={name:r.name,chain:r.viemChain,rpcUrl:n})}),t},Mt=(e,t=[])=>{const r=U(e);if(!r)return[];const n=[];if(![11155111,421614,688689].includes(e)){const a=t.find(s=>s.chainId===e&&s.isNative);a?n.push(a):n.push({address:at,name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:void 0,isNative:!0,chainId:e})}if(!r.supportedTokens)return n;const o=n.some(a=>a.isNative);return r.supportedTokens.forEach(a=>{if(o&&q(a.address))return;const s=t.find(l=>l.chainId===e&&H(l.address,a.address));s?n.push(s):n.push({address:a.address,name:a.name,symbol:a.symbol,decimals:a.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:a.logo,isNative:!1,chainId:e})}),n},qt=async(e,t,r)=>{const n=U(e);if(!n)throw new Error(`Unsupported chain ID: ${e}`);const o=t.toLowerCase(),a=n.supportedTokens?.find(l=>H(l.address,o));let s;if(q(o)){if(n.nativeCurrency?.decimals==null)throw new Error(`Native currency decimals not configured for chain ${e}`);s=n.nativeCurrency.decimals}else if(a)s=a.decimals;else{if(!N(t,{strict:!1}))throw new Error(`Could not determine decimals for invalid token address: ${t}`);const l=Ae(e,r);try{s=await It(l,{address:ie(t),abi:yt,functionName:"decimals"})}catch(p){throw Object.assign(new Error(`Could not determine decimals for token ${t} on chain ${e}. Check the token contract and RPC configuration, then try again.`),{cause:p})}}if(!Number.isInteger(s)||s<0||s>255)throw new Error(`Invalid token decimals for ${t} on chain ${e}. Expected an integer from 0 to 255.`);return s},Dt=e=>{const t=e?.wallet;if(t?.address&&t.walletClientType==="privy"&&t.connectorType==="embedded"&&!t.imported)return t.address},Se=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getWalletClient=="function"){const r=t===void 0?[void 0]:[String(t),t,void 0];let n=null;for(const o of r)try{const a=await e.getWalletClient(o);if(a)return a}catch(a){n=a}if(n)throw n}if(typeof e.getEthereumProvider=="function"){const r=await e.getEthereumProvider(),n=t?U(t)?.viemChain:void 0;return bt({account:e.address,chain:n,transport:wt(r)})}throw new Error("Wallet client not available")},Ot=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getEthereumProvider=="function")return e.getEthereumProvider();const r=await Se(e,t);return{request:n=>r.request(n)}},X=e=>e?.address?{address:e.address,wallet:e,getWalletClient:t=>Se(e,t),getEthereumProvider:t=>Ot(e,t)}:null,de=()=>{const e=Be(),t=e.status==="connected"?e.address:void 0,r=e.connector;let n=null,o=null;try{n=$e(),{user:o}=le()}catch{n=null,o=null}const a=n?.wallets||[],s=Ce(a),l=s?.address?.toLowerCase(),p=a.find(g=>g.connectorType!=="embedded"&&g.address?.toLowerCase()!==l),c=t?.toLowerCase(),m=t&&r&&!(c&&l&&c===l)?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,d=t&&r?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,f=X(s),u=X(m)||X(p),b=f?.address||Dt(o),i=X(d)||u;return{embeddedWallet:f,externalWallet:u,embeddedAddress:b,externalAddress:u?.address,activeWallet:i,activeAddress:i?.address}},zt={base:0,raised:1,sticky:10,overlay:20,popover:40,modal:1e3,dropdown:1100,toast:1200,tooltip:1300},_t={none:"0",sm:"4px",md:"6px",card:"8px",input:"10px",shell:"9px",modal:"12px",pill:"9999px",circle:"50%"},I={out:"cubic-bezier(0.22, 1, 0.36, 1)",inOut:"cubic-bezier(0.65, 0, 0.35, 1)",linear:"linear"},A={fast:"120ms",normal:"150ms",slow:"300ms",progress:"400ms"},jt={interactive:`transform ${A.normal} ${I.out}, box-shadow ${A.normal} ${I.out}, background-color ${A.normal} ${I.out}, border-color ${A.normal} ${I.out}, color ${A.normal} ${I.out}`,color:`background-color ${A.normal} ${I.out}, border-color ${A.normal} ${I.out}, color ${A.normal} ${I.out}`,popover:`opacity ${A.normal} ${I.out}, transform ${A.normal} ${I.out}`},K={ui:'"Helvetica Neue", sans-serif',mono:'"IBM Plex Mono", monospace'};class S extends Error{constructor(t,r,n={}){super(r),this.code=t,this.context=n,this.name="SpiceflowError",Error.captureStackTrace&&Error.captureStackTrace(this,S)}}function ue(e){return e instanceof S}const Gt=["user rejected","user denied","user cancelled","rejected the request","action_rejected","4001"];function Te(e){if(!e)return"";if(typeof e=="string")return e;const t=e,r=t.message||t.reason||"",n=t.details||"";return`${r} ${n}`.trim()}const Fe=e=>{if(ue(e))return e.code==="WALLET_REJECTED";const t=Te(e).toLowerCase();return Gt.some(r=>t.includes(r))};let fe=null;function Jt(e){return fe?.message===e?fe.detail:void 0}const Ht=(e,t="Something went wrong. Please try again.")=>{if(Fe(e))return"Transaction was rejected.";if(ue(e)){const r=e.message||t,{requestId:n,httpStatus:o,responseBody:a,endpoint:s}=e.context;return(n||o||s)&&(fe={message:r,detail:{requestId:n,httpStatus:o,responseBody:a,endpoint:s}}),r}return Te(e)||t},Vt=[...it,...lt,...ct,...dt];function me(e,t=0){return t>4||e==null?[]:typeof e=="string"?e.match(/0x[0-9a-fA-F]{8,}/g)??[]:Array.isArray(e)?e.flatMap(r=>me(r,t+1)):typeof e=="object"?Object.values(e).flatMap(r=>me(r,t+1)):[]}function Pe(e){try{const t=xt({abi:Vt,data:e});if(t.errorName==="Error")return String(t.args?.[0]??"");if(t.errorName==="Panic")return`Panic(${t.args?.[0]})`;if(t.errorName==="CallReverted"){const r=t.args?.[4],n=r&&r!=="0x"?Pe(r):void 0;return n?`Call reverted: ${n}`:"Call reverted (no reason returned)"}return t.errorName}catch{try{const t=Et(e).replace(/\x00+$/g,"").trim();return/^[\x20-\x7e]+$/.test(t)&&t.length>1?t:void 0}catch{return}}}function Yt(e){for(const t of me(e)){if(!vt(t))continue;const r=Pe(t);if(r)return r}}function Re(e,t){const r=t.match(/Output amount (\d+) is insufficient after fees (\d+) on chain (\d+)/);if(!r)return t;const[,n,o,a]=r,s=Number(a),l=BigInt(n),p=BigInt(o);let c;for(const w of e.intents){const y=w.chainBatches.find(h=>h.chainId===s);if(y){c=y;break}}const m=c?.tokenTransfers.find(w=>w.from==="escrow"&&H(w.to,e.user)&&!q(w.token)),d=Q(s);if(!m)return`Amount is too small to cover the estimated fee on ${d}.`;const f=st(m.token,s),u=f?.decimals??18,b=f?.symbol??"tokens",i=J(l,u),g=J(p,u);return`Amount is too small to cover the estimated fee on ${d}. Amount: ${i} ${b}. Estimated fee: ${g} ${b}.`}function Qt(e){return e?.code===4902||e?.name==="ChainNotConfiguredError"?"This network is not configured in your wallet. Please add it manually to continue.":e?.code===4001?"Network switch cancelled. Please switch manually in your wallet to continue.":"Unable to switch network. Please switch manually in your wallet to continue."}const Xt="https://tx-submission-api.spicenet.io",We=Xt;function Kt(e,t){return typeof t=="bigint"?t.toString():t}function D(e,t=""){if(Array.isArray(e))e.forEach((r,n)=>D(r,`${t}[${n}]`));else if(e&&typeof e=="object")for(const[r,n]of Object.entries(e)){const o=t?`${t}.${r}`:r;if(!n&&(r==="user"||r==="to"||r==="from"||r==="address"))throw new S("INVALID_PARAMS",`Wallet not ready: ${o} is missing from the request. Wait a moment and retry, or log in again.`,{path:o});D(n,o)}}async function Z(e,t){const r={...t?.headers},n=(t?.method??"GET").toUpperCase();(t?.body!=null||n!=="GET"&&n!=="HEAD")&&(r["x-request-id"]??(r["x-request-id"]=crypto.randomUUID()));const o=await fetch(e,{...t,headers:r}),a=o.headers.get("x-request-id")??"";return Object.assign(o,{requestId:a})}function z(e,t){if(!e)return t;const r=e.error,n=(typeof e.message=="string"?e.message:"")||(r&&typeof r=="object"&&"message"in r&&typeof r.message=="string"?r.message:"")||(typeof r=="string"?r:"")||t,o=Yt(e);return o&&!n.includes(o)?`${n} \u2014 ${o}`:n}async function Zt(e){try{return await e.json()}catch{return null}}function er(e){return(Array.isArray(e?.balances)?e.balances:[]).flatMap(t=>{if(!t||typeof t!="object")return[];const r=t;return[{receiptToken:typeof r.receiptToken=="string"?r.receiptToken:void 0,tokenName:String(r.tokenName??""),balanceAvailable:String(r.balanceAvailable??"0"),chainTokens:Array.isArray(r.chainTokens)?r.chainTokens.filter(n=>typeof n=="string"):r.chainTokens&&typeof r.chainTokens=="object"?r.chainTokens:r.chainTokenConfig&&typeof r.chainTokenConfig=="object"?r.chainTokenConfig:void 0,decimals:typeof r.decimals=="number"?r.decimals:void 0,balanceUsd:typeof r.balanceUsd=="number"||typeof r.balanceUsd=="string"?r.balanceUsd:null}]})}class tr{constructor(){this.baseUrl=We,this.feeValidationAvailable=!1}setBaseUrl(t){t!==this.baseUrl&&(this.feeValidationAvailable=!1),this.baseUrl=t}getBaseUrl(){return this.baseUrl}async requestJson(t,r){const n=`${this.baseUrl}${t}`,o=await Z(n,r.method&&r.method!=="GET"?{method:r.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(r.body,Kt),signal:r.signal}:{signal:r.signal}),a=await o.json();if(!o.ok||a.success===!1||r.ok&&!r.ok(a)){const s=z(a,r.fallbackError(o.status));throw new S(r.code??"RELAYER_ERROR",r.mapError?r.mapError(s):s,{httpStatus:o.status,requestId:o.requestId,responseBody:JSON.stringify(a),endpoint:t,...r.context})}return a}async createAction(t){return D(t),this.requestJson("/actions",{method:"POST",body:t,fallbackError:r=>`Relayer API error: ${r}`})}async estimateActionFees(t,r){D(t);const n=this.baseUrl,o=await this.requestJson("/actions/fees/estimate",{method:"POST",body:t,signal:r?.signal,fallbackError:a=>`Relayer fee estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.feeEstimate,mapError:a=>Re(t,a)});return n===this.baseUrl&&(this.feeValidationAvailable=o.data?.supportsFeeValidation===!0),o.data.feeEstimate}canValidateActionFees(){return this.feeValidationAvailable}async validateActionFees(t,r){return D(t),(await this.requestJson("/actions/fees/validate",{method:"POST",body:t,signal:r?.signal,fallbackError:n=>`Relayer fee validation error: ${n}`,ok:n=>!!n.success&&!!n.data?.feeEstimate,mapError:n=>Re(t,n)})).data.feeEstimate}async estimateBatchGas(t){D(t);const{signal:r,...n}=t,o=await this.requestJson("/actions/gas/estimate",{method:"POST",body:n,signal:r,fallbackError:a=>`Relayer gas estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.gasFee});return{gasFee:BigInt(o.data.gasFee),gasQuoteSource:o.data.gasQuoteSource,simulationVerified:o.data.simulationVerified===!0,platformFee:o.data.platformFee===void 0?void 0:BigInt(o.data.platformFee)}}async executeStep(t,r,n,o){const a=`${this.baseUrl}/actions/${t}/intents/${r}/steps/${n}`,s=`/actions/${t}/intents/${r}/steps/${n}`,l=crypto.randomUUID(),p=3e4,c=new Promise((f,u)=>setTimeout(()=>u(new S("RELAYER_EXECUTE_ERROR",`Execute step request timed out after ${p/1e3}s`,{actionId:t,intentIndex:r,stepIndex:n,endpoint:s,requestId:l})),p)),m=await Promise.race([Z(a,{method:"POST",headers:{"Content-Type":"application/json","x-request-id":l},body:JSON.stringify(o)}),c]),d=await m.json();if(!m.ok||d.success===!1)throw new S("RELAYER_EXECUTE_ERROR",z(d,`Execute step error: ${m.status}`),{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t});if(d?.status==="error"||d?.status==="reverted"){const f=z(d,""),u=f?`: ${f}`:"";throw new S("RELAYER_EXECUTE_ERROR",`Step ${n} previously ${d.status}${u}`,{httpStatus:m.status,requestId:m.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t,intentIndex:r,stepIndex:n,stepStatus:d.status})}return{success:!0,status:d.status,transactionHash:d.transactionHash}}async checkStepStatus(t,r){const n=t.split("/"),o=n[0],a=n.length>=2?n[1]:"0",s=await this.requestJson(`/actions/${o}/intents/${a}/steps/${r}`,{fallbackError:l=>`Intent step status check failed: ${l}`,code:"RELAYER_STATUS_ERROR",context:{intentId:t}});return{success:!0,data:{status:s.status==="error"?"reverted":s.status,transactionHash:s.txid,error:z(s,"")}}}async createWallet(t,r){return this.requestJson(`/wallets/${t}`,{method:"PUT",body:r,fallbackError:n=>`Create wallet error: ${n}`})}async getWallet(t){return this.requestJson(`/wallets/${t}`,{fallbackError:r=>`Get wallet error: ${r}`})}async createWithdrawal(t){return this.requestJson("/withdrawals",{method:"POST",body:t,fallbackError:r=>`Create withdrawal error: ${r}`})}async getWithdrawal(t){return this.requestJson(`/withdrawals/${t}`,{fallbackError:r=>`Get withdrawal error: ${r}`})}async getRollupTimestamp(){return this.requestJson("/time",{fallbackError:t=>`Get rollup timestamp error: ${t}`})}}const P=new tr;async function rr(e){const t=`${P.getBaseUrl()}/wallets/${e}/balance`,r=await Z(t,{cache:"no-store"}),n=await Zt(r);if(!r.ok||n?.success===!1)throw new S("RELAYER_ERROR",z(n,`Unable to verify Spice balance: ${r.status}`),{httpStatus:r.status,requestId:r.requestId,responseBody:JSON.stringify(n),endpoint:`/wallets/${e}/balance`});return er(n)}const pe=new Map,ee=new Set;function he(e){return JSON.stringify([P.getBaseUrl(),e.toLowerCase()])}function _(e,t){if(he(e)!==t)throw new Error("Wallet backend changed during registration. Please retry.")}function nr(e){if(!(e instanceof S))return!1;const t=e.context.httpStatus;return t===400||t===404?`${e.message} ${String(e.context.responseBody??"")}`.toLowerCase().includes("not found"):!1}async function Ne(e){const t=he(e);if(ee.has(t))return!0;try{return await P.getWallet(e),_(e,t),ee.add(t),!0}catch(r){if(!nr(r))throw r;return!1}}async function Ue(e,t){const r=he(e);if(ee.has(r))return;const n=pe.get(r);if(n)return n;const o=(async()=>{const a=await Ne(e);if(_(e,r),a)return;const{unix_timestamp:s}=await P.getRollupTimestamp();_(e,r);const l=`I am creating a new smart wallet and adding an admin wallet ethereum:0x${e.slice(2).toLowerCase()}. Nonce: ${s}`,p=await t(l);_(e,r);const c=typeof p=="string"?p:p.signature;if(!c)throw new Error("Wallet returned no smart wallet signature");await P.createWallet(e,{timestamp:s,signature:c}),_(e,r),ee.add(r)})();pe.set(r,o);try{await o}finally{pe.delete(r)}}const ar=(e,t)=>{const r=o=>t?t(o):Q(o),n=[];return e.forEach((o,a)=>{const s=o.calls&&o.calls.length>0,l=o.tokenTransfers&&o.tokenTransfers.length>0;!s&&!l||n.push({stepId:a,status:a===0?"processing":"pending",chainId:o.chainId,chainName:r(o.chainId),description:"Processing transaction"})}),n},Le=()=>{const e=oe(re),t=e?.mode,{isConnected:r,address:n}=Be();let o=null,a=null,s=null,l=null,p=null;try{o=le(),a=$t(),s=Ct(),l=$e()}catch(h){p=h instanceof Error?h.message:String(h)}if(p)return t==="ondemand"&&r&&n?{isReady:!0,isAuthenticated:!0,isConnected:!0,address:n,provider:"privy",actions:{signAuthorization:async()=>{throw new Error("Not available in ondemand mode")},signMessage:async()=>{throw new Error("Not available in ondemand mode")},getEthereumProvider:async()=>{throw new Error("Not available in ondemand mode")}}}:{isReady:!1,isAuthenticated:!1,isConnected:!1,provider:null,actions:{signAuthorization:async()=>{throw new Error("Privy not available")},signMessage:async()=>{throw new Error("Privy not available")},getEthereumProvider:async()=>{throw new Error("Privy not available")}}};const{ready:c=!1,authenticated:m=!1}=o||{},d=e?.embeddedWalletAddress,f=Ce(l?.wallets||[]),u=d||f?.address,b=!!u&&!!f,i={isReady:t==="ondemand"?!0:c,isAuthenticated:t==="ondemand"?!0:m||b,isConnected:t==="ondemand"?r&&!!n||c&&(m||b)&&b:c&&b,address:t==="ondemand"&&r?n:u,provider:"privy"},g=async(h,x)=>{if(!f)throw new Error("Embedded wallet not available");const E=await f.getEthereumProvider(),{createWalletClient:B,custom:v}=await import("viem"),T=B({account:f.address,transport:v(E)});return x?.(),{signature:await T.signMessage({account:f.address,message:h})}},w=async h=>{if(s)try{return{signature:(await s.signMessage({message:h})).signature}}catch(x){if(!f)throw x}if(!f)throw new Error("Privy sign message not available");return g(h)},y=async()=>{if(!u)throw new Error("Embedded wallet not available for smart wallet setup");await Ue(u,w)};return{...i,actions:{prepareSigning:async()=>{if(!u)throw new Error("Embedded wallet not available");await Ne(u)},signAuthorization:async(h,x)=>{if(!a)throw new Error("Privy sign authorization not available");try{await y(),x?.();const E=await a.signAuthorization({contractAddress:h.contractAddress,chainId:h.chainId,nonce:h.nonce},{address:u});return delete E.v,E}catch(E){const B=typeof E?.message=="string"?E.message:String(E?.message??E??"");throw B.includes("not configured")||B.includes("chain")?new Error(`Chain ${h.chainId} is not configured in PrivyProvider. Add this chain to your Privy dashboard or supportedChainIds.`):E}},signMessage:async(h,x)=>{if(typeof h=="object"&&"raw"in h){if(await y(),!f)throw new Error("Embedded wallet not available for raw signing");return g(h,x)}return x?.(),w(h)},getEthereumProvider:async()=>{if(!f)throw new Error("Embedded wallet not available");return f.getEthereumProvider()}}}},or="https://portal-api.spicenet.io/api/v1",ge=e=>e.replace(/\/+$/,""),sr=(e,t)=>`${e}:${t}`;async function ir(e,t){const r=new URLSearchParams({walletAddress:t,campaignId:"spicenet-portal",campaignGroup:"1"}),n=await fetch(`${e}/portal/mainnet/linked-portal-wallet?${r.toString()}`,{cache:"no-store"});if(!n.ok){if(n.status>=500){const o=new Error(`Failed to resolve linked portal wallet: ${n.status}`);throw o.status=n.status,o}return null}return(await n.json()).portalWalletAddress?.toLowerCase()??null}async function lr(e,t,r){const n=new URLSearchParams({walletAddress:t,campaignId:r.campaignId,campaignGroup:r.campaignGroup,partnerId:r.partnerId}),o=await fetch(`${e}/portal/mainnet/whitelist/check?${n.toString()}`,{cache:"no-store"});if(!o.ok){const a=new Error(`Failed to check whitelist: ${o.status}`);throw a.status=o.status,a}return await o.json()}async function cr(e,t,r,n){const o=await fetch(`${e}/portal/mainnet/link-wallet`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({campaignId:t.campaignId,campaignGroup:t.campaignGroup,partnerId:t.partnerId,externalWalletAddress:r,embeddedWalletAddress:n})});if(!o.ok)throw new Error(`Failed to link wallet: ${o.status}`)}function Me({walletAddress:e,campaignId:t,campaignGroup:r,partnerId:n,apiBaseUrl:o=or,enabled:a=!0,staleTime:s=5*60*1e3,refetchInterval:l=!1}={}){const{isAuthenticated:p,isConnected:c}=Le(),{externalAddress:m,embeddedAddress:d}=de(),f=e??m,u=typeof f=="string"?f.toLowerCase():void 0,b=typeof d=="string"?d.toLowerCase():void 0,i=typeof m=="string"?m.toLowerCase():void 0,g=a&&p&&c&&!!m&&!!u&&N(u)&&!!t&&!!r&&!!n,w=M(()=>["partner-whitelist","check",u,t,r,n,ge(o)],[u,t,r,n,o]),y=ft({queryKey:w,enabled:g,staleTime:s,refetchInterval:l,retry:(v,T)=>{const k=T?.status;return typeof k=="number"&&k>=400&&k<500?!1:v<3},retryDelay:v=>Math.min(1e3*2**v,15e3),queryFn:async()=>{if(!u||!N(u))throw new Error("A valid wallet address is required");if(!t||!r||!n)throw new Error("campaignId, campaignGroup, and partnerId are required");const v=ge(o),T={campaignId:t,campaignGroup:r,partnerId:n},k=await ir(v,u);return k?lr(v,k,T):{walletAddress:u,campaignId:t,campaignGroup:r,partnerId:n,isWhitelisted:!1,isLinkedWallet:!1,whitelistedWalletAddress:null,externalWalletAddress:u}}}),h=a&&p&&c&&!!i&&N(i)&&!!b&&N(b)&&!!t&&!!r&&!!n,x=mt({mutationFn:v=>cr(ge(o),{campaignId:t,campaignGroup:r,partnerId:n},v.external,v.embedded)}),E=we(new Set),B=x.mutate;return F(()=>{if(!h||!i||!b||!t||!r||!n)return;const v=sr(i,b);E.current.has(v)||(E.current.add(v),B({external:i,embedded:b}))},[h,i,b,t,r,n,B]),{isWhitelisted:y.data?.isWhitelisted??!1,whitelistCheck:y.data,checkedWalletAddress:u,externalWalletAddress:m,embeddedWalletAddress:d,isExternalWalletConnected:!!m,isWhitelistCheckEnabled:g,linkWallet:x,isWalletLinked:x.isSuccess,...y}}const qe={assets:[],loading:!1,refreshing:!1,error:null,updatedAt:null};function De(){const e=new Map,t=new Map,r=new WeakMap;let n=0;function o(){let a=qe;const s=new Map;let l,p=null,c=0,m=!1,d;const f=()=>s.forEach((i,g)=>g()),u=()=>{if(!d||!s.size)return Promise.resolve();if(p)return p;const i=++c;return a={...a,loading:a.updatedAt===null,refreshing:!0},f(),p=Promise.resolve().then(d).then(g=>{if(i!==c)return;const{assets:w,error:y=null}=Array.isArray(g)?{assets:g}:g;a={assets:w,loading:!1,refreshing:!1,error:y,updatedAt:Date.now()}},g=>{i===c&&(a={...a,loading:!1,refreshing:!1,error:g instanceof Error?g.message:"Unable to refresh balances"})}).finally(()=>{i===c&&(p=null,f(),m&&(m=!1,u()))}),p},b=()=>{clearInterval(l);const i=[...s.values()].filter(g=>g>0);i.length&&(l=setInterval(()=>void u(),Math.min(...i)))};return{snapshot:()=>a,refresh:u,invalidate:()=>p?(m=!0,p.then(()=>p??Promise.resolve())):u(),subscribe(i,g,w){return d=g,s.set(i,w),b(),u(),()=>{s.delete(i),b(),s.size||(c++,p=null,m=!1,a={...a,loading:!1,refreshing:!1})}}}}return{entry(a){let s=e.get(a);return s||(s=o(),e.set(a,s)),s},fetcherId(a){return r.has(a)||r.set(a,++n),r.get(a)},registerTokens(a){let s=!1;for(const l of a){const p=`${l.chainId}:${l.address.toLowerCase()}`;t.has(p)||(t.set(p,l),s=!0)}s&&e.forEach(l=>l.invalidate())},tokens:()=>[...t.values()],invalidate:()=>Promise.all([...e.values()].map(a=>a.invalidate())).then(()=>{})}}function Oe(e,t){return e<=0n||t<=0n?0n:(e*t+10000n-1n)/10000n}function dr(e,t,r){const n=(e>t?e-t:0n)*10000n/(10000n+r),o=Oe(n,r),a=n>0n,s=a?o+t:0n;return{netAmount:n,spicenetFee:a?o:0n,totalFee:s,grossAmount:n+s,coversFees:a}}function ur(e,t,r){if(e===t)return!0;const n=e>t?e:t;return n===0n?!1:(e>t?e-t:t-e)*10000n<=n*r}function ye(e=4e3){if(!Number.isInteger(e)||e<0||e>1e4)throw new Error("feeToleranceBps must be an integer between 0 and 10000");return e}function ze(e,t,r){const n=BigInt(ye(r));return(e>t?e-t:t-e)*10000n<=e*n}function fr(e,t,r){return["gasFee","spicenetFee","bridgeFee"].every(n=>ze(e[n]??0n,t[n]??0n,r))}function mr(e,t){const r=J(e,t);return r.includes(".")?r.replace(/\.?0+$/,"")||"0":r}function te(e){const t=BigInt(e.feeBreakdown.spicenetFee),r=BigInt(e.feeBreakdown.gasFee),n=BigInt(e.feeBreakdown.bridgeFee??"0"),o=t+r+n;return{spicenetFee:t,gasFee:r,bridgeFee:n,totalFee:o}}function pr(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=te(e);return t>0n||r>0n||n>0n}function hr(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=te(e),o=t+n;return r>o?r:o}function gr(e){const t=[];for(const r of e.intents)for(const n of r.batches)t.push(BigInt(n.quotedAmount));return t.length!==1?null:t[0]}function yr(e,t,r){return e.length===0||!e.every(n=>n.domain!=="spicenet"&&!n.tokenTransfers?.length)?null:{...t,grossAmount:r,netAmount:r,totalFee:0n,gasFee:0n,spicenetFee:0n,bridgeFee:0n,gasQuoteSource:"static_zero"}}function br(e,t){const r=e.intents.flatMap(m=>m.batches).filter(pr);if(r.length===0)return null;const n=r.filter(m=>m.chainId===t.chainId),o=n.length>0?n:r;if(o.length>1)return null;const a=o[0],{gasFee:s,spicenetFee:l,bridgeFee:p,totalFee:c}=te(a);return{chainId:a.chainId,tokenAddress:t.tokenAddress,symbol:t.symbol,decimals:t.decimals,grossAmount:hr(a),netAmount:BigInt(a.quotedAmount),totalFee:c,gasFee:s,spicenetFee:l,bridgeFee:p,gasQuoteSource:a.gasQuoteSource}}const _e=(e,t=4)=>!isFinite(e)||e===0?"0":e>0&&e<1e-6?e.toFixed(12).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e<1e-4?e.toFixed(8).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e.toFixed(t).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),wr=e=>isFinite(e)?e>0&&e<.01?"<$0.01":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e):"$0.00",je=(e,t=6,r=4)=>e.length<=t+r?e:`${e.slice(0,t)}...${e.slice(-r)}`,vr=(e,t)=>{const r=e.replace(/[^0-9.]/g,"").split("."),n=r[0]??"",o=r.slice(1).join(""),a=typeof t=="number"?Math.max(0,Math.min(t,18)):null;return r.length===1?n:`${n}.${a===null?o:o.slice(0,a)}`},xr=(e,t=6)=>!Number.isFinite(e)||e<=0?"0":e.toFixed(Math.min(Math.max(t,0),18)).replace(/\.?0+$/,""),Er=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.error("Failed to copy to clipboard:",t),!1}};function $r(e,t){return t?.length?t.some(r=>{const n=r.toLowerCase();return n===e.symbol.toLowerCase()||Ee(n).toLowerCase()===Ee(e.address).toLowerCase()||n===e.displaySymbol?.toLowerCase()||n===e.receiptTokenName?.toLowerCase()||n==="native"&&(e.isNative||q(e.address))}):!0}function Ge(e){return e.displaySymbol||e.symbol}function Je(e){return e.displayName||e.displaySymbol||e.name||e.symbol}function Cr(e,t){const r=e.location==="rollup"||e._source==="spice"||!!e.receiptTokenId&&!e.location&&!e._source,n=a=>a&&t?Object.entries(t).find(([s])=>s.toLowerCase()===a.toLowerCase())?.[1]:void 0,o=r?n(e.receiptTokenId)??n(e.receiptTokenName):void 0;return{symbol:o?.symbol||o?.name||Ge(e),name:o?.name||o?.symbol||Je({...e,name:e.name||""}),logoURI:o?.logoURI===void 0?e.logoURI:o.logoURI||null}}function Br(e){return e.displayChainName||Q(e.chainId)}function kr(e){if(e.balance===0n)return"0";const t=J(e.balance,e.decimals),r=_e(Number(t));return Number(r)===0?t:r}const He=se(void 0);function Ir(){const e=oe(He);return ve(t=>Cr(t,e),[e])}const Ar=["__spicenet_whitelist_blocked__"],Ve="spiceflow-mode",Ye=()=>{if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Ve);return e==="7702"?"7702":e==="non7702"?"ondemand":e==="embedded"?"7702":e==="external"?"ondemand":null}catch{return null}},Sr=e=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Ve,e==="7702"?"7702":"non7702")}catch{}},Tr=()=>Ye()!==null,Qe=se(null),re=se(null),Fr=({children:e,value:t,whitelist:r})=>{const n=!!r&&r.enabled!==!1,{isWhitelisted:o,isLoading:a,whitelistCheck:s}=Me(n?r:{enabled:!1}),l=n&&!o,p=M(()=>({...t,mode:l?"ondemand":t.mode,allowedTokens:l?Ar:t.allowedTokens,isUserWhitelisted:o,isWhitelistChecking:a,isWhitelistConfigured:n,isWhitelistGateActive:l,whitelistCheck:s}),[t,n,l,o,a,s]);return $(re.Provider,{value:p,children:e})},Pr=({feeToleranceBps:e,children:t,provider:r="privy",supportedChainIds:n,allowedTokens:o,network:a="testnet",mode:s,skipFlow:l=[],nativeChainId:p,appName:c="Spicenet",apiUrl:m,theme:d,rpcOverrides:f,swapper:u,liquidityVenues:b,additionalSourceTokens:i,whitelist:g,assetDisplay:w})=>{const y=ye(e);F(()=>{if(!m)return;const L=P.getBaseUrl();return P.setBaseUrl(m),()=>P.setBaseUrl(L)},[m]),F(()=>(Ie(f),()=>Ie(void 0)),[f]);const h=M(()=>ut(a),[a]),x=n??h,E=d??null,[B,v]=O(()=>s??Ye()??"7702");F(()=>{s&&v(s)},[s]);const T=ve(L=>{if(s){v(s);return}v(L),Sr(L)},[s]),{embeddedAddress:k,externalAddress:C}=de(),G=JSON.stringify(f),R=M(De,[a,m,G,r]),W=M(()=>({feeToleranceBps:y,inventory:R,provider:r,supportedChainIds:x,allowedTokens:o,skipFlow:l,mode:B,setMode:T,network:a,nativeChainId:p,appName:c,apiUrl:m,rpcOverrides:f,swapper:u,liquidityVenues:b,additionalSourceTokens:i,embeddedWalletAddress:k,externalWalletAddress:C,isUserWhitelisted:null,isWhitelistChecking:!1,isWhitelistConfigured:!1,isWhitelistGateActive:!1}),[R,y,r,x,o,l,B,T,a,p,c,m,f,u,b,i,k,C]);return $(Qe.Provider,{value:E,children:$(re.Provider,{value:W,children:$(Fr,{value:W,whitelist:g,children:$(He.Provider,{value:w,children:t})})})})},Rr={spacing:{xs:"0.25rem",sm:"0.5rem",md:"1rem",lg:"1.5rem",xl:"2rem"},borderRadius:{sm:"0.25rem",md:"0.5rem",lg:"0.75rem",full:"9999px"},typography:{fontFamily:K.ui,fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.75rem"},fontWeight:{normal:400,medium:500,semibold:600,bold:700}},shadows:{sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)",md:"0 4px 6px -1px rgb(0 0 0 / 0.1)",lg:"0 10px 15px -3px rgb(0 0 0 / 0.1)"},animation:{fast:"150ms ease-in-out",normal:"200ms ease-in-out",slow:"300ms ease-in-out"}},Wr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#f3f4f6",background:"#ffffff",surface:"#f9fafb",surfaceHover:"#f3f4f6",border:"#e5e7eb",borderHover:"#d1d5db",text:"#111827",textSecondary:"#374151",textMuted:"#6b7280",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},Nr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#171717",background:"#141414",surface:"#1e1e1e",surfaceHover:"#2a2a2a",border:"#2d2d2d",borderHover:"#3a3a3a",text:"#ffffff",textSecondary:"#888888",textMuted:"#666666",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},Xe=(e="light")=>({mode:e,...Rr,colors:e==="light"?Wr:Nr});function ne(e,t){const r=e.replace("#",""),n=Math.max(0,Math.round(parseInt(r.substring(0,2),16)*(1-t))),o=Math.max(0,Math.round(parseInt(r.substring(2,4),16)*(1-t))),a=Math.max(0,Math.round(parseInt(r.substring(4,6),16)*(1-t)));return`#${n.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function Ur(e,t){return{shell:t?.shell??"#141414",shellBorder:t?.shellBorder??ne(t?.shell??"#141414",.35),shellInnerBorder:t?.shellInnerBorder??ne(t?.shell??"#141414",.55),cardBg:t?.cardBg??"#1e1e1e",inputBg:t?.inputBg??"#171717",hoverBg:t?.hoverBg??"#2a2a2a",textPrimary:t?.textPrimary??"#ffffff",textSecondary:t?.textSecondary??"#888888",inputText:t?.inputText??"#e0e0e0",inputPlaceholder:t?.inputPlaceholder??"#555555",cardBorder:t?.cardBorder??"rgba(255,255,255,0.08)",inputBorder:t?.inputBorder??"rgba(255,255,255,0.10)",buttonBorder:t?.buttonBorder??"rgba(255,255,255,0.12)",successBg:t?.successBg??"#0a1f18",successBorder:t?.successBorder??"#1a4a3a",successText:t?.successText??"#6ee7b7",warningBg:t?.warningBg??"#1f1a0d",warningBorder:t?.warningBorder??"#4a3820",warningText:t?.warningText??"#fbbf24",errorBg:t?.errorBg??"#1f0d0d",errorBorder:t?.errorBorder??"#4a2020",errorText:t?.errorText??"#f87171",infoBg:t?.infoBg??"#0d1325",infoBorder:t?.infoBorder??"#2a3a5a",infoText:t?.infoText??"#60a5fa"}}function Lr(e){return{shell:"#ffffff",shellBorder:"#E9E9E9",shellInnerBorder:"#D5D5D5",cardBg:"#f9fafb",inputBg:"#ffffff",hoverBg:"#f3f4f6",textPrimary:"#111827",textSecondary:"#6b7280",inputText:"#111827",inputPlaceholder:"#9ca3af",cardBorder:"#e5e7eb",inputBorder:"#d1d5db",buttonBorder:"#0e0d0b",successBg:"#d1fae5",successBorder:"#6ee7b7",successText:"#065f46",warningBg:"#fef3c7",warningBorder:"#fde68a",warningText:"#92400e",errorBg:"#fef2f2",errorBorder:"#fecaca",errorText:"#dc2626",infoBg:"#dbeafe",infoBorder:"#93c5fd",infoText:"#1e40af"}}function Ke(e,t){const r=t?{...e,...t}:e,n=r.dark??!1,o=r.primaryColor,a=r.shell??(n?"#141414":"#ffffff");return{primaryColor:o,dark:n,fontFamily:r.fontFamily??'"Helvetica Neue", sans-serif',appName:r.appName??"Spicenet",logo:r.logo,borderRadius:r.borderRadius??"8px",shell:a,shellBorder:ne(a,n?.35:.085),shellInnerBorder:ne(a,n?.55:.165),card:r.card??(n?"#1e1e1e":"#f9fafb"),input:n?"#171717":"#ffffff",hover:n?"#2a2a2a":"#f3f4f6",text:r.text??(n?"#ffffff":"#111827"),textMuted:r.textMuted??(n?"#888888":"#6b7280"),inputText:n?"#e0e0e0":"#111827",inputPlaceholder:n?"#555555":"#9ca3af",border:r.border??(n?"rgba(255,255,255,0.08)":"#e5e7eb"),inputBorder:n?"rgba(255,255,255,0.10)":"#d1d5db",buttonBorder:n?"rgba(255,255,255,0.12)":"#0e0d0b",successBg:n?"#0a1f18":"#d1fae5",successBorder:n?"#1a4a3a":"#6ee7b7",successText:n?"#6ee7b7":"#065f46",warningBg:n?"#1f1a0d":"#fef3c7",warningBorder:n?"#4a3820":"#fde68a",warningText:n?"#fbbf24":"#92400e",errorBg:n?"#1f0d0d":"#fef2f2",errorBorder:n?"#4a2020":"#fecaca",errorText:n?"#f87171":"#dc2626",infoBg:n?"#0d1325":"#dbeafe",infoBorder:n?"#2a3a5a":"#93c5fd",infoText:n?"#60a5fa":"#1e40af"}}const Mr=K.mono;function Ze(e,t){const r=oe(Qe)??void 0;return M(()=>{const n=r??{primaryColor:"#EA4B4B"},o={...e?.primaryColor?{primaryColor:e.primaryColor}:{},...e?.fontFamily?{fontFamily:e.fontFamily}:{},...t!==void 0?{dark:t}:{}},a=Ke(n,o),{dark:s,primaryColor:l,appName:p}=a,c=Xe(s?"dark":"light"),m={...c,colors:{...c.colors,primary:l,primaryHover:`${l}dd`},typography:{...c.typography,fontFamily:a.fontFamily}},d={shell:a.shell,shellBorder:a.shellBorder,shellInnerBorder:a.shellInnerBorder,cardBg:a.card,inputBg:a.input,hoverBg:a.hover,textPrimary:a.text,textSecondary:a.textMuted,inputText:a.inputText,inputPlaceholder:a.inputPlaceholder,cardBorder:a.border,inputBorder:a.inputBorder,buttonBorder:a.buttonBorder,successBg:a.successBg,successBorder:a.successBorder,successText:a.successText,warningBg:a.warningBg,warningBorder:a.warningBorder,warningText:a.warningText,errorBg:a.errorBg,errorBorder:a.errorBorder,errorText:a.errorText,infoBg:a.infoBg,infoBorder:a.infoBorder,infoText:a.infoText},f=e?.inputVariant?e.inputVariant==="dark":s;return{brand:r,theme:m,dark:s,appName:p,primaryColor:l,dk:d,palette:d,fontFamily:a.fontFamily,monoFont:Mr,inputDark:f,cardBg:f?d.cardBg:"#E9E9E9",cardBorder:f?d.cardBorder:"#C6C6C6",textPrimary:d.textPrimary,textSecondary:d.textSecondary,subtitleText:f?d.textSecondary:"#979AA0"}},[r,e,t])}const et="spiceflow-spinner-keyframes";function qr(){if(typeof document>"u"||document.getElementById(et))return;const e=document.createElement("style");e.id=et,e.textContent="@keyframes spiceflow-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",document.head.appendChild(e)}const be=({size:e=16,borderWidth:t=2,color:r="currentColor",style:n})=>{const o=we(!1);return F(()=>{o.current||(qr(),o.current=!0)},[]),$("div",{role:"status","aria-label":"Loading",style:{width:`${e}px`,height:`${e}px`,border:`${t}px solid ${r}`,borderTop:`${t}px solid transparent`,borderRadius:"50%",animation:"spiceflow-spin 1s linear infinite",flexShrink:0,...n}})},j=({variant:e="primary",size:t="md",loading:r=!1,fullWidth:n=!1,disabled:o,children:a,className:s="",style:l,theme:p,styles:c,dark:m,...d})=>{const{theme:f,dark:u,palette:b}=Ze(c,m),i=p||f,g=m??u,[w,y]=O(!1),[h,x]=O(!1),E=g?b.shell:"white",B=()=>{switch(e){case"primary":return{backgroundColor:c?.button?.backgroundColor||i.colors.primary,color:c?.button?.color||"#ffffff",border:`1px solid ${c?.button?.backgroundColor||i.colors.primary}`};case"secondary":return{backgroundColor:i.colors.secondary,color:i.colors.text,border:`1px solid ${i.colors.border}`};case"success":return{backgroundColor:i.colors.success,color:i.colors.text,border:`1px solid ${i.colors.success}`};case"error":return{backgroundColor:i.colors.error,color:i.colors.text,border:`1px solid ${i.colors.error}`};case"ghost":return{backgroundColor:"transparent",color:i.colors.textSecondary,border:`1px solid ${i.colors.border}`};case"outline":{const C=c?.button?.backgroundColor||i.colors.primary,G=c?.button?.color||(g?"#ffffff":"#0e0d0b"),R=c?.button?.borderColor||(g?`${i.colors.primary}88`:"#0e0d0b"),W=o||r,L=g?"1px":"1.5px",tt=c?.button?.disabledBackgroundColor||`${C}88`,rt=c?.button?.disabledColor||G;return{height:"56px",backgroundColor:W?tt:h?`${C}cc`:w?`${C}ee`:C,color:W?rt:G,border:`${L} solid ${R}`,borderRadius:c?.button?.borderRadius||"12px",fontSize:"22px",fontWeight:500,fontFamily:K.mono,opacity:W?.78:1,transform:W?"none":h?"scale(0.98)":w?"translateY(-2px)":"none",boxShadow:W?`3px 3px 0px ${E}, 4px 4px 0px ${R}`:h?`2px 2px 0px ${R}`:w?`5px 5px 0px ${E}, 6px 6px 0px ${R}`:`3px 3px 0px ${E}, 4px 4px 0px ${R}`,transition:"transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease, border-color 150ms ease, color 150ms ease"}}default:return{}}},v=()=>{if(e==="outline")return{};switch(t){case"sm":return{padding:`${i.spacing.sm} ${i.spacing.md}`,fontSize:i.typography.fontSize.sm};case"md":return{padding:`${i.spacing.md} ${i.spacing.lg}`,fontSize:i.typography.fontSize.base};case"lg":return{padding:`${i.spacing.lg} ${i.spacing.xl}`,fontSize:i.typography.fontSize.lg};default:return{}}},T={borderRadius:c?.button?.borderRadius||i.borderRadius.md,fontWeight:c?.button?.fontWeight||i.typography.fontWeight.medium,fontFamily:c?.button?.fontFamily||i.typography.fontFamily,fontSize:c?.button?.fontSize||void 0,transition:"background-color 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease",cursor:o||r?"not-allowed":"pointer",opacity:(o||r)&&e!=="outline"?.6:1,width:n?"100%":"auto",display:"flex",alignItems:"center",justifyContent:"center",gap:i.spacing.sm,...B(),...v(),...c?.button?.fontSize&&{fontSize:c.button.fontSize}},k=o||r;return ae("button",{type:d.type??"button","data-spiceflow-focus":!0,"aria-busy":r||void 0,"aria-disabled":k||void 0,style:{...T,...l},className:s,disabled:k,onMouseEnter:C=>{y(!0),d.onMouseEnter?.(C)},onMouseLeave:C=>{y(!1),x(!1),d.onMouseLeave?.(C)},onMouseDown:C=>{x(!0),d.onMouseDown?.(C)},onMouseUp:C=>{x(!1),d.onMouseUp?.(C)},...d,children:[r&&$(be,{size:16}),a]})},Dr=({onAuthSuccess:e,onAuthError:t,theme:r="light",className:n="",buttonText:o="Login with Privy",autoTrigger:a=!1})=>{const s=Xe(r),[l,p]=O(!1),[c,m]=O(!1),{ready:d,authenticated:f,user:u}=le(),{login:b}=Bt(),{logout:i}=kt();F(()=>{p(!0)},[]),F(()=>{a&&d&&!f&&l&&!c&&(m(!0),g())},[a,d,f,l,c]),F(()=>{if(d&&f&&u&&e){const y=u.wallet?.address||u.email?.address;y&&e(y)}},[d,f,u,e]),F(()=>{},[d,f,t]);const g=()=>{try{b()}catch(y){const h=`Login failed: ${String(y)}`;t?t(h):console.error(h)}},w=()=>{try{i()}catch(y){const h=`Logout failed: ${String(y)}`;t?t(h):console.error(h)}};if(!l)return $("div",{className:n,children:$(j,{variant:"primary",disabled:!0,theme:s,children:o})});if(!d)return $("div",{className:n,children:$(j,{variant:"primary",disabled:!0,theme:s,children:"Loading..."})});if(f&&u){const y=u.wallet?.address||u.email?.address,h=y?je(y):"Connected";return $("div",{className:n,children:ae(j,{variant:"primary",onClick:w,theme:s,children:["Logout (",h,")"]})})}return a?$("div",{className:n,children:ae("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"20px",flexDirection:"column",gap:"12px"},children:[$(be,{size:40,borderWidth:3,color:"#3b82f6"}),$("p",{style:{color:"#6b7280",fontSize:"14px"},children:"Opening login..."})]})}):$("div",{className:n,children:$(j,{variant:"primary",onClick:g,theme:s,children:o})})};export{_e as $,jt as A,Br as B,Rt as C,kr as D,qe as E,vr as F,_t as G,be as H,Nt as I,j as J,de as K,Jt as L,Mt as M,te as N,ur as O,Dr as P,br as Q,We as R,S,gr as T,yr as U,ze as V,fr as W,dr as X,je as Y,ye as Z,Fe as _,Ae as a,xr as a0,wr as a1,Er as a2,Tr as a3,Je as a4,Ge as a5,Qt as a6,Ue as a7,Pr as a8,Me as a9,Ur as aa,Lr as ab,Ke as ac,ue as ad,H as b,qt as c,Y as d,re as e,De as f,U as g,Lt as h,$r as i,Wt as j,P as k,Oe as l,rr as m,Q as n,Ir as o,K as p,Ze as q,Z as r,A as s,I as t,Le as u,Ut as v,ar as w,Ht as x,mr as y,zt as z};
@@ -1,2 +0,0 @@
1
- "use client";
2
- "use strict";var He=Object.create;var fe=Object.defineProperty;var Je=Object.getOwnPropertyDescriptor;var Ve=Object.getOwnPropertyNames;var Ye=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var Xe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Ve(t))!Qe.call(e,o)&&o!==r&&fe(e,o,{get:()=>t[o],enumerable:!(n=Je(t,o))||n.enumerable});return e};var Ke=(e,t,r)=>(r=e!=null?He(Ye(e)):{},Xe(t||!e||!e.__esModule?fe(r,"default",{value:e,enumerable:!0}):r,e));const C=require("react/jsx-runtime"),y=require("react"),k=require("@spicenet-io/spiceflow-core"),pe=require("@tanstack/react-query"),v=require("viem"),T=require("@privy-io/react-auth"),me=require("wagmi"),Ze=require("viem/actions");function G(e,t){return!e||!t?!1:k.isNativeToken(e)&&k.isNativeToken(t)?!0:v.isAddress(e)&&v.isAddress(t)?v.getAddress(e)===v.getAddress(t):e.toLowerCase()===t.toLowerCase()}const et="0xcA11bde05977b3631167028862bE2a173976CA11",tt={4114:"0x860aFc632a6D625B95d8B96f39ECC48E988c6962"},rt=new Set([5115]);function nt(e){const t=tt[e.id]??(rt.has(e.id)?void 0:et);return v.defineChain({id:e.id,name:e.name,nativeCurrency:e.nativeCurrency,rpcUrls:{default:{http:[e.rpcUrl]}},blockExplorers:{default:{name:e.displayName,url:e.blockExplorer}},testnet:e.network==="testnet",...t?{contracts:{multicall3:{address:t}}}:{}})}const at=[1,8453,42161,4114,4663,56,137,143,11155111,421614,84532,5115,123420001114,688688,688689,46630],H=Object.fromEntries(at.map(e=>k.getChainMeta(e)).filter(e=>e!=null).map(e=>[e.id,{...e,viemChain:nt(e),supportedTokens:k.getTokensForChain(e.id)}])),ot=H;let he={};const re=new Map,ge=e=>{he={...e||{}},re.clear()},J=(e,t=he)=>{const r=t[e];return r&&typeof r=="string"&&r.length>0?r:H[e]?.rpcUrl||void 0},L=e=>H[e],V=e=>{const t=k.getChainMeta(e);return t?.displayName||t?.name||`Chain ${e}`},st=e=>{const t=k.getDelegateContract(e);if(!t)throw new Error(`Unsupported chain ID: ${e}`);return t},it=(e,t,r)=>{const n=L(e);return n?.blockExplorer?`${n.blockExplorer}/tx/${t}`:"#"};async function lt(e,t){const r=`0x${t.toString(16)}`;try{await e.request({method:"wallet_switchEthereumChain",params:[{chainId:r}]});return}catch(a){if(!(a?.code===4902||typeof a?.message=="string"&&a.message.includes("Unrecognized chain ID")))throw a}const n=L(t);if(!n)throw new Error(`Cannot add unknown chain ${t} to wallet`);const o=J(t);if(!o)throw new Error(`Configure SpiceFlowProvider rpcOverrides[${t}] before adding this chain.`);await e.request({method:"wallet_addEthereumChain",params:[{chainId:r,chainName:n.name||`Chain ${t}`,nativeCurrency:n.nativeCurrency||{name:"ETH",symbol:"ETH",decimals:18},rpcUrls:[o],blockExplorerUrls:n.blockExplorer?[n.blockExplorer]:void 0}]})}const ye=(e,t)=>{const r=L(e);if(!r)throw new Error(`Unsupported chain ID: ${e}`);const n=J(e,t);if(!n)throw new Error(`No RPC URL configured for chain ID: ${e}`);const o=`${e}:${n}`,a=re.get(o);if(a)return a;const s=v.createPublicClient({chain:r.viemChain,transport:v.http(n,{timeout:15e3,retryCount:2,retryDelay:300}),batch:{multicall:{wait:16}}});return re.set(o,s),s},ct=e=>{const t={};return Object.values(H).forEach(r=>{const n=J(r.id,e);n&&(t[r.id]={name:r.name,chain:r.viemChain,rpcUrl:n})}),t},dt=(e,t=[])=>{const r=L(e);if(!r)return[];const n=[];if(![11155111,421614,688689].includes(e)){const a=t.find(s=>s.chainId===e&&s.isNative);a?n.push(a):n.push({address:k.ZERO_ADDRESS,name:r.nativeCurrency.name,symbol:r.nativeCurrency.symbol,decimals:r.nativeCurrency.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:void 0,isNative:!0,chainId:e})}if(!r.supportedTokens)return n;const o=n.some(a=>a.isNative);return r.supportedTokens.forEach(a=>{if(o&&k.isNativeToken(a.address))return;const s=t.find(l=>l.chainId===e&&G(l.address,a.address));s?n.push(s):n.push({address:a.address,name:a.name,symbol:a.symbol,decimals:a.decimals,balance:BigInt(0),balanceFormatted:0,balanceUsd:0,logoURI:a.logo,isNative:!1,chainId:e})}),n},ut=async(e,t,r)=>{const n=L(e);if(!n)throw new Error(`Unsupported chain ID: ${e}`);const o=t.toLowerCase(),a=n.supportedTokens?.find(l=>G(l.address,o));let s;if(k.isNativeToken(o)){if(n.nativeCurrency?.decimals==null)throw new Error(`Native currency decimals not configured for chain ${e}`);s=n.nativeCurrency.decimals}else if(a)s=a.decimals;else{if(!v.isAddress(t,{strict:!1}))throw new Error(`Could not determine decimals for invalid token address: ${t}`);const l=ye(e,r);try{s=await Ze.readContract(l,{address:v.getAddress(t),abi:v.erc20Abi,functionName:"decimals"})}catch(m){throw Object.assign(new Error(`Could not determine decimals for token ${t} on chain ${e}. Check the token contract and RPC configuration, then try again.`),{cause:m})}}if(!Number.isInteger(s)||s<0||s>255)throw new Error(`Invalid token decimals for ${t} on chain ${e}. Expected an integer from 0 to 255.`);return s},ft=e=>{const t=e?.wallet;if(t?.address&&t.walletClientType==="privy"&&t.connectorType==="embedded"&&!t.imported)return t.address},be=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getWalletClient=="function"){const r=t===void 0?[void 0]:[String(t),t,void 0];let n=null;for(const o of r)try{const a=await e.getWalletClient(o);if(a)return a}catch(a){n=a}if(n)throw n}if(typeof e.getEthereumProvider=="function"){const r=await e.getEthereumProvider(),n=t?L(t)?.viemChain:void 0;return v.createWalletClient({account:e.address,chain:n,transport:v.custom(r)})}throw new Error("Wallet client not available")},pt=async(e,t)=>{if(!e?.address)throw new Error("Wallet not available");if(typeof e.getEthereumProvider=="function")return e.getEthereumProvider();const r=await be(e,t);return{request:n=>r.request(n)}},Y=e=>e?.address?{address:e.address,wallet:e,getWalletClient:t=>be(e,t),getEthereumProvider:t=>pt(e,t)}:null,ne=()=>{const e=me.useAccount(),t=e.status==="connected"?e.address:void 0,r=e.connector;let n=null,o=null;try{n=T.useWallets(),{user:o}=T.usePrivy()}catch{n=null,o=null}const a=n?.wallets||[],s=T.getEmbeddedConnectedWallet(a),l=s?.address?.toLowerCase(),m=a.find(g=>g.connectorType!=="embedded"&&g.address?.toLowerCase()!==l),c=t?.toLowerCase(),p=t&&r&&!(c&&l&&c===l)?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,d=t&&r?{address:t,connector:r,getEthereumProvider:()=>r.getProvider()}:null,f=Y(s),u=Y(p)||Y(m),w=f?.address||ft(o),i=Y(d)||u;return{embeddedWallet:f,externalWallet:u,embeddedAddress:w,externalAddress:u?.address,activeWallet:i,activeAddress:i?.address}},mt={base:0,raised:1,sticky:10,overlay:20,popover:40,modal:1e3,dropdown:1100,toast:1200,tooltip:1300},ht={none:"0",sm:"4px",md:"6px",card:"8px",input:"10px",shell:"9px",modal:"12px",pill:"9999px",circle:"50%"},F={out:"cubic-bezier(0.22, 1, 0.36, 1)",inOut:"cubic-bezier(0.65, 0, 0.35, 1)",linear:"linear"},P={fast:"120ms",normal:"150ms",slow:"300ms",progress:"400ms"},gt={interactive:`transform ${P.normal} ${F.out}, box-shadow ${P.normal} ${F.out}, background-color ${P.normal} ${F.out}, border-color ${P.normal} ${F.out}, color ${P.normal} ${F.out}`,color:`background-color ${P.normal} ${F.out}, border-color ${P.normal} ${F.out}, color ${P.normal} ${F.out}`,popover:`opacity ${P.normal} ${F.out}, transform ${P.normal} ${F.out}`},Q={ui:'"Helvetica Neue", sans-serif',mono:'"IBM Plex Mono", monospace'};class R extends Error{constructor(t,r,n={}){super(r),this.code=t,this.context=n,this.name="SpiceflowError",Error.captureStackTrace&&Error.captureStackTrace(this,R)}}function ae(e){return e instanceof R}const yt=["user rejected","user denied","user cancelled","rejected the request","action_rejected","4001"];function we(e){if(!e)return"";if(typeof e=="string")return e;const t=e,r=t.message||t.reason||"",n=t.details||"";return`${r} ${n}`.trim()}const ve=e=>{if(ae(e))return e.code==="WALLET_REJECTED";const t=we(e).toLowerCase();return yt.some(r=>t.includes(r))};let oe=null;function bt(e){return oe?.message===e?oe.detail:void 0}const wt=(e,t="Something went wrong. Please try again.")=>{if(ve(e))return"Transaction was rejected.";if(ae(e)){const r=e.message||t,{requestId:n,httpStatus:o,responseBody:a,endpoint:s}=e.context;return(n||o||s)&&(oe={message:r,detail:{requestId:n,httpStatus:o,responseBody:a,endpoint:s}}),r}return we(e)||t},vt=[...k.DELEGATE_ABI,...k.ERC20_ABI,...k.spicenetEscrowAbi,...k.uniV3SwapRouterAbi];function se(e,t=0){return t>4||e==null?[]:typeof e=="string"?e.match(/0x[0-9a-fA-F]{8,}/g)??[]:Array.isArray(e)?e.flatMap(r=>se(r,t+1)):typeof e=="object"?Object.values(e).flatMap(r=>se(r,t+1)):[]}function xe(e){try{const t=v.decodeErrorResult({abi:vt,data:e});if(t.errorName==="Error")return String(t.args?.[0]??"");if(t.errorName==="Panic")return`Panic(${t.args?.[0]})`;if(t.errorName==="CallReverted"){const r=t.args?.[4],n=r&&r!=="0x"?xe(r):void 0;return n?`Call reverted: ${n}`:"Call reverted (no reason returned)"}return t.errorName}catch{try{const t=v.hexToString(e).replace(/\x00+$/g,"").trim();return/^[\x20-\x7e]+$/.test(t)&&t.length>1?t:void 0}catch{return}}}function xt(e){for(const t of se(e)){if(!v.isHex(t))continue;const r=xe(t);if(r)return r}}function Ee(e,t){const r=t.match(/Output amount (\d+) is insufficient after fees (\d+) on chain (\d+)/);if(!r)return t;const[,n,o,a]=r,s=Number(a),l=BigInt(n),m=BigInt(o);let c;for(const x of e.intents){const b=x.chainBatches.find(h=>h.chainId===s);if(b){c=b;break}}const p=c?.tokenTransfers.find(x=>x.from==="escrow"&&G(x.to,e.user)&&!k.isNativeToken(x.token)),d=V(s);if(!p)return`Amount is too small to cover the estimated fee on ${d}.`;const f=k.getTokenByAddress(p.token,s),u=f?.decimals??18,w=f?.symbol??"tokens",i=v.formatUnits(l,u),g=v.formatUnits(m,u);return`Amount is too small to cover the estimated fee on ${d}. Amount: ${i} ${w}. Estimated fee: ${g} ${w}.`}function Et(e){return e?.code===4902||e?.name==="ChainNotConfiguredError"?"This network is not configured in your wallet. Please add it manually to continue.":e?.code===4001?"Network switch cancelled. Please switch manually in your wallet to continue.":"Unable to switch network. Please switch manually in your wallet to continue."}const Ct="https://tx-submission-api.spicenet.io",Ce=Ct;function $t(e,t){return typeof t=="bigint"?t.toString():t}function j(e,t=""){if(Array.isArray(e))e.forEach((r,n)=>j(r,`${t}[${n}]`));else if(e&&typeof e=="object")for(const[r,n]of Object.entries(e)){const o=t?`${t}.${r}`:r;if(!n&&(r==="user"||r==="to"||r==="from"||r==="address"))throw new R("INVALID_PARAMS",`Wallet not ready: ${o} is missing from the request. Wait a moment and retry, or log in again.`,{path:o});j(n,o)}}async function X(e,t){const r={...t?.headers},n=(t?.method??"GET").toUpperCase();(t?.body!=null||n!=="GET"&&n!=="HEAD")&&(r["x-request-id"]??(r["x-request-id"]=crypto.randomUUID()));const o=await fetch(e,{...t,headers:r}),a=o.headers.get("x-request-id")??"";return Object.assign(o,{requestId:a})}function D(e,t){if(!e)return t;const r=e.error,n=(typeof e.message=="string"?e.message:"")||(r&&typeof r=="object"&&"message"in r&&typeof r.message=="string"?r.message:"")||(typeof r=="string"?r:"")||t,o=xt(e);return o&&!n.includes(o)?`${n} \u2014 ${o}`:n}async function Bt(e){try{return await e.json()}catch{return null}}function kt(e){return(Array.isArray(e?.balances)?e.balances:[]).flatMap(t=>{if(!t||typeof t!="object")return[];const r=t;return[{receiptToken:typeof r.receiptToken=="string"?r.receiptToken:void 0,tokenName:String(r.tokenName??""),balanceAvailable:String(r.balanceAvailable??"0"),chainTokens:Array.isArray(r.chainTokens)?r.chainTokens.filter(n=>typeof n=="string"):r.chainTokens&&typeof r.chainTokens=="object"?r.chainTokens:r.chainTokenConfig&&typeof r.chainTokenConfig=="object"?r.chainTokenConfig:void 0,decimals:typeof r.decimals=="number"?r.decimals:void 0,balanceUsd:typeof r.balanceUsd=="number"||typeof r.balanceUsd=="string"?r.balanceUsd:null}]})}class At{constructor(){this.baseUrl=Ce,this.feeValidationAvailable=!1}setBaseUrl(t){t!==this.baseUrl&&(this.feeValidationAvailable=!1),this.baseUrl=t}getBaseUrl(){return this.baseUrl}async requestJson(t,r){const n=`${this.baseUrl}${t}`,o=await X(n,r.method&&r.method!=="GET"?{method:r.method,headers:{"Content-Type":"application/json"},body:JSON.stringify(r.body,$t),signal:r.signal}:{signal:r.signal}),a=await o.json();if(!o.ok||a.success===!1||r.ok&&!r.ok(a)){const s=D(a,r.fallbackError(o.status));throw new R(r.code??"RELAYER_ERROR",r.mapError?r.mapError(s):s,{httpStatus:o.status,requestId:o.requestId,responseBody:JSON.stringify(a),endpoint:t,...r.context})}return a}async createAction(t){return j(t),this.requestJson("/actions",{method:"POST",body:t,fallbackError:r=>`Relayer API error: ${r}`})}async estimateActionFees(t,r){j(t);const n=this.baseUrl,o=await this.requestJson("/actions/fees/estimate",{method:"POST",body:t,signal:r?.signal,fallbackError:a=>`Relayer fee estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.feeEstimate,mapError:a=>Ee(t,a)});return n===this.baseUrl&&(this.feeValidationAvailable=o.data?.supportsFeeValidation===!0),o.data.feeEstimate}canValidateActionFees(){return this.feeValidationAvailable}async validateActionFees(t,r){return j(t),(await this.requestJson("/actions/fees/validate",{method:"POST",body:t,signal:r?.signal,fallbackError:n=>`Relayer fee validation error: ${n}`,ok:n=>!!n.success&&!!n.data?.feeEstimate,mapError:n=>Ee(t,n)})).data.feeEstimate}async estimateBatchGas(t){j(t);const{signal:r,...n}=t,o=await this.requestJson("/actions/gas/estimate",{method:"POST",body:n,signal:r,fallbackError:a=>`Relayer gas estimate error: ${a}`,ok:a=>!!a.success&&!!a.data?.gasFee});return{gasFee:BigInt(o.data.gasFee),gasQuoteSource:o.data.gasQuoteSource,simulationVerified:o.data.simulationVerified===!0,platformFee:o.data.platformFee===void 0?void 0:BigInt(o.data.platformFee)}}async executeStep(t,r,n,o){const a=`${this.baseUrl}/actions/${t}/intents/${r}/steps/${n}`,s=`/actions/${t}/intents/${r}/steps/${n}`,l=crypto.randomUUID(),m=3e4,c=new Promise((f,u)=>setTimeout(()=>u(new R("RELAYER_EXECUTE_ERROR",`Execute step request timed out after ${m/1e3}s`,{actionId:t,intentIndex:r,stepIndex:n,endpoint:s,requestId:l})),m)),p=await Promise.race([X(a,{method:"POST",headers:{"Content-Type":"application/json","x-request-id":l},body:JSON.stringify(o)}),c]),d=await p.json();if(!p.ok||d.success===!1)throw new R("RELAYER_EXECUTE_ERROR",D(d,`Execute step error: ${p.status}`),{httpStatus:p.status,requestId:p.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t});if(d?.status==="error"||d?.status==="reverted"){const f=D(d,""),u=f?`: ${f}`:"";throw new R("RELAYER_EXECUTE_ERROR",`Step ${n} previously ${d.status}${u}`,{httpStatus:p.status,requestId:p.requestId,responseBody:JSON.stringify(d),endpoint:s,actionId:t,intentIndex:r,stepIndex:n,stepStatus:d.status})}return{success:!0,status:d.status,transactionHash:d.transactionHash}}async checkStepStatus(t,r){const n=t.split("/"),o=n[0],a=n.length>=2?n[1]:"0",s=await this.requestJson(`/actions/${o}/intents/${a}/steps/${r}`,{fallbackError:l=>`Intent step status check failed: ${l}`,code:"RELAYER_STATUS_ERROR",context:{intentId:t}});return{success:!0,data:{status:s.status==="error"?"reverted":s.status,transactionHash:s.txid,error:D(s,"")}}}async createWallet(t,r){return this.requestJson(`/wallets/${t}`,{method:"PUT",body:r,fallbackError:n=>`Create wallet error: ${n}`})}async getWallet(t){return this.requestJson(`/wallets/${t}`,{fallbackError:r=>`Get wallet error: ${r}`})}async createWithdrawal(t){return this.requestJson("/withdrawals",{method:"POST",body:t,fallbackError:r=>`Create withdrawal error: ${r}`})}async getWithdrawal(t){return this.requestJson(`/withdrawals/${t}`,{fallbackError:r=>`Get withdrawal error: ${r}`})}async getRollupTimestamp(){return this.requestJson("/time",{fallbackError:t=>`Get rollup timestamp error: ${t}`})}}const W=new At;async function St(e){const t=`${W.getBaseUrl()}/wallets/${e}/balance`,r=await X(t,{cache:"no-store"}),n=await Bt(r);if(!r.ok||n?.success===!1)throw new R("RELAYER_ERROR",D(n,`Unable to verify Spice balance: ${r.status}`),{httpStatus:r.status,requestId:r.requestId,responseBody:JSON.stringify(n),endpoint:`/wallets/${e}/balance`});return kt(n)}const ie=new Map,K=new Set;function le(e){return JSON.stringify([W.getBaseUrl(),e.toLowerCase()])}function O(e,t){if(le(e)!==t)throw new Error("Wallet backend changed during registration. Please retry.")}function It(e){if(!(e instanceof R))return!1;const t=e.context.httpStatus;return t===400||t===404?`${e.message} ${String(e.context.responseBody??"")}`.toLowerCase().includes("not found"):!1}async function $e(e){const t=le(e);if(K.has(t))return!0;try{return await W.getWallet(e),O(e,t),K.add(t),!0}catch(r){if(!It(r))throw r;return!1}}async function Be(e,t){const r=le(e);if(K.has(r))return;const n=ie.get(r);if(n)return n;const o=(async()=>{const a=await $e(e);if(O(e,r),a)return;const{unix_timestamp:s}=await W.getRollupTimestamp();O(e,r);const l=`I am creating a new smart wallet and adding an admin wallet ethereum:0x${e.slice(2).toLowerCase()}. Nonce: ${s}`,m=await t(l);O(e,r);const c=typeof m=="string"?m:m.signature;if(!c)throw new Error("Wallet returned no smart wallet signature");await W.createWallet(e,{timestamp:s,signature:c}),O(e,r),K.add(r)})();ie.set(r,o);try{await o}finally{ie.delete(r)}}const Tt=(e,t)=>{const r=o=>t?t(o):V(o),n=[];return e.forEach((o,a)=>{const s=o.calls&&o.calls.length>0,l=o.tokenTransfers&&o.tokenTransfers.length>0;!s&&!l||n.push({stepId:a,status:a===0?"processing":"pending",chainId:o.chainId,chainName:r(o.chainId),description:"Processing transaction"})}),n},ke=()=>{const e=y.useContext(ee),t=e?.mode,{isConnected:r,address:n}=me.useAccount();let o=null,a=null,s=null,l=null,m=null;try{o=T.usePrivy(),a=T.useSign7702Authorization(),s=T.useSignMessage(),l=T.useWallets()}catch(h){m=h instanceof Error?h.message:String(h)}if(m)return t==="ondemand"&&r&&n?{isReady:!0,isAuthenticated:!0,isConnected:!0,address:n,provider:"privy",actions:{signAuthorization:async()=>{throw new Error("Not available in ondemand mode")},signMessage:async()=>{throw new Error("Not available in ondemand mode")},getEthereumProvider:async()=>{throw new Error("Not available in ondemand mode")}}}:{isReady:!1,isAuthenticated:!1,isConnected:!1,provider:null,actions:{signAuthorization:async()=>{throw new Error("Privy not available")},signMessage:async()=>{throw new Error("Privy not available")},getEthereumProvider:async()=>{throw new Error("Privy not available")}}};const{ready:c=!1,authenticated:p=!1}=o||{},d=e?.embeddedWalletAddress,f=T.getEmbeddedConnectedWallet(l?.wallets||[]),u=d||f?.address,w=!!u&&!!f,i={isReady:t==="ondemand"?!0:c,isAuthenticated:t==="ondemand"?!0:p||w,isConnected:t==="ondemand"?r&&!!n||c&&(p||w)&&w:c&&w,address:t==="ondemand"&&r?n:u,provider:"privy"},g=async(h,$)=>{if(!f)throw new Error("Embedded wallet not available");const B=await f.getEthereumProvider(),{createWalletClient:S,custom:E}=await import("viem"),N=S({account:f.address,transport:E(B)});return $?.(),{signature:await N.signMessage({account:f.address,message:h})}},x=async h=>{if(s)try{return{signature:(await s.signMessage({message:h})).signature}}catch($){if(!f)throw $}if(!f)throw new Error("Privy sign message not available");return g(h)},b=async()=>{if(!u)throw new Error("Embedded wallet not available for smart wallet setup");await Be(u,x)};return{...i,actions:{prepareSigning:async()=>{if(!u)throw new Error("Embedded wallet not available");await $e(u)},signAuthorization:async(h,$)=>{if(!a)throw new Error("Privy sign authorization not available");try{await b(),$?.();const B=await a.signAuthorization({contractAddress:h.contractAddress,chainId:h.chainId,nonce:h.nonce},{address:u});return delete B.v,B}catch(B){const S=typeof B?.message=="string"?B.message:String(B?.message??B??"");throw S.includes("not configured")||S.includes("chain")?new Error(`Chain ${h.chainId} is not configured in PrivyProvider. Add this chain to your Privy dashboard or supportedChainIds.`):B}},signMessage:async(h,$)=>{if(typeof h=="object"&&"raw"in h){if(await b(),!f)throw new Error("Embedded wallet not available for raw signing");return g(h,$)}return $?.(),x(h)},getEthereumProvider:async()=>{if(!f)throw new Error("Embedded wallet not available");return f.getEthereumProvider()}}}},Ft="https://portal-api.spicenet.io/api/v1",ce=e=>e.replace(/\/+$/,""),Pt=(e,t)=>`${e}:${t}`;async function Rt(e,t){const r=new URLSearchParams({walletAddress:t,campaignId:"spicenet-portal",campaignGroup:"1"}),n=await fetch(`${e}/portal/mainnet/linked-portal-wallet?${r.toString()}`,{cache:"no-store"});if(!n.ok){if(n.status>=500){const o=new Error(`Failed to resolve linked portal wallet: ${n.status}`);throw o.status=n.status,o}return null}return(await n.json()).portalWalletAddress?.toLowerCase()??null}async function Nt(e,t,r){const n=new URLSearchParams({walletAddress:t,campaignId:r.campaignId,campaignGroup:r.campaignGroup,partnerId:r.partnerId}),o=await fetch(`${e}/portal/mainnet/whitelist/check?${n.toString()}`,{cache:"no-store"});if(!o.ok){const a=new Error(`Failed to check whitelist: ${o.status}`);throw a.status=o.status,a}return await o.json()}async function Wt(e,t,r,n){const o=await fetch(`${e}/portal/mainnet/link-wallet`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({campaignId:t.campaignId,campaignGroup:t.campaignGroup,partnerId:t.partnerId,externalWalletAddress:r,embeddedWalletAddress:n})});if(!o.ok)throw new Error(`Failed to link wallet: ${o.status}`)}function Ae({walletAddress:e,campaignId:t,campaignGroup:r,partnerId:n,apiBaseUrl:o=Ft,enabled:a=!0,staleTime:s=5*60*1e3,refetchInterval:l=!1}={}){const{isAuthenticated:m,isConnected:c}=ke(),{externalAddress:p,embeddedAddress:d}=ne(),f=e??p,u=typeof f=="string"?f.toLowerCase():void 0,w=typeof d=="string"?d.toLowerCase():void 0,i=typeof p=="string"?p.toLowerCase():void 0,g=a&&m&&c&&!!p&&!!u&&v.isAddress(u)&&!!t&&!!r&&!!n,x=y.useMemo(()=>["partner-whitelist","check",u,t,r,n,ce(o)],[u,t,r,n,o]),b=pe.useQuery({queryKey:x,enabled:g,staleTime:s,refetchInterval:l,retry:(E,N)=>{const I=N?.status;return typeof I=="number"&&I>=400&&I<500?!1:E<3},retryDelay:E=>Math.min(1e3*2**E,15e3),queryFn:async()=>{if(!u||!v.isAddress(u))throw new Error("A valid wallet address is required");if(!t||!r||!n)throw new Error("campaignId, campaignGroup, and partnerId are required");const E=ce(o),N={campaignId:t,campaignGroup:r,partnerId:n},I=await Rt(E,u);return I?Nt(E,I,N):{walletAddress:u,campaignId:t,campaignGroup:r,partnerId:n,isWhitelisted:!1,isLinkedWallet:!1,whitelistedWalletAddress:null,externalWalletAddress:u}}}),h=a&&m&&c&&!!i&&v.isAddress(i)&&!!w&&v.isAddress(w)&&!!t&&!!r&&!!n,$=pe.useMutation({mutationFn:E=>Wt(ce(o),{campaignId:t,campaignGroup:r,partnerId:n},E.external,E.embedded)}),B=y.useRef(new Set),S=$.mutate;return y.useEffect(()=>{if(!h||!i||!w||!t||!r||!n)return;const E=Pt(i,w);B.current.has(E)||(B.current.add(E),S({external:i,embedded:w}))},[h,i,w,t,r,n,S]),{isWhitelisted:b.data?.isWhitelisted??!1,whitelistCheck:b.data,checkedWalletAddress:u,externalWalletAddress:p,embeddedWalletAddress:d,isExternalWalletConnected:!!p,isWhitelistCheckEnabled:g,linkWallet:$,isWalletLinked:$.isSuccess,...b}}const Se={assets:[],loading:!1,refreshing:!1,error:null,updatedAt:null};function Ie(){const e=new Map,t=new Map,r=new WeakMap;let n=0;function o(){let a=Se;const s=new Map;let l,m=null,c=0,p=!1,d;const f=()=>s.forEach((i,g)=>g()),u=()=>{if(!d||!s.size)return Promise.resolve();if(m)return m;const i=++c;return a={...a,loading:a.updatedAt===null,refreshing:!0},f(),m=Promise.resolve().then(d).then(g=>{if(i!==c)return;const{assets:x,error:b=null}=Array.isArray(g)?{assets:g}:g;a={assets:x,loading:!1,refreshing:!1,error:b,updatedAt:Date.now()}},g=>{i===c&&(a={...a,loading:!1,refreshing:!1,error:g instanceof Error?g.message:"Unable to refresh balances"})}).finally(()=>{i===c&&(m=null,f(),p&&(p=!1,u()))}),m},w=()=>{clearInterval(l);const i=[...s.values()].filter(g=>g>0);i.length&&(l=setInterval(()=>void u(),Math.min(...i)))};return{snapshot:()=>a,refresh:u,invalidate:()=>m?(p=!0,m.then(()=>m??Promise.resolve())):u(),subscribe(i,g,x){return d=g,s.set(i,x),w(),u(),()=>{s.delete(i),w(),s.size||(c++,m=null,p=!1,a={...a,loading:!1,refreshing:!1})}}}}return{entry(a){let s=e.get(a);return s||(s=o(),e.set(a,s)),s},fetcherId(a){return r.has(a)||r.set(a,++n),r.get(a)},registerTokens(a){let s=!1;for(const l of a){const m=`${l.chainId}:${l.address.toLowerCase()}`;t.has(m)||(t.set(m,l),s=!0)}s&&e.forEach(l=>l.invalidate())},tokens:()=>[...t.values()],invalidate:()=>Promise.all([...e.values()].map(a=>a.invalidate())).then(()=>{})}}function Te(e,t){return e<=0n||t<=0n?0n:(e*t+10000n-1n)/10000n}function Ut(e,t,r){const n=(e>t?e-t:0n)*10000n/(10000n+r),o=Te(n,r),a=n>0n,s=a?o+t:0n;return{netAmount:n,spicenetFee:a?o:0n,totalFee:s,grossAmount:n+s,coversFees:a}}function Mt(e,t,r){if(e===t)return!0;const n=e>t?e:t;return n===0n?!1:(e>t?e-t:t-e)*10000n<=n*r}function de(e=4e3){if(!Number.isInteger(e)||e<0||e>1e4)throw new Error("feeToleranceBps must be an integer between 0 and 10000");return e}function Fe(e,t,r){const n=BigInt(de(r));return(e>t?e-t:t-e)*10000n<=e*n}function Lt(e,t,r){return["gasFee","spicenetFee","bridgeFee"].every(n=>Fe(e[n]??0n,t[n]??0n,r))}function qt(e,t){const r=v.formatUnits(e,t);return r.includes(".")?r.replace(/\.?0+$/,"")||"0":r}function Z(e){const t=BigInt(e.feeBreakdown.spicenetFee),r=BigInt(e.feeBreakdown.gasFee),n=BigInt(e.feeBreakdown.bridgeFee??"0"),o=t+r+n;return{spicenetFee:t,gasFee:r,bridgeFee:n,totalFee:o}}function jt(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=Z(e);return t>0n||r>0n||n>0n}function Dt(e){const t=BigInt(e.quotedAmount),r=BigInt(e.totalDebit),{totalFee:n}=Z(e),o=t+n;return r>o?r:o}function Ot(e){const t=[];for(const r of e.intents)for(const n of r.batches)t.push(BigInt(n.quotedAmount));return t.length!==1?null:t[0]}function _t(e,t,r){return e.length===0||!e.every(n=>n.domain!=="spicenet"&&!n.tokenTransfers?.length)?null:{...t,grossAmount:r,netAmount:r,totalFee:0n,gasFee:0n,spicenetFee:0n,bridgeFee:0n,gasQuoteSource:"static_zero"}}function zt(e,t){const r=e.intents.flatMap(p=>p.batches).filter(jt);if(r.length===0)return null;const n=r.filter(p=>p.chainId===t.chainId),o=n.length>0?n:r;if(o.length>1)return null;const a=o[0],{gasFee:s,spicenetFee:l,bridgeFee:m,totalFee:c}=Z(a);return{chainId:a.chainId,tokenAddress:t.tokenAddress,symbol:t.symbol,decimals:t.decimals,grossAmount:Dt(a),netAmount:BigInt(a.quotedAmount),totalFee:c,gasFee:s,spicenetFee:l,bridgeFee:m,gasQuoteSource:a.gasQuoteSource}}const Pe=(e,t=4)=>!isFinite(e)||e===0?"0":e>0&&e<1e-6?e.toFixed(12).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e<1e-4?e.toFixed(8).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""):e.toFixed(t).replace(/(\.\d*?)0+$/,"$1").replace(/\.$/,""),Gt=e=>isFinite(e)?e>0&&e<.01?"<$0.01":new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e):"$0.00",Re=(e,t=6,r=4)=>e.length<=t+r?e:`${e.slice(0,t)}...${e.slice(-r)}`,Ht=(e,t)=>{const r=e.replace(/[^0-9.]/g,"").split("."),n=r[0]??"",o=r.slice(1).join(""),a=typeof t=="number"?Math.max(0,Math.min(t,18)):null;return r.length===1?n:`${n}.${a===null?o:o.slice(0,a)}`},Jt=(e,t=6)=>!Number.isFinite(e)||e<=0?"0":e.toFixed(Math.min(Math.max(t,0),18)).replace(/\.?0+$/,""),Vt=async e=>{try{return await navigator.clipboard.writeText(e),!0}catch(t){return console.error("Failed to copy to clipboard:",t),!1}};function Yt(e,t){return t?.length?t.some(r=>{const n=r.toLowerCase();return n===e.symbol.toLowerCase()||k.normalizeNativeTokenAddress(n).toLowerCase()===k.normalizeNativeTokenAddress(e.address).toLowerCase()||n===e.displaySymbol?.toLowerCase()||n===e.receiptTokenName?.toLowerCase()||n==="native"&&(e.isNative||k.isNativeToken(e.address))}):!0}function Ne(e){return e.displaySymbol||e.symbol}function We(e){return e.displayName||e.displaySymbol||e.name||e.symbol}function Qt(e,t){const r=e.location==="rollup"||e._source==="spice"||!!e.receiptTokenId&&!e.location&&!e._source,n=a=>a&&t?Object.entries(t).find(([s])=>s.toLowerCase()===a.toLowerCase())?.[1]:void 0,o=r?n(e.receiptTokenId)??n(e.receiptTokenName):void 0;return{symbol:o?.symbol||o?.name||Ne(e),name:o?.name||o?.symbol||We({...e,name:e.name||""}),logoURI:o?.logoURI===void 0?e.logoURI:o.logoURI||null}}function Xt(e){return e.displayChainName||V(e.chainId)}function Kt(e){if(e.balance===0n)return"0";const t=v.formatUnits(e.balance,e.decimals),r=Pe(Number(t));return Number(r)===0?t:r}const Ue=y.createContext(void 0);function Zt(){const e=y.useContext(Ue);return y.useCallback(t=>Qt(t,e),[e])}const er=["__spicenet_whitelist_blocked__"],Me="spiceflow-mode",Le=()=>{if(typeof window>"u")return null;try{const e=window.localStorage.getItem(Me);return e==="7702"?"7702":e==="non7702"?"ondemand":e==="embedded"?"7702":e==="external"?"ondemand":null}catch{return null}},tr=e=>{if(!(typeof window>"u"))try{window.localStorage.setItem(Me,e==="7702"?"7702":"non7702")}catch{}},rr=()=>Le()!==null,qe=y.createContext(null),ee=y.createContext(null),nr=({children:e,value:t,whitelist:r})=>{const n=!!r&&r.enabled!==!1,{isWhitelisted:o,isLoading:a,whitelistCheck:s}=Ae(n?r:{enabled:!1}),l=n&&!o,m=y.useMemo(()=>({...t,mode:l?"ondemand":t.mode,allowedTokens:l?er:t.allowedTokens,isUserWhitelisted:o,isWhitelistChecking:a,isWhitelistConfigured:n,isWhitelistGateActive:l,whitelistCheck:s}),[t,n,l,o,a,s]);return C.jsx(ee.Provider,{value:m,children:e})},ar=({feeToleranceBps:e,children:t,provider:r="privy",supportedChainIds:n,allowedTokens:o,network:a="testnet",mode:s,skipFlow:l=[],nativeChainId:m,appName:c="Spicenet",apiUrl:p,theme:d,rpcOverrides:f,swapper:u,liquidityVenues:w,additionalSourceTokens:i,whitelist:g,assetDisplay:x})=>{const b=de(e);y.useEffect(()=>{if(!p)return;const q=W.getBaseUrl();return W.setBaseUrl(p),()=>W.setBaseUrl(q)},[p]),y.useEffect(()=>(ge(f),()=>ge(void 0)),[f]);const h=y.useMemo(()=>k.getChainIdsByNetwork(a),[a]),$=n??h,B=d??null,[S,E]=y.useState(()=>s??Le()??"7702");y.useEffect(()=>{s&&E(s)},[s]);const N=y.useCallback(q=>{if(s){E(s);return}E(q),tr(q)},[s]),{embeddedAddress:I,externalAddress:A}=ne(),z=JSON.stringify(f),U=y.useMemo(Ie,[a,p,z,r]),M=y.useMemo(()=>({feeToleranceBps:b,inventory:U,provider:r,supportedChainIds:$,allowedTokens:o,skipFlow:l,mode:S,setMode:N,network:a,nativeChainId:m,appName:c,apiUrl:p,rpcOverrides:f,swapper:u,liquidityVenues:w,additionalSourceTokens:i,embeddedWalletAddress:I,externalWalletAddress:A,isUserWhitelisted:null,isWhitelistChecking:!1,isWhitelistConfigured:!1,isWhitelistGateActive:!1}),[U,b,r,$,o,l,S,N,a,m,c,p,f,u,w,i,I,A]);return C.jsx(qe.Provider,{value:B,children:C.jsx(ee.Provider,{value:M,children:C.jsx(nr,{value:M,whitelist:g,children:C.jsx(Ue.Provider,{value:x,children:t})})})})},or={spacing:{xs:"0.25rem",sm:"0.5rem",md:"1rem",lg:"1.5rem",xl:"2rem"},borderRadius:{sm:"0.25rem",md:"0.5rem",lg:"0.75rem",full:"9999px"},typography:{fontFamily:Q.ui,fontSize:{xs:"0.75rem",sm:"0.875rem",base:"1rem",lg:"1.125rem",xl:"1.25rem","2xl":"1.5rem","3xl":"1.75rem"},fontWeight:{normal:400,medium:500,semibold:600,bold:700}},shadows:{sm:"0 1px 2px 0 rgb(0 0 0 / 0.05)",md:"0 4px 6px -1px rgb(0 0 0 / 0.1)",lg:"0 10px 15px -3px rgb(0 0 0 / 0.1)"},animation:{fast:"150ms ease-in-out",normal:"200ms ease-in-out",slow:"300ms ease-in-out"}},sr={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#f3f4f6",background:"#ffffff",surface:"#f9fafb",surfaceHover:"#f3f4f6",border:"#e5e7eb",borderHover:"#d1d5db",text:"#111827",textSecondary:"#374151",textMuted:"#6b7280",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},ir={primary:"#EA4B4B",primaryHover:"#E43838",secondary:"#171717",background:"#141414",surface:"#1e1e1e",surfaceHover:"#2a2a2a",border:"#2d2d2d",borderHover:"#3a3a3a",text:"#ffffff",textSecondary:"#888888",textMuted:"#666666",success:"#10b981",error:"#ef4444",warning:"#f59e0b",info:"#3b82f6"},je=(e="light")=>({mode:e,...or,colors:e==="light"?sr:ir});function te(e,t){const r=e.replace("#",""),n=Math.max(0,Math.round(parseInt(r.substring(0,2),16)*(1-t))),o=Math.max(0,Math.round(parseInt(r.substring(2,4),16)*(1-t))),a=Math.max(0,Math.round(parseInt(r.substring(4,6),16)*(1-t)));return`#${n.toString(16).padStart(2,"0")}${o.toString(16).padStart(2,"0")}${a.toString(16).padStart(2,"0")}`}function lr(e,t){return{shell:t?.shell??"#141414",shellBorder:t?.shellBorder??te(t?.shell??"#141414",.35),shellInnerBorder:t?.shellInnerBorder??te(t?.shell??"#141414",.55),cardBg:t?.cardBg??"#1e1e1e",inputBg:t?.inputBg??"#171717",hoverBg:t?.hoverBg??"#2a2a2a",textPrimary:t?.textPrimary??"#ffffff",textSecondary:t?.textSecondary??"#888888",inputText:t?.inputText??"#e0e0e0",inputPlaceholder:t?.inputPlaceholder??"#555555",cardBorder:t?.cardBorder??"rgba(255,255,255,0.08)",inputBorder:t?.inputBorder??"rgba(255,255,255,0.10)",buttonBorder:t?.buttonBorder??"rgba(255,255,255,0.12)",successBg:t?.successBg??"#0a1f18",successBorder:t?.successBorder??"#1a4a3a",successText:t?.successText??"#6ee7b7",warningBg:t?.warningBg??"#1f1a0d",warningBorder:t?.warningBorder??"#4a3820",warningText:t?.warningText??"#fbbf24",errorBg:t?.errorBg??"#1f0d0d",errorBorder:t?.errorBorder??"#4a2020",errorText:t?.errorText??"#f87171",infoBg:t?.infoBg??"#0d1325",infoBorder:t?.infoBorder??"#2a3a5a",infoText:t?.infoText??"#60a5fa"}}function cr(e){return{shell:"#ffffff",shellBorder:"#E9E9E9",shellInnerBorder:"#D5D5D5",cardBg:"#f9fafb",inputBg:"#ffffff",hoverBg:"#f3f4f6",textPrimary:"#111827",textSecondary:"#6b7280",inputText:"#111827",inputPlaceholder:"#9ca3af",cardBorder:"#e5e7eb",inputBorder:"#d1d5db",buttonBorder:"#0e0d0b",successBg:"#d1fae5",successBorder:"#6ee7b7",successText:"#065f46",warningBg:"#fef3c7",warningBorder:"#fde68a",warningText:"#92400e",errorBg:"#fef2f2",errorBorder:"#fecaca",errorText:"#dc2626",infoBg:"#dbeafe",infoBorder:"#93c5fd",infoText:"#1e40af"}}function De(e,t){const r=t?{...e,...t}:e,n=r.dark??!1,o=r.primaryColor,a=r.shell??(n?"#141414":"#ffffff");return{primaryColor:o,dark:n,fontFamily:r.fontFamily??'"Helvetica Neue", sans-serif',appName:r.appName??"Spicenet",logo:r.logo,borderRadius:r.borderRadius??"8px",shell:a,shellBorder:te(a,n?.35:.085),shellInnerBorder:te(a,n?.55:.165),card:r.card??(n?"#1e1e1e":"#f9fafb"),input:n?"#171717":"#ffffff",hover:n?"#2a2a2a":"#f3f4f6",text:r.text??(n?"#ffffff":"#111827"),textMuted:r.textMuted??(n?"#888888":"#6b7280"),inputText:n?"#e0e0e0":"#111827",inputPlaceholder:n?"#555555":"#9ca3af",border:r.border??(n?"rgba(255,255,255,0.08)":"#e5e7eb"),inputBorder:n?"rgba(255,255,255,0.10)":"#d1d5db",buttonBorder:n?"rgba(255,255,255,0.12)":"#0e0d0b",successBg:n?"#0a1f18":"#d1fae5",successBorder:n?"#1a4a3a":"#6ee7b7",successText:n?"#6ee7b7":"#065f46",warningBg:n?"#1f1a0d":"#fef3c7",warningBorder:n?"#4a3820":"#fde68a",warningText:n?"#fbbf24":"#92400e",errorBg:n?"#1f0d0d":"#fef2f2",errorBorder:n?"#4a2020":"#fecaca",errorText:n?"#f87171":"#dc2626",infoBg:n?"#0d1325":"#dbeafe",infoBorder:n?"#2a3a5a":"#93c5fd",infoText:n?"#60a5fa":"#1e40af"}}const dr=Q.mono;function Oe(e,t){const r=y.useContext(qe)??void 0;return y.useMemo(()=>{const n=r??{primaryColor:"#EA4B4B"},o={...e?.primaryColor?{primaryColor:e.primaryColor}:{},...e?.fontFamily?{fontFamily:e.fontFamily}:{},...t!==void 0?{dark:t}:{}},a=De(n,o),{dark:s,primaryColor:l,appName:m}=a,c=je(s?"dark":"light"),p={...c,colors:{...c.colors,primary:l,primaryHover:`${l}dd`},typography:{...c.typography,fontFamily:a.fontFamily}},d={shell:a.shell,shellBorder:a.shellBorder,shellInnerBorder:a.shellInnerBorder,cardBg:a.card,inputBg:a.input,hoverBg:a.hover,textPrimary:a.text,textSecondary:a.textMuted,inputText:a.inputText,inputPlaceholder:a.inputPlaceholder,cardBorder:a.border,inputBorder:a.inputBorder,buttonBorder:a.buttonBorder,successBg:a.successBg,successBorder:a.successBorder,successText:a.successText,warningBg:a.warningBg,warningBorder:a.warningBorder,warningText:a.warningText,errorBg:a.errorBg,errorBorder:a.errorBorder,errorText:a.errorText,infoBg:a.infoBg,infoBorder:a.infoBorder,infoText:a.infoText},f=e?.inputVariant?e.inputVariant==="dark":s;return{brand:r,theme:p,dark:s,appName:m,primaryColor:l,dk:d,palette:d,fontFamily:a.fontFamily,monoFont:dr,inputDark:f,cardBg:f?d.cardBg:"#E9E9E9",cardBorder:f?d.cardBorder:"#C6C6C6",textPrimary:d.textPrimary,textSecondary:d.textSecondary,subtitleText:f?d.textSecondary:"#979AA0"}},[r,e,t])}const _e="spiceflow-spinner-keyframes";function ur(){if(typeof document>"u"||document.getElementById(_e))return;const e=document.createElement("style");e.id=_e,e.textContent="@keyframes spiceflow-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}",document.head.appendChild(e)}const ue=({size:e=16,borderWidth:t=2,color:r="currentColor",style:n})=>{const o=y.useRef(!1);return y.useEffect(()=>{o.current||(ur(),o.current=!0)},[]),C.jsx("div",{role:"status","aria-label":"Loading",style:{width:`${e}px`,height:`${e}px`,border:`${t}px solid ${r}`,borderTop:`${t}px solid transparent`,borderRadius:"50%",animation:"spiceflow-spin 1s linear infinite",flexShrink:0,...n}})},_=({variant:e="primary",size:t="md",loading:r=!1,fullWidth:n=!1,disabled:o,children:a,className:s="",style:l,theme:m,styles:c,dark:p,...d})=>{const{theme:f,dark:u,palette:w}=Oe(c,p),i=m||f,g=p??u,[x,b]=y.useState(!1),[h,$]=y.useState(!1),B=g?w.shell:"white",S=()=>{switch(e){case"primary":return{backgroundColor:c?.button?.backgroundColor||i.colors.primary,color:c?.button?.color||"#ffffff",border:`1px solid ${c?.button?.backgroundColor||i.colors.primary}`};case"secondary":return{backgroundColor:i.colors.secondary,color:i.colors.text,border:`1px solid ${i.colors.border}`};case"success":return{backgroundColor:i.colors.success,color:i.colors.text,border:`1px solid ${i.colors.success}`};case"error":return{backgroundColor:i.colors.error,color:i.colors.text,border:`1px solid ${i.colors.error}`};case"ghost":return{backgroundColor:"transparent",color:i.colors.textSecondary,border:`1px solid ${i.colors.border}`};case"outline":{const A=c?.button?.backgroundColor||i.colors.primary,z=c?.button?.color||(g?"#ffffff":"#0e0d0b"),U=c?.button?.borderColor||(g?`${i.colors.primary}88`:"#0e0d0b"),M=o||r,q=g?"1px":"1.5px",ze=c?.button?.disabledBackgroundColor||`${A}88`,Ge=c?.button?.disabledColor||z;return{height:"56px",backgroundColor:M?ze:h?`${A}cc`:x?`${A}ee`:A,color:M?Ge:z,border:`${q} solid ${U}`,borderRadius:c?.button?.borderRadius||"12px",fontSize:"22px",fontWeight:500,fontFamily:Q.mono,opacity:M?.78:1,transform:M?"none":h?"scale(0.98)":x?"translateY(-2px)":"none",boxShadow:M?`3px 3px 0px ${B}, 4px 4px 0px ${U}`:h?`2px 2px 0px ${U}`:x?`5px 5px 0px ${B}, 6px 6px 0px ${U}`:`3px 3px 0px ${B}, 4px 4px 0px ${U}`,transition:"transform 150ms ease, box-shadow 150ms ease, background-color 150ms ease, border-color 150ms ease, color 150ms ease"}}default:return{}}},E=()=>{if(e==="outline")return{};switch(t){case"sm":return{padding:`${i.spacing.sm} ${i.spacing.md}`,fontSize:i.typography.fontSize.sm};case"md":return{padding:`${i.spacing.md} ${i.spacing.lg}`,fontSize:i.typography.fontSize.base};case"lg":return{padding:`${i.spacing.lg} ${i.spacing.xl}`,fontSize:i.typography.fontSize.lg};default:return{}}},N={borderRadius:c?.button?.borderRadius||i.borderRadius.md,fontWeight:c?.button?.fontWeight||i.typography.fontWeight.medium,fontFamily:c?.button?.fontFamily||i.typography.fontFamily,fontSize:c?.button?.fontSize||void 0,transition:"background-color 150ms ease, border-color 150ms ease, color 150ms ease, opacity 150ms ease",cursor:o||r?"not-allowed":"pointer",opacity:(o||r)&&e!=="outline"?.6:1,width:n?"100%":"auto",display:"flex",alignItems:"center",justifyContent:"center",gap:i.spacing.sm,...S(),...E(),...c?.button?.fontSize&&{fontSize:c.button.fontSize}},I=o||r;return C.jsxs("button",{type:d.type??"button","data-spiceflow-focus":!0,"aria-busy":r||void 0,"aria-disabled":I||void 0,style:{...N,...l},className:s,disabled:I,onMouseEnter:A=>{b(!0),d.onMouseEnter?.(A)},onMouseLeave:A=>{b(!1),$(!1),d.onMouseLeave?.(A)},onMouseDown:A=>{$(!0),d.onMouseDown?.(A)},onMouseUp:A=>{$(!1),d.onMouseUp?.(A)},...d,children:[r&&C.jsx(ue,{size:16}),a]})},fr=({onAuthSuccess:e,onAuthError:t,theme:r="light",className:n="",buttonText:o="Login with Privy",autoTrigger:a=!1})=>{const s=je(r),[l,m]=y.useState(!1),[c,p]=y.useState(!1),{ready:d,authenticated:f,user:u}=T.usePrivy(),{login:w}=T.useLogin(),{logout:i}=T.useLogout();y.useEffect(()=>{m(!0)},[]),y.useEffect(()=>{a&&d&&!f&&l&&!c&&(p(!0),g())},[a,d,f,l,c]),y.useEffect(()=>{if(d&&f&&u&&e){const b=u.wallet?.address||u.email?.address;b&&e(b)}},[d,f,u,e]),y.useEffect(()=>{},[d,f,t]);const g=()=>{try{w()}catch(b){const h=`Login failed: ${String(b)}`;t?t(h):console.error(h)}},x=()=>{try{i()}catch(b){const h=`Logout failed: ${String(b)}`;t?t(h):console.error(h)}};if(!l)return C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",disabled:!0,theme:s,children:o})});if(!d)return C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",disabled:!0,theme:s,children:"Loading..."})});if(f&&u){const b=u.wallet?.address||u.email?.address,h=b?Re(b):"Connected";return C.jsx("div",{className:n,children:C.jsxs(_,{variant:"primary",onClick:x,theme:s,children:["Logout (",h,")"]})})}return a?C.jsx("div",{className:n,children:C.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"center",padding:"20px",flexDirection:"column",gap:"12px"},children:[C.jsx(ue,{size:40,borderWidth:3,color:"#3b82f6"}),C.jsx("p",{style:{color:"#6b7280",fontSize:"14px"},children:"Opening login..."})]})}):C.jsx("div",{className:n,children:C.jsx(_,{variant:"primary",onClick:g,theme:s,children:o})})};exports.Button=_,exports.CHAIN_CONFIGS=ot,exports.EMPTY_INVENTORY=Se,exports.PrivyLogin=fr,exports.RELAYER_API_URL=Ce,exports.SpiceFlowProvider=ar,exports.SpiceFlowProviderContext=ee,exports.SpiceflowError=R,exports.Spinner=ue,exports.addressesEqual=G,exports.amountsWithinBps=Mt,exports.buildDarkPalette=lr,exports.buildLightPalette=cr,exports.calculateBpsFee=Te,exports.copyToClipboard=Vt,exports.createInitialSteps=Tt,exports.createInventoryStore=Ie,exports.describeChainSwitchError=Et,exports.duration=P,exports.easing=F,exports.ensureSmartWallet=Be,exports.ensureWalletOnChain=lt,exports.feeAmountsWithinTolerance=Fe,exports.feeBreakdownsWithinTolerance=Lt,exports.font=Q,exports.formatAssetBalance=Kt,exports.formatBalance=Pe,exports.formatDecimalInput=Jt,exports.formatRawTokenInput=qt,exports.formatUsd=Gt,exports.getAllAssetsForChain=dt,exports.getAssetDisplayChainName=Xt,exports.getAssetDisplayName=We,exports.getAssetDisplaySymbol=Ne,exports.getBatchFees=Z,exports.getChainConfig=L,exports.getChainName=V,exports.getChainsForAssets=ct,exports.getClientForChain=ye,exports.getDelegateContractAddress=st,exports.getEscrowFreeFeePreview=_t,exports.getExplorerUrl=it,exports.getRelayerErrorDetail=bt,exports.getRpcUrlForChain=J,exports.getSingleNetOutput=Ot,exports.getSupplyFeePreview=zt,exports.getTokenDecimals=ut,exports.getWalletBalanceEntries=St,exports.hasStoredSpiceFlowMode=rr,exports.isAssetAllowed=Yt,exports.isSpiceflowError=ae,exports.isUserRejection=ve,exports.parseNumericInput=Ht,exports.radius=ht,exports.relayerFetch=X,exports.relayerService=W,exports.resolveFeeToleranceBps=de,exports.resolveTheme=De,exports.sanitizeError=wt,exports.splitFeeInclusiveAmount=Ut,exports.transition=gt,exports.truncateAddress=Re,exports.useAssetDisplay=Zt,exports.useIsUserWhitelisted=Ae,exports.useProviderWallets=ne,exports.useSpiceBrand=Oe,exports.useWallet=ke,exports.z=mt;