Skip to content

Commit

Permalink
adding pairName fulcrom, optimize gmx
Browse files Browse the repository at this point in the history
  • Loading branch information
ye-sentio committed Aug 4, 2023
1 parent 33140a0 commit 77493d5
Show file tree
Hide file tree
Showing 5 changed files with 132 additions and 77 deletions.
3 changes: 2 additions & 1 deletion projects/fulcrom/src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ VaultProcessor.bind({ address: VAULT, network: EthChainId.CRONOS })
coin_symbol: tokenIn.symbol,
tokenOut: tokenOut.symbol,
amountIn: Number(evt.args.amountIn) / Math.pow(10, tokenIn.decimal),
amountOut: Number(evt.args.amountOut) / Math.pow(10, tokenOut.decimal)
amountOut: Number(evt.args.amountOut) / Math.pow(10, tokenOut.decimal),
pairName: (tokenIn.symbol < tokenOut.symbol) ? tokenIn.symbol + "-" + tokenOut.symbol : tokenOut.symbol + "-" + tokenIn.symbol
})
ctx.meter.Gauge("swap_gauge").record(Number(evt.args.amountIn) / Math.pow(10, tokenIn.decimal), { coin_symbol: tokenIn.symbol })

Expand Down
65 changes: 32 additions & 33 deletions projects/gmx/src/helper/constant.ts
Original file line number Diff line number Diff line change
@@ -1,36 +1,35 @@
export const WhitelistTokenMap: { [address: string]: { symbol: string, decimal: number } } = {
"0xff970a61a04b1ca14834a43f5de4533ebddb5cc8": {
symbol: "USDC", decimal: 6
},
"0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
symbol: "WETH", decimal: 18
},
"0xda10009cbd5d07dd0cecc66161fc93d7c9000da1": {
symbol: "DAI", decimal: 18
},
"0xf97f4df75117a78c1a5a0dbb814af92458539fb4": {
symbol: "LINK", decimal: 18
},
"0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
symbol: "USDT", decimal: 6
},
"0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0": {
symbol: "UNI", decimal: 18
},
"0xfea7a6a0b346362bf88a9e4a88416b77a57d6c2a": {
symbol: "MIM", decimal: 18
},
"0x17fc002b466eec40dae837fc4be5c67993ddbd6f": {
symbol: "FRAX", decimal: 18
},
"0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
symbol: "WBTC", decimal: 8
},
"0xaf88d065e77c8cc2239327c5edb3a432268e5831": {
symbol: "USDC.e", decimal: 6
},

}
// export const WhitelistTokenMap: { [address: string]: { symbol: string, decimal: number } } = {
// "0xff970a61a04b1ca14834a43f5de4533ebddb5cc8": {
// symbol: "USDC", decimal: 6
// },
// "0x82af49447d8a07e3bd95bd0d56f35241523fbab1": {
// symbol: "WETH", decimal: 18
// },
// "0xda10009cbd5d07dd0cecc66161fc93d7c9000da1": {
// symbol: "DAI", decimal: 18
// },
// "0xf97f4df75117a78c1a5a0dbb814af92458539fb4": {
// symbol: "LINK", decimal: 18
// },
// "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9": {
// symbol: "USDT", decimal: 6
// },
// "0xfa7f8980b0f1e64a2062791cc3b0871572f1f7f0": {
// symbol: "UNI", decimal: 18
// },
// "0xfea7a6a0b346362bf88a9e4a88416b77a57d6c2a": {
// symbol: "MIM", decimal: 18
// },
// "0x17fc002b466eec40dae837fc4be5c67993ddbd6f": {
// symbol: "FRAX", decimal: 18
// },
// "0x2f2a2543b76a4166549f7aab2e75bef0aefc5b0f": {
// symbol: "WBTC", decimal: 8
// },
// "0xaf88d065e77c8cc2239327c5edb3a432268e5831": {
// symbol: "USDC.e", decimal: 6
// },
// }

export const REWARD_ROUTER = "0xA906F338CB21815cBc4Bc87ace9e68c87eF8d8F1"
export const GMX_ADDRESS = "0xfc5a1a6eb076a2c7ad06ed22c90d7e710e35ad0a"
Expand Down
47 changes: 42 additions & 5 deletions projects/gmx/src/helper/gmx-helper.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,57 @@
import { token } from "@sentio/sdk/utils"
import { EthChainId } from "@sentio/sdk/eth";
import { VaultContext } from "../types/eth/vault.js"
import { EthContext } from "@sentio/sdk/eth";
import { GlpManagerContext } from "../types/eth/glpmanager.js"
import { GMX_ADDRESS, REWARD_ROUTER, VAULT_ADDRESS, WhitelistTokenMap, esGMX_ADDRESS, sGMX_ADDRESS, GLP_MANAGER_ADDRESS, vGLP_ADDRESS, vGMX_ADDRESS, REWARD_TRACKER_ADDRESS } from './constant.js'
import { GMX_ADDRESS, REWARD_ROUTER, VAULT_ADDRESS, esGMX_ADDRESS, sGMX_ADDRESS, GLP_MANAGER_ADDRESS, vGLP_ADDRESS, vGMX_ADDRESS, REWARD_TRACKER_ADDRESS } from './constant.js'
import { getERC20ContractOnContext } from "@sentio/sdk/eth/builtin/erc20"
import { GMXContext } from "../types/eth/gmx.js"

//create coin map
let coinInfoMap = new Map<string, Promise<token.TokenInfo>>()

export async function buildCoinInfo(ctx: EthContext, coinAddress: string): Promise<token.TokenInfo> {
let [symbol, name, decimal] = ["unk", "unk", 0]
// console.log(`building ${ctx.getChainId()} ${coinAddress}`)
try {
symbol = await getERC20ContractOnContext(ctx, coinAddress).symbol()
decimal = Number(await getERC20ContractOnContext(ctx, coinAddress).decimals())
name = await getERC20ContractOnContext(ctx, coinAddress).name()
console.log(`build coin metadata ${symbol} ${decimal} ${name}`)
}
catch (e) {
console.log(`${e.message} get coin metadata error ${coinAddress}`)
}
return {
symbol,
name,
decimal
}
}

export const getOrCreateCoin = async function (ctx: EthContext, coinAddress: string): Promise<token.TokenInfo> {
let coinInfo = coinInfoMap.get(coinAddress)
if (!coinInfo) {
coinInfo = buildCoinInfo(ctx, coinAddress)
coinInfoMap.set(coinAddress, coinInfo)
console.log(`set coinInfoMap for ${(await coinInfo).name}`)
}
return coinInfo
}


//gauge each asset in pool
export const gaugeTokenAum = async (_: any, ctx: VaultContext) => {
for (let address in WhitelistTokenMap) {
const allWhitelistedTokensLength = await ctx.contract.allWhitelistedTokensLength({ blockTag: ctx.blockNumber })
let address = ""
for (let i = 0; i < allWhitelistedTokensLength; i++) {
address = (await ctx.contract.allWhitelistedTokens(i, { blockTag: ctx.blockNumber })).toLowerCase()
const token = await getOrCreateCoin(ctx, address)
try {
const tokenAum = Number(await getERC20ContractOnContext(ctx, address).balanceOf(VAULT_ADDRESS)) / Math.pow(10, WhitelistTokenMap[address].decimal)
const tokenAum = Number(await getERC20ContractOnContext(ctx, address).balanceOf(VAULT_ADDRESS)) / Math.pow(10, token.decimal)
// console.log("tokenAum", tokenAum, WhitelistTokenMap[address].decimal, WhitelistTokenMap[address].symbol, ctx.timestamp)
ctx.meter.Gauge("tokenAum").record(tokenAum, { coin_symbol: WhitelistTokenMap[address].symbol })
} catch (e) { console.log(`error 4 ${WhitelistTokenMap[address].symbol} ${ctx.timestamp}`) }
ctx.meter.Gauge("tokenAum").record(tokenAum, { coin_symbol: token.symbol })
} catch (e) { console.log(`gauge token aum error ${token.symbol} ${ctx.timestamp}`) }
}
}

Expand Down
21 changes: 11 additions & 10 deletions projects/gmx/src/processor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@ import { RewardTrackerProcessor, RewardTrackerContext } from './types/eth/reward
import { EthChainId } from "@sentio/sdk/eth";
import { gaugeTokenAum, gaugeStakedAssets } from './helper/gmx-helper.js';
import { getERC20ContractOnContext } from '@sentio/sdk/eth/builtin/erc20'
import { GMX_ADDRESS, REWARD_ROUTER, VAULT_ADDRESS, WhitelistTokenMap, esGMX_ADDRESS, sGMX_ADDRESS, GLP_MANAGER_ADDRESS, vGLP_ADDRESS, vGMX_ADDRESS, REWARD_TRACKER_ADDRESS } from './helper/constant.js'
import { GMX_ADDRESS, REWARD_ROUTER, VAULT_ADDRESS, esGMX_ADDRESS, sGMX_ADDRESS, GLP_MANAGER_ADDRESS, vGLP_ADDRESS, vGMX_ADDRESS, REWARD_TRACKER_ADDRESS } from './helper/constant.js'
import { getOrCreateCoin } from './helper/gmx-helper.js'

VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
.onEventIncreasePosition(async (evt, ctx) => {
const collateral = WhitelistTokenMap[evt.args.collateralToken.toLowerCase()]
const collateral = await getOrCreateCoin(ctx, evt.args.collateralToken.toLowerCase())
const collateralDelta = Number(evt.args.collateralDelta) / Math.pow(10, 30)
const token = evt.args.indexToken
const sizeDelta = Number(evt.args.sizeDelta) / Math.pow(10, 30)
Expand All @@ -26,7 +27,7 @@ VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
})
})
.onEventDecreasePosition(async (evt, ctx) => {
const collateral = WhitelistTokenMap[evt.args.collateralToken.toLowerCase()]
const collateral = await getOrCreateCoin(ctx, evt.args.collateralToken.toLowerCase())
const collateralDelta = Number(evt.args.collateralDelta) / Math.pow(10, 30)
const token = evt.args.indexToken
const sizeDelta = Number(evt.args.sizeDelta) / Math.pow(10, 30)
Expand All @@ -41,8 +42,8 @@ VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
})
})
.onEventSwap(async (evt, ctx) => {
const tokenIn = WhitelistTokenMap[evt.args.tokenIn.toLowerCase()]
const tokenOut = WhitelistTokenMap[evt.args.tokenOut.toLowerCase()]
const tokenIn = await getOrCreateCoin(ctx, evt.args.tokenIn.toLowerCase())
const tokenOut = await getOrCreateCoin(ctx, evt.args.tokenOut.toLowerCase())
ctx.eventLogger.emit("vault.swap", {
distinctId: evt.args.account,
tokenIn: tokenIn.symbol,
Expand All @@ -59,7 +60,7 @@ VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
// })
// })
.onEventLiquidatePosition(async (evt, ctx) => {
const collateral = WhitelistTokenMap[evt.args.collateralToken.toLowerCase()]
const collateral = await getOrCreateCoin(ctx, evt.args.collateralToken.toLowerCase())
ctx.eventLogger.emit("vault.liquidatePostion", {
distinctId: evt.args.account,
collateralToken: collateral.symbol,
Expand Down Expand Up @@ -90,7 +91,7 @@ VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
})
.onEventCollectMarginFees(async (evt, ctx) => {
//todo: check decimal of other tokens
const token = WhitelistTokenMap[evt.args.token.toLowerCase()]
const token = await getOrCreateCoin(ctx, evt.args.token.toLowerCase())
ctx.eventLogger.emit("vault.collectMarginFees", {
token: token.symbol,
feeUsd: Number(evt.args.feeUsd) / Math.pow(10, 30),
Expand All @@ -99,7 +100,7 @@ VaultProcessor.bind({ address: VAULT_ADDRESS, network: EthChainId.ARBITRUM })
})
.onEventCollectSwapFees(async (evt, ctx) => {
//todo: check decimal of other tokens
const token = WhitelistTokenMap[evt.args.token.toLowerCase()]
const token = await getOrCreateCoin(ctx, evt.args.token.toLowerCase())
ctx.eventLogger.emit("vault.collectSwapFees", {
token: token.symbol,
feeUsd: Number(evt.args.feeUsd) / Math.pow(10, token.decimal),
Expand All @@ -124,7 +125,7 @@ GMXProcessor.bind({ address: GMX_ADDRESS, network: EthChainId.ARBITRUM })

GlpManagerProcessor.bind({ address: GLP_MANAGER_ADDRESS, network: EthChainId.ARBITRUM })
.onEventAddLiquidity(async (evt, ctx) => {
const collateral = WhitelistTokenMap[evt.args.token.toLowerCase()]
const collateral = await getOrCreateCoin(ctx, evt.args.token.toLowerCase())
ctx.eventLogger.emit("glpManager.addLiquidity", {
distinctId: evt.args.account,
token: collateral.symbol,
Expand All @@ -134,7 +135,7 @@ GlpManagerProcessor.bind({ address: GLP_MANAGER_ADDRESS, network: EthChainId.ARB
})
})
.onEventRemoveLiquidity(async (evt, ctx) => {
const collateral = WhitelistTokenMap[evt.args.token.toLowerCase()]
const collateral = await getOrCreateCoin(ctx, evt.args.token.toLowerCase())
ctx.eventLogger.emit("glpManager.removeLiquidity", {
distinctId: evt.args.account,
token: collateral.symbol,
Expand Down
73 changes: 45 additions & 28 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -995,17 +995,17 @@
dependencies:
bs58 "^5.0.0"

"@mysten/sui.js@^0.37.1":
version "0.37.1"
resolved "https://registry.yarnpkg.com/@mysten/sui.js/-/sui.js-0.37.1.tgz#b6a0c7312d979bec6903683d7db07fc33ff7d9ea"
integrity sha512-nEOqnjUqb/VJcVk23LgZOX1FmBib/mBCwAWaJhtsCHLwv2jIAfCPY/fpB9lJ62QHrM8UFclpWxsLkqcUkKyPgA==
"@mysten/sui.js@^0.39.0":
version "0.39.0"
resolved "https://registry.yarnpkg.com/@mysten/sui.js/-/sui.js-0.39.0.tgz#e9983ec873153c2aa0bc15f2d1478c40fa0d2d98"
integrity sha512-fJu6k7+Qb1z2h9i5Jai0sTWmaGP1UT6d/JIXhEwMZ6cz+13GT/8zRp8kUhP7Oq9Z2hxmwfy1ROptbsrv/x9V8A==
dependencies:
"@mysten/bcs" "0.7.3"
"@noble/curves" "^1.0.0"
"@noble/hashes" "^1.3.0"
"@noble/curves" "^1.1.0"
"@noble/hashes" "^1.3.1"
"@open-rpc/client-js" "^1.8.1"
"@scure/bip32" "^1.3.0"
"@scure/bip39" "^1.2.0"
"@scure/bip32" "^1.3.1"
"@scure/bip39" "^1.2.1"
"@suchipi/femver" "^1.0.0"
events "^3.3.0"
superstruct "^1.0.3"
Expand All @@ -1027,7 +1027,7 @@
superstruct "^1.0.3"
tweetnacl "^1.0.3"

"@noble/curves@^1.0.0":
"@noble/curves@^1.0.0", "@noble/curves@^1.1.0", "@noble/curves@~1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.1.0.tgz#f13fc667c89184bc04cccb9b11e8e7bae27d8c3d"
integrity sha512-091oBExgENk/kGj3AZmtBDMpxQPDtxQABR2B9lb1JbVTs6ytdzZNwvhxQ4MWasRNEzlbEH8jCWFCwhF/Obj5AA==
Expand Down Expand Up @@ -1056,7 +1056,7 @@
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.0.tgz#085fd70f6d7d9d109671090ccae1d3bec62554a1"
integrity sha512-ilHEACi9DwqJB0pw7kv+Apvh50jiiSyR/cQ3y4W7lOR5mhvn/50FLUfsnfJz0BDZtl/RR16kXvptiv6q1msYZg==

"@noble/hashes@1.3.1", "@noble/hashes@^1.3.0", "@noble/hashes@~1.3.0":
"@noble/hashes@1.3.1", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1", "@noble/hashes@~1.3.0", "@noble/hashes@~1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.1.tgz#8831ef002114670c603c458ab8b11328406953a9"
integrity sha512-EbqwksQwz9xDRGfDST86whPBgM65E0OH/pCgqW0GBVzO22bNE+NuIbeTb714+IfSjU3aRk47EUvXIb5bTsenKA==
Expand Down Expand Up @@ -1211,6 +1211,15 @@
"@noble/hashes" "~1.3.0"
"@scure/base" "~1.1.0"

"@scure/bip32@^1.3.1":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.3.1.tgz#7248aea723667f98160f593d621c47e208ccbb10"
integrity sha512-osvveYtyzdEVbt3OfwwXFr4P2iVBL5u1Q3q4ONBfDY/UpOuXmOlbgwc1xECEboY8wIays8Yt6onaWMUdUbfl0A==
dependencies:
"@noble/curves" "~1.1.0"
"@noble/hashes" "~1.3.1"
"@scure/base" "~1.1.0"

"@scure/bip39@1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.1.0.tgz#92f11d095bae025f166bef3defcc5bf4945d419a"
Expand All @@ -1227,6 +1236,14 @@
"@noble/hashes" "~1.3.0"
"@scure/base" "~1.1.0"

"@scure/bip39@^1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.2.1.tgz#5cee8978656b272a917b7871c981e0541ad6ac2a"
integrity sha512-Z3/Fsz1yr904dduJD0NpiyRHhRYHdcnyh73FZWiV+/qhWi83wNJ3NWolYqCEN+ZWsUz2TWwajJggcRE9r1zUYg==
dependencies:
"@noble/hashes" "~1.3.0"
"@scure/base" "~1.1.0"

"@sentio/bigdecimal@^9.1.1-patch.3":
version "9.1.1-patch.3"
resolved "https://registry.yarnpkg.com/@sentio/bigdecimal/-/bigdecimal-9.1.1-patch.3.tgz#15e4f2ed6dd0446a97c5375d3931757a71df4287"
Expand Down Expand Up @@ -1292,24 +1309,24 @@
truffle-privatekey-provider "^1.5.0"
web3 "^1.3.0"

"@sentio/protos@2.22.3-rc.1":
version "2.22.3-rc.1"
resolved "https://registry.yarnpkg.com/@sentio/protos/-/protos-2.22.3-rc.1.tgz#50d780bfeafcb6555b60c9549440234a1e56cc77"
integrity sha512-mj4FfBcQGRgo4rcQe2TOlpT8BWlhe7855SG7gSyYyou69aE3IRYnBJONW3tdxhZo1TtQH437NC+fMhuilprEMg==
"@sentio/protos@2.22.3":
version "2.22.3"
resolved "https://registry.yarnpkg.com/@sentio/protos/-/protos-2.22.3.tgz#d35c417b47d83153314ad70c3f8fb8f63f471a7d"
integrity sha512-uNNayxzFGTOUxdpIX2Tyr4KT++GhuprfxrArp+4gx2hd7NSEeDkgL+T4eGe5rSLrhxBWnkVUPS51G4VdMYJjlA==
dependencies:
google-protobuf "^3.21.2"
long "^5.2.3"
nice-grpc "^2.1.0"
nice-grpc-common "^2.0.2"
protobufjs "^7.2.3"

"@sentio/runtime@^2.22.3-rc.1":
version "2.22.3-rc.1"
resolved "https://registry.yarnpkg.com/@sentio/runtime/-/runtime-2.22.3-rc.1.tgz#cf78e6c400d6457b1db915c0b01ce9fa62bee24f"
integrity sha512-WHu2Xo62XpCi8ZUTlDDmrdkIaL2YNmidyH7lfj4waNTbzeXrSq8V5hvv9s7h8Zy4cKJUify2JNsi0HUpsqFonw==
"@sentio/runtime@^2.22.3":
version "2.22.3"
resolved "https://registry.yarnpkg.com/@sentio/runtime/-/runtime-2.22.3.tgz#b4bce44f2c857960f05309cb0f23230f2f963242"
integrity sha512-7AvEjCBDzT4Txja8h2SqB6YlHIxN0qyHPVnBuO+9SBBUiJCgtLo/YABKTZMemFSNweW6VBs6ZJQXMVLKpkkoIw==
dependencies:
"@grpc/grpc-js" "^1.8.14"
"@sentio/protos" "2.22.3-rc.1"
"@sentio/protos" "2.22.3"
command-line-args "^5.2.1"
command-line-usage "^7.0.1"
fs-extra "^11.0.0"
Expand All @@ -1325,19 +1342,19 @@
utility-types "^3.10.0"
winston "^3.8.2"

"@sentio/sdk@^v2.22.3-rc.1":
version "2.22.3-rc.1"
resolved "https://registry.yarnpkg.com/@sentio/sdk/-/sdk-2.22.3-rc.1.tgz#6dc26ed2442db04762f3be89a67f7c3e33cbda6f"
integrity sha512-cJA9DuN1tWKvldtzbxg/Mof2n6S5bpbwz8J+URuiA8PAnkwhGCgMCiKntvc2IMWmtAqqMCDKL4HwcY8cbsX01g==
"@sentio/sdk@^v2.22.3":
version "2.22.3"
resolved "https://registry.yarnpkg.com/@sentio/sdk/-/sdk-2.22.3.tgz#4beae3e3863e3b747189f9c58134ee7f0ea7c243"
integrity sha512-Js8e1uqPH2uREP5l1jzsabcAFxbCsTfUYakaSQheUqA2V8WRwcDYmWvnmDR0cbHf9U+s1QMtstnmFj2CLuTACA==
dependencies:
"@coral-xyz/borsh" "^0.28.0"
"@mysten/sui.js" "^0.37.1"
"@mysten/sui.js" "^0.39.0"
"@project-serum/anchor" "^0.26.0"
"@sentio/bigdecimal" "^9.1.1-patch.3"
"@sentio/chain" "^1.0.3"
"@sentio/ethers-v6" "^1.0.28"
"@sentio/protos" "2.22.3-rc.1"
"@sentio/runtime" "^2.22.3-rc.1"
"@sentio/protos" "2.22.3"
"@sentio/runtime" "^2.22.3"
"@solana/web3.js" "^1.74.0"
"@types/prettier" "^2.7.2"
aptos-sdk "npm:aptos@^1.14.0"
Expand All @@ -1353,7 +1370,7 @@
nice-grpc-prometheus "^0.1.6"
node-fetch "^3.3.1"
p-queue "^7.3.4"
prettier "^2.8.7"
prettier "^2.8.8"
radash "^11.0.0"
superstruct_solana "npm:superstruct@^0.14.2"
typechain "^8.0.0"
Expand Down Expand Up @@ -6075,7 +6092,7 @@ precond@0.2:
resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac"
integrity sha512-QCYG84SgGyGzqJ/vlMsxeXd/pgL/I94ixdNFyh1PusWmTCyVfPJjZ1K1jvHtsbfnXQs2TSkEP2fR7QiMZAnKFQ==

prettier@^2.3.1, prettier@^2.8.7:
prettier@^2.3.1, prettier@^2.8.8:
version "2.8.8"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
Expand Down

0 comments on commit 77493d5

Please sign in to comment.