@orderly.network/react-app 2.0.1 → 2.0.2

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
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode, ComponentType, PropsWithChildren } from 'react';
3
- import { ConfigProviderProps, ConfigProviderExclusionProps, WalletState } from '@orderly.network/hooks';
3
+ import { ConfigProviderProps, ExclusiveConfigProviderProps, WalletState, IRestrictedAreasParams, RestrictedAreasReturns } from '@orderly.network/hooks';
4
4
  import { ExtensionPosition } from '@orderly.network/ui';
5
5
  import { AccountStatusEnum } from '@orderly.network/types';
6
6
  import { OrderlyThemeProviderProps } from '@orderly.network/ui/src/provider/orderlyThemeProvider';
@@ -20,7 +20,7 @@ type OrderlyAppConfig = {
20
20
  components?: {
21
21
  [position in ExtensionPosition]: ComponentType;
22
22
  };
23
- } & Partial<Omit<ConfigProviderProps, "brokerId" | "brokerName" | "configStore" | "networkId">> & ConfigProviderExclusionProps;
23
+ } & Partial<Omit<ConfigProviderProps, "brokerId" | "brokerName" | "configStore" | "networkId">> & ExclusiveConfigProviderProps;
24
24
 
25
25
  declare const useWalletStateHandle: (options: {
26
26
  currentChainId?: number;
@@ -45,6 +45,7 @@ type AppContextState = {
45
45
  isTestnet: boolean;
46
46
  isWalletConnected: boolean;
47
47
  }) => void;
48
+ restrictedInfo?: RestrictedAreasReturns;
48
49
  };
49
50
  declare const useAppContext: () => AppContextState;
50
51
  type AppStateProviderProps = {
@@ -52,6 +53,7 @@ type AppStateProviderProps = {
52
53
  isTestnet: boolean;
53
54
  isWalletConnected: boolean;
54
55
  }) => void;
56
+ restrictedInfo?: IRestrictedAreasParams;
55
57
  };
56
58
 
57
59
  type OrderlyAppProviderProps = PropsWithChildren<OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps>;
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { ReactNode, ComponentType, PropsWithChildren } from 'react';
3
- import { ConfigProviderProps, ConfigProviderExclusionProps, WalletState } from '@orderly.network/hooks';
3
+ import { ConfigProviderProps, ExclusiveConfigProviderProps, WalletState, IRestrictedAreasParams, RestrictedAreasReturns } from '@orderly.network/hooks';
4
4
  import { ExtensionPosition } from '@orderly.network/ui';
5
5
  import { AccountStatusEnum } from '@orderly.network/types';
6
6
  import { OrderlyThemeProviderProps } from '@orderly.network/ui/src/provider/orderlyThemeProvider';
@@ -20,7 +20,7 @@ type OrderlyAppConfig = {
20
20
  components?: {
21
21
  [position in ExtensionPosition]: ComponentType;
22
22
  };
23
- } & Partial<Omit<ConfigProviderProps, "brokerId" | "brokerName" | "configStore" | "networkId">> & ConfigProviderExclusionProps;
23
+ } & Partial<Omit<ConfigProviderProps, "brokerId" | "brokerName" | "configStore" | "networkId">> & ExclusiveConfigProviderProps;
24
24
 
25
25
  declare const useWalletStateHandle: (options: {
26
26
  currentChainId?: number;
@@ -45,6 +45,7 @@ type AppContextState = {
45
45
  isTestnet: boolean;
46
46
  isWalletConnected: boolean;
47
47
  }) => void;
48
+ restrictedInfo?: RestrictedAreasReturns;
48
49
  };
49
50
  declare const useAppContext: () => AppContextState;
50
51
  type AppStateProviderProps = {
@@ -52,6 +53,7 @@ type AppStateProviderProps = {
52
53
  isTestnet: boolean;
53
54
  isWalletConnected: boolean;
54
55
  }) => void;
56
+ restrictedInfo?: IRestrictedAreasParams;
55
57
  };
56
58
 
57
59
  type OrderlyAppProviderProps = PropsWithChildren<OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps>;
package/dist/index.js CHANGED
@@ -7,11 +7,11 @@ var utils = require('@orderly.network/utils');
7
7
  var types = require('@orderly.network/types');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
 
10
- var x=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var I="orderly:wallet-info";var T=t=>{let{wallet:e,connect:n,connectedChain:r,disconnect:c,namespace:f}=hooks.useWalletConnector();if(typeof n!="function")throw new types.SDKError("Please provide a wallet connector provider");let l=react.useRef(!1),{account:o,state:s}=hooks.useAccount(),a=hooks.useKeyStore(),m=hooks.useConfig("networkId"),[h,{checkChainSupport:p}]=hooks.useChains(),[u,y]=react.useState(!1),P=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),g=react.useMemo(()=>{let i=e?.chains?.[0]?.id,d=e?.chains?.[0]?.namespace;if(!(typeof i>"u"))return {id:utils.parseChainIdToNumber(i),namespace:d}},[e]);return react.useEffect(()=>{if(!r)return;let i=p(r.id,m);y(!i);},[r,h,p,m]),react.useEffect(()=>{utils.windowGuard(()=>{let i=a.getAddress(),d=JSON.parse(localStorage.getItem(I)??"{}");r?.namespace!==types.ChainNamespace.solana&&i&&o.address!==i&&d.label&&n({autoSelect:{label:d.label,disableModals:!0}}).then(A=>{},A=>{});});},[e,o.address]),react.useEffect(()=>{if(e===null&&s.status>types.AccountStatusEnum.NotConnected&&!s.validating){o.disconnect();return}u||!r||l.current||(P&&P!==o.address&&(o.setAddress(P,{provider:e?.provider,chain:{id:utils.praseChainIdToNumber(g.id),namespace:g.namespace.toUpperCase()},wallet:{name:e.label}}),utils.windowGuard(()=>{localStorage.setItem(I,JSON.stringify({label:e.label}));})),g?.id!==o.chainId&&o.switchChainId(g?.id));},[e,r,P,g,o.address,s,o.chainId,u]),{connectWallet:async()=>(l.current=!0,n({chainId:t.currentChainId}).then(async i=>{if(Array.isArray(i)&&i.length>0&&i[0]&&i[0].accounts.length>0){let d=i[0],A=utils.praseChainIdToNumber(d.chains[0].id);if(!p(A,m))return {wrongNetwork:!0};if(!o)throw new Error("account is not initialized");let K=await o.setAddress(d.accounts[0].address,{provider:d.provider,chain:{id:utils.praseChainIdToNumber(d.chains[0].id),namespace:d.chains[0].namespace.toUpperCase()},wallet:{name:d.label}});return {wallet:d,status:K,wrongNetwork:!1}}return null}).finally(()=>{l.current=!1;})),wrongNetwork:u}};function W(){let t=hooks.useEventEmitter(),e=react.useRef({}),[n,r]=hooks.useSessionStorage("orderly_wallet_change_id",{});e.current=n,hooks.useWalletSubscription({onMessage:c=>{let{id:f,side:l,transStatus:o}=c,s=!0;if(["DEPOSIT","WITHDRAW"].includes(l)&&["COMPLETED","FAILED"].includes(o)){let a=e.current[f];r({...n,[f]:a?void 0:!0}),s=!a;}if(o==="COMPLETED"&&s){let a=`${utils.capitalizeString(l)} completed`;ui.toast.success(a);}else if(o==="FAILED"&&s){let a=`${utils.capitalizeString(l)} failed`;ui.toast.error(a);}t.emit("wallet:changed",c);}});}function D(){hooks.useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":ui.toast.success("Settlement completed");break;case"FAILED":ui.toast.error("Settlement failed");break;}}});}function L(){let t=hooks.useEventEmitter();return react.useEffect(()=>{t.on("wallet:connect-error",e=>{ui.toast.error(e.message);});},[t]),{}}var R=react.createContext({}),v=()=>react.useContext(R),_=t=>{let[e,n]=react.useState(),{connectWallet:r,wrongNetwork:c}=T({currentChainId:e});return W(),D(),L(),jsxRuntime.jsx(R.Provider,{value:{connectWallet:r,wrongNetwork:c,currentChainId:e,setCurrentChainId:n,onChainChanged:t.onChainChanged},children:t.children})};var $=react.createContext({}),Pe=()=>react.useContext($),M=t=>jsxRuntime.jsx($.Provider,{value:t,children:t.children});function H(t,e){let{symbol:n,side:r,quantity:c}=t,f="total_executed_quantity"in t?t.total_executed_quantity:0,l="status"in t?t.status:t.algo_status,o=e[n],s=o("base_dp"),a=utils.capitalizeString(r),m=utils.transSymbolformString(n),h="algo_type"in t&&t.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":s===void 0?c:ui.parseNumber(c,{dp:s}),p="",u="";switch(l){case"NEW":p="Order opened",u=`${a} ${m} ${h}`;break;case"FILLED":case"PARTIAL_FILLED":let y=s===void 0?f:ui.parseNumber(f,{dp:s});p="Order filled",u=`${a} ${m} ${y} / ${h}`;break;case"CANCELLED":p="Order cancelled",u=`${a} ${m} ${h}`;break;case"REJECTED":p="Order rejected",u=`${a} ${m} ${h}`;break;case"REPLACED":p="Order edited",u=`${r} ${m} ${f} / ${h}`;break;}return {title:p,msg:u}}function z(){let t=hooks.useEventEmitter(),e=hooks.useSymbolsInfo(),n=react.useRef({});react.useEffect(()=>{n.current=e;},[e]);let r=hooks.useDebouncedCallback(c=>{(l=>{let{title:o,msg:s}=H(l,n.current);o&&s&&ui.toast.success(jsxRuntime.jsxs("div",{children:[o,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:s})]}));})(c);},100);react.useEffect(()=>(t.on("orders:changed",r),()=>{t.off("orders:changed",r);}),[]);}var J=t=>{let{onChainChanged:e,components:n,appIcons:r,...c}=t;return x(),z(),jsxRuntime.jsx(M,{appIcons:r,brokerName:t.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:n,overrides:t.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...c,children:[jsxRuntime.jsx(_,{onChainChanged:e,children:jsxRuntime.jsx(hooks.OrderlyTrackerProvider,{children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:t.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};J.displayName="OrderlyAppProvider";var $e=(t,e)=>{let{wrongNetwork:n}=v(),{state:r}=hooks.useAccount();return e?.skip?t:n||typeof e?.accountStatus<"u"&&r.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
10
+ var k=()=>{react.useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var x="orderly:wallet-info";function E(){let{connectedChain:t,disconnect:e}=hooks.useWalletConnector(),[s,r]=hooks.useLocalStorage("orderly_selected_chainId",void 0),{account:o}=hooks.useAccount(),{isMobile:c}=ui.useScreen(),l=async n=>{localStorage.removeItem(x),await o.disconnect(),await e({label:n});};react.useEffect(()=>{let n=S(),i=JSON.parse(localStorage.getItem(x)??"{}");n&&i&&l(i.label);},[]);let a=react.useCallback(async()=>{let n=S();if(!n)return;let{address:i,key:p,chainId:f}=n;if(!await o.importOrderlyKey(i,p))return;r(f);let u=new URL(window.location.href);u.searchParams.delete("link");let y=decodeURIComponent(u.toString());history.replaceState(null,"",y);},[o,t]);return react.useEffect(()=>{c&&!t&&a();},[o,t,c]),react.useEffect(()=>{let n=localStorage.getItem("orderly_selected_chainId");if(c&&!t&&n){let i=o.keyStore.getAddress(),p=o.keyStore.getOrderlyKey(),f=o.keyStore.getAccountId(i);o.checkOrderlyKey(i,p,f);}},[o,c,t]),{linkDevice:a}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{addr:s,k:r,id:o}=oe(e)||{};if(s&&r&&o)return {address:s,key:r,chainId:o}}function oe(t){try{let e=JSON.parse(window.atob(t)),s=Math.floor(Date.now()/1e3),r=e.t;return !r||s>r?void 0:e}catch{}}var W="orderly:wallet-info";var L=t=>{let{wallet:e,connect:s,connectedChain:r,disconnect:o,namespace:c}=hooks.useWalletConnector();if(typeof s!="function")throw new types.SDKError("Please provide a wallet connector provider");let l=react.useRef(!1),{account:a,state:n}=hooks.useAccount(),i=hooks.useKeyStore(),p=hooks.useConfig("networkId"),[f,{checkChainSupport:h}]=hooks.useChains(),[u,y]=react.useState(!1),A=react.useMemo(()=>e?.accounts?.[0]?.address,[e]),C=react.useMemo(()=>{let d=e?.chains?.[0]?.id,m=e?.chains?.[0]?.namespace;if(!(typeof d>"u"))return {id:utils.parseChainIdToNumber(d),namespace:m}},[e]);return react.useEffect(()=>{if(!r){y(!1);return}let d=h(r.id,p);y(!d);},[r,f,h,p]),react.useEffect(()=>{utils.windowGuard(()=>{let d=i.getAddress(),m=JSON.parse(localStorage.getItem(W)??"{}");r?.namespace!==types.ChainNamespace.solana&&d&&a.address!==d&&m.label&&s({autoSelect:{label:m.label,disableModals:!0}}).then(P=>{},P=>{});});},[e,a.address]),react.useEffect(()=>{if(e===null&&n.status>types.AccountStatusEnum.NotConnected&&!n.validating){a.disconnect();return}if(u||!r||l.current)return;let d=S();A&&A!==a.address&&!d&&(a.setAddress(A,{provider:e?.provider,chain:{id:utils.praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:e.label}}),utils.windowGuard(()=>{localStorage.setItem(W,JSON.stringify({label:e.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[e,r,A,C,a.address,n,a.chainId,u]),{connectWallet:async()=>(l.current=!0,s({chainId:t.currentChainId}).then(async d=>{if(Array.isArray(d)&&d.length>0&&d[0]&&d[0].accounts.length>0){let m=d[0],P=utils.praseChainIdToNumber(m.chains[0].id);if(!h(P,p))return {wrongNetwork:!0};if(!a)throw new Error("account is not initialized");n.status===types.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_selected_chainId"),await a.disconnect());let V=await a.setAddress(m.accounts[0].address,{provider:m.provider,chain:{id:utils.praseChainIdToNumber(m.chains[0].id),namespace:m.chains[0].namespace.toUpperCase()},wallet:{name:m.label}});return {wallet:m,status:V,wrongNetwork:!1}}return null}).finally(()=>{l.current=!1;})),wrongNetwork:u}};function _(){let t=hooks.useEventEmitter(),e=react.useRef({}),[s,r]=hooks.useSessionStorage("orderly_wallet_change_id",{});e.current=s,hooks.useWalletSubscription({onMessage:o=>{let{id:c,side:l,transStatus:a}=o,n=!0;if(["DEPOSIT","WITHDRAW"].includes(l)&&["COMPLETED","FAILED"].includes(a)){let i=e.current[c];r({...s,[c]:i?void 0:!0}),n=!i;}if(a==="COMPLETED"&&n){let i=`${utils.capitalizeString(l)} completed`;ui.toast.success(i);}else if(a==="FAILED"&&n){let i=`${utils.capitalizeString(l)} failed`;ui.toast.error(i);}t.emit("wallet:changed",o);}});}function M(){hooks.useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":ui.toast.success("Settlement completed");break;case"FAILED":ui.toast.error("Settlement failed");break;}}});}function F(){let t=hooks.useEventEmitter();return react.useEffect(()=>{t.on("wallet:connect-error",e=>{ui.toast.error(e.message);});},[t]),{}}var K=react.createContext({}),w=()=>react.useContext(K),U=t=>{let[e,s]=react.useState();E();let{connectWallet:r,wrongNetwork:o}=L({currentChainId:e});_(),M(),F();let c=hooks.useRestrictedAreas(t?.restrictedInfo??{});return jsxRuntime.jsx(K.Provider,{value:{connectWallet:r,wrongNetwork:o,currentChainId:e,setCurrentChainId:s,onChainChanged:t.onChainChanged,restrictedInfo:c},children:t.children})};var H=react.createContext({}),Te=()=>react.useContext(H),J=t=>jsxRuntime.jsx(H.Provider,{value:t,children:t.children});function B(t,e){let{symbol:s,side:r,quantity:o}=t,c="total_executed_quantity"in t?t.total_executed_quantity:0,l="status"in t?t.status:t.algo_status,a=e[s],n=a("base_dp"),i=utils.capitalizeString(r),p=utils.transSymbolformString(s),f="algo_type"in t&&t.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":n===void 0?o:ui.parseNumber(o,{dp:n}),h="",u="";switch(l){case"NEW":h="Order opened",u=`${i} ${p} ${f}`;break;case"FILLED":case"PARTIAL_FILLED":let y=n===void 0?c:ui.parseNumber(c,{dp:n});h="Order filled",u=`${i} ${p} ${y} / ${f}`;break;case"CANCELLED":h="Order cancelled",u=`${i} ${p} ${f}`;break;case"REJECTED":h="Order rejected",u=`${i} ${p} ${f}`;break;case"REPLACED":h="Order edited",u=`${r} ${p} ${c} / ${f}`;break;}return {title:h,msg:u}}function Y(){let t=hooks.useEventEmitter(),e=hooks.useSymbolsInfo(),s=react.useRef({});react.useEffect(()=>{s.current=e;},[e]);let r=hooks.useDebouncedCallback(o=>{(l=>{let{title:a,msg:n}=B(l,s.current);a&&n&&ui.toast.success(jsxRuntime.jsxs("div",{children:[a,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:n})]}));})(o);},100);react.useEffect(()=>(t.on("orders:changed",r),()=>{t.off("orders:changed",r);}),[]);}var G=t=>{let{onChainChanged:e,components:s,appIcons:r,...o}=t;return k(),Y(),jsxRuntime.jsx(J,{appIcons:r,brokerName:t.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:s,overrides:t.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...o,children:[jsxRuntime.jsx(U,{onChainChanged:e,restrictedInfo:t.restrictedInfo,children:jsxRuntime.jsx(hooks.OrderlyTrackerProvider,{children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:t.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};G.displayName="OrderlyAppProvider";var Ye=(t,e)=>{let{wrongNetwork:s}=w(),{state:r}=hooks.useAccount();return e?.skip?t:s||typeof e?.accountStatus<"u"&&r.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
11
11
 
12
- exports.OrderlyAppProvider = J;
13
- exports.useAppConfig = Pe;
14
- exports.useAppContext = v;
15
- exports.useDataTap = $e;
12
+ exports.OrderlyAppProvider = G;
13
+ exports.useAppConfig = Te;
14
+ exports.useAppContext = w;
15
+ exports.useDataTap = Ye;
16
16
  //# sourceMappingURL=out.js.map
17
17
  //# 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/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","OrderlyTrackerProvider","createContext","useContext","useState","useMemo","useRef","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","WALLET_KEY","useWalletStateHandle","options","connectedWallet","connect","connectedChain","disconnect","namespace","isManualConnect","account","accountState","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","isSupported","localAddress","walletInfo","res","error","walletState","wallet","chainId","status","toast","capitalizeString","useEventEmitter","useSessionStorage","useWalletSubscription","useWalletEvent","ee","recordRef","record","setRecord","data","side","transStatus","showToast","isPushOnce","msg","useSettleSubscription","useSettleEvent","useWalletConnectError","jsx","AppContext","useAppContext","AppStateProvider","props","currentChainId","setCurrentChainId","connectWallet","wrongNetwork","AppConfigContext","useAppConfig","AppConfigProvider","transSymbolformString","AlgoOrderRootType","parseNumber","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","useSymbolsInfo","useDebouncedCallback","jsxs","useExecutionReport","symbolsInfoRef","handler","OrderlyAppProvider","onChainChanged","components","appIcons","configProps","useDataTap","state"],"mappings":"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","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n OrderlyTrackerProvider,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\n\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui/src/provider/orderlyThemeProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n onChainChanged,\n // dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n useExecutionReport();\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 as ConfigProviderProps)}>\n <AppStateProvider onChainChanged={onChainChanged}>\n <OrderlyTrackerProvider>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </OrderlyTrackerProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\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","import { FC, createContext, PropsWithChildren, useContext, useState } from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: 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};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useWalletConnectError();\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useConfig, WalletState } from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n} from \"@orderly.network/types\";\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 isManualConnect = useRef<boolean>(false);\n\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\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (!connectedChain) return;\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (!!currentWalletAddress && currentWalletAddress !== account.address) {\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 });\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 // console.log(\"🔗 wallet state handle\", connectedWallet);\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n console.log('-- aaaaa wallet', wallet);\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 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 { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\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 isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n\n }, [ee])\n\n return {}\n}","import { ExtensionPosition } from \"@orderly.network/ui\";\nimport { createContext, PropsWithChildren, ReactNode, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n // const { appIcons } = props;\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\nimport {\n useSymbolsInfo,\n useWS,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current\n );\n\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 </div>\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\nimport { API } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any\n) {\n const { symbol, side, quantity } = 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 displaySide = capitalizeString(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? \"Entire position\"\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case \"NEW\":\n title = \"Order opened\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"FILLED\":\n case \"PARTIAL_FILLED\":\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = \"Order filled\";\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case \"CANCELLED\":\n title = \"Order cancelled\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REJECTED\":\n title = \"Order rejected\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REPLACED\":\n title = \"Order edited\";\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","OrderlyTrackerProvider","createContext","useContext","useState","useMemo","useRef","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","useCallback","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","seSelectedChainId","account","isMobile","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","key","chainId","url","decodedUrl","orderlyKey","accountId","link","decodeBase64","base64","data","currentTime","expiredTime","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","accountState","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","isSupported","localAddress","res","error","walletState","wallet","status","toast","capitalizeString","useEventEmitter","useSessionStorage","useWalletSubscription","useWalletEvent","ee","recordRef","record","setRecord","side","transStatus","showToast","isPushOnce","msg","useSettleSubscription","useSettleEvent","useWalletConnectError","useRestrictedAreas","jsx","AppContext","useAppContext","AppStateProvider","props","currentChainId","setCurrentChainId","connectWallet","wrongNetwork","restrictedInfo","AppConfigContext","useAppConfig","AppConfigProvider","transSymbolformString","AlgoOrderRootType","parseNumber","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","useSymbolsInfo","useDebouncedCallback","jsxs","useExecutionReport","symbolsInfoRef","handler","OrderlyAppProvider","onChainChanged","components","appIcons","configProps","useDataTap","state"],"mappings":"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","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n OrderlyTrackerProvider,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui/src/provider/orderlyThemeProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n onChainChanged,\n // dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n useExecutionReport();\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 as ConfigProviderProps)}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n restrictedInfo={props.restrictedInfo}\n >\n <OrderlyTrackerProvider>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </OrderlyTrackerProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\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","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n} from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport {\n useRestrictedAreas,\n RestrictedAreasReturns,\n IRestrictedAreasParams,\n} from \"@orderly.network/hooks\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: 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?: RestrictedAreasReturns;\n};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n restrictedInfo?: IRestrictedAreasParams;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n useLinkDevice();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useWalletConnectError();\n const restrictedInfo = useRestrictedAreas(props?.restrictedInfo ?? {});\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n restrictedInfo,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useConfig, WalletState } from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n} from \"@orderly.network/types\";\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 isManualConnect = useRef<boolean>(false);\n\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\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\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\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 });\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n console.log(\"-- aaaaa wallet\", wallet);\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_selected_chainId\");\n await account.disconnect();\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 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 { useCallback, useEffect } from \"react\";\nimport {\n useAccount,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\n\ntype DecodedData = {\n addr: string;\n k: string;\n t: number;\n id: number;\n};\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, seSelectedChainId] = useLocalStorage<number | undefined>(\n \"orderly_selected_chainId\",\n undefined\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\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 = useCallback(async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, key, chainId } = linkData;\n const isSuccess = await account.importOrderlyKey(address, key);\n if (!isSuccess) return;\n seSelectedChainId(chainId);\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n }, [account, connectedChain]);\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n // persist status when refresh page\n useEffect(() => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const chainId = localStorage.getItem(\"orderly_selected_chainId\");\n if (isMobile && !connectedChain && chainId) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n account.checkOrderlyKey(address!, orderlyKey!, accountId!);\n }\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\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 { addr: address, k: key, id: chainId } = decodeBase64(link) || {};\n\n if (address && key && chainId) {\n return {\n address,\n key,\n chainId,\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 { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\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 isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n\n }, [ee])\n\n return {}\n}","import { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\nimport {\n useSymbolsInfo,\n useWS,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current\n );\n\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 </div>\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\nimport { API } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any\n) {\n const { symbol, side, quantity } = 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 displaySide = capitalizeString(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? \"Entire position\"\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case \"NEW\":\n title = \"Order opened\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"FILLED\":\n case \"PARTIAL_FILLED\":\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = \"Order filled\";\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case \"CANCELLED\":\n title = \"Order cancelled\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REJECTED\":\n title = \"Order rejected\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REPLACED\":\n title = \"Order edited\";\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
package/dist/index.mjs CHANGED
@@ -1,12 +1,12 @@
1
- import { OrderlyThemeProvider, TooltipProvider, ModalProvider, Toaster, toast, parseNumber } from '@orderly.network/ui';
2
- import { createContext, useContext, useEffect, useState, useRef, useMemo } from 'react';
3
- import { OrderlyConfigProvider, OrderlyTrackerProvider, useAccount, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useWalletConnector, useKeyStore, useConfig, useChains, useSessionStorage, useWalletSubscription, useSettleSubscription } from '@orderly.network/hooks';
1
+ import { OrderlyThemeProvider, TooltipProvider, ModalProvider, Toaster, toast, useScreen, parseNumber } from '@orderly.network/ui';
2
+ import { createContext, useContext, useEffect, useState, useRef, useCallback, useMemo } from 'react';
3
+ import { OrderlyConfigProvider, OrderlyTrackerProvider, useAccount, useRestrictedAreas, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useWalletConnector, useLocalStorage, useKeyStore, useConfig, useChains, useSessionStorage, useWalletSubscription, useSettleSubscription } from '@orderly.network/hooks';
4
4
  import { parseChainIdToNumber, windowGuard, praseChainIdToNumber, capitalizeString, transSymbolformString } from '@orderly.network/utils';
5
5
  import { SDKError, ChainNamespace, AccountStatusEnum, AlgoOrderRootType } from '@orderly.network/types';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
7
7
 
8
- var x=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var I="orderly:wallet-info";var T=t=>{let{wallet:e,connect:n,connectedChain:r,disconnect:c,namespace:f}=useWalletConnector();if(typeof n!="function")throw new SDKError("Please provide a wallet connector provider");let l=useRef(!1),{account:o,state:s}=useAccount(),a=useKeyStore(),m=useConfig("networkId"),[h,{checkChainSupport:p}]=useChains(),[u,y]=useState(!1),P=useMemo(()=>e?.accounts?.[0]?.address,[e]),g=useMemo(()=>{let i=e?.chains?.[0]?.id,d=e?.chains?.[0]?.namespace;if(!(typeof i>"u"))return {id:parseChainIdToNumber(i),namespace:d}},[e]);return useEffect(()=>{if(!r)return;let i=p(r.id,m);y(!i);},[r,h,p,m]),useEffect(()=>{windowGuard(()=>{let i=a.getAddress(),d=JSON.parse(localStorage.getItem(I)??"{}");r?.namespace!==ChainNamespace.solana&&i&&o.address!==i&&d.label&&n({autoSelect:{label:d.label,disableModals:!0}}).then(A=>{},A=>{});});},[e,o.address]),useEffect(()=>{if(e===null&&s.status>AccountStatusEnum.NotConnected&&!s.validating){o.disconnect();return}u||!r||l.current||(P&&P!==o.address&&(o.setAddress(P,{provider:e?.provider,chain:{id:praseChainIdToNumber(g.id),namespace:g.namespace.toUpperCase()},wallet:{name:e.label}}),windowGuard(()=>{localStorage.setItem(I,JSON.stringify({label:e.label}));})),g?.id!==o.chainId&&o.switchChainId(g?.id));},[e,r,P,g,o.address,s,o.chainId,u]),{connectWallet:async()=>(l.current=!0,n({chainId:t.currentChainId}).then(async i=>{if(Array.isArray(i)&&i.length>0&&i[0]&&i[0].accounts.length>0){let d=i[0],A=praseChainIdToNumber(d.chains[0].id);if(!p(A,m))return {wrongNetwork:!0};if(!o)throw new Error("account is not initialized");let K=await o.setAddress(d.accounts[0].address,{provider:d.provider,chain:{id:praseChainIdToNumber(d.chains[0].id),namespace:d.chains[0].namespace.toUpperCase()},wallet:{name:d.label}});return {wallet:d,status:K,wrongNetwork:!1}}return null}).finally(()=>{l.current=!1;})),wrongNetwork:u}};function W(){let t=useEventEmitter(),e=useRef({}),[n,r]=useSessionStorage("orderly_wallet_change_id",{});e.current=n,useWalletSubscription({onMessage:c=>{let{id:f,side:l,transStatus:o}=c,s=!0;if(["DEPOSIT","WITHDRAW"].includes(l)&&["COMPLETED","FAILED"].includes(o)){let a=e.current[f];r({...n,[f]:a?void 0:!0}),s=!a;}if(o==="COMPLETED"&&s){let a=`${capitalizeString(l)} completed`;toast.success(a);}else if(o==="FAILED"&&s){let a=`${capitalizeString(l)} failed`;toast.error(a);}t.emit("wallet:changed",c);}});}function D(){useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":toast.success("Settlement completed");break;case"FAILED":toast.error("Settlement failed");break;}}});}function L(){let t=useEventEmitter();return useEffect(()=>{t.on("wallet:connect-error",e=>{toast.error(e.message);});},[t]),{}}var R=createContext({}),v=()=>useContext(R),_=t=>{let[e,n]=useState(),{connectWallet:r,wrongNetwork:c}=T({currentChainId:e});return W(),D(),L(),jsx(R.Provider,{value:{connectWallet:r,wrongNetwork:c,currentChainId:e,setCurrentChainId:n,onChainChanged:t.onChainChanged},children:t.children})};var $=createContext({}),Pe=()=>useContext($),M=t=>jsx($.Provider,{value:t,children:t.children});function H(t,e){let{symbol:n,side:r,quantity:c}=t,f="total_executed_quantity"in t?t.total_executed_quantity:0,l="status"in t?t.status:t.algo_status,o=e[n],s=o("base_dp"),a=capitalizeString(r),m=transSymbolformString(n),h="algo_type"in t&&t.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":s===void 0?c:parseNumber(c,{dp:s}),p="",u="";switch(l){case"NEW":p="Order opened",u=`${a} ${m} ${h}`;break;case"FILLED":case"PARTIAL_FILLED":let y=s===void 0?f:parseNumber(f,{dp:s});p="Order filled",u=`${a} ${m} ${y} / ${h}`;break;case"CANCELLED":p="Order cancelled",u=`${a} ${m} ${h}`;break;case"REJECTED":p="Order rejected",u=`${a} ${m} ${h}`;break;case"REPLACED":p="Order edited",u=`${r} ${m} ${f} / ${h}`;break;}return {title:p,msg:u}}function z(){let t=useEventEmitter(),e=useSymbolsInfo(),n=useRef({});useEffect(()=>{n.current=e;},[e]);let r=useDebouncedCallback(c=>{(l=>{let{title:o,msg:s}=H(l,n.current);o&&s&&toast.success(jsxs("div",{children:[o,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:s})]}));})(c);},100);useEffect(()=>(t.on("orders:changed",r),()=>{t.off("orders:changed",r);}),[]);}var J=t=>{let{onChainChanged:e,components:n,appIcons:r,...c}=t;return x(),z(),jsx(M,{appIcons:r,brokerName:t.brokerName,children:jsx(OrderlyThemeProvider,{components:n,overrides:t.overrides,children:jsxs(OrderlyConfigProvider,{...c,children:[jsx(_,{onChainChanged:e,children:jsx(OrderlyTrackerProvider,{children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:t.children})})})}),jsx(Toaster,{})]})})})};J.displayName="OrderlyAppProvider";var $e=(t,e)=>{let{wrongNetwork:n}=v(),{state:r}=useAccount();return e?.skip?t:n||typeof e?.accountStatus<"u"&&r.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
8
+ var k=()=>{useEffect(()=>{let e=new URLSearchParams(window.location.search).get("ref");e&&localStorage.setItem("referral_code",e);},[]);};var x="orderly:wallet-info";function E(){let{connectedChain:t,disconnect:e}=useWalletConnector(),[s,r]=useLocalStorage("orderly_selected_chainId",void 0),{account:o}=useAccount(),{isMobile:c}=useScreen(),l=async n=>{localStorage.removeItem(x),await o.disconnect(),await e({label:n});};useEffect(()=>{let n=S(),i=JSON.parse(localStorage.getItem(x)??"{}");n&&i&&l(i.label);},[]);let a=useCallback(async()=>{let n=S();if(!n)return;let{address:i,key:p,chainId:f}=n;if(!await o.importOrderlyKey(i,p))return;r(f);let u=new URL(window.location.href);u.searchParams.delete("link");let y=decodeURIComponent(u.toString());history.replaceState(null,"",y);},[o,t]);return useEffect(()=>{c&&!t&&a();},[o,t,c]),useEffect(()=>{let n=localStorage.getItem("orderly_selected_chainId");if(c&&!t&&n){let i=o.keyStore.getAddress(),p=o.keyStore.getOrderlyKey(),f=o.keyStore.getAccountId(i);o.checkOrderlyKey(i,p,f);}},[o,c,t]),{linkDevice:a}}function S(){let e=new URL(window.location.href).searchParams.get("link");if(!e)return;let{addr:s,k:r,id:o}=oe(e)||{};if(s&&r&&o)return {address:s,key:r,chainId:o}}function oe(t){try{let e=JSON.parse(window.atob(t)),s=Math.floor(Date.now()/1e3),r=e.t;return !r||s>r?void 0:e}catch{}}var W="orderly:wallet-info";var L=t=>{let{wallet:e,connect:s,connectedChain:r,disconnect:o,namespace:c}=useWalletConnector();if(typeof s!="function")throw new SDKError("Please provide a wallet connector provider");let l=useRef(!1),{account:a,state:n}=useAccount(),i=useKeyStore(),p=useConfig("networkId"),[f,{checkChainSupport:h}]=useChains(),[u,y]=useState(!1),A=useMemo(()=>e?.accounts?.[0]?.address,[e]),C=useMemo(()=>{let d=e?.chains?.[0]?.id,m=e?.chains?.[0]?.namespace;if(!(typeof d>"u"))return {id:parseChainIdToNumber(d),namespace:m}},[e]);return useEffect(()=>{if(!r){y(!1);return}let d=h(r.id,p);y(!d);},[r,f,h,p]),useEffect(()=>{windowGuard(()=>{let d=i.getAddress(),m=JSON.parse(localStorage.getItem(W)??"{}");r?.namespace!==ChainNamespace.solana&&d&&a.address!==d&&m.label&&s({autoSelect:{label:m.label,disableModals:!0}}).then(P=>{},P=>{});});},[e,a.address]),useEffect(()=>{if(e===null&&n.status>AccountStatusEnum.NotConnected&&!n.validating){a.disconnect();return}if(u||!r||l.current)return;let d=S();A&&A!==a.address&&!d&&(a.setAddress(A,{provider:e?.provider,chain:{id:praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:e.label}}),windowGuard(()=>{localStorage.setItem(W,JSON.stringify({label:e.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[e,r,A,C,a.address,n,a.chainId,u]),{connectWallet:async()=>(l.current=!0,s({chainId:t.currentChainId}).then(async d=>{if(Array.isArray(d)&&d.length>0&&d[0]&&d[0].accounts.length>0){let m=d[0],P=praseChainIdToNumber(m.chains[0].id);if(!h(P,p))return {wrongNetwork:!0};if(!a)throw new Error("account is not initialized");n.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_selected_chainId"),await a.disconnect());let V=await a.setAddress(m.accounts[0].address,{provider:m.provider,chain:{id:praseChainIdToNumber(m.chains[0].id),namespace:m.chains[0].namespace.toUpperCase()},wallet:{name:m.label}});return {wallet:m,status:V,wrongNetwork:!1}}return null}).finally(()=>{l.current=!1;})),wrongNetwork:u}};function _(){let t=useEventEmitter(),e=useRef({}),[s,r]=useSessionStorage("orderly_wallet_change_id",{});e.current=s,useWalletSubscription({onMessage:o=>{let{id:c,side:l,transStatus:a}=o,n=!0;if(["DEPOSIT","WITHDRAW"].includes(l)&&["COMPLETED","FAILED"].includes(a)){let i=e.current[c];r({...s,[c]:i?void 0:!0}),n=!i;}if(a==="COMPLETED"&&n){let i=`${capitalizeString(l)} completed`;toast.success(i);}else if(a==="FAILED"&&n){let i=`${capitalizeString(l)} failed`;toast.error(i);}t.emit("wallet:changed",o);}});}function M(){useSettleSubscription({onMessage:t=>{let{status:e}=t;switch(e){case"COMPLETED":toast.success("Settlement completed");break;case"FAILED":toast.error("Settlement failed");break;}}});}function F(){let t=useEventEmitter();return useEffect(()=>{t.on("wallet:connect-error",e=>{toast.error(e.message);});},[t]),{}}var K=createContext({}),w=()=>useContext(K),U=t=>{let[e,s]=useState();E();let{connectWallet:r,wrongNetwork:o}=L({currentChainId:e});_(),M(),F();let c=useRestrictedAreas(t?.restrictedInfo??{});return jsx(K.Provider,{value:{connectWallet:r,wrongNetwork:o,currentChainId:e,setCurrentChainId:s,onChainChanged:t.onChainChanged,restrictedInfo:c},children:t.children})};var H=createContext({}),Te=()=>useContext(H),J=t=>jsx(H.Provider,{value:t,children:t.children});function B(t,e){let{symbol:s,side:r,quantity:o}=t,c="total_executed_quantity"in t?t.total_executed_quantity:0,l="status"in t?t.status:t.algo_status,a=e[s],n=a("base_dp"),i=capitalizeString(r),p=transSymbolformString(s),f="algo_type"in t&&t.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":n===void 0?o:parseNumber(o,{dp:n}),h="",u="";switch(l){case"NEW":h="Order opened",u=`${i} ${p} ${f}`;break;case"FILLED":case"PARTIAL_FILLED":let y=n===void 0?c:parseNumber(c,{dp:n});h="Order filled",u=`${i} ${p} ${y} / ${f}`;break;case"CANCELLED":h="Order cancelled",u=`${i} ${p} ${f}`;break;case"REJECTED":h="Order rejected",u=`${i} ${p} ${f}`;break;case"REPLACED":h="Order edited",u=`${r} ${p} ${c} / ${f}`;break;}return {title:h,msg:u}}function Y(){let t=useEventEmitter(),e=useSymbolsInfo(),s=useRef({});useEffect(()=>{s.current=e;},[e]);let r=useDebouncedCallback(o=>{(l=>{let{title:a,msg:n}=B(l,s.current);a&&n&&toast.success(jsxs("div",{children:[a,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:n})]}));})(o);},100);useEffect(()=>(t.on("orders:changed",r),()=>{t.off("orders:changed",r);}),[]);}var G=t=>{let{onChainChanged:e,components:s,appIcons:r,...o}=t;return k(),Y(),jsx(J,{appIcons:r,brokerName:t.brokerName,children:jsx(OrderlyThemeProvider,{components:s,overrides:t.overrides,children:jsxs(OrderlyConfigProvider,{...o,children:[jsx(U,{onChainChanged:e,restrictedInfo:t.restrictedInfo,children:jsx(OrderlyTrackerProvider,{children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:t.children})})})}),jsx(Toaster,{})]})})})};G.displayName="OrderlyAppProvider";var Ye=(t,e)=>{let{wrongNetwork:s}=w(),{state:r}=useAccount();return e?.skip?t:s||typeof e?.accountStatus<"u"&&r.status<e.accountStatus?typeof e?.fallbackData<"u"?e.fallbackData:null:t};
9
9
 
10
- export { J as OrderlyAppProvider, Pe as useAppConfig, v as useAppContext, $e as useDataTap };
10
+ export { G as OrderlyAppProvider, Te as useAppConfig, w as useAppContext, Ye as useDataTap };
11
11
  //# sourceMappingURL=out.js.map
12
12
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","OrderlyTrackerProvider","createContext","useContext","useState","useMemo","useRef","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","WALLET_KEY","useWalletStateHandle","options","connectedWallet","connect","connectedChain","disconnect","namespace","isManualConnect","account","accountState","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","isSupported","localAddress","walletInfo","res","error","walletState","wallet","chainId","status","toast","capitalizeString","useEventEmitter","useSessionStorage","useWalletSubscription","useWalletEvent","ee","recordRef","record","setRecord","data","side","transStatus","showToast","isPushOnce","msg","useSettleSubscription","useSettleEvent","useWalletConnectError","jsx","AppContext","useAppContext","AppStateProvider","props","currentChainId","setCurrentChainId","connectWallet","wrongNetwork","AppConfigContext","useAppConfig","AppConfigProvider","transSymbolformString","AlgoOrderRootType","parseNumber","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","useSymbolsInfo","useDebouncedCallback","jsxs","useExecutionReport","symbolsInfoRef","handler","OrderlyAppProvider","onChainChanged","components","appIcons","configProps","useDataTap","state"],"mappings":"AAEA,OACE,iBAAAA,GACA,wBAAAC,GACA,WAAAC,GACA,mBAAAC,OACK,sBCPP,OAAS,aAAAC,MAAiB,QAGnB,IAAMC,EAAe,IAAM,CAChCD,EAAU,IAAM,CAEd,IAAME,EADe,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAClC,IAAI,KAAK,EAClCA,GACF,aAAa,QAAQ,gBAAiBA,CAAO,CAEjD,EAAG,CAAC,CAAC,CACP,EDFA,OAEE,yBAAAC,GACA,0BAAAC,OACK,yBEbP,OAAa,iBAAAC,GAAkC,cAAAC,GAAY,YAAAC,OAAgB,QCA3E,OAAS,aAAAP,EAAW,WAAAQ,EAAS,UAAAC,EAAQ,YAAAF,MAAgB,QACrD,OAAS,aAAAG,MAA8B,yBACvC,OACE,cAAAC,EACA,aAAAC,EACA,eAAAC,EACA,sBAAAC,MACK,yBACP,OACE,wBAAAC,GACA,wBAAAC,EACA,eAAAC,MACK,yBACP,OACE,qBAAAC,GACA,YAAAC,GACA,kBAAAC,OAEK,yBAEP,IAAMC,EAAa,sBAGZ,IAAMC,EAAwBC,GAG/B,CACJ,GAAM,CACJ,OAAQC,EACR,QAAAC,EACA,eAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAId,EAAmB,EAQvB,GAAI,OAAOW,GAAY,WACrB,MAAM,IAAIN,GAAS,4CAA4C,EAGjE,IAAMU,EAAkBpB,EAAgB,EAAK,EAEvC,CAAE,QAAAqB,EAAS,MAAOC,CAAa,EAAIpB,EAAW,EAC9CqB,EAAWnB,EAAY,EACvBoB,EAAYvB,EAAU,WAAW,EACjC,CAACwB,EAAQ,CAAE,kBAAAC,CAAkB,CAAC,EAAIvB,EAAU,EAE5C,CAACwB,EAAaC,CAAc,EAAI9B,EAAS,EAAK,EAG9C+B,EAAuB9B,EAA4B,IAChDgB,GAAiB,WAAW,CAAC,GAAG,QACtC,CAACA,CAAe,CAAC,EAGde,EAAe/B,EAEnB,IAAM,CACN,IAAMgC,EAAKhB,GAAiB,SAAS,CAAC,GAAG,GACnCI,EAAYJ,GAAiB,SAAS,CAAC,GAAG,UAChD,GAAI,SAAOgB,EAAO,KAClB,MAAO,CACL,GAAIzB,GAAqByB,CAAE,EAC3B,UAAAZ,CACF,CACF,EAAG,CAACJ,CAAe,CAAC,EAEpB,OAAAxB,EAAU,IAAM,CACd,GAAI,CAAC0B,EAAgB,OAErB,IAAIe,EAAcN,EAChBT,EAAe,GACfO,CAEF,EAEAI,EAAe,CAACI,CAAW,CAC7B,EAAG,CAACf,EAAgBQ,EAAQC,EAAmBF,CAAS,CAAC,EAEzDjC,EAAU,IAAM,CAGdiB,EAAY,IAAM,CAChB,IAAMyB,EAAeV,EAAS,WAAW,EACnCW,EAAa,KAAK,MAAM,aAAa,QAAQtB,CAAU,GAAK,IAAI,EAKlEK,GAAgB,YAAcN,GAAe,QAI/CsB,GACAZ,EAAQ,UAAYY,GACpBC,EAAW,OAEXlB,EAAQ,CACN,WAAY,CACV,MAAOkB,EAAW,MAClB,cAAe,EACjB,CACF,CAAC,EAAE,KACAC,GAAQ,CAET,EACCC,GAAO,EACV,CAEJ,CAAC,CACH,EAAG,CAACrB,EAAiBM,EAAQ,OAAO,CAAC,EAKrC9B,EAAU,IAAM,CACd,GACEwB,IAAoB,MACpBO,EAAa,OAASb,GAAkB,cACrC,CAACa,EAAa,WACjB,CACAD,EAAQ,WAAW,EACnB,MACF,CAEIM,GAAe,CAACV,GAChBG,EAAgB,UAMdS,GAAwBA,IAAyBR,EAAQ,UAC7DA,EAAQ,WAAWQ,EAAsB,CACvC,SAAUd,GAAiB,SAC3B,MAAO,CACL,GAAIR,EAAqBuB,EAAc,EAAE,EACzC,UAAWA,EAAc,UAAU,YAAY,CACjD,EACA,OAAQ,CACN,KAAMf,EAAgB,KACxB,CACF,CAAC,EAGDP,EAAY,IAAM,CAChB,aAAa,QACXI,EACA,KAAK,UAAU,CACb,MAAOG,EAAgB,KACzB,CAAC,CACH,CACF,CAAC,GAMCe,GAAc,KAAOT,EAAQ,SAC/BA,EAAQ,cAAcS,GAAc,EAAG,EAK3C,EAAG,CACDf,EACAE,EACAY,EACAC,EACAT,EAAQ,QACRC,EACAD,EAAQ,QACRM,CACF,CAAC,EA6DM,CACL,cAvDoB,UAKpBP,EAAgB,QAAU,GAGnBJ,EAAQ,CAAE,QAASF,EAAQ,cAAe,CAAC,EAC/C,KAAK,MAAOuB,GAAgB,CAC3B,GACE,MAAM,QAAQA,CAAW,GACzBA,EAAY,OAAS,GACrBA,EAAY,CAAC,GACbA,EAAY,CAAC,EAAE,SAAS,OAAS,EACjC,CACA,IAAMC,EAASD,EAAY,CAAC,EACtBE,EAAUhC,EAAqB+B,EAAO,OAAO,CAAC,EAAE,EAAE,EAExD,GAAI,CAACZ,EAAkBa,EAASf,CAAS,EACvC,MAAO,CACL,aAAc,EAChB,EAIF,GAAI,CAACH,EACH,MAAM,IAAI,MAAM,4BAA4B,EAG9C,IAAMmB,EAAS,MAAMnB,EAAQ,WAAWiB,EAAO,SAAS,CAAC,EAAE,QAAS,CAClE,SAAUA,EAAO,SACjB,MAAO,CACL,GAAI/B,EAAqB+B,EAAO,OAAO,CAAC,EAAE,EAAE,EAC5C,UACEA,EAAO,OAAO,CAAC,EAAE,UAAU,YAAY,CAC3C,EACA,OAAQ,CACN,KAAMA,EAAO,KACf,CAEF,CAAC,EAGD,MAAO,CAAE,OAAAA,EAAQ,OAAAE,EAAQ,aAAc,EAAM,CAC/C,CAEA,OAAO,IACT,CAAC,EACA,QAAQ,IAAM,CACbpB,EAAgB,QAAU,EAC5B,CAAC,GAKH,aAAcO,CAChB,CACF,ECnPA,OAAS,UAAA3B,OAAc,QACvB,OAAS,SAAAyC,MAAa,sBACtB,OAAS,oBAAAC,MAAwB,yBACjC,OACE,mBAAAC,GACA,qBAAAC,GACA,yBAAAC,OACK,yBAEA,SAASC,GAAiB,CAC/B,IAAMC,EAAKJ,GAAgB,EAErBK,EAAYhD,GAAgC,CAAC,CAAC,EAE9C,CAACiD,EAAQC,CAAS,EAAIN,GAC1B,2BACA,CAAC,CACH,EAEAI,EAAU,QAAUC,EAEpBJ,GAAsB,CACpB,UAAYM,GAAc,CAExB,GAAM,CAAE,GAAApB,EAAI,KAAAqB,EAAM,YAAAC,CAAY,EAAIF,EAC9BG,EAAY,GAGhB,GACE,CAAC,UAAW,UAAU,EAAE,SAASF,CAAI,GACrC,CAAC,YAAa,QAAQ,EAAE,SAASC,CAAW,EAC5C,CACA,IAAME,EAAaP,EAAU,QAAQjB,CAAE,EACvCmB,EAAU,CACR,GAAGD,EACH,CAAClB,CAAE,EAAGwB,EAAa,OAAY,EACjC,CAAC,EAEDD,EAAY,CAACC,CACf,CAEA,GAAIF,IAAgB,aAAeC,EAAW,CAC5C,IAAIE,EAAM,GAAGd,EAAiBU,CAAI,CAAC,aACnCX,EAAM,QAAQe,CAAG,CACnB,SAAWH,IAAgB,UAAYC,EAAW,CAChD,IAAIE,EAAM,GAAGd,EAAiBU,CAAI,CAAC,UACnCX,EAAM,MAAMe,CAAG,CACjB,CAEAT,EAAG,KAAK,iBAAkBI,CAAI,CAChC,CACF,CAAC,CACH,CCpDA,OAAS,yBAAAM,OAA6B,yBACtC,OAAS,SAAAhB,MAAa,sBAEf,SAASiB,GAAiB,CAC/BD,GAAsB,CACpB,UAAYN,GAAc,CACxB,GAAM,CAAE,OAAAX,CAAO,EAAIW,EAInB,OAAQX,EAAQ,CACd,IAAK,YACHC,EAAM,QAAQ,sBAAsB,EACpC,MACF,IAAK,SACHA,EAAM,MAAM,mBAAmB,EAC/B,MACF,QACE,KACJ,CACF,CACF,CAAC,CACH,CCtBA,OAAS,mBAAAE,OAAuB,yBAChC,OAAS,aAAApD,OAAiB,QAC1B,OAAS,SAAAkD,OAAa,sBAEf,SAASkB,GAAwB,CACtC,IAAMZ,EAAKJ,GAAgB,EAE3B,OAAApD,GAAU,IAAM,CACdwD,EAAG,GAAG,uBAAyBI,GAAS,CACtCV,GAAM,MAAMU,EAAK,OAAO,CAE1B,CAAC,CAEH,EAAG,CAACJ,CAAE,CAAC,EAEA,CAAC,CACV,CJoCI,cAAAa,OAAA,oBA9BJ,IAAMC,EAAajE,GAA+B,CAAC,CAAoB,EAE1DkE,EAAgB,IACpBjE,GAAWgE,CAAU,EAUjBE,EACXC,GACG,CACH,GAAM,CAACC,EAAgBC,CAAiB,EAAIpE,GAA6B,EAEnE,CAAE,cAAAqE,EAAe,aAAAC,CAAa,EAAIvD,EAAqB,CAE3D,eAAAoD,CACF,CAAC,EAED,OAAAnB,EAAe,EACfY,EAAe,EACfC,EAAsB,EAKpBC,GAACC,EAAW,SAAX,CACC,MAAO,CACL,cAAAM,EACA,aAAAC,EACA,eAAAH,EACA,kBAAAC,EACA,eAAgBF,EAAM,cACxB,EAEC,SAAAA,EAAM,SACT,CAEJ,EK/DA,OAAS,iBAAApE,GAA6C,cAAAC,OAAkB,QAwBpE,cAAA+D,OAAA,oBAhBJ,IAAMS,EAAmBzE,GACvB,CAAC,CACH,EAEa0E,GAAe,IACnBzE,GAAWwE,CAAgB,EAGvBE,EACXP,GAOEJ,GAACS,EAAiB,SAAjB,CAA0B,MAAOL,EAC/B,SAAAA,EAAM,SACT,EC3BJ,OAAS,aAAAzE,EAAW,UAAAS,OAAc,QCAlC,OACE,oBAAA0C,GACA,yBAAA8B,OACK,yBAEP,OAAS,qBAAAC,OAAyB,yBAClC,OAAS,eAAAC,MAAmB,sBAErB,SAASC,EACdxB,EACAyB,EACA,CACA,GAAM,CAAE,OAAAC,EAAQ,KAAAzB,EAAM,SAAA0B,CAAS,EAAI3B,EAC7B4B,EACJ,4BAA6B5B,EAAOA,EAAK,wBAA0B,EAC/DX,EAAS,WAAYW,EAAOA,EAAK,OAASA,EAAK,YAC/C6B,EAAgBJ,EAAYC,CAAM,EAClCI,EAAUD,EAAc,SAAS,EACjCE,EAAcxC,GAAiBU,CAAI,EACnC+B,EAAgBX,GAAsBK,CAAM,EAC5CO,EACJ,cAAejC,GAAQA,EAAK,YAAcsB,GAAkB,iBACxD,kBACAQ,IAAY,OACZH,EACAJ,EAAYI,EAAU,CAAE,GAAIG,CAAQ,CAAC,EAEvCI,EAAQ,GACR7B,EAAM,GACV,OAAQhB,EAAQ,CACd,IAAK,MACH6C,EAAQ,eACR7B,EAAM,GAAG0B,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,SACL,IAAK,iBACH,IAAME,EACJL,IAAY,OACRF,EACAL,EAAYK,EAAyB,CAAE,GAAIE,CAAQ,CAAC,EAC1DI,EAAQ,eACR7B,EAAM,GAAG0B,CAAW,IAAIC,CAAa,IAAIG,CAA4B,MAAMF,CAAe,GAC1F,MACF,IAAK,YACHC,EAAQ,kBACR7B,EAAM,GAAG0B,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,WACHC,EAAQ,iBACR7B,EAAM,GAAG0B,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,WACHC,EAAQ,eACR7B,EAAM,GAAGJ,CAAI,IAAI+B,CAAa,IAAIJ,CAAuB,MAAMK,CAAe,GAC9E,MACF,QACE,KACJ,CAEA,MAAO,CACL,MAAAC,EACA,IAAA7B,CACF,CACF,CD7DA,OACE,kBAAA+B,GAEA,mBAAA5C,GACA,wBAAA6C,OACK,yBACP,OAAS,SAAA/C,OAAa,sBAqBZ,OAEE,OAAAmB,EAFF,QAAA6B,OAAA,oBAnBH,SAASC,GAAqB,CACnC,IAAM3C,EAAKJ,GAAgB,EAErBiC,EAAcW,GAAe,EAC7BI,EAAiB3F,GAAO,CAAC,CAAC,EAEhCT,EAAU,IAAM,CACdoG,EAAe,QAAUf,CAC3B,EAAG,CAACA,CAAW,CAAC,EAEhB,IAAMgB,EAAUJ,GAAsBrC,GAAc,EAC/BA,GAAc,CAC/B,GAAM,CAAE,MAAAkC,EAAO,IAAA7B,CAAI,EAAImB,EACrBxB,EACAwC,EAAe,OACjB,EAEIN,GAAS7B,GACXf,GAAM,QACJgD,GAAC,OACE,UAAAJ,EACDzB,EAAC,OAAG,EACJA,EAAC,OAAI,UAAU,4CACZ,SAAAJ,EACH,GACF,CACF,CAEJ,GAEUL,CAAI,CAChB,EAAG,GAAG,EAEN5D,EAAU,KACRwD,EAAG,GAAG,iBAAkB6C,CAAO,EAExB,IAAM,CACX7C,EAAG,IAAI,iBAAkB6C,CAAO,CAClC,GACC,CAAC,CAAC,CACP,CRPQ,OAIQ,OAAAhC,EAJR,QAAA6B,OAAA,oBAnBR,IAAMI,EAAsB7B,GAAmC,CAC7D,GAAM,CACJ,eAAA8B,EAEA,WAAAC,EACA,SAAAC,EACA,GAAGC,CACL,EAAIjC,EAEJ,OAAAxE,EAAa,EACbkG,EAAmB,EAGjB9B,EAACW,EAAA,CAAkB,SAAUyB,EAAU,WAAYhC,EAAM,WACvD,SAAAJ,EAACxE,GAAA,CAEC,WAAY2G,EACZ,UAAW/B,EAAM,UAEjB,SAAAyB,GAAC/F,GAAA,CAAuB,GAAIuG,EAC1B,UAAArC,EAACG,EAAA,CAAiB,eAAgB+B,EAChC,SAAAlC,EAACjE,GAAA,CACC,SAAAiE,EAACtE,GAAA,CAAgB,cAAe,IAC9B,SAAAsE,EAACzE,GAAA,CAAe,SAAA6E,EAAM,SAAS,EACjC,EACF,EACF,EACAJ,EAACvE,GAAA,EAAQ,GACX,EACF,EACF,CAEJ,EAEAwG,EAAmB,YAAc,qBUxDjC,OAAS,cAAA3F,OAAkB,yBAEpB,IAAMgG,GAAa,CACxB/C,EACArC,IAKa,CACb,GAAM,CAAE,aAAAsD,CAAa,EAAIN,EAAc,EACjC,CAAE,MAAAqC,CAAM,EAAIjG,GAAW,EAI7B,OAAIY,GAAS,KAAaqC,EAEtBiB,GAMA,OAAOtD,GAAS,cAAkB,KAChCqF,EAAM,OAASrF,EAAQ,cAClB,OAAOA,GAAS,aAAiB,IACpCA,EAAQ,aACR,KAUDqC,CACT","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n OrderlyTrackerProvider,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\n\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui/src/provider/orderlyThemeProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n onChainChanged,\n // dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n useExecutionReport();\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 as ConfigProviderProps)}>\n <AppStateProvider onChainChanged={onChainChanged}>\n <OrderlyTrackerProvider>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </OrderlyTrackerProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\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","import { FC, createContext, PropsWithChildren, useContext, useState } from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: 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};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useWalletConnectError();\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useConfig, WalletState } from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n} from \"@orderly.network/types\";\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 isManualConnect = useRef<boolean>(false);\n\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\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\n\n useEffect(() => {\n if (!connectedChain) return;\n\n let isSupported = checkChainSupport(\n connectedChain.id,\n networkId\n // networkId === \"testnet\" ? chains.testnet : chains.mainnet\n );\n\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 // updateAccount(currentWalletAddress!, connectedWallet!, currentChainId!);\n /**\n * switch account\n */\n if (!!currentWalletAddress && currentWalletAddress !== account.address) {\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 });\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 // console.log(\"🔗 wallet state handle\", connectedWallet);\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n console.log('-- aaaaa wallet', wallet);\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 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 { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\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 isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n\n }, [ee])\n\n return {}\n}","import { ExtensionPosition } from \"@orderly.network/ui\";\nimport { createContext, PropsWithChildren, ReactNode, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n // const { appIcons } = props;\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\nimport {\n useSymbolsInfo,\n useWS,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current\n );\n\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 </div>\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\nimport { API } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any\n) {\n const { symbol, side, quantity } = 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 displaySide = capitalizeString(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? \"Entire position\"\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case \"NEW\":\n title = \"Order opened\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"FILLED\":\n case \"PARTIAL_FILLED\":\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = \"Order filled\";\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case \"CANCELLED\":\n title = \"Order cancelled\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REJECTED\":\n title = \"Order rejected\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REPLACED\":\n title = \"Order edited\";\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
1
+ {"version":3,"sources":["../src/provider/orderlyAppProvider.tsx","../src/hooks/useBootstrap.ts","../src/provider/appContext.tsx","../src/hooks/useWalletStateHandle.ts","../src/hooks/useLinkDevice.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/provider/configContext.tsx","../src/hooks/useExecutionReport.tsx","../src/hooks/getOrderExecutionReportMsg.ts","../src/hooks/useDataTap.ts"],"names":["ModalProvider","OrderlyThemeProvider","Toaster","TooltipProvider","useEffect","useBootstrap","refCode","OrderlyConfigProvider","OrderlyTrackerProvider","createContext","useContext","useState","useMemo","useRef","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","useCallback","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","seSelectedChainId","account","isMobile","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","key","chainId","url","decodedUrl","orderlyKey","accountId","link","decodeBase64","base64","data","currentTime","expiredTime","useWalletStateHandle","options","connectedWallet","connect","namespace","isManualConnect","accountState","keyStore","networkId","chains","checkChainSupport","unsupported","setUnsupported","currentWalletAddress","currentChain","id","isSupported","localAddress","res","error","walletState","wallet","status","toast","capitalizeString","useEventEmitter","useSessionStorage","useWalletSubscription","useWalletEvent","ee","recordRef","record","setRecord","side","transStatus","showToast","isPushOnce","msg","useSettleSubscription","useSettleEvent","useWalletConnectError","useRestrictedAreas","jsx","AppContext","useAppContext","AppStateProvider","props","currentChainId","setCurrentChainId","connectWallet","wrongNetwork","restrictedInfo","AppConfigContext","useAppConfig","AppConfigProvider","transSymbolformString","AlgoOrderRootType","parseNumber","getOrderExecutionReportMsg","symbolsInfo","symbol","quantity","total_executed_quantity","getSymbolInfo","base_dp","displaySide","displaySymbol","displayQuantity","title","displayTotalExecutedQuantity","useSymbolsInfo","useDebouncedCallback","jsxs","useExecutionReport","symbolsInfoRef","handler","OrderlyAppProvider","onChainChanged","components","appIcons","configProps","useDataTap","state"],"mappings":"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","sourcesContent":["import { PropsWithChildren } from \"react\";\nimport { OrderlyAppConfig } from \"../types\";\nimport {\n ModalProvider,\n OrderlyThemeProvider,\n Toaster,\n TooltipProvider,\n} from \"@orderly.network/ui\";\nimport { useBootstrap } from \"../hooks/useBootstrap\";\nimport {\n ConfigProviderProps,\n OrderlyConfigProvider,\n OrderlyTrackerProvider,\n} from \"@orderly.network/hooks\";\nimport { AppStateProvider, AppStateProviderProps } from \"./appContext\";\nimport { AppConfigProvider } from \"./configContext\";\nimport { useExecutionReport } from \"../hooks/useExecutionReport\";\nimport { OrderlyThemeProviderProps } from \"@orderly.network/ui/src/provider/orderlyThemeProvider\";\n\nexport type OrderlyAppProviderProps = PropsWithChildren<\n OrderlyAppConfig & AppStateProviderProps & OrderlyThemeProviderProps\n>;\n\nconst OrderlyAppProvider = (props: OrderlyAppProviderProps) => {\n const {\n onChainChanged,\n // dateFormatting,\n components,\n appIcons,\n ...configProps\n } = props;\n\n useBootstrap();\n useExecutionReport();\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 as ConfigProviderProps)}>\n <AppStateProvider\n onChainChanged={onChainChanged}\n restrictedInfo={props.restrictedInfo}\n >\n <OrderlyTrackerProvider>\n <TooltipProvider delayDuration={300}>\n <ModalProvider>{props.children}</ModalProvider>\n </TooltipProvider>\n </OrderlyTrackerProvider>\n </AppStateProvider>\n <Toaster />\n </OrderlyConfigProvider>\n </OrderlyThemeProvider>\n </AppConfigProvider>\n );\n};\n\nOrderlyAppProvider.displayName = \"OrderlyAppProvider\";\n\nexport { OrderlyAppProvider };\n","import { useEffect } from \"react\";\nimport { useAccount, useWalletConnector } from \"@orderly.network/hooks\";\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","import {\n FC,\n createContext,\n PropsWithChildren,\n useContext,\n useState,\n} from \"react\";\nimport { useWalletStateHandle } from \"../hooks/useWalletStateHandle\";\nimport { useAppState } from \"../hooks/useAppState\";\nimport { useWalletEvent } from \"../hooks/useWalletEvent\";\nimport { useSettleEvent } from \"../hooks/useSettleEvent\";\nimport { useWalletConnectError } from \"../hooks/useWalletConnectError\";\nimport {\n useRestrictedAreas,\n RestrictedAreasReturns,\n IRestrictedAreasParams,\n} from \"@orderly.network/hooks\";\nimport { useLinkDevice } from \"../hooks/useLinkDevice\";\n\ntype AppContextState = {\n connectWallet: ReturnType<typeof useWalletStateHandle>[\"connectWallet\"];\n /**\n * Whether the current network is not supported\n */\n wrongNetwork: 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?: RestrictedAreasReturns;\n};\n\nconst AppContext = createContext<AppContextState>({} as AppContextState);\n\nexport const useAppContext = () => {\n return useContext(AppContext);\n};\n\nexport type AppStateProviderProps = {\n onChainChanged?: (\n chainId: number,\n state: { isTestnet: boolean; isWalletConnected: boolean }\n ) => void;\n restrictedInfo?: IRestrictedAreasParams;\n};\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n useLinkDevice();\n\n const { connectWallet, wrongNetwork } = useWalletStateHandle({\n // onChainChanged: props.onChainChanged,\n currentChainId,\n });\n\n useWalletEvent();\n useSettleEvent();\n useWalletConnectError();\n const restrictedInfo = useRestrictedAreas(props?.restrictedInfo ?? {});\n\n // const { networkStatus } = useAppState();\n\n return (\n <AppContext.Provider\n value={{\n connectWallet,\n wrongNetwork,\n currentChainId,\n setCurrentChainId,\n onChainChanged: props.onChainChanged,\n restrictedInfo,\n }}\n >\n {props.children}\n </AppContext.Provider>\n );\n};\n","import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useConfig, WalletState } from \"@orderly.network/hooks\";\nimport {\n useAccount,\n useChains,\n useKeyStore,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport {\n parseChainIdToNumber,\n praseChainIdToNumber,\n windowGuard,\n} from \"@orderly.network/utils\";\nimport {\n AccountStatusEnum,\n SDKError,\n ChainNamespace,\n NetworkId,\n} from \"@orderly.network/types\";\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 isManualConnect = useRef<boolean>(false);\n\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\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;\n if (typeof id === \"undefined\") return undefined;\n return {\n id: parseChainIdToNumber(id),\n namespace,\n };\n }, [connectedWallet]);\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\n setUnsupported(!isSupported);\n }, [connectedChain, chains, checkChainSupport, networkId]);\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 });\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 //\n if (!account) {\n throw new Error(\"account is not initialized\");\n }\n console.log(\"-- aaaaa wallet\", wallet);\n // clear link device data when connect wallt\n if (\n accountState.status ===\n AccountStatusEnum.EnableTradingWithoutConnected\n ) {\n localStorage.removeItem(\"orderly_selected_chainId\");\n await account.disconnect();\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 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 { useCallback, useEffect } from \"react\";\nimport {\n useAccount,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\n\ntype DecodedData = {\n addr: string;\n k: string;\n t: number;\n id: number;\n};\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, seSelectedChainId] = useLocalStorage<number | undefined>(\n \"orderly_selected_chainId\",\n undefined\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\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 = useCallback(async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, key, chainId } = linkData;\n const isSuccess = await account.importOrderlyKey(address, key);\n if (!isSuccess) return;\n seSelectedChainId(chainId);\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n }, [account, connectedChain]);\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n // persist status when refresh page\n useEffect(() => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const chainId = localStorage.getItem(\"orderly_selected_chainId\");\n if (isMobile && !connectedChain && chainId) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n account.checkOrderlyKey(address!, orderlyKey!, accountId!);\n }\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\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 { addr: address, k: key, id: chainId } = decodeBase64(link) || {};\n\n if (address && key && chainId) {\n return {\n address,\n key,\n chainId,\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 { useRef } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\nimport { capitalizeString } from \"@orderly.network/utils\";\nimport {\n useEventEmitter,\n useSessionStorage,\n useWalletSubscription,\n} from \"@orderly.network/hooks\";\n\nexport function useWalletEvent() {\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 isPushOnce = recordRef.current[id];\n setRecord({\n ...record,\n [id]: isPushOnce ? undefined : true,\n });\n\n showToast = !isPushOnce;\n }\n\n if (transStatus === \"COMPLETED\" && showToast) {\n let msg = `${capitalizeString(side)} completed`;\n toast.success(msg);\n } else if (transStatus === \"FAILED\" && showToast) {\n let msg = `${capitalizeString(side)} failed`;\n toast.error(msg);\n }\n\n ee.emit(\"wallet:changed\", data);\n },\n });\n}\n","import { useSettleSubscription } from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useSettleEvent() {\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(\"Settlement completed\");\n break;\n case \"FAILED\":\n toast.error(\"Settlement failed\");\n break;\n default:\n break;\n }\n },\n });\n}\n","import { useEventEmitter } from \"@orderly.network/hooks\";\nimport { useEffect } from \"react\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n\n }, [ee])\n\n return {}\n}","import { createContext, PropsWithChildren, useContext } from \"react\";\nimport { AppLogos } from \"../types\";\n\nexport type ThemeContextState = {\n appIcons?: AppLogos;\n brokerName: string;\n};\n\nconst AppConfigContext = createContext<ThemeContextState>(\n {} as ThemeContextState\n);\n\nexport const useAppConfig = () => {\n return useContext(AppConfigContext);\n};\n\nexport const AppConfigProvider = (\n props: PropsWithChildren<{\n appIcons?: AppLogos;\n brokerName: string;\n }>\n) => {\n return (\n <AppConfigContext.Provider value={props}>\n {props.children}\n </AppConfigContext.Provider>\n );\n};\n","import { useEffect, useRef } from \"react\";\nimport { getOrderExecutionReportMsg } from \"./getOrderExecutionReportMsg\";\nimport {\n useSymbolsInfo,\n useWS,\n useEventEmitter,\n useDebouncedCallback,\n} from \"@orderly.network/hooks\";\nimport { toast } from \"@orderly.network/ui\";\n\nexport function useExecutionReport() {\n const ee = useEventEmitter();\n\n const symbolsInfo = useSymbolsInfo();\n const symbolsInfoRef = useRef({});\n\n useEffect(() => {\n symbolsInfoRef.current = symbolsInfo;\n }, [symbolsInfo]);\n\n const handler = useDebouncedCallback((data: any) => {\n const showToast = (data: any) => {\n const { title, msg } = getOrderExecutionReportMsg(\n data,\n symbolsInfoRef.current\n );\n\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 </div>\n );\n }\n };\n\n showToast(data);\n }, 100);\n\n useEffect(() => {\n ee.on(\"orders:changed\", handler);\n\n return () => {\n ee.off(\"orders:changed\", handler);\n };\n }, []);\n}\n","import {\n capitalizeString,\n transSymbolformString,\n} from \"@orderly.network/utils\";\nimport { API } from \"@orderly.network/types\";\nimport { AlgoOrderRootType } from \"@orderly.network/types\";\nimport { parseNumber } from \"@orderly.network/ui\";\n\nexport function getOrderExecutionReportMsg(\n data: API.AlgoOrder | API.Order,\n symbolsInfo: any\n) {\n const { symbol, side, quantity } = 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 displaySide = capitalizeString(side);\n const displaySymbol = transSymbolformString(symbol);\n const displayQuantity =\n \"algo_type\" in data && data.algo_type === AlgoOrderRootType.POSITIONAL_TP_SL\n ? \"Entire position\"\n : base_dp === undefined\n ? quantity\n : parseNumber(quantity, { dp: base_dp });\n\n let title = \"\";\n let msg = \"\";\n switch (status) {\n case \"NEW\":\n title = \"Order opened\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"FILLED\":\n case \"PARTIAL_FILLED\":\n const displayTotalExecutedQuantity =\n base_dp === undefined\n ? total_executed_quantity\n : parseNumber(total_executed_quantity, { dp: base_dp });\n title = \"Order filled\";\n msg = `${displaySide} ${displaySymbol} ${displayTotalExecutedQuantity} / ${displayQuantity}`;\n break;\n case \"CANCELLED\":\n title = \"Order cancelled\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REJECTED\":\n title = \"Order rejected\";\n msg = `${displaySide} ${displaySymbol} ${displayQuantity}`;\n break;\n case \"REPLACED\":\n title = \"Order edited\";\n msg = `${side} ${displaySymbol} ${total_executed_quantity} / ${displayQuantity}`;\n break;\n default:\n break;\n }\n\n return {\n title,\n msg,\n };\n}\n","import { AccountStatusEnum } from \"@orderly.network/types\";\nimport { useAppContext } from \"../provider/appContext\";\nimport { useAccount } from \"@orderly.network/hooks\";\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 } = useAppContext();\n const { state } = useAccount();\n /**\n * ignore\n */\n if (options?.skip) return data;\n\n if (wrongNetwork) {\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orderly.network/react-app",
3
- "version": "2.0.1",
3
+ "version": "2.0.2",
4
4
  "description": "Create React App with Orderly Network components",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -17,10 +17,10 @@
17
17
  "access": "public"
18
18
  },
19
19
  "dependencies": {
20
- "@orderly.network/hooks": "2.0.1",
21
- "@orderly.network/utils": "2.0.1",
22
- "@orderly.network/ui": "2.0.1",
23
- "@orderly.network/types": "2.0.1"
20
+ "@orderly.network/ui": "2.0.2",
21
+ "@orderly.network/utils": "2.0.2",
22
+ "@orderly.network/hooks": "2.0.2",
23
+ "@orderly.network/types": "2.0.2"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/react": "^18.3.2",
@@ -29,7 +29,7 @@
29
29
  "react-dom": "^18.2.0",
30
30
  "tailwindcss": "^3.4.4",
31
31
  "tsup": "^7.3.0",
32
- "tsconfig": "0.3.17"
32
+ "tsconfig": "0.3.18"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": ">=18",