@turtleclub/earn-widget 0.3.3-beta.8 → 0.4.0-beta.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.
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  import { Address, Hex } from 'viem';
2
+ import React from 'react';
3
3
 
4
4
  type HexColor = `#${string}`;
5
5
  /**
@@ -62,38 +62,15 @@ interface Adapter {
62
62
  changeNetwork: (network: number) => Promise<void>;
63
63
  disconnect: () => Promise<void>;
64
64
  }
65
+
65
66
  interface EarnWidgetProps {
66
67
  config: WidgetStyleConfig;
67
68
  adapter: Adapter;
68
69
  distributorId: string;
69
- campaignId?: string;
70
70
  }
71
71
 
72
72
  declare function EarnWidget({ adapter, config, distributorId, }: EarnWidgetProps): React.ReactElement;
73
73
 
74
- interface AdapterProviderProps {
75
- adapter: Adapter;
76
- distributorId: string;
77
- children: React.ReactNode;
78
- }
79
- declare const AdapterProvider: React.FC<AdapterProviderProps>;
80
- declare const useAdapter: () => Adapter;
81
- declare const useWalletConnection: () => {
82
- user: string | undefined;
83
- network: number | undefined;
84
- isConnected: boolean;
85
- openConnectionModal: () => void;
86
- };
87
- declare const useTransactionMethods: () => {
88
- sendTransaction: (transaction: Transaction) => Promise<string>;
89
- signMessage: (message: string) => Promise<string>;
90
- changeNetwork: (network: number) => Promise<void>;
91
- };
92
- declare const useNetworkMethods: () => {
93
- network: number | undefined;
94
- changeNetwork: (network: number) => Promise<void>;
95
- };
96
-
97
74
  declare const defaultWidgetStyleConfig: WidgetStyleConfig;
98
75
 
99
- export { type Adapter, AdapterProvider, EarnWidget, type EarnWidgetProps, type Transaction, type WidgetStyleConfig, defaultWidgetStyleConfig, useAdapter, useNetworkMethods, useTransactionMethods, useWalletConnection };
76
+ export { type Adapter, EarnWidget, type EarnWidgetProps, type Transaction, type WidgetStyleConfig, defaultWidgetStyleConfig };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import React from 'react';
2
1
  import { Address, Hex } from 'viem';
2
+ import React from 'react';
3
3
 
4
4
  type HexColor = `#${string}`;
5
5
  /**
@@ -62,38 +62,15 @@ interface Adapter {
62
62
  changeNetwork: (network: number) => Promise<void>;
63
63
  disconnect: () => Promise<void>;
64
64
  }
65
+
65
66
  interface EarnWidgetProps {
66
67
  config: WidgetStyleConfig;
67
68
  adapter: Adapter;
68
69
  distributorId: string;
69
- campaignId?: string;
70
70
  }
71
71
 
72
72
  declare function EarnWidget({ adapter, config, distributorId, }: EarnWidgetProps): React.ReactElement;
73
73
 
74
- interface AdapterProviderProps {
75
- adapter: Adapter;
76
- distributorId: string;
77
- children: React.ReactNode;
78
- }
79
- declare const AdapterProvider: React.FC<AdapterProviderProps>;
80
- declare const useAdapter: () => Adapter;
81
- declare const useWalletConnection: () => {
82
- user: string | undefined;
83
- network: number | undefined;
84
- isConnected: boolean;
85
- openConnectionModal: () => void;
86
- };
87
- declare const useTransactionMethods: () => {
88
- sendTransaction: (transaction: Transaction) => Promise<string>;
89
- signMessage: (message: string) => Promise<string>;
90
- changeNetwork: (network: number) => Promise<void>;
91
- };
92
- declare const useNetworkMethods: () => {
93
- network: number | undefined;
94
- changeNetwork: (network: number) => Promise<void>;
95
- };
96
-
97
74
  declare const defaultWidgetStyleConfig: WidgetStyleConfig;
98
75
 
99
- export { type Adapter, AdapterProvider, EarnWidget, type EarnWidgetProps, type Transaction, type WidgetStyleConfig, defaultWidgetStyleConfig, useAdapter, useNetworkMethods, useTransactionMethods, useWalletConnection };
76
+ export { type Adapter, EarnWidget, type EarnWidgetProps, type Transaction, type WidgetStyleConfig, defaultWidgetStyleConfig };
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import {createContext,useContext,useState,useMemo,useEffect,useRef,useCallback}from'react';import {atom,useAtomValue,useSetAtom,useAtom}from'jotai';import {clsx}from'clsx';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {ArrowLeft,TurtleIcon,Wallet2Icon}from'lucide-react';import {campaignsV2,useEarnCampaigns,useConfig,usePartnerCampaigns,useEarnRoute,useGeocheck}from'@turtleclub/hooks';import {useQueries}from'@tanstack/react-query';import {earnWalletBalances}from'@turtleclub/api';import {getChainById,chainLogo,isChainSupported}from'@turtleclub/chains';import {SegmentControl,Card,Button,OpportunityList,AssetList,cn,IconAnimation,Separator,DataTable,OpportunitySection,RouteDetails,CampaignItem,iconUrlToImg,SwapInput,SwapDetails,TxStatus,Tooltip,TooltipTrigger,TooltipContent,DropdownMenu,DropdownMenuTrigger,DropdownMenuContent,DropdownMenuItem}from'@turtleclub/ui';import {formatNumber,formatToken}from'@turtleclub/utils';import {cva}from'class-variance-authority';function oe(...e){return clsx(e)}var Ae={theme:"dark",widgetWidth:"default",customWidth:"100%",padding:"default",rounding:"default",fontFamily:"Montserrat",fontSecondary:"DM Sans",deals:[],campaigns:[],styles:{background:"#141514",background_dark:"#F9F9F9",foreground:"#F9F9F9",foreground_dark:"#141514",card:"#141514",card_dark:"#F9F9F9",muted_foreground:"#FFFFFF80",muted_foreground_dark:"#14151480",primary:"#73F36C",primary_dark:"#73F36C"}};var ee=atom(Ae);atom(false);atom(false);atom(null);atom({amount:"",tokenAddress:"",tokenDecimals:0,chain:""});var Z=atom({status:"idle",hash:void 0,error:void 0});atom(e=>e(Z).status,(e,t,n)=>{let r=e(Z);t(Z,{...r,status:n});});atom(e=>e(Z).hash,(e,t,n)=>{let r=e(Z);t(Z,{...r,hash:n});});function ae(e){return `rgb(from ${e} calc(255 - r) calc(255 - g) calc(255 - b))`}function nn(e,t=10){return `color-mix(in srgb, ${e} ${100-t}%, black)`}function Ue(e,t){let n=t==="dark",r={"--color-brand-black":n?e.background_dark:ae(e.background_dark),"--color-brand-white":n?e.foreground_dark:ae(e.foreground_dark),"--color-brand-green":n?e.primary_dark:nn(e.primary_dark)};return (e.card!==void 0||e.card_dark!==void 0)&&(r["--color-surface-primary"]=n?e.card_dark??e.card??e.background_dark:ae(e.card_dark??e.background_dark)),(e.muted_foreground!==void 0||e.muted_foreground_dark!==void 0)&&(r["--muted-foreground"]=n?e.muted_foreground_dark??e.muted_foreground??e.foreground_dark:ae(e.muted_foreground_dark??e.muted_foreground_dark??e.foreground_dark)),r}var $e={background_dark:"#141514",foreground_dark:"#F9F9F9",primary_dark:"#73F36C",background:"#F9F9F9",foreground:"#2A2B2A",primary:"#3CBF38",card:"#F7F7F7",muted_foreground:"#9CA3AF",card_dark:"#141514",muted_foreground_dark:"#FFFFFF80"},He="dark",je="Montserrat, sans-serif",Je="DM Sans, sans-serif";function H(){let e=useAtomValue(ee),t=e?.theme??He,n=e?.fontFamily??je,r=e?.fontSecondary??Je,i=e?.widgetWidth??"default",o=e?.customWidth??"100%",a=e?.showNavigation??true,c=e?.padding??"default",s=e?.rounding??"default",u=e?.styles??$e,l=Ue(u,t==="auto"?"dark":t);return {theme:t,coreTokenCSS:l,fontPrimary:n,fontSecondary:r,widgetWidth:i,customWidth:o,showNavigation:a,padding:c,rounding:s,config:e,widgetStyles:u}}function ze({config:e,children:t}){let n=useSetAtom(ee),{theme:r,coreTokenCSS:i,fontPrimary:o,fontSecondary:a,widgetWidth:c}=H();return useEffect(()=>{n(e);},[e,n]),jsx("div",{className:oe("turtle-widget-root text-foreground","antialiased transition-all duration-700 ease-linear w-full overflow-hidden","h-full flex items-center justify-center",r==="dark"?"dark":""),style:{...i,"--font-primary":o,"--font-secondary":a,fontFamily:o,backgroundColor:"transparent",maxHeight:"90vh"},children:jsx("div",{className:oe("flex flex-col gap-2 h-full overflow-hidden",c==="full"?"w-full items-center":c==="custom"?"items-stretch":"items-center"),style:{...c==="custom"&&e.customWidth?{width:e.customWidth}:c==="default"?{width:"620px"}:{}},children:t})})}var j=atom("none"),ie=atom(e=>e(j)==="deals",(e,t)=>t(j,"deals")),Ge=atom(e=>e(j)==="assets",(e,t)=>t(j,"assets")),le=atom(null,(e,t)=>t(j,"none"));function Ke(e,t){let[n,r=""]=e.split("."),i=r.padEnd(t,"0").slice(0,t),o=n+i;return BigInt(o)}function Ye(e,t){let n=e.toString();if(t===0)return n;let r=n.padStart(t+1,"0"),i=r.slice(0,-t)||"0",a=r.slice(-t).replace(/0+$/,"");return a===""?i:`${i}.${a}`}function ce(e,t=2){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:t,maximumFractionDigits:t}).format(e)}var Qe={user:"",chain:1,slippage:.001,tokenIn:"",tokenOut:"",amount:"",id:void 0,selectedOpportunity:null,selectedToken:null,resetTrigger:0},E=atom(Qe),qe=atom(e=>{let t=e(E);if(!t.user||!t.tokenIn||!t.tokenOut||!t.amount||!t.selectedToken)return;let n=Ke(t.amount,t.selectedToken.decimals).toString();return {user:t.user,chain:t.chain,slippage:t.slippage,tokenIn:t.tokenIn,tokenOut:t.tokenOut,amount:n,id:t.id,referral:"",distributor_id:t.distributor_id,referral_code:t.referral_code}}),te=atom(e=>e(E).amount,(e,t,n)=>{let r=e(E);t(E,{...r,amount:n});}),L=atom(e=>e(E).selectedOpportunity,(e,t,n)=>{let r=e(E);t(E,{...r,selectedOpportunity:n,tokenOut:n?.tokenDetails.tokenAddress??""});}),ue=atom(e=>e(E).selectedToken,(e,t,n)=>{let r=e(E);t(E,{...r,selectedToken:n,tokenIn:n?.address||""});}),Ze=atom(e=>e(E).slippage,(e,t,n)=>{let r=e(E);t(E,{...r,slippage:n});}),ne=atom(e=>e(E).resetTrigger,(e,t,n)=>{let r=e(E);t(E,{...r,resetTrigger:n});});atom(e=>{let t=e(E);return !!(t.user&&t.tokenIn&&t.tokenOut&&t.amount&&t.selectedToken&&parseFloat(t.amount)>0)});atom(null,(e,t)=>{let n=e(E);t(E,{...Qe,user:n.user,chain:n.chain,resetTrigger:n.resetTrigger+1});});function et({chainIds:e,address:t}){let n=useConfig(),r=useQueries({queries:e.map(s=>({queryKey:["earnWalletBalances",s,t],queryFn:async()=>t?await earnWalletBalances({chain:s,user:t},n):null,enabled:!!t,staleTime:60*1e3*5,refetchInterval:60*1e3,refetchOnWindowFocus:false}))}),i=useMemo(()=>{let s={};return r.forEach((u,p)=>{let l=e[p];u.data&&l!==void 0&&(s[l]=u.data.balances);}),s},[r,e]),o=r.some(s=>s.isLoading),a=r.find(s=>s.error)?.error||null;return {balances:i,isLoading:o,error:a,refetchAll:()=>{r.forEach(s=>{s.refetch();});}}}var rt=createContext(null),at=createContext(""),Ne=({adapter:e,distributorId:t,children:n})=>jsx(rt.Provider,{value:e,children:jsx(at.Provider,{value:t,children:n})}),w=()=>{let e=useContext(rt);if(!e)throw new Error("useAdapter must be used within an AdapterProvider");return e},de=()=>useContext(at),Y=()=>{let e=w();return {user:e.user,network:e.network,isConnected:!!e.user,openConnectionModal:e.openConnectionModal}},dn=()=>{let e=w();return {sendTransaction:e.sendTransaction,signMessage:e.signMessage,changeNetwork:e.changeNetwork}},mn=()=>{let e=w();return {network:e.network,changeNetwork:e.changeNetwork}};function re(e,t,n=2){if(e===0||e==null||isNaN(e))return "0";let r;switch(t){case "currency":e>=1e6?r=`$${(e/1e6).toFixed(2)}M`:e>=1e3?r=`$${(e/1e3).toFixed(2)}K`:r=`$${e.toFixed(2)}`;break;case "percentage":r=`${e.toFixed(n)}%`;break;case "number":e>=1e3?r=`${(e/1e3).toFixed(1)}K`:r=e.toString();break;default:r=e.toString();}return r}function st(e){let t=[];if(e.vaults.forEach(o=>{o.katanaCampaignConfig?.incentives&&o.katanaCampaignConfig?.incentives.forEach(a=>{a.apr&&a.apr>0&&t.push(a.apr);});}),e.campaign.katanaConfig?.additionalIncentives&&e.campaign.katanaConfig.additionalIncentives.forEach(o=>{o.apr&&o.apr>0&&t.push(o.apr);}),e.campaign.tacConfig?.additionalIncentives&&e.campaign.tacConfig.additionalIncentives.forEach(o=>{o.apr&&o.apr>0&&t.push(o.apr);}),t.length===0)return null;let n=t.filter(o=>o>1);if(n.length===0)return null;let r=Math.min(...n),i=Math.max(...n);return [re(r,"percentage",2),re(i,"percentage",2)]}var it=(e,t)=>{let n=t.katanaCampaignConfig!==null,r=t.tacCampaignConfig!==null;return n?pn(e,t):r?[]:[]},pn=(e,t)=>{let n=e.campaign.katanaConfig?.incentives,r=e.campaign.katanaConfig?.additionalIncentives,i=t.katanaCampaignConfig?.incentives,o=i?.map(s=>{let u=n?.find(l=>l.id===s.id);return u?{name:`Est. ${u.name}`,description:u.tooltip,apr:s.apr,boost:s.apr===void 0,iconUrl:u.iconUrl}:null}).filter(s=>s!==null)||[],a=i?.map(s=>{let u=r?.find(m=>m.id===s.id);if(!u)return null;let p=s.apr??u.apr;return {name:`${u.estApr?"Est. ":""}${u.name}`,description:u.tooltip,apr:p,boost:p===void 0,iconUrl:u.iconUrl}}).filter(s=>s!==null)||[];return [...o,...a].sort((s,u)=>u.apr-s.apr)};var Ie="2c86d3a1-cfe8-486d-915d-1b9ff5e924e9",ct=createContext(void 0);function F(){let e=useContext(ct);if(!e)throw new Error("useEarnData must be used within EarnDataProvider");return e}var xn={1:"https://storage.googleapis.com/turtle-assets/tokens/eth.png",747474:"https://storage.googleapis.com/turtle-assets/partners/polygon/katana.svg"};function ut({children:e}){let[t,n]=useAtom(L),r=w(),i=[],o=[Ie],a=false,{data:c,isLoading:s,error:u}=useEarnCampaigns(),p=d=>{let h=d.campaign.katanaConfig?.incentives.map(W=>({icon:W.iconUrl,name:W.name}))??[],T=d.campaign.katanaConfig?.additionalIncentives.map(W=>({icon:W.iconUrl,name:W.name}))??[],I=[...h,...T].filter(Boolean),D=d.vaults.map(W=>({icon:xn[W.earnConfig?.tokens?.[0]?.chainId??1],name:W.earnConfig?.tokens?.[0]?.chain??"Ethereum"})),K=st(d)??"0% - 0%";return {icon:d.campaign.iconUrl,name:d.campaign.description,aprRange:`${K[0]} - ${K[1]}`,tvl:re(d.campaign.katanaConfig?.totalTvlUSD??0,"currency"),participants:d.campaign.totalUsers.toString(),rewards:I,chains:D}},l=(d,h)=>{let T=it(h,d)??[],I=T.reduce((D,K)=>D+(K.apr||0),0);return {icon:d.iconUrl,name:d.name,tvl:re(d.tvlUSD,"currency"),apr:I.toFixed(2)+"%",chain:x(d.earnConfig?.tokens?.[0]?.chainId??1),incentives:T.map(D=>({icon:D.iconUrl,name:D.label})),aprBreakdown:T,turtleBoost:null,partner:{icon:h.campaign.iconUrl,name:h.campaign.description}}},m=d=>({type:"Turtle Campaign",disclaimer:[],tvl:d.campaign.katanaConfig?.totalTvlUSD?.toString()??"0"}),b=d=>{let h=d.earnConfig?.tokens[0];return h?{tokenAddress:h.address,tokenName:h.symbol,tokenSymbol:h.symbol,tokenDecimals:h.decimals,iconToken:d.iconUrl}:{tokenAddress:"",tokenName:"",tokenSymbol:"",tokenDecimals:0,iconToken:""}},x=d=>{let h=getChainById(d),T=chainLogo(d);return h?{value:h.name.toLowerCase().replace(/\s+/g,"-"),symbol:h.nativeCurrency.symbol,name:h.name,icon:T,chainId:d}:{value:`chain-${d}`,symbol:"ETH",name:`Chain ${d}`,icon:chainLogo(d),chainId:d}},g=useMemo(()=>{if(!c)return [];let d=c;return o.length>0?d=c.filter(h=>o.includes(h.campaign.id)):a,d.map(h=>p(h))},[c,o,a]),f=useMemo(()=>{if(!c)return {};let d={},h=c;return o.length>0?h=c.filter(T=>o.includes(T.campaign.id)):a,h.forEach(T=>{T.vaults.forEach(I=>{I.earnConfig?.tokens&&I.earnConfig?.tokens.length===0||(d[I.id]={id:I.id,tokenDetails:b(I),opportunityDetails:m(T),opportunityItem:l(I,T)});});}),d},[c,o,i,a]);useEffect(()=>{if(Object.keys(f).length>0&&!t){let d=Object.keys(f)[0];n(f[d]);}},[f,t,n]);let{uniqueChainIds:N,supportedChains:k}=useMemo(()=>{let d=new Map;Object.values(f).forEach(({opportunityItem:I})=>{let D=I.chain;D&&D.chainId&&d.set(D.chainId,D);});let h=Array.from(d.keys()),T=Array.from(d.values()).sort((I,D)=>I.name.localeCompare(D.name));return {uniqueChainIds:h,supportedChains:T}},[f]),{balances:A,isLoading:C,error:y,refetchAll:P}=et({chainIds:N,address:r.user||void 0}),S={isLoading:s,error:u,campaigns:g,opportunities:f,balances:A,supportedChains:k,balancesLoading:C,balancesError:y,refetchBalances:P};return jsx(ct.Provider,{value:S,children:e})}function dt(){let e=useAtomValue(L),{opportunities:t,isLoading:n,error:r}=F();return {deals:t,dealsFormatted:t,isLoading:n,error:r,selectedDeal:e}}function ft({onSwitchToEarn:e}){let t=useSetAtom(le),n=useSetAtom(L),{dealsFormatted:r,isLoading:i,error:o}=dt(),a=c=>{n(c),e(),t();};return o?jsxs("div",{className:"w-full h-full flex flex-col items-center justify-center bg-background",children:[jsx("p",{className:"text-muted-foreground",children:"Error loading deals"}),jsxs(Button,{onClick:()=>t(),variant:"default",className:"mt-2",children:[jsx(ArrowLeft,{className:"w-4 h-4 mr-2"}),"Back"]})]}):i?jsx("div",{className:"w-full h-full flex items-center justify-center bg-background",children:jsx("p",{className:"text-muted-foreground",children:"Loading deals..."})}):jsxs("div",{className:"w-full h-full flex flex-col bg-transparent",children:[jsx("div",{className:"flex items-center justify-start p-3 flex-shrink-0",children:jsx("button",{onClick:()=>t(),className:"text-primary hover:text-primary/80 transition-colors",children:jsx(ArrowLeft,{className:"w-5 h-5"})})}),jsx(OpportunityList,{opportunities:Object.values(r).map(c=>c.opportunityItem),onOpportunityClick:c=>{let s=Object.values(r).find(u=>u.opportunityItem===c);s&&a(s);},groupBy:"partner",filterVariant:"navigation",className:"h-full"})]})}var ht={1:{address:"0x0000000000000000000000000000000000000000",name:"Ethereum",symbol:"ETH",decimals:18,logo:void 0,balance:"0",price:0,chainId:1}};function pe(){let e=w(),t=e.network,n=!!e.user,{balances:r,balancesLoading:i}=F(),[o,a]=useAtom(ue),c=useAtomValue(ne),s=t?r[t]:void 0;return useEffect(()=>{o&&t&&o.chainId!==t&&a(null);},[t,o,a]),useEffect(()=>{if(!(o&&t&&o.chainId===t)&&!(n&&i)){if(s&&s.length>0){let p=[...s].sort((l,m)=>{let b={...l.token,balance:l.amount,decimals:l.token.decimals},x={...m.token,balance:m.amount,decimals:m.token.decimals},g=parseFloat(formatToken(l.amount,b))*(l.token.price||0);return parseFloat(formatToken(m.amount,x))*(m.token.price||0)-g})[0];a({address:p.token.address,name:p.token.name,symbol:p.token.symbol,decimals:p.token.decimals,logo:p.token.logos?.[0],balance:p.amount,price:p.token.price??void 0,chainId:p.token.chain});}else if(!n&&t){let u=ht[t]||ht[1];a({...u,chainId:t});}}},[s,t,o,a,n,i]),useEffect(()=>{},[o]),useEffect(()=>{c>0&&a(null);},[c,a]),{selectedToken:o,setSelectedToken:a,currentChainBalances:s,isLoadingBalances:i}}function fe(e){return new Intl.NumberFormat("en-US",{style:"currency",currency:"USD",minimumFractionDigits:2,maximumFractionDigits:2}).format(e)}function kt({onAssetSelect:e}){let t=useSetAtom(le),n=w(),{isLoadingBalances:r,setSelectedToken:i}=pe(),{balances:o}=F(),a=[];Object.entries(o).forEach(([s,u])=>{u.forEach(p=>{let l={address:p.token.address,name:p.token.name,symbol:p.token.symbol,decimals:p.token.decimals,balance:p.amount,price:p.token.price??void 0,chainId:p.token.chain,logo:p.token.logos?.[0]},m=getChainById(Number(s));a.push({id:`${s}-${l.address}`,symbol:l.symbol,name:l.name,icon:l.logo?jsx("img",{src:l.logo,alt:l.symbol,className:"w-8 h-8 rounded-full"}):jsx("div",{className:"w-8 h-8 rounded-full bg-muted flex items-center justify-center text-xs",children:l.symbol?.charAt(0)||"?"}),balance:formatNumber(formatToken(l.balance,l),5,false,false),balanceUSD:fe(parseFloat(formatToken(l.balance,l))*(l.price||0)),chainId:String(s),chainName:m?.name||"Unknown",address:l.address,decimals:l.decimals});});});let c=async s=>{let u=Number(s.chainId);if(n.network!==u)try{await n.changeNetwork(u);}catch(b){console.error("Failed to switch network:",b);return}let m=o[u]?.find(b=>b.token.address===s.address);m&&(i({address:m.token.address,name:m.token.name,symbol:m.token.symbol,decimals:m.token.decimals,logo:m.token.logos?.[0],balance:m.amount,price:m.token.price??void 0,chainId:m.token.chain}),e?.(s.address||""),t());};return r?jsx("div",{className:"w-full h-full flex items-center justify-center bg-background",children:jsx("p",{className:"text-muted-foreground",children:"Loading balances..."})}):jsxs("div",{className:"w-full h-full flex flex-col bg-transparent text-foreground",children:[jsxs("div",{className:"flex items-center justify-between p-3 flex-shrink-0",children:[jsx("button",{onClick:()=>t(),className:"text-primary hover:text-primary/80 transition-colors",children:jsx(ArrowLeft,{className:"w-5 h-5"})}),jsx("h3",{className:"text-lg font-medium",children:"Select Token"}),jsx("div",{className:"w-5 h-5"})," "]}),jsx(AssetList,{assets:a,onAssetClick:c,groupByChain:true,showChainIcon:true,filterVariant:"navigation",className:"h-full"})]})}var On=cva("p-0",{variants:{padding:{none:"p-0",sm:"p-3",default:"p-4",md:"p-6",lg:"p-7"}},defaultVariants:{padding:"default"}});function ge({children:e,className:t,variant:n,padding:r,rounding:i,...o}){let{padding:a,rounding:c}=H(),s=On({padding:r??a}),u=i??c;return jsx(Card,{className:oe(t,s),...o,variant:n,gradient:"white",rounded:u,children:e})}var xt={xxs:"h-4 text-xs",xs:"h-6 text-sm",sm:"h-8 text-2xl",md:"h-12 text-4xl",lg:"h-16 text-6xl"};function Re({light:e,dark:t,fallback:n="Turtle Club",className:r,size:i="lg"}){let[o,a]=useState(false),{theme:c}=H(),u=c==="dark"?t||e:e||t;return u&&!o?jsx("div",{className:cn("flex justify-center items-center",r),children:jsx("img",{src:u,alt:n,className:cn("object-contain",xt[i]),onError:()=>a(true),onLoad:()=>a(false)})}):jsx("div",{className:cn("flex justify-center items-center",r),children:jsx("span",{className:cn("font-bold text-primary",xt[i]),children:n})})}function vt(){let e=w(),t=de(),n=useAtomValue(L),r=useSetAtom(E);useEffect(()=>{r(i=>({...i,user:e.user||"",chain:e.network||1,distributorId:t,distributor_id:t,id:n?.id||""}));},[e.user,e.network,t,n?.id,r]);}function Ct(){let e=useAtomValue(ee);return {light:e?.logo?.light,dark:e?.logo?.dark,fallback:e?.logo?.fallback||"Turtle Club"}}var St="https://api.turtle.xyz",Le="turtle_earn_widget_auth",Tt=()=>{let e=w(),[t,n]=useState({isAuthenticated:false,isLoading:false,error:null,user:null,tokens:null}),r=useRef(void 0),i=useRef(false),o=useRef(false),a=()=>{try{let l=localStorage.getItem(Le);if(l)return JSON.parse(l)}catch(l){console.error("Error reading stored auth:",l);}return null},c=l=>{try{localStorage.setItem(Le,JSON.stringify(l));}catch(m){console.error("Error storing auth:",m);}},s=()=>{try{localStorage.removeItem(Le);}catch(l){console.error("Error clearing stored auth:",l);}};useEffect(()=>{let l=e?.user;if(l&&!o.current&&!i.current){o.current=true;let m=a();if(m&&m.address.toLowerCase()===l.toLowerCase()){n({isAuthenticated:true,isLoading:false,error:null,user:m.user,tokens:m.tokens}),r.current=l;return}}if(l!==r.current&&l!==void 0&&!i.current){r.current=l,o.current=true;let m=a();m&&m.address.toLowerCase()===l.toLowerCase()?n({isAuthenticated:true,isLoading:false,error:null,user:m.user,tokens:m.tokens}):u(l);}else l===void 0&&r.current!==void 0&&(r.current=void 0,o.current=false,s(),n({isAuthenticated:false,isLoading:false,error:null,user:null,tokens:null}));},[e?.user]);let u=async l=>{if(!i.current){i.current=true,n(m=>({...m,isLoading:true,error:null}));try{let m={address:l,walletEcosystem:"evm",url:window.location.href},b=await fetch(`${St}/auth/get-wallet-signature-message`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(m)});if(!b.ok)throw new Error("Failed to get signature message");let{message:x,nonce:g}=await b.json();if(!e?.signMessage)throw new Error("Wallet adapter does not support message signing");let f=await e.signMessage(x),N={method:"wallet",walletInput:{address:l,ecosystem:"evm",signature:f,nonce:g}},k=await fetch(`${St}/auth/authenticate`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(N)});if(!k.ok)throw new Error("Failed to authenticate");let A=await k.json();c({address:l,tokens:A.authTokens,user:A.user}),n({isAuthenticated:!0,isLoading:!1,error:null,user:A.user,tokens:A.authTokens});}catch(m){console.error("Authentication error:",m),n(b=>({...b,isLoading:false,error:m instanceof Error?m.message:"Authentication failed"}));}finally{i.current=false;}}};return {...t,logout:()=>{s(),n({isAuthenticated:false,isLoading:false,error:null,user:null,tokens:null});}}};function wt(){let[e,t]=useState(""),n=useSetAtom(ie),{campaigns:r,isLoading:i,error:o}=F();return o?jsx("div",{className:"w-full h-full flex items-center justify-center bg-background",children:jsx("p",{className:"text-muted-foreground",children:"Error loading discover content"})}):i?jsx("div",{className:"w-full h-full flex items-center justify-center bg-background",children:jsx("p",{className:"text-muted-foreground",children:"Loading discover content..."})}):jsxs("div",{className:"w-full h-full flex flex-col min-h-0",children:[jsx("div",{className:"p-3 space-y-3 flex-shrink-0",children:jsx("h2",{className:"text-sm text-foreground font-medium",children:"Deposit directly into Turtle's boosted deals and liquidity campaign opportunities."})}),jsx("div",{children:r.map(a=>jsx(CampaignItem,{value:a,onSelect:()=>n()},a.name))})]})}var{useUserCampaignPositions:At}=campaignsV2,Fe=["tac","katana"];function Nt(){let{user:e}=Y(),{data:t,isLoading:n,error:r}=usePartnerCampaigns({idFilter:Fe.join(",")}),i=useMemo(()=>t?Fe.reduce((k,A)=>{let C=t.find(y=>y.campaign.name.toLowerCase()===A);return C&&(k[A]=C,C.vaults.length===0&&console.warn(`\u26A0\uFE0F Campaign ${A} has no vaults from API`)),k},{}):{},[t]),{userPositions:o,userTotalTVL:a,isLoading:c,error:s}=At({campaignName:"tac",userAddress:e}),{userPositions:u,userTotalTVL:p,isLoading:l,error:m}=At({campaignName:"katana",userAddress:e}),b=useMemo(()=>({tac:{userPositions:o||[],userTotalTVL:a||0},katana:{userPositions:u||[],userTotalTVL:p||0}}),[o,a,u,p]),x=(a||0)+(p||0),g=useMemo(()=>Fe.reduce((k,A)=>(k[A]=[],k),{}),[]);return {campaigns:i,positions:b,totalTVL:x,incentives:g,isLoading:n||c||l,error:r||s||m}}var Et=[{id:"vault.id",header:"Position",accessorKey:"vault.id",cell:({row:e})=>jsx("div",{className:"flex justify-start gap-0.5",children:jsxs("a",{href:`https://app.turtle.club/campaigns/${e.original.vault.campaign}`,className:"flex max-w-[120px] items-center gap-[5px] text-foreground hover:text-primary transition-colors",target:"_blank",rel:"noopener noreferrer",children:[jsx("img",{src:e.original.vault.iconUrl,alt:e.original.vault.name,className:"size-5 shrink-0 rounded-full"}),jsx("span",{className:"truncate",children:e.original.vault.name})]})})},{id:"tvl",header:"TVL",accessorKey:"tvl",cell:({row:e})=>jsx("span",{className:"text-foreground",children:ce(e.original.userTVL??0,2)})}];var no=["katana"];function It(){let{user:e,openConnectionModal:t}=Y(),{positions:n,totalTVL:r,isLoading:i}=Nt(),o=useMemo(()=>no.flatMap(s=>n[s].userPositions).sort((s,u)=>u.userTVL-s.userTVL),[n]),a=()=>{t&&t();};return i||o.length===0?jsxs("div",{className:"sm:min-h-[690px] -mt-8 flex flex-col justify-center items-center gap-4 text-foreground",children:[jsx(IconAnimation,{spinning:true,children:jsx(TurtleIcon,{className:"w-6 h-6 text-primary"})}),"Loading..."]}):jsx("div",{className:"sm:min-h-[690px] p-4",children:!i&&e===void 0?jsx(Button,{variant:"default",border:"plain",onClick:a,children:"Connect wallet"}):jsxs(Fragment,{children:[jsxs("div",{className:"text-right text-sm mr-2",children:[jsx("span",{className:"text-foreground/60",children:"Your TVL: "}),jsx("span",{className:"text-foreground font-semibold",children:ce(r,2)})]}),jsx(Separator,{className:"my-2"}),jsx(DataTable,{columns:Et,data:o})]})})}function Dt(){let[e,t]=useAtom(L),n=w(),r=n.network,i=e?.opportunityItem?.chain?.chainId,o=!!(e&&r!==void 0&&i!==void 0&&i!==r&&isChainSupported(i));return {selectedOpportunity:e,setSelectedOpportunity:t,chainId:i,needsChainSwitch:o,isCorrectChain:!!(e&&r!==void 0&&i!==void 0&&i===r),switchToOpportunityChain:async()=>{if(i&&o)try{await n.changeNetwork(i);}catch(l){throw console.error("Failed to switch network:",l),l}},getTokenAddress:()=>e?.tokenDetails?.tokenAddress,getTokenSymbol:()=>e?.tokenDetails?.tokenSymbol,getVaultId:()=>e?.id}}function Rt(){let e=useSetAtom(Ge);return {openTokenSelector:()=>{e();}}}function Ft(){let t=!!w().user,{chainId:n,needsChainSwitch:r,switchToOpportunityChain:i}=Dt(),[o,a]=useAtom(te),c=useAtomValue(ne),{selectedToken:s,currentChainBalances:u,isLoadingBalances:p}=pe(),{openTokenSelector:l}=Rt(),m=u?.map(y=>({icon:y.token.logos?.[0]?iconUrlToImg(y.token.logos[0],y.token.symbol):null,symbol:y.token.symbol,address:y.token.address,balance:y.amount}))||[],b=s?{icon:s.logo?iconUrlToImg(s.logo,s.symbol):null,symbol:s.symbol,address:s.address,balance:s.balance}:null;useEffect(()=>{a("");},[s,a]),useEffect(()=>{c>0&&a("");},[c,a]);let x=()=>{if(s){let y=s.balance==="0"?"0":s.balance,P=formatToken(y,s),S=formatNumber(P,5,false,false);a(S);}},g=s?formatNumber(formatToken(s.balance,s),5,false,false):"0",f=parseFloat(o)||0,N=s?parseFloat(formatToken(s.balance,s)):0,k=f>N&&t,A=s&&o?k?"Insufficient balance":fe(parseFloat(o)*(s.price||0)):void 0,C=r&&n?getChainById(n):null;return r&&C&&t?jsxs("div",{className:"w-full flex flex-col gap-2 items-start justify-start",children:[jsx("h3",{className:"text-md text-foreground font-medium",children:"Deposit"}),jsx("div",{className:"w-full p-4 border border-muted rounded-lg bg-muted/10",children:jsxs("p",{className:"text-sm text-muted-foreground text-center",children:["Please"," ",jsx("button",{onClick:i,className:"text-primary hover:text-primary/80 underline font-medium cursor-pointer transition-colors",children:"switch"})," ","to ",jsx("strong",{children:C.name})," to continue with this opportunity"]})})]}):p&&t?jsxs("div",{className:"w-full flex flex-col gap-2 items-start justify-start",children:[jsx("h3",{className:"text-md text-foreground font-medium",children:"Deposit"}),jsx("div",{className:"w-full p-4 border border-muted rounded-lg bg-muted/10",children:jsx("p",{className:"text-sm text-muted-foreground text-center",children:"Loading tokens..."})})]}):jsxs("div",{className:"w-full flex flex-col gap-2 items-start justify-start",children:[jsx("h3",{className:"text-md text-foreground font-medium",children:"Deposit"}),jsx("div",{className:"w-full relative",children:jsx(SwapInput,{value:o,onChange:a,tokens:m,usdValue:k?void 0:A,balance:g,onMaxClick:x,isWalletConnected:t,className:`w-full [&_button]:w-32 [&_button]:min-w-32 p-6 ${k?"border-destructive/50":""}`,useCustomTokenSelector:true,selectedTokenData:b,onCustomTokenSelectorClick:l})})]})}function _t({earnRoute:e,userAddress:t,sendTransaction:n,onError:r=()=>{},onSuccess:i=()=>{}}){let[o,a]=useState({steps:[],currentIndex:0,isExecuting:false,allCompleted:false,hasError:false,cancelled:false}),{network:c}=Y(),s=useMemo(()=>{if(!e)return null;let g=e.steps?.map(f=>`${f.id}-${f.to}-${f.data}`).join("|")||"";return {...e,_stepsKey:g}},[e?.success,e?.estimatedGas,e?.estimatedTime,e?.outputAmount,e?.steps?.map(g=>`${g.id}-${g.to}-${g.data}`).join("|")]);useEffect(()=>{if(s&&s.success&&s.steps.length>0){let g=s.steps.map((f,N)=>({id:f.id,label:f.title,description:f.description,txData:{to:f.to,data:f.data,value:f.value,gasLimit:f.gasLimit},completed:false,current:N===0}));a({steps:g,currentIndex:0,isExecuting:false,allCompleted:false,hasError:false,cancelled:false});}else a({steps:[],currentIndex:0,isExecuting:false,allCompleted:false,hasError:false,cancelled:false});},[s]);let u=useRef(o),p=useRef({userAddress:t,sendTransaction:n,onError:r,onSuccess:i});useEffect(()=>{u.current=o;},[o]),useEffect(()=>{p.current={userAddress:t,sendTransaction:n,onError:r,onSuccess:i};},[t,n,r,i]);let l=useCallback(async()=>{let g=u.current,{userAddress:f,sendTransaction:N,onError:k,onSuccess:A}=p.current;if(!f||!N||g.isExecuting)return;let C=g.steps[g.currentIndex];if(!(!C||C.completed)){a(y=>({...y,isExecuting:true,hasError:false,cancelled:false,error:void 0}));try{let y=await N({to:C.txData.to,data:C.txData.data,value:C.txData.value?BigInt(C.txData.value):void 0,chainId:c}),P=typeof y=="object"&&"hash"in y?y.hash:String(y);a(S=>{let d=[...S.steps];return d[S.currentIndex]={...d[S.currentIndex],txHash:P},{...S,steps:d}});try{typeof y=="object"&&"wait"in y&&await y.wait();}catch(S){console.warn("Could not wait for transaction confirmation, proceeding anyway:",S);}a(S=>{let d=[...S.steps];d[S.currentIndex]={...d[S.currentIndex],completed:!0,current:!1};let h=S.currentIndex+1,T=h>=d.length;T||(d[h]={...d[h],current:!0});let I=T;return I&&A&&A(),{...S,steps:d,currentIndex:T?S.currentIndex:h,isExecuting:!1,allCompleted:I}});}catch(y){let P=y instanceof Error?y.message:String(y),S=P.toLowerCase().includes("user rejected")||P.toLowerCase().includes("user denied")||P.toLowerCase().includes("user cancelled")||P.toLowerCase().includes("cancelled by user")||P.toLowerCase().includes("transaction rejected")||P.includes("4001");a(d=>({...d,isExecuting:false,hasError:!S,cancelled:S,error:S?"Transaction cancelled by user":y instanceof Error?y.message:"Transaction failed"})),k&&!S&&k(y instanceof Error?y:new Error("Transaction failed"));}}},[]),m=useCallback(()=>{if(s&&s.success&&s.steps.length>0){let g=s.steps.map((f,N)=>({id:f.id,label:f.title,description:f.description,txData:{to:f.to,data:f.data,value:f.value,gasLimit:f.gasLimit},completed:false,current:N===0}));a({steps:g,currentIndex:0,isExecuting:false,allCompleted:false,hasError:false,cancelled:false});}},[s]),b=o.steps[o.currentIndex]||null,x=!!(t&&o.steps.length>0&&!o.isExecuting&&!o.allCompleted&&!o.cancelled);return useEffect(()=>{if(o.steps.length<=1)return;let g=o.currentIndex-1,f=g>=0&&o.steps[g]?.completed,N=o.currentIndex<o.steps.length&&!o.steps[o.currentIndex]?.completed,k=o.currentIndex<o.steps.length;if(f&&N&&k&&!o.isExecuting&&!o.allCompleted&&!o.cancelled){let C=setTimeout(()=>{l();},1e3);return ()=>clearTimeout(C)}},[o.steps,o.currentIndex,o.isExecuting,o.allCompleted,o.cancelled,l]),{...o,currentStep:b,canExecute:x,executeCurrentTransaction:l,resetQueue:m,totalSteps:o.steps.length,completedSteps:o.steps.filter(g=>g.completed).length,progress:o.steps.length>0?o.steps.filter(g=>g.completed).length/o.steps.length*100:0}}function Bt(e){let t=e!==void 0&&!!e.user&&!!e.amount&&parseFloat(e.amount)>0,{data:n,isLoading:r,error:i}=useEarnRoute(t?{user:e.user,chain:e.chain||1,tokenIn:e.tokenIn,tokenOut:e.tokenOut,amount:e.amount,slippage:e.slippage||.1,id:e.id||"",distributor_id:e.distributor_id||"",referral_code:e.referral_code||""}:void 0);return {data:n?{success:true,steps:n.steps?.map((a,c)=>({id:`step-${c}`,type:a.kind==="approve"?"approval":"deposit",title:a.kind==="approve"?"Approve Token":"Execute Transaction",description:a.kind==="approve"&&"token"in a?`Approve ${a.token.symbol}`:"Execute routing transaction",to:a.tx.to,data:a.tx.data,value:a.tx.value,gasLimit:a.tx.gas.toString()}))||[],estimatedGas:"0",estimatedTime:void 0,outputAmount:n.amount_out,metadata:void 0}:null,isLoading:r,error:i}}function ve(){let e=useAtomValue(qe),t=useAtomValue(L),n=de(),r=Bt(e&&{...e,distributor_id:n,id:e.id||""}),i=e!==void 0&&!!e.user&&!!e.amount&&parseFloat(e.amount)>0,{data:o}=useEarnRoute(i?{user:e.user,chain:e.chain||1,tokenIn:e.tokenIn,tokenOut:e.tokenOut,amount:e.amount,slippage:e.slippage||.1,distributor_id:n||"",referral_code:e.referral_code||"",id:e.id||""}:void 0),a=ho(o,t);return {...r,isReady:!!e,hasRequiredParams:!!(e?.user&&e?.tokenIn&&e?.tokenOut&&e?.amount),routeDetails:a}}function ho(e,t){if(!e?.steps)return [];let n=(o,a)=>({in:{icon:o.logos[0],symbol:o.symbol},out:null,amount:Ye(BigInt(a),o.decimals),type:"approve"}),r=(o,a,c)=>({in:{icon:a.logos[0],symbol:a.symbol},out:{icon:c.logos[0]||t?.iconToken||t?.iconDeal||void 0,symbol:c.symbol},amount:void 0,type:o}),i=[];return e.steps.forEach(o=>{if(o.kind==="approve"&&o.token){let a=n(o.token,o.amount);i.push(a);}o.kind==="enso"&&o.substeps&&o.substeps.forEach(a=>{let c=a.from[0],s=a.to[0],u=r(a.kind,c,s);i.push(u);});}),i}function Ut(){let{data:e,error:t,isLoading:n}=ve();return {fetchedRoute:e??null,routeError:t,isLoadingRoute:n}}function Ht({userAddress:e,openConnectionModal:t,fetchedRoute:n,routeError:r,isLoadingRoute:i,canExecute:o,isExecuting:a,hasError:c,cancelled:s,error:u,executeCurrentTransaction:p,totalSteps:l,completedSteps:m,showingTransactionStatus:b,hasInsufficientBalance:x,className:g}){let N=!!w().user,{data:k,isLoading:A}=useGeocheck(),C=async()=>{o&&await p();};return b?null:A?jsx(Button,{disabled:true,className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Checking availability..."}):k&&!k.canInteract?jsxs(Tooltip,{children:[jsx(TooltipTrigger,{className:"w-full cursor-default space-y-2",children:jsx(Button,{disabled:true,variant:"default",className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Geo Restricted"})}),jsx(TooltipContent,{side:"top",sideOffset:6,className:"text-xs",children:"Due to geographical restrictions you can't use this vault."})]}):!e||!N?jsx(Button,{onClick:()=>t(),className:"cursor-pointer w-full border-foreground/60 border",variant:"green",border:"interactive",size:"lg",children:"Connect Wallet"}):i?jsx(Button,{disabled:true,className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Loading route..."}):r?jsx(Button,{disabled:true,variant:"default",className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Route Error"}):!n||!n.steps||n.steps.length===0?jsx(Button,{disabled:true,variant:"default",className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Enter amount to continue"}):x?jsx(Button,{disabled:true,variant:"default",className:`w-full border-foreground/60 border ${g||""}`,size:"lg",children:"Insufficient Balance"}):jsxs(Button,{variant:"green",border:"interactive",onClick:C,disabled:!o||a,size:"lg",className:"cursor-pointer w-full border border-foreground/60",children:[a&&"Executing...",c&&"Retry Transaction",s&&"Try Again",!a&&!c&&!s&&(l>1?`Confirm Transaction (${m}/${l})`:"Confirm Transaction")]})}function Jt({steps:e,currentStep:t,allCompleted:n,cancelled:r,estimatedTime:i,tokenSymbol:o,amount:a,resetQueue:c}){let[,s]=useAtom(ne),u=useSetAtom(te),p=e.filter(x=>x.completed&&x.txHash).pop(),l=t?.txHash?t:null,m=n?p?.txHash:l?.txHash||p?.txHash,b=useMemo(()=>({title:r?"Transaction Cancelled":n?"Transaction Completed!":"Processing Transaction",description:r?"Transaction was cancelled by user":n?"Your deposit has been successfully processed.":"Please wait while your transaction is being confirmed...",txHash:m,explorerUrl:"https://etherscan.io",estimatedTime:void 0,amount:`${a?formatNumber(a,5,false,false):"0"}`,token:o,protocol:"Turtle Protocol",completed:n,cancelled:r,onViewDetails:void 0,onClose:()=>{c(),u(""),s(0);},steps:e.map(x=>({label:x.label,completed:x.completed,current:x.current,txHash:x.txHash}))}),[e,t,n,r,i,o,a,c]);return jsx("div",{className:"h-full overflow-hidden",children:jsx(TxStatus,{...b,className:"h-full bg-background border-border text-foreground"})})}function Xt({amountToDeposit:e,depositSymbol:t,amountToReceive:n,receiveSymbol:r,receiveDecimals:i,tokenPrice:o,defaultOpen:a=false}){let[c,s]=useAtom(Ze),u=useMemo(()=>{let p=e?formatNumber(e,6,false,false):"0",l=n?formatToken(n,{decimals:i},true,false):"0";return {deposit:e?`${p} ${t||"ETH"}`:"0 ETH",receive:n?`${l} ${r||"ETH"}`:"0 ETH",equivalentInUsd:e&&o?(parseFloat(e)*o).toFixed(2):"0.00",defaultOpen:a,slippage:c,setSlippage:s}},[e,t,n,r,o,a]);return jsx(SwapDetails,{details:u})}function Oo(e){return e?`${e.slice(0,10)}...${e.slice(-4)}`:"Connect Wallet"}function Gt({userAddress:e,disconnect:t}){let[n,r]=useState(false);return jsxs("button",{type:"button",onClick:()=>t(),onMouseEnter:()=>{r(true);},onMouseLeave:()=>{r(false);},className:"relative rounded-full bg-background px-3 py-1.5 border border-muted-foreground/60 cursor-pointer transition-colors hover:border-primary min-w-[140px] h-9 overflow-hidden",children:[jsxs("div",{className:"flex items-center gap-2 transition-opacity duration-150",style:{opacity:n?0:1},children:[jsx(Wallet2Icon,{className:"w-4 h-4"}),jsx("span",{className:"text-foreground font-medium text-xs",children:Oo(e)})]}),jsx("div",{className:"absolute inset-0 flex items-center justify-center gap-2 transition-opacity duration-150",style:{opacity:n?1:0},children:jsx("span",{className:"text-primary font-medium text-xs",children:"Log out"})})]})}function Kt({selectedChainId:e=1,onChainChange:t}){let{supportedChains:n,isLoading:r}=F(),i=useMemo(()=>{let o=n.find(a=>a.chainId===e);if(o)return o;if(e){let a=getChainById(e),c=chainLogo(e);if(a)return {value:a.name.toLowerCase().replace(/\s+/g,"-"),symbol:a.nativeCurrency.symbol,name:a.name,icon:c,chainId:e}}return n[0]},[e,n]);return r?jsxs("div",{className:"flex items-center justify-between rounded-full rounded-l-none bg-background py-2 pr-4 h-9 animate-pulse",children:[jsx("div",{className:"w-8 h-8 -translate-x-2.5",children:jsx("div",{className:"w-8 h-8 rounded-full bg-muted"})}),jsx("div",{className:"flex items-center gap-3",children:jsx("div",{className:"h-4 w-20 bg-muted rounded"})})]}):!i||n.length===0?null:jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{className:"border border-muted-foreground/60",src:i.icon,children:i.name}),jsx(DropdownMenuContent,{children:n.map(o=>jsxs(DropdownMenuItem,{onClick:()=>t?.(o.chainId),className:"hover:bg-accent/70 hover:text-foreground",children:[jsx("img",{src:o.icon,alt:o.name,className:"size-6 rounded-full -ml-1 text-foreground"}),o.name]},o.value))})]})}function Be(){let e=w(),t=e.user,n=!!e.user,r=e.network,i=async o=>{try{await e.changeNetwork(o);}catch(a){console.error("Failed to change network:",a);}};return jsxs("div",{className:"flex w-full items-center justify-between gap-2 text-foreground",children:[n&&t&&jsx(Gt,{userAddress:t,disconnect:e.disconnect}),n&&jsx(Kt,{selectedChainId:r,onChainChange:i})]})}function Qt(){return jsxs("div",{className:"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden",children:[jsx("div",{className:"flex-shrink-0",children:jsxs("div",{className:"flex w-full items-center justify-between gap-2",children:[jsx("div",{className:"rounded-full bg-secondary px-3 py-1.5 border border-border min-w-[140px] h-9",children:jsx("div",{className:"animate-pulse",children:jsx("div",{className:"h-4 w-24 bg-muted rounded"})})}),jsxs("div",{className:"flex items-center justify-between rounded-full rounded-l-none bg-card py-2 pr-4 h-9 animate-pulse",children:[jsx("div",{className:"w-8 h-8 -translate-x-2.5",children:jsx("div",{className:"w-8 h-8 rounded-full bg-muted"})}),jsx("div",{className:"flex items-center gap-3",children:jsx("div",{className:"h-4 w-20 bg-muted rounded"})})]})]})}),jsxs("div",{className:"flex-shrink-0 space-y-2",children:[jsxs("div",{className:"rounded-lg bg-secondary p-4 space-y-3 animate-pulse",children:[jsxs("div",{className:"flex justify-between items-center",children:[jsx("div",{className:"h-8 w-32 bg-muted rounded"}),jsxs("div",{className:"flex items-center gap-2",children:[jsx("div",{className:"w-8 h-8 rounded-full bg-muted"}),jsx("div",{className:"h-6 w-16 bg-muted rounded"})]})]}),jsxs("div",{className:"flex justify-between text-sm",children:[jsx("div",{className:"h-4 w-24 bg-muted rounded"}),jsx("div",{className:"h-4 w-20 bg-muted rounded"})]})]}),jsxs("div",{className:"p-6 border border-border rounded-lg space-y-4 animate-pulse",children:[jsxs("div",{className:"flex items-center gap-3",children:[jsx("div",{className:"w-10 h-10 rounded-full bg-muted"}),jsxs("div",{className:"space-y-2",children:[jsx("div",{className:"h-5 w-32 bg-muted rounded"}),jsx("div",{className:"h-4 w-24 bg-muted rounded"})]})]}),jsxs("div",{className:"space-y-2",children:[jsxs("div",{className:"flex justify-between",children:[jsx("div",{className:"h-4 w-16 bg-muted rounded"}),jsx("div",{className:"h-4 w-20 bg-muted rounded"})]}),jsxs("div",{className:"flex justify-between",children:[jsx("div",{className:"h-4 w-16 bg-muted rounded"}),jsx("div",{className:"h-4 w-24 bg-muted rounded"})]})]}),jsx("div",{className:"pt-2",children:jsx("div",{className:"h-10 w-full bg-muted rounded-lg"})})]})]}),jsx("div",{className:"flex-1 min-h-0"}),jsx("div",{className:"sticky bottom-0 pb-2 w-full",children:jsx("div",{className:"h-12 w-full bg-muted rounded-lg animate-pulse"})})]})}function qt(){let e=useAtomValue(ue),t=useAtomValue(te),n=useAtomValue(L),r=useSetAtom(ie),i=w(),{sendTransaction:o,openConnectionModal:a,user:c}=i,{isLoading:s,balancesLoading:u}=F(),{fetchedRoute:p,routeError:l,isLoadingRoute:m}=Ut(),{routeDetails:b}=ve(),{steps:x,currentStep:g,canExecute:f,isExecuting:N,allCompleted:k,hasError:A,cancelled:C,error:y,executeCurrentTransaction:P,resetQueue:S,totalSteps:d,completedSteps:h}=_t({earnRoute:p,userAddress:c,sendTransaction:o}),T=useMemo(()=>N||k||C||x.length>0&&h>0,[N,k,C,x.length,h]),I=!!i.user,D=e?parseFloat(formatToken(e.balance,e)):0,K=useMemo(()=>(parseFloat(t)||0)>D&&I,[t,e,I]),W=useMemo(()=>t&&parseFloat(t)>0,[t]),en=useMemo(()=>({name:n?.opportunityItem.name??"N/A",vaultSymbol:n?.tokenDetails?.tokenSymbol??"N/A",icon:n?.opportunityItem.icon??"N/A",totalApr:n?.opportunityItem.apr??"N/A",aprBreakdown:n?.opportunityItem.aprBreakdown.map(q=>({name:q.name,iconUrl:q.iconUrl,apr:q.apr?.toString()??"0",description:q.description,boost:q.boost}))??[],tvlUsd:n?.opportunityItem.tvl??"N/A",depositDetails:{symbol:e?.symbol??"N/A",price:e?.price??0,depositAmount:parseFloat(t||"0")??0,apr:parseFloat(n?.opportunityItem.apr??"0")/100},type:"Turtle Campaign"}),[n,t,e]);return s||u?jsx(Qt,{}):jsxs("div",{className:"w-full flex flex-col gap-4 flex-1 min-h-0 h-full overflow-hidden",children:[jsx("div",{className:"flex-shrink-0",children:jsx(Be,{})}),jsxs("div",{className:"flex-shrink-0 space-y-2",children:[jsx(Ft,{}),jsx(OpportunitySection,{className:"p-6",value:en,opportunitySelector:"old",onOpportunityClick:()=>r(),hideDisclaimer:true})]}),jsxs("div",{className:"flex-1 min-h-0 overflow-y-auto",children:[W&&p&&!m&&jsxs("div",{className:"flex-shrink-0 space-y-2",children:[jsx(Xt,{amountToDeposit:t,depositSymbol:e?.symbol||"",amountToReceive:p?.outputAmount||"0",receiveSymbol:n?.tokenDetails?.tokenSymbol||"",receiveDecimals:n?.tokenDetails?.tokenDecimals||0,tokenPrice:e?.price||0,defaultOpen:true}),b&&b.length>0&&jsx(RouteDetails,{value:{steps:b}})]}),T&&jsx(Jt,{steps:x,currentStep:g,allCompleted:k,cancelled:C,estimatedTime:p?.estimatedTime||0,tokenSymbol:e?.symbol||"",amount:t,resetQueue:S})]}),jsx("div",{className:"sticky bottom-0 pb-2 w-full",children:jsx(Ht,{userAddress:c||"",openConnectionModal:a,fetchedRoute:p,routeError:l,isLoadingRoute:m,canExecute:f&&!K,isExecuting:N,hasError:A,cancelled:C,error:y,executeCurrentTransaction:P,totalSteps:d,completedSteps:h,showingTransactionStatus:T,hasInsufficientBalance:K,className:"w-full"})})]})}function qo({config:e}){vt();let{isAuthenticated:t}=Tt(),[n,r]=useState("earn"),i=useMemo(()=>[...t?[{value:"positions",label:"Your Positions"}]:[],{value:"earn",label:"Earn"},{value:"discover",label:"Discover"}],[t]),o=useAtomValue(j),a=useSetAtom(j),{light:c,dark:s,fallback:u}=Ct(),{showNavigation:p}=H();return jsx(ze,{config:e,children:jsx(ut,{children:jsx("div",{className:"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden",children:jsxs(Fragment,{children:[p&&jsx(SegmentControl,{cursorPointer:true,variant:"segment",value:n,onChange:l=>{r(l),a("none");},items:i,className:"!bg-background"}),jsx("div",{className:"flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent",children:o!=="none"?jsxs(ge,{variant:"border",className:"w-full h-full min-h-0 flex flex-col overflow-hidden",children:[o==="deals"&&jsx(ft,{onSwitchToEarn:()=>r("earn")}),o==="assets"&&jsx(kt,{})]}):jsx(Fragment,{children:jsxs(ge,{variant:"border",className:"flex-1 min-h-0 w-full flex flex-col overflow-hidden",children:[jsx("div",{className:"flex-shrink-0 py-2",children:jsx(Re,{light:c,dark:s,fallback:u,size:"xs"})}),jsxs("div",{className:"flex-1 min-h-0 overflow-hidden",children:[n==="positions"&&jsx(It,{}),n==="earn"&&jsx(qt,{}),n==="discover"&&jsx(wt,{})]})]})})})]})})})})}function Zo({adapter:e,config:t,distributorId:n}){return jsx(Ne,{adapter:e,distributorId:n,children:jsx(qo,{config:t})})}
2
- export{Ne as AdapterProvider,Zo as EarnWidget,Ae as defaultWidgetStyleConfig,w as useAdapter,mn as useNetworkMethods,dn as useTransactionMethods,Y as useWalletConnection};//# sourceMappingURL=index.js.map
1
+ import {clsx}from'clsx';import {createContext,useMemo,useRef,useEffect,useCallback,useContext,useState,useReducer}from'react';import {jsx,jsxs,Fragment}from'react/jsx-runtime';import {Card,cn,BaseSelector,iconUrlToImg,OpportunityRateEstimator,Button,AssetList,Skeleton,TurtleTooltip,SwapInput,SwapDetails,RouteDetails,DataTable,APIStatus,DropdownMenu,DropdownMenuTrigger,DropdownMenuContent,DropdownMenuItem,TxStatus}from'@turtleclub/ui';import {cva}from'class-variance-authority';import {useCheckMembership,useCreateMembershipAgreement,useCreateMembership,useMultiChainBalances,useWidgetOpportunities,useTokenBalance,useEarnRoute}from'@turtleclub/hooks';import {atom,useAtom,useAtomValue}from'jotai';import {InfoIcon,ChevronLeft,Wallet2Icon,LogOutIcon}from'lucide-react';import {formatNumber,formatToken,formatCurrency,getNetworkByChainId,formatCurrencyWithCommas,getNetworkById,getNetworkBackgroundColor}from'@turtleclub/utils';import {parseUnits}from'viem';import {mainnet}from'viem/chains';function q(...e){return clsx(e)}var Pe=createContext(null);function De({config:e,children:t}){return jsx(Pe.Provider,{value:e,children:t})}function M(){let e=useContext(Pe);if(!e)throw new Error("useWidgetConfig must be used within WidgetConfigProvider");return e}function X(e){return `rgb(from ${e} calc(255 - r) calc(255 - g) calc(255 - b))`}function Gt(e,t=10){return `color-mix(in srgb, ${e} ${100-t}%, black)`}function _e(e,t){let r=t==="dark",o={"--color-brand-black":r?e.background_dark:X(e.background_dark),"--color-brand-white":r?e.foreground_dark:X(e.foreground_dark),"--color-brand-green":r?e.primary_dark:Gt(e.primary_dark)};return (e.card!==void 0||e.card_dark!==void 0)&&(o["--color-surface-primary"]=r?e.card_dark??e.card??e.background_dark:X(e.card_dark??e.background_dark)),(e.muted_foreground!==void 0||e.muted_foreground_dark!==void 0)&&(o["--muted-foreground"]=r?e.muted_foreground_dark??e.muted_foreground??e.foreground_dark:X(e.muted_foreground_dark??e.muted_foreground_dark??e.foreground_dark)),o}var Le={background:"#F9F9F9",background_dark:"#141514",foreground:"#141514",foreground_dark:"#F9F9F9",primary:"#73F36C",primary_dark:"#73F36C",card:"#F9F9F9",card_dark:"#141514",muted_foreground:"#14151480",muted_foreground_dark:"#FFFFFF80"},Fe="dark",Me="Montserrat, sans-serif",Ue="DM Sans, sans-serif";function A(){let e=M(),t=e?.theme??Fe,r=e?.fontFamily??Me,o=e?.fontSecondary??Ue,n=e?.widgetWidth??"default",i=e?.customWidth??"100%",u=e?.showNavigation??true,s=e?.padding??"default",a=e?.rounding??"default",l=e?.styles??Le,c=_e(l,t==="auto"?"dark":t);return {theme:t,coreTokenCSS:c,fontPrimary:r,fontSecondary:o,widgetWidth:n,customWidth:i,showNavigation:u,padding:s,rounding:a,config:e,widgetStyles:l}}var Be={xxs:"h-4 text-xs",xs:"h-6 text-sm",sm:"h-8 text-2xl",md:"h-12 text-4xl",lg:"h-16 text-6xl"};function Qe({light:e,dark:t,fallback:r="Turtle Club",className:o,size:n="lg"}){let[i,u]=useState(false),{theme:s}=A(),l=s==="dark"?t||e:e||t;return l&&!i?jsx("div",{className:cn("flex justify-center items-center",o),children:jsx("img",{src:l,alt:r,className:cn("object-contain",Be[n]),onError:()=>u(true),onLoad:()=>u(false)})}):jsx("div",{className:cn("flex justify-center items-center",o),children:jsx("span",{className:cn("font-bold text-primary",Be[n]),children:r})})}function ze(){let e=M();return {light:e?.logo?.light,dark:e?.logo?.dark,fallback:e?.logo?.fallback||"Turtle Club"}}var Kt=cva("p-0",{variants:{padding:{none:"p-0",sm:"p-3",default:"p-4",md:"p-6",lg:"p-7"}},defaultVariants:{padding:"default"}});function ue({children:e,className:t,variant:r,padding:o,rounding:n,showLogo:i=true,logoSize:u="xs",...s}){let{padding:a}=A(),{light:l,dark:m,fallback:c}=ze(),d=Kt({padding:o??a});return jsxs(Card,{className:q(t,d),...s,variant:r,gradient:"white",children:[i&&jsx("div",{className:"flex-shrink-0 py-2",children:jsx(Qe,{light:l,dark:m,fallback:c,size:u})}),e]})}var Ve=createContext(null),Ge=createContext(""),Xe=({adapter:e,distributorId:t,children:r})=>jsx(Ve.Provider,{value:e,children:jsx(Ge.Provider,{value:t,children:r})}),W=()=>{let e=useContext(Ve);if(!e)throw new Error("useAdapter must be used within an AdapterProvider");return e},U=()=>useContext(Ge);function Ze({children:e}){let t=M(),{theme:r,coreTokenCSS:o,fontPrimary:n,fontSecondary:i,widgetWidth:u}=A();return jsx("div",{className:q("turtle-widget-root text-foreground","antialiased transition-all duration-700 ease-linear w-full overflow-hidden","h-full flex items-center justify-center",r==="dark"?"dark":""),style:{...o,"--font-primary":n,"--font-secondary":i,fontFamily:n,backgroundColor:"transparent",maxHeight:"90vh"},children:jsx("div",{className:q("flex flex-col gap-2 h-full overflow-hidden",u==="full"?"w-full items-center":u==="custom"?"items-stretch":"items-center"),style:{...u==="custom"&&t.customWidth?{width:t.customWidth}:u==="default"?{width:"620px"}:{}},children:jsx("div",{className:"w-full max-w-md h-full flex flex-col gap-2 overflow-hidden",children:e})})})}var R=()=>{let e=W(),t=useRef(void 0),r=useRef(false),{data:o,isLoading:n,refetch:i}=useCheckMembership({params:{address:e.user||"",walletEcosystem:"evm"},enabled:!!e.user}),{mutateAsync:u,isPending:s,error:a}=useCreateMembershipAgreement(),{mutateAsync:l,isPending:m,error:c}=useCreateMembership();useEffect(()=>{let k=e.user;if(!k){t.current!==void 0&&(t.current=void 0);return}k!==t.current&&(t.current=k,d(k));},[e.user]);let d=async k=>{if(!r.current){r.current=true;try{let{data:w}=await i();if(w?.isMember){console.log("[useWidgetAuth] User is already a member");return}console.log("[useWidgetAuth] User is not a member, starting membership flow..."),console.log("[useWidgetAuth] Creating membership agreement...");let S=await u({address:k,walletEcosystem:"evm",url:window.location.href,chainId:String(e.network||1)});console.log("[useWidgetAuth] Requesting signature from wallet...");let H=await e.signMessage(S.message);console.log("[useWidgetAuth] Creating membership with signature...");let E=await l({address:k,walletEcosystem:"evm",signature:H,nonce:S.nonce});E.isMember?console.log("[useWidgetAuth] Membership created successfully!"):console.error("[useWidgetAuth] Failed to create membership:",E.error);}catch(w){console.error("[useWidgetAuth] Membership flow error:",w);}finally{r.current=false;}}},p=n||s||m,b=a?.message||c?.message||null;return {address:e.user,isConnected:!!e.user,isMember:o?.isMember,currentChain:e.network,connect:e.openConnectionModal,disconnect:e.disconnect,changeNetwork:e.changeNetwork,isLoading:p,error:b}};function Ke(e){let[t,r]=useState(e),o=useCallback(n=>{r(n);},[]);return {currentTab:t,setTab:o}}var ur=atom({id:"none"});function y(){let[e,t]=useAtom(ur),r=useCallback((n,i)=>{t({id:n,data:i});},[t]),o=useCallback(()=>{t({id:"none"});},[t]);return {currentOverlay:e.id,overlayData:e.data,isOverlayOpen:e.id!=="none",openOverlay:r,closeOverlay:o}}function de({tabs:e,overlays:t,defaultTab:r}){let {showNavigation:o}=A(),{currentTab:n}=Ke(r),{currentOverlay:u,overlayData:s}=y();useMemo(()=>Object.entries(e).filter(([p,b])=>b.visible!==false).map(([p,b])=>({value:p,label:b.label})),[e]);let m=useMemo(()=>e[n].component,[n,e]),c=useMemo(()=>u==="none"?null:t[u].component,[u,t]);return jsxs(Fragment,{children:[o&&false,jsx("div",{className:"flex-1 min-h-0 overflow-hidden flex flex-col gap-2 bg-transparent",children:jsx(ue,{variant:"border",className:"flex-1 min-h-0 w-full flex flex-col overflow-hidden",children:jsx("div",{className:"flex-1 min-h-0 overflow-hidden",children:c?jsx(c,{data:s}):jsx(m,{})})})})]})}function Y({onBack:e,children:t,className:r}){let{closeOverlay:o}=y();return jsxs("div",{className:`flex flex-col h-full ${r||""}`,children:[jsx("div",{className:"flex items-center gap-2 pb-3",children:jsx(Button,{variant:"green",border:"interactive",size:"icon",onClick:e??o,className:"h-8 w-8 shrink-0","aria-label":"Go back",children:jsx(ChevronLeft,{className:"h-5 w-5"})})}),jsx("div",{className:"flex-1 min-h-0 overflow-auto pt-4",children:t})]})}var J=e=>e.filter(t=>t.rewardType!=="points").reduce((t,r)=>t+(r.yield??0),0),et=e=>({totalYield:useMemo(()=>J(e),[e])});function ee({incentives:e,isPill:t,className:r}){let{totalYield:o}=et(e),n=useMemo(()=>e.filter(i=>i.rewardType!=="points"&&i.yield!==null&&i.yield!==void 0).sort((i,u)=>u.yield-i.yield),[e]);return jsx(TurtleTooltip,{trigger:jsxs("div",{className:cn("group flex items-center gap-1",r,t&&"hover:bg-neutral-alpha-5 border-border bg-neutral-alpha-2 hover:border-gradient-white rounded-full border px-3 py-1.5 text-xs"),children:[formatNumber(o,1,false,false),"%"," ",jsx(InfoIcon,{className:"text-primary/70 group-hover:text-primary size-2.5"})]}),content:jsxs("div",{children:[jsx("div",{className:"text-sm",children:"APR Breakdown"}),jsx("div",{children:n.map(i=>jsxs("div",{className:"my-1 flex justify-between gap-2 text-xs",children:[jsxs("div",{className:"flex items-center gap-1",children:[i.iconUrl&&jsx("img",{src:i.iconUrl,alt:i.name||i.id,className:"size-4 rounded-full",loading:"lazy"}),jsx("div",{children:i.name})]}),jsxs("div",{children:[formatNumber(i.yield,1,false,false),"%"]})]},i.id))}),jsxs("div",{className:"text-primary flex justify-between gap-2 text-sm",children:[jsx("span",{children:"Total"}),jsxs("span",{children:[formatNumber(o,1,false,false),"%"]})]})]}),side:"bottom",contentClassName:"p-5 backdrop-blur-xl"})}function rt({chain:e,triggerClassName:t}){let r=getNetworkById(e.slug);return jsx("div",{className:cn("bg-foreground -mr-1 flex size-5 items-center justify-center overflow-hidden rounded-full ring-1 ring-white last:mr-0 lg:-mr-4 lg:size-6",getNetworkBackgroundColor(r),t),children:jsx("img",{src:e.logoUrl,className:"size-5 rounded-full object-contain lg:size-6",alt:e.name})})}var pe=atom(null),fe=atom(null),ge=atom(.001),be=atom(null),nt=atom(e=>{let t=e(pe),r=e(be),o=e(fe),n=e(ge),i=!!(o&&Number.parseFloat(o)>0),u=!!t&&!!r&&i&&!!n,s=u?{chain:Number(t?.receiptToken?.chain.chainId)??1,token_in:r?.address??"",token_out:t?.receiptToken?.address??"",amount:parseUnits(o??"0",r?.decimals??18).toString(),slippage:n}:void 0;return {opportunity:t,token:r,amount:o,options:s,isValid:u}});function C(){let[e,t]=useAtom(pe),[r,o]=useAtom(be),[n,i]=useAtom(fe),[u,s]=useAtom(ge),a=useAtomValue(nt),l=useCallback(()=>{t(null),o(null),i(null),s(.001);},[t,o,i]);return useEffect(()=>{i(""),s(.001);},[r]),{opportunity:e,token:r,amount:n,slippage:u,isValid:a.isValid,options:a.options,selectOpportunity:t,selectToken:o,setAmount:i,setSlippage:s,reset:l}}function re({opportunities:e}){let{changeNetwork:t,network:r}=W(),{selectOpportunity:o,selectToken:n}=C(),{closeOverlay:i}=y();return jsx(DataTable,{columns:[{accessorKey:"name",header:()=>jsx("div",{children:"Opportunity"}),cell:({row:a})=>jsxs("div",{className:"flex items-center gap-2 px-1",children:[jsx(APIStatus,{warning:false}),jsx("img",{src:a.original.token.logoUrl,className:"size-6 rounded-full",loading:"lazy"}),a.original.name||a.original.token.name]}),enableSorting:true},{accessorKey:"chain",header:()=>jsx("div",{className:"flex w-full justify-end",children:"Chain"}),cell:({row:a})=>jsx(rt,{chain:a.original.token.chain})},{id:"organization",accessorFn:a=>a.products.length?a.products[0].organization.name:"-",header:()=>jsx("div",{children:"Partner"}),cell:({row:a})=>a.original.products.length?jsxs("div",{className:"flex items-center gap-2",children:[jsx("img",{src:a.original.products[0].organization.iconUrl||"",className:"size-6 rounded-full",loading:"lazy"}),a.original.products[0].organization.name]}):"-",enableSorting:true},{accessorKey:"tvl",header:()=>jsx("div",{className:"flex w-full justify-end",children:"TVL"}),cell:({row:a})=>jsx("div",{className:"text-end",children:formatCurrency(a.original.tvl,0,true)}),enableSorting:true},{accessorKey:"totalYield",header:()=>jsx("div",{className:"flex w-full justify-end",children:"Estimated APR"}),cell:({row:a})=>jsx("div",{className:"flex flex-row-reverse",children:jsx(ee,{incentives:a.original.incentives})}),enableSorting:true,sortingFn:(a,l)=>{let m=J(a.original.incentives),c=J(l.original.incentives);return m-c}}],onRowClick:a=>{o(a);let l=Number(a.token.chain.chainId);l!==r&&(t(l),n(null)),i();},data:e,enableSearch:true,grid:{displayAsGrid:true,headerSlot:"name",rightSlot:"totalYield",excludeColumns:[],className:"grid-cols-1 gap-2.5"}})}function at(){let e=U(),{data:t,isLoading:r,error:o}=useWidgetOpportunities(e);return r?jsx("div",{children:"Loading..."}):o?jsxs("div",{children:["Error: ",o.message]}):t===void 0?jsx("div",{children:"No data"}):t.opportunities&&t.opportunities.length===0?jsx("div",{children:"No opportunities"}):jsx(Y,{children:jsx(re,{opportunities:t.opportunities||[]})})}var ut=()=>{let{openOverlay:e}=y();return jsx("button",{onClick:()=>{e("balances"),console.log("Positions Content Click");},children:"Positions Content Click"})};var lt=()=>jsx("div",{children:"Discover Content"});function ye({steps:e,currentStep:t,allCompleted:r,cancelled:o,tokenSymbol:n,amount:i,resetQueue:u,resetForm:s}){let a=e.filter(d=>d.status==="completed"&&d.txHash).pop(),l=t?.txHash?t:null,m=r?a?.txHash:l?.txHash||a?.txHash,c=useMemo(()=>({title:o?"Transaction Cancelled":r?"Transaction Completed!":"Processing Transaction",description:o?"Transaction was cancelled by user":r?"Your deposit has been successfully processed.":"Please wait while your transaction is being confirmed...",txHash:m,explorerUrl:"https://etherscan.io",estimatedTime:void 0,amount:`${i?formatNumber(i,5,false,false):"0"}`,token:n,protocol:"Turtle Protocol",completed:r,cancelled:o,onViewDetails:void 0,onClose:()=>{u(),s();},steps:e.map(d=>({label:d.label,completed:d.status==="completed",current:d.status==="executing",txHash:d.txHash}))}),[e,r,o,n,i,u,s,m]);return jsx("div",{className:"h-full overflow-hidden",children:jsx(TxStatus,{...c,className:"bg-background border-border text-foreground h-full"})})}function dt(e){return e.kind==="approve"&&e.token?`Approve ${e.token.symbol}`:e.kind==="enso"?"Execute Deposit":`Execute ${e.kind}`}function mt(e,t){return e.kind==="approve"&&e.token?`Allow contract to spend ${e.token.symbol}`:`Transaction step ${t+1}`}function pt(e){let t=e instanceof Error?e.message:String(e);return ["user rejected","user denied","user cancelled","cancelled by user","transaction rejected","4001"].some(o=>t.toLowerCase().includes(o.toLowerCase()))}function ft(e){if(e.steps.length<=1||e.queueStatus!=="idle")return false;let t=e.steps[e.currentIndex-1],r=e.steps[e.currentIndex];return e.currentIndex>0&&e.currentIndex<e.steps.length&&t?.status==="completed"&&r?.status==="pending"}var Br=1e3;function yt(e,t){return e.tx?{id:t,label:dt(e),description:mt(e,t),txData:e.tx,status:"pending"}:null}function Qr(e,t){switch(t.type){case "INITIALIZE_QUEUE":return {steps:t.steps,currentIndex:0,queueStatus:"idle",lastError:void 0};case "START_EXECUTION":return {...e,steps:e.steps.map((r,o)=>o===t.index?{...r,status:"executing"}:r),queueStatus:"executing",lastError:void 0};case "COMPLETE_STEP":{let r=e.steps.map((i,u)=>u===t.index?{...i,status:"completed",txHash:t.txHash}:i),o=t.index+1,n=o>=r.length;return {...e,steps:r,currentIndex:n?e.currentIndex:o,queueStatus:n?"completed":"idle"}}case "FAIL_STEP":return {...e,steps:e.steps.map((r,o)=>o===t.index?{...r,status:"failed",error:t.error}:r),queueStatus:t.isCancellation?"cancelled":"error",lastError:t.error};case "RESET_QUEUE":return {steps:t.steps,currentIndex:0,queueStatus:"idle",lastError:void 0};default:return e}}function ve({earnRoute:e,userAddress:t,chainId:r,sendTransaction:o,onError:n=()=>{},onSuccess:i=()=>{}}){let u={steps:[],currentIndex:0,queueStatus:"idle"},[s,a]=useReducer(Qr,u);useEffect(()=>{if(!e?.steps?.length){a({type:"INITIALIZE_QUEUE",steps:[]});return}let f=e.steps.map((v,g)=>yt(v,g)).filter(v=>v!==null);a({type:"INITIALIZE_QUEUE",steps:f});},[e]);let l=useCallback(async()=>{if(!t||!r||!o||s.queueStatus==="executing")return;let f=s.steps[s.currentIndex];if(!f||f.status!=="pending"&&f.status!=="failed")return;if(f.txData.from.toLowerCase()!==t.toLowerCase()){let g=new Error("Transaction 'from' address doesn't match connected wallet");a({type:"FAIL_STEP",index:s.currentIndex,error:g.message,isCancellation:false}),n&&n(g);return}a({type:"START_EXECUTION",index:s.currentIndex});try{let g=await o({...f.txData,chainId:r});a({type:"COMPLETE_STEP",index:s.currentIndex,txHash:g??""}),s.currentIndex+1>=s.steps.length&&i&&i();}catch(g){let L=g instanceof Error?g.message:"Transaction failed",$=pt(g);a({type:"FAIL_STEP",index:s.currentIndex,error:$?"Transaction cancelled by user":L,isCancellation:$}),!$&&n&&n(g instanceof Error?g:new Error(L));}},[t,r,o,s.queueStatus,s.steps,s.currentIndex,i,n]),m=useCallback(()=>{if(!e?.steps?.length)return;let f=e.steps.map((v,g)=>yt(v,g)).filter(v=>v!==null);a({type:"RESET_QUEUE",steps:f});},[e]),c=s.steps[s.currentIndex]||null,d=s.queueStatus==="executing",p=s.queueStatus==="completed",b=s.queueStatus==="error",k=s.queueStatus==="cancelled",w=s.steps.filter(f=>f.status==="completed").length,S=s.steps.length,H=S>0?w/S*100:0,E=useMemo(()=>c?!!(p||d&&c.id===0||c.id>0):false,[c,p,d]),ne=!!(t&&r&&s.steps.length>0&&s.queueStatus!=="executing"&&s.queueStatus!=="completed");return useEffect(()=>{if(ft(s)){let f=setTimeout(()=>{l();},Br);return ()=>clearTimeout(f)}},[s,l]),{steps:s.steps.map((f,v)=>({...f,completed:f.status==="completed",current:v===s.currentIndex})),currentIndex:s.currentIndex,isExecuting:d,allCompleted:p,hasError:b,cancelled:k,error:s.lastError,currentStep:c?{...c,completed:c.status==="completed",current:true}:null,canExecute:ne,executeCurrentTransaction:l,resetQueue:m,totalSteps:S,completedSteps:w,progress:H,showTxStatus:E}}var $r=(e,t,r)=>({in:{icon:t.logos[0],symbol:t.symbol},out:{icon:r.logos[0],symbol:r.symbol},amount:void 0,type:e}),qr=(e,t)=>({in:{icon:e.logos[0],symbol:e.symbol},out:null,amount:formatToken(t,{decimals:e.decimals},true,false,4),type:"approve"});function vt(e){if(!e)return [];let t=[];return e.steps.forEach(r=>{if(r.kind==="approve"&&r.token){let o=qr(r.token,r.amount);t.push(o);}r.kind==="enso"&&r.substeps&&r.substeps.forEach(o=>{let n=o.from[0],i=o.to[0],u=$r(o.kind,n,i);t.push(u);});}),t}function ht(e){return {chainId:Number(e.receiptToken?.chain.chainId)??mainnet.id,address:e.receiptToken?.address??"",symbol:e.receiptToken?.symbol??"",decimals:e.receiptToken?.decimals??18}}function xt(e,t,r,o,n){let i=useMemo(()=>{if(!(!o||!e))return {...o,user:t,distributor_id:r,referral_code:n}},[o,t,r,n]),u=useMemo(()=>!!(t&&i?.token_in&&i?.token_out&&i?.amount&&i?.chain&&i?.slippage&&i?.distributor_id),[o]),{data:s,isLoading:a,error:l}=useEarnRoute({params:i,enabled:u&&e}),m=useMemo(()=>vt(s??null),[s]);return {fetchedRoute:s??null,outputAmount:s?.amount_out??void 0,isReady:u&&s&&!a,hasRequiredParams:u,routeDetails:m,routeError:l,isLoadingRoute:a}}function xe({fetchedRoute:e,routeError:t,isLoadingRoute:r,canExecute:o,isExecuting:n,hasError:i,cancelled:u,executeCurrentTransaction:s,totalSteps:a,completedSteps:l,showingTransactionStatus:m,hasInsufficientBalance:c}){let d=useCallback(async()=>{o&&await s();},[o,s]),p=useMemo(()=>m?null:r?{text:"Loading route...",disabled:true,className:"cursor-not-allowed"}:t?{text:"Route Error",disabled:true,className:"cursor-not-allowed"}:!e||!e.steps||e.steps.length===0?{text:"Enter amount to continue",disabled:true,className:"cursor-not-allowed"}:c?{text:"Insufficient Balance",disabled:true,className:"cursor-not-allowed"}:n?{text:"Executing...",disabled:true,className:"cursor-not-allowed"}:i?{text:"Retry Transaction",disabled:!o,onClick:d,className:"cursor-pointer"}:u?{text:"Try Again",disabled:!o,onClick:d,className:"cursor-pointer"}:{text:a>1&&l!==a?`Confirm Transaction (${l}/${a})`:"Confirm Transaction",disabled:false,onClick:d,className:"cursor-pointer"},[m,r,t,e,c,n,i,u,o,a,l,d]);return p?jsx(Button,{border:"plain",onClick:()=>p.onClick?.(),disabled:p.disabled,className:p.className+" w-full",children:p.text}):null}function Et({opportunity:e,address:t,distributorId:r,executeTransaction:o,stickyButton:n=false}){let{openOverlay:i}=y(),{chainId:u,symbol:s,decimals:a}=useMemo(()=>ht(e),[e]),{setAmount:l,setSlippage:m,token:c,amount:d,slippage:p,options:b,isValid:k}=C(),{usdValue:w,hasInsufficientBalance:S,handleMaxClick:H}=useTokenBalance({token:c,amount:d??void 0,setAmount:O=>l(O??null)}),{routeDetails:E,isReady:ne,outputAmount:f,fetchedRoute:v,routeError:g,isLoadingRoute:L}=xt(k,t,r,b),$=useCallback(async O=>{let ie={from:O.from,to:O.to,data:O.data,value:BigInt(O.value),chainId:u??1};return await o(ie)},[o,u]),{steps:Qt,currentStep:Ne,canExecute:we,isExecuting:F,allCompleted:se,hasError:Oe,cancelled:ae,executeCurrentTransaction:Ae,resetQueue:We,totalSteps:Re,completedSteps:Ie,showTxStatus:zt}=ve({earnRoute:v,userAddress:t,chainId:u,sendTransaction:$}),Ht=useMemo(()=>{let O=d?formatNumber(d,6,true,false):"0",ie=f&&a?formatToken(f,{decimals:a},true,false,6):"0";return {deposit:d?`${O} ${c?.symbol||"ETH"}`:"0 ETH",receive:f&&a?`${ie} ${s||"ETH"}`:"0 ETH",equivalentInUsd:d&&c?.price?(Number.parseFloat(d)*c.price).toFixed(2):"0.00",defaultOpen:true,slippage:p,setSlippage:m}},[d,f,a,s,c,p]);return jsxs("div",{className:cn("grid gap-3 flex-1 min-h-0",n?"grid-rows-[auto_1fr_auto] pb-6":"grid-rows-[auto_1fr]"),children:[jsx(SwapInput,{tokens:[],useCustomTokenSelector:true,selectedTokenData:c,onCustomTokenSelectorClick:()=>i("balances"),value:d??void 0,onChange:l,usdValue:S?void 0:w,balance:c?formatToken(c.balance,c,true,false,5):"0",onMaxClick:H,className:cn("p-5",S?"border-destructive/50 border":"border-border border")}),jsxs("div",{className:"overflow-auto min-h-0 space-y-3",children:[ne&&E&&jsx(SwapDetails,{details:Ht}),E&&E.length>0&&jsx(RouteDetails,{value:{steps:E}}),Ne&&d&&zt&&jsx(ye,{steps:Qt,currentStep:Ne,allCompleted:se,cancelled:ae,tokenSymbol:c?.symbol||"",amount:d,resetQueue:We,resetForm:We}),!n&&(!F||se)&&jsx("div",{className:"pt-3",children:jsx(xe,{fetchedRoute:v,routeError:g,isLoadingRoute:L,canExecute:we,isExecuting:F,hasError:Oe,cancelled:ae,executeCurrentTransaction:Ae,totalSteps:Re,completedSteps:Ie,showingTransactionStatus:F,hasInsufficientBalance:S})})]}),n&&(!F||se)&&jsx("div",{className:"w-full",children:jsx(xe,{fetchedRoute:v,routeError:g,isLoadingRoute:L,canExecute:we,isExecuting:F,hasError:Oe,cancelled:ae,executeCurrentTransaction:Ae,totalSteps:Re,completedSteps:Ie,showingTransactionStatus:F,hasInsufficientBalance:S})})]})}function co(e,t){let r={address:e.token.address,name:e.token.name,symbol:e.token.symbol,decimals:e.token.decimals,balance:e.amount,price:e.token.price??void 0,chainId:e.token.chain,logo:e.token.logos?.[0]},o=getNetworkByChainId(Number(t));return {id:`${t}-${r.address}`,symbol:r.symbol,name:r.name,icon:r.logo?jsx("img",{src:r.logo,alt:r.symbol,className:"h-8 w-8 rounded-full"}):jsx("div",{className:"bg-muted flex h-8 w-8 items-center justify-center rounded-full text-xs",children:r.symbol?.charAt(0)||"?"}),balance:formatToken(r.balance,r),balanceUSD:formatCurrencyWithCommas(Number.parseFloat(formatToken(r.balance,r))*(r.price||0),2),chainId:String(t),chainName:o?.name||"Unknown",address:r.address,decimals:r.decimals}}function Te(e){let t=[];return Object.entries(e).forEach(([r,o])=>{o.forEach(n=>{t.push(co(n,r));});}),t}function ke(e,t,r){let n=e[Number(t)]?.find(i=>i.token.address===r);return n?{address:n.token.address,name:n.token.name,symbol:n.token.symbol,decimals:n.token.decimals,logo:n.token.logos?.[0],icon:jsx("img",{src:n.token.logos?.[0],alt:n.token.symbol,className:"size-4 rounded-full"}),balance:n.amount,price:n.token.price??void 0,chainId:n.token.chain}:null}function wt(){let{selectToken:e,opportunity:t}=C(),{closeOverlay:r}=y(),{user:o}=W(),{balances:n,isLoading:i,error:u}=useMultiChainBalances({chainIds:[Number(t?.receiptToken?.chain.chainId)??mainnet.id],address:o||""}),s=useCallback(l=>{let m=ke(n,l.chainId,l.address);e(m),r();},[e,r,n]),a=useMemo(()=>Te(n),[n]);return i?jsx("div",{children:"Loading..."}):u?jsxs("div",{children:["Error: ",u.message]}):jsx(Y,{children:jsx(AssetList,{assets:a,onAssetClick:s,groupByChain:true,showChainIcon:true,filterVariant:"navigation",className:"h-full",itemClassName:"!rounded-full"})})}var yo=e=>{let r=Te(e)[0];return r?ke(e,r.chainId,r.address):null};function At(){let{user:e,network:t,sendTransaction:r}=W(),o=U(),{openOverlay:n}=y(),{token:i,selectOpportunity:u,selectToken:s,opportunity:a}=C(),{balances:l,isLoading:m}=useMultiChainBalances({chainIds:[Number(a?.receiptToken?.chain.chainId)??mainnet.id],address:e}),{data:c,isLoading:d}=useWidgetOpportunities(o);useEffect(()=>{if(c&&c.opportunities&&c.opportunities.length>0&&!a){let b=c.opportunities[0];u(b);}},[c,a]),useEffect(()=>{if(!i&&Object.keys(l).length>0){let b=yo(l);b&&s(b);}},[l,i]);let p=useMemo(()=>m||d,[m,d]);return {address:e,network:t,distributorId:o,openOverlay:n,sendTransaction:r,isLoading:p}}function To(e,t=4){return e?`${e.slice(0,t+2)}...${e.slice(-t)}`:""}function Wt(){let{isMember:e,isLoading:t,address:r,isConnected:o,disconnect:n}=R();if(t)return jsx("div",{className:"h-10 w-[133px] animate-pulse rounded-full bg-neutral-alpha-10"});if(!o)return null;if(o&&e)return jsx(Button,{variant:"ghost",border:"bordered",onClick:n,className:"group min-w-[140px] transition-colors",children:jsxs("div",{className:"gap-2 flex text-md items-center justify-between",children:[jsx(Wallet2Icon,{className:"size-6 stroke-accent group-hover:hidden"}),jsx(LogOutIcon,{className:"hidden size-6 stroke-destructive group-hover:block"}),jsx("span",{className:"group-hover:hidden",children:To(r)}),jsx("span",{className:"hidden group-hover:block text-foreground",children:"Disconnect"})]})})}function It(){let e=U(),{data:t}=useWidgetOpportunities(e),r=t?.chains||[],{changeNetwork:o,currentChain:n,isConnected:i}=R(),u=useMemo(()=>r.find(a=>Number(a.chainId)===n)||r[0],[r,n]),s=async a=>{try{await o(a);}catch(l){console.error("Failed to change network:",l);}};return i?jsxs(DropdownMenu,{children:[jsx(DropdownMenuTrigger,{src:u?.logoUrl,children:u?.name}),jsx(DropdownMenuContent,{children:r.map(a=>jsxs(DropdownMenuItem,{onClick:()=>s(Number(a.chainId)),children:[jsx("img",{src:a.logoUrl,alt:a.name,className:"size-6 rounded-full"}),a.name]},a.id))})]}):null}function Ce(){return jsxs("div",{className:"flex justify-between items-center gap-2",children:[jsx(Wt,{}),jsx(It,{})]})}var _t=()=>jsx("div",{className:"mt-5 flex flex-col gap-4 h-full",children:jsxs("div",{className:"space-y-3",children:[jsxs("div",{className:"flex gap-3",children:[jsx(Skeleton,{className:"h-12 flex-1 rounded-turtle"}),jsx(Skeleton,{className:"h-12 w-48 rounded-turtle"})]}),jsxs(Card,{variant:"shadow",gradient:"white",className:"rounded-turtle space-y-2",children:[jsxs("div",{className:"flex justify-between p-4",children:[jsx(Skeleton,{className:"h-8 w-24"}),jsx(Skeleton,{className:"h-8 w-56 rounded-full"})]}),jsxs("div",{className:"mx-4 mb-4 space-y-1",children:[jsxs("div",{className:"flex justify-between",children:[jsx(Skeleton,{className:"h-4 w-16"}),jsx(Skeleton,{className:"h-4 w-40"})]}),jsxs("div",{className:"flex justify-between",children:[jsx(Skeleton,{className:"h-4 w-16"}),jsx(Skeleton,{className:"h-4 w-40"})]})]})]}),jsxs(Card,{variant:"shadow",className:"rounded-turtle p-4",children:[jsx("div",{className:"mb-4",children:jsx(Skeleton,{className:"h-20 w-full rounded-turtle"})}),jsxs("div",{className:"flex justify-between items-center mb-4",children:[jsx(Skeleton,{className:"h-10 w-40 rounded-full"}),jsx(Skeleton,{className:"h-5 w-32"})]})]}),jsx(Skeleton,{className:"h-14 w-full rounded-turtle"})]})});var Lt=()=>{let{isConnected:e,connect:t}=R(),{address:r,distributorId:o,openOverlay:n,sendTransaction:i,isLoading:u}=At(),{opportunity:s,amount:a,token:l}=C(),m=c=>c.filter(d=>d.rewardType!=="points").reduce((d,p)=>d+(p.yield??0),0);return u?jsx(_t,{}):jsxs("div",{className:"mt-5 flex flex-col gap-4 h-full",children:[jsxs("div",{className:"text-foreground space-y-3",children:[jsx(Ce,{}),jsxs(Card,{variant:"shadow",gradient:"white",className:cn("rounded-turtle space-y-2"),children:[jsxs("div",{className:"flex justify-between p-4",children:[jsx(ee,{incentives:s?.incentives||[],className:"text-xl text-primary"}),jsx(BaseSelector,{icon:iconUrlToImg(s?.receiptToken?.logoUrl||"",s?.receiptToken?.symbol||""),text:s?.name||"",onClick:()=>n("opportunities"),size:"sm"})]}),jsx(OpportunityRateEstimator,{value:{symbol:s?.baseTokens?.symbol||"",price:s?.baseTokens?.priceUsd||0,depositedAmountUsd:Number(Number(a??0)*Number(l?.price??0))||0,apr:m(s?.incentives||[])}})]})]}),s&&r&&o&&jsx(Et,{opportunity:s,address:r,distributorId:o,stickyButton:true,executeTransaction:async c=>await i(c)}),!e&&jsx("div",{className:"mt-auto sticky bottom-0",children:jsx(Button,{variant:"green",border:"interactive",size:"lg",onClick:t,className:"w-full",children:"Connect Wallet"})})]})};function Ut(){let{isMember:e}=R(),t=useMemo(()=>({positions:{label:"Your Positions",component:ut,visible:e},earn:{label:"Earn",component:Lt},discover:{label:"Discover",component:lt}}),[e]),r=useMemo(()=>({opportunities:{component:at},balances:{component:wt}}),[]);return jsx(Ze,{children:jsx(de,{tabs:t,overlays:r,defaultTab:"earn"})})}function Bt({adapter:e,config:t,distributorId:r}){return jsx(De,{config:t,children:jsx(Xe,{adapter:e,distributorId:r,children:jsx(Ut,{})})})}var Lo={theme:"dark",widgetWidth:"default",customWidth:"100%",padding:"default",rounding:"default",fontFamily:"Montserrat",fontSecondary:"DM Sans",deals:[],campaigns:[],styles:{background:"#141514",background_dark:"#F9F9F9",foreground:"#F9F9F9",foreground_dark:"#141514",card:"#141514",card_dark:"#F9F9F9",muted_foreground:"#FFFFFF80",muted_foreground_dark:"#14151480",primary:"#73F36C",primary_dark:"#73F36C"}};//! Will be deprecated when just use distributorId to fetch everything from the API
2
+ export{Bt as EarnWidget,Lo as defaultWidgetStyleConfig};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map