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