繁体   English   中英

解读 Uniswap V3 价格

[英]Interpreting Uniswap V3 prices

我对 JavaScript 和 Uniswap 很陌生。 我正在使用 Uniswap V3 从 DAI/USDC 池中获取价格。 我的“主”function 如下所示:

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);
}

我得到以下 output:

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 ]
  }
}

USDC 价格似乎有一定道理(分母,1000000),但我不确定如何从 output 解释 DAI 价格。如果有人可以提供任何提示或向我指出解释 output 的资源,我将不胜感激它。 谢谢!

JSBI 代表J ava S脚本B ig I nt

ECMAScript BigInt 提案的 纯 JavaScript实现。

它是一个通过数组表示的大 integer。 要查看它的十进制形式,请使用String(jsbi)jsbi.toString() 对于计算,您必须使用模块的方法:

数学运算 JSBI运营
添加 c = JSBI.add(a, b)
减法 c = JSBI.subtract(a, b)
乘法 c = JSBI.multiply(a, b)
分配 c = JSBI.divide(a, b)

使用您的示例的值,我们可以计算

 (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" button

Uniswap 在桌面上发布 JSBI 很奇怪。 它实际上是作为旧版/移动浏览器的后备方案,只会使事情复杂化。 所有主要浏览器都支持BigInts ,并使用普通的算术运算符。 JSBI 实际上应该被转译为具有 BigInts 的环境。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM