@orderly.network/react-app 2.0.5 → 2.0.6

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.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 E=()=>{react.useEffect(()=>{let t=new URLSearchParams(window.location.search).get("ref");t&&localStorage.setItem("referral_code",t);},[]);};var D="orderly:wallet-info";function O(){let{connectedChain:e,disconnect:t}=hooks.useWalletConnector(),[o,r]=hooks.useLocalStorage("orderly_link_device",{}),{account:n}=hooks.useAccount(),{isMobile:s}=ui.useScreen(),d=hooks.useConfig(),a=async c=>{localStorage.removeItem(D),await n.disconnect(),await t({label:c});};react.useEffect(()=>{let c=A(),u=JSON.parse(localStorage.getItem(D)??"{}");c&&u&&a(u.label);},[]);let i=async()=>{let c=A();if(!c)return;let{address:u,secretKey:p,chainId:f,chainNamespace:g}=c;if(!await n.importOrderlyKey({address:u,secretKey:p,chainNamespace:g}))return;r({chainId:f,chainNamespace:g});let C=new URL(window.location.href);C.searchParams.delete("link");let x=decodeURIComponent(C.toString());history.replaceState(null,"",x);};react.useEffect(()=>{s&&!e&&i();},[n,e,s]);let l=async()=>{let{chainId:c,chainNamespace:u}=ce()||{};if(s&&!e&&c&&u){let p=n.keyStore.getAddress(),f=n.keyStore.getOrderlyKey(),g=n.keyStore.getAccountId(p);await n.checkOrderlyKey(p,f,g)&&d.set("chainNamespace",u);}};return react.useEffect(()=>{l();},[n,s,e]),{linkDevice:i}}function ce(){try{let e=localStorage.getItem("orderly_link_device");return e?hooks.parseJSON(e):null}catch{}}function A(){let t=new URL(window.location.href).searchParams.get("link");if(!t)return;let{a:o,k:r,i:n,n:s}=de(t)||{};if(o&&r&&n&&s)return {address:o,secretKey:r,chainId:n,chainNamespace:s}}function de(e){try{let t=JSON.parse(window.atob(e)),o=Math.floor(Date.now()/1e3),r=t.t;return !r||o>r?void 0:t}catch{}}var W="orderly:wallet-info";var R=e=>{let{wallet:t,connect:o,connectedChain:r,disconnect:n,namespace:s}=hooks.useWalletConnector();if(typeof o!="function")throw new types.SDKError("Please provide a wallet connector provider");let d=react.useRef(false),{account:a,state:i}=hooks.useAccount(),l=hooks.useKeyStore(),c=hooks.useConfig("networkId"),[u,{checkChainSupport:p}]=hooks.useChains(),[f,g]=react.useState(false),S=react.useMemo(()=>t?.accounts?.[0]?.address,[t]),C=react.useMemo(()=>{let m=t?.chains?.[0]?.id,h=t?.chains?.[0]?.namespace;if(!(typeof m>"u"))return {id:utils.parseChainIdToNumber(m),namespace:h}},[t]);return react.useEffect(()=>{if(!r){g(false);return}let m=p(r.id,c);g(!m);},[r,u,p,c]),react.useEffect(()=>{utils.windowGuard(()=>{let m=l.getAddress(),h=JSON.parse(localStorage.getItem(W)??"{}");r?.namespace!==types.ChainNamespace.solana&&m&&a.address!==m&&h.label&&o({autoSelect:{label:h.label,disableModals:true}}).then(P=>{},P=>{});});},[t,a.address]),react.useEffect(()=>{if(t===null&&i.status>types.AccountStatusEnum.NotConnected&&!i.validating){a.disconnect();return}if(f||!r||d.current)return;let m=A();S&&S!==a.address&&!m&&(a.setAddress(S,{provider:t?.provider,chain:{id:utils.praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:t.label}}),utils.windowGuard(()=>{localStorage.setItem(W,JSON.stringify({label:t.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[t,r,S,C,a.address,i,a.chainId,f]),{connectWallet:async()=>(d.current=true,o({chainId:e.currentChainId}).then(async m=>{if(Array.isArray(m)&&m.length>0&&m[0]&&m[0].accounts.length>0){let h=m[0],P=utils.praseChainIdToNumber(h.chains[0].id);if(!p(P,c))return {wrongNetwork:true};if(!a)throw new Error("account is not initialized");i.status===types.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await a.disconnect());let ee=await a.setAddress(h.accounts[0].address,{provider:h.provider,chain:{id:utils.praseChainIdToNumber(h.chains[0].id),namespace:h.chains[0].namespace.toUpperCase()},wallet:{name:h.label}});return {wallet:h,status:ee,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:f}};function M(){let e=hooks.useEventEmitter(),t=react.useRef({}),[o,r]=hooks.useSessionStorage("orderly_wallet_change_id",{});t.current=o,hooks.useWalletSubscription({onMessage:n=>{let{id:s,side:d,transStatus:a}=n,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(a)){let l=t.current[s];r({...o,[s]:l?void 0:true}),i=!l;}if(a==="COMPLETED"&&i){let l=`${utils.capitalizeString(d)} completed`;ui.toast.success(l);}else if(a==="FAILED"&&i){let l=`${utils.capitalizeString(d)} failed`;ui.toast.error(l);}e.emit("wallet:changed",n);}});}function F(){hooks.useSettleSubscription({onMessage:e=>{let{status:t}=e;switch(t){case "COMPLETED":ui.toast.success("Settlement completed");break;case "FAILED":ui.toast.error("Settlement failed");break;}}});}function U(){let e=hooks.useEventEmitter();return react.useEffect(()=>{e.on("wallet:connect-error",t=>{ui.toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{ui.modal.confirm({title:"Sign Message Failed",content:"Are you using Ledger Wallet?",size:"sm",onOk:async()=>{let o=window.localStorage.getItem(types.LedgerWalletKey);if(!o)window.localStorage.setItem(types.LedgerWalletKey,JSON.stringify([t.userAddress]));else {let r=JSON.parse(o??"[]");r.push(t.userAddress),window.localStorage.setItem(types.LedgerWalletKey,r);}return Promise.resolve()},okLabel:"OK",onCancel:async()=>(ui.toast.error(t.message),Promise.resolve()),cancelLabel:"No"}).then(o=>{});});});},[e]),{}}function H(e){let[t,o]=react.useState(),[r]=hooks.useChains(),n=hooks.useConfig("networkId"),{connectedChain:s}=hooks.useWalletConnector();return react.useEffect(()=>{if(s)o?.(typeof s.id=="number"?s.id:parseInt(s.id));else {if(t)return;let d,a=n==="mainnet"?r.mainnet?.[0]:r.testnet?.[0];typeof e=="function"?d=e(n,r):typeof e=="object"&&(d=n==="mainnet"?e?.mainnet:e?.testnet);let i=d?.id||a?.network_infos?.chain_id;if(!i)return;o?.(i);}},[s,r,t,n,o,e]),[t,o]}var q=react.createContext({}),b=()=>react.useContext(q),z=e=>{let[t,o]=H(e.defaultChain);O();let{connectWallet:r,wrongNetwork:n}=R({currentChainId:t});M(),F(),U();let s=hooks.useRestrictedAreas(e?.restrictedInfo??{});return jsxRuntime.jsx(q.Provider,{value:{connectWallet:r,wrongNetwork:n,currentChainId:t,setCurrentChainId:o,onChainChanged:e.onChainChanged,restrictedInfo:s},children:e.children})};var B=react.createContext({}),Ke=()=>react.useContext(B),Q=e=>jsxRuntime.jsx(B.Provider,{value:e,children:e.children});function G(e,t){let{symbol:o,side:r,quantity:n}=e,s="total_executed_quantity"in e?e.total_executed_quantity:0,d="status"in e?e.status:e.algo_status,a=t[o],i=a("base_dp"),l=utils.capitalizeString(r),c=utils.transSymbolformString(o),u="algo_type"in e&&e.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":i===void 0?n:ui.parseNumber(n,{dp:i}),p="",f="";switch(d){case "NEW":p="Order opened",f=`${l} ${c} ${u}`;break;case "FILLED":case "PARTIAL_FILLED":let g=i===void 0?s:ui.parseNumber(s,{dp:i});p="Order filled",f=`${l} ${c} ${g} / ${u}`;break;case "CANCELLED":p="Order cancelled",f=`${l} ${c} ${u}`;break;case "REJECTED":p="Order rejected",f=`${l} ${c} ${u}`;break;case "REPLACED":p="Order edited",f=`${r} ${c} ${s} / ${u}`;break;}return {title:p,msg:f}}function X(){let e=hooks.useEventEmitter(),t=hooks.useSymbolsInfo(),o=react.useRef({});react.useEffect(()=>{o.current=t;},[t]);let r=hooks.useDebouncedCallback(n=>{(d=>{let{title:a,msg:i}=G(d,o.current);a&&i&&ui.toast.success(jsxRuntime.jsxs("div",{children:[a,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:i})]}));})(n);},100);react.useEffect(()=>(e.on("orders:changed",r),()=>{e.off("orders:changed",r);}),[]);}var Z=e=>{let{components:t,appIcons:o,onChainChanged:r,defaultChain:n,...s}=e;return E(),X(),jsxRuntime.jsx(Q,{appIcons:o,brokerName:e.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:t,overrides:e.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...s,children:[jsxRuntime.jsx(z,{onChainChanged:r,defaultChain:n,restrictedInfo:e.restrictedInfo,children:jsxRuntime.jsx(hooks.OrderlyTrackerProvider,{children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:e.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};Z.displayName="OrderlyAppProvider";var nt=(e,t)=>{let{wrongNetwork:o}=b(),{state:r}=hooks.useAccount();return t?.skip?e:o||typeof t?.accountStatus<"u"&&r.status<t.accountStatus?typeof t?.fallbackData<"u"?t.fallbackData:null:e};
10
+ var x=()=>{react.useEffect(()=>{let t=new URLSearchParams(window.location.search).get("ref");t&&localStorage.setItem("referral_code",t);},[]);};var E="orderly:wallet-info";function D(){let{connectedChain:e,disconnect:t}=hooks.useWalletConnector(),[r,o]=hooks.useLocalStorage("orderly_link_device",{}),{account:n}=hooks.useAccount(),{isMobile:s}=ui.useScreen(),d=hooks.useConfig(),a=async c=>{localStorage.removeItem(E),await n.disconnect(),await t({label:c});};react.useEffect(()=>{let c=A(),u=JSON.parse(localStorage.getItem(E)??"{}");c&&u&&a(u.label);},[]);let i=async()=>{let c=A();if(!c)return;let{address:u,secretKey:p,chainId:f,chainNamespace:g}=c;if(!await n.importOrderlyKey({address:u,secretKey:p,chainNamespace:g}))return;o({chainId:f,chainNamespace:g});let C=new URL(window.location.href);C.searchParams.delete("link");let b=decodeURIComponent(C.toString());history.replaceState(null,"",b);};react.useEffect(()=>{s&&!e&&i();},[n,e,s]);let l=async()=>{let{chainId:c,chainNamespace:u}=ie()||{};if(s&&!e&&c&&u){let p=n.keyStore.getAddress(),f=n.keyStore.getOrderlyKey(),g=n.keyStore.getAccountId(p);await n.checkOrderlyKey(p,f,g)&&d.set("chainNamespace",u);}};return react.useEffect(()=>{l();},[n,s,e]),{linkDevice:i}}function ie(){try{let e=localStorage.getItem("orderly_link_device");return e?hooks.parseJSON(e):null}catch{}}function A(){let t=new URL(window.location.href).searchParams.get("link");if(!t)return;let{a:r,k:o,i:n,n:s}=ce(t)||{};if(r&&o&&n&&s)return {address:r,secretKey:o,chainId:n,chainNamespace:s}}function ce(e){try{let t=JSON.parse(window.atob(e)),r=Math.floor(Date.now()/1e3),o=t.t;return !o||r>o?void 0:t}catch{}}var T="orderly:wallet-info";var W=e=>{let{wallet:t,connect:r,connectedChain:o,disconnect:n,namespace:s}=hooks.useWalletConnector();if(typeof r!="function")throw new types.SDKError("Please provide a wallet connector provider");let d=react.useRef(false),{account:a,state:i}=hooks.useAccount(),l=hooks.useKeyStore(),c=hooks.useConfig("networkId"),[u,{checkChainSupport:p}]=hooks.useChains(),[f,g]=react.useState(false),S=react.useMemo(()=>t?.accounts?.[0]?.address,[t]),C=react.useMemo(()=>{let m=t?.chains?.[0]?.id,h=t?.chains?.[0]?.namespace;if(!(typeof m>"u"))return {id:utils.parseChainIdToNumber(m),namespace:h}},[t]);return react.useEffect(()=>{if(!o){g(false);return}let m=p(o.id,c);g(!m);},[o,u,p,c]),react.useEffect(()=>{utils.windowGuard(()=>{let m=l.getAddress(),h=JSON.parse(localStorage.getItem(T)??"{}");o?.namespace!==types.ChainNamespace.solana&&m&&a.address!==m&&h.label&&r({autoSelect:{label:h.label,disableModals:true}}).then(P=>{},P=>{});});},[t,a.address]),react.useEffect(()=>{if(t===null&&i.status>types.AccountStatusEnum.NotConnected&&!i.validating){a.disconnect();return}if(f||!o||d.current)return;let m=A();S&&S!==a.address&&!m&&(a.setAddress(S,{provider:t?.provider,chain:{id:utils.praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:t.label}}),utils.windowGuard(()=>{localStorage.setItem(T,JSON.stringify({label:t.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[t,o,S,C,a.address,i,a.chainId,f]),{connectWallet:async()=>(d.current=true,r({chainId:e.currentChainId}).then(async m=>{if(Array.isArray(m)&&m.length>0&&m[0]&&m[0].accounts.length>0){let h=m[0],P=utils.praseChainIdToNumber(h.chains[0].id);if(!p(P,c))return {wrongNetwork:true};if(!a)throw new Error("account is not initialized");i.status===types.AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await a.disconnect());let Z=await a.setAddress(h.accounts[0].address,{provider:h.provider,chain:{id:utils.praseChainIdToNumber(h.chains[0].id),namespace:h.chains[0].namespace.toUpperCase()},wallet:{name:h.label}});return {wallet:h,status:Z,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:f}};function $(){let e=hooks.useEventEmitter(),t=react.useRef({}),[r,o]=hooks.useSessionStorage("orderly_wallet_change_id",{});t.current=r,hooks.useWalletSubscription({onMessage:n=>{let{id:s,side:d,transStatus:a}=n,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(a)){let l=t.current[s];o({...r,[s]:l?void 0:true}),i=!l;}if(a==="COMPLETED"&&i){let l=`${utils.capitalizeString(d)} completed`;ui.toast.success(l);}else if(a==="FAILED"&&i){let l=`${utils.capitalizeString(d)} failed`;ui.toast.error(l);}e.emit("wallet:changed",n);}});}function K(){hooks.useSettleSubscription({onMessage:e=>{let{status:t}=e;switch(t){case "COMPLETED":ui.toast.success("Settlement completed");break;case "FAILED":ui.toast.error("Settlement failed");break;}}});}function U(){let e=hooks.useEventEmitter(),{setLedgerAddress:t}=hooks.useStorageLedgerAddress();return react.useEffect(()=>{e.on("wallet:connect-error",r=>{ui.toast.error(r.message);}),e.on("wallet:sign-message-with-ledger-error",r=>{window.setTimeout(()=>{ui.modal.confirm({title:"Sign Message Failed",content:"Are you using Ledger Wallet?",size:"sm",onOk:async()=>(t(r.userAddress),Promise.resolve()),okLabel:"OK",onCancel:async()=>(ui.toast.error(r.message),Promise.resolve()),cancelLabel:"No"}).then(o=>{});});});},[e]),{}}function J(e){let[t,r]=react.useState(),[o]=hooks.useChains(),n=hooks.useConfig("networkId"),{connectedChain:s}=hooks.useWalletConnector();return react.useEffect(()=>{if(s)r?.(typeof s.id=="number"?s.id:parseInt(s.id));else {if(t)return;let d,a=n==="mainnet"?o.mainnet?.[0]:o.testnet?.[0];typeof e=="function"?d=e(n,o):typeof e=="object"&&(d=n==="mainnet"?e?.mainnet:e?.testnet);let i=d?.id||a?.network_infos?.chain_id;if(!i)return;r?.(i);}},[s,o,t,n,r,e]),[t,r]}var H=react.createContext({}),w=()=>react.useContext(H),q=e=>{let[t,r]=J(e.defaultChain);D();let{connectWallet:o,wrongNetwork:n}=W({currentChainId:t});$(),K(),U();let s=hooks.useRestrictedAreas(e?.restrictedInfo??{});return jsxRuntime.jsx(H.Provider,{value:{connectWallet:o,wrongNetwork:n,currentChainId:t,setCurrentChainId:r,onChainChanged:e.onChainChanged,restrictedInfo:s},children:e.children})};var z=react.createContext({}),Ke=()=>react.useContext(z),B=e=>jsxRuntime.jsx(z.Provider,{value:e,children:e.children});function Y(e,t){let{symbol:r,side:o,quantity:n}=e,s="total_executed_quantity"in e?e.total_executed_quantity:0,d="status"in e?e.status:e.algo_status,a=t[r],i=a("base_dp"),l=utils.capitalizeString(o),c=utils.transSymbolformString(r),u="algo_type"in e&&e.algo_type===types.AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":i===void 0?n:ui.parseNumber(n,{dp:i}),p="",f="";switch(d){case "NEW":p="Order opened",f=`${l} ${c} ${u}`;break;case "FILLED":case "PARTIAL_FILLED":let g=i===void 0?s:ui.parseNumber(s,{dp:i});p="Order filled",f=`${l} ${c} ${g} / ${u}`;break;case "CANCELLED":p="Order cancelled",f=`${l} ${c} ${u}`;break;case "REJECTED":p="Order rejected",f=`${l} ${c} ${u}`;break;case "REPLACED":p="Order edited",f=`${o} ${c} ${s} / ${u}`;break;}return {title:p,msg:f}}function V(){let e=hooks.useEventEmitter(),t=hooks.useSymbolsInfo(),r=react.useRef({});react.useEffect(()=>{r.current=t;},[t]);let o=hooks.useDebouncedCallback(n=>{(d=>{let{title:a,msg:i}=Y(d,r.current);a&&i&&ui.toast.success(jsxRuntime.jsxs("div",{children:[a,jsxRuntime.jsx("br",{}),jsxRuntime.jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:i})]}));})(n);},100);react.useEffect(()=>(e.on("orders:changed",o),()=>{e.off("orders:changed",o);}),[]);}var X=e=>{let{components:t,appIcons:r,onChainChanged:o,defaultChain:n,...s}=e;return x(),V(),jsxRuntime.jsx(B,{appIcons:r,brokerName:e.brokerName,children:jsxRuntime.jsx(ui.OrderlyThemeProvider,{components:t,overrides:e.overrides,children:jsxRuntime.jsxs(hooks.OrderlyConfigProvider,{...s,children:[jsxRuntime.jsx(q,{onChainChanged:o,defaultChain:n,restrictedInfo:e.restrictedInfo,children:jsxRuntime.jsx(hooks.OrderlyTrackerProvider,{children:jsxRuntime.jsx(ui.TooltipProvider,{delayDuration:300,children:jsxRuntime.jsx(ui.ModalProvider,{children:e.children})})})}),jsxRuntime.jsx(ui.Toaster,{})]})})})};X.displayName="OrderlyAppProvider";var nt=(e,t)=>{let{wrongNetwork:r}=w(),{state:o}=hooks.useAccount();return t?.skip?e:r||typeof t?.accountStatus<"u"&&o.status<t.accountStatus?typeof t?.fallbackData<"u"?t.fallbackData:null:e};
11
11
 
12
- exports.OrderlyAppProvider = Z;
12
+ exports.OrderlyAppProvider = X;
13
13
  exports.useAppConfig = Ke;
14
- exports.useAppContext = b;
14
+ exports.useAppContext = w;
15
15
  exports.useDataTap = nt;
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/useLinkDevice.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useCurrentChainId.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","useMemo","useRef","useState","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","parseJSON","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainId","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","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","modal","LedgerWalletKey","useWalletConnectError","info","ledgerWallet","useRestrictedAreas","useCurrentChainId","defaultChain","currentChainId","setCurrentChainId","fallbackChain","firstChain","jsx","AppContext","useAppContext","AppStateProvider","props","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","components","appIcons","onChainChanged","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 // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\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 defaultChain={defaultChain}\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 { FC, createContext, PropsWithChildren, useContext } 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\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\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 restrictedInfo?: IRestrictedAreasParams;\n defaultChain?: DefaultChain;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain\n );\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_link_device\");\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 parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { 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 { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\n\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n ee.on('wallet:sign-message-with-ledger-error', (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n\n modal.confirm({\n title: 'Sign Message Failed',\n content: \"Are you using Ledger Wallet?\",\n size: 'sm',\n onOk: async () => {\n console.log('-- use ledger', true);\n const info = window.localStorage.getItem(LedgerWalletKey);\n if (!info) {\n window.localStorage.setItem(LedgerWalletKey, JSON.stringify([data.userAddress]));\n } else {\n const ledgerWallet = JSON.parse(info ?? '[]');\n ledgerWallet.push(data.userAddress);\n window.localStorage.setItem(LedgerWalletKey, ledgerWallet);\n }\n // todo localstorage\n return Promise.resolve();\n },\n okLabel: 'OK',\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: 'No',\n\n }).then(res => {\n console.log('-- dialog res', res);\n });\n\n });\n\n })\n\n }, [ee])\n\n return {}\n}","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n setCurrentChainId?.(chainId);\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { 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"]}
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/hooks/useCurrentChainId.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","useMemo","useRef","useState","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","parseJSON","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainId","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","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","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","useRestrictedAreas","useCurrentChainId","defaultChain","currentChainId","setCurrentChainId","fallbackChain","firstChain","jsx","AppContext","useAppContext","AppStateProvider","props","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","components","appIcons","onChainChanged","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 // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\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 defaultChain={defaultChain}\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 { FC, createContext, PropsWithChildren, useContext } 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\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\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 restrictedInfo?: IRestrictedAreasParams;\n defaultChain?: DefaultChain;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain\n );\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_link_device\");\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 parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { 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 { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\"; \n\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n const {setLedgerAddress} = useStorageLedgerAddress(); \n\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n ee.on('wallet:sign-message-with-ledger-error', (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n\n modal.confirm({\n title: 'Sign Message Failed',\n content: \"Are you using Ledger Wallet?\",\n size: 'sm',\n onOk: async () => {\n console.log('-- use ledger', true);\n setLedgerAddress(data.userAddress);\n \n return Promise.resolve();\n },\n okLabel: 'OK',\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: 'No',\n\n }).then(res => {\n console.log('-- dialog res', res);\n });\n\n });\n\n })\n\n }, [ee])\n\n return {}\n}","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n setCurrentChainId?.(chainId);\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { 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
1
  import { OrderlyThemeProvider, TooltipProvider, ModalProvider, Toaster, toast, parseNumber, useScreen, modal } from '@orderly.network/ui';
2
2
  import { createContext, useContext, useEffect, useRef, useState, useMemo } from 'react';
3
- import { OrderlyConfigProvider, OrderlyTrackerProvider, useAccount, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useRestrictedAreas, useChains, useConfig, useWalletConnector, useLocalStorage, useKeyStore, useSessionStorage, useWalletSubscription, useSettleSubscription, parseJSON } from '@orderly.network/hooks';
3
+ import { OrderlyConfigProvider, OrderlyTrackerProvider, useAccount, useEventEmitter, useSymbolsInfo, useDebouncedCallback, useRestrictedAreas, useChains, useConfig, useWalletConnector, useLocalStorage, useKeyStore, useSessionStorage, useWalletSubscription, useSettleSubscription, useStorageLedgerAddress, parseJSON } from '@orderly.network/hooks';
4
4
  import { capitalizeString, transSymbolformString, parseChainIdToNumber, windowGuard, praseChainIdToNumber } from '@orderly.network/utils';
5
- import { AlgoOrderRootType, SDKError, ChainNamespace, AccountStatusEnum, LedgerWalletKey } from '@orderly.network/types';
5
+ import { AlgoOrderRootType, SDKError, ChainNamespace, AccountStatusEnum } from '@orderly.network/types';
6
6
  import { jsx, jsxs } from 'react/jsx-runtime';
7
7
 
8
- var E=()=>{useEffect(()=>{let t=new URLSearchParams(window.location.search).get("ref");t&&localStorage.setItem("referral_code",t);},[]);};var D="orderly:wallet-info";function O(){let{connectedChain:e,disconnect:t}=useWalletConnector(),[o,r]=useLocalStorage("orderly_link_device",{}),{account:n}=useAccount(),{isMobile:s}=useScreen(),d=useConfig(),a=async c=>{localStorage.removeItem(D),await n.disconnect(),await t({label:c});};useEffect(()=>{let c=A(),u=JSON.parse(localStorage.getItem(D)??"{}");c&&u&&a(u.label);},[]);let i=async()=>{let c=A();if(!c)return;let{address:u,secretKey:p,chainId:f,chainNamespace:g}=c;if(!await n.importOrderlyKey({address:u,secretKey:p,chainNamespace:g}))return;r({chainId:f,chainNamespace:g});let C=new URL(window.location.href);C.searchParams.delete("link");let x=decodeURIComponent(C.toString());history.replaceState(null,"",x);};useEffect(()=>{s&&!e&&i();},[n,e,s]);let l=async()=>{let{chainId:c,chainNamespace:u}=ce()||{};if(s&&!e&&c&&u){let p=n.keyStore.getAddress(),f=n.keyStore.getOrderlyKey(),g=n.keyStore.getAccountId(p);await n.checkOrderlyKey(p,f,g)&&d.set("chainNamespace",u);}};return useEffect(()=>{l();},[n,s,e]),{linkDevice:i}}function ce(){try{let e=localStorage.getItem("orderly_link_device");return e?parseJSON(e):null}catch{}}function A(){let t=new URL(window.location.href).searchParams.get("link");if(!t)return;let{a:o,k:r,i:n,n:s}=de(t)||{};if(o&&r&&n&&s)return {address:o,secretKey:r,chainId:n,chainNamespace:s}}function de(e){try{let t=JSON.parse(window.atob(e)),o=Math.floor(Date.now()/1e3),r=t.t;return !r||o>r?void 0:t}catch{}}var W="orderly:wallet-info";var R=e=>{let{wallet:t,connect:o,connectedChain:r,disconnect:n,namespace:s}=useWalletConnector();if(typeof o!="function")throw new SDKError("Please provide a wallet connector provider");let d=useRef(false),{account:a,state:i}=useAccount(),l=useKeyStore(),c=useConfig("networkId"),[u,{checkChainSupport:p}]=useChains(),[f,g]=useState(false),S=useMemo(()=>t?.accounts?.[0]?.address,[t]),C=useMemo(()=>{let m=t?.chains?.[0]?.id,h=t?.chains?.[0]?.namespace;if(!(typeof m>"u"))return {id:parseChainIdToNumber(m),namespace:h}},[t]);return useEffect(()=>{if(!r){g(false);return}let m=p(r.id,c);g(!m);},[r,u,p,c]),useEffect(()=>{windowGuard(()=>{let m=l.getAddress(),h=JSON.parse(localStorage.getItem(W)??"{}");r?.namespace!==ChainNamespace.solana&&m&&a.address!==m&&h.label&&o({autoSelect:{label:h.label,disableModals:true}}).then(P=>{},P=>{});});},[t,a.address]),useEffect(()=>{if(t===null&&i.status>AccountStatusEnum.NotConnected&&!i.validating){a.disconnect();return}if(f||!r||d.current)return;let m=A();S&&S!==a.address&&!m&&(a.setAddress(S,{provider:t?.provider,chain:{id:praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:t.label}}),windowGuard(()=>{localStorage.setItem(W,JSON.stringify({label:t.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[t,r,S,C,a.address,i,a.chainId,f]),{connectWallet:async()=>(d.current=true,o({chainId:e.currentChainId}).then(async m=>{if(Array.isArray(m)&&m.length>0&&m[0]&&m[0].accounts.length>0){let h=m[0],P=praseChainIdToNumber(h.chains[0].id);if(!p(P,c))return {wrongNetwork:true};if(!a)throw new Error("account is not initialized");i.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await a.disconnect());let ee=await a.setAddress(h.accounts[0].address,{provider:h.provider,chain:{id:praseChainIdToNumber(h.chains[0].id),namespace:h.chains[0].namespace.toUpperCase()},wallet:{name:h.label}});return {wallet:h,status:ee,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:f}};function M(){let e=useEventEmitter(),t=useRef({}),[o,r]=useSessionStorage("orderly_wallet_change_id",{});t.current=o,useWalletSubscription({onMessage:n=>{let{id:s,side:d,transStatus:a}=n,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(a)){let l=t.current[s];r({...o,[s]:l?void 0:true}),i=!l;}if(a==="COMPLETED"&&i){let l=`${capitalizeString(d)} completed`;toast.success(l);}else if(a==="FAILED"&&i){let l=`${capitalizeString(d)} failed`;toast.error(l);}e.emit("wallet:changed",n);}});}function F(){useSettleSubscription({onMessage:e=>{let{status:t}=e;switch(t){case "COMPLETED":toast.success("Settlement completed");break;case "FAILED":toast.error("Settlement failed");break;}}});}function U(){let e=useEventEmitter();return useEffect(()=>{e.on("wallet:connect-error",t=>{toast.error(t.message);}),e.on("wallet:sign-message-with-ledger-error",t=>{window.setTimeout(()=>{modal.confirm({title:"Sign Message Failed",content:"Are you using Ledger Wallet?",size:"sm",onOk:async()=>{let o=window.localStorage.getItem(LedgerWalletKey);if(!o)window.localStorage.setItem(LedgerWalletKey,JSON.stringify([t.userAddress]));else {let r=JSON.parse(o??"[]");r.push(t.userAddress),window.localStorage.setItem(LedgerWalletKey,r);}return Promise.resolve()},okLabel:"OK",onCancel:async()=>(toast.error(t.message),Promise.resolve()),cancelLabel:"No"}).then(o=>{});});});},[e]),{}}function H(e){let[t,o]=useState(),[r]=useChains(),n=useConfig("networkId"),{connectedChain:s}=useWalletConnector();return useEffect(()=>{if(s)o?.(typeof s.id=="number"?s.id:parseInt(s.id));else {if(t)return;let d,a=n==="mainnet"?r.mainnet?.[0]:r.testnet?.[0];typeof e=="function"?d=e(n,r):typeof e=="object"&&(d=n==="mainnet"?e?.mainnet:e?.testnet);let i=d?.id||a?.network_infos?.chain_id;if(!i)return;o?.(i);}},[s,r,t,n,o,e]),[t,o]}var q=createContext({}),b=()=>useContext(q),z=e=>{let[t,o]=H(e.defaultChain);O();let{connectWallet:r,wrongNetwork:n}=R({currentChainId:t});M(),F(),U();let s=useRestrictedAreas(e?.restrictedInfo??{});return jsx(q.Provider,{value:{connectWallet:r,wrongNetwork:n,currentChainId:t,setCurrentChainId:o,onChainChanged:e.onChainChanged,restrictedInfo:s},children:e.children})};var B=createContext({}),Ke=()=>useContext(B),Q=e=>jsx(B.Provider,{value:e,children:e.children});function G(e,t){let{symbol:o,side:r,quantity:n}=e,s="total_executed_quantity"in e?e.total_executed_quantity:0,d="status"in e?e.status:e.algo_status,a=t[o],i=a("base_dp"),l=capitalizeString(r),c=transSymbolformString(o),u="algo_type"in e&&e.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":i===void 0?n:parseNumber(n,{dp:i}),p="",f="";switch(d){case "NEW":p="Order opened",f=`${l} ${c} ${u}`;break;case "FILLED":case "PARTIAL_FILLED":let g=i===void 0?s:parseNumber(s,{dp:i});p="Order filled",f=`${l} ${c} ${g} / ${u}`;break;case "CANCELLED":p="Order cancelled",f=`${l} ${c} ${u}`;break;case "REJECTED":p="Order rejected",f=`${l} ${c} ${u}`;break;case "REPLACED":p="Order edited",f=`${r} ${c} ${s} / ${u}`;break;}return {title:p,msg:f}}function X(){let e=useEventEmitter(),t=useSymbolsInfo(),o=useRef({});useEffect(()=>{o.current=t;},[t]);let r=useDebouncedCallback(n=>{(d=>{let{title:a,msg:i}=G(d,o.current);a&&i&&toast.success(jsxs("div",{children:[a,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:i})]}));})(n);},100);useEffect(()=>(e.on("orders:changed",r),()=>{e.off("orders:changed",r);}),[]);}var Z=e=>{let{components:t,appIcons:o,onChainChanged:r,defaultChain:n,...s}=e;return E(),X(),jsx(Q,{appIcons:o,brokerName:e.brokerName,children:jsx(OrderlyThemeProvider,{components:t,overrides:e.overrides,children:jsxs(OrderlyConfigProvider,{...s,children:[jsx(z,{onChainChanged:r,defaultChain:n,restrictedInfo:e.restrictedInfo,children:jsx(OrderlyTrackerProvider,{children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:e.children})})})}),jsx(Toaster,{})]})})})};Z.displayName="OrderlyAppProvider";var nt=(e,t)=>{let{wrongNetwork:o}=b(),{state:r}=useAccount();return t?.skip?e:o||typeof t?.accountStatus<"u"&&r.status<t.accountStatus?typeof t?.fallbackData<"u"?t.fallbackData:null:e};
8
+ var x=()=>{useEffect(()=>{let t=new URLSearchParams(window.location.search).get("ref");t&&localStorage.setItem("referral_code",t);},[]);};var E="orderly:wallet-info";function D(){let{connectedChain:e,disconnect:t}=useWalletConnector(),[r,o]=useLocalStorage("orderly_link_device",{}),{account:n}=useAccount(),{isMobile:s}=useScreen(),d=useConfig(),a=async c=>{localStorage.removeItem(E),await n.disconnect(),await t({label:c});};useEffect(()=>{let c=A(),u=JSON.parse(localStorage.getItem(E)??"{}");c&&u&&a(u.label);},[]);let i=async()=>{let c=A();if(!c)return;let{address:u,secretKey:p,chainId:f,chainNamespace:g}=c;if(!await n.importOrderlyKey({address:u,secretKey:p,chainNamespace:g}))return;o({chainId:f,chainNamespace:g});let C=new URL(window.location.href);C.searchParams.delete("link");let b=decodeURIComponent(C.toString());history.replaceState(null,"",b);};useEffect(()=>{s&&!e&&i();},[n,e,s]);let l=async()=>{let{chainId:c,chainNamespace:u}=ie()||{};if(s&&!e&&c&&u){let p=n.keyStore.getAddress(),f=n.keyStore.getOrderlyKey(),g=n.keyStore.getAccountId(p);await n.checkOrderlyKey(p,f,g)&&d.set("chainNamespace",u);}};return useEffect(()=>{l();},[n,s,e]),{linkDevice:i}}function ie(){try{let e=localStorage.getItem("orderly_link_device");return e?parseJSON(e):null}catch{}}function A(){let t=new URL(window.location.href).searchParams.get("link");if(!t)return;let{a:r,k:o,i:n,n:s}=ce(t)||{};if(r&&o&&n&&s)return {address:r,secretKey:o,chainId:n,chainNamespace:s}}function ce(e){try{let t=JSON.parse(window.atob(e)),r=Math.floor(Date.now()/1e3),o=t.t;return !o||r>o?void 0:t}catch{}}var T="orderly:wallet-info";var W=e=>{let{wallet:t,connect:r,connectedChain:o,disconnect:n,namespace:s}=useWalletConnector();if(typeof r!="function")throw new SDKError("Please provide a wallet connector provider");let d=useRef(false),{account:a,state:i}=useAccount(),l=useKeyStore(),c=useConfig("networkId"),[u,{checkChainSupport:p}]=useChains(),[f,g]=useState(false),S=useMemo(()=>t?.accounts?.[0]?.address,[t]),C=useMemo(()=>{let m=t?.chains?.[0]?.id,h=t?.chains?.[0]?.namespace;if(!(typeof m>"u"))return {id:parseChainIdToNumber(m),namespace:h}},[t]);return useEffect(()=>{if(!o){g(false);return}let m=p(o.id,c);g(!m);},[o,u,p,c]),useEffect(()=>{windowGuard(()=>{let m=l.getAddress(),h=JSON.parse(localStorage.getItem(T)??"{}");o?.namespace!==ChainNamespace.solana&&m&&a.address!==m&&h.label&&r({autoSelect:{label:h.label,disableModals:true}}).then(P=>{},P=>{});});},[t,a.address]),useEffect(()=>{if(t===null&&i.status>AccountStatusEnum.NotConnected&&!i.validating){a.disconnect();return}if(f||!o||d.current)return;let m=A();S&&S!==a.address&&!m&&(a.setAddress(S,{provider:t?.provider,chain:{id:praseChainIdToNumber(C.id),namespace:C.namespace.toUpperCase()},wallet:{name:t.label}}),windowGuard(()=>{localStorage.setItem(T,JSON.stringify({label:t.label}));})),C?.id!==a.chainId&&a.switchChainId(C?.id);},[t,o,S,C,a.address,i,a.chainId,f]),{connectWallet:async()=>(d.current=true,r({chainId:e.currentChainId}).then(async m=>{if(Array.isArray(m)&&m.length>0&&m[0]&&m[0].accounts.length>0){let h=m[0],P=praseChainIdToNumber(h.chains[0].id);if(!p(P,c))return {wrongNetwork:true};if(!a)throw new Error("account is not initialized");i.status===AccountStatusEnum.EnableTradingWithoutConnected&&(localStorage.removeItem("orderly_link_device"),await a.disconnect());let Z=await a.setAddress(h.accounts[0].address,{provider:h.provider,chain:{id:praseChainIdToNumber(h.chains[0].id),namespace:h.chains[0].namespace.toUpperCase()},wallet:{name:h.label}});return {wallet:h,status:Z,wrongNetwork:false}}return null}).finally(()=>{d.current=false;})),wrongNetwork:f}};function $(){let e=useEventEmitter(),t=useRef({}),[r,o]=useSessionStorage("orderly_wallet_change_id",{});t.current=r,useWalletSubscription({onMessage:n=>{let{id:s,side:d,transStatus:a}=n,i=true;if(["DEPOSIT","WITHDRAW"].includes(d)&&["COMPLETED","FAILED"].includes(a)){let l=t.current[s];o({...r,[s]:l?void 0:true}),i=!l;}if(a==="COMPLETED"&&i){let l=`${capitalizeString(d)} completed`;toast.success(l);}else if(a==="FAILED"&&i){let l=`${capitalizeString(d)} failed`;toast.error(l);}e.emit("wallet:changed",n);}});}function K(){useSettleSubscription({onMessage:e=>{let{status:t}=e;switch(t){case "COMPLETED":toast.success("Settlement completed");break;case "FAILED":toast.error("Settlement failed");break;}}});}function U(){let e=useEventEmitter(),{setLedgerAddress:t}=useStorageLedgerAddress();return useEffect(()=>{e.on("wallet:connect-error",r=>{toast.error(r.message);}),e.on("wallet:sign-message-with-ledger-error",r=>{window.setTimeout(()=>{modal.confirm({title:"Sign Message Failed",content:"Are you using Ledger Wallet?",size:"sm",onOk:async()=>(t(r.userAddress),Promise.resolve()),okLabel:"OK",onCancel:async()=>(toast.error(r.message),Promise.resolve()),cancelLabel:"No"}).then(o=>{});});});},[e]),{}}function J(e){let[t,r]=useState(),[o]=useChains(),n=useConfig("networkId"),{connectedChain:s}=useWalletConnector();return useEffect(()=>{if(s)r?.(typeof s.id=="number"?s.id:parseInt(s.id));else {if(t)return;let d,a=n==="mainnet"?o.mainnet?.[0]:o.testnet?.[0];typeof e=="function"?d=e(n,o):typeof e=="object"&&(d=n==="mainnet"?e?.mainnet:e?.testnet);let i=d?.id||a?.network_infos?.chain_id;if(!i)return;r?.(i);}},[s,o,t,n,r,e]),[t,r]}var H=createContext({}),w=()=>useContext(H),q=e=>{let[t,r]=J(e.defaultChain);D();let{connectWallet:o,wrongNetwork:n}=W({currentChainId:t});$(),K(),U();let s=useRestrictedAreas(e?.restrictedInfo??{});return jsx(H.Provider,{value:{connectWallet:o,wrongNetwork:n,currentChainId:t,setCurrentChainId:r,onChainChanged:e.onChainChanged,restrictedInfo:s},children:e.children})};var z=createContext({}),Ke=()=>useContext(z),B=e=>jsx(z.Provider,{value:e,children:e.children});function Y(e,t){let{symbol:r,side:o,quantity:n}=e,s="total_executed_quantity"in e?e.total_executed_quantity:0,d="status"in e?e.status:e.algo_status,a=t[r],i=a("base_dp"),l=capitalizeString(o),c=transSymbolformString(r),u="algo_type"in e&&e.algo_type===AlgoOrderRootType.POSITIONAL_TP_SL?"Entire position":i===void 0?n:parseNumber(n,{dp:i}),p="",f="";switch(d){case "NEW":p="Order opened",f=`${l} ${c} ${u}`;break;case "FILLED":case "PARTIAL_FILLED":let g=i===void 0?s:parseNumber(s,{dp:i});p="Order filled",f=`${l} ${c} ${g} / ${u}`;break;case "CANCELLED":p="Order cancelled",f=`${l} ${c} ${u}`;break;case "REJECTED":p="Order rejected",f=`${l} ${c} ${u}`;break;case "REPLACED":p="Order edited",f=`${o} ${c} ${s} / ${u}`;break;}return {title:p,msg:f}}function V(){let e=useEventEmitter(),t=useSymbolsInfo(),r=useRef({});useEffect(()=>{r.current=t;},[t]);let o=useDebouncedCallback(n=>{(d=>{let{title:a,msg:i}=Y(d,r.current);a&&i&&toast.success(jsxs("div",{children:[a,jsx("br",{}),jsx("div",{className:"orderly-text-white/[0.54] orderly-text-xs",children:i})]}));})(n);},100);useEffect(()=>(e.on("orders:changed",o),()=>{e.off("orders:changed",o);}),[]);}var X=e=>{let{components:t,appIcons:r,onChainChanged:o,defaultChain:n,...s}=e;return x(),V(),jsx(B,{appIcons:r,brokerName:e.brokerName,children:jsx(OrderlyThemeProvider,{components:t,overrides:e.overrides,children:jsxs(OrderlyConfigProvider,{...s,children:[jsx(q,{onChainChanged:o,defaultChain:n,restrictedInfo:e.restrictedInfo,children:jsx(OrderlyTrackerProvider,{children:jsx(TooltipProvider,{delayDuration:300,children:jsx(ModalProvider,{children:e.children})})})}),jsx(Toaster,{})]})})})};X.displayName="OrderlyAppProvider";var nt=(e,t)=>{let{wrongNetwork:r}=w(),{state:o}=useAccount();return t?.skip?e:r||typeof t?.accountStatus<"u"&&o.status<t.accountStatus?typeof t?.fallbackData<"u"?t.fallbackData:null:e};
9
9
 
10
- export { Z as OrderlyAppProvider, Ke as useAppConfig, b as useAppContext, nt as useDataTap };
10
+ export { X as OrderlyAppProvider, Ke as useAppConfig, w as useAppContext, nt 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/useLinkDevice.ts","../src/hooks/useWalletEvent.ts","../src/hooks/useSettleEvent.ts","../src/hooks/useWalletConnectError.ts","../src/hooks/useCurrentChainId.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","useMemo","useRef","useState","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","parseJSON","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainId","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","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","modal","LedgerWalletKey","useWalletConnectError","info","ledgerWallet","useRestrictedAreas","useCurrentChainId","defaultChain","currentChainId","setCurrentChainId","fallbackChain","firstChain","jsx","AppContext","useAppContext","AppStateProvider","props","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","components","appIcons","onChainChanged","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 // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\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 defaultChain={defaultChain}\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 { FC, createContext, PropsWithChildren, useContext } 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\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\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 restrictedInfo?: IRestrictedAreasParams;\n defaultChain?: DefaultChain;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain\n );\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_link_device\");\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 parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { 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 { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\n\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n ee.on('wallet:sign-message-with-ledger-error', (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n\n modal.confirm({\n title: 'Sign Message Failed',\n content: \"Are you using Ledger Wallet?\",\n size: 'sm',\n onOk: async () => {\n console.log('-- use ledger', true);\n const info = window.localStorage.getItem(LedgerWalletKey);\n if (!info) {\n window.localStorage.setItem(LedgerWalletKey, JSON.stringify([data.userAddress]));\n } else {\n const ledgerWallet = JSON.parse(info ?? '[]');\n ledgerWallet.push(data.userAddress);\n window.localStorage.setItem(LedgerWalletKey, ledgerWallet);\n }\n // todo localstorage\n return Promise.resolve();\n },\n okLabel: 'OK',\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: 'No',\n\n }).then(res => {\n console.log('-- dialog res', res);\n });\n\n });\n\n })\n\n }, [ee])\n\n return {}\n}","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n setCurrentChainId?.(chainId);\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { 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"]}
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/hooks/useCurrentChainId.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","useMemo","useRef","useState","useConfig","useAccount","useChains","useKeyStore","useWalletConnector","parseChainIdToNumber","praseChainIdToNumber","windowGuard","AccountStatusEnum","SDKError","ChainNamespace","parseJSON","useLocalStorage","useScreen","WALLET_KEY","useLinkDevice","connectedChain","disconnect","_","setLinkDeviceStorage","account","isMobile","configStore","onDisconnect","label","linkData","getLinkDeviceData","walletInfo","linkDevice","address","secretKey","chainId","chainNamespace","url","decodedUrl","autoLinkDevice","getLinkDeviceStorage","orderlyKey","accountId","linkDeviceStorage","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","modal","useStorageLedgerAddress","useWalletConnectError","setLedgerAddress","useRestrictedAreas","useCurrentChainId","defaultChain","currentChainId","setCurrentChainId","fallbackChain","firstChain","jsx","AppContext","useAppContext","AppStateProvider","props","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","components","appIcons","onChainChanged","configProps","useDataTap","state"],"mappings":"AAEA,OACE,iBAAAA,GACA,wBAAAC,GACA,WAAAC,GACA,mBAAAC,OACK,sBCPP,OAAS,aAAAC,OAAiB,QAGnB,IAAMC,EAAe,IAAM,CAChCD,GAAU,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,OAAkB,QCAjE,OAAS,aAAAN,EAAW,WAAAO,EAAS,UAAAC,GAAQ,YAAAC,OAAgB,QACrD,OAAS,aAAAC,OAA8B,yBACvC,OACE,cAAAC,GACA,aAAAC,GACA,eAAAC,GACA,sBAAAC,OACK,yBACP,OACE,wBAAAC,GACA,wBAAAC,EACA,eAAAC,MACK,yBACP,OACE,qBAAAC,EACA,YAAAC,GACA,kBAAAC,OAEK,yBClBP,OAAsB,aAAApB,MAAiB,QACvC,OACE,aAAAqB,GACA,cAAAV,GACA,aAAAD,GACA,mBAAAY,GACA,sBAAAR,OACK,yBACP,OAAS,aAAAS,OAAiB,sBAkB1B,IAAMC,EAAa,sBAEZ,SAASC,GAAgB,CAC9B,GAAM,CAAE,eAAAC,EAAgB,WAAAC,CAAW,EAAIb,GAAmB,EACpD,CAACc,EAAGC,CAAoB,EAAIP,GAChC,sBACA,CAAC,CACH,EAEM,CAAE,QAAAQ,CAAQ,EAAInB,GAAW,EACzB,CAAE,SAAAoB,CAAS,EAAIR,GAAU,EACzBS,EAActB,GAAU,EAExBuB,EAAe,MAAOC,GAAkB,CAE5C,aAAa,WAAWV,CAAU,EAClC,MAAMM,EAAQ,WAAW,EACzB,MAAMH,EAAW,CAAE,MAAAO,CAAM,CAAC,CAC5B,EAEAlC,EAAU,IAAM,CACd,IAAMmC,EAAWC,EAAkB,EAC7BC,EAAa,KAAK,MAAM,aAAa,QAAQb,CAAU,GAAK,IAAI,EAClEW,GAAYE,GAEdJ,EAAaI,EAAW,KAAK,CAEjC,EAAG,CAAC,CAAC,EAEL,IAAMC,EAAa,SAAY,CAC7B,IAAMH,EAAWC,EAAkB,EACnC,GAAI,CAACD,EAAU,OAEf,GAAM,CAAE,QAAAI,EAAS,UAAAC,EAAW,QAAAC,EAAS,eAAAC,CAAe,EAAIP,EAMxD,GAAI,CALc,MAAML,EAAQ,iBAAiB,CAC/C,QAAAS,EACA,UAAAC,EACA,eAAAE,CACF,CAAC,EACe,OAChBb,EAAqB,CACnB,QAAAY,EACA,eAAAC,CACF,CAAC,EAED,IAAMC,EAAM,IAAI,IAAI,OAAO,SAAS,IAAI,EACxCA,EAAI,aAAa,OAAO,MAAM,EAC9B,IAAMC,EAAa,mBAAmBD,EAAI,SAAS,CAAC,EACpD,QAAQ,aAAa,KAAM,GAAIC,CAAU,CAC3C,EAEA5C,EAAU,IAAM,CACV+B,GAAY,CAACL,GACfY,EAAW,CAEf,EAAG,CAACR,EAASJ,EAAgBK,CAAQ,CAAC,EAEtC,IAAMc,EAAiB,SAAY,CAEjC,GAAM,CAAE,QAAAJ,EAAS,eAAAC,CAAe,EAAII,GAAqB,GAAK,CAAC,EAC/D,GAAIf,GAAY,CAACL,GAAkBe,GAAWC,EAAgB,CAC5D,IAAMH,EAAUT,EAAQ,SAAS,WAAW,EACtCiB,EAAajB,EAAQ,SAAS,cAAc,EAC5CkB,EAAYlB,EAAQ,SAAS,aAAaS,CAAQ,EAC5C,MAAMT,EAAQ,gBACxBS,EACAQ,EACAC,CACF,GAEEhB,EAAY,IAAI,iBAAkBU,CAAc,CAEpD,CACF,EAGA,OAAA1C,EAAU,IAAM,CACd6C,EAAe,CACjB,EAAG,CAACf,EAASC,EAAUL,CAAc,CAAC,EAE/B,CAAE,WAAAY,CAAW,CACtB,CAEA,SAASQ,IAAuB,CAC9B,GAAI,CACF,IAAMG,EAAoB,aAAa,QAAQ,qBAAqB,EAEpE,OADaA,EAAoB5B,GAAU4B,CAAiB,EAAI,IAElE,MAAc,CAEd,CACF,CAEO,SAASb,GAAoB,CAElC,IAAMc,EADM,IAAI,IAAI,OAAO,SAAS,IAAI,EACvB,aAAa,IAAI,MAAM,EAExC,GAAI,CAACA,EAAM,OAEX,GAAM,CACJ,EAAGX,EACH,EAAGC,EACH,EAAGC,EACH,EAAGC,CACL,EAAIS,GAAaD,CAAI,GAAK,CAAC,EAE3B,GAAIX,GAAWC,GAAaC,GAAWC,EACrC,MAAO,CACL,QAAAH,EACA,UAAAC,EACA,QAAAC,EACA,eAAAC,CACF,CAEJ,CAEA,SAASS,GAAaC,EAAgB,CACpC,GAAI,CACF,IAAMC,EAAO,KAAK,MAAM,OAAO,KAAKD,CAAM,CAAC,EAErCE,EAAc,KAAK,MAAM,KAAK,IAAI,EAAI,GAAI,EAC1CC,EAAcF,EAAK,EAEzB,MAAI,CAACE,GAAeD,EAAcC,EAEhC,OAGKF,CACT,MAAgB,CAEhB,CACF,CDzIA,IAAM7B,EAAa,sBAGZ,IAAMgC,EAAwBC,GAG/B,CACJ,GAAM,CACJ,OAAQC,EACR,QAAAC,EACA,eAAAjC,EACA,WAAAC,EACA,UAAAiC,CACF,EAAI9C,GAAmB,EAQvB,GAAI,OAAO6C,GAAY,WACrB,MAAM,IAAIxC,GAAS,4CAA4C,EAGjE,IAAM0C,EAAkBrD,GAAgB,EAAK,EAEvC,CAAE,QAAAsB,EAAS,MAAOgC,CAAa,EAAInD,GAAW,EAC9CoD,EAAWlD,GAAY,EACvBmD,EAAYtD,GAAU,WAAW,EACjC,CAACuD,EAAQ,CAAE,kBAAAC,CAAkB,CAAC,EAAItD,GAAU,EAE5C,CAACuD,EAAaC,CAAc,EAAI3D,GAAS,EAAK,EAG9C4D,EAAuB9D,EAA4B,IAChDmD,GAAiB,WAAW,CAAC,GAAG,QACtC,CAACA,CAAe,CAAC,EAGdY,EAAe/D,EAEnB,IAAM,CACN,IAAMgE,EAAKb,GAAiB,SAAS,CAAC,GAAG,GACnCE,EAAYF,GAAiB,SAAS,CAAC,GAAG,UAChD,GAAI,SAAOa,EAAO,KAClB,MAAO,CACL,GAAIxD,GAAqBwD,CAAE,EAC3B,UAAAX,CACF,CACF,EAAG,CAACF,CAAe,CAAC,EAEpB,OAAA1D,EAAU,IAAM,CACd,GAAI,CAAC0B,EAAgB,CACnB0C,EAAe,EAAK,EACpB,MACF,CAEA,IAAII,EAAcN,EAChBxC,EAAe,GACfsC,CAEF,EAEAI,EAAe,CAACI,CAAW,CAC7B,EAAG,CAAC9C,EAAgBuC,EAAQC,EAAmBF,CAAS,CAAC,EAEzDhE,EAAU,IAAM,CAGdiB,EAAY,IAAM,CAChB,IAAMwD,EAAeV,EAAS,WAAW,EACnC1B,EAAa,KAAK,MAAM,aAAa,QAAQb,CAAU,GAAK,IAAI,EAKlEE,GAAgB,YAAcN,GAAe,QAI/CqD,GACA3C,EAAQ,UAAY2C,GACpBpC,EAAW,OAEXsB,EAAQ,CACN,WAAY,CACV,MAAOtB,EAAW,MAClB,cAAe,EACjB,CACF,CAAC,EAAE,KACAqC,GAAQ,CAET,EACCC,GAAO,EACV,CAEJ,CAAC,CACH,EAAG,CAACjB,EAAiB5B,EAAQ,OAAO,CAAC,EAKrC9B,EAAU,IAAM,CACd,GACE0D,IAAoB,MACpBI,EAAa,OAAS5C,EAAkB,cACxC,CAAC4C,EAAa,WACd,CACAhC,EAAQ,WAAW,EACnB,MACF,CAGA,GADIqC,GAAe,CAACzC,GAChBmC,EAAgB,QAAS,OAE7B,IAAM1B,EAAWC,EAAkB,EAO/BiC,GACFA,IAAyBvC,EAAQ,SACjC,CAACK,IAEDL,EAAQ,WAAWuC,EAAsB,CACvC,SAAUX,GAAiB,SAC3B,MAAO,CACL,GAAI1C,EAAqBsD,EAAc,EAAE,EACzC,UAAWA,EAAc,UAAU,YAAY,CACjD,EACA,OAAQ,CACN,KAAMZ,EAAgB,KACxB,CACF,CAAC,EAGDzC,EAAY,IAAM,CAChB,aAAa,QACXO,EACA,KAAK,UAAU,CACb,MAAOkC,EAAgB,KACzB,CAAC,CACH,CACF,CAAC,GAMCY,GAAc,KAAOxC,EAAQ,SAC/BA,EAAQ,cAAcwC,GAAc,EAAG,CAK3C,EAAG,CACDZ,EACAhC,EACA2C,EACAC,EACAxC,EAAQ,QACRgC,EACAhC,EAAQ,QACRqC,CACF,CAAC,EAmEM,CACL,cA/DoB,UAKpBN,EAAgB,QAAU,GAGnBF,EAAQ,CAAE,QAASF,EAAQ,cAAe,CAAC,EAC/C,KAAK,MAAOmB,GAAgB,CAC3B,GACE,MAAM,QAAQA,CAAW,GACzBA,EAAY,OAAS,GACrBA,EAAY,CAAC,GACbA,EAAY,CAAC,EAAE,SAAS,OAAS,EACjC,CACA,IAAMC,EAASD,EAAY,CAAC,EACtBnC,EAAUzB,EAAqB6D,EAAO,OAAO,CAAC,EAAE,EAAE,EAExD,GAAI,CAACX,EAAkBzB,EAASuB,CAAS,EACvC,MAAO,CACL,aAAc,EAChB,EAIF,GAAI,CAAClC,EACH,MAAM,IAAI,MAAM,4BAA4B,EAK5CgC,EAAa,SACb5C,EAAkB,gCAElB,aAAa,WAAW,qBAAqB,EAC7C,MAAMY,EAAQ,WAAW,GAE3B,IAAMgD,EAAS,MAAMhD,EAAQ,WAAW+C,EAAO,SAAS,CAAC,EAAE,QAAS,CAClE,SAAUA,EAAO,SACjB,MAAO,CACL,GAAI7D,EAAqB6D,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,OAAAC,EAAQ,aAAc,EAAM,CAC/C,CAEA,OAAO,IACT,CAAC,EACA,QAAQ,IAAM,CACbjB,EAAgB,QAAU,EAC5B,CAAC,GAKH,aAAcM,CAChB,CACF,EEnQA,OAAS,UAAA3D,OAAc,QACvB,OAAS,SAAAuE,MAAa,sBACtB,OAAS,oBAAAC,MAAwB,yBACjC,OACE,mBAAAC,GACA,qBAAAC,GACA,yBAAAC,OACK,yBAEA,SAASC,GAAiB,CAC/B,IAAMC,EAAKJ,GAAgB,EAErBK,EAAY9E,GAAgC,CAAC,CAAC,EAE9C,CAAC+E,EAAQC,CAAS,EAAIN,GAC1B,2BACA,CAAC,CACH,EAEAI,EAAU,QAAUC,EAEpBJ,GAAsB,CACpB,UAAY9B,GAAc,CAExB,GAAM,CAAE,GAAAkB,EAAI,KAAAkB,EAAM,YAAAC,CAAY,EAAIrC,EAC9BsC,EAAY,GAGhB,GACE,CAAC,UAAW,UAAU,EAAE,SAASF,CAAI,GACrC,CAAC,YAAa,QAAQ,EAAE,SAASC,CAAW,EAC5C,CACA,IAAME,EAAaN,EAAU,QAAQf,CAAE,EACvCiB,EAAU,CACR,GAAGD,EACH,CAAChB,CAAE,EAAGqB,EAAa,OAAY,EACjC,CAAC,EAEDD,EAAY,CAACC,CACf,CAEA,GAAIF,IAAgB,aAAeC,EAAW,CAC5C,IAAIE,EAAM,GAAGb,EAAiBS,CAAI,CAAC,aACnCV,EAAM,QAAQc,CAAG,CACnB,SAAWH,IAAgB,UAAYC,EAAW,CAChD,IAAIE,EAAM,GAAGb,EAAiBS,CAAI,CAAC,UACnCV,EAAM,MAAMc,CAAG,CACjB,CAEAR,EAAG,KAAK,iBAAkBhC,CAAI,CAChC,CACF,CAAC,CACH,CCpDA,OAAS,yBAAAyC,OAA6B,yBACtC,OAAS,SAAAf,MAAa,sBAEf,SAASgB,GAAiB,CAC/BD,GAAsB,CACpB,UAAYzC,GAAc,CACxB,GAAM,CAAE,OAAAyB,CAAO,EAAIzB,EAInB,OAAQyB,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,aAAAjF,OAAiB,QAC1B,OAAS,SAAAgG,GAAO,SAAAjB,MAAa,sBAE7B,OAAS,2BAAAkB,OAA+B,yBAGjC,SAASC,GAAwB,CACtC,IAAMb,EAAKJ,GAAgB,EACrB,CAAC,iBAAAkB,CAAgB,EAAIF,GAAwB,EAGnD,OAAAjG,GAAU,IAAM,CACdqF,EAAG,GAAG,uBAAyBhC,GAAS,CACtC0B,EAAM,MAAM1B,EAAK,OAAO,CAE1B,CAAC,EACDgC,EAAG,GAAG,wCAA0ChC,GAAmD,CACjG,OAAO,WAAW,IAAM,CAEtB2C,GAAM,QAAQ,CACZ,MAAO,sBACP,QAAS,+BACT,KAAM,KACN,KAAM,UAEJG,EAAiB9C,EAAK,WAAW,EAE1B,QAAQ,QAAQ,GAEzB,QAAS,KACT,SAAU,UACR0B,EAAM,MAAM1B,EAAK,OAAO,EACjB,QAAQ,QAAQ,GAEzB,YAAa,IAEf,CAAC,EAAE,KAAKqB,GAAO,CAEf,CAAC,CAEH,CAAC,CAEH,CAAC,CAEH,EAAG,CAACW,CAAE,CAAC,EAEA,CAAC,CACV,CL1CA,OACE,sBAAAe,OAGK,yBMVP,OAAS,aAAApG,GAAW,YAAAS,OAAgB,QACpC,OAEE,aAAAG,GACA,aAAAF,GACA,sBAAAI,OACK,yBAYA,SAASuF,EAAkBC,EAA6B,CAC7D,GAAM,CAACC,EAAgBC,CAAiB,EAAI/F,GAA6B,EAEnE,CAACwD,CAAM,EAAIrD,GAAU,EACrBoD,EAAYtD,GAAU,WAAW,EAEjC,CAAE,eAAAgB,CAAe,EAAIZ,GAAmB,EAE9C,OAAAd,GAAU,IAAM,CACd,GAAI0B,EACF8E,IACE,OAAO9E,EAAe,IAAO,SACzBA,EAAe,GACf,SAASA,EAAe,EAAE,CAChC,MACK,CACL,GAAM6E,EAAgB,OACtB,IAAIE,EAEEC,EACJ1C,IAAc,UAAYC,EAAO,UAAU,CAAC,EAAIA,EAAO,UAAU,CAAC,EAEhE,OAAOqC,GAAiB,WAC1BG,EAAgBH,EAAatC,EAAWC,CAAM,EACrC,OAAOqC,GAAiB,WACjCG,EACEzC,IAAc,UACVsC,GAAc,QACdA,GAAc,SAGtB,IAAM7D,EAAUgE,GAAe,IAAMC,GAAY,eAAe,SAChE,GAAI,CAACjE,EAAS,OAEd+D,IAAoB/D,CAAO,CAC7B,CACF,EAAG,CACDf,EACAuC,EACAsC,EACAvC,EACAwC,EACAF,CACF,CAAC,EAEM,CAACC,EAAgBC,CAAiB,CAC3C,CNFI,cAAAG,OAAA,oBAhCJ,IAAMC,EAAavG,GAA+B,CAAC,CAAoB,EAE1DwG,EAAgB,IACpBvG,GAAWsG,CAAU,EAQjBE,EACXC,GACG,CACH,GAAM,CAACR,EAAgBC,CAAiB,EAAIH,EAC1CU,EAAM,YACR,EACAtF,EAAc,EAEd,GAAM,CAAE,cAAAuF,EAAe,aAAAC,CAAa,EAAIzD,EAAqB,CAE3D,eAAA+C,CACF,CAAC,EAEDnB,EAAe,EACfW,EAAe,EACfG,EAAsB,EACtB,IAAMgB,EAAiBd,GAAmBW,GAAO,gBAAkB,CAAC,CAAC,EAIrE,OACEJ,GAACC,EAAW,SAAX,CACC,MAAO,CACL,cAAAI,EACA,aAAAC,EACA,eAAAV,EACA,kBAAAC,EACA,eAAgBO,EAAM,eACtB,eAAAG,CACF,EAEC,SAAAH,EAAM,SACT,CAEJ,EO3EA,OAAS,iBAAA1G,GAAkC,cAAAC,OAAkB,QAuBzD,cAAAqG,OAAA,oBAfJ,IAAMQ,EAAmB9G,GACvB,CAAC,CACH,EAEa+G,GAAe,IACnB9G,GAAW6G,CAAgB,EAGvBE,EACXN,GAMEJ,GAACQ,EAAiB,SAAjB,CAA0B,MAAOJ,EAC/B,SAAAA,EAAM,SACT,ECzBJ,OAAS,aAAA/G,EAAW,UAAAQ,OAAc,QCAlC,OACE,oBAAAwE,GACA,yBAAAsC,OACK,yBAEP,OAAS,qBAAAC,OAAyB,yBAClC,OAAS,eAAAC,MAAmB,sBAErB,SAASC,EACdpE,EACAqE,EACA,CACA,GAAM,CAAE,OAAAC,EAAQ,KAAAlC,EAAM,SAAAmC,CAAS,EAAIvE,EAC7BwE,EACJ,4BAA6BxE,EAAOA,EAAK,wBAA0B,EAC/DyB,EAAS,WAAYzB,EAAOA,EAAK,OAASA,EAAK,YAC/CyE,EAAgBJ,EAAYC,CAAM,EAClCI,EAAUD,EAAc,SAAS,EACjCE,EAAchD,GAAiBS,CAAI,EACnCwC,EAAgBX,GAAsBK,CAAM,EAC5CO,EACJ,cAAe7E,GAAQA,EAAK,YAAckE,GAAkB,iBACxD,kBACAQ,IAAY,OACZH,EACAJ,EAAYI,EAAU,CAAE,GAAIG,CAAQ,CAAC,EAEvCI,EAAQ,GACRtC,EAAM,GACV,OAAQf,EAAQ,CACd,IAAK,MACHqD,EAAQ,eACRtC,EAAM,GAAGmC,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,SACL,IAAK,iBACH,IAAME,EACJL,IAAY,OACRF,EACAL,EAAYK,EAAyB,CAAE,GAAIE,CAAQ,CAAC,EAC1DI,EAAQ,eACRtC,EAAM,GAAGmC,CAAW,IAAIC,CAAa,IAAIG,CAA4B,MAAMF,CAAe,GAC1F,MACF,IAAK,YACHC,EAAQ,kBACRtC,EAAM,GAAGmC,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,WACHC,EAAQ,iBACRtC,EAAM,GAAGmC,CAAW,IAAIC,CAAa,IAAIC,CAAe,GACxD,MACF,IAAK,WACHC,EAAQ,eACRtC,EAAM,GAAGJ,CAAI,IAAIwC,CAAa,IAAIJ,CAAuB,MAAMK,CAAe,GAC9E,MACF,QACE,KACJ,CAEA,MAAO,CACL,MAAAC,EACA,IAAAtC,CACF,CACF,CD7DA,OACE,kBAAAwC,GAEA,mBAAApD,GACA,wBAAAqD,OACK,yBACP,OAAS,SAAAvD,OAAa,sBAqBZ,OAEE,OAAA4B,EAFF,QAAA4B,OAAA,oBAnBH,SAASC,GAAqB,CACnC,IAAMnD,EAAKJ,GAAgB,EAErByC,EAAcW,GAAe,EAC7BI,EAAiBjI,GAAO,CAAC,CAAC,EAEhCR,EAAU,IAAM,CACdyI,EAAe,QAAUf,CAC3B,EAAG,CAACA,CAAW,CAAC,EAEhB,IAAMgB,EAAUJ,GAAsBjF,GAAc,EAC/BA,GAAc,CAC/B,GAAM,CAAE,MAAA8E,EAAO,IAAAtC,CAAI,EAAI4B,EACrBpE,EACAoF,EAAe,OACjB,EAEIN,GAAStC,GACXd,GAAM,QACJwD,GAAC,OACE,UAAAJ,EACDxB,EAAC,OAAG,EACJA,EAAC,OAAI,UAAU,4CACZ,SAAAd,EACH,GACF,CACF,CAEJ,GAEUxC,CAAI,CAChB,EAAG,GAAG,EAENrD,EAAU,KACRqF,EAAG,GAAG,iBAAkBqD,CAAO,EAExB,IAAM,CACXrD,EAAG,IAAI,iBAAkBqD,CAAO,CAClC,GACC,CAAC,CAAC,CACP,CVPQ,OAQQ,OAAA/B,EARR,QAAA4B,OAAA,oBApBR,IAAMI,EAAsB5B,GAAmC,CAC7D,GAAM,CAEJ,WAAA6B,EACA,SAAAC,EACA,eAAAC,EACA,aAAAxC,EACA,GAAGyC,CACL,EAAIhC,EAEJ,OAAA9G,EAAa,EACbuI,EAAmB,EAGjB7B,EAACU,EAAA,CAAkB,SAAUwB,EAAU,WAAY9B,EAAM,WACvD,SAAAJ,EAAC9G,GAAA,CAEC,WAAY+I,EACZ,UAAW7B,EAAM,UAEjB,SAAAwB,GAACpI,GAAA,CAAuB,GAAI4I,EAC1B,UAAApC,EAACG,EAAA,CACC,eAAgBgC,EAChB,aAAcxC,EACd,eAAgBS,EAAM,eAEtB,SAAAJ,EAACvG,GAAA,CACC,SAAAuG,EAAC5G,GAAA,CAAgB,cAAe,IAC9B,SAAA4G,EAAC/G,GAAA,CAAe,SAAAmH,EAAM,SAAS,EACjC,EACF,EACF,EACAJ,EAAC7G,GAAA,EAAQ,GACX,EACF,EACF,CAEJ,EAEA6I,EAAmB,YAAc,qBY5DjC,OAAS,cAAAhI,OAAkB,yBAEpB,IAAMqI,GAAa,CACxB3F,EACAI,IAKa,CACb,GAAM,CAAE,aAAAwD,CAAa,EAAIJ,EAAc,EACjC,CAAE,MAAAoC,CAAM,EAAItI,GAAW,EAI7B,OAAI8C,GAAS,KAAaJ,EAEtB4D,GAMA,OAAOxD,GAAS,cAAkB,KAChCwF,EAAM,OAASxF,EAAQ,cAClB,OAAOA,GAAS,aAAiB,IACpCA,EAAQ,aACR,KAUDJ,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\";\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 // dateFormatting,\n components,\n appIcons,\n onChainChanged,\n defaultChain,\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 defaultChain={defaultChain}\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 { FC, createContext, PropsWithChildren, useContext } 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\";\nimport { DefaultChain, useCurrentChainId } from \"../hooks/useCurrentChainId\";\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 restrictedInfo?: IRestrictedAreasParams;\n defaultChain?: DefaultChain;\n} & Pick<AppContextState, \"onChainChanged\">;\n\nexport const AppStateProvider: FC<PropsWithChildren<AppStateProviderProps>> = (\n props\n) => {\n const [currentChainId, setCurrentChainId] = useCurrentChainId(\n props.defaultChain\n );\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_link_device\");\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 parseJSON,\n useAccount,\n useConfig,\n useLocalStorage,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { useScreen } from \"@orderly.network/ui\";\nimport { ChainNamespace } from \"@orderly.network/types\";\n\ntype DecodedData = {\n /** secret key */\n k: string;\n /* timestamp */\n t: number;\n /** address */\n a: string;\n /** chain id */\n i: number;\n /** chain namespace */\n n: ChainNamespace;\n};\n\ntype LinkDeviceStorage = { chainId: number; chainNamespace: ChainNamespace };\n\nconst WALLET_KEY = \"orderly:wallet-info\";\n\nexport function useLinkDevice() {\n const { connectedChain, disconnect } = useWalletConnector();\n const [_, setLinkDeviceStorage] = useLocalStorage(\n \"orderly_link_device\",\n {} as LinkDeviceStorage\n );\n\n const { account } = useAccount();\n const { isMobile } = useScreen();\n const configStore = useConfig();\n\n const onDisconnect = async (label: string) => {\n // The cache must be cleared first, otherwise it will be auto connect wallet\n localStorage.removeItem(WALLET_KEY);\n await account.disconnect();\n await disconnect({ label });\n };\n\n useEffect(() => {\n const linkData = getLinkDeviceData();\n const walletInfo = JSON.parse(localStorage.getItem(WALLET_KEY) ?? \"{}\");\n if (linkData && walletInfo) {\n // clear connect data when link device\n onDisconnect(walletInfo.label);\n }\n }, []);\n\n const linkDevice = async () => {\n const linkData = getLinkDeviceData();\n if (!linkData) return;\n\n const { address, secretKey, chainId, chainNamespace } = linkData;\n const isSuccess = await account.importOrderlyKey({\n address,\n secretKey,\n chainNamespace,\n });\n if (!isSuccess) return;\n setLinkDeviceStorage({\n chainId,\n chainNamespace,\n });\n\n const url = new URL(window.location.href);\n url.searchParams.delete(\"link\");\n const decodedUrl = decodeURIComponent(url.toString());\n history.replaceState(null, \"\", decodedUrl);\n };\n\n useEffect(() => {\n if (isMobile && !connectedChain) {\n linkDevice();\n }\n }, [account, connectedChain, isMobile]);\n\n const autoLinkDevice = async () => {\n // this can't use the value returned by useLocalStorage here, because it will trigger extra state change\n const { chainId, chainNamespace } = getLinkDeviceStorage() || {};\n if (isMobile && !connectedChain && chainId && chainNamespace) {\n const address = account.keyStore.getAddress();\n const orderlyKey = account.keyStore.getOrderlyKey();\n const accountId = account.keyStore.getAccountId(address!);\n const res = await account.checkOrderlyKey(\n address!,\n orderlyKey!,\n accountId!\n );\n if (res) {\n configStore.set(\"chainNamespace\", chainNamespace);\n }\n }\n };\n\n // persist status when refresh page\n useEffect(() => {\n autoLinkDevice();\n }, [account, isMobile, connectedChain]);\n\n return { linkDevice };\n}\n\nfunction getLinkDeviceStorage() {\n try {\n const linkDeviceStorage = localStorage.getItem(\"orderly_link_device\");\n const json = linkDeviceStorage ? parseJSON(linkDeviceStorage) : null;\n return json as LinkDeviceStorage;\n } catch (err) {\n console.error(\"getLinkDeviceStorage\", err);\n }\n}\n\nexport function getLinkDeviceData() {\n const url = new URL(window.location.href);\n const link = url.searchParams.get(\"link\");\n\n if (!link) return;\n\n const {\n a: address,\n k: secretKey,\n i: chainId,\n n: chainNamespace,\n } = decodeBase64(link) || {};\n\n if (address && secretKey && chainId && chainNamespace) {\n return {\n address,\n secretKey,\n chainId,\n chainNamespace,\n };\n }\n}\n\nfunction decodeBase64(base64: string) {\n try {\n const data = JSON.parse(window.atob(base64)) as DecodedData;\n console.log(\"decodeBase64\", data);\n const currentTime = Math.floor(Date.now() / 1000);\n const expiredTime = data.t;\n\n if (!expiredTime || currentTime > expiredTime) {\n console.error(\"Orderly key has expired.\");\n return;\n }\n\n return data;\n } catch (error) {\n console.error(\"Invalid or expired orderly key.\");\n }\n}\n","import { 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 { modal, toast } from \"@orderly.network/ui\";\nimport { LedgerWalletKey } from \"@orderly.network/types\";\nimport { useStorageLedgerAddress } from \"@orderly.network/hooks\"; \n\n\nexport function useWalletConnectError() {\n const ee = useEventEmitter();\n const {setLedgerAddress} = useStorageLedgerAddress(); \n\n\n useEffect(() => {\n ee.on('wallet:connect-error', (data) => {\n toast.error(data.message);\n\n })\n ee.on('wallet:sign-message-with-ledger-error', (data: { userAddress: string; message: string }) => {\n window.setTimeout(() => {\n\n modal.confirm({\n title: 'Sign Message Failed',\n content: \"Are you using Ledger Wallet?\",\n size: 'sm',\n onOk: async () => {\n console.log('-- use ledger', true);\n setLedgerAddress(data.userAddress);\n \n return Promise.resolve();\n },\n okLabel: 'OK',\n onCancel: async () => {\n toast.error(data.message);\n return Promise.resolve();\n },\n cancelLabel: 'No',\n\n }).then(res => {\n console.log('-- dialog res', res);\n });\n\n });\n\n })\n\n }, [ee])\n\n return {}\n}","import { useEffect, useState } from \"react\";\nimport {\n Chains,\n useChains,\n useConfig,\n useWalletConnector,\n} from \"@orderly.network/hooks\";\nimport { Chain, NetworkId } from \"@orderly.network/types\";\ntype ReturnChain = Pick<Chain, \"id\"> & Partial<Omit<Chain, \"id\">>;\n\nexport type DefaultChain =\n | {\n mainnet?: ReturnChain;\n testnet?: ReturnChain;\n }\n | ((networkId: NetworkId, chains: Chains) => ReturnChain)\n | undefined;\n\nexport function useCurrentChainId(defaultChain?: DefaultChain) {\n const [currentChainId, setCurrentChainId] = useState<number | undefined>();\n\n const [chains] = useChains();\n const networkId = useConfig(\"networkId\") as NetworkId;\n\n const { connectedChain } = useWalletConnector();\n\n useEffect(() => {\n if (connectedChain) {\n setCurrentChainId?.(\n typeof connectedChain.id === \"number\"\n ? connectedChain.id\n : parseInt(connectedChain.id)\n );\n } else {\n if (!!currentChainId) return;\n let fallbackChain: Partial<Chain> | undefined;\n\n const firstChain =\n networkId === \"mainnet\" ? chains.mainnet?.[0] : chains.testnet?.[0];\n\n if (typeof defaultChain === \"function\") {\n fallbackChain = defaultChain(networkId, chains);\n } else if (typeof defaultChain === \"object\") {\n fallbackChain =\n networkId === \"mainnet\"\n ? defaultChain?.mainnet\n : defaultChain?.testnet;\n }\n\n const chainId = fallbackChain?.id || firstChain?.network_infos?.chain_id;\n if (!chainId) return;\n\n setCurrentChainId?.(chainId);\n }\n }, [\n connectedChain,\n chains,\n currentChainId,\n networkId,\n setCurrentChainId,\n defaultChain,\n ]);\n\n return [currentChainId, setCurrentChainId] as const;\n}\n","import { 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.5",
3
+ "version": "2.0.6",
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.5",
21
- "@orderly.network/types": "2.0.5",
22
- "@orderly.network/ui": "2.0.5",
23
- "@orderly.network/utils": "2.0.5"
20
+ "@orderly.network/ui": "2.0.6",
21
+ "@orderly.network/utils": "2.0.6",
22
+ "@orderly.network/types": "2.0.6",
23
+ "@orderly.network/hooks": "2.0.6"
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.20"
32
+ "tsconfig": "0.3.21"
33
33
  },
34
34
  "peerDependencies": {
35
35
  "react": ">=18",