{"version":3,"sources":["data/utils.js","fetchers/burrowTvl.js","App.js","index.js","data/near.js"],"names":["OneNear","Big","pow","div","isArray","a","Array","keysToCamel","o","Object","isObject","n","keys","forEach","k","s","replace","$1","toUpperCase","map","i","DP","BurrowContractId","OracleContractId","computeValueForBlochHeight","viewCall","assets","assetIds","assetId","asset_ids","prices","priceMul","reduce","acc","price","multiplier","decimals","totalReserves","sum","asset","value","reserved","config","extraDecimals","add","mul","totalDeposit","supplied","balance","totalBorrowed","borrowed","Deposited","toFixed","Borrowed","Reserves","sub","startBlockTime","Date","YAxis","LineOptions","animation","responsive","scales","xAxis","type","time","minUnit","ticks","major","enabled","yAxis","beginAtZero","plugins","colorschemes","scheme","fetchNextAvailableBlock","near","blockHeight","limit","tryingBlockHeight","fetchArchivalBlock","block","blockTime","parseFloat","header","timestamp_nanosec","fetchDataPoint","height","args","archivalViewCall","findStartBlock","currentBlock","blockTimeRight","blockHeightRight","Math","max","ceil","leftBlock","blockHeightLeft","blockTimeLeft","round","blockTimestamp","blockProximity","abs","console","log","setProgress","setData","fetchBlockHeight","currentBlockHeight","getTime","startBlock","startBlockHeight","blockHeights","allBlockHeights","data","PromisePool","withConcurrency","for","process","results","errors","length","sort","b","newBlockHeights","push","computeLineData","val","p","palette","hex","datasets","key","index","x","y","label","backgroundColor","App","useState","progress","setYAxis","lineOptions","setLineOptions","useNear","useEffect","fetchData","then","JSON","parse","stringify","min","yAxisOnChange","useCallback","e","target","className","name","id","checked","onChange","htmlFor","options","ReactDOM","render","StrictMode","document","getElementById","NearConfig","networkId","nodeUrl","archivalNodeUrl","walletUrl","storageCostPerByte","wrapNearAccountId","refContractAccountId","keyStore","nearAPI","BrowserLocalStorageKeyStore","reKey","assign","deps","nearConnection","_near","nearArchivalConnection","fromConfig","provider","url","signer","walletConnection","contractName","accountId","getAccountId","account","contract","viewMethods","changeMethods","fetchBlockHash","connection","finality","serialize","base_decode","hash","fetchNextNonce","getAccessKeys","accessKeys","nonce","accessKey","access_key","blockId","contractId","methodName","query","request_type","account_id","method_name","args_base64","Buffer","from","toString","block_id","result","defaultNearPromise","Promise","resolve","_initNear","useNearPromise","singletonHook","setNear"],"mappings":"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","file":"static/js/main.acb9885e.chunk.js","sourcesContent":["import Big from \"big.js\";\nimport { NearConfig } from \"./near\";\nimport React from \"react\";\n\nconst MinAccountIdLen = 2;\nconst MaxAccountIdLen = 64;\nconst ValidAccountRe = /^(([a-z\\d]+[-_])*[a-z\\d]+\\.)*([a-z\\d]+[-_])*[a-z\\d]+$/;\nexport const OneNear = Big(10).pow(24);\nexport const OneEth = Big(10).pow(18);\nconst AccountSafetyMargin = OneNear.div(2);\n\nexport const Loading = (\n \n);\n\nexport function isValidAccountId(accountId) {\n return (\n accountId &&\n accountId.length >= MinAccountIdLen &&\n accountId.length <= MaxAccountIdLen &&\n accountId.match(ValidAccountRe)\n );\n}\n\nconst toCamel = (s) => {\n return s.replace(/([-_][a-z])/gi, ($1) => {\n return $1.toUpperCase().replace(\"-\", \"\").replace(\"_\", \"\");\n });\n};\n\nconst isArray = function (a) {\n return Array.isArray(a);\n};\n\nexport const isObject = function (o) {\n return o === Object(o) && !isArray(o) && typeof o !== \"function\";\n};\n\nexport const keysToCamel = function (o) {\n if (isObject(o)) {\n const n = {};\n\n Object.keys(o).forEach((k) => {\n n[toCamel(k)] = keysToCamel(o[k]);\n });\n\n return n;\n } else if (isArray(o)) {\n return o.map((i) => {\n return keysToCamel(i);\n });\n }\n\n return o;\n};\n\nexport const bigMin = (a, b) => {\n if (a && b) {\n return a.lt(b) ? a : b;\n }\n return a || b;\n};\n\nexport const bigToString = (b, p, len) => {\n if (b === null) {\n return \"???\";\n }\n let s = b.toFixed();\n let pos = s.indexOf(\".\");\n p = p || 6;\n len = len || 7;\n if (pos > 0) {\n let ap = Math.min(p, Math.max(len - pos, 0));\n if (ap > 0) {\n ap += 1;\n }\n if (pos + ap < s.length) {\n s = s.substring(0, pos + ap);\n }\n } else {\n pos = s.length;\n }\n for (let i = pos - 4; i >= 0; i -= 3) {\n s = s.slice(0, i + 1) + \",\" + s.slice(i + 1);\n }\n\n if (s === \"0.000000\" && p === 6 && len === 7) {\n return \"<0.000001\";\n }\n\n return s;\n};\n\nexport const displayNear = (balance) =>\n balance ? (\n <>\n {bigToString(balance.div(OneNear))}{\" \"}\n NEAR\n \n ) : (\n \"???\"\n );\n\nexport const dateToString = (d) => {\n return d.toLocaleString(\"en-us\", {\n day: \"numeric\",\n month: \"short\",\n year: \"numeric\",\n });\n};\n\nexport const displayTime = (d) => {\n return d.toLocaleString();\n};\n\nexport const availableNearBalance = (account) => {\n if (account && !account.loading && account.state) {\n let balance = Big(account.state.amount).sub(\n Big(account.state.storage_usage).mul(Big(NearConfig.storageCostPerByte))\n );\n if (balance.gt(AccountSafetyMargin)) {\n return balance.sub(AccountSafetyMargin);\n }\n }\n return Big(0);\n};\n\nexport const isoDate = (d) =>\n d ? new Date(d).toISOString().substring(0, 10) : \"\";\n\nexport function accountTrim(accountId) {\n return accountId && accountId.length > 14 + 14 + 1\n ? accountId.slice(0, 14) + \"…\" + accountId.slice(-14)\n : accountId;\n}\n\nexport const computeUsdBalance = (refFinance, tokenAccountId, balance) => {\n if (refFinance && !refFinance.loading && balance) {\n if (tokenAccountId === NearConfig.wrapNearAccountId) {\n return balance.div(OneNear).mul(refFinance.nearPrice);\n } else if (\n tokenAccountId in refFinance.prices &&\n refFinance.nearPrice.gt(0)\n ) {\n const p = refFinance.prices[tokenAccountId];\n const balanceIn = p.totalOther;\n const balanceOut = p.totalNear;\n let amountWithFee = Big(balance.div(1000));\n const amountOut = amountWithFee\n .mul(balanceOut)\n .div(balanceIn.add(amountWithFee))\n .round(0, 0);\n\n return amountOut.mul(1000).div(OneNear).mul(refFinance.nearPrice);\n }\n }\n return null;\n};\n\nexport const fromTokenBalance = (token, balance, adjustForBurrow) => {\n return !token || token.invalidAccount || token.notFound || !balance\n ? balance\n : balance.div(Big(10).pow(token.metadata.decimals));\n};\n\nexport const toTokenBalance = (token, balance) => {\n return !token || token.invalidAccount || token.notFound || !balance\n ? balance\n : balance.mul(Big(10).pow(token.metadata.decimals));\n};\n\nexport const fromBurrowBalance = (token, balance) => {\n return !token || token.invalidAccount || token.notFound || !balance\n ? balance\n : balance.div(Big(10).pow(Math.max(0, 18 - token.metadata.decimals)));\n};\n","import { keysToCamel } from \"../data/utils\";\nimport Big from \"big.js\";\n\nBig.DP = 40;\n\nconst BurrowContractId = \"contract.main.burrow.near\";\nconst OracleContractId = \"priceoracle.near\";\n\nexport async function computeValueForBlochHeight(viewCall) {\n const assets = keysToCamel(\n await viewCall(BurrowContractId, \"get_assets_paged\")\n );\n const assetIds = assets.map(([assetId, asset]) => assetId);\n const prices = keysToCamel(\n await viewCall(OracleContractId, \"get_price_data\", {\n asset_ids: assetIds,\n })\n );\n const priceMul = prices.prices.reduce((acc, { assetId, price }) => {\n if (price) {\n acc[assetId] = Big(price.multiplier).div(Big(10).pow(price.decimals));\n } else {\n acc[assetId] = Big(0);\n }\n return acc;\n }, {});\n\n const totalReserves = assets.reduce((sum, [assetId, asset]) => {\n const value = Big(asset.reserved).div(\n Big(10).pow(asset.config.extraDecimals)\n );\n return priceMul[assetId] ? sum?.add(value.mul(priceMul[assetId])) : null;\n }, Big(0));\n\n const totalDeposit = assets.reduce((sum, [assetId, asset]) => {\n const value = Big(asset.supplied.balance)\n .add(Big(asset.reserved))\n .div(Big(10).pow(asset.config.extraDecimals));\n return priceMul[assetId] ? sum?.add(value.mul(priceMul[assetId])) : null;\n }, Big(0));\n\n const totalBorrowed = assets.reduce((sum, [assetId, asset]) => {\n const value = Big(asset.borrowed.balance).div(\n Big(10).pow(asset.config.extraDecimals)\n );\n return priceMul[assetId] ? sum?.add(value.mul(priceMul[assetId])) : null;\n }, Big(0));\n\n return {\n Deposited: totalDeposit?.toFixed(2),\n Borrowed: totalBorrowed?.toFixed(2),\n Reserves: totalReserves?.toFixed(2),\n \"Non-borrowed TVL\": totalDeposit?.sub(totalBorrowed)?.toFixed(2),\n };\n}\n","import \"./App.scss\";\nimport \"error-polyfill\";\nimport \"bootstrap/dist/js/bootstrap.bundle\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport \"chartjs-adapter-moment\";\nimport { Line } from \"react-chartjs-2\";\nimport { useNear } from \"./data/near\";\nimport { PromisePool } from \"@supercharge/promise-pool\";\nimport \"chart.js/auto\";\nimport { computeValueForBlochHeight } from \"./fetchers/burrowTvl\";\nimport palette from \"google-palette\";\n\nconst NumSplits = 8;\nconst CloseEnoughTimeDiff = 60 * 1000;\n\nconst startBlockTime = new Date(\"2022-03-28\");\nconst OptimisticMsPerBlock = 900;\n\nconst YAxis = {\n Default: \"Default\",\n BeginAtZero: \"BeginAtZero\",\n LogScale: \"LogScale\",\n};\n\nconst LineOptions = {\n animation: false,\n responsive: true,\n scales: {\n xAxis: {\n type: \"time\",\n time: {\n minUnit: \"hour\",\n },\n ticks: {\n major: {\n enabled: true,\n },\n },\n },\n yAxis: {\n ticks: {\n beginAtZero: true,\n },\n },\n },\n plugins: {\n colorschemes: {\n scheme: \"brewer.Paired12\",\n },\n },\n};\n\nasync function fetchNextAvailableBlock(near, blockHeight) {\n const limit = blockHeight + 5;\n for (\n let tryingBlockHeight = blockHeight;\n tryingBlockHeight < limit;\n tryingBlockHeight++\n ) {\n try {\n const block = await near.fetchArchivalBlock(tryingBlockHeight);\n if (block) {\n return block;\n }\n } catch (e) {\n // Probably block doesn't exist\n }\n }\n return null;\n}\n\nconst blockTime = (block) => parseFloat(block.header.timestamp_nanosec) / 1e6;\n\nasync function fetchDataPoint(near, blockHeight) {\n const block = await fetchNextAvailableBlock(near, blockHeight);\n const time = blockTime(block);\n blockHeight = block.header.height;\n return {\n time,\n blockHeight,\n value: await computeValueForBlochHeight((...args) =>\n near.archivalViewCall(blockHeight, ...args)\n ),\n };\n}\n\nasync function findStartBlock(near, startBlockTime, currentBlock) {\n let blockTimeRight = blockTime(currentBlock);\n let blockHeightRight = currentBlock.header.height;\n const leftBlock = await fetchNextAvailableBlock(\n near,\n Math.max(\n blockHeightRight - 10000000,\n blockHeightRight -\n Math.ceil((blockTimeRight - startBlockTime) / OptimisticMsPerBlock)\n )\n );\n let blockHeightLeft = leftBlock.header.height;\n let blockTimeLeft = blockTime(leftBlock);\n for (let i = 0; i < 5; ++i) {\n const blockHeight =\n blockHeightLeft +\n Math.round(\n ((blockHeightRight - blockHeightLeft) /\n (blockTimeRight - blockTimeLeft)) *\n (startBlockTime - blockTimeLeft)\n );\n const block = await fetchNextAvailableBlock(near, blockHeight);\n const blockTimestamp = blockTime(block);\n const blockProximity = Math.abs(startBlockTime - blockTimestamp);\n console.log(\n `Iter #${i}: Block time proximity ${(blockProximity / 1e3).toFixed(\n 2\n )} sec`\n );\n if (blockProximity < CloseEnoughTimeDiff) {\n return block;\n }\n if (blockTimestamp > startBlockTime) {\n blockHeightRight = blockHeight;\n blockTimeRight = blockTimestamp;\n } else {\n blockHeightLeft = blockHeight;\n blockTimeLeft = blockTimestamp;\n }\n }\n return await fetchNextAvailableBlock(near, blockHeightLeft);\n}\n\nasync function fetchData(near, setProgress, setData) {\n setProgress(\"fetching current block\");\n const currentBlockHeight = await near.fetchBlockHeight();\n console.log(\"Current blockHeight\", currentBlockHeight);\n const currentBlock = await near.fetchArchivalBlock(currentBlockHeight);\n setProgress(\"searching for the starting block\");\n const startBlock = await findStartBlock(\n near,\n startBlockTime.getTime(),\n currentBlock\n );\n const startBlockHeight = startBlock.header.height;\n console.log(\"Start blockHeight\", startBlockHeight);\n // const startTime = blockTime(startBlock);\n setProgress(\"fetching initial data\");\n\n let blockHeights = [startBlockHeight, currentBlockHeight];\n let allBlockHeights = [startBlockHeight, currentBlockHeight];\n let data = [];\n for (let i = 0; i < NumSplits; ++i) {\n const { results, errors } = await PromisePool.withConcurrency(8)\n .for(blockHeights)\n .process(async (blockHeight) => fetchDataPoint(near, blockHeight));\n\n if (errors.length > 0) {\n console.log(\"Errors\", errors);\n }\n\n data = [...data, ...results].sort((a, b) => a.blockHeight - b.blockHeight);\n setData(data);\n setProgress(`increasing precision, iteration ${i + 1} / ${NumSplits}`);\n\n // Splitting\n const newBlockHeights = [];\n for (let i = 0; i < allBlockHeights.length - 1; ++i) {\n newBlockHeights.push((allBlockHeights[i] + allBlockHeights[i + 1]) >> 1);\n }\n allBlockHeights = [...allBlockHeights, ...newBlockHeights].sort();\n blockHeights = newBlockHeights;\n }\n}\n\nconst computeLineData = (data) => {\n const val = data[0].value;\n const keys = Object.keys(val);\n const p = palette(\"tol\", keys.length).map((hex) => \"#\" + hex);\n const datasets = keys.map((key, index) => {\n const d = data.map(({ time, value }) => {\n return {\n x: new Date(time),\n y: value[key],\n };\n });\n return {\n data: d,\n label: key,\n backgroundColor: p[index],\n };\n });\n return {\n datasets,\n };\n};\n\nfunction App() {\n const [data, setData] = useState(null);\n const [progress, setProgress] = useState(null);\n const [yAxis, setYAxis] = useState(YAxis.Default);\n const [lineOptions, setLineOptions] = useState(LineOptions);\n\n const near = useNear();\n useEffect(() => {\n if (!near) {\n return;\n }\n\n fetchData(near, setProgress, setData).then(() => setProgress(null));\n }, [near]);\n\n useEffect(() => {\n const lineOptions = JSON.parse(JSON.stringify(LineOptions));\n if (yAxis === YAxis.BeginAtZero) {\n lineOptions.scales.yAxis.min = 0;\n } else if (yAxis === YAxis.LogScale) {\n lineOptions.scales.yAxis.type = \"logarithmic\";\n }\n setLineOptions(lineOptions);\n }, [yAxis]);\n\n const yAxisOnChange = useCallback((e) => {\n setYAxis(e.target.value);\n }, []);\n\n return (\n
\n

Burrow TVL

\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n {data && (\n
\n \n
\n )}\n {progress &&

Progress: {progress}

}\n {data && (\n
\n

Raw data

\n
\n
{JSON.stringify(data, null, 2)}
\n
\n
\n )}\n
\n
\n
\n );\n}\n\nexport default App;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport \"./index.css\";\nimport App from \"./App\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\n// reportWebVitals();\n","import * as nearAPI from \"near-api-js\";\nimport { singletonHook } from \"react-singleton-hook\";\nimport Big from \"big.js\";\nimport { useEffect, useState } from \"react\";\n\nexport const TGas = Big(10).pow(12);\nexport const StorageCostPerByte = Big(10).pow(19);\n// const isLocalhost = window.location.hostname === \"localhost\";\n\nexport const IsMainnet = true;\nexport const MainNearConfig = {\n networkId: \"mainnet\",\n nodeUrl: \"https://rpc.mainnet.near.org\",\n archivalNodeUrl: \"https://rpc.mainnet.internal.near.org\",\n walletUrl: \"https://wallet.near.org\",\n storageCostPerByte: StorageCostPerByte,\n wrapNearAccountId: \"wrap.near\",\n refContractAccountId: \"v2.ref-finance.near\",\n};\n\nexport const NearConfig = MainNearConfig;\nexport const LsKey = \":burrow-live-feed:\";\n\nasync function _initNear() {\n const keyStore = new nearAPI.keyStores.BrowserLocalStorageKeyStore();\n keyStore.reKey = () => {};\n const nearConnection = await nearAPI.connect(\n Object.assign({ deps: { keyStore } }, NearConfig)\n );\n const _near = {};\n\n _near.nearArchivalConnection = nearAPI.Connection.fromConfig({\n networkId: NearConfig.networkId,\n provider: {\n type: \"JsonRpcProvider\",\n args: { url: NearConfig.archivalNodeUrl },\n },\n signer: { type: \"InMemorySigner\", keyStore },\n });\n\n _near.keyStore = keyStore;\n _near.nearConnection = nearConnection;\n\n _near.walletConnection = new nearAPI.WalletConnection(\n nearConnection,\n NearConfig.contractName\n );\n _near.accountId = _near.walletConnection.getAccountId();\n _near.account = _near.walletConnection.account();\n\n _near.contract = new nearAPI.Contract(\n _near.account,\n NearConfig.contractName,\n {\n viewMethods: [],\n changeMethods: [],\n }\n );\n\n _near.fetchArchivalBlock = async (blockHeight) => {\n return _near.nearArchivalConnection.provider.block(blockHeight);\n };\n\n _near.fetchBlockHash = async () => {\n const block = await nearConnection.connection.provider.block({\n finality: \"final\",\n });\n return nearAPI.utils.serialize.base_decode(block.header.hash);\n };\n\n _near.fetchBlockHeight = async () => {\n const block = await nearConnection.connection.provider.block({\n finality: \"final\",\n });\n return block.header.height;\n };\n\n _near.fetchNextNonce = async () => {\n const accessKeys = await _near.account.getAccessKeys();\n return accessKeys.reduce(\n (nonce, accessKey) => Math.max(nonce, accessKey.access_key.nonce + 1),\n 1\n );\n };\n\n _near.archivalViewCall = async (blockId, contractId, methodName, args) => {\n args = args || {};\n const result = await _near.nearArchivalConnection.provider.query({\n request_type: \"call_function\",\n account_id: contractId,\n method_name: methodName,\n args_base64: Buffer.from(JSON.stringify(args)).toString(\"base64\"),\n block_id: blockId,\n });\n\n return (\n result.result &&\n result.result.length > 0 &&\n JSON.parse(Buffer.from(result.result).toString())\n );\n };\n\n _near.viewCall = async (contractId, methodName, args) => {\n args = args || {};\n const result = await nearConnection.connection.provider.query({\n request_type: \"call_function\",\n account_id: contractId,\n method_name: methodName,\n args_base64: Buffer.from(JSON.stringify(args)).toString(\"base64\"),\n finality: \"optimistic\",\n });\n\n return (\n result.result &&\n result.result.length > 0 &&\n JSON.parse(Buffer.from(result.result).toString())\n );\n };\n\n return _near;\n}\n\nconst defaultNearPromise = Promise.resolve(_initNear());\nexport const useNearPromise = singletonHook(defaultNearPromise, () => {\n return defaultNearPromise;\n});\n\nconst defaultNear = null;\nexport const useNear = singletonHook(defaultNear, () => {\n const [near, setNear] = useState(defaultNear);\n const _near = useNearPromise();\n\n useEffect(() => {\n _near.then(setNear);\n }, [_near]);\n\n return near;\n});\n"],"sourceRoot":""}