From 5b9e2c03769ebaebc1d7ff8ede14169f4fc9df87 Mon Sep 17 00:00:00 2001 From: Adam Stox Date: Thu, 8 Feb 2024 03:42:13 -0500 Subject: [PATCH] Tinlake support (#104) * feat: add evmBlockHandler * fix: update eth startblock * fix: set tinlake pools to inactive so they're not pulled into the regular pool updates * feat: update evmHandlers and start blocks * feat: update snapshotter to use generic object instead of substrateBlocks * feat: add shelf abi * feat: add currency to tinlake pools * feat: make nft data nullable in schema * feat: add pile abi * feat: add more loan tracking * feat: track tinlake loan repayments * fix: update with all migrated contracts * fix: remove frozen lockfile in order to add abab package * fix: trim abis * fix: address PR optimizations and clean up * fix: update loan fetching and clean up * chore: more clean up * feat: multi-chain timekeeping Co-authored-by: Adam Stox * fix: contract abi references Co-authored-by: Adam Stox * chore: clean up snapshotting logic * fix: update tests * fix: make snapshotters async * fix: move handleEvmBlock to its own file and rename to handleEthBlock * fix: build --------- Co-authored-by: Filippo Fontana --- .github/workflows/subql_deploy_workflow.yaml | 6 +- .github/workflows/test.yml | 8 +- abi/navfeed.abi.json | 29 +++ abi/pile.abi.json | 35 +++ abi/reserve.abi.json | 11 + abi/shelf.abi.json | 23 ++ chains-evm/_root.yaml | 2 +- chains-evm/eth/centrifuge.yaml | 30 ++- schema.graphql | 4 +- src/config.ts | 216 ++++++++++++++++ src/helpers/stateSnapshot.test.ts | 12 +- src/helpers/stateSnapshot.ts | 40 ++- src/helpers/timekeeperService.ts | 9 +- src/index.ts | 5 +- src/mappings/handlers/blockHandlers.ts | 10 +- src/mappings/handlers/ethHandlers.ts | 152 +++++++++++ src/mappings/handlers/evmHandlers.ts | 2 +- src/mappings/services/loanService.ts | 4 +- yarn.lock | 257 ++++++------------- 19 files changed, 639 insertions(+), 216 deletions(-) create mode 100644 abi/navfeed.abi.json create mode 100644 abi/pile.abi.json create mode 100644 abi/reserve.abi.json create mode 100644 abi/shelf.abi.json create mode 100644 src/mappings/handlers/ethHandlers.ts diff --git a/.github/workflows/subql_deploy_workflow.yaml b/.github/workflows/subql_deploy_workflow.yaml index 864371a6..3af9a109 100644 --- a/.github/workflows/subql_deploy_workflow.yaml +++ b/.github/workflows/subql_deploy_workflow.yaml @@ -49,9 +49,9 @@ jobs: run: yarn install --frozen-lockfile - name: Codegen run: | - cp chains-evm/_root.yaml project-centrifuge.yaml - cp chains-evm/_root.yaml project-ethereum.yaml - cp chains-evm/_root.yaml project-celo.yaml + yq ". *=d load(\"chains-cfg/centrifuge.yaml\")" chains-cfg/_root.yaml > project-centrifuge.yaml || true + yq ". *=d load(\"chains-evm/eth/centrifuge.yaml\")" chains-evm/_root.yaml > project-ethereum.yaml || true + yq ". *=d load(\"chains-evm/celo/centrifuge.yaml\")" chains-evm/_root.yaml > project-celo.yaml || true yarn codegen - name: SubQL CLI Version run: yarn subql --version diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 53840c45..8ba5ae43 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -1,7 +1,7 @@ name: 'Test' on: pull_request: - branches: + branches: - main # This allows a subsequently queued workflow run to interrupt previous runs @@ -29,9 +29,9 @@ jobs: run: yarn install --frozen-lockfile - name: Codegen run: | - cp chains-evm/_root.yaml project-centrifuge.yaml - cp chains-evm/_root.yaml project-ethereum.yaml - cp chains-evm/_root.yaml project-celo.yaml + yq ". *=d load(\"chains-cfg/centrifuge.yaml\")" chains-cfg/_root.yaml > project-centrifuge.yaml || true + yq ". *=d load(\"chains-evm/eth/centrifuge.yaml\")" chains-evm/_root.yaml > project-ethereum.yaml || true + yq ". *=d load(\"chains-evm/celo/centrifuge.yaml\")" chains-evm/_root.yaml > project-celo.yaml || true yarn codegen - name: Build run: yarn build diff --git a/abi/navfeed.abi.json b/abi/navfeed.abi.json new file mode 100644 index 00000000..89878da7 --- /dev/null +++ b/abi/navfeed.abi.json @@ -0,0 +1,29 @@ +[ + { + "constant": true, + "inputs": [], + "name": "currentNAV", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "loan", "type": "uint256" }], + "name": "nftID", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "name": "maturityDate", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/pile.abi.json b/abi/pile.abi.json new file mode 100644 index 00000000..9f22cf22 --- /dev/null +++ b/abi/pile.abi.json @@ -0,0 +1,35 @@ +[ + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "loan", "type": "uint256" }], + "name": "debt", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "loanRates", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "name": "rates", + "outputs": [ + { "internalType": "uint256", "name": "pie", "type": "uint256" }, + { "internalType": "uint256", "name": "chi", "type": "uint256" }, + { "internalType": "uint256", "name": "ratePerSecond", "type": "uint256" }, + { "internalType": "uint48", "name": "lastUpdated", "type": "uint48" }, + { "internalType": "uint256", "name": "fixedRate", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/reserve.abi.json b/abi/reserve.abi.json new file mode 100644 index 00000000..f53ed294 --- /dev/null +++ b/abi/reserve.abi.json @@ -0,0 +1,11 @@ +[ + { + "constant": true, + "inputs": [], + "name": "totalBalance", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/abi/shelf.abi.json b/abi/shelf.abi.json new file mode 100644 index 00000000..87f30552 --- /dev/null +++ b/abi/shelf.abi.json @@ -0,0 +1,23 @@ +[ + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "loan", "type": "uint256" }], + "name": "token", + "outputs": [ + { "internalType": "address", "name": "registry", "type": "address" }, + { "internalType": "uint256", "name": "nft", "type": "uint256" } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [{ "internalType": "uint256", "name": "loan", "type": "uint256" }], + "name": "nftLocked", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "payable": false, + "stateMutability": "view", + "type": "function" + } +] diff --git a/chains-evm/_root.yaml b/chains-evm/_root.yaml index 29e92a32..7f79fd1c 100644 --- a/chains-evm/_root.yaml +++ b/chains-evm/_root.yaml @@ -44,4 +44,4 @@ templates: kind: ethereum/LogHandler filter: topics: - - Transfer(address indexed from, address indexed to, uint256 value) \ No newline at end of file + - Transfer(address indexed from, address indexed to, uint256 value) diff --git a/chains-evm/eth/centrifuge.yaml b/chains-evm/eth/centrifuge.yaml index b9ed03af..e972428e 100644 --- a/chains-evm/eth/centrifuge.yaml +++ b/chains-evm/eth/centrifuge.yaml @@ -1,13 +1,33 @@ network: chainId: '1' # Ethereum Mainnet - endpoint: "https://mainnet.infura.io/v3/a4ba76cd4be643618572e7467a444e3a" - dictionary: "https://gx.api.subquery.network/sq/subquery/eth-dictionary" + endpoint: 'https://mainnet.infura.io/v3/a4ba76cd4be643618572e7467a444e3a' + dictionary: 'https://gx.api.subquery.network/sq/subquery/eth-dictionary' bypassBlocks: - - "18721040-18735450" - - "18735460-18747630" - - "18747640-18763940" + - '18721040-18735450' + - '18735460-18747630' + - '18747640-18763940' dataSources: - kind: ethereum/Runtime startBlock: 18721030 options: address: '0x78E9e622A57f70F1E0Ec652A4931E4e278e58142' + - kind: ethereum/Runtime + startBlock: 11063000 + options: + abi: navFeed + assets: + navFeed: + file: './abi/navfeed.abi.json' + reserve: + file: './abi/reserve.abi.json' + shelf: + file: './abi/shelf.abi.json' + pile: + file: './abi/pile.abi.json' + mapping: + file: './dist/index.js' + handlers: + - handler: handleEthBlock + kind: ethereum/BlockHandler + filter: + modulo: 3600 diff --git a/schema.graphql b/schema.graphql index d804a3fa..402c38bd 100644 --- a/schema.graphql +++ b/schema.graphql @@ -314,8 +314,8 @@ type Loan @entity { id: ID! # poolId - loanId createdAt: Date! - collateralNftClassId: BigInt! - collateralNftItemId: BigInt! + collateralNftClassId: BigInt + collateralNftItemId: BigInt metadata: String diff --git a/src/config.ts b/src/config.ts index 4b4b6c72..a4939caf 100644 --- a/src/config.ts +++ b/src/config.ts @@ -6,3 +6,219 @@ export const WAD = bnToBn(10).pow(bnToBn(WAD_DIGITS)) export const RAY_DIGITS = 27 export const RAY = bnToBn(10).pow(bnToBn(RAY_DIGITS)) export const CPREC = (digits: number) => bnToBn(10).pow(bnToBn(digits)) +export const DAIMainnetAddress = '0x6b175474e89094c44da98b954eedeac495271d0f' +export const tinlakePools = [ + { + id: '0x09e43329552c9d81cf205fd5f44796fbc40c822e', + shortName: 'REIF Pool', + startBlock: 13796246, + navFeed: [{ address: '0x67ee93df5ff0805d6bfbcd747bf4e3ad20af5cc3', startBlock: 13796262 }], + reserve: [{ address: '0xdcc68229b0d0fb7668f3304d88ee9a2738a7b51d', startBlock: 13796304 }], + shelf: [{ address: '0xbcCB3516D0fDE02DC46d9Bf591CF9cb3880D9842' }], + pile: [{ address: '0xc2a75288cf644b068fC1e765586c170f2529a87F' }], + }, + { + id: '0x0ced6166873038ac0cc688e7e6d19e2cbe251bf0', + shortName: 'Bling Series 1', + startBlock: 11196893, + navFeed: [{ address: '0x1621b607a62dac0dc2e4044ff1235a30f135cbd2', startBlock: 11197170 }], + reserve: [{ address: '0x932344ba99bf34035b4bc25cbd98f912ebc60371', startBlock: 11197219 }], + shelf: [{ address: '0xCFad06aDAcf221f8119995c8bCa25184A6b5A268' }], + pile: [{ address: '0x05739C677286d38CcBF0FfC8f9cdbD45904B47Fd' }], + }, + { + id: '0x235893bf9695f68a922dac055598401d832b538b', + shortName: 'Pezesha 1', + startBlock: 12453056, + navFeed: [{ address: '0xd9b2471f5c7494254b8d52f4ab3146e747abc9ab', startBlock: 12453087 }], + reserve: [{ address: '0xb12e705733042610174ed22f6726d26db12dbdfe', startBlock: 12703288 }], + shelf: [{ address: '0x4Ca7049E61629407a7E829564C1Dd2538d70182C' }], + pile: [{ address: '0xAAEaCfcCc3d3249f125Ba0644495560309C266cB' }], + }, + { + id: '0x3170d353772ed68676044f8b76f0641b2cba084e', + shortName: 'Fortunafi 2', + startBlock: 13512637, + navFeed: [{ address: '0x3263b3a84543abfceca35ab1b02c6ab4f1e66b17', startBlock: 13512663 }], + reserve: [{ address: '0x101e8f7598639bf3d1320ac9999977a0678aa186', startBlock: 13513359 }], + shelf: [{ address: '0x720E872De93F3416bD0d43d3ACA6891f26D60797' }], + pile: [{ address: '0x2bD53Bd2341329e0cf36c55380A77a3E457028Ca' }], + }, + { + id: '0x3b03863bd553c4ce07eabf2278016533451c9101', + shortName: 'Cauris Global Fintech 1', + startBlock: 13397601, + navFeed: [{ address: '0x431548e6f14134b7e2955c4f2d42054f7588afce', startBlock: 13397666 }], + reserve: [{ address: '0xb15ccb81f633b98845a0f6c91a89483298a41cc3', startBlock: 13402984 }], + shelf: [{ address: '0x5621d692DEEea943C0c694dC3000E32d3CE28bA7' }], + pile: [{ address: '0x696866ea53C0f521C24a28D92fAbD2c559182D38' }], + }, + { + id: '0x3d167bd08f762fd391694c67b5e6af0868c45538', + shortName: 'GIG Pool', + startBlock: 12901666, + navFeed: [{ address: '0x468eb2408c6f24662a291892550952eb0d70b707', startBlock: 12901939 }], + reserve: [{ address: '0x1794a4b29ff2ecdc044ad5d4972fa118d4c121b9', startBlock: 12902086 }], + shelf: [{ address: '0x661f03AcE6Bd3087201503541ac7b0Cb1185d673' }], + pile: [{ address: '0x9E39e0130558cd9A01C1e3c7b2c3803baCb59616' }], + }, + { + id: '0x4597f91cc06687bdb74147c80c097a79358ed29b', + shortName: 'BT1', + startBlock: 16041343, + navFeed: [{ address: '0x479506bff98b18d62e62862a02a55047ca6583fa', startBlock: 16041344 }], + reserve: [{ address: '0x50f8a1cdedd9aef2901c7ec0859d8adbf61b1263', startBlock: 16041344 }], + shelf: [{ address: '0x35Cbc4F6de5333DAFb372200591E69b68B2A5FbF' }], + pile: [{ address: '0x62E6225d9DbFa9C5f09ccB43304F60a0a7dDeb7A' }], + }, + { + id: '0x4b6ca198d257d755a5275648d471fe09931b764a', + shortName: 'Fortunafi 1', + startBlock: 11282587, + navFeed: [ + { address: '0xcAB9ed8e5EF4607A97f4e22Ad1D984ADB93ce890', startBlock: 11282611 }, + { address: '0x887db3ee1166ddaf5f7df96b195912594112431e', startBlock: 16799275 }, + ], + reserve: [ + { address: '0x78aF512B18C0893e77138b02B1393cd887816EDF', startBlock: 11282854 }, + { address: '0xd9cec614db2b5a7490df2462a4621d96bcd4bfe2', startBlock: 12996577 }, + ], + shelf: [{ address: '0x9C3a54AC3af2e1FC9ee49e991a0452629C9bca64' }], + pile: [{ address: '0x11C14AAa42e361Cf3500C9C46f34171856e3f657' }], + }, + { + id: '0x4ca805ce8ece2e63ffc1f9f8f2731d3f48df89df', + shortName: 'Harbor Trade 2', + startBlock: 11464178, + navFeed: [{ address: '0xdb9a84e5214e03a4e5dd14cfb3782e0bcd7567a7', startBlock: 11464206 }], + reserve: [ + { address: '0x573a8a054e0C80F0E9B1e96E8a2198BB46c999D6', startBlock: 11464255 }, + { address: '0x86284a692430c25eff37007c5707a530a6d63a41', startBlock: 13004076 }, + ], + shelf: [{ address: '0x5b2b43b3676057e38F332De73A9fCf0F8f6Babf7' }], + pile: [{ address: '0xE7876f282bdF0f62e5fdb2C63b8b89c10538dF32' }], + }, + { + id: '0x53b2d22d07e069a3b132bfeaad275b10273d381e', + shortName: 'New Silver 2', + startBlock: 11288849, + navFeed: [{ address: '0x41fad1eb242de19da0206b0468763333bb6c2b3d', startBlock: 11288866 }], + reserve: [{ address: '0x1f5fa2e665609ce4953c65ce532ac8b47ec97cd5', startBlock: 12702995 }], + shelf: [{ address: '0x7d057A056939bb96D682336683C10EC89b78D7CE' }], + pile: [{ address: '0x3eC5c16E7f2C6A80E31997C68D8Fa6ACe089807f' }], + }, + { + id: '0x55d86d51ac3bcab7ab7d2124931fba106c8b60c7', + shortName: 'BT4', + startBlock: 16047892, + navFeed: [{ address: '0x60eeba86ce045d54ce625d71a5c2baebfb2e46e9', startBlock: 16047892 }], + reserve: [{ address: '0xeeaeb5dd73f59b985620ba957c7c1917efcaa36b', startBlock: 16047892 }], + shelf: [{ address: '0x9ACe0E10D30bee67F096861e36faA984005d2DA3' }], + pile: [{ address: '0xFE2cC8f110311D9aeB116292687697FD805D9FDB' }], + }, + { + id: '0x560ac248ce28972083b718778eeb0dbc2de55740', + shortName: 'Branch Series 3', + startBlock: 12554323, + navFeed: [{ address: '0x2cc23f2c2451c55a2f4da389bc1d246e1cf10fc6', startBlock: 12554399 }], + reserve: [ + { address: '0xE5FDaE082F6E22f25f0382C56cb3c856a803c9dD', startBlock: 12554505 }, + { address: '0xb74c0a7929f5c35e5f4e74b628ee32a35a7535d7', startBlock: 12703246 }, + ], + shelf: [{ address: '0xeCc564B98f3F50567C3ED0C1E784CbA4f97C6BcD' }], + pile: [{ address: '0xe17F3c35C18b2Af84ceE2eDed673c6A08A671695' }], + }, + { + id: '0x714d520cfac2027834c8af8ffc901855c3ad41ec', + shortName: 'FactorChain 1', + startBlock: 12003036, + navFeed: [{ address: '0x30e3f738f22f5a4671d1252793deb6e657e4b8aa', startBlock: 12003518 }], + reserve: [{ address: '0x0958c089e6389f2bba2eedd754047265241baf55', startBlock: 12003573 }], + shelf: [{ address: '0x8868b1e995CBCBaD4D904012D4c2a590510773d8' }], + pile: [{ address: '0x99D0333f97432fdEfA25B7634520d505e58B131B' }], + }, + { + id: '0x82b8617a16e388256617febba1826093401a3fe5', + shortName: 'Paperchain 3', + startBlock: 11458901, + navFeed: [{ address: '0xc61e65114cbd5508e31fd755a49a817798c132cb', startBlock: 11458986 }], + reserve: [{ address: '0xb873c152c06be54c704f891e37a7e3b554514964', startBlock: 11459264 }], + shelf: [{ address: '0x67C1d2552a0cE8572AAfFD0c9664EeA7edbBCeF3' }], + pile: [{ address: '0x37c8B836eA1b89b7cC4cFdDed4C4fbC454CcC679' }], + }, + { + id: '0x90040f96ab8f291b6d43a8972806e977631affde', + shortName: 'BT3', + startBlock: 16047729, + navFeed: [{ address: '0xea5e577df382889497534a0258345e78bbd4e31d', startBlock: 16047729 }], + reserve: [{ address: '0xb54900bcc0674e356627b58420fd051f2d47b9e9', startBlock: 16047729 }], + shelf: [{ address: '0xE791898207C129dB963260D6A3b23C8e7B8E31f2' }], + pile: [{ address: '0x6af9dA8dB1925F8ef359274A59eF01e1c6Df7bE0' }], + }, + { + id: '0x92332a9831ac04275bc0f22b9140b21c72984eb8', + shortName: 'Pezesha 1', + startBlock: 12113740, + navFeed: [{ address: '0xcea9f97d7fe55154e4a35a8b3316a8cdf9e08626', startBlock: 12114080 }], + reserve: [{ address: '0x7f5dea6c463a7250c53f1347f82b506f40e1b0cb', startBlock: 12114265 }], + shelf: [{ address: '' }], + pile: [{ address: '0xAAEaCfcCc3d3249f125Ba0644495560309C266cB' }], + }, + { + id: '0x9de3064f49696a25066252c35ede68850ea33bf8', + shortName: 'UP Series 1', + startBlock: 12951444, + navFeed: [{ address: '0x800aa0dd91374364e3de476d97dca32848cea6c4', startBlock: 12951456 }], + reserve: [{ address: '0x6942f8779c5c4aa385121a3ee203f2ca1d9d10bc', startBlock: 12951486 }], + shelf: [{ address: '0xE80C9e9fbaE9868e1D645f9727436afE5381047A' }], + pile: [{ address: '0xB7d1DE24c0243e6A3eC4De9fAB2B19AB46Fa941F' }], + }, + { + id: '0xb5c08534d1e73582fbd79e7c45694cad6a5c5ab2', + shortName: 'BT2', + startBlock: 16047557, + navFeed: [{ address: '0xeff42b6d4527a6a2fb429082386b34f5d4050b2c', startBlock: 16047557 }], + reserve: [{ address: '0x86ade02617911d2bf020b29b3035e6b3d805992d', startBlock: 16047557 }], + shelf: [{ address: '0x77bd5e87fBdae67C495d17ba268DD9E494983627' }], + pile: [{ address: '0x611e36809ad4BB94ae6dE889fd4e830Fc21835f7' }], + }, + { + id: '0xd8486c565098360a24f858088a6d29a380ddf7ec', + shortName: 'FNO1', + startBlock: 15460148, + navFeed: [{ address: '0x9ec3f3a40ba2572a48c8865e4aa89b3ee4ad4915', startBlock: 15460155 }], + reserve: [{ address: '0xc156aa23a29ef7678b4dec5b812b84797ed21ee0', startBlock: 15460175 }], + shelf: [{ address: '0x511680e8eD9cA463E5F1776281992de4Aec22039' }], + pile: [{ address: '0x8f7b701a7309c2Ef5c0Fe850ab7589d5b23a8f76' }], + }, + { + id: '0xdb3bc9fb1893222d266762e9ff857eb74d75c7d6', + shortName: 'ConsolFreight 4', + startBlock: 11063000, + navFeed: [{ address: '0x69504da6b2cd8320b9a62f3aed410a298d3e7ac6', startBlock: 11063046 }], + reserve: [ + { address: '0x0d601b451aFD502e473bA4CE6E3876D652BCbee7', startBlock: 11063150 }, + { address: '0xfaec38ffee969cf18e88097ec62e30b70494e234', startBlock: 13004061 }, + ], + shelf: [{ address: '0xA0B0d8394ADC79f5d1563a892abFc6186E519644' }], + pile: [{ address: '0x3fC72dA5545E2AB6202D81fbEb1C8273Be95068C' }], + }, + { + id: '0xf96f18f2c70b57ec864cc0c8b828450b82ff63e3', + shortName: 'ALT 1.0', + startBlock: 14167745, + navFeed: [{ address: '0x6fb02533b264d103b84d8f13d11a4865ec96307a', startBlock: 14167760 }], + reserve: [{ address: '0x35f7de72c8597599ef4f2a18eafd162257301435', startBlock: 14167898 }], + shelf: [{ address: '0x11daC3fA9d2216377A79Bef04F6A2682630371c3' }], + pile: [{ address: '0xE18AAB16cC26EB23740D72875e0C6b52cEbb46b3' }], + }, + { + id: '0xfc2950dd337ca8496c18dfc0256fb905a7e7e5c6', + shortName: 'databased.FINANCE 1', + startBlock: 11639815, + navFeed: [{ address: '0x00cd3ae59fdbd375a187bf8074db59edaf766c19', startBlock: 11639830 }], + reserve: [{ address: '0x729e12cdc0190a2e4ab4401bca4c16132d75adc5', startBlock: 11639877 }], + shelf: [{ address: '0xC42CfB07bC1140f9A615bD63c4fFAE5F8260Ab22' }], + pile: [{ address: '0xdB07B21109117208a0317adfbed484C87c9c2aFf' }], + }, +] diff --git a/src/helpers/stateSnapshot.test.ts b/src/helpers/stateSnapshot.test.ts index 00a082a5..31db6438 100644 --- a/src/helpers/stateSnapshot.test.ts +++ b/src/helpers/stateSnapshot.test.ts @@ -1,6 +1,6 @@ import { SubstrateBlock } from '@subql/types' import { PoolService } from '../mappings/services/poolService' -import { stateSnapshotter } from './stateSnapshot' +import { substrateStateSnapshotter } from './stateSnapshot' // eslint-disable-next-line @typescript-eslint/no-explicit-any const getByField = store.getByField as jest.Mock @@ -22,7 +22,7 @@ describe('Given a populated pool,', () => { set.mockReset() getByField.mockReset() getByField.mockReturnValue([pool]) - await stateSnapshotter('Pool', 'PoolSnapshot', block) + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block) expect(store.getByField).toHaveBeenCalledWith('Pool', 'type', 'ALL', expect.anything()) expect(store.set).toHaveBeenNthCalledWith(1, 'Pool', poolId, expect.anything()) expect(store.set).toHaveBeenNthCalledWith(2, 'PoolSnapshot', `${poolId}-11246`, expect.anything()) @@ -32,7 +32,7 @@ describe('Given a populated pool,', () => { set.mockReset() getByField.mockReset() getByField.mockReturnValue([pool]) - await stateSnapshotter('Pool', 'PoolSnapshot', block) + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block) expect(store.set).toHaveBeenNthCalledWith( 2, 'PoolSnapshot', @@ -45,7 +45,7 @@ describe('Given a populated pool,', () => { set.mockReset() getByField.mockReset() getByField.mockReturnValue([pool]) - await stateSnapshotter('Pool', 'PoolSnapshot', block, undefined, 'active', true) + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block, undefined, 'active', true) expect(store.getByField).toHaveBeenNthCalledWith(1, 'Pool', 'active', true, expect.anything()) }) @@ -53,7 +53,7 @@ describe('Given a populated pool,', () => { set.mockReset() getByField.mockReset() getByField.mockReturnValue([pool]) - await stateSnapshotter('Pool', 'PoolSnapshot', block, 'poolId') + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block, 'poolId') expect(store.set).toHaveBeenNthCalledWith( 2, 'PoolSnapshot', @@ -80,7 +80,7 @@ describe('Given a pool with non zero accumulators, ', () => { Object.assign(pool, accumulatedProps) - await stateSnapshotter('Pool', 'PoolSnapshot', block) + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block) expect(store.set).toHaveBeenNthCalledWith(1, 'Pool', poolId, expect.objectContaining(zeroedProps)) expect(store.set).toHaveBeenNthCalledWith( diff --git a/src/helpers/stateSnapshot.ts b/src/helpers/stateSnapshot.ts index 5ac614f5..19b662d7 100644 --- a/src/helpers/stateSnapshot.ts +++ b/src/helpers/stateSnapshot.ts @@ -1,8 +1,9 @@ -import { SubstrateBlock } from '@subql/types' import { errorHandler } from './errorHandler' import { paginatedGetter } from './paginatedGetter' import { getPeriodStart } from './timekeeperService' import type { Entity } from '@subql/types-core' +import { EthereumBlock } from '@subql/types-ethereum' +import { SubstrateBlock } from '@subql/types' /** * Creates a snapshot of a generic stateModel to a snapshotModel. * A snapshotModel has the same fields as the originating stateModel, however a timestamp and a blockNumber are added. @@ -16,24 +17,21 @@ import type { Entity } from '@subql/types-core' * @param fkReferenceName - (optional) name of the foreignKey to save a reference to the originating entity. * @returns A promise resolving when all state manipulations in the DB is completed */ -export const stateSnapshotter = errorHandler(_stateSnapshotter) +export const evmStateSnapshotter = errorHandler(_evmStateSnapshotter) +export const substrateStateSnapshotter = errorHandler(_substrateStateSnapshotter) async function _stateSnapshotter( stateModel: string, snapshotModel: string, - block: SubstrateBlock, + block: { number: number; timestamp: Date }, fkReferenceName: string | undefined = undefined, filterKey = 'type', filterValue: string | boolean = 'ALL' ): Promise { const entitySaves: Promise[] = [] logger.info(`Performing snapshots of ${stateModel}`) - const stateEntities = (await paginatedGetter( - stateModel, - filterKey, - filterValue - )) as ResettableEntity[] + const stateEntities = (await paginatedGetter(stateModel, filterKey, filterValue)) as ResettableEntity[] for (const stateEntity of stateEntities) { - const blockNumber = block.block.header.number.toNumber() + const blockNumber = block.number const { id, ...copyStateEntity } = stateEntity logger.info(`Snapshotting ${stateModel}: ${id}`) const snapshotEntity: SnapshotEntity = { ...copyStateEntity, id: `${id}-${blockNumber.toString()}` } @@ -54,6 +52,30 @@ async function _stateSnapshotter( await Promise.all(entitySaves) } +async function _evmStateSnapshotter( + stateModel: string, + snapshotModel: string, + block: EthereumBlock, + fkReferenceName: string | undefined = undefined, + filterKey = 'type', + filterValue: string | boolean = 'ALL' +): Promise { + const formattedBlock = { number: block.number, timestamp: new Date(Number(block.timestamp) * 1000) } + await _stateSnapshotter(stateModel, snapshotModel, formattedBlock, fkReferenceName, filterKey, filterValue) +} + +async function _substrateStateSnapshotter( + stateModel: string, + snapshotModel: string, + block: SubstrateBlock, + fkReferenceName: string | undefined = undefined, + filterKey = 'type', + filterValue: string | boolean = 'ALL' +): Promise { + const formattedBlock = { number: block.block.header.number.toNumber(), timestamp: block.timestamp } + await _stateSnapshotter(stateModel, snapshotModel, formattedBlock, fkReferenceName, filterKey, filterValue) +} + interface SnapshotEntity extends Entity { blockNumber?: number timestamp?: Date diff --git a/src/helpers/timekeeperService.ts b/src/helpers/timekeeperService.ts index 03ecfa71..17274b33 100644 --- a/src/helpers/timekeeperService.ts +++ b/src/helpers/timekeeperService.ts @@ -1,4 +1,3 @@ -import { SubstrateBlock } from '@subql/types' import { Timekeeper } from '../types' import { SNAPSHOT_INTERVAL_SECONDS } from '../config' @@ -11,20 +10,20 @@ export class TimekeeperService { } static init = async function (): Promise { - const lastPeriodStart = (await Timekeeper.get('global'))?.lastPeriodStart ?? new Date(0) + const lastPeriodStart = (await Timekeeper.get(chainId))?.lastPeriodStart ?? new Date(0) return new TimekeeperService(lastPeriodStart) } private _currentPeriodStart: Date public getCurrentPeriod = (): Date => this._currentPeriodStart - public processBlock = (block: SubstrateBlock): boolean => { - const blockPeriodStart = getPeriodStart(block.timestamp) + public processBlock = (timestamp: Date): boolean => { + const blockPeriodStart = getPeriodStart(timestamp) const isNewPeriod = blockPeriodStart.valueOf() > this._currentPeriodStart.valueOf() if (isNewPeriod) this._currentPeriodStart = blockPeriodStart return isNewPeriod } public update = async (blockPeriodStart: Date) => { - const timekeeper = new Timekeeper('global', blockPeriodStart) + const timekeeper = new Timekeeper(chainId, blockPeriodStart) await timekeeper.save() } } diff --git a/src/index.ts b/src/index.ts index 96c80da4..42518aa4 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,8 +9,8 @@ const ethNetworkProm = global.atob = atob global.getNodeChainId = async function () { - if(cfgChainIdProm) return (await cfgChainIdProm).toString(10) - if(ethNetworkProm) return (await ethNetworkProm).chainId.toString(10) + if (cfgChainIdProm) return (await cfgChainIdProm).toString(10) + if (ethNetworkProm) return (await ethNetworkProm).chainId.toString(10) } export * from './mappings/handlers/blockHandlers' @@ -21,3 +21,4 @@ export * from './mappings/handlers/proxyHandlers' export * from './mappings/handlers/ormlTokensHandlers' export * from './mappings/handlers/logHandlers' export * from './mappings/handlers/evmHandlers' +export * from './mappings/handlers/ethHandlers' diff --git a/src/mappings/handlers/blockHandlers.ts b/src/mappings/handlers/blockHandlers.ts index cab8d02f..545b19ef 100644 --- a/src/mappings/handlers/blockHandlers.ts +++ b/src/mappings/handlers/blockHandlers.ts @@ -1,7 +1,7 @@ import { SubstrateBlock } from '@subql/types' import { getPeriodStart, TimekeeperService } from '../../helpers/timekeeperService' import { errorHandler } from '../../helpers/errorHandler' -import { stateSnapshotter } from '../../helpers/stateSnapshot' +import { substrateStateSnapshotter } from '../../helpers/stateSnapshot' import { SNAPSHOT_INTERVAL_SECONDS } from '../../config' import { PoolService } from '../services/poolService' import { TrancheService } from '../services/trancheService' @@ -13,7 +13,7 @@ export const handleBlock = errorHandler(_handleBlock) async function _handleBlock(block: SubstrateBlock): Promise { const blockPeriodStart = getPeriodStart(block.timestamp) const blockNumber = block.block.header.number.toNumber() - const newPeriod = (await timekeeper).processBlock(block) + const newPeriod = (await timekeeper).processBlock(block.timestamp) if (newPeriod) { logger.info(`It's a new period on block ${blockNumber}: ${block.timestamp.toISOString()}`) @@ -60,9 +60,9 @@ async function _handleBlock(block: SubstrateBlock): Promise { } //Perform Snapshots and reset accumulators - await stateSnapshotter('Pool', 'PoolSnapshot', block, 'poolId', 'isActive', true) - await stateSnapshotter('Tranche', 'TrancheSnapshot', block, 'trancheId', 'isActive', true) - await stateSnapshotter('Loan', 'LoanSnapshot', block, 'loanId', 'isActive', true) + await substrateStateSnapshotter('Pool', 'PoolSnapshot', block, 'poolId', 'isActive', true) + await substrateStateSnapshotter('Tranche', 'TrancheSnapshot', block, 'trancheId', 'isActive', true) + await substrateStateSnapshotter('Loan', 'LoanSnapshot', block, 'loanId', 'isActive', true) //Update tracking of period and continue await (await timekeeper).update(blockPeriodStart) diff --git a/src/mappings/handlers/ethHandlers.ts b/src/mappings/handlers/ethHandlers.ts new file mode 100644 index 00000000..3a885be8 --- /dev/null +++ b/src/mappings/handlers/ethHandlers.ts @@ -0,0 +1,152 @@ +import { Loan, LoanStatus } from '../../types' +import { EthereumBlock } from '@subql/types-ethereum' +import { DAIMainnetAddress, tinlakePools } from '../../config' +import { errorHandler } from '../../helpers/errorHandler' +import { PoolService } from '../services/poolService' +import { CurrencyService } from '../services/currencyService' +import { BlockchainService } from '../services/blockchainService' +import { ShelfAbi__factory, NavfeedAbi__factory, ReserveAbi__factory, PileAbi__factory } from '../../types/contracts' +import { Provider } from '@ethersproject/providers' +import { TimekeeperService, getPeriodStart } from '../../helpers/timekeeperService' +import { LoanService } from '../services/loanService' +import { evmStateSnapshotter } from '../../helpers/stateSnapshot' + +const timekeeper = TimekeeperService.init() + +export const handleEthBlock = errorHandler(_handleEthBlock) +async function _handleEthBlock(block: EthereumBlock): Promise { + if (chainId == '1') { + const date = new Date(Number(block.timestamp) * 1000) + const blockNumber = block.number + const newPeriod = (await timekeeper).processBlock(date) + const blockPeriodStart = getPeriodStart(date) + + const blockchain = await BlockchainService.getOrInit('1') + const currency = await CurrencyService.getOrInitEvm(blockchain.id, DAIMainnetAddress) + + if (newPeriod) { + logger.info(`It's a new period on EVM block ${blockNumber}: ${date.toISOString()}`) + + // update pool states + for (const tinlakePool of tinlakePools) { + let pool + if (block.number >= tinlakePool.startBlock) { + pool = await PoolService.getOrSeed(tinlakePool.id) + if (block.number >= tinlakePool.startBlock && pool.totalReserve == null) { + pool.totalReserve = BigInt(0) + pool.portfolioValuation = BigInt(0) + pool.currency + pool.isActive = false + pool.currencyId = currency.id + await pool.save() + logger.info(`Initializing pool ${tinlakePool.id}`) + } + const latestNavFeed = getLatestContract(tinlakePool.navFeed, blockNumber) + if (latestNavFeed) { + const navFeedContract = NavfeedAbi__factory.connect(latestNavFeed.address, api as unknown as Provider) + pool.portfolioValuation = (await navFeedContract.currentNAV()).toBigInt() + await pool.save() + logger.info(`Updating pool ${tinlakePool.id} with portfolioValuation: ${pool.portfolioValuation}`) + } + const latestReserve = getLatestContract(tinlakePool.reserve, blockNumber) + if (latestReserve) { + const reserveContract = ReserveAbi__factory.connect(latestReserve.address, api as unknown as Provider) + pool.totalReserve = (await reserveContract.totalBalance()).toBigInt() + await pool.save() + logger.info(`Updating pool ${tinlakePool.id} with totalReserve: ${pool.totalReserve}`) + } + // Update loans + if (latestNavFeed) { + logger.info(`Updating loans for pool ${tinlakePool.id}`) + await updateLoans( + tinlakePool.id, + date, + tinlakePool.shelf[0].address, + tinlakePool.pile[0].address, + latestNavFeed.address + ) + } + } + } + + // Take snapshots + await evmStateSnapshotter('Pool', 'PoolSnapshot', block, 'poolId') + await evmStateSnapshotter('Loan', 'LoanSnapshot', block, 'loanId', 'isActive', true) + + //Update tracking of period and continue + await (await timekeeper).update(blockPeriodStart) + } + } +} + +async function updateLoans(poolId: string, blockDate: Date, shelf: string, pile: string, navFeed: string) { + let existingLoans = await LoanService.getByPoolId(poolId) + logger.info(`Existing loans for pool ${poolId}: ${existingLoans.length}`) + let loanIndex = existingLoans.length || 1 + const contractLoans = [] + // eslint-disable-next-line + while (true) { + logger.info(`Checking loan ${loanIndex} for pool ${poolId}`) + const shelfContract = ShelfAbi__factory.connect(shelf, api as unknown as Provider) + logger.info(`after shelfContract ${shelfContract}`) + let response + try { + response = await shelfContract.token(loanIndex) + logger.info(`after response ${response}`) + } catch (e) { + logger.info(`Error ${e}`) + break + } + if (!response || response.registry === '0x0000000000000000000000000000000000000000') { + logger.info(`No more loans for pool ${poolId}`) + // no more loans + break + } + contractLoans.push(loanIndex) + loanIndex++ + } + const newLoans = contractLoans.filter((loanIndex) => !existingLoans.includes(loanIndex)) + // create new loans + for (const loanIndex of newLoans) { + const loan = new Loan(`${poolId}-${loanIndex}`, blockDate, poolId, true, LoanStatus.CREATED) + + const navFeedContract = NavfeedAbi__factory.connect(navFeed, api as unknown as Provider) + const nftId = await navFeedContract['nftID(uint256)'](loanIndex) + const maturityDate = await navFeedContract.maturityDate(nftId) + loan.actualMaturityDate = new Date(Number(maturityDate) * 1000) + loan.save() + } + + // update all loans + existingLoans = await LoanService.getByPoolId(poolId) + for (const loan of existingLoans) { + const shelfContract = ShelfAbi__factory.connect(shelf, api as unknown as Provider) + const loanIndex = loan.id.split('-')[1] + const nftLocked = await shelfContract.nftLocked(loanIndex) + if (!nftLocked) { + loan.isActive = false + loan.status = LoanStatus.CLOSED + loan.save() + } + const pileContract = PileAbi__factory.connect(pile, api as unknown as Provider) + const prevDebt = loan.outstandingDebt + const debt = await pileContract.debt(loanIndex) + loan.outstandingDebt = debt.toBigInt() + const rateGroup = await pileContract.loanRates(loanIndex) + const rates = await pileContract.rates(rateGroup) + loan.interestRatePerSec = rates.ratePerSecond.toBigInt() + + if (prevDebt > loan.outstandingDebt) { + loan.repaidAmountByPeriod = prevDebt - loan.outstandingDebt + } + loan.save() + } +} + +function getLatestContract(contractArray, blockNumber) { + return contractArray.reduce( + (prev, current) => + current.startBlock <= blockNumber && current.startBlock > (prev?.startBlock || 0) ? current : prev, + null + ) +} diff --git a/src/mappings/handlers/evmHandlers.ts b/src/mappings/handlers/evmHandlers.ts index 5c4661a1..2f0008ad 100644 --- a/src/mappings/handlers/evmHandlers.ts +++ b/src/mappings/handlers/evmHandlers.ts @@ -10,7 +10,7 @@ import { CurrencyService } from '../services/currencyService' import { BlockchainService } from '../services/blockchainService' import { CurrencyBalanceService } from '../services/currencyBalanceService' import { InvestmentManagerAbi__factory, PoolManagerAbi__factory } from '../../types/contracts' -import type { Provider } from '@ethersproject/abstract-provider' +import { Provider } from '@ethersproject/providers' import { TrancheBalanceService } from '../services/trancheBalanceService' const ethApi = api as unknown as Provider diff --git a/src/mappings/services/loanService.ts b/src/mappings/services/loanService.ts index 99727bbe..e5803d69 100644 --- a/src/mappings/services/loanService.ts +++ b/src/mappings/services/loanService.ts @@ -8,8 +8,10 @@ import { ActiveLoanData } from './poolService' export class LoanService extends Loan { static init(poolId: string, loanId: string, nftClassId: bigint, nftItemId: bigint, timestamp: Date) { logger.info(`Initialising loan ${loanId} for pool ${poolId}`) - const loan = new this(`${poolId}-${loanId}`, timestamp, nftClassId, nftItemId, poolId, false, LoanStatus.CREATED) + const loan = new this(`${poolId}-${loanId}`, timestamp, poolId, false, LoanStatus.CREATED) + loan.collateralNftClassId = nftClassId + loan.collateralNftItemId = nftItemId loan.outstandingPrincipal = BigInt(0) loan.outstandingInterest = BigInt(0) loan.outstandingDebt = BigInt(0) diff --git a/yarn.lock b/yarn.lock index b497c60b..a3c51625 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2624,17 +2624,10 @@ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@pkgr/utils@^2.4.2": - version "2.4.2" - resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.2.tgz#9e638bbe9a6a6f165580dc943f138fd3309a2cbc" - integrity sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw== - dependencies: - cross-spawn "^7.0.3" - fast-glob "^3.3.0" - is-glob "^4.0.3" - open "^9.1.0" - picocolors "^1.0.0" - tslib "^2.6.0" +"@pkgr/core@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.1.0.tgz#7d8dacb7fdef0e4387caf7396cbd77f179867d06" + integrity sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ== "@polkadot/api-augment@10.11.2": version "10.11.2" @@ -3592,9 +3585,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.20.4" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + version "7.20.5" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" @@ -3789,15 +3782,15 @@ "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.15.0.tgz#b0b3e15fa8c3e67ed4386b765cc0ba98ad3a303b" - integrity sha512-j5qoikQqPccq9QoBAupOP+CBu8BaJ8BLjaXSioDISeTZkVO3ig7oSIKh3H+rEpee7xCXtWwSB4KIL5l6hWZzpg== + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz#dfc38f790704ba8a54a1277c51efdb489f6ecf9f" + integrity sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/type-utils" "6.15.0" - "@typescript-eslint/utils" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/scope-manager" "6.17.0" + "@typescript-eslint/type-utils" "6.17.0" + "@typescript-eslint/utils" "6.17.0" + "@typescript-eslint/visitor-keys" "6.17.0" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -3806,71 +3799,72 @@ ts-api-utils "^1.0.1" "@typescript-eslint/parser@^6.15.0", "@typescript-eslint/parser@^6.7.5": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.15.0.tgz#1af69741cfa314a13c1434d0bdd5a0c3096699d7" - integrity sha512-MkgKNnsjC6QwcMdlNAel24jjkEO/0hQaMDLqP4S9zq5HBAUJNQB6y+3DwLjX7b3l2b37eNAxMPLwb3/kh8VKdA== - dependencies: - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.17.0.tgz#8cd7a0599888ca6056082225b2fdf9a635bf32a1" + integrity sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A== + dependencies: + "@typescript-eslint/scope-manager" "6.17.0" + "@typescript-eslint/types" "6.17.0" + "@typescript-eslint/typescript-estree" "6.17.0" + "@typescript-eslint/visitor-keys" "6.17.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.15.0.tgz#40e5214a3e9e048aca55ce33381bc61b6b51c32a" - integrity sha512-+BdvxYBltqrmgCNu4Li+fGDIkW9n//NrruzG9X1vBzaNK+ExVXPoGB71kneaVw/Jp+4rH/vaMAGC6JfMbHstVg== +"@typescript-eslint/scope-manager@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz#70e6c1334d0d76562dfa61aed9009c140a7601b4" + integrity sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.17.0" + "@typescript-eslint/visitor-keys" "6.17.0" -"@typescript-eslint/type-utils@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.15.0.tgz#c22261bd00566821a300d08f4632533a8f9bed01" - integrity sha512-CnmHKTfX6450Bo49hPg2OkIm/D/TVYV7jO1MCfPYGwf6x3GO0VU8YMO5AYMn+u3X05lRRxA4fWCz87GFQV6yVQ== +"@typescript-eslint/type-utils@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz#5febad3f523e393006614cbda28b826925b728d5" + integrity sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg== dependencies: - "@typescript-eslint/typescript-estree" "6.15.0" - "@typescript-eslint/utils" "6.15.0" + "@typescript-eslint/typescript-estree" "6.17.0" + "@typescript-eslint/utils" "6.17.0" debug "^4.3.4" ts-api-utils "^1.0.1" -"@typescript-eslint/types@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.15.0.tgz#a9f7b006aee52b0948be6e03f521814bf435ddd5" - integrity sha512-yXjbt//E4T/ee8Ia1b5mGlbNj9fB9lJP4jqLbZualwpP2BCQ5is6BcWwxpIsY4XKAhmdv3hrW92GdtJbatC6dQ== +"@typescript-eslint/types@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.17.0.tgz#844a92eb7c527110bf9a7d177e3f22bd5a2f40cb" + integrity sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A== -"@typescript-eslint/typescript-estree@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.15.0.tgz#2f8a513df1ce5e6e1ba8e5c6aa52f392ae023fc5" - integrity sha512-7mVZJN7Hd15OmGuWrp2T9UvqR2Ecg+1j/Bp1jXUEY2GZKV6FXlOIoqVDmLpBiEiq3katvj/2n2mR0SDwtloCew== +"@typescript-eslint/typescript-estree@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz#b913d19886c52d8dc3db856903a36c6c64fd62aa" + integrity sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg== dependencies: - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/visitor-keys" "6.15.0" + "@typescript-eslint/types" "6.17.0" + "@typescript-eslint/visitor-keys" "6.17.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" + minimatch "9.0.3" semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.15.0.tgz#f80dbb79f3b0f569077a8711dd44186a8933fa4c" - integrity sha512-eF82p0Wrrlt8fQSRL0bGXzK5nWPRV2dYQZdajcfzOD9+cQz9O7ugifrJxclB+xVOvWvagXfqS4Es7vpLP4augw== +"@typescript-eslint/utils@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.17.0.tgz#f2b16d4c9984474656c420438cdede7eccd4079e" + integrity sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.15.0" - "@typescript-eslint/types" "6.15.0" - "@typescript-eslint/typescript-estree" "6.15.0" + "@typescript-eslint/scope-manager" "6.17.0" + "@typescript-eslint/types" "6.17.0" + "@typescript-eslint/typescript-estree" "6.17.0" semver "^7.5.4" -"@typescript-eslint/visitor-keys@6.15.0": - version "6.15.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.15.0.tgz#5baf97a7bfeec6f4894d400437055155a46b2330" - integrity sha512-1zvtdC1a9h5Tb5jU9x3ADNXO9yjP8rXlaoChu0DQX40vf5ACVpYIVIZhIMZ6d5sDXH7vq4dsZBT1fEGj8D2n2w== +"@typescript-eslint/visitor-keys@6.17.0": + version "6.17.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz#3ed043709c39b43ec1e58694f329e0b0430c26b6" + integrity sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg== dependencies: - "@typescript-eslint/types" "6.15.0" + "@typescript-eslint/types" "6.17.0" eslint-visitor-keys "^3.4.1" "@ungap/structured-clone@^1.2.0": @@ -4493,11 +4487,6 @@ bech32@1.1.4, bech32@^1.1.4: resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== -big-integer@^1.6.44: - version "1.6.52" - resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.52.tgz#60a887f3047614a8e1bffe5d7173490a97dc8c85" - integrity sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg== - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -4567,13 +4556,6 @@ boxen@5.1.2, boxen@^5.0.0: widest-line "^3.1.0" wrap-ansi "^7.0.0" -bplist-parser@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" - integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== - dependencies: - big-integer "^1.6.44" - brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -4733,13 +4715,6 @@ bufferutil@^4.0.1: dependencies: node-gyp-build "^4.3.0" -bundle-name@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" - integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== - dependencies: - run-applescript "^5.0.0" - cacheable-request@^6.0.0: version "6.1.0" resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" @@ -5419,24 +5394,6 @@ deepmerge@4.3.1, deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== -default-browser-id@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" - integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== - dependencies: - bplist-parser "^0.2.0" - untildify "^4.0.0" - -default-browser@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" - integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== - dependencies: - bundle-name "^3.0.0" - default-browser-id "^3.0.0" - execa "^7.1.1" - titleize "^3.0.0" - defaults@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.4.tgz#b0b02062c1e2aa62ff5d9528f0f98baa90978d7a" @@ -5458,11 +5415,6 @@ define-data-property@^1.0.1: gopd "^1.0.1" has-property-descriptors "^1.0.0" -define-lazy-prop@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" - integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== - define-properties@^1.1.3: version "1.2.1" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" @@ -5759,12 +5711,12 @@ eslint-config-prettier@^9.1.0: integrity sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw== eslint-plugin-prettier@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz#a3b399f04378f79f066379f544e42d6b73f11515" - integrity sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg== + version "5.1.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.1.2.tgz#584c94d4bf31329b2d4cbeb10fd600d17d6de742" + integrity sha512-dhlpWc9vOwohcWmClFcA+HjlvUpuyynYs0Rf+L/P6/0iQE6vlHW9l5bkfzN62/Stm9fbq8ku46qzde76T1xlSg== dependencies: prettier-linter-helpers "^1.0.0" - synckit "^0.8.5" + synckit "^0.8.6" eslint-scope@5.1.1: version "5.1.1" @@ -5951,7 +5903,7 @@ evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: md5.js "^1.3.4" safe-buffer "^5.1.1" -execa@7.2.0, execa@^7.1.1: +execa@7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== @@ -6042,7 +5994,7 @@ fast-fifo@^1.0.0: resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== -fast-glob@^3.2.9, fast-glob@^3.3.0: +fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== @@ -7079,11 +7031,6 @@ is-docker@^2.0.0: resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== -is-docker@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" - integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== - is-electron@^2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.2.tgz#3778902a2044d76de98036f5dc58089ac4d80bb9" @@ -7121,13 +7068,6 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: dependencies: is-extglob "^2.1.1" -is-inside-container@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" - integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== - dependencies: - is-docker "^3.0.0" - is-installed-globally@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.4.0.tgz#9a0fd407949c30f86eb6959ef1b7994ed0b7b520" @@ -8377,6 +8317,13 @@ minimatch@5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@9.0.3, minimatch@^9.0.1: + version "9.0.3" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" @@ -8391,13 +8338,6 @@ minimatch@^5.0.1: dependencies: brace-expansion "^2.0.1" -minimatch@^9.0.1: - version "9.0.3" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimist-options@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" @@ -8678,9 +8618,9 @@ npm-run-path@^4.0.1: path-key "^3.0.0" npm-run-path@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.1.0.tgz#bc62f7f3f6952d9894bd08944ba011a6ee7b7e00" - integrity sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q== + version "5.2.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-5.2.0.tgz#224cdd22c755560253dd71b83a1ef2f758b2e955" + integrity sha512-W4/tgAXFqFA0iL7fk0+uQ3g7wkL8xJmx3XdK0VGb4cHW//eZTtKGvFBBoRKVTpY7n6ze4NL9ly7rgXcHufqXKg== dependencies: path-key "^4.0.0" @@ -8734,16 +8674,6 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -open@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" - integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== - dependencies: - default-browser "^4.0.0" - define-lazy-prop "^3.0.0" - is-inside-container "^1.0.0" - is-wsl "^2.2.0" - optionator@^0.9.3: version "0.9.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" @@ -9467,13 +9397,6 @@ rotating-file-stream@^3.0.2: resolved "https://registry.yarnpkg.com/rotating-file-stream/-/rotating-file-stream-3.2.1.tgz#1d0a536d75884eedc3a677f5b0871fdc69f97d22" integrity sha512-n2B18CJb+n2VA5Tdle+1NP2toEcRv68CjAOBjHmwcyswNwMVsrN3gVRZ9ymH3sapaiGY8jc9OhhV5b6I5rAeiA== -run-applescript@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" - integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== - dependencies: - execa "^5.0.0" - run-async@^2.2.0, run-async@^2.3.0, run-async@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" @@ -10008,12 +9931,12 @@ symbol-observable@^2.0.3: resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== -synckit@^0.8.5: - version "0.8.6" - resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.6.tgz#b69b7fbce3917c2673cbdc0d87fb324db4a5b409" - integrity sha512-laHF2savN6sMeHCjLRkheIU4wo3Zg9Ln5YOjOo7sZ5dVQW8yF5pPE5SIw1dsPhq3TRp1jisKRCdPhfs/1WMqDA== +synckit@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.8.tgz#fe7fe446518e3d3d49f5e429f443cf08b6edfcd7" + integrity sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ== dependencies: - "@pkgr/utils" "^2.4.2" + "@pkgr/core" "^0.1.0" tslib "^2.6.2" table-layout@^1.0.2: @@ -10137,11 +10060,6 @@ timers-ext@^0.1.7: es5-ext "~0.10.46" next-tick "1" -titleize@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" - integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== - tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -10286,7 +10204,7 @@ tslib@^1.10.0, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.0, tslib@^2.6.2: +tslib@^2.0.0, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.1, tslib@^2.5.0, tslib@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== @@ -10448,11 +10366,6 @@ universalify@^2.0.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - update-browserslist-db@^1.0.13: version "1.0.13" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" @@ -10626,9 +10539,9 @@ wcwidth@^1.0.1: defaults "^1.0.3" web-streams-polyfill@^3.0.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz#71c2718c52b45fd49dbeee88634b3a60ceab42a6" - integrity sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q== + version "3.3.2" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.2.tgz#32e26522e05128203a7de59519be3c648004343b" + integrity sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ== webidl-conversions@^3.0.0: version "3.0.1" @@ -10799,9 +10712,9 @@ ws@^7: integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== ws@^8.15.1, ws@^8.8.1: - version "8.15.1" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.15.1.tgz#271ba33a45ca0cc477940f7f200cd7fba7ee1997" - integrity sha512-W5OZiCjXEmk0yZ66ZN82beM5Sz7l7coYxpRkzS+p9PP+ToQry8szKh+61eNktr7EA9DOwvFGhfC605jDHbP6QQ== + version "8.16.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" + integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== xdg-basedir@^4.0.0: version "4.0.0"