@kodiak-finance/orderly-react-app 2.8.16 → 2.8.17

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.mts CHANGED
@@ -98,7 +98,7 @@ declare function useOrderEntryFormErrorMsg(errors: OrderValidationResult | null)
98
98
  * SDK Version - BUMP THIS WHEN RELEASING
99
99
  * Keep in sync with root package.json version
100
100
  */
101
- declare const SDK_VERSION = "2.8.15";
101
+ declare const SDK_VERSION = "2.8.17";
102
102
  type ChangesetEntry = {
103
103
  date: string;
104
104
  title: string;
package/dist/index.d.ts CHANGED
@@ -98,7 +98,7 @@ declare function useOrderEntryFormErrorMsg(errors: OrderValidationResult | null)
98
98
  * SDK Version - BUMP THIS WHEN RELEASING
99
99
  * Keep in sync with root package.json version
100
100
  */
101
- declare const SDK_VERSION = "2.8.15";
101
+ declare const SDK_VERSION = "2.8.17";
102
102
  type ChangesetEntry = {
103
103
  date: string;
104
104
  title: string;
package/dist/index.js CHANGED
@@ -9,16 +9,16 @@ var orderlyUtils = require('@kodiak-finance/orderly-utils');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
  var locale = require('date-fns/locale');
11
11
 
12
- var M=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function Ce(r){return r==="BUY"?orderlyI18n.i18n.t("common.buy"):r==="SELL"?orderlyI18n.i18n.t("common.sell"):orderlyUtils.capitalizeString(r)}function $(r,e){let {symbol:i,side:o,quantity:a,client_order_id:d,fieldChanges:c}=r,t="total_executed_quantity"in r?r.total_executed_quantity:0,l="status"in r?r.status:r.algo_status,s=e[i],n=s("base_dp");s("quote_dp");let u=Ce(o),g=orderlyUtils.transSymbolformString(i),p="algo_type"in r&&r.algo_type===orderlyTypes.AlgoOrderRootType.POSITIONAL_TP_SL?orderlyI18n.i18n.t("tpsl.entirePosition"):n===void 0?a:orderlyUi.parseNumber(a,{dp:n}),m="",f="";switch(l){case orderlyTypes.OrderStatus.NEW:d?.startsWith("scaled_")?(m=orderlyI18n.i18n.t("orders.status.scaledSubOrderOpened.toast.title"),f=`${u} ${g} ${p}`):(m=orderlyI18n.i18n.t("orders.status.opened.toast.title"),f=`${u} ${g} ${p}`);break;case orderlyTypes.OrderStatus.FILLED:case orderlyTypes.OrderStatus.PARTIAL_FILLED:let I=n===void 0?t:orderlyUi.parseNumber(t,{dp:n});m=orderlyI18n.i18n.t("orders.status.filled.toast.title"),f=`${u} ${g} ${I} / ${p}`;break;case orderlyTypes.OrderStatus.CANCELLED:m=orderlyI18n.i18n.t("orders.status.canceled.toast.title"),f=`${u} ${g} ${p}`;break;case orderlyTypes.OrderStatus.REJECTED:m=orderlyI18n.i18n.t("orders.status.rejected.toast.title"),f=`${u} ${g} ${p}`;break;case orderlyTypes.OrderStatus.REPLACED:let{algo_type:v,activated_price:b}=r;if(v===orderlyTypes.AlgoOrderRootType.TRAILING_STOP){let E=c?.[orderlyTypes.AlgoOrderRootType.TRAILING_STOP]||{};E.is_activated&&E.extreme_price&&b?(m=orderlyI18n.i18n.t("orders.trailingStop.activated"),f=`${g} @${b}`):E.extreme_price&&(m="",f="");}else m=orderlyI18n.i18n.t("orders.status.replaced.toast.title"),f=`${o} ${g} ${t} / ${p}`;break;}return {title:m,msg:f,status:l}}var Ie="orderly_order_sound_alert",B=()=>{let r=orderlyHooks.useEventEmitter(),e=orderlyHooks.useSymbolsInfo(),i=react.useRef({}),{notification:o}=orderlyHooks.useOrderlyContext();react.useEffect(()=>{i.current=e;},[e]);let a=o?.orderFilled?.media??"",[d]=orderlyHooks.useLocalStorage(Ie,o?.orderFilled?.defaultOpen??false),[c]=orderlyHooks.useAudioPlayer(a,{autoPlay:d,volume:1}),t=orderlyHooks.useDebouncedCallback(l=>{(n=>{let{title:h,msg:u,status:g}=$(n,i.current),p=g===orderlyTypes.OrderStatus.FILLED||g===orderlyTypes.OrderStatus.PARTIAL_FILLED,m=n.algo_type||n.type;h&&u&&orderlyUi.toast.success(jsxRuntime.jsxs("div",{children:[h,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:u}),p&&c]}),{id:m});})(l);},100);react.useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t),t.cancel();}),[r,t]);};function H(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyI18n.useLocaleCode();return react.useMemo(()=>{let i={[orderlyI18n.LocaleEnum.en]:locale.enUS,[orderlyI18n.LocaleEnum.zh]:locale.zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:i[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var L=react.createContext({}),Fe=()=>react.useContext(L);var z=r=>jsxRuntime.jsx(L.Provider,{value:r,children:r.children});var Q=()=>{let r=orderlyHooks.useWS(),{t:e}=orderlyI18n.useTranslation();react.useEffect(()=>{let i=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:orderlyUtils.getTimestamp()},{onMessage(o){o.convertId&&orderlyUi.toast.success(e("transfer.convert.completed"));}});return ()=>i()},[]);};function G(r){let{storageChain:e,setStorageChain:i}=orderlyHooks.useStorageChain(),[o,a]=react.useState(),[d]=orderlyHooks.useChains(),c=orderlyHooks.useConfig("networkId"),{connectedChain:t}=orderlyHooks.useWalletConnector();return react.useEffect(()=>{if(t)a?.(typeof t.id=="number"?t.id:parseInt(t.id));else {if(o)return;let l,s=c==="mainnet"?d.mainnet?.[0]:d.testnet?.[0];typeof r=="function"?l=r(c,d):typeof r=="object"&&(l=c==="mainnet"?r?.mainnet:r?.testnet);let n=l?.id||s?.network_infos?.chain_id;if(!n)return;e?a?.(e.chainId):(i(n),a?.(n));}},[t,d,o,c,a,r]),[o,a]}var J="orderly:wallet-info";function j(){let{connectedChain:r,disconnect:e}=orderlyHooks.useWalletConnector(),[i,o]=orderlyHooks.useLocalStorage("orderly_link_device",{}),{account:a}=orderlyHooks.useAccount(),{isMobile:d}=orderlyUi.useScreen(),c=orderlyHooks.useConfig(),t=async n=>{localStorage.removeItem(J),await a.disconnect(),await e({label:n});};react.useEffect(()=>{let n=S(),h=JSON.parse(localStorage.getItem(J)??"{}");n&&h&&t(h.label);},[]);let l=async()=>{let n=S();if(!n)return;let{address:h,secretKey:u,chainId:g,chainNamespace:p}=n;if(!await a.importOrderlyKey({address:h,secretKey:u,chainNamespace:p}))return;o({chainId:g,chainNamespace:p});let f=new URL(window.location.href);f.searchParams.delete("link"),f.searchParams.set("utm_medium","qrcode");let P=decodeURIComponent(f.toString());history.replaceState(null,"",P);};react.useEffect(()=>{d&&!r&&l();},[a,r,d]);let s=async()=>{let{chainId:n,chainNamespace:h}=tr()||{};if(d&&!r&&n&&h){let u=a.keyStore.getAddress(),g=a.keyStore.getOrderlyKey(),p=a.keyStore.getAccountId(u);await a.checkOrderlyKey(u,g,p)&&c.set("chainNamespace",h);}};return react.useEffect(()=>{s();},[a,d,r]),{linkDevice:l}}function tr(){try{let r=localStorage.getItem("orderly_link_device");return r?orderlyHooks.parseJSON(r):null}catch{}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:i,k:o,i:a,n:d}=or(e)||{};if(i&&o&&a&&d)return {address:i,secretKey:o,chainId:a,chainNamespace:d}}function or(r){try{let e=JSON.parse(window.atob(r)),i=Math.floor(Date.now()/1e3),o=e.t;return !o||i>o?void 0:e}catch{}}function Z(){let{t:r}=orderlyI18n.useTranslation();orderlyHooks.useSettleSubscription({onMessage:e=>{let{status:i}=e;switch(i){case "COMPLETED":orderlyUi.toast.success(r("settle.settlement.completed"));break;case "FAILED":orderlyUi.toast.error(r("settle.settlement.failed"));break;}}});}function re(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyHooks.useEventEmitter(),{setLedgerAddress:i}=orderlyHooks.useStorageLedgerAddress();return react.useEffect(()=>{e.on("wallet:connect-error",o=>{orderlyUi.toast.error(o.message);}),e.on("wallet:sign-message-with-ledger-error",o=>{window.setTimeout(()=>{orderlyUi.modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(i(o.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(orderlyUi.toast.error(o.message),Promise.resolve()),cancelLabel:r("common.no")}).then(a=>{});});});},[e,r]),{}}function ne(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyHooks.useEventEmitter(),i=react.useRef({}),[o,a]=orderlyHooks.useSessionStorage("orderly_wallet_change_id",{});i.current=o,orderlyHooks.useWalletSubscription({onMessage:d=>{let{id:c,side:t,transStatus:l}=d,s=true;if(["DEPOSIT","WITHDRAW"].includes(t)&&["COMPLETED","FAILED"].includes(l)){let n=!!i.current[c];n||(i.current[c]=true,a(h=>({...h,[c]:true}))),s=!n;}if(l==="COMPLETED"&&s){let n=`${orderlyUtils.capitalizeString(t)} completed`;t==="DEPOSIT"?n=r("transfer.deposit.completed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.completed")),orderlyUi.toast.success(n);}else if(l==="FAILED"&&s){let n=`${orderlyUtils.capitalizeString(t)} failed`;t==="DEPOSIT"?n=r("transfer.deposit.failed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.failed")),orderlyUi.toast.error(n);}e.emit("wallet:changed",d);}});}var ce="orderly:wallet-info";var le=r=>{let{wallet:e,connect:i,connectedChain:o,disconnect:a,namespace:d}=orderlyHooks.useWalletConnector();if(typeof i!="function")throw new orderlyTypes.SDKError("Please provide a wallet connector provider");orderlyHooks.useEventEmitter();let t=react.useRef(false);orderlyHooks.useConfig("brokerId");let {account:s,state:n}=orderlyHooks.useAccount(),h=orderlyHooks.useKeyStore(),u=orderlyHooks.useConfig("networkId"),[g,{checkChainSupport:p}]=orderlyHooks.useChains(),[m,f]=react.useState(false),{track:P,setTrackUserId:I}=orderlyHooks.useTrack(),v=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),b=react.useMemo(()=>{let y=e?.chains?.[0]?.id,k=e?.chains?.[0]?.namespace;if(!(typeof y>"u"))return {id:orderlyUtils.parseChainIdToNumber(y),namespace:k}},[e]);return react.useEffect(()=>{n.status>=orderlyTypes.AccountStatusEnum.EnableTrading&&s.accountId&&I(s.accountId);},[s,n]),react.useEffect(()=>{if(!o){f(false);return}let y=p(o.id,u);orderlyTypes.ABSTRACT_CHAIN_ID_MAP.has(parseInt(o.id))&&e?.label!=="AGW"&&(y=false),f(!y);},[o,g,p,u,e]),react.useEffect(()=>{orderlyUtils.windowGuard(()=>{let y=h.getAddress(),k=JSON.parse(localStorage.getItem(ce)??"{}");o?.namespace!==orderlyTypes.ChainNamespace.solana&&y&&s.address!==y&&k.label&&i({autoSelect:{label:k.label,disableModals:true}}).then(T=>{},T=>{});});},[e,s.address]),react.useEffect(()=>{if(e===null&&n.status>orderlyTypes.AccountStatusEnum.NotConnected&&!n.validating){s.disconnect();return}if(m||!o||t.current)return;let y=S();v&&v!==s.address&&!y&&(s.setAddress(v,{provider:e?.provider,chain:{id:orderlyUtils.praseChainIdToNumber(b.id),namespace:b.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}}),P(orderlyTypes.TrackerEventName.walletConnect,{wallet:e?.label??"",network:b.namespace.toUpperCase()}),orderlyUtils.windowGuard(()=>{localStorage.setItem(ce,JSON.stringify({label:e?.label??""}));})),b?.id!==s.chainId&&s.switchChainId(b?.id);},[e,o,v,b,s.address,n,s.chainId,m]),{connectWallet:async()=>(t.current=true,i({chainId:r.currentChainId}).then(async y=>{if(Array.isArray(y)&&y.length>0&&y[0]&&y[0].accounts.length>0){let k=y[0],T=orderlyUtils.praseChainIdToNumber(k.chains[0].id);if(!p(T,u))return {wrongNetwork:true};if(!s)throw new Error("account is not initialized");n.status===orderlyTypes.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await s.disconnect());let fe=await s.setAddress(k.accounts[0].address,{provider:k.provider,chain:{id:orderlyUtils.praseChainIdToNumber(k.chains[0].id),namespace:k.chains[0].namespace.toUpperCase()},wallet:{name:k.label}});return P(orderlyTypes.TrackerEventName.walletConnect,{wallet:k.label,network:k.chains[0].namespace.toUpperCase()}),{wallet:k,status:fe,wrongNetwork:false}}return null}).finally(()=>{t.current=false;})),wrongNetwork:m}};var N=react.createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),W=()=>react.useContext(N);var ue=r=>{let[e,i]=react.useState(false),[o,a]=G(r.defaultChain);j(),orderlyHooks.useTrackingInstance();let{connectWallet:d,wrongNetwork:c}=le({currentChainId:o});ne(),Z(),Q(),re();let t=orderlyHooks.useRestrictedInfo(r.restrictedInfo),l=t.restrictedOpen,s=react.useMemo(()=>({connectWallet:d,wrongNetwork:c,currentChainId:o,setCurrentChainId:a,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:t,showAnnouncement:e,setShowAnnouncement:i,onRouteChange:r.onRouteChange,widgetConfigs:r.widgetConfigs,customAnnouncements:r.customAnnouncements}),[d,o,l,r.onChainChanged,t,a,e,c,r.onRouteChange,r.widgetConfigs,r.customAnnouncements]);return jsxRuntime.jsx(N.Provider,{value:s,children:r.children})};var Kr=()=>(B(),null),pe=r=>{let{components:e,appIcons:i,onChainChanged:o,defaultChain:a,widgetConfigs:d,...c}=r;orderlyHooks.useTrack(),M();let t=H();return jsxRuntime.jsx(z,{appIcons:i,brokerName:r.brokerName,children:jsxRuntime.jsx(orderlyUi.OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxRuntime.jsxs(orderlyHooks.OrderlyConfigProvider,{...c,children:[jsxRuntime.jsx(Kr,{}),jsxRuntime.jsx(ue,{onChainChanged:o,defaultChain:a,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,widgetConfigs:d,customAnnouncements:r.customAnnouncements,children:jsxRuntime.jsx(orderlyUi.LocaleProvider,{locale:t,children:jsxRuntime.jsx(orderlyUi.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(orderlyUi.ModalProvider,{children:r.children})})})}),jsxRuntime.jsx(orderlyUi.Toaster,{})]})})})};process.env.NODE_ENV!=="production"&&(pe.displayName="OrderlyAppProvider");var Yr=(r,e)=>{let{wrongNetwork:i,disabledConnect:o}=W(),{state:a}=orderlyHooks.useAccount();return e?.skip?r:i||o||typeof e?.accountStatus<"u"&&a.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Qr(r){let{t:e}=orderlyI18n.useTranslation(),i=(a,d,c)=>{let{value:t,min:l,max:s}=c||{};return {quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:t}),max:e("orderEntry.orderPrice.error.max",{value:t})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},tp_trigger_price:{required:e("tpsl.validate.tpTriggerPrice.error.required"),min:e("orderEntry.tpTriggerPrice.error.min",{value:t}),max:e("orderEntry.tpTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.tpTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.tpTriggerPrice.error.priceErrorMax")},sl_trigger_price:{required:e("tpsl.validate.slTriggerPrice.error.required"),min:e("orderEntry.slTriggerPrice.error.min",{value:t}),max:e("orderEntry.slTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.slTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.slTriggerPrice.error.priceErrorMax")},tp_order_price:{required:e("tpsl.validate.tpOrderPrice.error.required"),min:e("tpsl.validate.tpOrderPrice.error.min",{value:t}),max:e("tpsl.validate.tpOrderPrice.error.max",{value:t})},sl_order_price:{required:e("tpsl.validate.slOrderPrice.error.required"),min:e("tpsl.validate.slOrderPrice.error.min",{value:t}),max:e("tpsl.validate.slOrderPrice.error.max",{value:t})},total:{min:e("orderEntry.total.error.min",{value:t})},start_price:{required:e("orderEntry.startPrice.error.required"),min:e("orderEntry.startPrice.error.min",{value:t}),max:e("orderEntry.startPrice.error.max",{value:t})},end_price:{required:e("orderEntry.endPrice.error.required"),min:e("orderEntry.endPrice.error.min",{value:t}),max:e("orderEntry.endPrice.error.max",{value:t})},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:t}),max:e("orderEntry.skew.error.max",{value:t})},activated_price:{min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},callback_value:{required:e("orderEntry.callbackValue.error.required"),min:e("orderEntry.callbackValue.error.min",{value:t}),range:e("orderEntry.callbackValue.error.range",{min:l,max:s})},callback_rate:{required:e("orderEntry.callbackRate.error.required"),range:e("orderEntry.callbackRate.error.range",{min:l,max:s})}}[a]?.[d]||""};return {getErrorMsg:react.useCallback((a,d)=>{let{type:c,value:t,min:l,max:s}=r?.[a]||{};return c?i(a,c,{value:d||t,min:l,max:s}):""},[r])}}var F="2.8.15",me={"2.8.15":{date:"2025-11-19",title:"Portfolio volume chart and CSV data export",summary:"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.",highlights:["New volume chart on portfolio performance component","Fixed date range selection to properly update performance labels","Leaderboard-style period detection for custom date ranges","Default performance period now set to 30 days","CSV export for portfolio and trading data","Support for custom date range exports"],packages:["kodiak-orderly-portfolio","kodiak-orderly-i18n","kodiak-orderly-hooks","kodiak-orderly-trading","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui"],type:"feature"},"2.8.14":{date:"2025-11-17",title:"Fixed 1D broker stats date range issue",summary:"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.",highlights:["Fixed 1D broker stats to correctly fetch today's data only","Properly set start_date and end_date parameters for 1D queries","Broker stats now display accurate data for single-day periods"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.13":{date:"2025-11-13",title:"Fixed broker stats date range alignment",summary:"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.",highlights:["Broker stats now match leaderboard date picker exactly","Date range handling works consistently on any day","Currency symbols ($) added to all stats values","Removed unused brokerStats.script file for cleaner codebase"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.12":{date:"2025-11-13",title:"Updated broker stats with new endpoint",summary:"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.",highlights:["Connected to new stats endpoint for accurate data","Improved date range calculations for stats display","Fixed stats data parsing from aggregated endpoint","Better performance with optimized API calls"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.11":{date:"2025-11-12",title:"Broker stats and improved date filtering",summary:"Added broker trading stats dashboard and new 1D filter option with improved date range handling.",highlights:["View broker stats: volume, fees, revenue, and P&L","New 1D filter for quick analysis","Fixed OrderlyProvider context issues"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.10":{date:"2025-11-07",title:"Your trading metrics now display correctly on the leaderboard",summary:"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.",highlights:["Your trading volume now shows in your leaderboard row","Realized P&L displays correctly for your account","All your trading metrics are now visible and up to date","Works smoothly across both the default and custom leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.9":{date:"2025-11-07",title:"Leaderboard performance improvements",summary:"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.",highlights:["Leaderboard loads faster","Smoother sorting and filtering experience","More reliable data display","Better handling of large leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.8":{date:"2025-11-07",title:"See your points and compete on the leaderboard",summary:"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.",highlights:["View all-time points earned on the leaderboard","Sort by trading volume, P&L, or points","See your rank for each metric","Faster leaderboard loading"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.7":{date:"2025-11-05",title:"Custom leaderboard periods and broker announcements",summary:"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.",highlights:["View leaderboards for any time period you want","Brokers can display important announcements","Change leaderboard dates without app updates","Campaign-specific leaderboards with custom dates"],packages:["kodiak-orderly-react-app","kodiak-orderly-ui-scaffold","kodiak-orderly-i18n","kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.6":{date:"2025-11-04",title:"Faster app and smoother trading experience",summary:"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.",highlights:["Points display cleanly without decimals","Withdraw form works smoothly with all networks","Trading input fields handle decimals better","Price data updates instantly when you return to the app","Faster performance on slower connections"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-hooks"],type:"improvement"},"2.8.5":{date:"2025-11-03",title:"Track your trading points on the leaderboard",summary:"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.",highlights:["View your all-time points earned","See points on desktop leaderboard","Switch between Volume, P&L, and Points on mobile","Compare your points against other traders"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-scaffold"],type:"feature"},"2.8.4":{date:"2025-10-28",title:"Better mobile trading and Mac support",summary:"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.",highlights:["Mobile: Right keyboard automatically appears for entering prices","Mobile: Quick number entry for order sizes","Mac: Fixed trackpad scrolling in dropdowns","Know which trading pair you're canceling orders from","Easier stop-loss and take-profit management on mobile"],packages:["kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui-tpsl"],type:"improvement"},"2.8.3":{date:"2025-10-20",title:"More reliable orders and connections",summary:"Fixed issues with order submission and improved network stability. Your orders now process reliably.",highlights:["Orders submit without errors","Connection stays stable during network changes","Faster recovery from connection drops"],packages:["kodiak-orderly-core","kodiak-orderly-net"],type:"bugfix"}};function ge(r=F){return me[r]}function Gr(){return ge(F)}
12
+ var W=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function be(r){return r==="BUY"?orderlyI18n.i18n.t("common.buy"):r==="SELL"?orderlyI18n.i18n.t("common.sell"):orderlyUtils.capitalizeString(r)}function $(r,e){let {symbol:i,side:o,quantity:a,client_order_id:d,fieldChanges:c}=r,t="total_executed_quantity"in r?r.total_executed_quantity:0,l="status"in r?r.status:r.algo_status,s=e[i],n=s("base_dp");s("quote_dp");let u=be(o),g=orderlyUtils.transSymbolformString(i),p="algo_type"in r&&r.algo_type===orderlyTypes.AlgoOrderRootType.POSITIONAL_TP_SL?orderlyI18n.i18n.t("tpsl.entirePosition"):n===void 0?a:orderlyUi.parseNumber(a,{dp:n}),m="",f="";switch(l){case orderlyTypes.OrderStatus.NEW:d?.startsWith("scaled_")?(m=orderlyI18n.i18n.t("orders.status.scaledSubOrderOpened.toast.title"),f=`${u} ${g} ${p}`):(m=orderlyI18n.i18n.t("orders.status.opened.toast.title"),f=`${u} ${g} ${p}`);break;case orderlyTypes.OrderStatus.FILLED:case orderlyTypes.OrderStatus.PARTIAL_FILLED:let I=n===void 0?t:orderlyUi.parseNumber(t,{dp:n});m=orderlyI18n.i18n.t("orders.status.filled.toast.title"),f=`${u} ${g} ${I} / ${p}`;break;case orderlyTypes.OrderStatus.CANCELLED:m=orderlyI18n.i18n.t("orders.status.canceled.toast.title"),f=`${u} ${g} ${p}`;break;case orderlyTypes.OrderStatus.REJECTED:m=orderlyI18n.i18n.t("orders.status.rejected.toast.title"),f=`${u} ${g} ${p}`;break;case orderlyTypes.OrderStatus.REPLACED:let{algo_type:v,activated_price:C}=r;if(v===orderlyTypes.AlgoOrderRootType.TRAILING_STOP){let E=c?.[orderlyTypes.AlgoOrderRootType.TRAILING_STOP]||{};E.is_activated&&E.extreme_price&&C?(m=orderlyI18n.i18n.t("orders.trailingStop.activated"),f=`${g} @${C}`):E.extreme_price&&(m="",f="");}else m=orderlyI18n.i18n.t("orders.status.replaced.toast.title"),f=`${o} ${g} ${t} / ${p}`;break;}return {title:m,msg:f,status:l}}var Ie="orderly_order_sound_alert",B=()=>{let r=orderlyHooks.useEventEmitter(),e=orderlyHooks.useSymbolsInfo(),i=react.useRef({}),{notification:o}=orderlyHooks.useOrderlyContext();react.useEffect(()=>{i.current=e;},[e]);let a=o?.orderFilled?.media??"",[d]=orderlyHooks.useLocalStorage(Ie,o?.orderFilled?.defaultOpen??false),[c]=orderlyHooks.useAudioPlayer(a,{autoPlay:d,volume:1}),t=orderlyHooks.useDebouncedCallback(l=>{(n=>{let{title:h,msg:u,status:g}=$(n,i.current),p=g===orderlyTypes.OrderStatus.FILLED||g===orderlyTypes.OrderStatus.PARTIAL_FILLED,m=n.algo_type||n.type;h&&u&&orderlyUi.toast.success(jsxRuntime.jsxs("div",{children:[h,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:u}),p&&c]}),{id:m});})(l);},100);react.useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t),t.cancel();}),[r,t]);};function Y(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyI18n.useLocaleCode();return react.useMemo(()=>{let i={[orderlyI18n.LocaleEnum.en]:locale.enUS,[orderlyI18n.LocaleEnum.zh]:locale.zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:i[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var O=react.createContext({}),Me=()=>react.useContext(O);var H=r=>jsxRuntime.jsx(O.Provider,{value:r,children:r.children});var Q=()=>{let r=orderlyHooks.useWS(),{t:e}=orderlyI18n.useTranslation();react.useEffect(()=>{let i=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:orderlyUtils.getTimestamp()},{onMessage(o){o.convertId&&orderlyUi.toast.success(e("transfer.convert.completed"));}});return ()=>i()},[]);};function G(r){let{storageChain:e,setStorageChain:i}=orderlyHooks.useStorageChain(),[o,a]=react.useState(),[d]=orderlyHooks.useChains(),c=orderlyHooks.useConfig("networkId"),{connectedChain:t}=orderlyHooks.useWalletConnector();return react.useEffect(()=>{if(t)a?.(typeof t.id=="number"?t.id:parseInt(t.id));else {if(o)return;let l,s=c==="mainnet"?d.mainnet?.[0]:d.testnet?.[0];typeof r=="function"?l=r(c,d):typeof r=="object"&&(l=c==="mainnet"?r?.mainnet:r?.testnet);let n=l?.id||s?.network_infos?.chain_id;if(!n)return;e?a?.(e.chainId):(i(n),a?.(n));}},[t,d,o,c,a,r]),[o,a]}var J="orderly:wallet-info";function j(){let{connectedChain:r,disconnect:e}=orderlyHooks.useWalletConnector(),[i,o]=orderlyHooks.useLocalStorage("orderly_link_device",{}),{account:a}=orderlyHooks.useAccount(),d=orderlyUi.useCanLinkDevice(),c=orderlyHooks.useConfig(),t=async n=>{localStorage.removeItem(J),await a.disconnect(),await e({label:n});};react.useEffect(()=>{let n=S(),h=JSON.parse(localStorage.getItem(J)??"{}");n&&h&&t(h.label);},[]);let l=async()=>{let n=S();if(!n)return;let{address:h,secretKey:u,chainId:g,chainNamespace:p}=n;if(!await a.importOrderlyKey({address:h,secretKey:u,chainNamespace:p}))return;o({chainId:g,chainNamespace:p});let f=new URL(window.location.href);f.searchParams.delete("link"),f.searchParams.set("utm_medium","qrcode");let P=decodeURIComponent(f.toString());history.replaceState(null,"",P);};react.useEffect(()=>{d&&!r&&l();},[a,r,d]);let s=async()=>{let{chainId:n,chainNamespace:h}=tr()||{};if(d&&!r&&n&&h){let u=a.keyStore.getAddress(),g=a.keyStore.getOrderlyKey(),p=a.keyStore.getAccountId(u);await a.checkOrderlyKey(u,g,p)&&c.set("chainNamespace",h);}};return react.useEffect(()=>{s();},[a,d,r]),{linkDevice:l}}function tr(){try{let r=localStorage.getItem("orderly_link_device");return r?orderlyHooks.parseJSON(r):null}catch{}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:i,k:o,i:a,n:d}=or(e)||{};if(i&&o&&a&&d)return {address:i,secretKey:o,chainId:a,chainNamespace:d}}function or(r){try{let e=JSON.parse(window.atob(r)),i=Math.floor(Date.now()/1e3),o=e.t;return !o||i>o?void 0:e}catch{}}function Z(){let{t:r}=orderlyI18n.useTranslation();orderlyHooks.useSettleSubscription({onMessage:e=>{let{status:i}=e;switch(i){case "COMPLETED":orderlyUi.toast.success(r("settle.settlement.completed"));break;case "FAILED":orderlyUi.toast.error(r("settle.settlement.failed"));break;}}});}function re(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyHooks.useEventEmitter(),{setLedgerAddress:i}=orderlyHooks.useStorageLedgerAddress();return react.useEffect(()=>{e.on("wallet:connect-error",o=>{orderlyUi.toast.error(o.message);}),e.on("wallet:sign-message-with-ledger-error",o=>{window.setTimeout(()=>{orderlyUi.modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(i(o.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(orderlyUi.toast.error(o.message),Promise.resolve()),cancelLabel:r("common.no")}).then(a=>{});});});},[e,r]),{}}function ne(){let{t:r}=orderlyI18n.useTranslation(),e=orderlyHooks.useEventEmitter(),i=react.useRef({}),[o,a]=orderlyHooks.useSessionStorage("orderly_wallet_change_id",{});i.current=o,orderlyHooks.useWalletSubscription({onMessage:d=>{let{id:c,side:t,transStatus:l}=d,s=true;if(["DEPOSIT","WITHDRAW"].includes(t)&&["COMPLETED","FAILED"].includes(l)){let n=!!i.current[c];n||(i.current[c]=true,a(h=>({...h,[c]:true}))),s=!n;}if(l==="COMPLETED"&&s){let n=`${orderlyUtils.capitalizeString(t)} completed`;t==="DEPOSIT"?n=r("transfer.deposit.completed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.completed")),orderlyUi.toast.success(n);}else if(l==="FAILED"&&s){let n=`${orderlyUtils.capitalizeString(t)} failed`;t==="DEPOSIT"?n=r("transfer.deposit.failed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.failed")),orderlyUi.toast.error(n);}e.emit("wallet:changed",d);}});}var ce="orderly:wallet-info";var le=r=>{let{wallet:e,connect:i,connectedChain:o,disconnect:a,namespace:d}=orderlyHooks.useWalletConnector();if(typeof i!="function")throw new orderlyTypes.SDKError("Please provide a wallet connector provider");orderlyHooks.useEventEmitter();let t=react.useRef(false);orderlyHooks.useConfig("brokerId");let {account:s,state:n}=orderlyHooks.useAccount(),h=orderlyHooks.useKeyStore(),u=orderlyHooks.useConfig("networkId"),[g,{checkChainSupport:p}]=orderlyHooks.useChains(),[m,f]=react.useState(false),{track:P,setTrackUserId:I}=orderlyHooks.useTrack(),v=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),C=react.useMemo(()=>{let y=e?.chains?.[0]?.id,k=e?.chains?.[0]?.namespace;if(!(typeof y>"u"))return {id:orderlyUtils.parseChainIdToNumber(y),namespace:k}},[e]);return react.useEffect(()=>{n.status>=orderlyTypes.AccountStatusEnum.EnableTrading&&s.accountId&&I(s.accountId);},[s,n]),react.useEffect(()=>{if(!o){f(false);return}let y=p(o.id,u);orderlyTypes.ABSTRACT_CHAIN_ID_MAP.has(parseInt(o.id))&&e?.label!=="AGW"&&(y=false),f(!y);},[o,g,p,u,e]),react.useEffect(()=>{orderlyUtils.windowGuard(()=>{let y=h.getAddress(),k=JSON.parse(localStorage.getItem(ce)??"{}");o?.namespace!==orderlyTypes.ChainNamespace.solana&&y&&s.address!==y&&k.label&&i({autoSelect:{label:k.label,disableModals:true}}).then(T=>{},T=>{});});},[e,s.address]),react.useEffect(()=>{if(e===null&&n.status>orderlyTypes.AccountStatusEnum.NotConnected&&!n.validating){s.disconnect();return}if(m||!o||t.current)return;let y=S();v&&v!==s.address&&!y&&(s.setAddress(v,{provider:e?.provider,chain:{id:orderlyUtils.praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}}),P(orderlyTypes.TrackerEventName.walletConnect,{wallet:e?.label??"",network:C.namespace.toUpperCase()}),orderlyUtils.windowGuard(()=>{localStorage.setItem(ce,JSON.stringify({label:e?.label??""}));})),C?.id!==s.chainId&&s.switchChainId(C?.id);},[e,o,v,C,s.address,n,s.chainId,m]),{connectWallet:async()=>(t.current=true,i({chainId:r.currentChainId}).then(async y=>{if(Array.isArray(y)&&y.length>0&&y[0]&&y[0].accounts.length>0){let k=y[0],T=orderlyUtils.praseChainIdToNumber(k.chains[0].id);if(!p(T,u))return {wrongNetwork:true};if(!s)throw new Error("account is not initialized");n.status===orderlyTypes.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await s.disconnect());let fe=await s.setAddress(k.accounts[0].address,{provider:k.provider,chain:{id:orderlyUtils.praseChainIdToNumber(k.chains[0].id),namespace:k.chains[0].namespace.toUpperCase()},wallet:{name:k.label}});return P(orderlyTypes.TrackerEventName.walletConnect,{wallet:k.label,network:k.chains[0].namespace.toUpperCase()}),{wallet:k,status:fe,wrongNetwork:false}}return null}).finally(()=>{t.current=false;})),wrongNetwork:m}};var N=react.createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),F=()=>react.useContext(N);var ue=r=>{let[e,i]=react.useState(false),[o,a]=G(r.defaultChain);j(),orderlyHooks.useTrackingInstance();let{connectWallet:d,wrongNetwork:c}=le({currentChainId:o});ne(),Z(),Q(),re();let t=orderlyHooks.useRestrictedInfo(r.restrictedInfo),l=t.restrictedOpen,s=react.useMemo(()=>({connectWallet:d,wrongNetwork:c,currentChainId:o,setCurrentChainId:a,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:t,showAnnouncement:e,setShowAnnouncement:i,onRouteChange:r.onRouteChange,widgetConfigs:r.widgetConfigs,customAnnouncements:r.customAnnouncements}),[d,o,l,r.onChainChanged,t,a,e,c,r.onRouteChange,r.widgetConfigs,r.customAnnouncements]);return jsxRuntime.jsx(N.Provider,{value:s,children:r.children})};var Kr=()=>(B(),null),pe=r=>{let{components:e,appIcons:i,onChainChanged:o,defaultChain:a,widgetConfigs:d,...c}=r;orderlyHooks.useTrack(),W();let t=Y();return jsxRuntime.jsx(H,{appIcons:i,brokerName:r.brokerName,children:jsxRuntime.jsx(orderlyUi.OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxRuntime.jsxs(orderlyHooks.OrderlyConfigProvider,{...c,children:[jsxRuntime.jsx(Kr,{}),jsxRuntime.jsx(ue,{onChainChanged:o,defaultChain:a,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,widgetConfigs:d,customAnnouncements:r.customAnnouncements,children:jsxRuntime.jsx(orderlyUi.LocaleProvider,{locale:t,children:jsxRuntime.jsx(orderlyUi.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(orderlyUi.ModalProvider,{children:r.children})})})}),jsxRuntime.jsx(orderlyUi.Toaster,{})]})})})};process.env.NODE_ENV!=="production"&&(pe.displayName="OrderlyAppProvider");var zr=(r,e)=>{let{wrongNetwork:i,disabledConnect:o}=F(),{state:a}=orderlyHooks.useAccount();return e?.skip?r:i||o||typeof e?.accountStatus<"u"&&a.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Qr(r){let{t:e}=orderlyI18n.useTranslation(),i=(a,d,c)=>{let{value:t,min:l,max:s}=c||{};return {quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:t}),max:e("orderEntry.orderPrice.error.max",{value:t})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},tp_trigger_price:{required:e("tpsl.validate.tpTriggerPrice.error.required"),min:e("orderEntry.tpTriggerPrice.error.min",{value:t}),max:e("orderEntry.tpTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.tpTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.tpTriggerPrice.error.priceErrorMax")},sl_trigger_price:{required:e("tpsl.validate.slTriggerPrice.error.required"),min:e("orderEntry.slTriggerPrice.error.min",{value:t}),max:e("orderEntry.slTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.slTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.slTriggerPrice.error.priceErrorMax")},tp_order_price:{required:e("tpsl.validate.tpOrderPrice.error.required"),min:e("tpsl.validate.tpOrderPrice.error.min",{value:t}),max:e("tpsl.validate.tpOrderPrice.error.max",{value:t})},sl_order_price:{required:e("tpsl.validate.slOrderPrice.error.required"),min:e("tpsl.validate.slOrderPrice.error.min",{value:t}),max:e("tpsl.validate.slOrderPrice.error.max",{value:t})},total:{min:e("orderEntry.total.error.min",{value:t})},start_price:{required:e("orderEntry.startPrice.error.required"),min:e("orderEntry.startPrice.error.min",{value:t}),max:e("orderEntry.startPrice.error.max",{value:t})},end_price:{required:e("orderEntry.endPrice.error.required"),min:e("orderEntry.endPrice.error.min",{value:t}),max:e("orderEntry.endPrice.error.max",{value:t})},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:t}),max:e("orderEntry.skew.error.max",{value:t})},activated_price:{min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},callback_value:{required:e("orderEntry.callbackValue.error.required"),min:e("orderEntry.callbackValue.error.min",{value:t}),range:e("orderEntry.callbackValue.error.range",{min:l,max:s})},callback_rate:{required:e("orderEntry.callbackRate.error.required"),range:e("orderEntry.callbackRate.error.range",{min:l,max:s})}}[a]?.[d]||""};return {getErrorMsg:react.useCallback((a,d)=>{let{type:c,value:t,min:l,max:s}=r?.[a]||{};return c?i(a,c,{value:d||t,min:l,max:s}):""},[r])}}var M="2.8.17",me={"2.8.17":{date:"2025-11-29",title:"Symbol performance analysis",summary:"New symbol performance analysis feature with comprehensive per-symbol trading metrics and visualization.",highlights:["New symbol-specific performance analytics dashboard","View detailed P&L, volume, and fees for individual symbols","Symbol performance tracking with customizable date ranges","Comprehensive performance visualization per trading symbol"],packages:["kodiak-orderly-portfolio"],type:"feature"},"2.8.16":{date:"2025-11-29",title:"Fixed funded account address reversion issue",summary:"Restored isMobile guard in device linking to prevent funded accounts from reverting to wallet address. Fixes auto-sync behavior that was causing address switching issues.",highlights:["Restored isMobile guard in useLinkDevice to prevent unintended auto-sync","Fixed funded account address reverting to MetaMask","Maintains device linking functionality for mobile devices","Prevents auto-sync from being triggered on all devices"],packages:["kodiak-orderly-react-app","kodiak-orderly-portfolio","kodiak-orderly-hooks","kodiak-orderly-types","kodiak-orderly-utils"],type:"bugfix"},"2.8.15":{date:"2025-11-19",title:"Portfolio volume chart and CSV data export",summary:"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.",highlights:["New volume chart on portfolio performance component","Fixed date range selection to properly update performance labels","Leaderboard-style period detection for custom date ranges","Default performance period now set to 30 days","CSV export for portfolio and trading data","Support for custom date range exports"],packages:["kodiak-orderly-portfolio","kodiak-orderly-i18n","kodiak-orderly-hooks","kodiak-orderly-trading","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui"],type:"feature"},"2.8.14":{date:"2025-11-17",title:"Fixed 1D broker stats date range issue",summary:"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.",highlights:["Fixed 1D broker stats to correctly fetch today's data only","Properly set start_date and end_date parameters for 1D queries","Broker stats now display accurate data for single-day periods"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.13":{date:"2025-11-13",title:"Fixed broker stats date range alignment",summary:"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.",highlights:["Broker stats now match leaderboard date picker exactly","Date range handling works consistently on any day","Currency symbols ($) added to all stats values","Removed unused brokerStats.script file for cleaner codebase"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.12":{date:"2025-11-13",title:"Updated broker stats with new endpoint",summary:"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.",highlights:["Connected to new stats endpoint for accurate data","Improved date range calculations for stats display","Fixed stats data parsing from aggregated endpoint","Better performance with optimized API calls"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.11":{date:"2025-11-12",title:"Broker stats and improved date filtering",summary:"Added broker trading stats dashboard and new 1D filter option with improved date range handling.",highlights:["View broker stats: volume, fees, revenue, and P&L","New 1D filter for quick analysis","Fixed OrderlyProvider context issues"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.10":{date:"2025-11-07",title:"Your trading metrics now display correctly on the leaderboard",summary:"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.",highlights:["Your trading volume now shows in your leaderboard row","Realized P&L displays correctly for your account","All your trading metrics are now visible and up to date","Works smoothly across both the default and custom leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.9":{date:"2025-11-07",title:"Leaderboard performance improvements",summary:"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.",highlights:["Leaderboard loads faster","Smoother sorting and filtering experience","More reliable data display","Better handling of large leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.8":{date:"2025-11-07",title:"See your points and compete on the leaderboard",summary:"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.",highlights:["View all-time points earned on the leaderboard","Sort by trading volume, P&L, or points","See your rank for each metric","Faster leaderboard loading"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.7":{date:"2025-11-05",title:"Custom leaderboard periods and broker announcements",summary:"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.",highlights:["View leaderboards for any time period you want","Brokers can display important announcements","Change leaderboard dates without app updates","Campaign-specific leaderboards with custom dates"],packages:["kodiak-orderly-react-app","kodiak-orderly-ui-scaffold","kodiak-orderly-i18n","kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.6":{date:"2025-11-04",title:"Faster app and smoother trading experience",summary:"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.",highlights:["Points display cleanly without decimals","Withdraw form works smoothly with all networks","Trading input fields handle decimals better","Price data updates instantly when you return to the app","Faster performance on slower connections"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-hooks"],type:"improvement"},"2.8.5":{date:"2025-11-03",title:"Track your trading points on the leaderboard",summary:"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.",highlights:["View your all-time points earned","See points on desktop leaderboard","Switch between Volume, P&L, and Points on mobile","Compare your points against other traders"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-scaffold"],type:"feature"},"2.8.4":{date:"2025-10-28",title:"Better mobile trading and Mac support",summary:"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.",highlights:["Mobile: Right keyboard automatically appears for entering prices","Mobile: Quick number entry for order sizes","Mac: Fixed trackpad scrolling in dropdowns","Know which trading pair you're canceling orders from","Easier stop-loss and take-profit management on mobile"],packages:["kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui-tpsl"],type:"improvement"},"2.8.3":{date:"2025-10-20",title:"More reliable orders and connections",summary:"Fixed issues with order submission and improved network stability. Your orders now process reliably.",highlights:["Orders submit without errors","Connection stays stable during network changes","Faster recovery from connection drops"],packages:["kodiak-orderly-core","kodiak-orderly-net"],type:"bugfix"}};function ge(r=M){return me[r]}function Gr(){return ge(M)}
13
13
 
14
14
  exports.CHANGESETS = me;
15
15
  exports.OrderlyAppProvider = pe;
16
- exports.SDK_VERSION = F;
16
+ exports.SDK_VERSION = M;
17
17
  exports.getChangesetForVersion = ge;
18
18
  exports.getLatestChangeset = Gr;
19
- exports.useAppConfig = Fe;
20
- exports.useAppContext = W;
21
- exports.useDataTap = Yr;
19
+ exports.useAppConfig = Me;
20
+ exports.useAppContext = F;
21
+ exports.useDataTap = zr;
22
22
  exports.useOrderEntryFormErrorMsg = Qr;
23
23
  //# sourceMappingURL=out.js.map
24
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appConfigContext.tsx","../src/provider/appConfigProvider.tsx","../src/provider/appStateProvider.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/appStateContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts","../src/constants/changesets.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","useAudioPlayer","useLocalStorage","useOrderlyContext","OrderStatus","toast","i18n","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","fieldChanges","total_executed_quantity","status","getSymbolInfo","base_dp","quote_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","algo_type","activated_price","fieldChange","jsx","jsxs","ORDERLY_ORDER_SOUND_ALERT_KEY","useExecutionReport","ee","symbolsInfoRef","notification","src","soundAutoPlay","audioElement","handler","isFilled","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","AppConfigContext","useAppConfig","AppConfigProvider","props","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushed","prev","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","walletState","wallet","AppStateContext","show","useAppContext","AppStateProvider","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","ExecutionReportListener","OrderlyAppProvider","components","appIcons","onChainChanged","widgetConfigs","configProps","uiLocale","useDataTap","state","useCallback","useOrderEntryFormErrorMsg","errors","getMessage","key","type","params","value","min","max","customValue","SDK_VERSION","CHANGESETS","getChangesetForVersion","version","getLatestChangeset"],"mappings":"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DACA,oDACA,6CACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,2CACP,QACE,mGACF,WAAY,CACV,oDACA,mCACA,sCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,gEACP,QACE,4KACF,WAAY,CACV,wDACA,mDACA,0DACA,gEACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,mHACF,WAAY,CACV,2BACA,4CACA,6BACA,uCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,iDACP,QACE,gJACF,WAAY,CACV,iDACA,yCACA,gCACA,4BACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,sDACP,QACE,uKACF,WAAY,CACV,iDACA,8CACA,+CACA,kDACF,EACA,SAAU,CACR,2BACA,6BACA,sBACA,oCACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,6CACP,QACE,kJACF,WAAY,CACV,0CACA,iDACA,8CACA,0DACA,0CACF,EACA,SAAU,CACR,qCACA,6BACA,gCACA,sBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,+CACP,QACE,kIACF,WAAY,CACV,mCACA,oCACA,mDACA,2CACF,EACA,SAAU,CACR,qCACA,4BACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,wCACP,QACE,0HACF,WAAY,CACV,mEACA,6CACA,6CACA,uDACA,uDACF,EACA,SAAU,CACR,6BACA,gCACA,2BACA,8BACA,wBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,uGACF,WAAY,CACV,+BACA,iDACA,uCACF,EACA,SAAU,CAAC,sBAAuB,oBAAoB,EACtD,KAAM,QACR,CACF,EAOO,SAASC,GACdC,EAAkBH,EACU,CAC5B,OAAOC,GAAWE,CAAO,CAC3B,CAMO,SAASC,IAAiD,CAC/D,OAAOF,GAAuBF,CAAW,CAC3C","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { OrderlyThemeProviderProps } from \"@kodiak-finance/orderly-ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppConfigProvider } from \"./appConfigProvider\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appStateProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\n// Cannot be called outside of Provider because useExecutionReport requires useOrderlyContext.\nconst ExecutionReportListener: React.FC = () => {\n useExecutionReport();\n return null;\n};\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n widgetConfigs,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <ExecutionReportListener />\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n widgetConfigs={widgetConfigs}\n customAnnouncements={props.customAnnouncements}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nif (process.env.NODE_ENV !== \"production\") {\n OrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n}\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n useAudioPlayer,\n useLocalStorage,\n useOrderlyContext,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport const useExecutionReport = () => {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n const { notification } = useOrderlyContext();\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const src = notification?.orderFilled?.media ?? \"\";\n\n const [soundAutoPlay] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const [audioElement] = useAudioPlayer(src, {\n autoPlay: soundAutoPlay,\n volume: 1,\n });\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg, status } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n const isFilled =\n status === OrderStatus.FILLED || status === OrderStatus.PARTIAL_FILLED;\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n {isFilled && audioElement}\n </div>,\n { id: orderType },\n );\n }\n };\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n return () => {\n ee.off(\"orders:changed\", handler);\n handler.cancel();\n };\n }, [ee, handler]);\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderStatus, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { AlgoOrderRootType } from \"@kodiak-finance/orderly-types\";\nimport { parseNumber } from \"@kodiak-finance/orderly-ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@kodiak-finance/orderly-utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\ntype AlgoOrderFieldChanges = Partial<\n Record<OrderType, Partial<Record<keyof API.AlgoOrder, boolean>>>\n>;\n\nexport function getOrderExecutionReportMsg(\n data: (API.AlgoOrder | API.Order) & {\n fieldChanges?: AlgoOrderFieldChanges;\n },\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id, fieldChanges } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const quote_dp = getSymbolInfo(\"quote_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n const { algo_type, activated_price } = data as API.AlgoOrder;\n if (algo_type === AlgoOrderRootType.TRAILING_STOP) {\n const fieldChange =\n fieldChanges?.[AlgoOrderRootType.TRAILING_STOP] || {};\n // when trailing stop order is activated, and extreme_price will also changed\n if (\n fieldChange.is_activated &&\n fieldChange.extreme_price &&\n activated_price\n ) {\n title = i18n.t(\"orders.trailingStop.activated\");\n msg = `${displaySymbol} @${activated_price}`;\n } else if (fieldChange.extreme_price) {\n // if extreme_price is changed, skip show the message\n title = \"\";\n msg = \"\";\n }\n } else {\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n }\n\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n status,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@kodiak-finance/orderly-i18n\";\nimport { Locale } from \"@kodiak-finance/orderly-ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { createContext, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigContext = createContext({} as ThemeContextState);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { AppLogos } from \"../types\";\nimport { AppConfigContext } from \"./appConfigContext\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigProvider: FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, useState, useMemo } from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n useTrackingInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { AppContextState, AppStateContext } from \"./appStateContext\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<\n AppContextState,\n \"onChainChanged\" | \"onRouteChange\" | \"widgetConfigs\" | \"customAnnouncements\"\n>;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n widgetConfigs: props.widgetConfigs,\n customAnnouncements: props.customAnnouncements,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n props.widgetConfigs,\n props.customAnnouncements,\n ],\n );\n\n return (\n <AppStateContext.Provider value={memoizedValue}>\n {props.children}\n </AppStateContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { Chain, NetworkId } from \"@kodiak-finance/orderly-types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage,\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n // use set instead of append, because the param possibly in the url\n url.searchParams.set(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!,\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@kodiak-finance/orderly-hooks\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@kodiak-finance/orderly-hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { LedgerWalletKey } from \"@kodiak-finance/orderly-types\";\nimport { useStorageLedgerAddress } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>,\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushed = !!recordRef.current[id];\n if (!isPushed) {\n recordRef.current[id] = true;\n setRecord((prev: Record<number, boolean>) => ({\n ...prev,\n [id]: true,\n }));\n }\n showToast = !isPushed;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@kodiak-finance/orderly-types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@kodiak-finance/orderly-utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n });\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, useContext } from \"react\";\nimport { RestrictedInfoReturns } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type WidgetConfigs = {\n scanQRCode?: {\n onSuccess?: (url: string) => void;\n };\n};\n\nexport type AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n widgetConfigs?: WidgetConfigs;\n /** Custom announcements to merge with API announcements */\n customAnnouncements?: API.AnnouncementRow[];\n};\n\nexport const AppStateContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppStateContext);\n};\n","import { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"../provider/appStateContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import { useCallback } from \"react\";\nimport {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (\n key: Keys,\n type: ErrorType,\n params: {\n value?: string | number;\n min?: string | number;\n max?: string | number;\n },\n ) => {\n const { value, min, max } = params || {};\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n required: t(\"tpsl.validate.tpTriggerPrice.error.required\"),\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMax\"),\n },\n sl_trigger_price: {\n required: t(\"tpsl.validate.slTriggerPrice.error.required\"),\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMax\"),\n },\n tp_order_price: {\n required: t(\"tpsl.validate.tpOrderPrice.error.required\"),\n min: t(\"tpsl.validate.tpOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.tpOrderPrice.error.max\", { value }),\n },\n sl_order_price: {\n required: t(\"tpsl.validate.slOrderPrice.error.required\"),\n min: t(\"tpsl.validate.slOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.slOrderPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n start_price: {\n required: t(\"orderEntry.startPrice.error.required\"),\n min: t(\"orderEntry.startPrice.error.min\", { value }),\n max: t(\"orderEntry.startPrice.error.max\", { value }),\n },\n end_price: {\n required: t(\"orderEntry.endPrice.error.required\"),\n min: t(\"orderEntry.endPrice.error.min\", { value }),\n max: t(\"orderEntry.endPrice.error.max\", { value }),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n activated_price: {\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n callback_value: {\n required: t(\"orderEntry.callbackValue.error.required\"),\n min: t(\"orderEntry.callbackValue.error.min\", { value }),\n range: t(\"orderEntry.callbackValue.error.range\", {\n min,\n max,\n }),\n },\n callback_rate: {\n required: t(\"orderEntry.callbackRate.error.required\"),\n range: t(\"orderEntry.callbackRate.error.range\", {\n min,\n max,\n }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const getErrorMsg = useCallback(\n (key: Keys, customValue?: string) => {\n const { type, value, min, max } = errors?.[key] || ({} as any);\n if (type) {\n return getMessage(key, type, { value: customValue || value, min, max });\n }\n return \"\";\n },\n [errors],\n );\n\n return {\n getErrorMsg,\n };\n}\n","/**\n * SDK Version - BUMP THIS WHEN RELEASING\n * Keep in sync with root package.json version\n */\nexport const SDK_VERSION = \"2.8.15\";\n\nexport type ChangesetEntry = {\n date: string;\n title: string;\n summary: string;\n highlights: string[];\n packages: string[];\n type: \"breaking\" | \"feature\" | \"bugfix\" | \"improvement\";\n};\n\nexport type Changesets = Record<string, ChangesetEntry>;\n\n/**\n * Changesets - What's new in each version\n * ADD NEW ENTRIES WHEN BUMPING SDK_VERSION\n */\nexport const CHANGESETS: Changesets = {\n \"2.8.15\": {\n date: \"2025-11-19\",\n title: \"Portfolio volume chart and CSV data export\",\n summary:\n \"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.\",\n highlights: [\n \"New volume chart on portfolio performance component\",\n \"Fixed date range selection to properly update performance labels\",\n \"Leaderboard-style period detection for custom date ranges\",\n \"Default performance period now set to 30 days\",\n \"CSV export for portfolio and trading data\",\n \"Support for custom date range exports\",\n ],\n packages: [\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-trading\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui\",\n ],\n type: \"feature\",\n },\n \"2.8.14\": {\n date: \"2025-11-17\",\n title: \"Fixed 1D broker stats date range issue\",\n summary:\n \"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.\",\n highlights: [\n \"Fixed 1D broker stats to correctly fetch today's data only\",\n \"Properly set start_date and end_date parameters for 1D queries\",\n \"Broker stats now display accurate data for single-day periods\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.13\": {\n date: \"2025-11-13\",\n title: \"Fixed broker stats date range alignment\",\n summary:\n \"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.\",\n highlights: [\n \"Broker stats now match leaderboard date picker exactly\",\n \"Date range handling works consistently on any day\",\n \"Currency symbols ($) added to all stats values\",\n \"Removed unused brokerStats.script file for cleaner codebase\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.12\": {\n date: \"2025-11-13\",\n title: \"Updated broker stats with new endpoint\",\n summary:\n \"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.\",\n highlights: [\n \"Connected to new stats endpoint for accurate data\",\n \"Improved date range calculations for stats display\",\n \"Fixed stats data parsing from aggregated endpoint\",\n \"Better performance with optimized API calls\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.11\": {\n date: \"2025-11-12\",\n title: \"Broker stats and improved date filtering\",\n summary:\n \"Added broker trading stats dashboard and new 1D filter option with improved date range handling.\",\n highlights: [\n \"View broker stats: volume, fees, revenue, and P&L\",\n \"New 1D filter for quick analysis\",\n \"Fixed OrderlyProvider context issues\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.10\": {\n date: \"2025-11-07\",\n title: \"Your trading metrics now display correctly on the leaderboard\",\n summary:\n \"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.\",\n highlights: [\n \"Your trading volume now shows in your leaderboard row\",\n \"Realized P&L displays correctly for your account\",\n \"All your trading metrics are now visible and up to date\",\n \"Works smoothly across both the default and custom leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.9\": {\n date: \"2025-11-07\",\n title: \"Leaderboard performance improvements\",\n summary:\n \"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.\",\n highlights: [\n \"Leaderboard loads faster\",\n \"Smoother sorting and filtering experience\",\n \"More reliable data display\",\n \"Better handling of large leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.8\": {\n date: \"2025-11-07\",\n title: \"See your points and compete on the leaderboard\",\n summary:\n \"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.\",\n highlights: [\n \"View all-time points earned on the leaderboard\",\n \"Sort by trading volume, P&L, or points\",\n \"See your rank for each metric\",\n \"Faster leaderboard loading\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.7\": {\n date: \"2025-11-05\",\n title: \"Custom leaderboard periods and broker announcements\",\n summary:\n \"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.\",\n highlights: [\n \"View leaderboards for any time period you want\",\n \"Brokers can display important announcements\",\n \"Change leaderboard dates without app updates\",\n \"Campaign-specific leaderboards with custom dates\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-ui-scaffold\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-trading-leaderboard\",\n ],\n type: \"feature\",\n },\n \"2.8.6\": {\n date: \"2025-11-04\",\n title: \"Faster app and smoother trading experience\",\n summary:\n \"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.\",\n highlights: [\n \"Points display cleanly without decimals\",\n \"Withdraw form works smoothly with all networks\",\n \"Trading input fields handle decimals better\",\n \"Price data updates instantly when you return to the app\",\n \"Faster performance on slower connections\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-hooks\",\n ],\n type: \"improvement\",\n },\n \"2.8.5\": {\n date: \"2025-11-03\",\n title: \"Track your trading points on the leaderboard\",\n summary:\n \"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.\",\n highlights: [\n \"View your all-time points earned\",\n \"See points on desktop leaderboard\",\n \"Switch between Volume, P&L, and Points on mobile\",\n \"Compare your points against other traders\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-scaffold\",\n ],\n type: \"feature\",\n },\n \"2.8.4\": {\n date: \"2025-10-28\",\n title: \"Better mobile trading and Mac support\",\n summary:\n \"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.\",\n highlights: [\n \"Mobile: Right keyboard automatically appears for entering prices\",\n \"Mobile: Quick number entry for order sizes\",\n \"Mac: Fixed trackpad scrolling in dropdowns\",\n \"Know which trading pair you're canceling orders from\",\n \"Easier stop-loss and take-profit management on mobile\",\n ],\n packages: [\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui-tpsl\",\n ],\n type: \"improvement\",\n },\n \"2.8.3\": {\n date: \"2025-10-20\",\n title: \"More reliable orders and connections\",\n summary:\n \"Fixed issues with order submission and improved network stability. Your orders now process reliably.\",\n highlights: [\n \"Orders submit without errors\",\n \"Connection stays stable during network changes\",\n \"Faster recovery from connection drops\",\n ],\n packages: [\"kodiak-orderly-core\", \"kodiak-orderly-net\"],\n type: \"bugfix\",\n },\n};\n\n/**\n * Get changeset for a specific version\n * @param version - Version string (e.g., \"2.8.3\")\n * @returns ChangesetEntry or undefined if not found\n */\nexport function getChangesetForVersion(\n version: string = SDK_VERSION,\n): ChangesetEntry | undefined {\n return CHANGESETS[version];\n}\n\n/**\n * Get the latest changeset\n * @returns ChangesetEntry for current SDK_VERSION\n */\nexport function getLatestChangeset(): ChangesetEntry | undefined {\n return getChangesetForVersion(SDK_VERSION);\n}\n"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appConfigContext.tsx","../src/provider/appConfigProvider.tsx","../src/provider/appStateProvider.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/appStateContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts","../src/constants/changesets.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","useAudioPlayer","useLocalStorage","useOrderlyContext","OrderStatus","toast","i18n","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","fieldChanges","total_executed_quantity","status","getSymbolInfo","base_dp","quote_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","algo_type","activated_price","fieldChange","jsx","jsxs","ORDERLY_ORDER_SOUND_ALERT_KEY","useExecutionReport","ee","symbolsInfoRef","notification","src","soundAutoPlay","audioElement","handler","isFilled","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","AppConfigContext","useAppConfig","AppConfigProvider","props","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useCanLinkDevice","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","canLinkDevice","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushed","prev","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","walletState","wallet","AppStateContext","show","useAppContext","AppStateProvider","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","ExecutionReportListener","OrderlyAppProvider","components","appIcons","onChainChanged","widgetConfigs","configProps","uiLocale","useDataTap","state","useCallback","useOrderEntryFormErrorMsg","errors","getMessage","key","type","params","value","min","max","customValue","SDK_VERSION","CHANGESETS","getChangesetForVersion","version","getLatestChangeset"],"mappings":"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F,WAAY,CACV,6DACA,iEACA,+DACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,0CACP,QACE,0KACF,WAAY,CACV,yDACA,oDACA,iDACA,6DACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,yCACP,QACE,iJACF,WAAY,CACV,oDACA,qDACA,oDACA,6CACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,2CACP,QACE,mGACF,WAAY,CACV,oDACA,mCACA,sCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,gEACP,QACE,4KACF,WAAY,CACV,wDACA,mDACA,0DACA,gEACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,mHACF,WAAY,CACV,2BACA,4CACA,6BACA,uCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,iDACP,QACE,gJACF,WAAY,CACV,iDACA,yCACA,gCACA,4BACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,sDACP,QACE,uKACF,WAAY,CACV,iDACA,8CACA,+CACA,kDACF,EACA,SAAU,CACR,2BACA,6BACA,sBACA,oCACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,6CACP,QACE,kJACF,WAAY,CACV,0CACA,iDACA,8CACA,0DACA,0CACF,EACA,SAAU,CACR,qCACA,6BACA,gCACA,sBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,+CACP,QACE,kIACF,WAAY,CACV,mCACA,oCACA,mDACA,2CACF,EACA,SAAU,CACR,qCACA,4BACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,wCACP,QACE,0HACF,WAAY,CACV,mEACA,6CACA,6CACA,uDACA,uDACF,EACA,SAAU,CACR,6BACA,gCACA,2BACA,8BACA,wBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,uGACF,WAAY,CACV,+BACA,iDACA,uCACF,EACA,SAAU,CAAC,sBAAuB,oBAAoB,EACtD,KAAM,QACR,CACF,EAOO,SAASC,GACdC,EAAkBH,EACU,CAC5B,OAAOC,GAAWE,CAAO,CAC3B,CAMO,SAASC,IAAiD,CAC/D,OAAOF,GAAuBF,CAAW,CAC3C","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { OrderlyThemeProviderProps } from \"@kodiak-finance/orderly-ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppConfigProvider } from \"./appConfigProvider\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appStateProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\n// Cannot be called outside of Provider because useExecutionReport requires useOrderlyContext.\nconst ExecutionReportListener: React.FC = () => {\n useExecutionReport();\n return null;\n};\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n widgetConfigs,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <ExecutionReportListener />\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n widgetConfigs={widgetConfigs}\n customAnnouncements={props.customAnnouncements}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nif (process.env.NODE_ENV !== \"production\") {\n OrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n}\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n useAudioPlayer,\n useLocalStorage,\n useOrderlyContext,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport const useExecutionReport = () => {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n const { notification } = useOrderlyContext();\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const src = notification?.orderFilled?.media ?? \"\";\n\n const [soundAutoPlay] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const [audioElement] = useAudioPlayer(src, {\n autoPlay: soundAutoPlay,\n volume: 1,\n });\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg, status } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n const isFilled =\n status === OrderStatus.FILLED || status === OrderStatus.PARTIAL_FILLED;\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n {isFilled && audioElement}\n </div>,\n { id: orderType },\n );\n }\n };\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n return () => {\n ee.off(\"orders:changed\", handler);\n handler.cancel();\n };\n }, [ee, handler]);\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderStatus, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { AlgoOrderRootType } from \"@kodiak-finance/orderly-types\";\nimport { parseNumber } from \"@kodiak-finance/orderly-ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@kodiak-finance/orderly-utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\ntype AlgoOrderFieldChanges = Partial<\n Record<OrderType, Partial<Record<keyof API.AlgoOrder, boolean>>>\n>;\n\nexport function getOrderExecutionReportMsg(\n data: (API.AlgoOrder | API.Order) & {\n fieldChanges?: AlgoOrderFieldChanges;\n },\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id, fieldChanges } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const quote_dp = getSymbolInfo(\"quote_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n const { algo_type, activated_price } = data as API.AlgoOrder;\n if (algo_type === AlgoOrderRootType.TRAILING_STOP) {\n const fieldChange =\n fieldChanges?.[AlgoOrderRootType.TRAILING_STOP] || {};\n // when trailing stop order is activated, and extreme_price will also changed\n if (\n fieldChange.is_activated &&\n fieldChange.extreme_price &&\n activated_price\n ) {\n title = i18n.t(\"orders.trailingStop.activated\");\n msg = `${displaySymbol} @${activated_price}`;\n } else if (fieldChange.extreme_price) {\n // if extreme_price is changed, skip show the message\n title = \"\";\n msg = \"\";\n }\n } else {\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n }\n\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n status,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@kodiak-finance/orderly-i18n\";\nimport { Locale } from \"@kodiak-finance/orderly-ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { createContext, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigContext = createContext({} as ThemeContextState);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { AppLogos } from \"../types\";\nimport { AppConfigContext } from \"./appConfigContext\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigProvider: FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, useState, useMemo } from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n useTrackingInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { AppContextState, AppStateContext } from \"./appStateContext\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<\n AppContextState,\n \"onChainChanged\" | \"onRouteChange\" | \"widgetConfigs\" | \"customAnnouncements\"\n>;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n widgetConfigs: props.widgetConfigs,\n customAnnouncements: props.customAnnouncements,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n props.widgetConfigs,\n props.customAnnouncements,\n ],\n );\n\n return (\n <AppStateContext.Provider value={memoizedValue}>\n {props.children}\n </AppStateContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { Chain, NetworkId } from \"@kodiak-finance/orderly-types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { useCanLinkDevice } from \"@kodiak-finance/orderly-ui\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage,\n );\n\n const { account } = useAccount();\n const canLinkDevice = useCanLinkDevice();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n // use set instead of append, because the param possibly in the url\n url.searchParams.set(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (canLinkDevice && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, canLinkDevice]);\n\n const autoLinkDevice = async () => {\n // Only auto-link if device linking data exists in storage AND it's actually a linkable device\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (canLinkDevice && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!,\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, canLinkDevice, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@kodiak-finance/orderly-hooks\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@kodiak-finance/orderly-hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { LedgerWalletKey } from \"@kodiak-finance/orderly-types\";\nimport { useStorageLedgerAddress } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>,\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushed = !!recordRef.current[id];\n if (!isPushed) {\n recordRef.current[id] = true;\n setRecord((prev: Record<number, boolean>) => ({\n ...prev,\n [id]: true,\n }));\n }\n showToast = !isPushed;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@kodiak-finance/orderly-types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@kodiak-finance/orderly-utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n });\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, useContext } from \"react\";\nimport { RestrictedInfoReturns } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type WidgetConfigs = {\n scanQRCode?: {\n onSuccess?: (url: string) => void;\n };\n};\n\nexport type AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n widgetConfigs?: WidgetConfigs;\n /** Custom announcements to merge with API announcements */\n customAnnouncements?: API.AnnouncementRow[];\n};\n\nexport const AppStateContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppStateContext);\n};\n","import { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"../provider/appStateContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import { useCallback } from \"react\";\nimport {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (\n key: Keys,\n type: ErrorType,\n params: {\n value?: string | number;\n min?: string | number;\n max?: string | number;\n },\n ) => {\n const { value, min, max } = params || {};\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n required: t(\"tpsl.validate.tpTriggerPrice.error.required\"),\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMax\"),\n },\n sl_trigger_price: {\n required: t(\"tpsl.validate.slTriggerPrice.error.required\"),\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMax\"),\n },\n tp_order_price: {\n required: t(\"tpsl.validate.tpOrderPrice.error.required\"),\n min: t(\"tpsl.validate.tpOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.tpOrderPrice.error.max\", { value }),\n },\n sl_order_price: {\n required: t(\"tpsl.validate.slOrderPrice.error.required\"),\n min: t(\"tpsl.validate.slOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.slOrderPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n start_price: {\n required: t(\"orderEntry.startPrice.error.required\"),\n min: t(\"orderEntry.startPrice.error.min\", { value }),\n max: t(\"orderEntry.startPrice.error.max\", { value }),\n },\n end_price: {\n required: t(\"orderEntry.endPrice.error.required\"),\n min: t(\"orderEntry.endPrice.error.min\", { value }),\n max: t(\"orderEntry.endPrice.error.max\", { value }),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n activated_price: {\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n callback_value: {\n required: t(\"orderEntry.callbackValue.error.required\"),\n min: t(\"orderEntry.callbackValue.error.min\", { value }),\n range: t(\"orderEntry.callbackValue.error.range\", {\n min,\n max,\n }),\n },\n callback_rate: {\n required: t(\"orderEntry.callbackRate.error.required\"),\n range: t(\"orderEntry.callbackRate.error.range\", {\n min,\n max,\n }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const getErrorMsg = useCallback(\n (key: Keys, customValue?: string) => {\n const { type, value, min, max } = errors?.[key] || ({} as any);\n if (type) {\n return getMessage(key, type, { value: customValue || value, min, max });\n }\n return \"\";\n },\n [errors],\n );\n\n return {\n getErrorMsg,\n };\n}\n","/**\n * SDK Version - BUMP THIS WHEN RELEASING\n * Keep in sync with root package.json version\n */\nexport const SDK_VERSION = \"2.8.17\";\n\nexport type ChangesetEntry = {\n date: string;\n title: string;\n summary: string;\n highlights: string[];\n packages: string[];\n type: \"breaking\" | \"feature\" | \"bugfix\" | \"improvement\";\n};\n\nexport type Changesets = Record<string, ChangesetEntry>;\n\n/**\n * Changesets - What's new in each version\n * ADD NEW ENTRIES WHEN BUMPING SDK_VERSION\n */\nexport const CHANGESETS: Changesets = {\n \"2.8.17\": {\n date: \"2025-11-29\",\n title: \"Symbol performance analysis\",\n summary:\n \"New symbol performance analysis feature with comprehensive per-symbol trading metrics and visualization.\",\n highlights: [\n \"New symbol-specific performance analytics dashboard\",\n \"View detailed P&L, volume, and fees for individual symbols\",\n \"Symbol performance tracking with customizable date ranges\",\n \"Comprehensive performance visualization per trading symbol\",\n ],\n packages: [\"kodiak-orderly-portfolio\"],\n type: \"feature\",\n },\n \"2.8.16\": {\n date: \"2025-11-29\",\n title: \"Fixed funded account address reversion issue\",\n summary:\n \"Restored isMobile guard in device linking to prevent funded accounts from reverting to wallet address. Fixes auto-sync behavior that was causing address switching issues.\",\n highlights: [\n \"Restored isMobile guard in useLinkDevice to prevent unintended auto-sync\",\n \"Fixed funded account address reverting to MetaMask\",\n \"Maintains device linking functionality for mobile devices\",\n \"Prevents auto-sync from being triggered on all devices\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-types\",\n \"kodiak-orderly-utils\",\n ],\n type: \"bugfix\",\n },\n \"2.8.15\": {\n date: \"2025-11-19\",\n title: \"Portfolio volume chart and CSV data export\",\n summary:\n \"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.\",\n highlights: [\n \"New volume chart on portfolio performance component\",\n \"Fixed date range selection to properly update performance labels\",\n \"Leaderboard-style period detection for custom date ranges\",\n \"Default performance period now set to 30 days\",\n \"CSV export for portfolio and trading data\",\n \"Support for custom date range exports\",\n ],\n packages: [\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-trading\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui\",\n ],\n type: \"feature\",\n },\n \"2.8.14\": {\n date: \"2025-11-17\",\n title: \"Fixed 1D broker stats date range issue\",\n summary:\n \"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.\",\n highlights: [\n \"Fixed 1D broker stats to correctly fetch today's data only\",\n \"Properly set start_date and end_date parameters for 1D queries\",\n \"Broker stats now display accurate data for single-day periods\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.13\": {\n date: \"2025-11-13\",\n title: \"Fixed broker stats date range alignment\",\n summary:\n \"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.\",\n highlights: [\n \"Broker stats now match leaderboard date picker exactly\",\n \"Date range handling works consistently on any day\",\n \"Currency symbols ($) added to all stats values\",\n \"Removed unused brokerStats.script file for cleaner codebase\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.12\": {\n date: \"2025-11-13\",\n title: \"Updated broker stats with new endpoint\",\n summary:\n \"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.\",\n highlights: [\n \"Connected to new stats endpoint for accurate data\",\n \"Improved date range calculations for stats display\",\n \"Fixed stats data parsing from aggregated endpoint\",\n \"Better performance with optimized API calls\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.11\": {\n date: \"2025-11-12\",\n title: \"Broker stats and improved date filtering\",\n summary:\n \"Added broker trading stats dashboard and new 1D filter option with improved date range handling.\",\n highlights: [\n \"View broker stats: volume, fees, revenue, and P&L\",\n \"New 1D filter for quick analysis\",\n \"Fixed OrderlyProvider context issues\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.10\": {\n date: \"2025-11-07\",\n title: \"Your trading metrics now display correctly on the leaderboard\",\n summary:\n \"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.\",\n highlights: [\n \"Your trading volume now shows in your leaderboard row\",\n \"Realized P&L displays correctly for your account\",\n \"All your trading metrics are now visible and up to date\",\n \"Works smoothly across both the default and custom leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.9\": {\n date: \"2025-11-07\",\n title: \"Leaderboard performance improvements\",\n summary:\n \"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.\",\n highlights: [\n \"Leaderboard loads faster\",\n \"Smoother sorting and filtering experience\",\n \"More reliable data display\",\n \"Better handling of large leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.8\": {\n date: \"2025-11-07\",\n title: \"See your points and compete on the leaderboard\",\n summary:\n \"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.\",\n highlights: [\n \"View all-time points earned on the leaderboard\",\n \"Sort by trading volume, P&L, or points\",\n \"See your rank for each metric\",\n \"Faster leaderboard loading\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.7\": {\n date: \"2025-11-05\",\n title: \"Custom leaderboard periods and broker announcements\",\n summary:\n \"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.\",\n highlights: [\n \"View leaderboards for any time period you want\",\n \"Brokers can display important announcements\",\n \"Change leaderboard dates without app updates\",\n \"Campaign-specific leaderboards with custom dates\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-ui-scaffold\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-trading-leaderboard\",\n ],\n type: \"feature\",\n },\n \"2.8.6\": {\n date: \"2025-11-04\",\n title: \"Faster app and smoother trading experience\",\n summary:\n \"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.\",\n highlights: [\n \"Points display cleanly without decimals\",\n \"Withdraw form works smoothly with all networks\",\n \"Trading input fields handle decimals better\",\n \"Price data updates instantly when you return to the app\",\n \"Faster performance on slower connections\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-hooks\",\n ],\n type: \"improvement\",\n },\n \"2.8.5\": {\n date: \"2025-11-03\",\n title: \"Track your trading points on the leaderboard\",\n summary:\n \"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.\",\n highlights: [\n \"View your all-time points earned\",\n \"See points on desktop leaderboard\",\n \"Switch between Volume, P&L, and Points on mobile\",\n \"Compare your points against other traders\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-scaffold\",\n ],\n type: \"feature\",\n },\n \"2.8.4\": {\n date: \"2025-10-28\",\n title: \"Better mobile trading and Mac support\",\n summary:\n \"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.\",\n highlights: [\n \"Mobile: Right keyboard automatically appears for entering prices\",\n \"Mobile: Quick number entry for order sizes\",\n \"Mac: Fixed trackpad scrolling in dropdowns\",\n \"Know which trading pair you're canceling orders from\",\n \"Easier stop-loss and take-profit management on mobile\",\n ],\n packages: [\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui-tpsl\",\n ],\n type: \"improvement\",\n },\n \"2.8.3\": {\n date: \"2025-10-20\",\n title: \"More reliable orders and connections\",\n summary:\n \"Fixed issues with order submission and improved network stability. Your orders now process reliably.\",\n highlights: [\n \"Orders submit without errors\",\n \"Connection stays stable during network changes\",\n \"Faster recovery from connection drops\",\n ],\n packages: [\"kodiak-orderly-core\", \"kodiak-orderly-net\"],\n type: \"bugfix\",\n },\n};\n\n/**\n * Get changeset for a specific version\n * @param version - Version string (e.g., \"2.8.3\")\n * @returns ChangesetEntry or undefined if not found\n */\nexport function getChangesetForVersion(\n version: string = SDK_VERSION,\n): ChangesetEntry | undefined {\n return CHANGESETS[version];\n}\n\n/**\n * Get the latest changeset\n * @returns ChangesetEntry for current SDK_VERSION\n */\nexport function getLatestChangeset(): ChangesetEntry | undefined {\n return getChangesetForVersion(SDK_VERSION);\n}\n"]}
package/dist/index.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  import { useTrack, OrderlyConfigProvider, useAccount, useTrackingInstance, useRestrictedInfo, useEventEmitter, useSymbolsInfo, useOrderlyContext, useLocalStorage, useAudioPlayer, useDebouncedCallback, useStorageChain, useChains, useConfig, useWalletConnector, useKeyStore, useSessionStorage, useWalletSubscription, useSettleSubscription, useWS, useStorageLedgerAddress, parseJSON } from '@kodiak-finance/orderly-hooks';
2
- import { OrderlyThemeProvider, LocaleProvider, TooltipProvider, ModalProvider, Toaster, toast, useScreen, modal, parseNumber } from '@kodiak-finance/orderly-ui';
2
+ import { OrderlyThemeProvider, LocaleProvider, TooltipProvider, ModalProvider, Toaster, toast, useCanLinkDevice, modal, parseNumber } from '@kodiak-finance/orderly-ui';
3
3
  import { createContext, useContext, useCallback, useEffect, useMemo, useState, useRef } from 'react';
4
4
  import { OrderStatus, SDKError, AccountStatusEnum, ABSTRACT_CHAIN_ID_MAP, ChainNamespace, TrackerEventName, AlgoOrderRootType } from '@kodiak-finance/orderly-types';
5
5
  import { useTranslation, useLocaleCode, LocaleEnum, i18n } from '@kodiak-finance/orderly-i18n';
@@ -7,8 +7,8 @@ import { parseChainIdToNumber, windowGuard, praseChainIdToNumber, capitalizeStri
7
7
  import { jsx, jsxs } from 'react/jsx-runtime';
8
8
  import { zhCN, enUS } from 'date-fns/locale';
9
9
 
10
- var M=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function Ce(r){return r==="BUY"?i18n.t("common.buy"):r==="SELL"?i18n.t("common.sell"):capitalizeString(r)}function $(r,e){let {symbol:i,side:o,quantity:a,client_order_id:d,fieldChanges:c}=r,t="total_executed_quantity"in r?r.total_executed_quantity:0,l="status"in r?r.status:r.algo_status,s=e[i],n=s("base_dp");s("quote_dp");let u=Ce(o),g=transSymbolformString(i),p="algo_type"in r&&r.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?i18n.t("tpsl.entirePosition"):n===void 0?a:parseNumber(a,{dp:n}),m="",f="";switch(l){case OrderStatus.NEW:d?.startsWith("scaled_")?(m=i18n.t("orders.status.scaledSubOrderOpened.toast.title"),f=`${u} ${g} ${p}`):(m=i18n.t("orders.status.opened.toast.title"),f=`${u} ${g} ${p}`);break;case OrderStatus.FILLED:case OrderStatus.PARTIAL_FILLED:let I=n===void 0?t:parseNumber(t,{dp:n});m=i18n.t("orders.status.filled.toast.title"),f=`${u} ${g} ${I} / ${p}`;break;case OrderStatus.CANCELLED:m=i18n.t("orders.status.canceled.toast.title"),f=`${u} ${g} ${p}`;break;case OrderStatus.REJECTED:m=i18n.t("orders.status.rejected.toast.title"),f=`${u} ${g} ${p}`;break;case OrderStatus.REPLACED:let{algo_type:v,activated_price:b}=r;if(v===AlgoOrderRootType.TRAILING_STOP){let E=c?.[AlgoOrderRootType.TRAILING_STOP]||{};E.is_activated&&E.extreme_price&&b?(m=i18n.t("orders.trailingStop.activated"),f=`${g} @${b}`):E.extreme_price&&(m="",f="");}else m=i18n.t("orders.status.replaced.toast.title"),f=`${o} ${g} ${t} / ${p}`;break;}return {title:m,msg:f,status:l}}var Ie="orderly_order_sound_alert",B=()=>{let r=useEventEmitter(),e=useSymbolsInfo(),i=useRef({}),{notification:o}=useOrderlyContext();useEffect(()=>{i.current=e;},[e]);let a=o?.orderFilled?.media??"",[d]=useLocalStorage(Ie,o?.orderFilled?.defaultOpen??false),[c]=useAudioPlayer(a,{autoPlay:d,volume:1}),t=useDebouncedCallback(l=>{(n=>{let{title:h,msg:u,status:g}=$(n,i.current),p=g===OrderStatus.FILLED||g===OrderStatus.PARTIAL_FILLED,m=n.algo_type||n.type;h&&u&&toast.success(jsxs("div",{children:[h,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:u}),p&&c]}),{id:m});})(l);},100);useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t),t.cancel();}),[r,t]);};function H(){let{t:r}=useTranslation(),e=useLocaleCode();return useMemo(()=>{let i={[LocaleEnum.en]:enUS,[LocaleEnum.zh]:zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:i[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var L=createContext({}),Fe=()=>useContext(L);var z=r=>jsx(L.Provider,{value:r,children:r.children});var Q=()=>{let r=useWS(),{t:e}=useTranslation();useEffect(()=>{let i=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:getTimestamp()},{onMessage(o){o.convertId&&toast.success(e("transfer.convert.completed"));}});return ()=>i()},[]);};function G(r){let{storageChain:e,setStorageChain:i}=useStorageChain(),[o,a]=useState(),[d]=useChains(),c=useConfig("networkId"),{connectedChain:t}=useWalletConnector();return useEffect(()=>{if(t)a?.(typeof t.id=="number"?t.id:parseInt(t.id));else {if(o)return;let l,s=c==="mainnet"?d.mainnet?.[0]:d.testnet?.[0];typeof r=="function"?l=r(c,d):typeof r=="object"&&(l=c==="mainnet"?r?.mainnet:r?.testnet);let n=l?.id||s?.network_infos?.chain_id;if(!n)return;e?a?.(e.chainId):(i(n),a?.(n));}},[t,d,o,c,a,r]),[o,a]}var J="orderly:wallet-info";function j(){let{connectedChain:r,disconnect:e}=useWalletConnector(),[i,o]=useLocalStorage("orderly_link_device",{}),{account:a}=useAccount(),{isMobile:d}=useScreen(),c=useConfig(),t=async n=>{localStorage.removeItem(J),await a.disconnect(),await e({label:n});};useEffect(()=>{let n=S(),h=JSON.parse(localStorage.getItem(J)??"{}");n&&h&&t(h.label);},[]);let l=async()=>{let n=S();if(!n)return;let{address:h,secretKey:u,chainId:g,chainNamespace:p}=n;if(!await a.importOrderlyKey({address:h,secretKey:u,chainNamespace:p}))return;o({chainId:g,chainNamespace:p});let f=new URL(window.location.href);f.searchParams.delete("link"),f.searchParams.set("utm_medium","qrcode");let P=decodeURIComponent(f.toString());history.replaceState(null,"",P);};useEffect(()=>{d&&!r&&l();},[a,r,d]);let s=async()=>{let{chainId:n,chainNamespace:h}=tr()||{};if(d&&!r&&n&&h){let u=a.keyStore.getAddress(),g=a.keyStore.getOrderlyKey(),p=a.keyStore.getAccountId(u);await a.checkOrderlyKey(u,g,p)&&c.set("chainNamespace",h);}};return useEffect(()=>{s();},[a,d,r]),{linkDevice:l}}function tr(){try{let r=localStorage.getItem("orderly_link_device");return r?parseJSON(r):null}catch{}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:i,k:o,i:a,n:d}=or(e)||{};if(i&&o&&a&&d)return {address:i,secretKey:o,chainId:a,chainNamespace:d}}function or(r){try{let e=JSON.parse(window.atob(r)),i=Math.floor(Date.now()/1e3),o=e.t;return !o||i>o?void 0:e}catch{}}function Z(){let{t:r}=useTranslation();useSettleSubscription({onMessage:e=>{let{status:i}=e;switch(i){case "COMPLETED":toast.success(r("settle.settlement.completed"));break;case "FAILED":toast.error(r("settle.settlement.failed"));break;}}});}function re(){let{t:r}=useTranslation(),e=useEventEmitter(),{setLedgerAddress:i}=useStorageLedgerAddress();return useEffect(()=>{e.on("wallet:connect-error",o=>{toast.error(o.message);}),e.on("wallet:sign-message-with-ledger-error",o=>{window.setTimeout(()=>{modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(i(o.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(toast.error(o.message),Promise.resolve()),cancelLabel:r("common.no")}).then(a=>{});});});},[e,r]),{}}function ne(){let{t:r}=useTranslation(),e=useEventEmitter(),i=useRef({}),[o,a]=useSessionStorage("orderly_wallet_change_id",{});i.current=o,useWalletSubscription({onMessage:d=>{let{id:c,side:t,transStatus:l}=d,s=true;if(["DEPOSIT","WITHDRAW"].includes(t)&&["COMPLETED","FAILED"].includes(l)){let n=!!i.current[c];n||(i.current[c]=true,a(h=>({...h,[c]:true}))),s=!n;}if(l==="COMPLETED"&&s){let n=`${capitalizeString(t)} completed`;t==="DEPOSIT"?n=r("transfer.deposit.completed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.completed")),toast.success(n);}else if(l==="FAILED"&&s){let n=`${capitalizeString(t)} failed`;t==="DEPOSIT"?n=r("transfer.deposit.failed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.failed")),toast.error(n);}e.emit("wallet:changed",d);}});}var ce="orderly:wallet-info";var le=r=>{let{wallet:e,connect:i,connectedChain:o,disconnect:a,namespace:d}=useWalletConnector();if(typeof i!="function")throw new SDKError("Please provide a wallet connector provider");useEventEmitter();let t=useRef(false);useConfig("brokerId");let {account:s,state:n}=useAccount(),h=useKeyStore(),u=useConfig("networkId"),[g,{checkChainSupport:p}]=useChains(),[m,f]=useState(false),{track:P,setTrackUserId:I}=useTrack(),v=useMemo(()=>e?.accounts?.[0]?.address,[e]),b=useMemo(()=>{let y=e?.chains?.[0]?.id,k=e?.chains?.[0]?.namespace;if(!(typeof y>"u"))return {id:parseChainIdToNumber(y),namespace:k}},[e]);return useEffect(()=>{n.status>=AccountStatusEnum.EnableTrading&&s.accountId&&I(s.accountId);},[s,n]),useEffect(()=>{if(!o){f(false);return}let y=p(o.id,u);ABSTRACT_CHAIN_ID_MAP.has(parseInt(o.id))&&e?.label!=="AGW"&&(y=false),f(!y);},[o,g,p,u,e]),useEffect(()=>{windowGuard(()=>{let y=h.getAddress(),k=JSON.parse(localStorage.getItem(ce)??"{}");o?.namespace!==ChainNamespace.solana&&y&&s.address!==y&&k.label&&i({autoSelect:{label:k.label,disableModals:true}}).then(T=>{},T=>{});});},[e,s.address]),useEffect(()=>{if(e===null&&n.status>AccountStatusEnum.NotConnected&&!n.validating){s.disconnect();return}if(m||!o||t.current)return;let y=S();v&&v!==s.address&&!y&&(s.setAddress(v,{provider:e?.provider,chain:{id:praseChainIdToNumber(b.id),namespace:b.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}}),P(TrackerEventName.walletConnect,{wallet:e?.label??"",network:b.namespace.toUpperCase()}),windowGuard(()=>{localStorage.setItem(ce,JSON.stringify({label:e?.label??""}));})),b?.id!==s.chainId&&s.switchChainId(b?.id);},[e,o,v,b,s.address,n,s.chainId,m]),{connectWallet:async()=>(t.current=true,i({chainId:r.currentChainId}).then(async y=>{if(Array.isArray(y)&&y.length>0&&y[0]&&y[0].accounts.length>0){let k=y[0],T=praseChainIdToNumber(k.chains[0].id);if(!p(T,u))return {wrongNetwork:true};if(!s)throw new Error("account is not initialized");n.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await s.disconnect());let fe=await s.setAddress(k.accounts[0].address,{provider:k.provider,chain:{id:praseChainIdToNumber(k.chains[0].id),namespace:k.chains[0].namespace.toUpperCase()},wallet:{name:k.label}});return P(TrackerEventName.walletConnect,{wallet:k.label,network:k.chains[0].namespace.toUpperCase()}),{wallet:k,status:fe,wrongNetwork:false}}return null}).finally(()=>{t.current=false;})),wrongNetwork:m}};var N=createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),W=()=>useContext(N);var ue=r=>{let[e,i]=useState(false),[o,a]=G(r.defaultChain);j(),useTrackingInstance();let{connectWallet:d,wrongNetwork:c}=le({currentChainId:o});ne(),Z(),Q(),re();let t=useRestrictedInfo(r.restrictedInfo),l=t.restrictedOpen,s=useMemo(()=>({connectWallet:d,wrongNetwork:c,currentChainId:o,setCurrentChainId:a,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:t,showAnnouncement:e,setShowAnnouncement:i,onRouteChange:r.onRouteChange,widgetConfigs:r.widgetConfigs,customAnnouncements:r.customAnnouncements}),[d,o,l,r.onChainChanged,t,a,e,c,r.onRouteChange,r.widgetConfigs,r.customAnnouncements]);return jsx(N.Provider,{value:s,children:r.children})};var Kr=()=>(B(),null),pe=r=>{let{components:e,appIcons:i,onChainChanged:o,defaultChain:a,widgetConfigs:d,...c}=r;useTrack(),M();let t=H();return jsx(z,{appIcons:i,brokerName:r.brokerName,children:jsx(OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxs(OrderlyConfigProvider,{...c,children:[jsx(Kr,{}),jsx(ue,{onChainChanged:o,defaultChain:a,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,widgetConfigs:d,customAnnouncements:r.customAnnouncements,children:jsx(LocaleProvider,{locale:t,children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:r.children})})})}),jsx(Toaster,{})]})})})};process.env.NODE_ENV!=="production"&&(pe.displayName="OrderlyAppProvider");var Yr=(r,e)=>{let{wrongNetwork:i,disabledConnect:o}=W(),{state:a}=useAccount();return e?.skip?r:i||o||typeof e?.accountStatus<"u"&&a.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Qr(r){let{t:e}=useTranslation(),i=(a,d,c)=>{let{value:t,min:l,max:s}=c||{};return {quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:t}),max:e("orderEntry.orderPrice.error.max",{value:t})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},tp_trigger_price:{required:e("tpsl.validate.tpTriggerPrice.error.required"),min:e("orderEntry.tpTriggerPrice.error.min",{value:t}),max:e("orderEntry.tpTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.tpTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.tpTriggerPrice.error.priceErrorMax")},sl_trigger_price:{required:e("tpsl.validate.slTriggerPrice.error.required"),min:e("orderEntry.slTriggerPrice.error.min",{value:t}),max:e("orderEntry.slTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.slTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.slTriggerPrice.error.priceErrorMax")},tp_order_price:{required:e("tpsl.validate.tpOrderPrice.error.required"),min:e("tpsl.validate.tpOrderPrice.error.min",{value:t}),max:e("tpsl.validate.tpOrderPrice.error.max",{value:t})},sl_order_price:{required:e("tpsl.validate.slOrderPrice.error.required"),min:e("tpsl.validate.slOrderPrice.error.min",{value:t}),max:e("tpsl.validate.slOrderPrice.error.max",{value:t})},total:{min:e("orderEntry.total.error.min",{value:t})},start_price:{required:e("orderEntry.startPrice.error.required"),min:e("orderEntry.startPrice.error.min",{value:t}),max:e("orderEntry.startPrice.error.max",{value:t})},end_price:{required:e("orderEntry.endPrice.error.required"),min:e("orderEntry.endPrice.error.min",{value:t}),max:e("orderEntry.endPrice.error.max",{value:t})},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:t}),max:e("orderEntry.skew.error.max",{value:t})},activated_price:{min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},callback_value:{required:e("orderEntry.callbackValue.error.required"),min:e("orderEntry.callbackValue.error.min",{value:t}),range:e("orderEntry.callbackValue.error.range",{min:l,max:s})},callback_rate:{required:e("orderEntry.callbackRate.error.required"),range:e("orderEntry.callbackRate.error.range",{min:l,max:s})}}[a]?.[d]||""};return {getErrorMsg:useCallback((a,d)=>{let{type:c,value:t,min:l,max:s}=r?.[a]||{};return c?i(a,c,{value:d||t,min:l,max:s}):""},[r])}}var F="2.8.15",me={"2.8.15":{date:"2025-11-19",title:"Portfolio volume chart and CSV data export",summary:"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.",highlights:["New volume chart on portfolio performance component","Fixed date range selection to properly update performance labels","Leaderboard-style period detection for custom date ranges","Default performance period now set to 30 days","CSV export for portfolio and trading data","Support for custom date range exports"],packages:["kodiak-orderly-portfolio","kodiak-orderly-i18n","kodiak-orderly-hooks","kodiak-orderly-trading","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui"],type:"feature"},"2.8.14":{date:"2025-11-17",title:"Fixed 1D broker stats date range issue",summary:"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.",highlights:["Fixed 1D broker stats to correctly fetch today's data only","Properly set start_date and end_date parameters for 1D queries","Broker stats now display accurate data for single-day periods"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.13":{date:"2025-11-13",title:"Fixed broker stats date range alignment",summary:"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.",highlights:["Broker stats now match leaderboard date picker exactly","Date range handling works consistently on any day","Currency symbols ($) added to all stats values","Removed unused brokerStats.script file for cleaner codebase"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.12":{date:"2025-11-13",title:"Updated broker stats with new endpoint",summary:"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.",highlights:["Connected to new stats endpoint for accurate data","Improved date range calculations for stats display","Fixed stats data parsing from aggregated endpoint","Better performance with optimized API calls"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.11":{date:"2025-11-12",title:"Broker stats and improved date filtering",summary:"Added broker trading stats dashboard and new 1D filter option with improved date range handling.",highlights:["View broker stats: volume, fees, revenue, and P&L","New 1D filter for quick analysis","Fixed OrderlyProvider context issues"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.10":{date:"2025-11-07",title:"Your trading metrics now display correctly on the leaderboard",summary:"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.",highlights:["Your trading volume now shows in your leaderboard row","Realized P&L displays correctly for your account","All your trading metrics are now visible and up to date","Works smoothly across both the default and custom leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.9":{date:"2025-11-07",title:"Leaderboard performance improvements",summary:"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.",highlights:["Leaderboard loads faster","Smoother sorting and filtering experience","More reliable data display","Better handling of large leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.8":{date:"2025-11-07",title:"See your points and compete on the leaderboard",summary:"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.",highlights:["View all-time points earned on the leaderboard","Sort by trading volume, P&L, or points","See your rank for each metric","Faster leaderboard loading"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.7":{date:"2025-11-05",title:"Custom leaderboard periods and broker announcements",summary:"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.",highlights:["View leaderboards for any time period you want","Brokers can display important announcements","Change leaderboard dates without app updates","Campaign-specific leaderboards with custom dates"],packages:["kodiak-orderly-react-app","kodiak-orderly-ui-scaffold","kodiak-orderly-i18n","kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.6":{date:"2025-11-04",title:"Faster app and smoother trading experience",summary:"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.",highlights:["Points display cleanly without decimals","Withdraw form works smoothly with all networks","Trading input fields handle decimals better","Price data updates instantly when you return to the app","Faster performance on slower connections"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-hooks"],type:"improvement"},"2.8.5":{date:"2025-11-03",title:"Track your trading points on the leaderboard",summary:"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.",highlights:["View your all-time points earned","See points on desktop leaderboard","Switch between Volume, P&L, and Points on mobile","Compare your points against other traders"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-scaffold"],type:"feature"},"2.8.4":{date:"2025-10-28",title:"Better mobile trading and Mac support",summary:"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.",highlights:["Mobile: Right keyboard automatically appears for entering prices","Mobile: Quick number entry for order sizes","Mac: Fixed trackpad scrolling in dropdowns","Know which trading pair you're canceling orders from","Easier stop-loss and take-profit management on mobile"],packages:["kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui-tpsl"],type:"improvement"},"2.8.3":{date:"2025-10-20",title:"More reliable orders and connections",summary:"Fixed issues with order submission and improved network stability. Your orders now process reliably.",highlights:["Orders submit without errors","Connection stays stable during network changes","Faster recovery from connection drops"],packages:["kodiak-orderly-core","kodiak-orderly-net"],type:"bugfix"}};function ge(r=F){return me[r]}function Gr(){return ge(F)}
10
+ var W=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};function be(r){return r==="BUY"?i18n.t("common.buy"):r==="SELL"?i18n.t("common.sell"):capitalizeString(r)}function $(r,e){let {symbol:i,side:o,quantity:a,client_order_id:d,fieldChanges:c}=r,t="total_executed_quantity"in r?r.total_executed_quantity:0,l="status"in r?r.status:r.algo_status,s=e[i],n=s("base_dp");s("quote_dp");let u=be(o),g=transSymbolformString(i),p="algo_type"in r&&r.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?i18n.t("tpsl.entirePosition"):n===void 0?a:parseNumber(a,{dp:n}),m="",f="";switch(l){case OrderStatus.NEW:d?.startsWith("scaled_")?(m=i18n.t("orders.status.scaledSubOrderOpened.toast.title"),f=`${u} ${g} ${p}`):(m=i18n.t("orders.status.opened.toast.title"),f=`${u} ${g} ${p}`);break;case OrderStatus.FILLED:case OrderStatus.PARTIAL_FILLED:let I=n===void 0?t:parseNumber(t,{dp:n});m=i18n.t("orders.status.filled.toast.title"),f=`${u} ${g} ${I} / ${p}`;break;case OrderStatus.CANCELLED:m=i18n.t("orders.status.canceled.toast.title"),f=`${u} ${g} ${p}`;break;case OrderStatus.REJECTED:m=i18n.t("orders.status.rejected.toast.title"),f=`${u} ${g} ${p}`;break;case OrderStatus.REPLACED:let{algo_type:v,activated_price:C}=r;if(v===AlgoOrderRootType.TRAILING_STOP){let E=c?.[AlgoOrderRootType.TRAILING_STOP]||{};E.is_activated&&E.extreme_price&&C?(m=i18n.t("orders.trailingStop.activated"),f=`${g} @${C}`):E.extreme_price&&(m="",f="");}else m=i18n.t("orders.status.replaced.toast.title"),f=`${o} ${g} ${t} / ${p}`;break;}return {title:m,msg:f,status:l}}var Ie="orderly_order_sound_alert",B=()=>{let r=useEventEmitter(),e=useSymbolsInfo(),i=useRef({}),{notification:o}=useOrderlyContext();useEffect(()=>{i.current=e;},[e]);let a=o?.orderFilled?.media??"",[d]=useLocalStorage(Ie,o?.orderFilled?.defaultOpen??false),[c]=useAudioPlayer(a,{autoPlay:d,volume:1}),t=useDebouncedCallback(l=>{(n=>{let{title:h,msg:u,status:g}=$(n,i.current),p=g===OrderStatus.FILLED||g===OrderStatus.PARTIAL_FILLED,m=n.algo_type||n.type;h&&u&&toast.success(jsxs("div",{children:[h,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:u}),p&&c]}),{id:m});})(l);},100);useEffect(()=>(r.on("orders:changed",t),()=>{r.off("orders:changed",t),t.cancel();}),[r,t]);};function Y(){let{t:r}=useTranslation(),e=useLocaleCode();return useMemo(()=>{let i={[LocaleEnum.en]:enUS,[LocaleEnum.zh]:zhCN};return {locale:e,dialog:{ok:r("common.ok"),cancel:r("common.cancel")},modal:{confirm:r("common.confirm"),cancel:r("common.cancel")},pagination:{morePages:r("ui.pagination.morePages"),rowsPerPage:r("ui.pagination.rowsPerPage")},picker:{selectDate:r("ui.picker.selectDate"),dayPicker:i[e]},empty:{description:r("ui.empty.description")}}},[r,e])}var O=createContext({}),Me=()=>useContext(O);var H=r=>jsx(O.Provider,{value:r,children:r.children});var Q=()=>{let r=useWS(),{t:e}=useTranslation();useEffect(()=>{let i=r.privateSubscribe({id:"assetconvert",event:"subscribe",topic:"assetconvert",ts:getTimestamp()},{onMessage(o){o.convertId&&toast.success(e("transfer.convert.completed"));}});return ()=>i()},[]);};function G(r){let{storageChain:e,setStorageChain:i}=useStorageChain(),[o,a]=useState(),[d]=useChains(),c=useConfig("networkId"),{connectedChain:t}=useWalletConnector();return useEffect(()=>{if(t)a?.(typeof t.id=="number"?t.id:parseInt(t.id));else {if(o)return;let l,s=c==="mainnet"?d.mainnet?.[0]:d.testnet?.[0];typeof r=="function"?l=r(c,d):typeof r=="object"&&(l=c==="mainnet"?r?.mainnet:r?.testnet);let n=l?.id||s?.network_infos?.chain_id;if(!n)return;e?a?.(e.chainId):(i(n),a?.(n));}},[t,d,o,c,a,r]),[o,a]}var J="orderly:wallet-info";function j(){let{connectedChain:r,disconnect:e}=useWalletConnector(),[i,o]=useLocalStorage("orderly_link_device",{}),{account:a}=useAccount(),d=useCanLinkDevice(),c=useConfig(),t=async n=>{localStorage.removeItem(J),await a.disconnect(),await e({label:n});};useEffect(()=>{let n=S(),h=JSON.parse(localStorage.getItem(J)??"{}");n&&h&&t(h.label);},[]);let l=async()=>{let n=S();if(!n)return;let{address:h,secretKey:u,chainId:g,chainNamespace:p}=n;if(!await a.importOrderlyKey({address:h,secretKey:u,chainNamespace:p}))return;o({chainId:g,chainNamespace:p});let f=new URL(window.location.href);f.searchParams.delete("link"),f.searchParams.set("utm_medium","qrcode");let P=decodeURIComponent(f.toString());history.replaceState(null,"",P);};useEffect(()=>{d&&!r&&l();},[a,r,d]);let s=async()=>{let{chainId:n,chainNamespace:h}=tr()||{};if(d&&!r&&n&&h){let u=a.keyStore.getAddress(),g=a.keyStore.getOrderlyKey(),p=a.keyStore.getAccountId(u);await a.checkOrderlyKey(u,g,p)&&c.set("chainNamespace",h);}};return useEffect(()=>{s();},[a,d,r]),{linkDevice:l}}function tr(){try{let r=localStorage.getItem("orderly_link_device");return r?parseJSON(r):null}catch{}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{a:i,k:o,i:a,n:d}=or(e)||{};if(i&&o&&a&&d)return {address:i,secretKey:o,chainId:a,chainNamespace:d}}function or(r){try{let e=JSON.parse(window.atob(r)),i=Math.floor(Date.now()/1e3),o=e.t;return !o||i>o?void 0:e}catch{}}function Z(){let{t:r}=useTranslation();useSettleSubscription({onMessage:e=>{let{status:i}=e;switch(i){case "COMPLETED":toast.success(r("settle.settlement.completed"));break;case "FAILED":toast.error(r("settle.settlement.failed"));break;}}});}function re(){let{t:r}=useTranslation(),e=useEventEmitter(),{setLedgerAddress:i}=useStorageLedgerAddress();return useEffect(()=>{e.on("wallet:connect-error",o=>{toast.error(o.message);}),e.on("wallet:sign-message-with-ledger-error",o=>{window.setTimeout(()=>{modal.confirm({title:r("connector.ledger.signMessageFailed"),content:r("connector.ledger.signMessageFailed.description"),size:"sm",onOk:async()=>(i(o.userAddress),Promise.resolve()),okLabel:r("common.ok"),onCancel:async()=>(toast.error(o.message),Promise.resolve()),cancelLabel:r("common.no")}).then(a=>{});});});},[e,r]),{}}function ne(){let{t:r}=useTranslation(),e=useEventEmitter(),i=useRef({}),[o,a]=useSessionStorage("orderly_wallet_change_id",{});i.current=o,useWalletSubscription({onMessage:d=>{let{id:c,side:t,transStatus:l}=d,s=true;if(["DEPOSIT","WITHDRAW"].includes(t)&&["COMPLETED","FAILED"].includes(l)){let n=!!i.current[c];n||(i.current[c]=true,a(h=>({...h,[c]:true}))),s=!n;}if(l==="COMPLETED"&&s){let n=`${capitalizeString(t)} completed`;t==="DEPOSIT"?n=r("transfer.deposit.completed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.completed")),toast.success(n);}else if(l==="FAILED"&&s){let n=`${capitalizeString(t)} failed`;t==="DEPOSIT"?n=r("transfer.deposit.failed"):t==="WITHDRAW"&&(n=r("transfer.withdraw.failed")),toast.error(n);}e.emit("wallet:changed",d);}});}var ce="orderly:wallet-info";var le=r=>{let{wallet:e,connect:i,connectedChain:o,disconnect:a,namespace:d}=useWalletConnector();if(typeof i!="function")throw new SDKError("Please provide a wallet connector provider");useEventEmitter();let t=useRef(false);useConfig("brokerId");let {account:s,state:n}=useAccount(),h=useKeyStore(),u=useConfig("networkId"),[g,{checkChainSupport:p}]=useChains(),[m,f]=useState(false),{track:P,setTrackUserId:I}=useTrack(),v=useMemo(()=>e?.accounts?.[0]?.address,[e]),C=useMemo(()=>{let y=e?.chains?.[0]?.id,k=e?.chains?.[0]?.namespace;if(!(typeof y>"u"))return {id:parseChainIdToNumber(y),namespace:k}},[e]);return useEffect(()=>{n.status>=AccountStatusEnum.EnableTrading&&s.accountId&&I(s.accountId);},[s,n]),useEffect(()=>{if(!o){f(false);return}let y=p(o.id,u);ABSTRACT_CHAIN_ID_MAP.has(parseInt(o.id))&&e?.label!=="AGW"&&(y=false),f(!y);},[o,g,p,u,e]),useEffect(()=>{windowGuard(()=>{let y=h.getAddress(),k=JSON.parse(localStorage.getItem(ce)??"{}");o?.namespace!==ChainNamespace.solana&&y&&s.address!==y&&k.label&&i({autoSelect:{label:k.label,disableModals:true}}).then(T=>{},T=>{});});},[e,s.address]),useEffect(()=>{if(e===null&&n.status>AccountStatusEnum.NotConnected&&!n.validating){s.disconnect();return}if(m||!o||t.current)return;let y=S();v&&v!==s.address&&!y&&(s.setAddress(v,{provider:e?.provider,chain:{id:praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:e?.label??""},additionalInfo:e?.additionalInfo??{}}),P(TrackerEventName.walletConnect,{wallet:e?.label??"",network:C.namespace.toUpperCase()}),windowGuard(()=>{localStorage.setItem(ce,JSON.stringify({label:e?.label??""}));})),C?.id!==s.chainId&&s.switchChainId(C?.id);},[e,o,v,C,s.address,n,s.chainId,m]),{connectWallet:async()=>(t.current=true,i({chainId:r.currentChainId}).then(async y=>{if(Array.isArray(y)&&y.length>0&&y[0]&&y[0].accounts.length>0){let k=y[0],T=praseChainIdToNumber(k.chains[0].id);if(!p(T,u))return {wrongNetwork:true};if(!s)throw new Error("account is not initialized");n.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await s.disconnect());let fe=await s.setAddress(k.accounts[0].address,{provider:k.provider,chain:{id:praseChainIdToNumber(k.chains[0].id),namespace:k.chains[0].namespace.toUpperCase()},wallet:{name:k.label}});return P(TrackerEventName.walletConnect,{wallet:k.label,network:k.chains[0].namespace.toUpperCase()}),{wallet:k,status:fe,wrongNetwork:false}}return null}).finally(()=>{t.current=false;})),wrongNetwork:m}};var N=createContext({setCurrentChainId:r=>{},restrictedInfo:{},setShowAnnouncement:r=>{}}),F=()=>useContext(N);var ue=r=>{let[e,i]=useState(false),[o,a]=G(r.defaultChain);j(),useTrackingInstance();let{connectWallet:d,wrongNetwork:c}=le({currentChainId:o});ne(),Z(),Q(),re();let t=useRestrictedInfo(r.restrictedInfo),l=t.restrictedOpen,s=useMemo(()=>({connectWallet:d,wrongNetwork:c,currentChainId:o,setCurrentChainId:a,onChainChanged:r.onChainChanged,disabledConnect:l,restrictedInfo:t,showAnnouncement:e,setShowAnnouncement:i,onRouteChange:r.onRouteChange,widgetConfigs:r.widgetConfigs,customAnnouncements:r.customAnnouncements}),[d,o,l,r.onChainChanged,t,a,e,c,r.onRouteChange,r.widgetConfigs,r.customAnnouncements]);return jsx(N.Provider,{value:s,children:r.children})};var Kr=()=>(B(),null),pe=r=>{let{components:e,appIcons:i,onChainChanged:o,defaultChain:a,widgetConfigs:d,...c}=r;useTrack(),W();let t=Y();return jsx(H,{appIcons:i,brokerName:r.brokerName,children:jsx(OrderlyThemeProvider,{components:e,overrides:r.overrides,children:jsxs(OrderlyConfigProvider,{...c,children:[jsx(Kr,{}),jsx(ue,{onChainChanged:o,defaultChain:a,restrictedInfo:r.restrictedInfo,onRouteChange:r.onRouteChange,widgetConfigs:d,customAnnouncements:r.customAnnouncements,children:jsx(LocaleProvider,{locale:t,children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:r.children})})})}),jsx(Toaster,{})]})})})};process.env.NODE_ENV!=="production"&&(pe.displayName="OrderlyAppProvider");var zr=(r,e)=>{let{wrongNetwork:i,disabledConnect:o}=F(),{state:a}=useAccount();return e?.skip?r:i||o||typeof e?.accountStatus<"u"&&a.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:r};function Qr(r){let{t:e}=useTranslation(),i=(a,d,c)=>{let{value:t,min:l,max:s}=c||{};return {quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_quantity:{required:e("orderEntry.orderQuantity.error.required"),min:e("orderEntry.orderQuantity.error.min",{value:t}),max:e("orderEntry.orderQuantity.error.max",{value:t})},order_price:{required:e("orderEntry.orderPrice.error.required"),min:e("orderEntry.orderPrice.error.min",{value:t}),max:e("orderEntry.orderPrice.error.max",{value:t})},trigger_price:{required:e("orderEntry.triggerPrice.error.required"),min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},tp_trigger_price:{required:e("tpsl.validate.tpTriggerPrice.error.required"),min:e("orderEntry.tpTriggerPrice.error.min",{value:t}),max:e("orderEntry.tpTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.tpTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.tpTriggerPrice.error.priceErrorMax")},sl_trigger_price:{required:e("tpsl.validate.slTriggerPrice.error.required"),min:e("orderEntry.slTriggerPrice.error.min",{value:t}),max:e("orderEntry.slTriggerPrice.error.max",{value:t}),priceErrorMin:e("tpsl.validate.slTriggerPrice.error.priceErrorMin"),priceErrorMax:e("tpsl.validate.slTriggerPrice.error.priceErrorMax")},tp_order_price:{required:e("tpsl.validate.tpOrderPrice.error.required"),min:e("tpsl.validate.tpOrderPrice.error.min",{value:t}),max:e("tpsl.validate.tpOrderPrice.error.max",{value:t})},sl_order_price:{required:e("tpsl.validate.slOrderPrice.error.required"),min:e("tpsl.validate.slOrderPrice.error.min",{value:t}),max:e("tpsl.validate.slOrderPrice.error.max",{value:t})},total:{min:e("orderEntry.total.error.min",{value:t})},start_price:{required:e("orderEntry.startPrice.error.required"),min:e("orderEntry.startPrice.error.min",{value:t}),max:e("orderEntry.startPrice.error.max",{value:t})},end_price:{required:e("orderEntry.endPrice.error.required"),min:e("orderEntry.endPrice.error.min",{value:t}),max:e("orderEntry.endPrice.error.max",{value:t})},total_orders:{required:e("orderEntry.totalOrders.error.required"),range:e("orderEntry.totalOrders.error.range")},skew:{required:e("orderEntry.skew.error.required"),min:e("orderEntry.skew.error.min",{value:t}),max:e("orderEntry.skew.error.max",{value:t})},activated_price:{min:e("orderEntry.triggerPrice.error.min",{value:t}),max:e("orderEntry.triggerPrice.error.max",{value:t})},callback_value:{required:e("orderEntry.callbackValue.error.required"),min:e("orderEntry.callbackValue.error.min",{value:t}),range:e("orderEntry.callbackValue.error.range",{min:l,max:s})},callback_rate:{required:e("orderEntry.callbackRate.error.required"),range:e("orderEntry.callbackRate.error.range",{min:l,max:s})}}[a]?.[d]||""};return {getErrorMsg:useCallback((a,d)=>{let{type:c,value:t,min:l,max:s}=r?.[a]||{};return c?i(a,c,{value:d||t,min:l,max:s}):""},[r])}}var M="2.8.17",me={"2.8.17":{date:"2025-11-29",title:"Symbol performance analysis",summary:"New symbol performance analysis feature with comprehensive per-symbol trading metrics and visualization.",highlights:["New symbol-specific performance analytics dashboard","View detailed P&L, volume, and fees for individual symbols","Symbol performance tracking with customizable date ranges","Comprehensive performance visualization per trading symbol"],packages:["kodiak-orderly-portfolio"],type:"feature"},"2.8.16":{date:"2025-11-29",title:"Fixed funded account address reversion issue",summary:"Restored isMobile guard in device linking to prevent funded accounts from reverting to wallet address. Fixes auto-sync behavior that was causing address switching issues.",highlights:["Restored isMobile guard in useLinkDevice to prevent unintended auto-sync","Fixed funded account address reverting to MetaMask","Maintains device linking functionality for mobile devices","Prevents auto-sync from being triggered on all devices"],packages:["kodiak-orderly-react-app","kodiak-orderly-portfolio","kodiak-orderly-hooks","kodiak-orderly-types","kodiak-orderly-utils"],type:"bugfix"},"2.8.15":{date:"2025-11-19",title:"Portfolio volume chart and CSV data export",summary:"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.",highlights:["New volume chart on portfolio performance component","Fixed date range selection to properly update performance labels","Leaderboard-style period detection for custom date ranges","Default performance period now set to 30 days","CSV export for portfolio and trading data","Support for custom date range exports"],packages:["kodiak-orderly-portfolio","kodiak-orderly-i18n","kodiak-orderly-hooks","kodiak-orderly-trading","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui"],type:"feature"},"2.8.14":{date:"2025-11-17",title:"Fixed 1D broker stats date range issue",summary:"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.",highlights:["Fixed 1D broker stats to correctly fetch today's data only","Properly set start_date and end_date parameters for 1D queries","Broker stats now display accurate data for single-day periods"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.13":{date:"2025-11-13",title:"Fixed broker stats date range alignment",summary:"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.",highlights:["Broker stats now match leaderboard date picker exactly","Date range handling works consistently on any day","Currency symbols ($) added to all stats values","Removed unused brokerStats.script file for cleaner codebase"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.12":{date:"2025-11-13",title:"Updated broker stats with new endpoint",summary:"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.",highlights:["Connected to new stats endpoint for accurate data","Improved date range calculations for stats display","Fixed stats data parsing from aggregated endpoint","Better performance with optimized API calls"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.11":{date:"2025-11-12",title:"Broker stats and improved date filtering",summary:"Added broker trading stats dashboard and new 1D filter option with improved date range handling.",highlights:["View broker stats: volume, fees, revenue, and P&L","New 1D filter for quick analysis","Fixed OrderlyProvider context issues"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.10":{date:"2025-11-07",title:"Your trading metrics now display correctly on the leaderboard",summary:"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.",highlights:["Your trading volume now shows in your leaderboard row","Realized P&L displays correctly for your account","All your trading metrics are now visible and up to date","Works smoothly across both the default and custom leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"bugfix"},"2.8.9":{date:"2025-11-07",title:"Leaderboard performance improvements",summary:"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.",highlights:["Leaderboard loads faster","Smoother sorting and filtering experience","More reliable data display","Better handling of large leaderboards"],packages:["kodiak-orderly-trading-leaderboard"],type:"improvement"},"2.8.8":{date:"2025-11-07",title:"See your points and compete on the leaderboard",summary:"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.",highlights:["View all-time points earned on the leaderboard","Sort by trading volume, P&L, or points","See your rank for each metric","Faster leaderboard loading"],packages:["kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.7":{date:"2025-11-05",title:"Custom leaderboard periods and broker announcements",summary:"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.",highlights:["View leaderboards for any time period you want","Brokers can display important announcements","Change leaderboard dates without app updates","Campaign-specific leaderboards with custom dates"],packages:["kodiak-orderly-react-app","kodiak-orderly-ui-scaffold","kodiak-orderly-i18n","kodiak-orderly-trading-leaderboard"],type:"feature"},"2.8.6":{date:"2025-11-04",title:"Faster app and smoother trading experience",summary:"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.",highlights:["Points display cleanly without decimals","Withdraw form works smoothly with all networks","Trading input fields handle decimals better","Price data updates instantly when you return to the app","Faster performance on slower connections"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-hooks"],type:"improvement"},"2.8.5":{date:"2025-11-03",title:"Track your trading points on the leaderboard",summary:"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.",highlights:["View your all-time points earned","See points on desktop leaderboard","Switch between Volume, P&L, and Points on mobile","Compare your points against other traders"],packages:["kodiak-orderly-trading-leaderboard","kodiak-orderly-ui-scaffold"],type:"feature"},"2.8.4":{date:"2025-10-28",title:"Better mobile trading and Mac support",summary:"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.",highlights:["Mobile: Right keyboard automatically appears for entering prices","Mobile: Quick number entry for order sizes","Mac: Fixed trackpad scrolling in dropdowns","Know which trading pair you're canceling orders from","Easier stop-loss and take-profit management on mobile"],packages:["kodiak-orderly-ui-transfer","kodiak-orderly-ui-order-entry","kodiak-orderly-ui-orders","kodiak-orderly-ui-positions","kodiak-orderly-ui-tpsl"],type:"improvement"},"2.8.3":{date:"2025-10-20",title:"More reliable orders and connections",summary:"Fixed issues with order submission and improved network stability. Your orders now process reliably.",highlights:["Orders submit without errors","Connection stays stable during network changes","Faster recovery from connection drops"],packages:["kodiak-orderly-core","kodiak-orderly-net"],type:"bugfix"}};function ge(r=M){return me[r]}function Gr(){return ge(M)}
11
11
 
12
- export { me as CHANGESETS, pe as OrderlyAppProvider, F as SDK_VERSION, ge as getChangesetForVersion, Gr as getLatestChangeset, Fe as useAppConfig, W as useAppContext, Yr as useDataTap, Qr as useOrderEntryFormErrorMsg };
12
+ export { me as CHANGESETS, pe as OrderlyAppProvider, M as SDK_VERSION, ge as getChangesetForVersion, Gr as getLatestChangeset, Me as useAppConfig, F as useAppContext, zr as useDataTap, Qr as useOrderEntryFormErrorMsg };
13
13
  //# sourceMappingURL=out.js.map
14
14
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appConfigContext.tsx","../src/provider/appConfigProvider.tsx","../src/provider/appStateProvider.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/appStateContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts","../src/constants/changesets.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","useAudioPlayer","useLocalStorage","useOrderlyContext","OrderStatus","toast","i18n","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","fieldChanges","total_executed_quantity","status","getSymbolInfo","base_dp","quote_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","algo_type","activated_price","fieldChange","jsx","jsxs","ORDERLY_ORDER_SOUND_ALERT_KEY","useExecutionReport","ee","symbolsInfoRef","notification","src","soundAutoPlay","audioElement","handler","isFilled","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","AppConfigContext","useAppConfig","AppConfigProvider","props","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useScreen","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushed","prev","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","walletState","wallet","AppStateContext","show","useAppContext","AppStateProvider","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","ExecutionReportListener","OrderlyAppProvider","components","appIcons","onChainChanged","widgetConfigs","configProps","uiLocale","useDataTap","state","useCallback","useOrderEntryFormErrorMsg","errors","getMessage","key","type","params","value","min","max","customValue","SDK_VERSION","CHANGESETS","getChangesetForVersion","version","getLatestChangeset"],"mappings":"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DACA,oDACA,6CACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,2CACP,QACE,mGACF,WAAY,CACV,oDACA,mCACA,sCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,gEACP,QACE,4KACF,WAAY,CACV,wDACA,mDACA,0DACA,gEACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,mHACF,WAAY,CACV,2BACA,4CACA,6BACA,uCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,iDACP,QACE,gJACF,WAAY,CACV,iDACA,yCACA,gCACA,4BACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,sDACP,QACE,uKACF,WAAY,CACV,iDACA,8CACA,+CACA,kDACF,EACA,SAAU,CACR,2BACA,6BACA,sBACA,oCACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,6CACP,QACE,kJACF,WAAY,CACV,0CACA,iDACA,8CACA,0DACA,0CACF,EACA,SAAU,CACR,qCACA,6BACA,gCACA,sBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,+CACP,QACE,kIACF,WAAY,CACV,mCACA,oCACA,mDACA,2CACF,EACA,SAAU,CACR,qCACA,4BACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,wCACP,QACE,0HACF,WAAY,CACV,mEACA,6CACA,6CACA,uDACA,uDACF,EACA,SAAU,CACR,6BACA,gCACA,2BACA,8BACA,wBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,uGACF,WAAY,CACV,+BACA,iDACA,uCACF,EACA,SAAU,CAAC,sBAAuB,oBAAoB,EACtD,KAAM,QACR,CACF,EAOO,SAASC,GACdC,EAAkBH,EACU,CAC5B,OAAOC,GAAWE,CAAO,CAC3B,CAMO,SAASC,IAAiD,CAC/D,OAAOF,GAAuBF,CAAW,CAC3C","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { OrderlyThemeProviderProps } from \"@kodiak-finance/orderly-ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppConfigProvider } from \"./appConfigProvider\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appStateProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\n// Cannot be called outside of Provider because useExecutionReport requires useOrderlyContext.\nconst ExecutionReportListener: React.FC = () => {\n useExecutionReport();\n return null;\n};\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n widgetConfigs,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <ExecutionReportListener />\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n widgetConfigs={widgetConfigs}\n customAnnouncements={props.customAnnouncements}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nif (process.env.NODE_ENV !== \"production\") {\n OrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n}\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n useAudioPlayer,\n useLocalStorage,\n useOrderlyContext,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport const useExecutionReport = () => {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n const { notification } = useOrderlyContext();\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const src = notification?.orderFilled?.media ?? \"\";\n\n const [soundAutoPlay] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const [audioElement] = useAudioPlayer(src, {\n autoPlay: soundAutoPlay,\n volume: 1,\n });\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg, status } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n const isFilled =\n status === OrderStatus.FILLED || status === OrderStatus.PARTIAL_FILLED;\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n {isFilled && audioElement}\n </div>,\n { id: orderType },\n );\n }\n };\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n return () => {\n ee.off(\"orders:changed\", handler);\n handler.cancel();\n };\n }, [ee, handler]);\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderStatus, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { AlgoOrderRootType } from \"@kodiak-finance/orderly-types\";\nimport { parseNumber } from \"@kodiak-finance/orderly-ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@kodiak-finance/orderly-utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\ntype AlgoOrderFieldChanges = Partial<\n Record<OrderType, Partial<Record<keyof API.AlgoOrder, boolean>>>\n>;\n\nexport function getOrderExecutionReportMsg(\n data: (API.AlgoOrder | API.Order) & {\n fieldChanges?: AlgoOrderFieldChanges;\n },\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id, fieldChanges } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const quote_dp = getSymbolInfo(\"quote_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n const { algo_type, activated_price } = data as API.AlgoOrder;\n if (algo_type === AlgoOrderRootType.TRAILING_STOP) {\n const fieldChange =\n fieldChanges?.[AlgoOrderRootType.TRAILING_STOP] || {};\n // when trailing stop order is activated, and extreme_price will also changed\n if (\n fieldChange.is_activated &&\n fieldChange.extreme_price &&\n activated_price\n ) {\n title = i18n.t(\"orders.trailingStop.activated\");\n msg = `${displaySymbol} @${activated_price}`;\n } else if (fieldChange.extreme_price) {\n // if extreme_price is changed, skip show the message\n title = \"\";\n msg = \"\";\n }\n } else {\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n }\n\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n status,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@kodiak-finance/orderly-i18n\";\nimport { Locale } from \"@kodiak-finance/orderly-ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { createContext, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigContext = createContext({} as ThemeContextState);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { AppLogos } from \"../types\";\nimport { AppConfigContext } from \"./appConfigContext\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigProvider: FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, useState, useMemo } from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n useTrackingInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { AppContextState, AppStateContext } from \"./appStateContext\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<\n AppContextState,\n \"onChainChanged\" | \"onRouteChange\" | \"widgetConfigs\" | \"customAnnouncements\"\n>;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n widgetConfigs: props.widgetConfigs,\n customAnnouncements: props.customAnnouncements,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n props.widgetConfigs,\n props.customAnnouncements,\n ],\n );\n\n return (\n <AppStateContext.Provider value={memoizedValue}>\n {props.children}\n </AppStateContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { Chain, NetworkId } from \"@kodiak-finance/orderly-types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { useScreen } from \"@kodiak-finance/orderly-ui\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage,\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n // use set instead of append, because the param possibly in the url\n url.searchParams.set(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!,\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@kodiak-finance/orderly-hooks\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@kodiak-finance/orderly-hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { LedgerWalletKey } from \"@kodiak-finance/orderly-types\";\nimport { useStorageLedgerAddress } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>,\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushed = !!recordRef.current[id];\n if (!isPushed) {\n recordRef.current[id] = true;\n setRecord((prev: Record<number, boolean>) => ({\n ...prev,\n [id]: true,\n }));\n }\n showToast = !isPushed;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@kodiak-finance/orderly-types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@kodiak-finance/orderly-utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n });\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, useContext } from \"react\";\nimport { RestrictedInfoReturns } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type WidgetConfigs = {\n scanQRCode?: {\n onSuccess?: (url: string) => void;\n };\n};\n\nexport type AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n widgetConfigs?: WidgetConfigs;\n /** Custom announcements to merge with API announcements */\n customAnnouncements?: API.AnnouncementRow[];\n};\n\nexport const AppStateContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppStateContext);\n};\n","import { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"../provider/appStateContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import { useCallback } from \"react\";\nimport {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (\n key: Keys,\n type: ErrorType,\n params: {\n value?: string | number;\n min?: string | number;\n max?: string | number;\n },\n ) => {\n const { value, min, max } = params || {};\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n required: t(\"tpsl.validate.tpTriggerPrice.error.required\"),\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMax\"),\n },\n sl_trigger_price: {\n required: t(\"tpsl.validate.slTriggerPrice.error.required\"),\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMax\"),\n },\n tp_order_price: {\n required: t(\"tpsl.validate.tpOrderPrice.error.required\"),\n min: t(\"tpsl.validate.tpOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.tpOrderPrice.error.max\", { value }),\n },\n sl_order_price: {\n required: t(\"tpsl.validate.slOrderPrice.error.required\"),\n min: t(\"tpsl.validate.slOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.slOrderPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n start_price: {\n required: t(\"orderEntry.startPrice.error.required\"),\n min: t(\"orderEntry.startPrice.error.min\", { value }),\n max: t(\"orderEntry.startPrice.error.max\", { value }),\n },\n end_price: {\n required: t(\"orderEntry.endPrice.error.required\"),\n min: t(\"orderEntry.endPrice.error.min\", { value }),\n max: t(\"orderEntry.endPrice.error.max\", { value }),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n activated_price: {\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n callback_value: {\n required: t(\"orderEntry.callbackValue.error.required\"),\n min: t(\"orderEntry.callbackValue.error.min\", { value }),\n range: t(\"orderEntry.callbackValue.error.range\", {\n min,\n max,\n }),\n },\n callback_rate: {\n required: t(\"orderEntry.callbackRate.error.required\"),\n range: t(\"orderEntry.callbackRate.error.range\", {\n min,\n max,\n }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const getErrorMsg = useCallback(\n (key: Keys, customValue?: string) => {\n const { type, value, min, max } = errors?.[key] || ({} as any);\n if (type) {\n return getMessage(key, type, { value: customValue || value, min, max });\n }\n return \"\";\n },\n [errors],\n );\n\n return {\n getErrorMsg,\n };\n}\n","/**\n * SDK Version - BUMP THIS WHEN RELEASING\n * Keep in sync with root package.json version\n */\nexport const SDK_VERSION = \"2.8.15\";\n\nexport type ChangesetEntry = {\n date: string;\n title: string;\n summary: string;\n highlights: string[];\n packages: string[];\n type: \"breaking\" | \"feature\" | \"bugfix\" | \"improvement\";\n};\n\nexport type Changesets = Record<string, ChangesetEntry>;\n\n/**\n * Changesets - What's new in each version\n * ADD NEW ENTRIES WHEN BUMPING SDK_VERSION\n */\nexport const CHANGESETS: Changesets = {\n \"2.8.15\": {\n date: \"2025-11-19\",\n title: \"Portfolio volume chart and CSV data export\",\n summary:\n \"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.\",\n highlights: [\n \"New volume chart on portfolio performance component\",\n \"Fixed date range selection to properly update performance labels\",\n \"Leaderboard-style period detection for custom date ranges\",\n \"Default performance period now set to 30 days\",\n \"CSV export for portfolio and trading data\",\n \"Support for custom date range exports\",\n ],\n packages: [\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-trading\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui\",\n ],\n type: \"feature\",\n },\n \"2.8.14\": {\n date: \"2025-11-17\",\n title: \"Fixed 1D broker stats date range issue\",\n summary:\n \"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.\",\n highlights: [\n \"Fixed 1D broker stats to correctly fetch today's data only\",\n \"Properly set start_date and end_date parameters for 1D queries\",\n \"Broker stats now display accurate data for single-day periods\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.13\": {\n date: \"2025-11-13\",\n title: \"Fixed broker stats date range alignment\",\n summary:\n \"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.\",\n highlights: [\n \"Broker stats now match leaderboard date picker exactly\",\n \"Date range handling works consistently on any day\",\n \"Currency symbols ($) added to all stats values\",\n \"Removed unused brokerStats.script file for cleaner codebase\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.12\": {\n date: \"2025-11-13\",\n title: \"Updated broker stats with new endpoint\",\n summary:\n \"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.\",\n highlights: [\n \"Connected to new stats endpoint for accurate data\",\n \"Improved date range calculations for stats display\",\n \"Fixed stats data parsing from aggregated endpoint\",\n \"Better performance with optimized API calls\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.11\": {\n date: \"2025-11-12\",\n title: \"Broker stats and improved date filtering\",\n summary:\n \"Added broker trading stats dashboard and new 1D filter option with improved date range handling.\",\n highlights: [\n \"View broker stats: volume, fees, revenue, and P&L\",\n \"New 1D filter for quick analysis\",\n \"Fixed OrderlyProvider context issues\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.10\": {\n date: \"2025-11-07\",\n title: \"Your trading metrics now display correctly on the leaderboard\",\n summary:\n \"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.\",\n highlights: [\n \"Your trading volume now shows in your leaderboard row\",\n \"Realized P&L displays correctly for your account\",\n \"All your trading metrics are now visible and up to date\",\n \"Works smoothly across both the default and custom leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.9\": {\n date: \"2025-11-07\",\n title: \"Leaderboard performance improvements\",\n summary:\n \"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.\",\n highlights: [\n \"Leaderboard loads faster\",\n \"Smoother sorting and filtering experience\",\n \"More reliable data display\",\n \"Better handling of large leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.8\": {\n date: \"2025-11-07\",\n title: \"See your points and compete on the leaderboard\",\n summary:\n \"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.\",\n highlights: [\n \"View all-time points earned on the leaderboard\",\n \"Sort by trading volume, P&L, or points\",\n \"See your rank for each metric\",\n \"Faster leaderboard loading\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.7\": {\n date: \"2025-11-05\",\n title: \"Custom leaderboard periods and broker announcements\",\n summary:\n \"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.\",\n highlights: [\n \"View leaderboards for any time period you want\",\n \"Brokers can display important announcements\",\n \"Change leaderboard dates without app updates\",\n \"Campaign-specific leaderboards with custom dates\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-ui-scaffold\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-trading-leaderboard\",\n ],\n type: \"feature\",\n },\n \"2.8.6\": {\n date: \"2025-11-04\",\n title: \"Faster app and smoother trading experience\",\n summary:\n \"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.\",\n highlights: [\n \"Points display cleanly without decimals\",\n \"Withdraw form works smoothly with all networks\",\n \"Trading input fields handle decimals better\",\n \"Price data updates instantly when you return to the app\",\n \"Faster performance on slower connections\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-hooks\",\n ],\n type: \"improvement\",\n },\n \"2.8.5\": {\n date: \"2025-11-03\",\n title: \"Track your trading points on the leaderboard\",\n summary:\n \"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.\",\n highlights: [\n \"View your all-time points earned\",\n \"See points on desktop leaderboard\",\n \"Switch between Volume, P&L, and Points on mobile\",\n \"Compare your points against other traders\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-scaffold\",\n ],\n type: \"feature\",\n },\n \"2.8.4\": {\n date: \"2025-10-28\",\n title: \"Better mobile trading and Mac support\",\n summary:\n \"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.\",\n highlights: [\n \"Mobile: Right keyboard automatically appears for entering prices\",\n \"Mobile: Quick number entry for order sizes\",\n \"Mac: Fixed trackpad scrolling in dropdowns\",\n \"Know which trading pair you're canceling orders from\",\n \"Easier stop-loss and take-profit management on mobile\",\n ],\n packages: [\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui-tpsl\",\n ],\n type: \"improvement\",\n },\n \"2.8.3\": {\n date: \"2025-10-20\",\n title: \"More reliable orders and connections\",\n summary:\n \"Fixed issues with order submission and improved network stability. Your orders now process reliably.\",\n highlights: [\n \"Orders submit without errors\",\n \"Connection stays stable during network changes\",\n \"Faster recovery from connection drops\",\n ],\n packages: [\"kodiak-orderly-core\", \"kodiak-orderly-net\"],\n type: \"bugfix\",\n },\n};\n\n/**\n * Get changeset for a specific version\n * @param version - Version string (e.g., \"2.8.3\")\n * @returns ChangesetEntry or undefined if not found\n */\nexport function getChangesetForVersion(\n version: string = SDK_VERSION,\n): ChangesetEntry | undefined {\n return CHANGESETS[version];\n}\n\n/**\n * Get the latest changeset\n * @returns ChangesetEntry for current SDK_VERSION\n */\nexport function getLatestChangeset(): ChangesetEntry | undefined {\n return getChangesetForVersion(SDK_VERSION);\n}\n"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useUILocale.ts","../src/provider/appConfigContext.tsx","../src/provider/appConfigProvider.tsx","../src/provider/appStateProvider.tsx","../src/hooks/useAssetconvertEvent.ts","../src/hooks/useCurrentChainId.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useWalletStateHandle.ts","../src/provider/appStateContext.tsx","../src/hooks/useDataTap.ts","../src/common/useOrderEntryFormErrorMsg.ts","../src/constants/changesets.ts"],"names":["OrderlyConfigProvider","useTrack","UILocaleProvider","ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","useRef","useSymbolsInfo","useEventEmitter","useDebouncedCallback","useAudioPlayer","useLocalStorage","useOrderlyContext","OrderStatus","toast","i18n","AlgoOrderRootType","parseNumber","capitalizeString","transSymbolformString","getDisplaySide","side","getOrderExecutionReportMsg","data","symbolsInfo","symbol","quantity","client_order_id","fieldChanges","total_executed_quantity","status","getSymbolInfo","base_dp","quote_dp","displaySide","displaySymbol","displayQuantity","title","msg","displayTotalExecutedQuantity","algo_type","activated_price","fieldChange","jsx","jsxs","ORDERLY_ORDER_SOUND_ALERT_KEY","useExecutionReport","ee","symbolsInfoRef","notification","src","soundAutoPlay","audioElement","handler","isFilled","orderType","useMemo","useTranslation","useLocaleCode","LocaleEnum","enUS","zhCN","useUILocale","t","localeCode","calendarLocale","createContext","useContext","AppConfigContext","useAppConfig","AppConfigProvider","props","useState","useRestrictedInfo","useTrackingInstance","useWS","getTimestamp","useAssetconvertEvent","ws","unsubscribe","useChains","useConfig","useStorageChain","useWalletConnector","useCurrentChainId","defaultChain","storageChain","setStorageChain","currentChainId","setCurrentChainId","chains","networkId","connectedChain","fallbackChain","firstChain","chainId","parseJSON","useAccount","useCanLinkDevice","WALLET_KEY","useLinkDevice","disconnect","_","setLinkDeviceStorage","account","canLinkDevice","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","link","decodeBase64","base64","currentTime","expiredTime","useSettleSubscription","useSettleEvent","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","res","useSessionStorage","useWalletSubscription","useWalletEvent","recordRef","record","setRecord","id","transStatus","showToast","isPushed","prev","useKeyStore","AccountStatusEnum","SDKError","ChainNamespace","TrackerEventName","ABSTRACT_CHAIN_ID_MAP","parseChainIdToNumber","praseChainIdToNumber","windowGuard","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","brokerId","accountState","keyStore","checkChainSupport","unsupported","setUnsupported","track","setTrackUserId","currentWalletAddress","currentChain","isSupported","localAddress","error","walletState","wallet","AppStateContext","show","useAppContext","AppStateProvider","showAnnouncement","setShowAnnouncement","connectWallet","wrongNetwork","restrictedInfo","disabledConnect","memoizedValue","ExecutionReportListener","OrderlyAppProvider","components","appIcons","onChainChanged","widgetConfigs","configProps","uiLocale","useDataTap","state","useCallback","useOrderEntryFormErrorMsg","errors","getMessage","key","type","params","value","min","max","customValue","SDK_VERSION","CHANGESETS","getChangesetForVersion","version","getLatestChangeset"],"mappings":"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F,WAAY,CACV,6DACA,iEACA,+DACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,0CACP,QACE,0KACF,WAAY,CACV,yDACA,oDACA,iDACA,6DACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,yCACP,QACE,iJACF,WAAY,CACV,oDACA,qDACA,oDACA,6CACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,2CACP,QACE,mGACF,WAAY,CACV,oDACA,mCACA,sCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,SAAU,CACR,KAAM,aACN,MAAO,gEACP,QACE,4KACF,WAAY,CACV,wDACA,mDACA,0DACA,gEACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,QACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,mHACF,WAAY,CACV,2BACA,4CACA,6BACA,uCACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,iDACP,QACE,gJACF,WAAY,CACV,iDACA,yCACA,gCACA,4BACF,EACA,SAAU,CAAC,oCAAoC,EAC/C,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,sDACP,QACE,uKACF,WAAY,CACV,iDACA,8CACA,+CACA,kDACF,EACA,SAAU,CACR,2BACA,6BACA,sBACA,oCACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,6CACP,QACE,kJACF,WAAY,CACV,0CACA,iDACA,8CACA,0DACA,0CACF,EACA,SAAU,CACR,qCACA,6BACA,gCACA,sBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,+CACP,QACE,kIACF,WAAY,CACV,mCACA,oCACA,mDACA,2CACF,EACA,SAAU,CACR,qCACA,4BACF,EACA,KAAM,SACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,wCACP,QACE,0HACF,WAAY,CACV,mEACA,6CACA,6CACA,uDACA,uDACF,EACA,SAAU,CACR,6BACA,gCACA,2BACA,8BACA,wBACF,EACA,KAAM,aACR,EACA,QAAS,CACP,KAAM,aACN,MAAO,uCACP,QACE,uGACF,WAAY,CACV,+BACA,iDACA,uCACF,EACA,SAAU,CAAC,sBAAuB,oBAAoB,EACtD,KAAM,QACR,CACF,EAOO,SAASC,GACdC,EAAkBH,EACU,CAC5B,OAAOC,GAAWE,CAAO,CAC3B,CAMO,SAASC,IAAiD,CAC/D,OAAOF,GAAuBF,CAAW,CAC3C","sourcesContent":["import React, { PropsWithChildren } from \"react\";\nimport { OrderlyConfigProvider, useTrack } from \"@kodiak-finance/orderly-hooks\";\nimport {\n LocaleProvider as UILocaleProvider,\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@kodiak-finance/orderly-ui\";\nimport { OrderlyThemeProviderProps } from \"@kodiak-finance/orderly-ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { useUILocale } from \"../hooks/useUILocale\";\nimport { OrderlyAppConfig } from \"../types\";\nimport { AppConfigProvider } from \"./appConfigProvider\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appStateProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\n// Cannot be called outside of Provider because useExecutionReport requires useOrderlyContext.\nconst ExecutionReportListener: React.FC = () => {\n useExecutionReport();\n return null;\n};\n\nconst OrderlyAppProvider: React.FC<OrderlyAppProviderProps> = (props) => {\n const {\n // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\n widgetConfigs,\n ...configProps\n } = props;\n\n useTrack();\n useBootstrap();\n\n const uiLocale = useUILocale();\n\n return (\n <AppConfigProvider appIcons={appIcons} brokerName={props.brokerName!}>\n <OrderlyThemeProvider\n // dateFormatting={dateFormatting}\n components={components}\n overrides={props.overrides}\n >\n <OrderlyConfigProvider {...configProps}>\n <ExecutionReportListener />\n <AppStateProvider\n onChainChanged={onChainChanged}\n defaultChain={defaultChain}\n restrictedInfo={props.restrictedInfo}\n onRouteChange={props.onRouteChange}\n widgetConfigs={widgetConfigs}\n customAnnouncements={props.customAnnouncements}\n >\n <UILocaleProvider locale={uiLocale}>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </UILocaleProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nif (process.env.NODE_ENV !== \"production\") {\n OrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n}\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\n\nexport const useBootstrap = () => {\n useEffect(() => {\n const searchParams = new URLSearchParams(window.location.search);\n const refCode = searchParams.get(\"ref\");\n if (refCode) {\n localStorage.setItem(\"referral_code\", refCode);\n }\n }, []);\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { useEffect, useRef } from \"react\";\nimport {\n useSymbolsInfo,\n useEventEmitter,\n useDebouncedCallback,\n useAudioPlayer,\n useLocalStorage,\n useOrderlyContext,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { OrderStatus } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\n\nexport const ORDERLY_ORDER_SOUND_ALERT_KEY = \"orderly_order_sound_alert\";\n\nexport const useExecutionReport = () => {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n const { notification } = useOrderlyContext();\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const src = notification?.orderFilled?.media ?? \"\";\n\n const [soundAutoPlay] = useLocalStorage<boolean>(\n ORDERLY_ORDER_SOUND_ALERT_KEY,\n notification?.orderFilled?.defaultOpen ?? false,\n );\n\n const [audioElement] = useAudioPlayer(src, {\n autoPlay: soundAutoPlay,\n volume: 1,\n });\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg, status } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current,\n );\n const isFilled =\n status === OrderStatus.FILLED || status === OrderStatus.PARTIAL_FILLED;\n // only show latest msg for same order type\n const orderType = data.algo_type || data.type;\n if (title && msg) {\n toast.success(\n <div>\n {title}\n <br />\n <div className=\"orderly-text-white/[0.54] orderly-text-xs\">\n {msg}\n </div>\n {isFilled && audioElement}\n </div>,\n { id: orderType },\n );\n }\n };\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n return () => {\n ee.off(\"orders:changed\", handler);\n handler.cancel();\n };\n }, [ee, handler]);\n};\n","import { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderStatus, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { AlgoOrderRootType } from \"@kodiak-finance/orderly-types\";\nimport { parseNumber } from \"@kodiak-finance/orderly-ui\";\nimport {\n capitalizeString,\n transSymbolformString,\n} from \"@kodiak-finance/orderly-utils\";\n\nfunction getDisplaySide(side: string) {\n if (side === \"BUY\") {\n return i18n.t(\"common.buy\");\n } else if (side === \"SELL\") {\n return i18n.t(\"common.sell\");\n }\n return capitalizeString(side);\n}\n\ntype AlgoOrderFieldChanges = Partial<\n Record<OrderType, Partial<Record<keyof API.AlgoOrder, boolean>>>\n>;\n\nexport function getOrderExecutionReportMsg(\n data: (API.AlgoOrder | API.Order) & {\n fieldChanges?: AlgoOrderFieldChanges;\n },\n symbolsInfo: any,\n) {\n const { symbol, side, quantity, client_order_id, fieldChanges } = data;\n const total_executed_quantity =\n \"total_executed_quantity\" in data ? data.total_executed_quantity : 0;\n const status = \"status\" in data ? data.status : data.algo_status;\n const getSymbolInfo = symbolsInfo[symbol];\n const base_dp = getSymbolInfo(\"base_dp\");\n const quote_dp = getSymbolInfo(\"quote_dp\");\n const displaySide = getDisplaySide(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? i18n.t(\"tpsl.entirePosition\")\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case OrderStatus.NEW:\n const isScaledOrder = client_order_id?.startsWith(\"scaled_\");\n // if client_order_id is scaled order, show the scaled order message\n if (isScaledOrder) {\n title = i18n.t(\"orders.status.scaledSubOrderOpened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n } else {\n title = i18n.t(\"orders.status.opened.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n }\n\n break;\n case OrderStatus.FILLED:\n case OrderStatus.PARTIAL_FILLED:\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = i18n.t(\"orders.status.filled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case OrderStatus.CANCELLED:\n title = i18n.t(\"orders.status.canceled.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REJECTED:\n title = i18n.t(\"orders.status.rejected.toast.title\");\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case OrderStatus.REPLACED:\n const { algo_type, activated_price } = data as API.AlgoOrder;\n if (algo_type === AlgoOrderRootType.TRAILING_STOP) {\n const fieldChange =\n fieldChanges?.[AlgoOrderRootType.TRAILING_STOP] || {};\n // when trailing stop order is activated, and extreme_price will also changed\n if (\n fieldChange.is_activated &&\n fieldChange.extreme_price &&\n activated_price\n ) {\n title = i18n.t(\"orders.trailingStop.activated\");\n msg = `${displaySymbol} @${activated_price}`;\n } else if (fieldChange.extreme_price) {\n // if extreme_price is changed, skip show the message\n title = \"\";\n msg = \"\";\n }\n } else {\n title = i18n.t(\"orders.status.replaced.toast.title\");\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n }\n\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n status,\n };\n}\n","import { useMemo } from \"react\";\nimport {\n useTranslation,\n useLocaleCode,\n LocaleEnum,\n} from \"@kodiak-finance/orderly-i18n\";\nimport { Locale } from \"@kodiak-finance/orderly-ui\";\nimport { enUS, zhCN, ja, es, ko, vi, de, fr, nl } from \"date-fns/locale\";\n\nexport function useUILocale() {\n const { t } = useTranslation();\n const localeCode = useLocaleCode();\n\n return useMemo<Locale>(() => {\n const calendarLocale = {\n [LocaleEnum.en]: enUS,\n [LocaleEnum.zh]: zhCN,\n // [LocaleEnum.ja]: ja,\n // [LocaleEnum.es]: es,\n // [LocaleEnum.ko]: ko,\n // [LocaleEnum.vi]: vi,\n // [LocaleEnum.de]: de,\n // [LocaleEnum.fr]: fr,\n // [LocaleEnum.nl]: nl,\n };\n return {\n locale: localeCode,\n dialog: {\n ok: t(\"common.ok\"),\n cancel: t(\"common.cancel\"),\n },\n modal: {\n confirm: t(\"common.confirm\"),\n cancel: t(\"common.cancel\"),\n },\n pagination: {\n morePages: t(\"ui.pagination.morePages\"),\n rowsPerPage: t(\"ui.pagination.rowsPerPage\"),\n },\n picker: {\n selectDate: t(\"ui.picker.selectDate\"),\n dayPicker: calendarLocale[localeCode as keyof typeof calendarLocale],\n },\n empty: {\n description: t(\"ui.empty.description\"),\n },\n } as const;\n }, [t, localeCode]);\n}\n","import { createContext, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigContext = createContext({} as ThemeContextState);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n","import { FC, PropsWithChildren } from \"react\";\nimport { AppLogos } from \"../types\";\nimport { AppConfigContext } from \"./appConfigContext\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nexport const AppConfigProvider: FC<\n PropsWithChildren<{ appIcons?: AppLogos; brokerName: string }>\n> = (props) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { FC, PropsWithChildren, useState, useMemo } from \"react\";\nimport {\n RestrictedInfoOptions,\n useRestrictedInfo,\n useTrackingInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useAssetconvertEvent } from \"../hooks/useAssetconvertEvent\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { AppContextState, AppStateContext } from \"./appStateContext\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type AppStateProviderProps = {\n defaultChain?: DefaultChain;\n restrictedInfo?: RestrictedInfoOptions;\n} & Pick<\n AppContextState,\n \"onChainChanged\" | \"onRouteChange\" | \"widgetConfigs\" | \"customAnnouncements\"\n>;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props,\n) => {\n const [showAnnouncement, setShowAnnouncement] = useState(false);\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain,\n );\n useLinkDevice();\n useTrackingInstance();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useAssetconvertEvent();\n useWalletConnectError();\n\n const restrictedInfo = useRestrictedInfo(props.restrictedInfo);\n\n const disabledConnect = restrictedInfo.restrictedOpen;\n\n const memoizedValue = useMemo<AppContextState>(\n () => ({\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n disabledConnect,\n restrictedInfo,\n showAnnouncement,\n setShowAnnouncement,\n onRouteChange: props.onRouteChange,\n widgetConfigs: props.widgetConfigs,\n customAnnouncements: props.customAnnouncements,\n }),\n [\n connectWallet,\n currentChainId,\n disabledConnect,\n props.onChainChanged,\n restrictedInfo,\n setCurrentChainId,\n showAnnouncement,\n wrongNetwork,\n props.onRouteChange,\n props.widgetConfigs,\n props.customAnnouncements,\n ],\n );\n\n return (\n <AppStateContext.Provider value={memoizedValue}>\n {props.children}\n </AppStateContext.Provider>\n );\n};\n","import { useEffect } from \"react\";\nimport { useWS } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport const useAssetconvertEvent = () => {\n const ws = useWS();\n const { t } = useTranslation();\n useEffect(() => {\n const unsubscribe = ws.privateSubscribe(\n {\n id: \"assetconvert\",\n event: \"subscribe\",\n topic: \"assetconvert\",\n ts: getTimestamp(),\n },\n {\n onMessage(data) {\n if (data.convertId) {\n toast.success(t(\"transfer.convert.completed\"));\n }\n },\n },\n );\n return () => unsubscribe();\n }, []);\n};\n","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useStorageChain,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { Chain, NetworkId } from \"@kodiak-finance/orderly-types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const { storageChain, setStorageChain } = useStorageChain();\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n if (storageChain) {\n setCurrentChainId?.(storageChain.chainId);\n } else {\n setStorageChain(chainId);\n setCurrentChainId?.(chainId);\n \n }\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { useEffect } from \"react\";\nimport {\n parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { ChainNamespace } from \"@kodiak-finance/orderly-types\";\nimport { useCanLinkDevice } from \"@kodiak-finance/orderly-ui\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage,\n );\n\n const { account } = useAccount();\n const canLinkDevice = useCanLinkDevice();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n // use set instead of append, because the param possibly in the url\n url.searchParams.set(\"utm_medium\", \"qrcode\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (canLinkDevice && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, canLinkDevice]);\n\n const autoLinkDevice = async () => {\n // Only auto-link if device linking data exists in storage AND it's actually a linkable device\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (canLinkDevice && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!,\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, canLinkDevice, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { useSettleSubscription } from \"@kodiak-finance/orderly-hooks\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useSettleEvent() {\n const { t } = useTranslation();\n\n useSettleSubscription({\n onMessage: (data: any) => {\n const { status } = data;\n\n // console.log(\"settle ws: \", data);\n\n switch (status) {\n case \"COMPLETED\":\n toast.success(t(\"settle.settlement.completed\"));\n break;\n case \"FAILED\":\n toast.error(t(\"settle.settlement.failed\"));\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@kodiak-finance/orderly-hooks\";\nimport { useEffect } from \"react\";\nimport { modal, toast } from \"@kodiak-finance/orderly-ui\";\nimport { LedgerWalletKey } from \"@kodiak-finance/orderly-types\";\nimport { useStorageLedgerAddress } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport function useWalletConnectError() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n const { setLedgerAddress } = useStorageLedgerAddress();\n\n useEffect(() => {\n ee.on(\"wallet:connect-error\", (data) => {\n toast.error(data.message);\n });\n ee.on(\n \"wallet:sign-message-with-ledger-error\",\n (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n modal\n .confirm({\n title: t(\"connector.ledger.signMessageFailed\"),\n content: t(\"connector.ledger.signMessageFailed.description\"),\n size: \"sm\",\n onOk: async () => {\n console.log(\"-- use ledger\", true);\n setLedgerAddress(data.userAddress);\n\n return Promise.resolve();\n },\n okLabel: t(\"common.ok\"),\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: t(\"common.no\"),\n })\n .then((res) => {\n console.log(\"-- dialog res\", res);\n });\n });\n }\n );\n }, [ee, t]);\n\n return {};\n}\n","import { useRef } from \"react\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { capitalizeString } from \"@kodiak-finance/orderly-utils\";\n\nexport function useWalletEvent() {\n const { t } = useTranslation();\n const ee = useEventEmitter();\n\n const recordRef = useRef<Record<number, boolean>>({});\n\n const [record, setRecord] = useSessionStorage(\n \"orderly_wallet_change_id\",\n {} as Record<number, boolean>,\n );\n\n recordRef.current = record;\n\n useWalletSubscription({\n onMessage: (data: any) => {\n console.log(\"wallet:changed\", data);\n const { id, side, transStatus } = data;\n let showToast = true;\n\n // DEPOSIT and WITHDRAW will push twice COMPLETED and FAILED event\n if (\n [\"DEPOSIT\", \"WITHDRAW\"].includes(side) &&\n [\"COMPLETED\", \"FAILED\"].includes(transStatus)\n ) {\n const isPushed = !!recordRef.current[id];\n if (!isPushed) {\n recordRef.current[id] = true;\n setRecord((prev: Record<number, boolean>) => ({\n ...prev,\n [id]: true,\n }));\n }\n showToast = !isPushed;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.completed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.completed\");\n }\n\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n\n if (side === \"DEPOSIT\") {\n msg = t(\"transfer.deposit.failed\");\n } else if (side === \"WITHDRAW\") {\n msg = t(\"transfer.withdraw.failed\");\n }\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport {\n useConfig,\n useEventEmitter,\n useTrack,\n WalletState,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@kodiak-finance/orderly-hooks\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n TrackerEventName,\n ABSTRACT_CHAIN_ID_MAP,\n} from \"@kodiak-finance/orderly-types\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@kodiak-finance/orderly-utils\";\nimport { getLinkDeviceData } from \"./useLinkDevice\";\n\nconst WALLET_KEY = \"orderly:wallet-info\";\nconst CHAIN_NAMESPACE = \"orderly:chain-namespace\";\n\nexport const useWalletStateHandle = (options: {\n // onChainChanged?: (chainId: number, isTestnet: boolean) => void;\n currentChainId?: number;\n}) => {\n const {\n wallet: connectedWallet,\n connect,\n connectedChain,\n disconnect,\n namespace,\n } = useWalletConnector();\n //\n // console.log(\"🔗 wallet state handle\", {\n // connectedWallet,\n // connectedChain,\n // namespace,\n // });\n\n if (typeof connect !== \"function\") {\n throw new SDKError(\"Please provide a wallet connector provider\");\n }\n\n const ee = useEventEmitter();\n const isManualConnect = useRef<boolean>(false);\n const brokerId = useConfig(\"brokerId\");\n const { account, state: accountState } = useAccount();\n const keyStore = useKeyStore();\n const networkId = useConfig(\"networkId\") as NetworkId;\n const [chains, { checkChainSupport }] = useChains();\n\n const [unsupported, setUnsupported] = useState(false);\n const { track, setTrackUserId } = useTrack();\n\n // current connected wallet address\n const currentWalletAddress = useMemo<string | undefined>(() => {\n return connectedWallet?.accounts?.[0]?.address;\n }, [connectedWallet]);\n\n // current connected chain id\n const currentChain = useMemo<\n { id: number; namespace: string } | undefined\n >(() => {\n const id = connectedWallet?.chains?.[0]?.id;\n const namespace = connectedWallet?.chains?.[0]?.namespace as string;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (\n accountState.status >= AccountStatusEnum.EnableTrading &&\n account.accountId\n ) {\n setTrackUserId(account.accountId!);\n }\n }, [account, accountState]);\n\n useEffect(() => {\n if (!connectedChain) {\n setUnsupported(false);\n return;\n }\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId,\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n if (\n ABSTRACT_CHAIN_ID_MAP.has(parseInt(connectedChain.id as string)) &&\n connectedWallet?.label !== \"AGW\"\n ) {\n isSupported = false;\n }\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId, connectedWallet]);\n\n useEffect(() => {\n // if (unsupported) return;\n\n windowGuard(() => {\n const localAddress = keyStore.getAddress();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n\n /**\n * if locale address is exist, restore account state\n */\n if (connectedChain?.namespace === ChainNamespace.solana) {\n return;\n }\n if (\n localAddress &&\n account.address !== localAddress &&\n walletInfo.label\n ) {\n connect({\n autoSelect: {\n label: walletInfo.label,\n disableModals: true,\n },\n }).then(\n (res) => {\n console.log(\"silent connect wallet successes\", res);\n },\n (error) => console.log(\"connect error\", error),\n );\n }\n });\n }, [connectedWallet, account.address]);\n\n /**\n * handle wallet connection\n */\n useEffect(() => {\n if (\n connectedWallet === null &&\n accountState.status > AccountStatusEnum.NotConnected &&\n !accountState.validating\n ) {\n account.disconnect();\n return;\n }\n\n if (unsupported || !connectedChain) return;\n if (isManualConnect.current) return;\n\n const linkData = getLinkDeviceData();\n\n // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (\n !!currentWalletAddress &&\n currentWalletAddress !== account.address &&\n !linkData\n ) {\n account.setAddress(currentWalletAddress, {\n provider: connectedWallet?.provider,\n chain: {\n id: praseChainIdToNumber(currentChain!.id),\n namespace: currentChain!.namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: connectedWallet?.label ?? \"\",\n },\n additionalInfo: connectedWallet?.additionalInfo ?? {},\n });\n track(TrackerEventName.walletConnect, {\n wallet: connectedWallet?.label ?? \"\",\n network: currentChain!.namespace.toUpperCase() as ChainNamespace,\n });\n\n // save wallet connector info to local storage\n windowGuard(() => {\n localStorage.setItem(\n WALLET_KEY,\n JSON.stringify({\n label: connectedWallet?.label ?? \"\",\n }),\n );\n });\n }\n\n /**\n * switch chainId\n */\n if (currentChain?.id !== account.chainId) {\n account.switchChainId(currentChain?.id!);\n\n // emit chain changed event\n // options.onChainChanged?.(currentChainId!, isTestnet(networkId));\n }\n }, [\n connectedWallet,\n connectedChain,\n currentWalletAddress,\n currentChain,\n account.address,\n accountState,\n account.chainId,\n unsupported,\n ]);\n\n /**\n * User manually connects to wallet\n */\n const connectWallet = async (): Promise<{\n wallet?: WalletState;\n status?: AccountStatusEnum;\n wrongNetwork?: boolean;\n } | null> => {\n isManualConnect.current = true;\n // const walletState = await connect();\n\n return connect({ chainId: options.currentChainId })\n .then(async (walletState) => {\n if (\n Array.isArray(walletState) &&\n walletState.length > 0 &&\n walletState[0] &&\n walletState[0].accounts.length > 0\n ) {\n const wallet = walletState[0];\n const chainId = praseChainIdToNumber(wallet.chains[0].id);\n\n if (!checkChainSupport(chainId, networkId)) {\n return {\n wrongNetwork: true,\n };\n }\n //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_link_device\");\n await account.disconnect();\n }\n\n const status = await account.setAddress(wallet.accounts[0].address, {\n provider: wallet.provider,\n chain: {\n id: praseChainIdToNumber(wallet.chains[0].id),\n namespace:\n wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n },\n wallet: {\n name: wallet.label,\n },\n // label: ,\n });\n track(TrackerEventName.walletConnect, {\n wallet: wallet.label,\n network: wallet.chains[0].namespace.toUpperCase() as ChainNamespace,\n });\n console.log(\"-- xxxxxx status\", status);\n\n return { wallet, status, wrongNetwork: false };\n }\n\n return null;\n })\n .finally(() => {\n isManualConnect.current = false;\n });\n };\n\n return {\n connectWallet,\n wrongNetwork: unsupported,\n };\n};\n","import React, { createContext, useContext } from \"react\";\nimport { RestrictedInfoReturns } from \"@kodiak-finance/orderly-hooks\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\n\nexport type RouteOption = {\n href: \"/portfolio\" | \"/portfolio/history\";\n name: string;\n};\n\nexport type WidgetConfigs = {\n scanQRCode?: {\n onSuccess?: (url: string) => void;\n };\n};\n\nexport type AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: boolean;\n disabledConnect: boolean;\n currentChainId: number | undefined;\n setCurrentChainId: (chainId: number | undefined) => void;\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean },\n ) => void;\n // networkStatus: ReturnType<typeof useAppState>[\"networkStatus\"];\n restrictedInfo: RestrictedInfoReturns;\n showAnnouncement: boolean;\n setShowAnnouncement: (show: boolean) => void;\n onRouteChange?: (option: RouteOption) => void;\n widgetConfigs?: WidgetConfigs;\n /** Custom announcements to merge with API announcements */\n customAnnouncements?: API.AnnouncementRow[];\n};\n\nexport const AppStateContext = createContext<AppContextState>({\n setCurrentChainId: (chainId?: number) => {},\n restrictedInfo: {},\n setShowAnnouncement: (show: boolean) => {},\n} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppStateContext);\n};\n","import { useAccount } from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { useAppContext } from \"../provider/appStateContext\";\n\nexport const useDataTap = <T = any>(\n data: T,\n options?: {\n skip?: false;\n fallbackData?: T;\n accountStatus?: AccountStatusEnum;\n },\n): T | null => {\n const { wrongNetwork, disabledConnect } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) {\n return data;\n }\n\n if (wrongNetwork || disabledConnect) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n\n if (typeof options?.accountStatus !== \"undefined\") {\n if (state.status < options.accountStatus) {\n return typeof options?.fallbackData !== \"undefined\"\n ? options.fallbackData\n : null;\n }\n }\n\n // return wrongNetwork\n // ? typeof options?.fallbackData !== \"undefined\"\n // ? options.fallbackData\n // : null\n // : data;\n //\n return data;\n};\n","import { useCallback } from \"react\";\nimport {\n OrderValidationItem,\n OrderValidationResult,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\ntype Keys = keyof OrderValidationResult;\ntype ErrorType = Partial<OrderValidationItem[\"type\"]>;\n\nexport function useOrderEntryFormErrorMsg(\n errors: OrderValidationResult | null,\n) {\n const { t } = useTranslation();\n\n const getMessage = (\n key: Keys,\n type: ErrorType,\n params: {\n value?: string | number;\n min?: string | number;\n max?: string | number;\n },\n ) => {\n const { value, min, max } = params || {};\n const map: Partial<Record<Keys, Partial<Record<ErrorType, string>>>> = {\n quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_quantity: {\n required: t(\"orderEntry.orderQuantity.error.required\"),\n min: t(\"orderEntry.orderQuantity.error.min\", { value }),\n max: t(\"orderEntry.orderQuantity.error.max\", { value }),\n },\n order_price: {\n required: t(\"orderEntry.orderPrice.error.required\"),\n min: t(\"orderEntry.orderPrice.error.min\", { value }),\n max: t(\"orderEntry.orderPrice.error.max\", { value }),\n },\n trigger_price: {\n required: t(\"orderEntry.triggerPrice.error.required\"),\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n tp_trigger_price: {\n required: t(\"tpsl.validate.tpTriggerPrice.error.required\"),\n min: t(\"orderEntry.tpTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.tpTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.tpTriggerPrice.error.priceErrorMax\"),\n },\n sl_trigger_price: {\n required: t(\"tpsl.validate.slTriggerPrice.error.required\"),\n min: t(\"orderEntry.slTriggerPrice.error.min\", { value }),\n max: t(\"orderEntry.slTriggerPrice.error.max\", { value }),\n priceErrorMin: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMin\"),\n priceErrorMax: t(\"tpsl.validate.slTriggerPrice.error.priceErrorMax\"),\n },\n tp_order_price: {\n required: t(\"tpsl.validate.tpOrderPrice.error.required\"),\n min: t(\"tpsl.validate.tpOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.tpOrderPrice.error.max\", { value }),\n },\n sl_order_price: {\n required: t(\"tpsl.validate.slOrderPrice.error.required\"),\n min: t(\"tpsl.validate.slOrderPrice.error.min\", { value }),\n max: t(\"tpsl.validate.slOrderPrice.error.max\", { value }),\n },\n total: {\n min: t(\"orderEntry.total.error.min\", { value }),\n },\n // not show form input tooltip\n // slippage: {\n // max: t(\"orderEntry.slippage.error.max\"),\n // },\n start_price: {\n required: t(\"orderEntry.startPrice.error.required\"),\n min: t(\"orderEntry.startPrice.error.min\", { value }),\n max: t(\"orderEntry.startPrice.error.max\", { value }),\n },\n end_price: {\n required: t(\"orderEntry.endPrice.error.required\"),\n min: t(\"orderEntry.endPrice.error.min\", { value }),\n max: t(\"orderEntry.endPrice.error.max\", { value }),\n },\n total_orders: {\n required: t(\"orderEntry.totalOrders.error.required\"),\n range: t(\"orderEntry.totalOrders.error.range\"),\n },\n skew: {\n required: t(\"orderEntry.skew.error.required\"),\n min: t(\"orderEntry.skew.error.min\", { value }),\n max: t(\"orderEntry.skew.error.max\", { value }),\n },\n activated_price: {\n min: t(\"orderEntry.triggerPrice.error.min\", { value }),\n max: t(\"orderEntry.triggerPrice.error.max\", { value }),\n },\n callback_value: {\n required: t(\"orderEntry.callbackValue.error.required\"),\n min: t(\"orderEntry.callbackValue.error.min\", { value }),\n range: t(\"orderEntry.callbackValue.error.range\", {\n min,\n max,\n }),\n },\n callback_rate: {\n required: t(\"orderEntry.callbackRate.error.required\"),\n range: t(\"orderEntry.callbackRate.error.range\", {\n min,\n max,\n }),\n },\n };\n\n return map[key]?.[type] || \"\";\n };\n\n const getErrorMsg = useCallback(\n (key: Keys, customValue?: string) => {\n const { type, value, min, max } = errors?.[key] || ({} as any);\n if (type) {\n return getMessage(key, type, { value: customValue || value, min, max });\n }\n return \"\";\n },\n [errors],\n );\n\n return {\n getErrorMsg,\n };\n}\n","/**\n * SDK Version - BUMP THIS WHEN RELEASING\n * Keep in sync with root package.json version\n */\nexport const SDK_VERSION = \"2.8.17\";\n\nexport type ChangesetEntry = {\n date: string;\n title: string;\n summary: string;\n highlights: string[];\n packages: string[];\n type: \"breaking\" | \"feature\" | \"bugfix\" | \"improvement\";\n};\n\nexport type Changesets = Record<string, ChangesetEntry>;\n\n/**\n * Changesets - What's new in each version\n * ADD NEW ENTRIES WHEN BUMPING SDK_VERSION\n */\nexport const CHANGESETS: Changesets = {\n \"2.8.17\": {\n date: \"2025-11-29\",\n title: \"Symbol performance analysis\",\n summary:\n \"New symbol performance analysis feature with comprehensive per-symbol trading metrics and visualization.\",\n highlights: [\n \"New symbol-specific performance analytics dashboard\",\n \"View detailed P&L, volume, and fees for individual symbols\",\n \"Symbol performance tracking with customizable date ranges\",\n \"Comprehensive performance visualization per trading symbol\",\n ],\n packages: [\"kodiak-orderly-portfolio\"],\n type: \"feature\",\n },\n \"2.8.16\": {\n date: \"2025-11-29\",\n title: \"Fixed funded account address reversion issue\",\n summary:\n \"Restored isMobile guard in device linking to prevent funded accounts from reverting to wallet address. Fixes auto-sync behavior that was causing address switching issues.\",\n highlights: [\n \"Restored isMobile guard in useLinkDevice to prevent unintended auto-sync\",\n \"Fixed funded account address reverting to MetaMask\",\n \"Maintains device linking functionality for mobile devices\",\n \"Prevents auto-sync from being triggered on all devices\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-types\",\n \"kodiak-orderly-utils\",\n ],\n type: \"bugfix\",\n },\n \"2.8.15\": {\n date: \"2025-11-19\",\n title: \"Portfolio volume chart and CSV data export\",\n summary:\n \"Added volume tracking chart to portfolio performance metrics and improved date range handling. New CSV export functionality for trading data with support for custom date ranges.\",\n highlights: [\n \"New volume chart on portfolio performance component\",\n \"Fixed date range selection to properly update performance labels\",\n \"Leaderboard-style period detection for custom date ranges\",\n \"Default performance period now set to 30 days\",\n \"CSV export for portfolio and trading data\",\n \"Support for custom date range exports\",\n ],\n packages: [\n \"kodiak-orderly-portfolio\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-hooks\",\n \"kodiak-orderly-trading\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui\",\n ],\n type: \"feature\",\n },\n \"2.8.14\": {\n date: \"2025-11-17\",\n title: \"Fixed 1D broker stats date range issue\",\n summary:\n \"Fixed issue where 1D (1 day) broker stats were returning incorrect data by properly setting start_date and end_date to current date.\",\n highlights: [\n \"Fixed 1D broker stats to correctly fetch today's data only\",\n \"Properly set start_date and end_date parameters for 1D queries\",\n \"Broker stats now display accurate data for single-day periods\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.13\": {\n date: \"2025-11-13\",\n title: \"Fixed broker stats date range alignment\",\n summary:\n \"Fixed broker stats to use the exact date range from the leaderboard date picker, ensuring consistent behavior across all dates. Added currency symbols to stats values.\",\n highlights: [\n \"Broker stats now match leaderboard date picker exactly\",\n \"Date range handling works consistently on any day\",\n \"Currency symbols ($) added to all stats values\",\n \"Removed unused brokerStats.script file for cleaner codebase\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.12\": {\n date: \"2025-11-13\",\n title: \"Updated broker stats with new endpoint\",\n summary:\n \"Integrated new staging backend stats endpoint for real-time broker statistics with improved date range handling and accurate data aggregation.\",\n highlights: [\n \"Connected to new stats endpoint for accurate data\",\n \"Improved date range calculations for stats display\",\n \"Fixed stats data parsing from aggregated endpoint\",\n \"Better performance with optimized API calls\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.11\": {\n date: \"2025-11-12\",\n title: \"Broker stats and improved date filtering\",\n summary:\n \"Added broker trading stats dashboard and new 1D filter option with improved date range handling.\",\n highlights: [\n \"View broker stats: volume, fees, revenue, and P&L\",\n \"New 1D filter for quick analysis\",\n \"Fixed OrderlyProvider context issues\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.10\": {\n date: \"2025-11-07\",\n title: \"Your trading metrics now display correctly on the leaderboard\",\n summary:\n \"Fixed an issue where your trading volume and P&L weren't showing on your leaderboard row. Your trading stats now display accurately so you can see your real performance.\",\n highlights: [\n \"Your trading volume now shows in your leaderboard row\",\n \"Realized P&L displays correctly for your account\",\n \"All your trading metrics are now visible and up to date\",\n \"Works smoothly across both the default and custom leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"bugfix\",\n },\n \"2.8.9\": {\n date: \"2025-11-07\",\n title: \"Leaderboard performance improvements\",\n summary:\n \"Made the leaderboard faster and more reliable. Your rankings now load quicker and metrics display more smoothly.\",\n highlights: [\n \"Leaderboard loads faster\",\n \"Smoother sorting and filtering experience\",\n \"More reliable data display\",\n \"Better handling of large leaderboards\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"improvement\",\n },\n \"2.8.8\": {\n date: \"2025-11-07\",\n title: \"See your points and compete on the leaderboard\",\n summary:\n \"You can now compete by trading volume, profit/loss, or all-time points. Sort and compare your performance against other traders in real-time.\",\n highlights: [\n \"View all-time points earned on the leaderboard\",\n \"Sort by trading volume, P&L, or points\",\n \"See your rank for each metric\",\n \"Faster leaderboard loading\",\n ],\n packages: [\"kodiak-orderly-trading-leaderboard\"],\n type: \"feature\",\n },\n \"2.8.7\": {\n date: \"2025-11-05\",\n title: \"Custom leaderboard periods and broker announcements\",\n summary:\n \"Brokers can now show custom messages in announcement and set flexible date ranges for leaderboards. View any time period - daily, weekly, monthly, or custom ranges.\",\n highlights: [\n \"View leaderboards for any time period you want\",\n \"Brokers can display important announcements\",\n \"Change leaderboard dates without app updates\",\n \"Campaign-specific leaderboards with custom dates\",\n ],\n packages: [\n \"kodiak-orderly-react-app\",\n \"kodiak-orderly-ui-scaffold\",\n \"kodiak-orderly-i18n\",\n \"kodiak-orderly-trading-leaderboard\",\n ],\n type: \"feature\",\n },\n \"2.8.6\": {\n date: \"2025-11-04\",\n title: \"Faster app and smoother trading experience\",\n summary:\n \"Fixed performance issues and improved the user experience. Trading is now smoother and the app responds faster when you switch between screens.\",\n highlights: [\n \"Points display cleanly without decimals\",\n \"Withdraw form works smoothly with all networks\",\n \"Trading input fields handle decimals better\",\n \"Price data updates instantly when you return to the app\",\n \"Faster performance on slower connections\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-hooks\",\n ],\n type: \"improvement\",\n },\n \"2.8.5\": {\n date: \"2025-11-03\",\n title: \"Track your trading points on the leaderboard\",\n summary:\n \"Your all-time trading points are now displayed on the leaderboard. Compete based on the points you earn and see where you rank.\",\n highlights: [\n \"View your all-time points earned\",\n \"See points on desktop leaderboard\",\n \"Switch between Volume, P&L, and Points on mobile\",\n \"Compare your points against other traders\",\n ],\n packages: [\n \"kodiak-orderly-trading-leaderboard\",\n \"kodiak-orderly-ui-scaffold\",\n ],\n type: \"feature\",\n },\n \"2.8.4\": {\n date: \"2025-10-28\",\n title: \"Better mobile trading and Mac support\",\n summary:\n \"Trading on mobile is now easier and faster. Fixed issues on Mac and improved the overall experience across all devices.\",\n highlights: [\n \"Mobile: Right keyboard automatically appears for entering prices\",\n \"Mobile: Quick number entry for order sizes\",\n \"Mac: Fixed trackpad scrolling in dropdowns\",\n \"Know which trading pair you're canceling orders from\",\n \"Easier stop-loss and take-profit management on mobile\",\n ],\n packages: [\n \"kodiak-orderly-ui-transfer\",\n \"kodiak-orderly-ui-order-entry\",\n \"kodiak-orderly-ui-orders\",\n \"kodiak-orderly-ui-positions\",\n \"kodiak-orderly-ui-tpsl\",\n ],\n type: \"improvement\",\n },\n \"2.8.3\": {\n date: \"2025-10-20\",\n title: \"More reliable orders and connections\",\n summary:\n \"Fixed issues with order submission and improved network stability. Your orders now process reliably.\",\n highlights: [\n \"Orders submit without errors\",\n \"Connection stays stable during network changes\",\n \"Faster recovery from connection drops\",\n ],\n packages: [\"kodiak-orderly-core\", \"kodiak-orderly-net\"],\n type: \"bugfix\",\n },\n};\n\n/**\n * Get changeset for a specific version\n * @param version - Version string (e.g., \"2.8.3\")\n * @returns ChangesetEntry or undefined if not found\n */\nexport function getChangesetForVersion(\n version: string = SDK_VERSION,\n): ChangesetEntry | undefined {\n return CHANGESETS[version];\n}\n\n/**\n * Get the latest changeset\n * @returns ChangesetEntry for current SDK_VERSION\n */\nexport function getLatestChangeset(): ChangesetEntry | undefined {\n return getChangesetForVersion(SDK_VERSION);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kodiak-finance/orderly-react-app",
3
- "version": "2.8.16",
3
+ "version": "2.8.17",
4
4
  "description": "Create React App with Orderly Network components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -18,11 +18,11 @@
18
18
  },
19
19
  "dependencies": {
20
20
  "date-fns": "^3.6.0",
21
- "@kodiak-finance/orderly-ui": "2.8.16",
22
- "@kodiak-finance/orderly-hooks": "2.8.16",
23
- "@kodiak-finance/orderly-i18n": "2.8.16",
24
- "@kodiak-finance/orderly-utils": "2.8.16",
25
- "@kodiak-finance/orderly-types": "2.8.16"
21
+ "@kodiak-finance/orderly-ui": "2.8.17",
22
+ "@kodiak-finance/orderly-hooks": "2.8.17",
23
+ "@kodiak-finance/orderly-i18n": "2.8.17",
24
+ "@kodiak-finance/orderly-utils": "2.8.17",
25
+ "@kodiak-finance/orderly-types": "2.8.17"
26
26
  },
27
27
  "devDependencies": {
28
28
  "@types/react": "^18.3.2",
@@ -31,7 +31,7 @@
31
31
  "react-dom": "^18.2.0",
32
32
  "tailwindcss": "^3.4.4",
33
33
  "tsup": "^7.3.0",
34
- "tsconfig": "0.11.15"
34
+ "tsconfig": "0.11.16"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "react": ">=18",