Liq price in balances (#679)

* add liquidation price to balances table trade

* add depositcap to HLS

* fix: add width classes to the balances table, remove abbreviation, remove flicker

* fix: fixed the account selection and added a tooltip

* fix wasm file for debt liquidation price

---------

Co-authored-by: Linkie Link <linkielink.dev@gmail.com>
This commit is contained in:
Bob van der Helm 2023-12-07 14:44:31 +01:00 committed by GitHub
parent b82cf37c3d
commit 2effdfadac
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 460 additions and 324 deletions

View File

@ -1,7 +1,7 @@
import AssetRate from 'components/Asset/AssetRate' import AssetRate from 'components/Asset/AssetRate'
import { byDenom } from 'utils/array' import { byDenom } from 'utils/array'
export const APY_META = { accessorKey: 'apy', header: 'APY' } export const APY_META = { accessorKey: 'apy', header: 'APY', meta: { className: 'w-30' } }
interface Props { interface Props {
apy: number apy: number

View File

@ -0,0 +1,66 @@
import { useEffect, useMemo, useState } from 'react'
import DisplayCurrency from 'components/DisplayCurrency'
import { InfoCircle } from 'components/Icons'
import Text from 'components/Text'
import { Tooltip } from 'components/Tooltip'
import useLiquidationPrice from 'hooks/useLiquidationPrice'
import { BNCoin } from 'types/classes/BNCoin'
import { LiquidationPriceKind } from 'utils/health_computer'
import { BN } from 'utils/helpers'
export const LIQ_META = {
accessorKey: 'symbol',
header: 'Liquidation Price',
id: 'liqPrice',
meta: { className: 'w-40' },
}
interface Props {
amount: number
computeLiquidationPrice: (denom: string, kind: LiquidationPriceKind) => number | null
denom: string
type: 'deposits' | 'borrowing' | 'lending' | 'vault'
}
export default function LiqPrice(props: Props) {
const { denom, type, amount, computeLiquidationPrice } = props
const [lastLiquidationPrice, setLastLiquidationPrice] = useState<number | null>(null)
const liqPrice = useMemo(() => {
if (type === 'vault' || amount === 0) return 0
return computeLiquidationPrice(denom, type === 'borrowing' ? 'debt' : 'asset')
}, [amount, computeLiquidationPrice, denom, type])
const { liquidationPrice } = useLiquidationPrice(liqPrice)
useEffect(() => {
if (lastLiquidationPrice !== liqPrice && liqPrice !== null) setLastLiquidationPrice(liqPrice)
}, [liqPrice, lastLiquidationPrice])
if (!lastLiquidationPrice || (liquidationPrice === 0 && lastLiquidationPrice === 0))
return (
<Text size='xs' className='flex items-center justify-end number'>
N/A
<Tooltip
content={
type === 'vault'
? 'Liquidation prices cannot be calculated for farm positions. But it a drop in price of the underlying assets can still cause a liquidation.'
: 'The position size is too small to liquidate the account, even if the price goes to $0.00.'
}
type='info'
className='ml-1'
>
<InfoCircle className='w-3.5 h-3.5 text-white/40 hover:text-inherit' />
</Tooltip>
</Text>
)
return (
<DisplayCurrency
className='text-xs text-right number'
coin={BNCoin.fromDenomAndBigNumber('usd', BN(lastLiquidationPrice))}
options={{ abbreviated: false }}
/>
)
}

View File

@ -0,0 +1,26 @@
import DisplayCurrency from 'components/DisplayCurrency'
import usePrice from 'hooks/usePrice'
import { BNCoin } from 'types/classes/BNCoin'
import { BN } from 'utils/helpers'
export const PRICE_META = { id: 'price', header: 'Price', meta: { className: 'w-30' } }
interface Props {
amount: number
denom: string
type: 'deposits' | 'borrowing' | 'lending' | 'vault'
}
export default function Price(props: Props) {
const price = usePrice(props.denom)
if (props.amount === 0 || props.type === 'vault') return null
return (
<DisplayCurrency
className='text-xs text-right number'
coin={BNCoin.fromDenomAndBigNumber('usd', BN(price))}
options={{ abbreviated: false }}
/>
)
}

View File

@ -6,7 +6,7 @@ import { FormattedNumber } from 'components/FormattedNumber'
import { MAX_AMOUNT_DECIMALS, MIN_AMOUNT } from 'constants/math' import { MAX_AMOUNT_DECIMALS, MIN_AMOUNT } from 'constants/math'
import { formatAmountToPrecision } from 'utils/formatters' import { formatAmountToPrecision } from 'utils/formatters'
export const SIZE_META = { accessorKey: 'size', header: 'Size' } export const SIZE_META = { accessorKey: 'size', header: 'Size', meta: { className: 'w-40' } }
interface Props { interface Props {
size: number size: number

View File

@ -1,8 +1,10 @@
import { ColumnDef } from '@tanstack/react-table' import { ColumnDef, Row } from '@tanstack/react-table'
import { useMemo } from 'react' import { useMemo } from 'react'
import Apy, { APY_META } from 'components/Account/AccountBalancesTable/Columns/Apy' import Apy, { APY_META } from 'components/Account/AccountBalancesTable/Columns/Apy'
import Asset, { ASSET_META } from 'components/Account/AccountBalancesTable/Columns/Asset' import Asset, { ASSET_META } from 'components/Account/AccountBalancesTable/Columns/Asset'
import LiqPrice, { LIQ_META } from 'components/Account/AccountBalancesTable/Columns/LiqPrice'
import Price, { PRICE_META } from 'components/Account/AccountBalancesTable/Columns/Price'
import Size, { import Size, {
SIZE_META, SIZE_META,
sizeSortingFn, sizeSortingFn,
@ -11,10 +13,18 @@ import Value, {
VALUE_META, VALUE_META,
valueSortingFn, valueSortingFn,
} from 'components/Account/AccountBalancesTable/Columns/Value' } from 'components/Account/AccountBalancesTable/Columns/Value'
import useHealthComputer from 'hooks/useHealthComputer'
import useMarketAssets from 'hooks/useMarketAssets' import useMarketAssets from 'hooks/useMarketAssets'
import useStore from 'store'
export default function useAccountBalancesColumns() { export default function useAccountBalancesColumns(
account: Account,
showLiquidationPrice?: boolean,
) {
const { data: markets } = useMarketAssets() const { data: markets } = useMarketAssets()
const updatedAccount = useStore((s) => s.updatedAccount)
const { computeLiquidationPrice } = useHealthComputer(updatedAccount ?? account)
return useMemo<ColumnDef<AccountBalanceRow>[]>(() => { return useMemo<ColumnDef<AccountBalanceRow>[]>(() => {
return [ return [
@ -46,6 +56,36 @@ export default function useAccountBalancesColumns() {
), ),
sortingFn: sizeSortingFn, sortingFn: sizeSortingFn,
}, },
...(showLiquidationPrice
? [
{
...PRICE_META,
cell: ({ row }: { row: Row<AccountBalanceRow> }) => (
<Price
type={row.original.type}
amount={row.original.amount.toNumber()}
denom={row.original.denom}
/>
),
},
]
: []),
...(showLiquidationPrice
? [
{
...LIQ_META,
enableSorting: false,
cell: ({ row }: { row: Row<AccountBalanceRow> }) => (
<LiqPrice
denom={row.original.denom}
computeLiquidationPrice={computeLiquidationPrice}
type={row.original.type}
amount={row.original.amount.toNumber()}
/>
),
},
]
: []),
{ {
...APY_META, ...APY_META,
cell: ({ row }) => ( cell: ({ row }) => (
@ -58,5 +98,5 @@ export default function useAccountBalancesColumns() {
), ),
}, },
] ]
}, [markets]) }, [computeLiquidationPrice, markets, showLiquidationPrice])
} }

View File

@ -19,11 +19,19 @@ interface Props {
borrowingData: BorrowMarketTableData[] borrowingData: BorrowMarketTableData[]
hideCard?: boolean hideCard?: boolean
tableBodyClassName?: string tableBodyClassName?: string
showLiquidationPrice?: boolean
} }
export default function AccountBalancesTable(props: Props) { export default function AccountBalancesTable(props: Props) {
const [searchParams] = useSearchParams() const [searchParams] = useSearchParams()
const { account, lendingData, borrowingData, tableBodyClassName, hideCard } = props const {
account,
lendingData,
borrowingData,
tableBodyClassName,
hideCard,
showLiquidationPrice,
} = props
const currentAccount = useCurrentAccount() const currentAccount = useCurrentAccount()
const navigate = useNavigate() const navigate = useNavigate()
const { pathname } = useLocation() const { pathname } = useLocation()
@ -37,7 +45,7 @@ export default function AccountBalancesTable(props: Props) {
isHls: props.isHls, isHls: props.isHls,
}) })
const columns = useAccountBalancesColumns() const columns = useAccountBalancesColumns(account, showLiquidationPrice)
if (accountBalanceData.length === 0) if (accountBalanceData.length === 0)
return ( return (

View File

@ -15,9 +15,9 @@ export const depositCapSortingFn = (
} }
interface Props { interface Props {
account: HLSAccountWithStrategy depositCap: DepositCap
} }
export default function Name(props: Props) { export default function DepositCap(props: Props) {
return <DepositCapCell depositCap={props.account.strategy.depositCap} /> return <DepositCapCell depositCap={props.depositCap} />
} }

View File

@ -6,6 +6,7 @@ import ApyRange, {
APY_RANGE_META, APY_RANGE_META,
apyRangeSortingFn, apyRangeSortingFn,
} from 'components/HLS/Staking/Table/Columns/ApyRange' } from 'components/HLS/Staking/Table/Columns/ApyRange'
import DepositCap, { CAP_META } from 'components/HLS/Staking/Table/Columns/DepositCap'
import MaxLeverage, { MAX_LEV_META } from 'components/HLS/Staking/Table/Columns/MaxLeverage' import MaxLeverage, { MAX_LEV_META } from 'components/HLS/Staking/Table/Columns/MaxLeverage'
import MaxLTV, { LTV_MAX_META } from 'components/HLS/Staking/Table/Columns/MaxLTV' import MaxLTV, { LTV_MAX_META } from 'components/HLS/Staking/Table/Columns/MaxLTV'
import Name, { NAME_META } from 'components/HLS/Staking/Table/Columns/Name' import Name, { NAME_META } from 'components/HLS/Staking/Table/Columns/Name'
@ -31,6 +32,10 @@ export default function useAvailableColumns(props: Props) {
<MaxLTV strategy={row.original as HLSStrategy} isLoading={props.isLoading} /> <MaxLTV strategy={row.original as HLSStrategy} isLoading={props.isLoading} />
), ),
}, },
{
...CAP_META,
cell: ({ row }) => <DepositCap depositCap={row.original.depositCap} />,
},
{ {
...APY_RANGE_META, ...APY_RANGE_META,
cell: ({ row }) => ( cell: ({ row }) => (

View File

@ -57,7 +57,7 @@ export default function useDepositedColumns(props: Props) {
}, },
{ {
...CAP_META, ...CAP_META,
cell: ({ row }) => <DepositCap account={row.original} />, cell: ({ row }) => <DepositCap depositCap={row.original.strategy.depositCap} />,
sortingFn: depositCapSortingFn, sortingFn: depositCapSortingFn,
}, },
{ {

View File

@ -29,6 +29,7 @@ function Content(props: Props) {
account={account} account={account}
borrowingData={borrowAssets} borrowingData={borrowAssets}
lendingData={lendingAssets} lendingData={lendingAssets}
showLiquidationPrice
hideCard hideCard
/> />
</Skeleton> </Skeleton>
@ -55,7 +56,10 @@ function Skeleton(props: SkeletonProps) {
{props.children ? ( {props.children ? (
props.children props.children
) : ( ) : (
<TableSkeleton labels={['Asset', 'Value', 'Size', 'APY']} rowCount={3} /> <TableSkeleton
labels={['Asset', 'Value', 'Size', 'Price', 'Liquidation Price', 'APY']}
rowCount={3}
/>
)} )}
</Card> </Card>
</div> </div>

View File

@ -23,6 +23,7 @@ export default function AccountDetailsCard() {
borrowingData={borrowAssetsData} borrowingData={borrowAssetsData}
lendingData={lendingAssetsData} lendingData={lendingAssetsData}
tableBodyClassName='gradient-card-content' tableBodyClassName='gradient-card-content'
showLiquidationPrice
/> />
) )
} }

View File

@ -1,6 +1,5 @@
import classNames from 'classnames' import classNames from 'classnames'
import debounce from 'lodash.debounce' import React, { useMemo } from 'react'
import React, { useEffect, useMemo, useState } from 'react'
import ActionButton from 'components/Button/ActionButton' import ActionButton from 'components/Button/ActionButton'
import { CircularProgress } from 'components/CircularProgress' import { CircularProgress } from 'components/CircularProgress'
@ -11,6 +10,7 @@ import { ChevronDown } from 'components/Icons'
import Text from 'components/Text' import Text from 'components/Text'
import { DEFAULT_SETTINGS } from 'constants/defaultSettings' import { DEFAULT_SETTINGS } from 'constants/defaultSettings'
import { LocalStorageKeys } from 'constants/localStorageKeys' import { LocalStorageKeys } from 'constants/localStorageKeys'
import useLiquidationPrice from 'hooks/useLiquidationPrice'
import useLocalStorage from 'hooks/useLocalStorage' import useLocalStorage from 'hooks/useLocalStorage'
import usePrice from 'hooks/usePrice' import usePrice from 'hooks/usePrice'
import useSwapFee from 'hooks/useSwapFee' import useSwapFee from 'hooks/useSwapFee'
@ -59,24 +59,14 @@ export default function TradeSummary(props: Props) {
const sellAssetPrice = usePrice(sellAsset.denom) const sellAssetPrice = usePrice(sellAsset.denom)
const swapFee = useSwapFee(route.map((r) => r.pool_id)) const swapFee = useSwapFee(route.map((r) => r.pool_id))
const [showSummary, setShowSummary] = useToggle() const [showSummary, setShowSummary] = useToggle()
const [liquidationPrice, setLiquidationPrice] = useState<number | null>(null) const { liquidationPrice, isUpdatingLiquidationPrice } = useLiquidationPrice(
const [isUpdatingLiquidationPrice, setIsUpdatingLiquidationPrice] = useState(false) props.liquidationPrice,
const debouncedSetLiqPrice = useMemo(
() => debounce(setLiquidationPrice, 1000, { leading: false }),
[],
) )
const minReceive = useMemo(() => { const minReceive = useMemo(() => {
return buyAmount.times(1 - swapFee).times(1 - slippage) return buyAmount.times(1 - swapFee).times(1 - slippage)
}, [buyAmount, slippage, swapFee]) }, [buyAmount, slippage, swapFee])
useEffect(() => {
setIsUpdatingLiquidationPrice(true)
debouncedSetLiqPrice(props.liquidationPrice)
}, [debouncedSetLiqPrice, props.liquidationPrice])
useEffect(() => setIsUpdatingLiquidationPrice(false), [liquidationPrice])
const swapFeeValue = useMemo(() => { const swapFeeValue = useMemo(() => {
return sellAssetPrice.times(swapFee).times(sellAmount) return sellAssetPrice.times(swapFee).times(sellAmount)
}, [sellAmount, sellAssetPrice, swapFee]) }, [sellAmount, sellAssetPrice, swapFee])

View File

@ -210,7 +210,7 @@ export default function SwapForm(props: Props) {
) )
const liquidationPrice = useMemo( const liquidationPrice = useMemo(
() => computeLiquidationPrice(props.buyAsset.denom), () => computeLiquidationPrice(props.buyAsset.denom, 'asset'),
[computeLiquidationPrice, props.buyAsset.denom], [computeLiquidationPrice, props.buyAsset.denom],
) )

View File

@ -24,6 +24,7 @@ import {
BorrowTarget, BorrowTarget,
compute_health_js, compute_health_js,
liquidation_price_js, liquidation_price_js,
LiquidationPriceKind,
max_borrow_estimate_js, max_borrow_estimate_js,
max_swap_estimate_js, max_swap_estimate_js,
max_withdraw_estimate_js, max_withdraw_estimate_js,
@ -198,13 +199,13 @@ export default function useHealthComputer(account?: Account) {
) )
const computeLiquidationPrice = useCallback( const computeLiquidationPrice = useCallback(
(denom: string) => { (denom: string, kind: LiquidationPriceKind) => {
if (!healthComputer) return null if (!healthComputer) return null
try { try {
const asset = getAssetByDenom(denom) const asset = getAssetByDenom(denom)
if (!asset) return null if (!asset) return null
const decimalDiff = asset.decimals - PRICE_ORACLE_DECIMALS const decimalDiff = asset.decimals - PRICE_ORACLE_DECIMALS
return BN(liquidation_price_js(healthComputer, denom)) return BN(liquidation_price_js(healthComputer, denom, kind))
.shiftedBy(-VALUE_SCALE_FACTOR) .shiftedBy(-VALUE_SCALE_FACTOR)
.shiftedBy(decimalDiff) .shiftedBy(decimalDiff)
.toNumber() .toNumber()

View File

@ -0,0 +1,22 @@
import debounce from 'lodash.debounce'
import { useEffect, useMemo, useState } from 'react'
export default function useLiquidationPrice(liqPrice: number | null) {
const [liquidationPrice, setLiquidationPrice] = useState<number | null>(null)
const [isUpdatingLiquidationPrice, setIsUpdatingLiquidationPrice] = useState(false)
const debouncedSetLiqPrice = useMemo(
() => debounce(setLiquidationPrice, 1000, { leading: false }),
[],
)
useEffect(() => {
setIsUpdatingLiquidationPrice(true)
debouncedSetLiqPrice(liqPrice)
}, [debouncedSetLiqPrice, liqPrice])
useEffect(() => {
setIsUpdatingLiquidationPrice(false)
}, [liquidationPrice])
return { liquidationPrice, isUpdatingLiquidationPrice }
}

View File

@ -40,9 +40,14 @@ export function max_swap_estimate_js(
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @param {string} denom * @param {string} denom
* @param {LiquidationPriceKind} kind
* @returns {string} * @returns {string}
*/ */
export function liquidation_price_js(c: HealthComputer, denom: string): string export function liquidation_price_js(
c: HealthComputer,
denom: string,
kind: LiquidationPriceKind,
): string
export interface HealthComputer { export interface HealthComputer {
kind: AccountKind kind: AccountKind
positions: Positions positions: Positions
@ -61,6 +66,8 @@ export interface HealthValuesResponse {
above_max_ltv: boolean above_max_ltv: boolean
} }
export type LiquidationPriceKind = 'asset' | 'debt'
export type Slippage = Decimal export type Slippage = Decimal
export type SwapKind = 'default' | 'margin' export type SwapKind = 'default' | 'margin'
@ -88,7 +95,7 @@ export interface InitOutput {
g: number, g: number,
h: number, h: number,
) => void ) => void
readonly liquidation_price_js: (a: number, b: number, c: number, d: number) => void readonly liquidation_price_js: (a: number, b: number, c: number, d: number, e: number) => void
readonly allocate: (a: number) => number readonly allocate: (a: number) => number
readonly deallocate: (a: number) => void readonly deallocate: (a: number) => void
readonly requires_iterator: () => void readonly requires_iterator: () => void

View File

@ -1,389 +1,355 @@
let wasm let wasm;
const heap = new Array(128).fill(undefined) const heap = new Array(128).fill(undefined);
heap.push(undefined, null, true, false) heap.push(undefined, null, true, false);
function getObject(idx) { function getObject(idx) { return heap[idx]; }
return heap[idx]
}
let heap_next = heap.length let heap_next = heap.length;
function addHeapObject(obj) { function addHeapObject(obj) {
if (heap_next === heap.length) heap.push(heap.length + 1) if (heap_next === heap.length) heap.push(heap.length + 1);
const idx = heap_next const idx = heap_next;
heap_next = heap[idx] heap_next = heap[idx];
heap[idx] = obj heap[idx] = obj;
return idx return idx;
} }
function dropObject(idx) { function dropObject(idx) {
if (idx < 132) return if (idx < 132) return;
heap[idx] = heap_next heap[idx] = heap_next;
heap_next = idx heap_next = idx;
} }
function takeObject(idx) { function takeObject(idx) {
const ret = getObject(idx) const ret = getObject(idx);
dropObject(idx) dropObject(idx);
return ret return ret;
} }
let WASM_VECTOR_LEN = 0 let WASM_VECTOR_LEN = 0;
let cachedUint8Memory0 = null let cachedUint8Memory0 = null;
function getUint8Memory0() { function getUint8Memory0() {
if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) { if (cachedUint8Memory0 === null || cachedUint8Memory0.byteLength === 0) {
cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer) cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer);
} }
return cachedUint8Memory0 return cachedUint8Memory0;
} }
const cachedTextEncoder = const cachedTextEncoder = (typeof TextEncoder !== 'undefined' ? new TextEncoder('utf-8') : { encode: () => { throw Error('TextEncoder not available') } } );
typeof TextEncoder !== 'undefined'
? new TextEncoder('utf-8')
: {
encode: () => {
throw Error('TextEncoder not available')
},
}
const encodeString = const encodeString = (typeof cachedTextEncoder.encodeInto === 'function'
typeof cachedTextEncoder.encodeInto === 'function'
? function (arg, view) { ? function (arg, view) {
return cachedTextEncoder.encodeInto(arg, view) return cachedTextEncoder.encodeInto(arg, view);
} }
: function (arg, view) { : function (arg, view) {
const buf = cachedTextEncoder.encode(arg) const buf = cachedTextEncoder.encode(arg);
view.set(buf) view.set(buf);
return { return {
read: arg.length, read: arg.length,
written: buf.length, written: buf.length
} };
} });
function passStringToWasm0(arg, malloc, realloc) { function passStringToWasm0(arg, malloc, realloc) {
if (realloc === undefined) {
const buf = cachedTextEncoder.encode(arg)
const ptr = malloc(buf.length, 1) >>> 0
getUint8Memory0()
.subarray(ptr, ptr + buf.length)
.set(buf)
WASM_VECTOR_LEN = buf.length
return ptr
}
let len = arg.length if (realloc === undefined) {
let ptr = malloc(len, 1) >>> 0 const buf = cachedTextEncoder.encode(arg);
const ptr = malloc(buf.length, 1) >>> 0;
const mem = getUint8Memory0() getUint8Memory0().subarray(ptr, ptr + buf.length).set(buf);
WASM_VECTOR_LEN = buf.length;
let offset = 0 return ptr;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset)
if (code > 0x7f) break
mem[ptr + offset] = code
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset)
} }
ptr = realloc(ptr, len, (len = offset + arg.length * 3), 1) >>> 0
const view = getUint8Memory0().subarray(ptr + offset, ptr + len)
const ret = encodeString(arg, view)
offset += ret.written let len = arg.length;
} let ptr = malloc(len, 1) >>> 0;
WASM_VECTOR_LEN = offset const mem = getUint8Memory0();
return ptr
let offset = 0;
for (; offset < len; offset++) {
const code = arg.charCodeAt(offset);
if (code > 0x7F) break;
mem[ptr + offset] = code;
}
if (offset !== len) {
if (offset !== 0) {
arg = arg.slice(offset);
}
ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0;
const view = getUint8Memory0().subarray(ptr + offset, ptr + len);
const ret = encodeString(arg, view);
offset += ret.written;
}
WASM_VECTOR_LEN = offset;
return ptr;
} }
function isLikeNone(x) { function isLikeNone(x) {
return x === undefined || x === null return x === undefined || x === null;
} }
let cachedInt32Memory0 = null let cachedInt32Memory0 = null;
function getInt32Memory0() { function getInt32Memory0() {
if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) { if (cachedInt32Memory0 === null || cachedInt32Memory0.byteLength === 0) {
cachedInt32Memory0 = new Int32Array(wasm.memory.buffer) cachedInt32Memory0 = new Int32Array(wasm.memory.buffer);
} }
return cachedInt32Memory0 return cachedInt32Memory0;
} }
const cachedTextDecoder = const cachedTextDecoder = (typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }) : { decode: () => { throw Error('TextDecoder not available') } } );
typeof TextDecoder !== 'undefined'
? new TextDecoder('utf-8', { ignoreBOM: true, fatal: true })
: {
decode: () => {
throw Error('TextDecoder not available')
},
}
if (typeof TextDecoder !== 'undefined') { if (typeof TextDecoder !== 'undefined') { cachedTextDecoder.decode(); };
cachedTextDecoder.decode()
}
function getStringFromWasm0(ptr, len) { function getStringFromWasm0(ptr, len) {
ptr = ptr >>> 0 ptr = ptr >>> 0;
return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len)) return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr, ptr + len));
} }
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @returns {HealthValuesResponse} * @returns {HealthValuesResponse}
*/ */
export function compute_health_js(c) { export function compute_health_js(c) {
const ret = wasm.compute_health_js(addHeapObject(c)) const ret = wasm.compute_health_js(addHeapObject(c));
return takeObject(ret) return takeObject(ret);
} }
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @param {string} withdraw_denom * @param {string} withdraw_denom
* @returns {string} * @returns {string}
*/ */
export function max_withdraw_estimate_js(c, withdraw_denom) { export function max_withdraw_estimate_js(c, withdraw_denom) {
let deferred2_0 let deferred2_0;
let deferred2_1 let deferred2_1;
try { try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16) const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(withdraw_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const ptr0 = passStringToWasm0(withdraw_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN const len0 = WASM_VECTOR_LEN;
wasm.max_withdraw_estimate_js(retptr, addHeapObject(c), ptr0, len0) wasm.max_withdraw_estimate_js(retptr, addHeapObject(c), ptr0, len0);
var r0 = getInt32Memory0()[retptr / 4 + 0] var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1] var r1 = getInt32Memory0()[retptr / 4 + 1];
deferred2_0 = r0 deferred2_0 = r0;
deferred2_1 = r1 deferred2_1 = r1;
return getStringFromWasm0(r0, r1) return getStringFromWasm0(r0, r1);
} finally { } finally {
wasm.__wbindgen_add_to_stack_pointer(16) wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1) wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
} }
} }
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @param {string} borrow_denom * @param {string} borrow_denom
* @param {BorrowTarget} target * @param {BorrowTarget} target
* @returns {string} * @returns {string}
*/ */
export function max_borrow_estimate_js(c, borrow_denom, target) { export function max_borrow_estimate_js(c, borrow_denom, target) {
let deferred2_0 let deferred2_0;
let deferred2_1 let deferred2_1;
try { try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16) const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(borrow_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const ptr0 = passStringToWasm0(borrow_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN const len0 = WASM_VECTOR_LEN;
wasm.max_borrow_estimate_js(retptr, addHeapObject(c), ptr0, len0, addHeapObject(target)) wasm.max_borrow_estimate_js(retptr, addHeapObject(c), ptr0, len0, addHeapObject(target));
var r0 = getInt32Memory0()[retptr / 4 + 0] var r0 = getInt32Memory0()[retptr / 4 + 0];
var r1 = getInt32Memory0()[retptr / 4 + 1] var r1 = getInt32Memory0()[retptr / 4 + 1];
deferred2_0 = r0 deferred2_0 = r0;
deferred2_1 = r1 deferred2_1 = r1;
return getStringFromWasm0(r0, r1) return getStringFromWasm0(r0, r1);
} finally { } finally {
wasm.__wbindgen_add_to_stack_pointer(16) wasm.__wbindgen_add_to_stack_pointer(16);
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1) wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
} }
} }
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @param {string} from_denom * @param {string} from_denom
* @param {string} to_denom * @param {string} to_denom
* @param {SwapKind} kind * @param {SwapKind} kind
* @param {Slippage} slippage * @param {Slippage} slippage
* @returns {string} * @returns {string}
*/ */
export function max_swap_estimate_js(c, from_denom, to_denom, kind, slippage) { export function max_swap_estimate_js(c, from_denom, to_denom, kind, slippage) {
let deferred3_0 let deferred3_0;
let deferred3_1 let deferred3_1;
try { try {
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16) const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const ptr0 = passStringToWasm0(from_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const ptr0 = passStringToWasm0(from_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len0 = WASM_VECTOR_LEN const len0 = WASM_VECTOR_LEN;
const ptr1 = passStringToWasm0(to_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const ptr1 = passStringToWasm0(to_denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
const len1 = WASM_VECTOR_LEN const len1 = WASM_VECTOR_LEN;
wasm.max_swap_estimate_js( wasm.max_swap_estimate_js(retptr, addHeapObject(c), ptr0, len0, ptr1, len1, addHeapObject(kind), addHeapObject(slippage));
retptr, var r0 = getInt32Memory0()[retptr / 4 + 0];
addHeapObject(c), var r1 = getInt32Memory0()[retptr / 4 + 1];
ptr0, deferred3_0 = r0;
len0, deferred3_1 = r1;
ptr1, return getStringFromWasm0(r0, r1);
len1, } finally {
addHeapObject(kind), wasm.__wbindgen_add_to_stack_pointer(16);
addHeapObject(slippage), wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
) }
var r0 = getInt32Memory0()[retptr / 4 + 0]
var r1 = getInt32Memory0()[retptr / 4 + 1]
deferred3_0 = r0
deferred3_1 = r1
return getStringFromWasm0(r0, r1)
} finally {
wasm.__wbindgen_add_to_stack_pointer(16)
wasm.__wbindgen_free(deferred3_0, deferred3_1, 1)
}
} }
/** /**
* @param {HealthComputer} c * @param {HealthComputer} c
* @param {string} denom * @param {string} denom
* @returns {string} * @param {LiquidationPriceKind} kind
*/ * @returns {string}
export function liquidation_price_js(c, denom) { */
let deferred2_0 export function liquidation_price_js(c, denom, kind) {
let deferred2_1 let deferred2_0;
try { let deferred2_1;
const retptr = wasm.__wbindgen_add_to_stack_pointer(-16) try {
const ptr0 = passStringToWasm0(denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
const len0 = WASM_VECTOR_LEN const ptr0 = passStringToWasm0(denom, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
wasm.liquidation_price_js(retptr, addHeapObject(c), ptr0, len0) const len0 = WASM_VECTOR_LEN;
var r0 = getInt32Memory0()[retptr / 4 + 0] wasm.liquidation_price_js(retptr, addHeapObject(c), ptr0, len0, addHeapObject(kind));
var r1 = getInt32Memory0()[retptr / 4 + 1] var r0 = getInt32Memory0()[retptr / 4 + 0];
deferred2_0 = r0 var r1 = getInt32Memory0()[retptr / 4 + 1];
deferred2_1 = r1 deferred2_0 = r0;
return getStringFromWasm0(r0, r1) deferred2_1 = r1;
} finally { return getStringFromWasm0(r0, r1);
wasm.__wbindgen_add_to_stack_pointer(16) } finally {
wasm.__wbindgen_free(deferred2_0, deferred2_1, 1) wasm.__wbindgen_add_to_stack_pointer(16);
} wasm.__wbindgen_free(deferred2_0, deferred2_1, 1);
}
} }
function handleError(f, args) { function handleError(f, args) {
try { try {
return f.apply(this, args) return f.apply(this, args);
} catch (e) { } catch (e) {
wasm.__wbindgen_exn_store(addHeapObject(e)) wasm.__wbindgen_exn_store(addHeapObject(e));
} }
} }
async function __wbg_load(module, imports) { async function __wbg_load(module, imports) {
if (typeof Response === 'function' && module instanceof Response) { if (typeof Response === 'function' && module instanceof Response) {
if (typeof WebAssembly.instantiateStreaming === 'function') { if (typeof WebAssembly.instantiateStreaming === 'function') {
try { try {
return await WebAssembly.instantiateStreaming(module, imports) return await WebAssembly.instantiateStreaming(module, imports);
} catch (e) {
if (module.headers.get('Content-Type') != 'application/wasm') { } catch (e) {
console.warn( if (module.headers.get('Content-Type') != 'application/wasm') {
'`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n', console.warn("`WebAssembly.instantiateStreaming` failed because your server does not serve wasm with `application/wasm` MIME type. Falling back to `WebAssembly.instantiate` which is slower. Original error:\n", e);
e,
) } else {
} else { throw e;
throw e }
}
} }
}
}
const bytes = await module.arrayBuffer() const bytes = await module.arrayBuffer();
return await WebAssembly.instantiate(bytes, imports) return await WebAssembly.instantiate(bytes, imports);
} else {
const instance = await WebAssembly.instantiate(module, imports)
if (instance instanceof WebAssembly.Instance) {
return { instance, module }
} else { } else {
return instance const instance = await WebAssembly.instantiate(module, imports);
if (instance instanceof WebAssembly.Instance) {
return { instance, module };
} else {
return instance;
}
} }
}
} }
function __wbg_get_imports() { function __wbg_get_imports() {
const imports = {} const imports = {};
imports.wbg = {} imports.wbg = {};
imports.wbg.__wbindgen_object_clone_ref = function (arg0) { imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
const ret = getObject(arg0) const ret = getObject(arg0);
return addHeapObject(ret) return addHeapObject(ret);
} };
imports.wbg.__wbindgen_is_undefined = function (arg0) { imports.wbg.__wbindgen_is_undefined = function(arg0) {
const ret = getObject(arg0) === undefined const ret = getObject(arg0) === undefined;
return ret return ret;
} };
imports.wbg.__wbindgen_object_drop_ref = function (arg0) { imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0) takeObject(arg0);
} };
imports.wbg.__wbindgen_string_get = function (arg0, arg1) { imports.wbg.__wbindgen_string_get = function(arg0, arg1) {
const obj = getObject(arg1) const obj = getObject(arg1);
const ret = typeof obj === 'string' ? obj : undefined const ret = typeof(obj) === 'string' ? obj : undefined;
var ptr1 = isLikeNone(ret) var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
? 0 var len1 = WASM_VECTOR_LEN;
: passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc) getInt32Memory0()[arg0 / 4 + 1] = len1;
var len1 = WASM_VECTOR_LEN getInt32Memory0()[arg0 / 4 + 0] = ptr1;
getInt32Memory0()[arg0 / 4 + 1] = len1 };
getInt32Memory0()[arg0 / 4 + 0] = ptr1 imports.wbg.__wbg_parse_670c19d4e984792e = function() { return handleError(function (arg0, arg1) {
} const ret = JSON.parse(getStringFromWasm0(arg0, arg1));
imports.wbg.__wbg_parse_670c19d4e984792e = function () { return addHeapObject(ret);
return handleError(function (arg0, arg1) { }, arguments) };
const ret = JSON.parse(getStringFromWasm0(arg0, arg1)) imports.wbg.__wbg_stringify_e25465938f3f611f = function() { return handleError(function (arg0) {
return addHeapObject(ret) const ret = JSON.stringify(getObject(arg0));
}, arguments) return addHeapObject(ret);
} }, arguments) };
imports.wbg.__wbg_stringify_e25465938f3f611f = function () { imports.wbg.__wbindgen_throw = function(arg0, arg1) {
return handleError(function (arg0) { throw new Error(getStringFromWasm0(arg0, arg1));
const ret = JSON.stringify(getObject(arg0)) };
return addHeapObject(ret)
}, arguments)
}
imports.wbg.__wbindgen_throw = function (arg0, arg1) {
throw new Error(getStringFromWasm0(arg0, arg1))
}
return imports return imports;
} }
function __wbg_init_memory(imports, maybe_memory) {} function __wbg_init_memory(imports, maybe_memory) {
}
function __wbg_finalize_init(instance, module) { function __wbg_finalize_init(instance, module) {
wasm = instance.exports wasm = instance.exports;
__wbg_init.__wbindgen_wasm_module = module __wbg_init.__wbindgen_wasm_module = module;
cachedInt32Memory0 = null cachedInt32Memory0 = null;
cachedUint8Memory0 = null cachedUint8Memory0 = null;
return wasm
return wasm;
} }
function initSync(module) { function initSync(module) {
if (wasm !== undefined) return wasm if (wasm !== undefined) return wasm;
const imports = __wbg_get_imports() const imports = __wbg_get_imports();
__wbg_init_memory(imports) __wbg_init_memory(imports);
if (!(module instanceof WebAssembly.Module)) { if (!(module instanceof WebAssembly.Module)) {
module = new WebAssembly.Module(module) module = new WebAssembly.Module(module);
} }
const instance = new WebAssembly.Instance(module, imports) const instance = new WebAssembly.Instance(module, imports);
return __wbg_finalize_init(instance, module) return __wbg_finalize_init(instance, module);
} }
async function __wbg_init(input) { async function __wbg_init(input) {
if (wasm !== undefined) return wasm if (wasm !== undefined) return wasm;
if (typeof input === 'undefined') { if (typeof input === 'undefined') {
input = new URL('index_bg.wasm', import.meta.url) input = new URL('index_bg.wasm', import.meta.url);
} }
const imports = __wbg_get_imports() const imports = __wbg_get_imports();
if ( if (typeof input === 'string' || (typeof Request === 'function' && input instanceof Request) || (typeof URL === 'function' && input instanceof URL)) {
typeof input === 'string' || input = fetch(input);
(typeof Request === 'function' && input instanceof Request) || }
(typeof URL === 'function' && input instanceof URL)
) {
input = fetch(input)
}
__wbg_init_memory(imports) __wbg_init_memory(imports);
const { instance, module } = await __wbg_load(await input, imports) const { instance, module } = await __wbg_load(await input, imports);
return __wbg_finalize_init(instance, module) return __wbg_finalize_init(instance, module);
} }
export { initSync } export { initSync }
export default __wbg_init export default __wbg_init;

View File

@ -14,7 +14,7 @@ export function max_swap_estimate_js(
g: number, g: number,
h: number, h: number,
): void ): void
export function liquidation_price_js(a: number, b: number, c: number, d: number): void export function liquidation_price_js(a: number, b: number, c: number, d: number, e: number): void
export function allocate(a: number): number export function allocate(a: number): number
export function deallocate(a: number): void export function deallocate(a: number): void
export function requires_iterator(): void export function requires_iterator(): void

View File

@ -1,4 +1,4 @@
import { formatAmountWithSymbol } from './formatters' import { formatAmountWithSymbol } from 'utils/formatters'
export function getNoBalanceMessage(symbol: string) { export function getNoBalanceMessage(symbol: string) {
return `You don't have an ${symbol} balance in your account.` return `You don't have an ${symbol} balance in your account.`