const accountId = props.accountId ?? context.accountId; if (!accountId) { return "Account data is missing"; } const accountIds = accountId.includes(",") ? accountId.split(",") : [accountId]; const onLoad = (data, accountId) => { if (data?.account?.collateral && data?.account?.borrowed) { let supplied = Big(0); let totalBorrowed = Big(0); let collateralValue = Big(0); let totalBorrowedValue = Big(0); (data?.account?.collateral ?? []).map((collateral) => { const assetData = data.assets.filter( (asset) => asset.token_id == collateral.token_id ); const assetValue = Big(collateral.balance) .mul(assetData[0].price.multiplier) .div(Big(10).pow(assetData[0].price.decimals)) .div(Big(10).pow(assetData[0].config.extra_decimals)); supplied = assetValue.add(supplied); collateralValue = assetValue .mul(Big(assetData[0].config.volatility_ratio).div(Big(10000))) .add(collateralValue); }); (data?.account?.borrowed ?? []).map((borrowed) => { const assetData = data.assets.filter( (asset) => asset.token_id == borrowed.token_id ); const assetValue = Big(borrowed.balance) .mul(assetData[0].price.multiplier) .div(Big(10).pow(assetData[0].price.decimals)) .div(Big(10).pow(assetData[0].config.extra_decimals)); totalBorrowed = assetValue.add(totalBorrowed); totalBorrowedValue = assetValue .mul(Big(10000).div(Big(assetData[0].config.volatility_ratio))) .add(totalBorrowedValue); }); const healthFactor = collateralValue.div(totalBorrowedValue).mul(100); data.supplied = supplied.toFixed(); data.borrowed = totalBorrowedValue.toFixed(); data.totalBorrowedValue = totalBorrowedValue.toFixed(); data.collateralValue = collateralValue.toFixed(); data.healthFactor = healthFactor.toFixed(2); State.update({ data: { ...state.data, [accountId]: data }, }); } }; const hasData = Object.keys(state.data ?? {}).length == accountIds.length; const dataWidgets = (accountIds ?? []).map((accountId) => ( <Widget src="zavodil.near/widget/burrow-data" props={{ accountId, onLoad }} /> )); const resultsWidgets = (accountIds ?? []).map((accountId) => ( <div> {accountId}: {state["data"][accountId]["healthFactor"]}% </div> )); return ( <div class="container"> {!hasData && dataWidgets} {hasData && ( <div> <h5>Burrow Health Factor</h5> {resultsWidgets} </div> )} </div> );