Soy bastante nuevo en JavaScript y Uniswap. Estoy usando Uniswap V3 para obtener el precio del grupo DAI/USDC. Mi función "principal" se ve de la siguiente manera:
async function main() { const [immutables, state] = await Promise.all([ getPoolImmutables(), getPoolState(), ]); const DAI = new Token(1, immutables.token0, 18, "DAI", "Stablecoin"); const USDC = new Token(1, immutables.token1, 6, "USDC", "USD Coin"); const DAI_USDC_POOL = new Pool( DAI, USDC, immutables.fee, state.sqrtPriceX96.toString(), state.liquidity.toString(), state.tick ); const token0Price = DAI_USDC_POOL.token0Price; console.log("The price is: ", token0Price); }Y obtengo el siguiente resultado:
The price is: Price { numerator: JSBI(6) [ 435696740, 805184612, 508287463, 671994784, 427409972, 4, sign: false ], denominator: JSBI(7) [ 0, 0, 0, 0, 0, 0, 4096, sign: false ], baseCurrency: Token { chainId: 1, decimals: 18, symbol: 'DAI', name: 'Stablecoin', isNative: false, isToken: true, address: '0x6B175474E89094C44Da98b954EedeAC495271d0F' }, quoteCurrency: Token { chainId: 1, decimals: 6, symbol: 'USDC', name: 'USD Coin', isNative: false, isToken: true, address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48' }, scalar: Fraction { numerator: JSBI(2) [ 660865024, 931322574, sign: false ], denominator: JSBI(1) [ 1000000, sign: false ] } }El precio USDC parece tener sentido (denominador, 1000000), sin embargo, no estoy seguro de cómo interpretar el precio DAI de la salida. Si alguien puede darme alguna pista o indicarme un recurso que explique el resultado, se lo agradecería mucho. ¡Gracias!
JSBI significa J ava Script B ig I nt :
una implementación de JavaScript puro de la propuesta ECMAScript BigInt.
Es un entero grande representado a través de una matriz. Para ver su forma decimal, use String(jsbi) o jsbi.toString() . Para los cálculos tienes que usar métodos del módulo:
| Operacion matematica | Operación JSBI |
|---|---|
| Suma | c = JSBI.add(a, b) |
| Sustracción | c = JSBI.subtract(a, b) |
| Multiplicación | c = JSBI.multiply(a, b) |
| División | c = JSBI.divide(a, b) |
Usando los valores de tu ejemplo podemos calcular
(async function asyncFnOnlyForAwait() { const { default: JSBI } = await import ('https://cdn.skypack.dev/jsbi') window.JSBI = JSBI; window.priceJSBI = { numerator: [435696740, 805184612, 508287463, 671994784, 427409972, 4,], denominator: [0, 0, 0, 0, 0, 0, 4096, ], scalarNumerator: [660865024, 931322574, ], scalarDenominator: [1000000, ] }; window.price = {}; // convert arrays to JSBI for (const [prop, val] of Object.entries(priceJSBI)) priceJSBI[prop] = JSBI.from(val) // calculate using JSBI methods priceJSBI.value = JSBI.divide(priceJSBI.numerator, priceJSBI.denominator) priceJSBI.scalarValue = JSBI.divide(priceJSBI.scalarNumerator, priceJSBI.scalarDenominator) // convert JSBIs to numbers, losing precicion for (const [prop, val] of Object.entries(priceJSBI)) price[prop] = JSBI.toNumber(val) price.valueByNumbers = price.numerator / price.denominator console.table(price) document.write('<pre>price = '+JSON.stringify(price, null, 4)) }).call(); // In devtools console on this question, select the right iframe as scope to access these variables // In Chromium browsers there's a dropdown for JS scopes next to the "console clear" buttonEs extraño que Uniswap envíe JSBI en el escritorio. En realidad, está pensado como una alternativa para navegadores antiguos/móviles y solo complica las cosas. BigInts es compatible con todos los principales navegadores y utiliza operadores aritméticos normales. JSBI en realidad debería transpilarse para entornos con BigInts.