@kodiak-finance/orderly-ui-leverage 2.8.18 → 2.8.19

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
@@ -2,7 +2,7 @@
2
2
 
3
3
  var orderlyI18n = require('@kodiak-finance/orderly-i18n');
4
4
  var orderlyUi = require('@kodiak-finance/orderly-ui');
5
- var pe = require('react');
5
+ var React = require('react');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
7
  var orderlyHooks = require('@kodiak-finance/orderly-hooks');
8
8
  var orderlyPerp = require('@kodiak-finance/orderly-perp');
@@ -11,19 +11,747 @@ var orderlyUtils = require('@kodiak-finance/orderly-utils');
11
11
 
12
12
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
13
13
 
14
- var pe__default = /*#__PURE__*/_interopDefault(pe);
14
+ var React__default = /*#__PURE__*/_interopDefault(React);
15
15
 
16
- var X=e=>{let{Icon:o,onClick:t,disabled:s}=e;return jsxRuntime.jsx(o,{onClick:s?void 0:t,className:orderlyUi.cn("oui-m-2 oui-text-white oui-transition-all",s?"oui-cursor-not-allowed oui-opacity-20":"oui-cursor-pointer oui-opacity-100")})},O=e=>{let o=pe__default.default.useMemo(()=>[orderlyUi.inputFormatter.numberFormatter,orderlyUi.inputFormatter.dpFormatter(0)],[]),t=pe.useId();return jsxRuntime.jsxs("label",{htmlFor:t,className:orderlyUi.cn("oui-w-full","oui-rounded","oui-bg-base-6","oui-flex","oui-items-center","oui-justify-between","oui-outline","oui-outline-offset-0","oui-outline-1","oui-outline-transparent","focus-within:oui-outline-primary-light","oui-input-root"),children:[jsxRuntime.jsx(X,{Icon:orderlyUi.ReduceIcon,onClick:e.onLeverageReduce,disabled:e.isReduceDisabled}),jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:"oui-mr-4",children:[jsxRuntime.jsx(orderlyUi.Input,{value:e.value,id:t,autoComplete:"off",classNames:{input:orderlyUi.cn("oui-text-right oui-text-[24px]"),root:orderlyUi.cn("oui-w-12","oui-px-0","oui-outline","oui-outline-offset-0","oui-outline-1","oui-outline-transparent","focus-within:oui-outline-primary-none")},formatters:o,onChange:e.onInputChange}),jsxRuntime.jsx("div",{className:orderlyUi.cn("oui-ml-1 oui-mt-1 oui-select-none","oui-text-base oui-text-base-contrast-36"),children:"x"})]}),jsxRuntime.jsx(X,{Icon:orderlyUi.PlusIcon,onClick:e.onLeverageIncrease,disabled:e.isIncreaseDisabled})]})},A=e=>{let{currentLeverage:o}=e,{t}=orderlyI18n.useTranslation();return jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"start",direction:"column",mb:0,children:[jsxRuntime.jsx(T,{currentLeverage:o}),jsxRuntime.jsx(O,{...e}),jsxRuntime.jsx(z,{...e}),jsxRuntime.jsx(E,{...e}),jsxRuntime.jsx(G,{...e})]})},G=e=>{let{t:o}=orderlyI18n.useTranslation();return jsxRuntime.jsxs(orderlyUi.Flex,{direction:"row",gap:2,width:"100%",mt:0,pt:5,children:[jsxRuntime.jsx(orderlyUi.Button,{variant:"contained",color:"gray",fullWidth:true,onClick:e.onCancel,"data-testid":"oui-testid-leverage-cancel-btn",size:e.isMobile?"md":"lg",children:o("common.cancel")}),jsxRuntime.jsx(orderlyUi.Button,{fullWidth:true,loading:e.isLoading,onClick:e.onSave,"data-testid":"oui-testid-leverage-save-btn",disabled:e.disabled,size:e.isMobile?"md":"lg",children:o("common.save")})]})},T=e=>{let{t:o}=orderlyI18n.useTranslation(),{currentLeverage:t}=e;return jsxRuntime.jsx(orderlyUi.Flex,{justify:"center",width:"100%",mb:2,children:jsxRuntime.jsxs(orderlyUi.Flex,{gap:1,children:[`${o("common.current")}:`,jsxRuntime.jsx(orderlyUi.Text.numeral,{unit:"x",size:"sm",intensity:80,dp:0,children:t??"--"})]})})},z=e=>{let{value:o,onLeverageChange:t}=e;return jsxRuntime.jsx(orderlyUi.Flex,{itemAlign:"center",justify:"between",width:"100%",mt:4,className:"oui-text-base-contrast-80",children:e.toggles.map(s=>jsxRuntime.jsx(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:orderlyUi.cn("oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all",o===s?"oui-border-primary oui-bg-base-6":"oui-border-line-12"),onClick:()=>t?.(s),children:jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"center",justify:"center",className:orderlyUi.cn("oui-h-3 oui-w-9 oui-select-none"),children:[s,"x"]})},s))})},E=e=>{let{leverageLevers:o,maxLeverage:t=0,className:s,value:v,showSliderTip:n}=e;return jsxRuntime.jsxs(orderlyUi.Box,{pt:4,width:"100%",className:s,children:[jsxRuntime.jsx(orderlyUi.Slider,{max:t,min:1,markCount:5,value:[v],onValueChange:r=>{e.onLeverageChange(r[0]),e.setShowSliderTip(true);},color:"primary",onValueCommit:r=>{e.onValueCommit?.(r),e.setShowSliderTip(false);},showTip:n,tipFormatter:r=>`${r}x`}),jsxRuntime.jsx(orderlyUi.Flex,{justify:"between",width:"100%",pt:3,children:o?.map((r,m)=>jsxRuntime.jsx("button",{onClick:()=>{e.onLeverageChange(r),e.onValueCommit?.([r]);},className:orderlyUi.cn("oui-pb-3 oui-text-2xs",m===0?"oui-pr-2":m===5?"oui-pl-0":"oui-ml-2 oui-px-0",e.value>=r&&"oui-text-primary-light"),"data-testid":`oui-testid-leverage-${r}-btn`,children:`${r}x`},r))})]})};var q=e=>{let[o,t]=pe.useState(false),{t:s}=orderlyI18n.useTranslation(),{curLeverage:v,maxLeverage:n,isLoading:r,leverageLevers:m,update:y}=orderlyHooks.useLeverage(),R=pe.useMemo(()=>m.map(u=>({label:`${u}x`,value:u})),[m]),[i,p]=pe.useState(v??0),h=100/((R?.length||0)-1),F=u=>{p(u);},w=()=>{p(u=>u+1);},x=()=>{p(u=>u-1);},N=pe.useCallback(u=>{let k=Number.parseInt(u.target.value),H=Number.isNaN(k)?"":k;p(H);},[n]),g=async()=>{try{y({leverage:i}).then(()=>{e?.close?.(),orderlyUi.toast.success(s("leverage.updated"));},u=>{orderlyUi.toast.error(u.message);});}catch{}},d=i<=1,f=i>=n,C=!i||i<1||i>n,V=pe.useMemo(()=>[5,10,20,50,100].filter(u=>u<=n),[n]);return {leverageLevers:m,currentLeverage:v,value:i,marks:R,onLeverageChange:F,onLeverageIncrease:w,onLeverageReduce:x,onInputChange:N,isReduceDisabled:d,isIncreaseDisabled:f,disabled:C,step:h,onCancel:e?.close,onSave:g,isLoading:r,showSliderTip:o,setShowSliderTip:t,maxLeverage:n,toggles:V}};var W=e=>{let o=q({close:e.close});return jsxRuntime.jsx(A,{...o})};var te=e=>{let{curLeverage:o=1,symbol:t,side:s}=e,[v,n]=pe.useState(false),[r,m]=pe.useState(o),{t:y}=orderlyI18n.useTranslation(),{isMobile:R}=orderlyUi.useScreen(),{maxLeverage:i,update:p,isLoading:h}=orderlyHooks.useSymbolLeverage(t),{position:F,maxPositionNotional:w,maxPositionLeverage:x,overMaxPositionLeverage:N,overRequiredMargin:g}=ze({symbol:t,leverage:r,maxLeverage:i}),d=pe.useMemo(()=>Ge(i),[i]),f=pe.useMemo(()=>d.map(c=>({label:`${c}x`,value:c}))||[],[d]),C=pe.useMemo(()=>100/((f?.length||0)-1),[f]),V=c=>{m(c);},u=()=>{m(c=>c+1);},k=()=>{m(c=>c-1);},H=pe.useCallback(c=>{let $=Number.parseInt(c.target.value),de=Number.isNaN($)?"":$;m(de);},[i]),le=async()=>{try{p?.({leverage:r,symbol:t}).then(c=>{c.success?(e?.close?.(),orderlyUi.toast.success(y("leverage.updated"))):orderlyUi.toast.error(c.message);},c=>{orderlyUi.toast.error(c.message);});}catch{}},ue=async()=>{orderlyUi.modal.confirm({title:y("leverage.confirm"),content:jsxRuntime.jsx(orderlyUi.Text,{intensity:54,children:y("leverage.confirm.content")}),onOk:le,onCancel:()=>Promise.resolve()});},ce=r<=1,me=r>=i,ge=s?s===orderlyTypes.OrderSide.BUY:F?.position_qty&&F.position_qty>0,ve=!r||r<1||r>i||g||N;return {leverageLevers:d,currentLeverage:o,value:r,marks:f,onLeverageChange:V,onLeverageIncrease:u,onLeverageReduce:k,onInputChange:H,isReduceDisabled:ce,isIncreaseDisabled:me,disabled:ve,step:C,onCancel:e?.close,onSave:ue,isLoading:h,showSliderTip:v,setShowSliderTip:n,maxLeverage:i,toggles:d,symbol:t,maxPositionNotional:w,maxPositionLeverage:x,overMaxPositionLeverage:N,overRequiredMargin:g,isBuy:ge,isMobile:R}},Ge=e=>{if(e===10)return [1,3,5,8,10];if(e===50)return [1,10,20,35,50];let o=1,t=5,s=(e-o)/(t-1),v=[];for(let n=0;n<t;n++)v.push(Math.floor(o+s*n));return v};function ze(e){let{symbol:o,leverage:t,maxLeverage:s}=e,v=orderlyHooks.useSymbolsInfo(),{data:n}=orderlyHooks.useAccountInfo(),{data:r}=orderlyHooks.useMarkPricesStream(),{totalCollateral:m}=orderlyHooks.usePortfolio(),[y,R]=orderlyHooks.useLocalStorage("unPnlPriceBasis","markPrice"),[i]=orderlyHooks.usePositionStream("all",{calcMode:y}),p=pe.useMemo(()=>{if(o&&i?.rows?.length)return i.rows.find(g=>g.symbol===o)},[i,o]),h=pe.useMemo(()=>{let g=n?.imr_factor?.[o],d=p?.notional;if(g&&d){let f=orderlyPerp.positions.maxPositionLeverage({IMRFactor:g,notional:d});return Math.min(f,s)}return s},[p,s,o]),F=pe.useMemo(()=>{let g=n?.imr_factor?.[o];if(t&&g)return orderlyPerp.positions.maxPositionNotional({leverage:t,IMRFactor:g})},[t,o]),w=pe.useMemo(()=>t>h,[t,h]),x=pe.useMemo(()=>{if(!n||!r||!v)return orderlyUtils.zero;let g=t?i?.rows.map(C=>C.symbol===o?{...C,leverage:t}:C):i?.rows,d=orderlyPerp.account.totalInitialMarginWithQty({positions:g,markPrices:r,IMR_Factors:n.imr_factor,maxLeverage:n.max_leverage,symbolInfo:v});return orderlyPerp.account.freeCollateral({totalCollateral:m,totalInitialMarginWithOrders:d})},[i,v,n,r,m,t,o]),N=pe.useMemo(()=>x.eq(0)||x.isNegative(),[x]);return {position:p,freeCollateral:x,maxPositionNotional:F,maxPositionLeverage:h,overMaxPositionLeverage:w,overRequiredMargin:N}}var ie=e=>{let{t:o}=orderlyI18n.useTranslation();return jsxRuntime.jsxs("div",{className:"oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4",children:[jsxRuntime.jsxs("div",{className:"oui-flex oui-items-center oui-gap-2",children:[jsxRuntime.jsx(orderlyUi.TokenIcon,{symbol:e.symbol,className:"oui-size-5"}),jsxRuntime.jsx(orderlyUi.Text.formatted,{rule:"symbol",formatString:"base-type",size:e.isMobile?"xs":"base",weight:"semibold",intensity:98,children:e.symbol}),jsxRuntime.jsxs("div",{className:orderlyUi.cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),children:[jsxRuntime.jsx(orderlyUi.Badge,{color:e.isBuy?"success":"danger",size:"xs",children:e.isBuy?o("common.long"):o("common.short")}),jsxRuntime.jsx(Ke,{leverage:e.currentLeverage})]})]}),jsxRuntime.jsx(orderlyUi.Divider,{}),jsxRuntime.jsxs(orderlyUi.Flex,{itemAlign:"start",direction:"column",mb:0,children:[jsxRuntime.jsx(T,{currentLeverage:e.currentLeverage}),jsxRuntime.jsx(O,{...e}),jsxRuntime.jsx(z,{...e}),jsxRuntime.jsx(E,{...e}),jsxRuntime.jsx(orderlyUi.Divider,{className:"oui-mb-3 oui-w-full"}),jsxRuntime.jsxs("div",{className:"oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54",children:[jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyI18n.Trans,{i18nKey:"leverage.maxAvailableLeverage.tips",values:{leverage:e.maxPositionLeverage},components:[jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,suffix:"x",as:"span",className:"oui-text-base-contrast"},"0")]})}),jsxRuntime.jsx("div",{children:o("leverage.actualPositionLeverage.tips")})]}),jsxRuntime.jsxs("div",{className:orderlyUi.cn(["-oui-mb-2",e.overRequiredMargin||e.overMaxPositionLeverage?"oui-block oui-text-xs oui-font-normal":"oui-hidden"]),children:[e.overRequiredMargin&&jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyUi.Text,{color:"warning",children:o("leverage.overRequiredMargin.tips")})}),e.overMaxPositionLeverage&&jsxRuntime.jsx("div",{children:jsxRuntime.jsx(orderlyUi.Text,{color:"warning",children:jsxRuntime.jsx(orderlyI18n.Trans,{i18nKey:"leverage.overMaxPositionLeverage.tips",values:{leverage:e.maxPositionLeverage},components:[jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,suffix:"X",as:"span"},"0")]})})})]}),jsxRuntime.jsx(G,{...e})]})]})},Ke=({leverage:e})=>jsxRuntime.jsxs("div",{className:orderlyUi.cn("oui-flex oui-h-[18px] oui-items-center oui-gap-1","oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2","oui-text-2xs oui-font-semibold oui-text-base-contrast-36"),children:[jsxRuntime.jsx(orderlyUi.Text,{children:"Cross"}),jsxRuntime.jsx(orderlyUi.Text.numeral,{dp:0,size:"2xs",unit:"X",children:e})]});var B=e=>{let o=te(e);return jsxRuntime.jsx(ie,{...o})};var Je="SymbolLeverageSheetId",Ze="SymbolLeverageDialogId";orderlyUi.registerSimpleSheet(Je,B,{title:()=>orderlyI18n.i18n.t("leverage.adjustedLeverage"),classNames:{}});orderlyUi.registerSimpleDialog(Ze,B,{title:()=>orderlyI18n.i18n.t("leverage.adjustedLeverage"),classNames:{content:"oui-w-[420px]"}});var to="LeverageWidgetWithDialog",ro="LeverageWidgetWithSheet";orderlyUi.registerSimpleDialog(to,W,{title:()=>orderlyI18n.i18n.t("leverage.maxAccountLeverage"),size:"md"});orderlyUi.registerSimpleSheet(ro,W,{title:()=>orderlyI18n.i18n.t("leverage.maxAccountLeverage")});
16
+ // src/index.ts
17
+ var IconButton = (props) => {
18
+ const { Icon, onClick, disabled } = props;
19
+ return /* @__PURE__ */ jsxRuntime.jsx(
20
+ Icon,
21
+ {
22
+ onClick: disabled ? void 0 : onClick,
23
+ className: orderlyUi.cn(
24
+ "oui-m-2 oui-text-white oui-transition-all",
25
+ disabled ? "oui-cursor-not-allowed oui-opacity-20" : "oui-cursor-pointer oui-opacity-100"
26
+ )
27
+ }
28
+ );
29
+ };
30
+ var LeverageInput = (props) => {
31
+ const formatters = React__default.default.useMemo(
32
+ () => [orderlyUi.inputFormatter.numberFormatter, orderlyUi.inputFormatter.dpFormatter(0)],
33
+ []
34
+ );
35
+ const id = React.useId();
36
+ return /* @__PURE__ */ jsxRuntime.jsxs(
37
+ "label",
38
+ {
39
+ htmlFor: id,
40
+ className: orderlyUi.cn(
41
+ "oui-w-full",
42
+ "oui-rounded",
43
+ "oui-bg-base-6",
44
+ "oui-flex",
45
+ "oui-items-center",
46
+ "oui-justify-between",
47
+ "oui-outline",
48
+ "oui-outline-offset-0",
49
+ "oui-outline-1",
50
+ "oui-outline-transparent",
51
+ "focus-within:oui-outline-primary-light",
52
+ "oui-input-root"
53
+ ),
54
+ children: [
55
+ /* @__PURE__ */ jsxRuntime.jsx(
56
+ IconButton,
57
+ {
58
+ Icon: orderlyUi.ReduceIcon,
59
+ onClick: props.onLeverageReduce,
60
+ disabled: props.isReduceDisabled
61
+ }
62
+ ),
63
+ /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "center", justify: "center", className: "oui-mr-4", children: [
64
+ /* @__PURE__ */ jsxRuntime.jsx(
65
+ orderlyUi.Input,
66
+ {
67
+ value: props.value,
68
+ id,
69
+ autoComplete: "off",
70
+ classNames: {
71
+ input: orderlyUi.cn("oui-text-right oui-text-[24px]"),
72
+ root: orderlyUi.cn(
73
+ "oui-w-12",
74
+ "oui-px-0",
75
+ "oui-outline",
76
+ "oui-outline-offset-0",
77
+ "oui-outline-1",
78
+ "oui-outline-transparent",
79
+ "focus-within:oui-outline-primary-none"
80
+ )
81
+ },
82
+ formatters,
83
+ onChange: props.onInputChange
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsxRuntime.jsx(
87
+ "div",
88
+ {
89
+ className: orderlyUi.cn(
90
+ "oui-ml-1 oui-mt-1 oui-select-none",
91
+ "oui-text-base oui-text-base-contrast-36"
92
+ ),
93
+ children: "x"
94
+ }
95
+ )
96
+ ] }),
97
+ /* @__PURE__ */ jsxRuntime.jsx(
98
+ IconButton,
99
+ {
100
+ Icon: orderlyUi.PlusIcon,
101
+ onClick: props.onLeverageIncrease,
102
+ disabled: props.isIncreaseDisabled
103
+ }
104
+ )
105
+ ]
106
+ }
107
+ );
108
+ };
109
+ var Leverage = (props) => {
110
+ const { currentLeverage } = props;
111
+ const { t } = orderlyI18n.useTranslation();
112
+ return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "start", direction: "column", mb: 0, children: [
113
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageHeader, { currentLeverage }),
114
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageInput, { ...props }),
115
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageSelector, { ...props }),
116
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageSlider, { ...props }),
117
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageFooter, { ...props })
118
+ ] });
119
+ };
120
+ var LeverageFooter = (props) => {
121
+ const { t } = orderlyI18n.useTranslation();
122
+ return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { direction: "row", gap: 2, width: "100%", mt: 0, pt: 5, children: [
123
+ /* @__PURE__ */ jsxRuntime.jsx(
124
+ orderlyUi.Button,
125
+ {
126
+ variant: "contained",
127
+ color: "gray",
128
+ fullWidth: true,
129
+ onClick: props.onCancel,
130
+ "data-testid": "oui-testid-leverage-cancel-btn",
131
+ size: props.isMobile ? "md" : "lg",
132
+ children: t("common.cancel")
133
+ }
134
+ ),
135
+ /* @__PURE__ */ jsxRuntime.jsx(
136
+ orderlyUi.Button,
137
+ {
138
+ fullWidth: true,
139
+ loading: props.isLoading,
140
+ onClick: props.onSave,
141
+ "data-testid": "oui-testid-leverage-save-btn",
142
+ disabled: props.disabled,
143
+ size: props.isMobile ? "md" : "lg",
144
+ children: t("common.save")
145
+ }
146
+ )
147
+ ] });
148
+ };
149
+ var LeverageHeader = (props) => {
150
+ const { t } = orderlyI18n.useTranslation();
151
+ const { currentLeverage } = props;
152
+ return /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { justify: "center", width: "100%", mb: 2, children: /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { gap: 1, children: [
153
+ `${t("common.current")}:`,
154
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { unit: "x", size: "sm", intensity: 80, dp: 0, children: currentLeverage ?? "--" })
155
+ ] }) });
156
+ };
157
+ var LeverageSelector = (props) => {
158
+ const { value, onLeverageChange } = props;
159
+ return /* @__PURE__ */ jsxRuntime.jsx(
160
+ orderlyUi.Flex,
161
+ {
162
+ itemAlign: "center",
163
+ justify: "between",
164
+ width: "100%",
165
+ mt: 4,
166
+ className: "oui-text-base-contrast-80",
167
+ children: props.toggles.map((option) => /* @__PURE__ */ jsxRuntime.jsx(
168
+ orderlyUi.Flex,
169
+ {
170
+ itemAlign: "center",
171
+ justify: "center",
172
+ className: orderlyUi.cn(
173
+ `oui-box-border oui-cursor-pointer oui-rounded-md oui-border oui-border-solid oui-bg-clip-padding oui-px-3 oui-py-2.5 oui-transition-all`,
174
+ value === option ? "oui-border-primary oui-bg-base-6" : "oui-border-line-12"
175
+ ),
176
+ onClick: () => onLeverageChange?.(option),
177
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
178
+ orderlyUi.Flex,
179
+ {
180
+ itemAlign: "center",
181
+ justify: "center",
182
+ className: orderlyUi.cn(`oui-h-3 oui-w-9 oui-select-none`),
183
+ children: [
184
+ option,
185
+ "x"
186
+ ]
187
+ }
188
+ )
189
+ },
190
+ option
191
+ ))
192
+ }
193
+ );
194
+ };
195
+ var getMarkPosition = (item, index, max, total) => {
196
+ const min = 1;
197
+ const maxSteps = max - min;
198
+ const percentPerStep = 100 / maxSteps;
199
+ const position = percentPerStep * (item - min);
200
+ if (index === 0)
201
+ return Math.min(position + 2, 100);
202
+ if (index === total - 1)
203
+ return Math.max(position - 3, 0);
204
+ return position;
205
+ };
206
+ var LeverageSlider = (props) => {
207
+ const {
208
+ leverageLevers,
209
+ maxLeverage = 0,
210
+ className,
211
+ value,
212
+ showSliderTip,
213
+ marks
214
+ } = props;
215
+ const sliderMax = leverageLevers.length > 0 ? Math.max(...leverageLevers) : maxLeverage;
216
+ return /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Box, { pt: 4, width: "100%", className, children: [
217
+ /* @__PURE__ */ jsxRuntime.jsx(
218
+ orderlyUi.Slider,
219
+ {
220
+ max: maxLeverage,
221
+ min: 1,
222
+ marks,
223
+ value: [value],
224
+ onValueChange: (e) => {
225
+ props.onLeverageChange(e[0]);
226
+ props.setShowSliderTip(true);
227
+ },
228
+ color: "primary",
229
+ onValueCommit: (e) => {
230
+ props.onValueCommit?.(e);
231
+ props.setShowSliderTip(false);
232
+ },
233
+ showTip: showSliderTip,
234
+ tipFormatter: (value2) => {
235
+ return `${value2}x`;
236
+ }
237
+ }
238
+ ),
239
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Flex, { justify: "between", width: "100%", pt: 3, children: leverageLevers?.map((item, index) => {
240
+ const position = getMarkPosition(
241
+ item,
242
+ index,
243
+ sliderMax,
244
+ leverageLevers.length
245
+ );
246
+ return /* @__PURE__ */ jsxRuntime.jsx(
247
+ "button",
248
+ {
249
+ onClick: () => {
250
+ props.onLeverageChange(item);
251
+ props.onValueCommit?.([item]);
252
+ },
253
+ className: orderlyUi.cn(
254
+ "oui-absolute oui-pb-3 oui-text-2xs oui-transform oui--translate-x-1/2",
255
+ Number(props.value) >= Number(item) ? "oui-text-primary-light" : "oui-text-base-contrast-54"
256
+ ),
257
+ style: {
258
+ left: `${position}%`
259
+ },
260
+ "data-testid": `oui-testid-leverage-${item}-btn`,
261
+ children: `${item}x`
262
+ },
263
+ item
264
+ );
265
+ }) })
266
+ ] });
267
+ };
268
+ var useLeverageScript = (options) => {
269
+ const [showSliderTip, setShowSliderTip] = React.useState(false);
270
+ const { t } = orderlyI18n.useTranslation();
271
+ const { curLeverage, maxLeverage, isLoading, leverageLevers, update } = orderlyHooks.useLeverage();
272
+ const marks = React.useMemo(() => {
273
+ return leverageLevers.map((e) => ({
274
+ label: `${e}x`,
275
+ value: e
276
+ }));
277
+ }, [leverageLevers]);
278
+ const [leverage, setLeverage] = React.useState(curLeverage ?? 0);
279
+ const step = 100 / ((marks?.length || 0) - 1);
280
+ const onLeverageChange = (leverage2) => {
281
+ setLeverage(leverage2);
282
+ };
283
+ const onLeverageIncrease = () => {
284
+ setLeverage((prev) => prev + 1);
285
+ };
286
+ const onLeverageReduce = () => {
287
+ setLeverage((prev) => prev - 1);
288
+ };
289
+ const onInputChange = React.useCallback(
290
+ (e) => {
291
+ const parsed = Number.parseInt(e.target.value);
292
+ const value = Number.isNaN(parsed) ? "" : parsed;
293
+ setLeverage(value);
294
+ },
295
+ [maxLeverage]
296
+ );
297
+ const onSave = async () => {
298
+ try {
299
+ update({ leverage }).then(
300
+ () => {
301
+ options?.close?.();
302
+ orderlyUi.toast.success(t("leverage.updated"));
303
+ },
304
+ (err) => {
305
+ orderlyUi.toast.error(err.message);
306
+ }
307
+ );
308
+ } catch (err) {
309
+ }
310
+ };
311
+ const isReduceDisabled = leverage <= 1;
312
+ const isIncreaseDisabled = leverage >= maxLeverage;
313
+ const disabled = !leverage || leverage < 1 || leverage > maxLeverage;
314
+ const toggles = React.useMemo(() => {
315
+ return [5, 10, 20, 50, 100].filter((e) => e <= maxLeverage);
316
+ }, [maxLeverage]);
317
+ return {
318
+ leverageLevers,
319
+ currentLeverage: curLeverage,
320
+ value: leverage,
321
+ marks,
322
+ onLeverageChange,
323
+ onLeverageIncrease,
324
+ onLeverageReduce,
325
+ onInputChange,
326
+ isReduceDisabled,
327
+ isIncreaseDisabled,
328
+ disabled,
329
+ step,
330
+ onCancel: options?.close,
331
+ onSave,
332
+ isLoading,
333
+ showSliderTip,
334
+ setShowSliderTip,
335
+ maxLeverage,
336
+ toggles
337
+ };
338
+ };
339
+ var LeverageEditor = (props) => {
340
+ const state = useLeverageScript({ close: props.close });
341
+ return /* @__PURE__ */ jsxRuntime.jsx(Leverage, { ...state });
342
+ };
343
+ var useSymbolLeverageScript = (options) => {
344
+ const { curLeverage = 1, symbol, side } = options;
345
+ const [showSliderTip, setShowSliderTip] = React.useState(false);
346
+ const [leverage, setLeverage] = React.useState(curLeverage);
347
+ const { t } = orderlyI18n.useTranslation();
348
+ const { isMobile } = orderlyUi.useScreen();
349
+ const {
350
+ maxLeverage: originalMaxLeverage,
351
+ update,
352
+ isLoading
353
+ } = orderlyHooks.useSymbolLeverage(symbol);
354
+ const maxLeverage = originalMaxLeverage;
355
+ const {
356
+ position,
357
+ maxPositionNotional,
358
+ maxPositionLeverage,
359
+ overMaxPositionLeverage,
360
+ overRequiredMargin
361
+ } = useCalc({ symbol, leverage, maxLeverage });
362
+ const formattedLeverageLevers = React.useMemo(() => {
363
+ return generateLeverageLeversForSelector(maxLeverage);
364
+ }, [maxLeverage]);
365
+ const leverageLevers = React.useMemo(() => {
366
+ return generateLeverageLevers(maxLeverage);
367
+ }, [maxLeverage]);
368
+ const marks = React.useMemo(() => {
369
+ return leverageLevers.map((e) => ({
370
+ label: `${e}x`,
371
+ value: e
372
+ })) || [];
373
+ }, [leverageLevers]);
374
+ const step = React.useMemo(() => {
375
+ return 100 / ((marks?.length || 0) - 1);
376
+ }, [marks]);
377
+ const onLeverageChange = (leverage2) => {
378
+ setLeverage(leverage2);
379
+ };
380
+ const onLeverageIncrease = () => {
381
+ setLeverage((prev) => prev + 1);
382
+ };
383
+ const onLeverageReduce = () => {
384
+ setLeverage((prev) => prev - 1);
385
+ };
386
+ const onInputChange = React.useCallback(
387
+ (e) => {
388
+ const parsed = Number.parseInt(e.target.value);
389
+ if (!Number.isNaN(parsed)) {
390
+ setLeverage(parsed);
391
+ }
392
+ },
393
+ []
394
+ );
395
+ const onConfirmSave = async () => {
396
+ try {
397
+ update?.({ leverage, symbol }).then(
398
+ (res) => {
399
+ if (res.success) {
400
+ options?.close?.();
401
+ orderlyUi.toast.success(t("leverage.updated"));
402
+ } else {
403
+ orderlyUi.toast.error(res.message);
404
+ }
405
+ },
406
+ (err) => {
407
+ orderlyUi.toast.error(err.message);
408
+ }
409
+ );
410
+ } catch (err) {
411
+ }
412
+ };
413
+ const onSave = async () => {
414
+ orderlyUi.modal.confirm({
415
+ title: t("leverage.confirm"),
416
+ content: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { intensity: 54, children: t("leverage.confirm.content") }),
417
+ onOk: onConfirmSave,
418
+ onCancel: () => {
419
+ return Promise.resolve();
420
+ }
421
+ });
422
+ };
423
+ const isReduceDisabled = leverage <= 1;
424
+ const isIncreaseDisabled = leverage >= maxLeverage;
425
+ const isBuy = side ? side === orderlyTypes.OrderSide.BUY : position?.position_qty && position.position_qty > 0;
426
+ const disabled = !leverage || leverage < 1 || leverage > maxLeverage || overRequiredMargin || overMaxPositionLeverage;
427
+ return {
428
+ leverageLevers,
429
+ currentLeverage: curLeverage,
430
+ // Keep the displayed leverage fixed until the user confirms the change.
431
+ value: leverage,
432
+ // Input and slider reflect the temporary value being edited.
433
+ marks,
434
+ onLeverageChange,
435
+ onLeverageIncrease,
436
+ onLeverageReduce,
437
+ onInputChange,
438
+ isReduceDisabled,
439
+ isIncreaseDisabled,
440
+ disabled,
441
+ step,
442
+ onCancel: options?.close,
443
+ onSave,
444
+ isLoading,
445
+ showSliderTip,
446
+ setShowSliderTip,
447
+ maxLeverage,
448
+ toggles: formattedLeverageLevers,
449
+ symbol,
450
+ maxPositionNotional,
451
+ maxPositionLeverage,
452
+ overMaxPositionLeverage,
453
+ overRequiredMargin,
454
+ isBuy,
455
+ isMobile
456
+ };
457
+ };
458
+ var generateLeverageLeversForSelector = (max) => {
459
+ if (max === 10) {
460
+ return [1, 3, 5, 8, 10];
461
+ } else if (max === 50) {
462
+ return [1, 10, 20, 35, 50];
463
+ }
464
+ const min = 1;
465
+ const parts = 5;
466
+ const step = (max - min) / (parts - 1);
467
+ const result = [];
468
+ for (let i = 0; i < parts; i++) {
469
+ result.push(Math.floor(min + step * i));
470
+ }
471
+ return result;
472
+ };
473
+ var generateEvenlyDistributedMarks = (max) => {
474
+ const result = [];
475
+ if (max % 5 === 0) {
476
+ const step = max / 5;
477
+ for (let i = 0; i < 6; i++) {
478
+ const value = step * i;
479
+ result.push(value === 0 ? 1 : value);
480
+ }
481
+ } else {
482
+ result.push(1);
483
+ const quarter = max * 0.25;
484
+ const half = max * 0.5;
485
+ const threeQuarter = max * 0.75;
486
+ const quarterRounded = Math.round(quarter);
487
+ const halfRounded = Math.round(half);
488
+ const threeQuarterRounded = Math.round(threeQuarter);
489
+ if (quarterRounded > 1 && quarterRounded !== halfRounded) {
490
+ result.push(quarterRounded);
491
+ }
492
+ if (halfRounded > 1) {
493
+ result.push(halfRounded);
494
+ }
495
+ if (threeQuarterRounded > halfRounded && threeQuarterRounded < max) {
496
+ result.push(threeQuarterRounded);
497
+ }
498
+ if (max > 1) {
499
+ result.push(max);
500
+ }
501
+ }
502
+ return result;
503
+ };
504
+ var generateLeverageLevers = (max) => {
505
+ switch (max) {
506
+ case 10:
507
+ return [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
508
+ case 20:
509
+ return [1, 5, 10, 15, 20];
510
+ case 50:
511
+ return [1, 10, 20, 30, 40, 50];
512
+ case 100:
513
+ return [1, 20, 40, 60, 80, 100];
514
+ }
515
+ const result = [];
516
+ if (max < 10) {
517
+ for (let i = 1; i <= max; i++) {
518
+ result.push(i);
519
+ }
520
+ } else {
521
+ result.push(...generateEvenlyDistributedMarks(max));
522
+ }
523
+ return result;
524
+ };
525
+ function useCalc(inputs) {
526
+ const { symbol, leverage, maxLeverage } = inputs;
527
+ const symbolsInfo = orderlyHooks.useSymbolsInfo();
528
+ const { data: accountInfo } = orderlyHooks.useAccountInfo();
529
+ const { data: markPrices } = orderlyHooks.useMarkPricesStream();
530
+ const { totalCollateral } = orderlyHooks.usePortfolio();
531
+ const [unPnlPriceBasis, setUnPnlPriceBasic] = orderlyHooks.useLocalStorage(
532
+ "unPnlPriceBasis",
533
+ "markPrice"
534
+ );
535
+ const [positions] = orderlyHooks.usePositionStream("all", {
536
+ calcMode: unPnlPriceBasis
537
+ });
538
+ const position = React.useMemo(() => {
539
+ if (symbol && positions?.rows?.length) {
540
+ return positions.rows.find((item) => item.symbol === symbol);
541
+ }
542
+ }, [positions, symbol]);
543
+ const maxPositionLeverage = React.useMemo(() => {
544
+ const IMRFactor = accountInfo?.imr_factor?.[symbol];
545
+ const notional = position?.notional;
546
+ if (IMRFactor && notional) {
547
+ const maxPositionLeverage2 = orderlyPerp.positions.maxPositionLeverage({
548
+ IMRFactor,
549
+ notional
550
+ });
551
+ return Math.min(maxPositionLeverage2, maxLeverage);
552
+ }
553
+ return maxLeverage;
554
+ }, [position, maxLeverage, symbol]);
555
+ const maxPositionNotional = React.useMemo(() => {
556
+ const IMRFactor = accountInfo?.imr_factor?.[symbol];
557
+ if (leverage && IMRFactor) {
558
+ return orderlyPerp.positions.maxPositionNotional({
559
+ leverage,
560
+ IMRFactor
561
+ });
562
+ }
563
+ }, [leverage, symbol]);
564
+ const overMaxPositionLeverage = React.useMemo(() => {
565
+ return leverage > maxPositionLeverage;
566
+ }, [leverage, maxPositionLeverage]);
567
+ const freeCollateral = React.useMemo(() => {
568
+ if (!accountInfo || !markPrices || !symbolsInfo) {
569
+ return orderlyUtils.zero;
570
+ }
571
+ const positionList = leverage ? positions?.rows.map((item) => {
572
+ if (item.symbol === symbol) {
573
+ return {
574
+ ...item,
575
+ leverage
576
+ };
577
+ }
578
+ return item;
579
+ }) : positions?.rows;
580
+ const totalInitialMarginWithOrders = orderlyPerp.account.totalInitialMarginWithQty({
581
+ positions: positionList,
582
+ markPrices,
583
+ IMR_Factors: accountInfo.imr_factor,
584
+ // not used
585
+ maxLeverage: accountInfo.max_leverage,
586
+ symbolInfo: symbolsInfo
587
+ });
588
+ const freeCollateral2 = orderlyPerp.account.freeCollateral({
589
+ totalCollateral,
590
+ totalInitialMarginWithOrders
591
+ });
592
+ return freeCollateral2;
593
+ }, [
594
+ positions,
595
+ symbolsInfo,
596
+ accountInfo,
597
+ markPrices,
598
+ totalCollateral,
599
+ leverage,
600
+ symbol
601
+ ]);
602
+ const overRequiredMargin = React.useMemo(() => {
603
+ return freeCollateral.eq(0) || freeCollateral.isNegative();
604
+ }, [freeCollateral]);
605
+ return {
606
+ position,
607
+ freeCollateral,
608
+ maxPositionNotional,
609
+ maxPositionLeverage,
610
+ overMaxPositionLeverage,
611
+ overRequiredMargin
612
+ };
613
+ }
614
+ var SymbolLeverage = (props) => {
615
+ const { t } = orderlyI18n.useTranslation();
616
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-flex-col oui-gap-3 lg:oui-gap-4", children: [
617
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-items-center oui-gap-2", children: [
618
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.TokenIcon, { symbol: props.symbol, className: "oui-size-5" }),
619
+ /* @__PURE__ */ jsxRuntime.jsx(
620
+ orderlyUi.Text.formatted,
621
+ {
622
+ rule: "symbol",
623
+ formatString: "base-type",
624
+ size: props.isMobile ? "xs" : "base",
625
+ weight: "semibold",
626
+ intensity: 98,
627
+ children: props.symbol
628
+ }
629
+ ),
630
+ /* @__PURE__ */ jsxRuntime.jsxs(
631
+ "div",
632
+ {
633
+ className: orderlyUi.cn(["oui-ml-auto oui-flex oui-items-center oui-gap-1"]),
634
+ children: [
635
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Badge, { color: props.isBuy ? "success" : "danger", size: "xs", children: props.isBuy ? t("common.long") : t("common.short") }),
636
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageBadge, { leverage: props.currentLeverage })
637
+ ]
638
+ }
639
+ )
640
+ ] }),
641
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Divider, {}),
642
+ /* @__PURE__ */ jsxRuntime.jsxs(orderlyUi.Flex, { itemAlign: "start", direction: "column", mb: 0, children: [
643
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageHeader, { currentLeverage: props.currentLeverage }),
644
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageInput, { ...props }),
645
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageSelector, { ...props }),
646
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageSlider, { ...props }),
647
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Divider, { className: "oui-mb-3 oui-w-full" }),
648
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "oui-flex oui-flex-col oui-gap-1 oui-pb-4 oui-text-xs oui-font-normal oui-text-base-contrast-54", children: [
649
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(
650
+ orderlyI18n.Trans,
651
+ {
652
+ i18nKey: "leverage.maxAvailableLeverage.tips",
653
+ values: { leverage: props.maxPositionLeverage },
654
+ components: [
655
+ // @ts-ignore
656
+ /* @__PURE__ */ jsxRuntime.jsx(
657
+ orderlyUi.Text.numeral,
658
+ {
659
+ dp: 0,
660
+ suffix: "x",
661
+ as: "span",
662
+ className: "oui-text-base-contrast"
663
+ },
664
+ "0"
665
+ )
666
+ ]
667
+ }
668
+ ) }),
669
+ /* @__PURE__ */ jsxRuntime.jsx("div", { children: t("leverage.actualPositionLeverage.tips") })
670
+ ] }),
671
+ /* @__PURE__ */ jsxRuntime.jsxs(
672
+ "div",
673
+ {
674
+ className: orderlyUi.cn([
675
+ "-oui-mb-2",
676
+ props.overRequiredMargin || props.overMaxPositionLeverage ? "oui-block oui-text-xs oui-font-normal" : "oui-hidden"
677
+ ]),
678
+ children: [
679
+ props.overRequiredMargin && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { color: "warning", children: t("leverage.overRequiredMargin.tips") }) }),
680
+ props.overMaxPositionLeverage && /* @__PURE__ */ jsxRuntime.jsx("div", { children: /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { color: "warning", children: /* @__PURE__ */ jsxRuntime.jsx(
681
+ orderlyI18n.Trans,
682
+ {
683
+ i18nKey: "leverage.overMaxPositionLeverage.tips",
684
+ values: { leverage: props.maxPositionLeverage },
685
+ components: [
686
+ // @ts-ignore
687
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { dp: 0, suffix: "X", as: "span" }, "0")
688
+ ]
689
+ }
690
+ ) }) })
691
+ ]
692
+ }
693
+ ),
694
+ /* @__PURE__ */ jsxRuntime.jsx(LeverageFooter, { ...props })
695
+ ] })
696
+ ] });
697
+ };
698
+ var LeverageBadge = ({ leverage }) => {
699
+ return /* @__PURE__ */ jsxRuntime.jsxs(
700
+ "div",
701
+ {
702
+ className: orderlyUi.cn(
703
+ "oui-flex oui-h-[18px] oui-items-center oui-gap-1",
704
+ "oui-cursor-pointer oui-rounded oui-bg-line-6 oui-px-2",
705
+ "oui-text-2xs oui-font-semibold oui-text-base-contrast-36"
706
+ ),
707
+ children: [
708
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text, { children: "Cross" }),
709
+ /* @__PURE__ */ jsxRuntime.jsx(orderlyUi.Text.numeral, { dp: 0, size: "2xs", unit: "X", children: leverage })
710
+ ]
711
+ }
712
+ );
713
+ };
714
+ var SymbolLeverageWidget = (props) => {
715
+ const state = useSymbolLeverageScript(props);
716
+ return /* @__PURE__ */ jsxRuntime.jsx(SymbolLeverage, { ...state });
717
+ };
17
718
 
18
- exports.Leverage = A;
19
- exports.LeverageEditor = W;
20
- exports.LeverageHeader = T;
21
- exports.LeverageSlider = E;
22
- exports.LeverageWidgetWithDialogId = to;
23
- exports.LeverageWidgetWithSheetId = ro;
24
- exports.SymbolLeverageDialogId = Ze;
25
- exports.SymbolLeverageSheetId = Je;
26
- exports.SymbolLeverageWidget = B;
27
- exports.useLeverageScript = q;
719
+ // src/symbolLeverage/index.ts
720
+ var SymbolLeverageSheetId = "SymbolLeverageSheetId";
721
+ var SymbolLeverageDialogId = "SymbolLeverageDialogId";
722
+ orderlyUi.registerSimpleSheet(SymbolLeverageSheetId, SymbolLeverageWidget, {
723
+ title: () => orderlyI18n.i18n.t("leverage.adjustedLeverage"),
724
+ classNames: {
725
+ // content: "oui-p-5",
726
+ }
727
+ });
728
+ orderlyUi.registerSimpleDialog(SymbolLeverageDialogId, SymbolLeverageWidget, {
729
+ title: () => orderlyI18n.i18n.t("leverage.adjustedLeverage"),
730
+ classNames: {
731
+ content: "oui-w-[420px]"
732
+ }
733
+ });
734
+
735
+ // src/index.ts
736
+ var LeverageWidgetWithDialogId = "LeverageWidgetWithDialog";
737
+ var LeverageWidgetWithSheetId = "LeverageWidgetWithSheet";
738
+ orderlyUi.registerSimpleDialog(LeverageWidgetWithDialogId, LeverageEditor, {
739
+ title: () => orderlyI18n.i18n.t("leverage.maxAccountLeverage"),
740
+ size: "md"
741
+ });
742
+ orderlyUi.registerSimpleSheet(LeverageWidgetWithSheetId, LeverageEditor, {
743
+ title: () => orderlyI18n.i18n.t("leverage.maxAccountLeverage")
744
+ });
745
+
746
+ exports.Leverage = Leverage;
747
+ exports.LeverageEditor = LeverageEditor;
748
+ exports.LeverageHeader = LeverageHeader;
749
+ exports.LeverageSlider = LeverageSlider;
750
+ exports.LeverageWidgetWithDialogId = LeverageWidgetWithDialogId;
751
+ exports.LeverageWidgetWithSheetId = LeverageWidgetWithSheetId;
752
+ exports.SymbolLeverageDialogId = SymbolLeverageDialogId;
753
+ exports.SymbolLeverageSheetId = SymbolLeverageSheetId;
754
+ exports.SymbolLeverageWidget = SymbolLeverageWidget;
755
+ exports.useLeverageScript = useLeverageScript;
28
756
  //# sourceMappingURL=out.js.map
29
757
  //# sourceMappingURL=index.js.map