├── .gitignore ├── .vscode └── launch.json ├── README.md ├── config.example.json ├── ecosystem.config.js ├── license.txt ├── package.json ├── prisma ├── migrations │ ├── 20231224075924_ │ │ └── migration.sql │ └── migration_lock.toml └── schema.prisma ├── src ├── chain-specific │ └── osmosis │ │ └── osmosis-1.assetlist.json ├── config.ts ├── db.ts ├── helpers.ts ├── index.ts ├── integrations │ ├── coingecko.ts │ ├── icns.ts │ ├── telegram.ts │ ├── tokens.ts │ └── validators.ts ├── messages │ ├── index.ts │ ├── msgBeginRedelegate.ts │ ├── msgCreatePosition.ts │ ├── msgDelegate.ts │ ├── msgExec.ts │ ├── msgExecuteContract.ts │ ├── msgJoinExitPool.ts │ ├── msgSend.ts │ ├── msgSwapExactAmount.ts │ ├── msgUndelegate.ts │ └── msgWithdrawPosition.ts └── types.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | config.json 2 | config1.json 3 | catsdb.acebase/ 4 | config/secrets.json 5 | dump.json 6 | src1/ 7 | build/ 8 | src/debug.ts 9 | prisma/catsdb.* 10 | configDump.json 11 | 12 | # Logs 13 | logs 14 | *.log 15 | npm-debug.log* 16 | yarn-debug.log* 17 | yarn-error.log* 18 | lerna-debug.log* 19 | .pnpm-debug.log* 20 | 21 | # Diagnostic reports (https://nodejs.org/api/report.html) 22 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 23 | 24 | # Runtime data 25 | pids 26 | *.pid 27 | *.seed 28 | *.pid.lock 29 | 30 | # Directory for instrumented libs generated by jscoverage/JSCover 31 | lib-cov 32 | 33 | # Coverage directory used by tools like istanbul 34 | coverage 35 | *.lcov 36 | 37 | # nyc test coverage 38 | .nyc_output 39 | 40 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 41 | .grunt 42 | 43 | # Bower dependency directory (https://bower.io/) 44 | bower_components 45 | 46 | # node-waf configuration 47 | .lock-wscript 48 | 49 | # Compiled binary addons (https://nodejs.org/api/addons.html) 50 | build/Release 51 | 52 | # Dependency directories 53 | node_modules/ 54 | jspm_packages/ 55 | 56 | # Snowpack dependency directory (https://snowpack.dev/) 57 | web_modules/ 58 | 59 | # TypeScript cache 60 | *.tsbuildinfo 61 | 62 | # Optional npm cache directory 63 | .npm 64 | 65 | # Optional eslint cache 66 | .eslintcache 67 | 68 | # Optional stylelint cache 69 | .stylelintcache 70 | 71 | # Microbundle cache 72 | .rpt2_cache/ 73 | .rts2_cache_cjs/ 74 | .rts2_cache_es/ 75 | .rts2_cache_umd/ 76 | 77 | # Optional REPL history 78 | .node_repl_history 79 | 80 | # Output of 'npm pack' 81 | *.tgz 82 | 83 | # Yarn Integrity file 84 | .yarn-integrity 85 | 86 | # dotenv environment variable files 87 | .env 88 | .env.development.local 89 | .env.test.local 90 | .env.production.local 91 | .env.local 92 | 93 | # parcel-bundler cache (https://parceljs.org/) 94 | .cache 95 | .parcel-cache 96 | 97 | # Next.js build output 98 | .next 99 | out 100 | 101 | # Nuxt.js build / generate output 102 | .nuxt 103 | dist 104 | 105 | # Gatsby files 106 | .cache/ 107 | # Comment in the public line in if your project uses Gatsby and not Next.js 108 | # https://nextjs.org/blog/next-9-1#public-directory-support 109 | # public 110 | 111 | # vuepress build output 112 | .vuepress/dist 113 | 114 | # vuepress v2.x temp and cache directory 115 | .temp 116 | .cache 117 | 118 | # Docusaurus cache and generated files 119 | .docusaurus 120 | 121 | # Serverless directories 122 | .serverless/ 123 | 124 | # FuseBox cache 125 | .fusebox/ 126 | 127 | # DynamoDB Local files 128 | .dynamodb/ 129 | 130 | # TernJS port file 131 | .tern-port 132 | 133 | # Stores VSCode versions used for testing VSCode extensions 134 | .vscode-test 135 | 136 | # yarn v2 137 | .yarn/cache 138 | .yarn/unplugged 139 | .yarn/build-state.yml 140 | .yarn/install-state.gz 141 | .pnp.* -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Debug", 11 | "program": "${workspaceFolder}/src/debug.ts", 12 | "runtimeExecutable": "ts-node" 13 | }, 14 | { 15 | "type": "node", 16 | "request": "launch", 17 | "name": "Index", 18 | "program": "${workspaceFolder}/src/index.ts", 19 | "runtimeExecutable": "ts-node" 20 | } 21 | ] 22 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Whale Cat for Cosmos Cats 2 | 3 | Cosmos cats community https://t.me/cosmoscats 4 | 5 | Deployed version https://t.me/cosmos_whalecat 6 | 7 | ## Run bot 8 | 9 | 1. Rename config.example.json to config.json and 10 | - specify env to "prod" 11 | - your telegram bot token 12 | - @channel to send notifications 13 | - set env to "test" if you don't want to send notifications to telegram. Useful on switching environments. 14 | 15 | 1.1 - Config: you can assign custom amount for each denom by adding, also you can add any network presented in chain-registry. It will populated into db ONLY if notifydenom table is empty 16 | 17 | ``` 18 | "msgAmounts": { 19 | "msgSwapExactAmountInOut": 1000000000000000 20 | } 21 | ``` 22 | 23 | 1.2 Alternatively, you can go to ```your_ip:5555```, find notifydenom table and edit triggers to notify. 24 | 25 | **network** is network name, as mentioned in https://github.com/cosmos/chain-registry 26 | 27 | **identifier** is a denom in that network or contract address 28 | 29 | **amount** is a number of tokens multiplied by 10^decimals 30 | 31 | **msg** is a trigger name (see below). If it's null, it means that amount relates to all other msg types. 32 | 33 | Example: that means you assign 5 osmo for all actions, but you want to see delegates > 1 osmo and undelegates > 2 osmo 34 | 35 | osmosis | uosmo | 1000000 | msgDelegate 36 | 37 | osmosis | uosmo | 2000000 | msgUndelegate 38 | 39 | osmosis | uosmo | 5000000 | null 40 | 41 | Supported msg types 42 | 43 | - msgSwapExactAmountInOut (osmosis in/out swaps) 44 | - msgDelegate 45 | - msgExecuteContract (cw-20 send) 46 | - msgSend 47 | - msgUndelegate 48 | - msgBeginRedelegate 49 | - msgJoinPool (osmosis add to pool) 50 | - msgExitPool (osmosis remove from pool) 51 | - msgCreatePosition (osmosis add to ranged pool) 52 | - msgWithdrawPosition (osmosis remove from ranged pool) 53 | 54 | 2. To run bot and studio 55 | 56 | ```sh 57 | sudo apt install sqlite3 58 | yarn install 59 | tsc 60 | npx prisma migrate dev 61 | pm2 start ecosystem.config.js 62 | ``` 63 | 64 | - Or you can run it with `ts-node src/index`. To run studio use `npx prisma studio` 65 | -------------------------------------------------------------------------------- /config.example.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": "prod", 3 | "token": "1231231212:Qwertyuiopasdfghjkl;xcvbnm1234567890", 4 | "channel": "@channel", 5 | "networks": [ 6 | { 7 | "name": "cosmoshub", 8 | "notifyDenoms": [ 9 | { 10 | "identifier": "uatom", 11 | "coingeckoId": "cosmos", 12 | "amount": 50000000000, 13 | "msgAmounts": { 14 | "msgDelegate": 10000000000, 15 | "msgUndelegate": 10000000000 16 | } 17 | } 18 | ] 19 | }, 20 | { 21 | "name": "osmosis", 22 | "notifyDenoms": [ 23 | { 24 | "identifier": "uosmo", 25 | "coingeckoId": "osmosis", 26 | "amount": 250000000000, 27 | "msgAmounts": { 28 | "msgDelegate": 50000000000, 29 | "msgUndelegate": 50000000000 30 | } 31 | }, 32 | { 33 | "identifier": "uion", 34 | "coingeckoId": "ion", 35 | "amount": 25000000 36 | }, 37 | { 38 | "identifier": "ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2", 39 | "coingeckoId": "cosmos", 40 | "amount": 50000000000 41 | }, 42 | { 43 | "identifier": "ibc/D189335C6E4A68B513C10AB227BF1C1D38C746766278BA3EEB4FB14124F1D858", 44 | "coingeckoId": "usd-coin", 45 | "amount": 100000000000 46 | }, 47 | { 48 | "identifier": "ibc/EA1D43981D5C9A1C4AAEA9C23BB1D4FA126BA9BC7020A25E0AE4AA841EA25DC5", 49 | "coingeckoId": "ethereum", 50 | "amount": 10000000000000000000000000 51 | }, 52 | { 53 | "identifier": "ibc/C140AFD542AE77BD7DCC83F13FDD8C5E5BB8C4929785E6EC2F4C636F98F17901", 54 | "coingeckoId": "cosmos", 55 | "amount": 2500000000 56 | }, 57 | { 58 | "identifier": "ibc/46B44899322F3CD854D2D46DEEF881958467CDD4B3B10086DA49296BBED94BED", 59 | "coingeckoId": "juno-network", 60 | "amount": 5000000000 61 | }, 62 | { 63 | "identifier": "ibc/6AE98883D4D5D5FF9E50D7130F1305DA2FFA0C652D1DD9C123657C6B4EB2DF8A", 64 | "coingeckoId": "evmos", 65 | "amount": 29000000000000000000000 66 | }, 67 | { 68 | "identifier": "ibc/0954E1C28EB7AF5B72D24F3BC2B47BBB2FDF91BDDFD57B74B99E133AED40972A", 69 | "coingeckoId": "secret", 70 | "amount": 10000000000 71 | } 72 | ] 73 | }, 74 | { 75 | "name": "juno", 76 | "notifyDenoms": [ 77 | { 78 | "identifier": "ujuno", 79 | "amount": 50000000000, 80 | "coingeckoId": "juno-network", 81 | "msgAmounts": { 82 | "msgDelegate": 20000000000, 83 | "msgUndelegate": 20000000000 84 | } 85 | }, 86 | { 87 | "identifier": "juno168ctmpyppk90d34p3jjy658zf5a5l3w8wk35wht6ccqj4mr0yv8s4j5awr", 88 | "amount": 25000000, 89 | "coingeckoId": "neta", 90 | "msgAmounts": { 91 | "msgExecuteContract": 20000000, 92 | "msgDelegate": 5000000, 93 | "msgUndelegate": 5000000 94 | } 95 | } 96 | ] 97 | }, 98 | { 99 | "name": "evmos", 100 | "notifyDenoms": [ 101 | { 102 | "identifier": "aevmos", 103 | "coingeckoId": "evmos", 104 | "amount": 50000000000000000000000, 105 | "msgAmounts": { 106 | "msgDelegate": 50000000000000000000000, 107 | "msgUndelegate": 50000000000000000000000 108 | } 109 | } 110 | ] 111 | }, 112 | { 113 | "name": "kujira", 114 | "notifyDenoms": [ 115 | { 116 | "identifier": "ukuji", 117 | "coingeckoId": "kujira", 118 | "amount": 100000000000 119 | } 120 | ] 121 | }, 122 | { 123 | "name": "umee", 124 | "notifyDenoms": [ 125 | { 126 | "identifier": "uumee", 127 | "coingeckoId": "umee", 128 | "amount": 1000000000000 129 | } 130 | ] 131 | }, 132 | { 133 | "name": "crescent", 134 | "notifyDenoms": [ 135 | { 136 | "identifier": "ucre", 137 | "coingeckoId": "crescent-network", 138 | "amount": 100000000000 139 | }, 140 | { 141 | "identifier": "ubcre", 142 | "coingeckoId": "liquid-staking-crescent", 143 | "amount": 100000000000 144 | } 145 | ] 146 | } 147 | ] 148 | } -------------------------------------------------------------------------------- /ecosystem.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | apps: [{ 3 | name: "catsbot", 4 | script: "./build/src/index.js", 5 | error_file: "catsbot-err.log", 6 | out_file: "catsbot-out.log" 7 | }, { 8 | name: "db", 9 | script: "npm", 10 | args: "run db", 11 | error_file: "catsbot-dberr.log", 12 | out_file: "catsbot-db.log" 13 | }] 14 | } 15 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "catsbot", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "license": "MIT", 6 | "scripts": { 7 | "db": "npx prisma studio" 8 | }, 9 | "dependencies": { 10 | "@cosmjs/cosmwasm-stargate": "0.32.0", 11 | "@cosmjs/encoding": "^0.32.1", 12 | "@cosmjs/proto-signing": "0.32.0", 13 | "@cosmjs/stargate": "0.32.0", 14 | "@prisma/client": "5.7.1", 15 | "@types/express": "^4.17.21", 16 | "big.js": "^6.2.1", 17 | "chain-registry": "latest", 18 | "cosmjs-types": "^0.9.0", 19 | "cosmos-indexer": "https://github.com/seleniumforest/cosmos-indexer", 20 | "express": "^4.18.1", 21 | "global": "^4.4.0", 22 | "lodash": "^4.17.21", 23 | "osmojs": "16.5.1", 24 | "read-last-lines": "^1.8.0", 25 | "telegraf": "^4.8.6", 26 | "timespan-ts": "^1.0.3", 27 | "ts-node": "^10.9.2" 28 | }, 29 | "devDependencies": { 30 | "@types/big.js": "^6.2.2", 31 | "@types/lodash": "^4.14.202", 32 | "prisma": "^5.7.1", 33 | "typescript": "^5.3.3" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /prisma/migrations/20231224075924_/migration.sql: -------------------------------------------------------------------------------- 1 | -- CreateTable 2 | CREATE TABLE "Block" ( 3 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 4 | "network" TEXT NOT NULL, 5 | "height" INTEGER NOT NULL, 6 | "time" DATETIME NOT NULL 7 | ); 8 | 9 | -- CreateTable 10 | CREATE TABLE "Token" ( 11 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 12 | "network" TEXT NOT NULL, 13 | "identifier" TEXT NOT NULL, 14 | "decimals" INTEGER NOT NULL, 15 | "ticker" TEXT NOT NULL, 16 | "coingeckoId" TEXT 17 | ); 18 | 19 | -- CreateTable 20 | CREATE TABLE "Validator" ( 21 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 22 | "network" TEXT NOT NULL, 23 | "moniker" TEXT NOT NULL, 24 | "address" TEXT NOT NULL, 25 | "savedDate" DATETIME NOT NULL 26 | ); 27 | 28 | -- CreateTable 29 | CREATE TABLE "Price" ( 30 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 31 | "coingeckoId" TEXT NOT NULL, 32 | "priceUsd" REAL NOT NULL, 33 | "savedDate" DATETIME NOT NULL 34 | ); 35 | 36 | -- CreateTable 37 | CREATE TABLE "NotifyDenom" ( 38 | "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 39 | "network" TEXT NOT NULL, 40 | "identifier" TEXT NOT NULL, 41 | "amount" TEXT NOT NULL, 42 | "msg" TEXT 43 | ); 44 | 45 | -- CreateIndex 46 | CREATE UNIQUE INDEX "Block_network_key" ON "Block"("network"); 47 | 48 | -- CreateIndex 49 | CREATE UNIQUE INDEX "Block_height_key" ON "Block"("height"); 50 | 51 | -- CreateIndex 52 | CREATE UNIQUE INDEX "Token_identifier_key" ON "Token"("identifier"); 53 | 54 | -- CreateIndex 55 | CREATE UNIQUE INDEX "Validator_address_key" ON "Validator"("address"); 56 | 57 | -- CreateIndex 58 | CREATE UNIQUE INDEX "Price_coingeckoId_key" ON "Price"("coingeckoId"); 59 | -------------------------------------------------------------------------------- /prisma/migrations/migration_lock.toml: -------------------------------------------------------------------------------- 1 | # Please do not edit this file manually 2 | # It should be added in your version-control system (i.e. Git) 3 | provider = "sqlite" -------------------------------------------------------------------------------- /prisma/schema.prisma: -------------------------------------------------------------------------------- 1 | // This is your Prisma schema file, 2 | // learn more about it in the docs: https://pris.ly/d/prisma-schema 3 | 4 | generator client { 5 | provider = "prisma-client-js" 6 | } 7 | 8 | datasource db { 9 | provider = "sqlite" 10 | url = "file:./catsdb.db" 11 | } 12 | 13 | model Block { 14 | id Int @id @default(autoincrement()) 15 | network String @unique 16 | height Int @unique 17 | time DateTime 18 | } 19 | 20 | model Token { 21 | id Int @id @default(autoincrement()) 22 | network String 23 | identifier String @unique 24 | decimals Int 25 | ticker String 26 | coingeckoId String? 27 | } 28 | 29 | model Validator { 30 | id Int @id @default(autoincrement()) 31 | network String 32 | moniker String 33 | address String @unique 34 | savedDate DateTime 35 | } 36 | 37 | model Price { 38 | id Int @id @default(autoincrement()) 39 | coingeckoId String @unique 40 | priceUsd Float 41 | savedDate DateTime 42 | } 43 | 44 | model NotifyDenom { 45 | id Int @id @default(autoincrement()) 46 | network String 47 | identifier String 48 | amount String 49 | msg String? 50 | } 51 | -------------------------------------------------------------------------------- /src/config.ts: -------------------------------------------------------------------------------- 1 | import { TimeSpan } from "timespan-ts"; 2 | import cfg from "../config.json"; 3 | import { prisma } from "./db"; 4 | import * as fs from 'fs'; 5 | import * as _ from "lodash"; 6 | import { MsgTypes } from "./types"; 7 | 8 | export async function configReady() { 9 | const denomsCount = await prisma.notifyDenom.count(); 10 | if (denomsCount === 0) 11 | await populateConfigIntoDb(); 12 | 13 | setInterval(dumpConfig, TimeSpan.fromDays(1).totalMilliseconds); 14 | await dumpConfig(); 15 | return true; 16 | } 17 | 18 | async function dumpConfig() { 19 | let denoms = await prisma.notifyDenom.findMany(); 20 | fs.writeFileSync("./configDump.json", JSON.stringify(denoms, null, 4)); 21 | } 22 | 23 | export function getConfig() { 24 | return cfg; 25 | } 26 | 27 | export async function getNetworks() { 28 | let networks = await prisma.notifyDenom.findMany({ 29 | select: { network: true }, 30 | distinct: ["network"] 31 | }); 32 | 33 | return networks.filter(x => x.network).map(x => x.network); 34 | } 35 | 36 | export async function getCoingeckoIds() { 37 | let denoms = await prisma.notifyDenom.findMany({}); 38 | let tokens = await prisma.token.findMany({}); 39 | 40 | let result = denoms 41 | .map(x => tokens.find(t => t.identifier === x.identifier)?.coingeckoId) 42 | .filter(x => x); 43 | 44 | return [...new Set([...result, ...tokens.filter(x => x.network === "osmosis").map(x => x && x.coingeckoId)])]; 45 | } 46 | 47 | export async function getNotifyDenomsWithMeta() { 48 | let denoms = await prisma.notifyDenom.findMany({}); 49 | let tokens = await prisma.token.findMany({}); 50 | 51 | return denoms.map(x => ({ 52 | ...x, 53 | ...tokens.find(t => t.identifier === x.identifier) 54 | })) 55 | } 56 | 57 | async function populateConfigIntoDb() { 58 | let config = cfg as unknown as any; 59 | for (const network of config.networks) { 60 | for (const denomData of network.notifyDenoms) { 61 | if (!denomData.msgAmounts) { 62 | await prisma.notifyDenom.create({ 63 | data: { 64 | network: network.name, 65 | amount: denomData.amount.toString(), 66 | identifier: denomData.identifier, 67 | } 68 | }) 69 | continue; 70 | } 71 | 72 | for (const msg of Object.entries(denomData.msgAmounts)) { 73 | if (!msg[0] || !msg[1]) { 74 | throw new Error(`incorrect msg config in ${network.name}.msgAmounts section`); 75 | } 76 | 77 | await prisma.notifyDenom.create({ 78 | data: { 79 | network: network.name, 80 | amount: (msg[1] as any).toString(), 81 | identifier: denomData.identifier, 82 | msg: msg[0] 83 | } 84 | }) 85 | } 86 | 87 | await prisma.notifyDenom.create({ 88 | data: { 89 | network: network.name, 90 | amount: denomData.amount.toString(), 91 | identifier: denomData.identifier, 92 | } 93 | }) 94 | } 95 | } 96 | } 97 | 98 | export async function getNotifyDenomConfig(network: string, denom: string | undefined, msgTrigger: MsgTypes) { 99 | if (!denom) 100 | return; 101 | 102 | let config = await prisma.notifyDenom.findMany({ 103 | where: { 104 | network, 105 | identifier: denom 106 | } 107 | }); 108 | 109 | let msgConfig = config.find(x => x.msg === msgTrigger) || config.find(x => x.msg === null); 110 | if (!msgConfig) 111 | return; 112 | 113 | let tokenInfo = await prisma.token.findUnique({ 114 | where: { 115 | identifier: msgConfig.identifier 116 | } 117 | }) 118 | if (!tokenInfo) 119 | return; 120 | 121 | return { 122 | identifier: tokenInfo.identifier, 123 | thresholdAmount: msgConfig.amount, 124 | ticker: tokenInfo.ticker, 125 | decimals: tokenInfo.decimals 126 | } 127 | } -------------------------------------------------------------------------------- /src/db.ts: -------------------------------------------------------------------------------- 1 | import { PrismaClient } from "@prisma/client"; 2 | 3 | export const prisma = new PrismaClient(); 4 | 5 | export const dbReady = async () => { 6 | console.log("checking db..."); 7 | let [dbStatus] = await prisma.$queryRaw`SELECT 1`; 8 | if (dbStatus[1] !== BigInt(1)) 9 | throw new Error("db is not ready"); 10 | 11 | return true; 12 | } -------------------------------------------------------------------------------- /src/helpers.ts: -------------------------------------------------------------------------------- 1 | import Big, { BigSource } from "big.js"; 2 | import { Registry } from "@cosmjs/proto-signing"; 3 | import { wasmTypes } from "@cosmjs/cosmwasm-stargate"; 4 | import { defaultRegistryTypes } from "@cosmjs/stargate"; 5 | import { osmosisProtoRegistry } from "osmojs"; 6 | import { prisma } from "./db"; 7 | import { CoinWithMetadata } from "./types"; 8 | 9 | export const fromBaseUnit = (amount: BigSource, decimals = 6) => { 10 | return Big(amount.toString().replace(",", ".")).div(Math.pow(10, decimals)); 11 | } 12 | 13 | export const shortAddress = (addr: string, start = 9, end = 4) => 14 | `${addr.slice(0, start)}...${addr.slice(addr.length - end, addr.length)}`; 15 | 16 | export const isContractAddress = (addr?: string) => addr && addr.length === 63 ? true : false; 17 | 18 | export const registry = new Registry([ 19 | ...wasmTypes, 20 | ...defaultRegistryTypes, 21 | ...osmosisProtoRegistry 22 | ]); 23 | 24 | //splits 83927482ibc/27394FB092D2ECCD56123C74F36E4C1F926001CEADA9CA97EA622B25F41E5EB2 25 | //to meta 26 | export const parseStringCoin = async (swappedCoin: string, returnDefault = false): Promise => { 27 | let separatorIndex = Array.from(swappedCoin).findIndex(x => !Number.isInteger(parseInt(x))); 28 | 29 | let amount = swappedCoin.substring(0, separatorIndex); 30 | let denom = swappedCoin.substring(separatorIndex, swappedCoin.length); 31 | let infoResult = await prisma.token.findUnique({ 32 | where: { 33 | network: "osmosis", 34 | identifier: denom 35 | } 36 | }); 37 | 38 | if (!infoResult) { 39 | if (returnDefault) { 40 | return { 41 | amount, 42 | identifier: denom, 43 | decimals: 0, 44 | coingeckoId: "", 45 | id: 0, 46 | network: "", 47 | ticker: denom 48 | } 49 | } 50 | return; 51 | } 52 | 53 | return { 54 | amount, 55 | ...infoResult 56 | } 57 | } -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import { BlocksWatcher, Chain, IndexedBlock } from "cosmos-indexer"; 2 | import { decodeTxRaw } from "@cosmjs/proto-signing"; 3 | import { MsgTypeUrl, msgHandlerMap } from "./messages"; 4 | import { dbReady, prisma } from "./db"; 5 | import { registry } from "./helpers"; 6 | import { configReady, getNetworks } from "./config"; 7 | import { tokenListsReady } from "./integrations/tokens"; 8 | import { pricesReady } from "./integrations/coingecko"; 9 | import { TimeSpan } from "timespan-ts"; 10 | 11 | async function processBlock(chain: Chain, block: IndexedBlock) { 12 | let promises = block.txs.map(async tx => { 13 | if (tx.code != 0) 14 | return; 15 | 16 | let decodedTx = decodeTxRaw(tx.tx); 17 | await Promise.allSettled(decodedTx.body.messages.map(async (msg, index) => { 18 | let decodedMsg = registry.decode(msg); 19 | let typeUrl = msg.typeUrl as MsgTypeUrl; 20 | let handler = msgHandlerMap.get(typeUrl); 21 | if (!handler) 22 | return; 23 | 24 | try { 25 | await handler({ chain, tx, decodedTx, decodedMsg, msgType: typeUrl, msgIndex: index }); 26 | } catch (e) { 27 | console.warn(`Error handling block ${block.header.height} on network ${chain.chain_name} with err ${e}`) 28 | } 29 | })); 30 | 31 | await prisma.block.upsert({ 32 | where: { 33 | network: chain.chain_name, 34 | AND: { 35 | height: { 36 | lt: block.header.height 37 | } 38 | } 39 | }, 40 | update: { 41 | height: block.header.height, 42 | network: chain.chain_name, 43 | time: block.header.time 44 | }, 45 | create: { 46 | height: block.header.height, 47 | network: chain.chain_name, 48 | time: block.header.time 49 | } 50 | }); 51 | }); 52 | 53 | await Promise.allSettled(promises); 54 | } 55 | 56 | (async () => { 57 | await dbReady(); 58 | await tokenListsReady(); 59 | await configReady(); 60 | await pricesReady(); 61 | 62 | let watcher = BlocksWatcher.create(); 63 | for (const network of await getNetworks()) { 64 | let lastSavedBlock = await prisma.block.findUnique({ 65 | where: { 66 | network: network, 67 | time: { 68 | gt: new Date(Date.now() - TimeSpan.fromMinutes(5).totalMilliseconds) 69 | } 70 | } 71 | }) 72 | console.log(network, lastSavedBlock?.height); 73 | watcher.useNetwork({ 74 | name: network, 75 | dataToFetch: "INDEXED_TXS", 76 | lag: 5, 77 | fromBlock: lastSavedBlock?.height, 78 | onBlockRecievedCallback: async (ctx, indexedBlock) => { 79 | let block = indexedBlock as IndexedBlock; 80 | console.log(`Processing ${ctx.chain.chain_name} at ${block.header.height} with ${block.txs.length} txs`); 81 | try { 82 | await processBlock(ctx.chain, block as IndexedBlock); 83 | } catch (e) { 84 | console.log(JSON.stringify(e, null, 4)); 85 | } 86 | } 87 | }) 88 | } 89 | watcher.useChainRegistryRpcs(); 90 | await watcher.run(); 91 | })().catch(err => console.log(err)); 92 | -------------------------------------------------------------------------------- /src/integrations/coingecko.ts: -------------------------------------------------------------------------------- 1 | import { empty } from "@prisma/client/runtime/library"; 2 | import { getCoingeckoIds } from "../config"; 3 | import { prisma } from "../db"; 4 | import { TimeSpan } from "timespan-ts"; 5 | 6 | const baseUrl = "https://api.coingecko.com/api/v3"; 7 | const attempts = 3; 8 | const validityPeriod = TimeSpan.fromMinutes(30).totalMilliseconds; 9 | 10 | export async function pricesReady() { 11 | setInterval(updatePrices, 1000 * 60 * 5); 12 | await updatePrices(); 13 | } 14 | 15 | const updatePrices = async () => { 16 | console.log("updating prices..."); 17 | const allTrigerIds = await getCoingeckoIds(); 18 | 19 | for (let _ of new Array(attempts)) { 20 | const url = `${baseUrl}/simple/price?ids=${allTrigerIds.join(",")}&vs_currencies=usd`; 21 | 22 | try { 23 | let resp = await fetch(url); 24 | if (resp.status != 200) 25 | return; 26 | 27 | let json = await resp.json() as any; 28 | console.log(json); 29 | for (const key of Object.keys(json)) { 30 | if (!json[key]?.["usd"]) { 31 | console.warn(`cannot get price for ${key}`); 32 | continue; 33 | } 34 | 35 | await prisma.price.upsert({ 36 | where: { 37 | coingeckoId: key 38 | }, 39 | create: { 40 | coingeckoId: key, 41 | priceUsd: json[key]?.["usd"], 42 | savedDate: new Date() 43 | }, 44 | update: { 45 | priceUsd: json[key]?.["usd"], 46 | savedDate: new Date() 47 | } 48 | }) 49 | } 50 | 51 | return; 52 | } catch (err) { 53 | console.log(`updatePrices error ${err}`); 54 | await new Promise(res => setTimeout(res, 60000)); 55 | } 56 | } 57 | } 58 | 59 | export async function priceDump() { 60 | return await prisma.price.findMany(); 61 | } 62 | 63 | export async function getCoingeckoIdPrice(coingeckoId: string) { 64 | let result = await prisma.price.findUnique({ 65 | where: { 66 | coingeckoId, 67 | savedDate: { 68 | gt: new Date(Date.now() - validityPeriod) 69 | } 70 | } 71 | }); 72 | 73 | return result?.priceUsd; 74 | } 75 | 76 | export async function getPriceByIdentifier(identifier?: string) { 77 | if (!identifier) 78 | return; 79 | 80 | let notifyDenom = await prisma.token.findFirst({ 81 | where: { identifier } 82 | }); 83 | 84 | if (!notifyDenom || !notifyDenom.coingeckoId) 85 | return; 86 | 87 | return await getCoingeckoIdPrice(notifyDenom.coingeckoId); 88 | } 89 | 90 | export async function getTickerPrice(ticker: string) { 91 | let notifyDenom = await prisma.token.findFirst({ 92 | where: { 93 | ticker, 94 | AND: [ 95 | { 96 | coingeckoId: { 97 | not: null 98 | } 99 | }, 100 | { 101 | coingeckoId: { 102 | not: "" 103 | } 104 | } 105 | ] 106 | } 107 | }); 108 | 109 | if (!notifyDenom || !notifyDenom.coingeckoId) 110 | return; 111 | 112 | return await getCoingeckoIdPrice(notifyDenom.coingeckoId); 113 | } -------------------------------------------------------------------------------- /src/integrations/icns.ts: -------------------------------------------------------------------------------- 1 | import { CosmWasmClient } from "@cosmjs/cosmwasm-stargate"; 2 | import { fromBech32 } from "@cosmjs/encoding"; 3 | import { NetworkManager } from "cosmos-indexer"; 4 | import { shortAddress } from "../helpers"; 5 | 6 | const icnsResolverContract = "osmo1xk0s8xgktn9x5vwcgtjdxqzadg88fgn33p8u9cnpdxwemvxscvast52cdd"; 7 | 8 | export const shortAddressWithIcns = async (addr: string, start = 9, end = 4): Promise => { 9 | let short = shortAddress(addr, start, end); 10 | let icnsResult = await resolveAddressToIcns(addr); 11 | if (!icnsResult || !icnsResult.primaryName || icnsResult.names.length === 0) 12 | return short; 13 | 14 | let prefix = fromBech32(addr).prefix; 15 | let name = icnsResult.names.find((x: string) => x.split(".")[1] === prefix); 16 | 17 | return name || icnsResult.primaryName || short || addr; 18 | }; 19 | 20 | const resolveAddressToIcns = async (address: string) => { 21 | let chainInfo = await NetworkManager.getChainInfo("osmosis"); 22 | let rpcs = chainInfo.apis?.rpc; 23 | if (!rpcs) 24 | return; 25 | 26 | for (const rpc of rpcs) { 27 | try { 28 | let client = await CosmWasmClient.connect(rpc.address); 29 | let info = await client.queryContractSmart(icnsResolverContract, { "icns_names": { address } }); 30 | 31 | return { 32 | names: info.names, 33 | primaryName: info.primaryName 34 | }; 35 | } 36 | catch (err) { 37 | console.log("failed to fetch icns info " + JSON.stringify(err)); 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /src/integrations/telegram.ts: -------------------------------------------------------------------------------- 1 | import { Telegraf } from "telegraf"; 2 | import { getConfig } from "../config"; 3 | import { getTickerPrice } from "./coingecko"; 4 | import { chains } from "chain-registry"; 5 | import Big, { BigSource } from "big.js"; 6 | import { shortAddressWithIcns } from "./icns"; 7 | import { TimeSpan } from "timespan-ts"; 8 | 9 | const config = getConfig(); 10 | const isProdEnv = config.env === "prod"; 11 | const bot = new Telegraf(config.token); 12 | if (isProdEnv) 13 | bot.launch(); 14 | 15 | process.once('SIGINT', () => isProdEnv && bot.stop('SIGINT')); 16 | process.once('SIGTERM', () => isProdEnv && bot.stop('SIGTERM')); 17 | 18 | const msgSendPattern = "#transfer #${network}\n" + 19 | "${emoji} \n" + 20 | "Address ${fromAddress} sent ${sentAmount} ${ticker} ${usdPrice} to ${toAddress}. \n" + 21 | "${explorerUrl}"; 22 | 23 | export const notifyMsgSend = async ( 24 | from: string, 25 | to: string, 26 | ticker: string, 27 | amount: Big, 28 | txhash: string, 29 | network: string, 30 | usdVolume?: number 31 | ) => { 32 | let sendEmoji = "💲"; 33 | 34 | let finalMsg = interpolate(msgSendPattern, { 35 | emoji: repeatEmoji(sendEmoji, usdVolume), 36 | network: network, 37 | fromAddress: await shortAddressWithIcns(from), 38 | sentAmount: formatNum(amount), 39 | ticker, 40 | usdPrice: getUsdPriceString(usdVolume), 41 | toAddress: await shortAddressWithIcns(to), 42 | explorerUrl: getExplorerUrl(network, txhash) 43 | }); 44 | 45 | await notify(finalMsg); 46 | } 47 | 48 | const msgDelegatePattern = 49 | "#delegation #${network} \n" + 50 | "${emoji} \n" + 51 | "Address ${fromAddress} delegated ${delegatedAmount} ${ticker} ${usdPrice} to ${toAddress}. \n" + 52 | "${explorerUrl}"; 53 | 54 | export const notifyMsgDelegate = async ( 55 | from: string, 56 | validatorMoniker: string, 57 | ticker: string, 58 | amount: Big, 59 | txhash: string, 60 | network: string, 61 | usdVolume?: number 62 | ) => { 63 | let delegateEmoji = "🐳"; 64 | 65 | const finalMsg = interpolate(msgDelegatePattern, { 66 | emoji: repeatEmoji(delegateEmoji, usdVolume), 67 | network: network, 68 | fromAddress: await shortAddressWithIcns(from), 69 | delegatedAmount: formatNum(amount), 70 | ticker, 71 | usdPrice: getUsdPriceString(usdVolume), 72 | toAddress: validatorMoniker, 73 | explorerUrl: getExplorerUrl(network, txhash) 74 | }); 75 | await notify(finalMsg); 76 | } 77 | 78 | const msgUndelegatePattern = 79 | "#undelegation #${network} \n" + 80 | "${emoji} \n" + 81 | "Address ${delegator} undelegated ${undelegatedAmount} ${ticker} ${usdPrice} from ${validator}. \n" + 82 | "${explorerUrl}"; 83 | 84 | export const notifyMsgUndelegate = async ( 85 | delegator: string, 86 | validatorMoniker: string, 87 | ticker: string, 88 | amount: Big, 89 | txhash: string, 90 | network: string, 91 | usdVolume?: number 92 | ) => { 93 | let undelegateEmoji = "🦐"; 94 | 95 | const finalMsg = interpolate(msgUndelegatePattern, { 96 | emoji: repeatEmoji(undelegateEmoji, usdVolume), 97 | network: network, 98 | delegator: await shortAddressWithIcns(delegator), 99 | undelegatedAmount: formatNum(amount), 100 | ticker, 101 | validator: validatorMoniker, 102 | usdPrice: getUsdPriceString(usdVolume), 103 | explorerUrl: getExplorerUrl(network, txhash) 104 | }); 105 | await notify(finalMsg); 106 | } 107 | 108 | 109 | const msgRedelegatePattern = 110 | "#redelegation #${network} \n" + 111 | "${emoji} \n" + 112 | "Address ${delegator} redelegated ${redelegatedAmount} ${ticker} ${usdPrice} from ${fromValidator} to ${toValidator}. \n" + 113 | "${explorerUrl}"; 114 | 115 | export const notifyMsgRedelegate = async ( 116 | delegator: string, 117 | fromValidator: string, 118 | toValidator: string, 119 | ticker: string, 120 | amount: Big, 121 | txhash: string, 122 | network: string, 123 | usdVolume?: number 124 | ) => { 125 | let redelegateEmoji = "♻️"; 126 | 127 | const finalMsg = interpolate(msgRedelegatePattern, { 128 | emoji: repeatEmoji(redelegateEmoji, usdVolume), 129 | network: network, 130 | delegator: await shortAddressWithIcns(delegator), 131 | fromValidator, 132 | toValidator, 133 | redelegatedAmount: formatNum(amount), 134 | ticker, 135 | usdPrice: getUsdPriceString(usdVolume), 136 | explorerUrl: getExplorerUrl(network, txhash) 137 | }); 138 | 139 | await notify(finalMsg); 140 | } 141 | 142 | const cw20TransferPattern = 143 | "#tokentransfer #${network} \n" + 144 | "${emoji} \n" + 145 | "Address ${sender} transferred ${sentAmount} ${ticker} ${usdPrice} tokens to ${reciever}. \n" + 146 | "${explorerUrl}"; 147 | 148 | export const notifyCw20Transfer = async ( 149 | sender: string, 150 | reciever: string, 151 | ticker: string, 152 | amount: Big, 153 | txhash: string, 154 | network: string, 155 | usdVolume?: number 156 | ) => { 157 | let transferEmoji = "💲"; 158 | 159 | let finalMsg = interpolate(cw20TransferPattern, { 160 | emoji: repeatEmoji(transferEmoji, usdVolume), 161 | network: network, 162 | sender: await shortAddressWithIcns(sender), 163 | sentAmount: formatNum(amount), 164 | ticker, 165 | usdPrice: getUsdPriceString(usdVolume), 166 | reciever: await shortAddressWithIcns(reciever), 167 | explorerUrl: getExplorerUrl(network, txhash) 168 | }); 169 | 170 | await notify(finalMsg); 171 | } 172 | 173 | 174 | const osmosisSwapPattern = 175 | "#osmosisswap #${network} \n" + 176 | "${emoji} \n" + 177 | "Address ${sender} swapped ${inAmount} ${inTicker} tokens to ${outAmount} ${outTicker} ${outUsdPrice} \n" + 178 | "${explorerUrl}"; 179 | 180 | export const notifyOsmosisSwap = async ( 181 | sender: string, 182 | inAmount: Big, 183 | inTicker: string, 184 | outAmount: Big, 185 | outTicker: string, 186 | txhash: string, 187 | network: string, 188 | usdVolume?: number 189 | ) => { 190 | let swapEmoji = "🔄"; 191 | 192 | let finalMsg = interpolate(osmosisSwapPattern, { 193 | emoji: repeatEmoji(swapEmoji, usdVolume), 194 | network: network, 195 | sender: await shortAddressWithIcns(sender), 196 | inAmount: formatNum(inAmount), 197 | inTicker, 198 | outAmount: formatNum(outAmount), 199 | outTicker, 200 | outUsdPrice: getUsdPriceString(usdVolume), 201 | explorerUrl: getExplorerUrl(network, txhash) 202 | }); 203 | 204 | await notify(finalMsg); 205 | } 206 | 207 | const joinPoolPattern = 208 | "#osmosisjoin #${network} \n" + 209 | "${emoji} \n" + 210 | "Address ${sender} added ${token1Amount} ${token1Ticker} and ${token2Amount} ${token2Ticker} tokens ${usdValue} to ${ranged} pool №${poolId} \n" + 211 | "${explorerUrl}"; 212 | 213 | export const notifyOsmosisJoinPool = async ( 214 | sender: string, 215 | token1Amount: string, 216 | token1Ticker: string, 217 | token2Amount: string, 218 | token2Ticker: string, 219 | txhash: string, 220 | network: string, 221 | poolId: string, 222 | usdValue?: number, 223 | ranged?: boolean 224 | ) => { 225 | let joinEmoji = "💲"; 226 | 227 | let finalMsg = interpolate(joinPoolPattern, { 228 | emoji: repeatEmoji(joinEmoji, usdValue), 229 | network: network, 230 | sender: await shortAddressWithIcns(sender), 231 | token1Amount: formatNum(token1Amount), 232 | token1Ticker, 233 | token2Amount: formatNum(token2Amount), 234 | token2Ticker, 235 | poolId, 236 | ranged: ranged ? "ranged" : "", 237 | usdValue: getUsdPriceString(usdValue), 238 | explorerUrl: getExplorerUrl(network, txhash) 239 | }); 240 | 241 | await notify(finalMsg); 242 | } 243 | 244 | const exitPoolPattern = 245 | "#osmosisexit #${network} \n" + 246 | "${emoji} \n" + 247 | "Address ${sender} removed ${token1Amount} ${token1Ticker} and ${token2Amount} ${token2Ticker} tokens ${usdValue} from ${ranged} pool №${poolId} \n" + 248 | "${explorerUrl}"; 249 | 250 | export const notifyOsmosisExitPool = async ( 251 | sender: string, 252 | token1Amount: string, 253 | token1Ticker: string, 254 | token2Amount: string, 255 | token2Ticker: string, 256 | txhash: string, 257 | network: string, 258 | poolId: string, 259 | usdValue?: number, 260 | ranged?: boolean 261 | ) => { 262 | let joinEmoji = "💲"; 263 | 264 | let finalMsg = interpolate(exitPoolPattern, { 265 | emoji: repeatEmoji(joinEmoji, usdValue), 266 | network: network, 267 | sender: await shortAddressWithIcns(sender), 268 | token1Amount: formatNum(token1Amount), 269 | token1Ticker, 270 | token2Amount: formatNum(token2Amount), 271 | token2Ticker, 272 | poolId, 273 | ranged: ranged ? "ranged" : "", 274 | usdValue: getUsdPriceString(usdValue), 275 | explorerUrl: getExplorerUrl(network, txhash) 276 | }); 277 | 278 | await notify(finalMsg); 279 | } 280 | 281 | const joinOneSidePoolPattern = 282 | "#osmosisjoin #${network} \n" + 283 | "${emoji} \n" + 284 | "Address ${sender} added ${tokenAmount} ${tokenTicker} tokens ${usdValue} to ranged pool №${poolId} \n" + 285 | "${explorerUrl}"; 286 | 287 | export const notifyOsmosisJoinPoolOneSide = async ( 288 | sender: string, 289 | tokenAmount: string, 290 | tokenTicker: string, 291 | txhash: string, 292 | network: string, 293 | poolId: string, 294 | usdValue?: number 295 | ) => { 296 | let joinEmoji = "💲"; 297 | 298 | let finalMsg = interpolate(joinOneSidePoolPattern, { 299 | emoji: repeatEmoji(joinEmoji, usdValue), 300 | network: network, 301 | sender: await shortAddressWithIcns(sender), 302 | tokenAmount: formatNum(tokenAmount), 303 | tokenTicker, 304 | poolId, 305 | usdValue: getUsdPriceString(usdValue), 306 | explorerUrl: getExplorerUrl(network, txhash) 307 | }); 308 | 309 | await notify(finalMsg); 310 | } 311 | 312 | const exitOneSidePoolPattern = 313 | "#osmosisexit #${network} \n" + 314 | "${emoji} \n" + 315 | "Address ${sender} removed ${tokenAmount} ${tokenTicker} tokens ${usdValue} from ranged pool №${poolId} \n" + 316 | "${explorerUrl}"; 317 | 318 | export const notifyOsmosisExitPoolOneSide = async ( 319 | sender: string, 320 | tokenAmount: string, 321 | tokenTicker: string, 322 | txhash: string, 323 | network: string, 324 | poolId: string, 325 | usdValue?: number 326 | ) => { 327 | let joinEmoji = "💲"; 328 | 329 | let finalMsg = interpolate(exitOneSidePoolPattern, { 330 | emoji: repeatEmoji(joinEmoji, usdValue), 331 | network: network, 332 | sender: await shortAddressWithIcns(sender), 333 | tokenAmount: formatNum(tokenAmount), 334 | tokenTicker, 335 | poolId, 336 | usdValue: getUsdPriceString(usdValue), 337 | explorerUrl: getExplorerUrl(network, txhash) 338 | }); 339 | 340 | await notify(finalMsg); 341 | } 342 | 343 | //1 emoji for every 100k usd 344 | const repeatEmoji = (emoji: string, price?: number) => emoji.repeat(price && price > 0 ? Math.min(Math.ceil(price / 500000), 10) : 1); 345 | //const getUsdPriceString = (usdPrice: number | undefined, amount: number) => usdPrice ? `(USD $${formatNum(usdPrice * amount)})` : ""; 346 | const getUsdPriceString = (usdVolume: number | undefined) => usdVolume ? `(USD $${formatNum(usdVolume)})` : ""; 347 | 348 | const formatNum = (num: BigSource) => { 349 | try { 350 | let n = Big(num); 351 | return new Intl.NumberFormat().format(Number(n.toFixed(n.lt(1) ? 2 : 0))); 352 | } catch (e) { 353 | console.warn(`cannot format number ${num}`); 354 | return ""; 355 | } 356 | } 357 | 358 | const getExplorerUrl = (network: string, txhash: string) => { 359 | let chain = chains.find(x => x.chain_name === network); 360 | if (!chain || !chain.explorers || chain.explorers.length === 0) { 361 | console.warn(`no explorers found for network ${network}`); 362 | return `TX Hash: ${txhash}`; 363 | } 364 | 365 | let explorer = chain.explorers.find(x => x.kind === "mintscan") || chain.explorers.at(1); 366 | if (!explorer?.tx_page) { 367 | console.warn(`no explorers found for network ${network}`); 368 | return `TX Hash: ${txhash}`; 369 | } 370 | 371 | return `TX link`; 372 | } 373 | 374 | const defaultRetryCounts = 3; 375 | const notify = async (message: string, retryCounter = 1) => { 376 | console.log(message); 377 | if (!isProdEnv) 378 | return; 379 | 380 | try { 381 | await bot.telegram.sendMessage( 382 | config.channel, 383 | message, 384 | { 385 | parse_mode: "HTML", 386 | disable_web_page_preview: true 387 | }); 388 | } catch (e) { 389 | console.warn(`Error notifyting to telegram. Error: ${JSON.stringify(e)}`); 390 | if (retryCounter <= defaultRetryCounts) { 391 | await new Promise(res => setTimeout(res, TimeSpan.fromMinutes(10).totalMilliseconds)); 392 | notify(message, retryCounter + 1); 393 | } 394 | } 395 | } 396 | 397 | const interpolate = (str: string, args: any) => { 398 | Object.keys(args).forEach(arg => { 399 | str = str.replaceAll("${" + arg + "}", args[arg]) 400 | }); 401 | 402 | return str.replace(/ +/g, ' '); 403 | } -------------------------------------------------------------------------------- /src/integrations/tokens.ts: -------------------------------------------------------------------------------- 1 | import type { Token } from '@prisma/client' 2 | import { prisma } from '../db'; 3 | import { TimeSpan } from "timespan-ts"; 4 | import { CosmWasmClient } from "@cosmjs/cosmwasm-stargate"; 5 | import { getConfig } from "../config"; 6 | import { NetworkManager } from "cosmos-indexer"; 7 | import { assets } from "chain-registry"; 8 | import osmoAssets from "../chain-specific/osmosis/osmosis-1.assetlist.json"; 9 | 10 | import type { Asset, AssetList } from "@chain-registry/types" 11 | 12 | export type TokenInfo = Omit; 13 | 14 | export const tokenListsReady = async () => { 15 | console.log("syncing token lists..."); 16 | setInterval(loadOsmosisTokensToDb, TimeSpan.fromDays(1).totalMilliseconds); 17 | await loadTokensFromLocalRegistryToDb(); 18 | await loadOsmosisTokensToDb(); 19 | } 20 | 21 | export const saveTokenToDb = async (network: string, token: TokenInfo) => { 22 | await prisma.token.upsert({ 23 | where: { 24 | identifier: token.identifier 25 | }, 26 | update: { 27 | coingeckoId: token.coingeckoId, 28 | ticker: token.ticker, 29 | decimals: token.decimals, 30 | identifier: token.identifier, 31 | network: token.network 32 | }, 33 | create: { 34 | ...token, 35 | network 36 | } 37 | }) 38 | } 39 | 40 | export const loadTokensFromLocalRegistryToDb = async () => { 41 | for (let asset of assets) { 42 | for (let a of asset.assets) { 43 | await prisma.token.upsert({ 44 | where: { 45 | identifier: a.base 46 | }, 47 | update: {}, 48 | create: mapAsset(a, asset.chain_name) 49 | }) 50 | } 51 | }; 52 | return true; 53 | } 54 | 55 | export const loadOsmosisTokensToDb = async () => { 56 | try { 57 | let url = "https://raw.githubusercontent.com/osmosis-labs/assetlists/main/osmosis-1/osmosis-1.assetlist.json"; 58 | let response = await fetch(url); 59 | let json = await response.json() as AssetList; 60 | for (let asset of json.assets) 61 | await saveTokenToDb("osmosis", mapAsset(asset, "osmosis")); 62 | } catch (err: any) { 63 | console.warn(`Cannot sync tokens with Github ${err}`); 64 | for (let asset of osmoAssets.assets) 65 | await saveTokenToDb("osmosis", mapAsset(asset as Asset, "osmosis")); 66 | } 67 | } 68 | 69 | const mapAsset = (asset: Asset, network: string): TokenInfo => { 70 | let config = getConfig() as any; 71 | let coingeckoId = config.networks 72 | .flatMap((x: any) => x.notifyDenoms) 73 | .find((x: any) => x.identifier === asset.base)?.coingeckoId; 74 | 75 | return { 76 | identifier: asset.base, 77 | decimals: asset.denom_units.find((x: any) => x.exponent > 0)?.exponent || asset.denom_units.at(-1)?.exponent!, 78 | ticker: asset.symbol, 79 | coingeckoId: asset.coingecko_id || coingeckoId || "", 80 | network: network 81 | } 82 | } 83 | 84 | export const getCw20TokenInfo = async (network: string, contract: string) => { 85 | let savedToken = await prisma.token.findUnique({ 86 | where: { identifier: contract } 87 | }); 88 | if (savedToken) 89 | return savedToken; 90 | 91 | console.log(`Fetching token on ${network} ${contract}`); 92 | let chainInfo = await NetworkManager.getChainInfo(network); 93 | let endpoints = chainInfo.apis?.rpc; 94 | if (!endpoints) 95 | return; 96 | 97 | let result: TokenInfo | null = null; 98 | let coingeckoId = (getConfig() as any).networks 99 | .find((x: any) => x.name === network)?.notifyDenoms 100 | .find((x: any) => x.identifier === contract)?.coingeckoId || ""; 101 | 102 | for (const { address } of endpoints) { 103 | try { 104 | let client = await CosmWasmClient.connect(address); 105 | let info = await client.queryContractSmart(contract, { "token_info": {} }); 106 | result = { 107 | identifier: contract, 108 | decimals: info.decimals, 109 | ticker: info.symbol, 110 | coingeckoId, 111 | network 112 | }; 113 | break; 114 | } 115 | catch (err) { 116 | console.log("failed to fetch cw20 token info " + JSON.stringify(err)); 117 | } 118 | } 119 | 120 | if (!result) 121 | return; 122 | 123 | try { 124 | await saveTokenToDb(network, result); 125 | } catch (e) { 126 | console.log("failed saving token to Db" + JSON.stringify(e)); 127 | } 128 | 129 | return result; 130 | } -------------------------------------------------------------------------------- /src/integrations/validators.ts: -------------------------------------------------------------------------------- 1 | import { NetworkManager } from "cosmos-indexer"; 2 | import { shortAddress } from "../helpers"; 3 | import { prisma } from "../db"; 4 | import { TimeSpan } from "timespan-ts"; 5 | 6 | export const getValidatorMoniker = async (network: string, validatorAddress: string) => { 7 | let targetProfile = await prisma.validator.findUnique({ 8 | where: { 9 | address: validatorAddress, 10 | network, 11 | savedDate: { 12 | gt: new Date(Date.now() - TimeSpan.fromDays(30).totalMilliseconds) 13 | } 14 | } 15 | }) 16 | if (targetProfile) 17 | return targetProfile.moniker; 18 | 19 | let fetchedProfile = await fetchValidatorInfo(network, validatorAddress); 20 | if (!fetchedProfile) 21 | return shortAddress(validatorAddress); 22 | 23 | console.log(`Saving validator info ${JSON.stringify(fetchedProfile)}`); 24 | await prisma.validator.upsert({ 25 | where: { 26 | network, 27 | address: fetchedProfile.address 28 | }, 29 | update: { 30 | moniker: fetchedProfile.moniker 31 | }, 32 | create: { 33 | address: fetchedProfile.address, 34 | moniker: fetchedProfile.moniker, 35 | network, 36 | savedDate: new Date() 37 | } 38 | }) 39 | 40 | return fetchedProfile.moniker || shortAddress(validatorAddress); 41 | } 42 | 43 | 44 | export const fetchValidatorInfo = async (network: string, valoperAddress: string) => { 45 | let chainInfo = await NetworkManager.getChainInfo(network); 46 | let endpoints = chainInfo.apis?.rest; 47 | if (!endpoints) 48 | return; 49 | 50 | for (let { address } of shuffleArray(endpoints)) { 51 | //for some reason queryclient withextensions setupstakingextensions isn't working 52 | try { 53 | let url = `${address}/cosmos/staking/v1beta1/validators/${valoperAddress}`; 54 | let response = await (await fetch(url)).json() as any; 55 | let moniker = response?.validator?.description?.moniker; 56 | if (!moniker) 57 | return; 58 | 59 | return { 60 | moniker, 61 | network: network, 62 | address: valoperAddress 63 | } 64 | 65 | } catch (err) { console.warn(`Failed to fetch moniker for ${valoperAddress} err ${err}`) } 66 | } 67 | } 68 | 69 | function shuffleArray(array: any[]) { 70 | return array 71 | .map(value => ({ value, sort: Math.random() })) 72 | .sort((a, b) => a.sort - b.sort) 73 | .map(({ value }) => value); 74 | } -------------------------------------------------------------------------------- /src/messages/index.ts: -------------------------------------------------------------------------------- 1 | import { DecodedTxRaw } from "@cosmjs/proto-signing"; 2 | import { IndexedTx } from "@cosmjs/stargate"; 3 | import { Chain } from "cosmos-indexer"; 4 | import { handleMsgSend } from "./msgSend"; 5 | import { handleMsgBeginRedelegate } from "./msgBeginRedelegate"; 6 | import { handleMsgDelegate } from "./msgDelegate"; 7 | import { handleMsgExec } from "./msgExec"; 8 | import { handleMsgExecuteContract } from "./msgExecuteContract"; 9 | import { handleMsgUndelegate } from "./msgUndelegate"; 10 | import { handleMsgSwapExactAmountInOut } from "./msgSwapExactAmount"; 11 | import { handleMsgJoinExitPool } from "./msgJoinExitPool"; 12 | import { msgWithdrawPosition } from "./msgWithdrawPosition"; 13 | import { msgCreatePosition } from "./msgCreatePosition"; 14 | 15 | export const msgHandlerMap = new Map Promise>([ 16 | ["/cosmos.bank.v1beta1.MsgSend", handleMsgSend], 17 | ["/cosmos.staking.v1beta1.MsgBeginRedelegate", handleMsgBeginRedelegate], 18 | ["/cosmos.staking.v1beta1.MsgDelegate", handleMsgDelegate], 19 | ["/cosmos.authz.v1beta1.MsgExec", handleMsgExec], 20 | ["/cosmwasm.wasm.v1.MsgExecuteContract", handleMsgExecuteContract], 21 | ["/cosmos.staking.v1beta1.MsgUndelegate", handleMsgUndelegate], 22 | ["/osmosis.gamm.v1beta1.MsgSwapExactAmountIn", handleMsgSwapExactAmountInOut], 23 | ["/osmosis.gamm.v1beta1.MsgSwapExactAmountOut", handleMsgSwapExactAmountInOut], 24 | ["/osmosis.poolmanager.v1beta1.MsgSwapExactAmountIn", handleMsgSwapExactAmountInOut], 25 | ["/osmosis.poolmanager.v1beta1.MsgSwapExactAmountOut", handleMsgSwapExactAmountInOut], 26 | ["/osmosis.gamm.v1beta1.MsgJoinPool", handleMsgJoinExitPool], 27 | ["/osmosis.gamm.v1beta1.MsgExitPool", handleMsgJoinExitPool], 28 | ["/osmosis.concentratedliquidity.v1beta1.MsgCreatePosition", msgCreatePosition], 29 | ["/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition", msgWithdrawPosition] 30 | ]); 31 | 32 | export type MsgTypeUrl = 33 | "/cosmos.bank.v1beta1.MsgSend" | 34 | "/cosmos.staking.v1beta1.MsgBeginRedelegate" | 35 | "/cosmos.staking.v1beta1.MsgDelegate" | 36 | "/cosmos.authz.v1beta1.MsgExec" | 37 | "/cosmwasm.wasm.v1.MsgExecuteContract" | 38 | "/cosmos.staking.v1beta1.MsgUndelegate" | 39 | "/osmosis.gamm.v1beta1.MsgSwapExactAmountIn" | 40 | "/osmosis.gamm.v1beta1.MsgSwapExactAmountOut" | 41 | "/osmosis.poolmanager.v1beta1.MsgSwapExactAmountIn" | 42 | "/osmosis.poolmanager.v1beta1.MsgSwapExactAmountOut" | 43 | "/osmosis.gamm.v1beta1.MsgJoinPool" | 44 | "/osmosis.gamm.v1beta1.MsgExitPool" | 45 | "/osmosis.concentratedliquidity.v1beta1.MsgCreatePosition" | 46 | "/osmosis.concentratedliquidity.v1beta1.MsgWithdrawPosition"; 47 | 48 | export type HandlerContext = { 49 | chain: Chain, 50 | tx: IndexedTx, 51 | decodedTx: DecodedTxRaw, 52 | decodedMsg: any, 53 | msgType: MsgTypeUrl, 54 | msgIndex: number, 55 | isAuthzTx?: boolean 56 | } -------------------------------------------------------------------------------- /src/messages/msgBeginRedelegate.ts: -------------------------------------------------------------------------------- 1 | import { MsgBeginRedelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; 2 | import { HandlerContext } from "."; 3 | import Big from "big.js"; 4 | import { getNotifyDenomConfig } from "../config"; 5 | import { notifyMsgRedelegate } from "../integrations/telegram"; 6 | import { fromBaseUnit } from "../helpers"; 7 | import { getValidatorMoniker } from "../integrations/validators"; 8 | import { getPriceByIdentifier } from "../integrations/coingecko"; 9 | 10 | export const handleMsgBeginRedelegate = async (ctx: HandlerContext) => { 11 | let decodedMsg = ctx.decodedMsg as MsgBeginRedelegate; 12 | let coin = decodedMsg.amount; 13 | 14 | let config = await getNotifyDenomConfig(ctx.chain.chain_name, coin.denom, "msgBeginRedelegate"); 15 | if (!config) 16 | return; 17 | 18 | if (!coin.amount || !config.thresholdAmount) 19 | return; 20 | 21 | let amount = Big(coin.amount); 22 | if (amount.lt(Big(config.thresholdAmount))) 23 | return; 24 | 25 | let usdPrice = await getPriceByIdentifier(config.identifier); 26 | if (!usdPrice) 27 | return; 28 | let usdValue = fromBaseUnit(amount, config.decimals).mul(usdPrice).toNumber(); 29 | 30 | await notifyMsgRedelegate( 31 | decodedMsg.delegatorAddress?.toString(), 32 | await getValidatorMoniker(ctx.chain.chain_name, decodedMsg.validatorSrcAddress), 33 | await getValidatorMoniker(ctx.chain.chain_name, decodedMsg.validatorDstAddress), 34 | config.ticker, 35 | fromBaseUnit(amount, config.decimals), 36 | ctx.tx.hash, 37 | ctx.chain.chain_name, 38 | usdValue); 39 | }; -------------------------------------------------------------------------------- /src/messages/msgCreatePosition.ts: -------------------------------------------------------------------------------- 1 | import { HandlerContext } from "."; 2 | import { getNotifyDenomConfig } from "../config"; 3 | import { notifyOsmosisJoinPool, notifyOsmosisJoinPoolOneSide } from "../integrations/telegram"; 4 | import { fromBaseUnit, isContractAddress, parseStringCoin, shortAddress } from "../helpers"; 5 | import { getPriceByIdentifier } from "../integrations/coingecko"; 6 | import { MsgCreatePosition } from "osmojs/dist/codegen/osmosis/concentrated-liquidity/tx"; 7 | import Big from "big.js"; 8 | 9 | export const msgCreatePosition = async (ctx: HandlerContext) => { 10 | let decodedMsg = ctx.decodedMsg as MsgCreatePosition; 11 | let oneSidePosition = false; 12 | if (ctx.tx.hash === "61638087981C64F08D74361D82AE38FBC04D08504E9636469BAD9D7BA8B575CE") 13 | debugger; 14 | let sender = decodedMsg.sender; 15 | let trasferEvent = ctx.tx.events.find(x => x.type === "transfer" && 16 | //we search transfer from sender's address 17 | x.attributes.find(y => y.key === "sender")?.value === sender && 18 | //to contract address 19 | isContractAddress(x.attributes.find(y => y.key === "recipient")?.value) && 20 | //if there's multiple msgs executed through authz, we should also check msg_index 21 | ((ctx.msgIndex > 0 && ctx.isAuthzTx) ? x.attributes.find(y => y.key === "authz_msg_index")?.value === ctx.msgIndex.toString() : true)); 22 | let positionEvent = ctx.tx.events.find(x => x.type === "create_position"); 23 | if (!trasferEvent || !positionEvent) 24 | return; 25 | 26 | let poolIdValue = positionEvent.attributes.find(x => x.key === "pool_id")?.value; 27 | let transferEventValue = trasferEvent.attributes.find(x => x.key === "amount")?.value; 28 | if (positionEvent.attributes.find(x => x.key === "amount0")?.value === "0" || 29 | positionEvent.attributes.find(x => x.key === "amount1")?.value === "0") 30 | oneSidePosition = true; 31 | if (!poolIdValue || !transferEventValue || !sender) 32 | return; 33 | 34 | let [token1, token2] = await Promise.all(transferEventValue.split(",").map(x => parseStringCoin(x, true))); 35 | let token1Config = await getNotifyDenomConfig(ctx.chain.chain_name, token1?.identifier, "msgCreatePosition"); 36 | let token2Config = await getNotifyDenomConfig(ctx.chain.chain_name, token2?.identifier, "msgCreatePosition"); 37 | if ((!token1Config && !token2Config)) 38 | return; 39 | 40 | let matchByToken1 = token1Config?.thresholdAmount && token1?.amount && Big(token1.amount).gt(token1Config.thresholdAmount); 41 | let matchByToken2 = token2Config?.thresholdAmount && token2?.amount && Big(token2.amount).gt(token2Config.thresholdAmount); 42 | if (!matchByToken1 && !matchByToken2) 43 | return; 44 | 45 | let token1Price = await getPriceByIdentifier(token1?.identifier); 46 | let token2Price = await getPriceByIdentifier(token2?.identifier); 47 | let token1Value = fromBaseUnit(token1?.amount || 0, token1?.decimals).mul(token1Price || 0); 48 | let token2Value = fromBaseUnit(token2?.amount || 0, token2?.decimals).mul(token2Price || 0); 49 | let usdValue: number | undefined; 50 | if (oneSidePosition) 51 | usdValue = (token1Price ? token1Value : token2Value).toNumber(); 52 | else 53 | usdValue = token1Price && token2Price ? token1Value.plus(token2Value).toNumber() : undefined 54 | 55 | if (oneSidePosition) { 56 | return await notifyOsmosisJoinPoolOneSide( 57 | sender, 58 | fromBaseUnit(token1?.amount || 0, token1?.decimals).toFixed(), 59 | token1Config!.ticker, 60 | ctx.tx.hash, 61 | ctx.chain.chain_name, 62 | poolIdValue, 63 | usdValue 64 | ); 65 | }; 66 | 67 | await notifyOsmosisJoinPool( 68 | sender, 69 | fromBaseUnit(token1?.amount || 0, token1?.decimals).toFixed() || "", 70 | token1?.ticker || shortAddress(token1?.identifier || "") || "", 71 | fromBaseUnit(token2?.amount || 0, token2?.decimals).toFixed() || "", 72 | token2?.ticker || shortAddress(token2?.identifier || "") || "", 73 | ctx.tx.hash, 74 | ctx.chain.chain_name, 75 | poolIdValue, 76 | usdValue, 77 | true 78 | ) 79 | } -------------------------------------------------------------------------------- /src/messages/msgDelegate.ts: -------------------------------------------------------------------------------- 1 | import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; 2 | import { HandlerContext } from "."; 3 | import { getNotifyDenomConfig } from "../config"; 4 | import Big from "big.js"; 5 | import { fromBaseUnit } from "../helpers"; 6 | import { notifyMsgDelegate } from "../integrations/telegram"; 7 | import { getValidatorMoniker } from "../integrations/validators"; 8 | import { getPriceByIdentifier } from "../integrations/coingecko"; 9 | 10 | export const handleMsgDelegate = async (ctx: HandlerContext) => { 11 | let decodedMsg = ctx.decodedMsg as MsgDelegate; 12 | let coin = decodedMsg.amount; 13 | 14 | let config = await getNotifyDenomConfig(ctx.chain.chain_name, coin.denom, "msgDelegate"); 15 | if (!config) 16 | return; 17 | 18 | if (!coin.amount || !config.thresholdAmount) 19 | return; 20 | 21 | if (Big(coin.amount).lt(Big(config.thresholdAmount))) 22 | return; 23 | 24 | let usdPrice = await getPriceByIdentifier(config.identifier); 25 | if (!usdPrice) 26 | return; 27 | let usdValue = fromBaseUnit(coin.amount, config.decimals).mul(usdPrice).toNumber(); 28 | 29 | await notifyMsgDelegate( 30 | decodedMsg.delegatorAddress?.toString(), 31 | await getValidatorMoniker(ctx.chain.chain_name, decodedMsg.validatorAddress), 32 | config.ticker, 33 | fromBaseUnit(coin.amount, config.decimals), 34 | ctx.tx.hash, 35 | ctx.chain.chain_name, 36 | usdValue); 37 | } -------------------------------------------------------------------------------- /src/messages/msgExec.ts: -------------------------------------------------------------------------------- 1 | import { MsgExec } from "osmojs/dist/codegen/cosmos/authz/v1beta1/tx"; 2 | import { HandlerContext, MsgTypeUrl, msgHandlerMap } from "."; 3 | import { registry } from "../helpers"; 4 | 5 | export const handleMsgExec = async (ctx: HandlerContext) => { 6 | let decodedMsgExec = ctx.decodedMsg as MsgExec 7 | 8 | await Promise.allSettled(decodedMsgExec.msgs.map(async (innerMsg, index) => { 9 | let decodedMsg = registry.decode(innerMsg); 10 | let msgTypeUrl = innerMsg.typeUrl as MsgTypeUrl; 11 | let handler = msgHandlerMap.get(msgTypeUrl); 12 | if (!handler) 13 | return; 14 | 15 | await handler({ ...ctx, decodedMsg, msgType: msgTypeUrl, msgIndex: index, isAuthzTx: true }); 16 | })); 17 | }; -------------------------------------------------------------------------------- /src/messages/msgExecuteContract.ts: -------------------------------------------------------------------------------- 1 | import Big from "big.js"; 2 | import { HandlerContext } from "."; 3 | import { getNotifyDenomConfig } from "../config"; 4 | import { fromBaseUnit } from "../helpers"; 5 | import { notifyCw20Transfer } from "../integrations/telegram"; 6 | import { getCw20TokenInfo } from "../integrations/tokens"; 7 | import { getPriceByIdentifier } from "../integrations/coingecko"; 8 | 9 | 10 | export const handleMsgExecuteContract = async (ctx: HandlerContext) => { 11 | let decodedExecuteContractMsg = JSON.parse(new TextDecoder().decode(ctx.decodedMsg.msg)); 12 | let tokenConfig = await getNotifyDenomConfig(ctx.chain.chain_name, ctx.decodedMsg.contract, "msgExecuteContract"); 13 | 14 | let isTransferMsg = isCw20TransferMsg(decodedExecuteContractMsg); 15 | if (!isTransferMsg || !tokenConfig || !tokenConfig.thresholdAmount) 16 | return; 17 | 18 | let tokenInfo = await getCw20TokenInfo(ctx.chain.chain_name, ctx.decodedMsg.contract); 19 | if (!tokenInfo) 20 | return; 21 | 22 | if (Big(decodedExecuteContractMsg.transfer.amount).lt(Big(tokenConfig.thresholdAmount))) 23 | return; 24 | 25 | let usdPrice = await getPriceByIdentifier(tokenConfig.identifier); 26 | if (!usdPrice) 27 | return; 28 | let usdValue = fromBaseUnit(decodedExecuteContractMsg.transfer.amount, tokenInfo.decimals).mul(usdPrice).toNumber(); 29 | 30 | await notifyCw20Transfer( 31 | ctx.decodedMsg.sender, 32 | decodedExecuteContractMsg.transfer.recipient, 33 | tokenInfo.ticker, 34 | fromBaseUnit(decodedExecuteContractMsg.transfer.amount, tokenInfo.decimals), 35 | ctx.tx.hash, 36 | ctx.chain.chain_name, 37 | usdValue 38 | ) 39 | } 40 | 41 | // 42 | const isCw20TransferMsg = (msg: any) => { 43 | return msg?.transfer && 44 | msg?.transfer?.recipient && 45 | msg?.transfer?.amount && 46 | Object.keys(msg).length === 1 && 47 | Object.keys(msg.transfer).length === 2; 48 | } 49 | // -------------------------------------------------------------------------------- /src/messages/msgJoinExitPool.ts: -------------------------------------------------------------------------------- 1 | import { HandlerContext } from "."; 2 | import { getNotifyDenomConfig } from "../config"; 3 | import { notifyOsmosisExitPool, notifyOsmosisJoinPool } from "../integrations/telegram"; 4 | import { fromBaseUnit, parseStringCoin, shortAddress } from "../helpers"; 5 | import { getPriceByIdentifier } from "../integrations/coingecko"; 6 | import { MsgTypes } from "../types"; 7 | import Big from "big.js"; 8 | 9 | export const handleMsgJoinExitPool = async (ctx: HandlerContext) => { 10 | let msgType: MsgTypes | undefined = "msgJoinPool"; 11 | let tokensEventKey = "tokens_in"; 12 | let eventKey = "pool_joined"; 13 | let notifierFunc = notifyOsmosisJoinPool; 14 | if (ctx.msgType === "/osmosis.gamm.v1beta1.MsgExitPool") { 15 | msgType = "msgExitPool"; 16 | tokensEventKey = "tokens_out"; 17 | eventKey = "pool_exited"; 18 | notifierFunc = notifyOsmosisExitPool 19 | } 20 | else if (ctx.msgType !== "/osmosis.gamm.v1beta1.MsgJoinPool") 21 | return; 22 | 23 | let event = ctx.tx.events.find(x => x.type === eventKey); 24 | if (!event) 25 | return; 26 | 27 | let poolIdEventValue = event.attributes.find(x => x.key === "pool_id")?.value; 28 | let tokensInEventValue = event.attributes.find(x => x.key === tokensEventKey)?.value; 29 | let sender = event.attributes.find(x => x.key === "sender")?.value; 30 | if (!poolIdEventValue || !tokensInEventValue || !sender) 31 | return; 32 | 33 | let [token1, token2] = await Promise.all(tokensInEventValue.split(",").map(x => parseStringCoin(x, true))); 34 | let token1Config = await getNotifyDenomConfig(ctx.chain.chain_name, token1?.identifier, msgType); 35 | let token2Config = await getNotifyDenomConfig(ctx.chain.chain_name, token2?.identifier, msgType); 36 | if (!token1Config && !token2Config) 37 | return; 38 | 39 | let matchByToken1 = token1Config?.thresholdAmount && token1?.amount && Big(token1.amount).gt(token1Config.thresholdAmount); 40 | let matchByToken2 = token2Config?.thresholdAmount && token2?.amount && Big(token2.amount).gt(token2Config.thresholdAmount); 41 | if (!matchByToken1 && !matchByToken2) 42 | return; 43 | 44 | let token1Price = await getPriceByIdentifier(token1?.identifier); 45 | let token2Price = await getPriceByIdentifier(token2?.identifier); 46 | let token1Value = fromBaseUnit(token1?.amount || 0, token1?.decimals).mul(token1Price || 0); 47 | let token2Value = fromBaseUnit(token2?.amount || 0, token2?.decimals).mul(token2Price || 0); 48 | let usdValue: number | undefined; 49 | 50 | if (token1Value.eq(0) || token2Value.eq(0)) { 51 | usdValue = (token1Value.gt(token2Value) ? token1Value : token2Value).mul(2).toNumber(); 52 | } else if (token1Value.gt(0) && token2Value.gt(0)) { 53 | usdValue = token1Value.plus(token2Value).toNumber(); 54 | } 55 | 56 | await notifierFunc( 57 | sender, 58 | fromBaseUnit(token1?.amount || 0, token1?.decimals).toFixed() || "", 59 | token1?.ticker || shortAddress(token1?.identifier || "") || "", 60 | fromBaseUnit(token2?.amount || 0, token2?.decimals).toFixed() || "", 61 | token2?.ticker || shortAddress(token2?.identifier || "") || "", 62 | ctx.tx.hash, 63 | ctx.chain.chain_name, 64 | poolIdEventValue, 65 | usdValue 66 | ) 67 | } -------------------------------------------------------------------------------- /src/messages/msgSend.ts: -------------------------------------------------------------------------------- 1 | import { HandlerContext } from "."; 2 | import { MsgSend } from "cosmjs-types/cosmos/bank/v1beta1/tx"; 3 | import { getNotifyDenomConfig } from "../config"; 4 | import Big from "big.js"; 5 | import { notifyMsgSend } from "../integrations/telegram"; 6 | import { fromBaseUnit } from "../helpers"; 7 | import { getPriceByIdentifier } from "../integrations/coingecko"; 8 | 9 | export const handleMsgSend = async (ctx: HandlerContext) => { 10 | let decodedMsg = ctx.decodedMsg as MsgSend; 11 | 12 | for (const transfer of decodedMsg.amount) { 13 | let config = await getNotifyDenomConfig(ctx.chain.chain_name, transfer.denom, "msgSend"); 14 | if (!config) 15 | continue; 16 | 17 | if (Big(transfer.amount).lt(Big(config.thresholdAmount))) 18 | return; 19 | 20 | let usdPrice = await getPriceByIdentifier(config.identifier); 21 | if (!usdPrice) 22 | return; 23 | let usdValue = fromBaseUnit(transfer.amount, config.decimals).mul(usdPrice).toNumber(); 24 | 25 | notifyMsgSend( 26 | decodedMsg.fromAddress, 27 | decodedMsg.toAddress, 28 | config.ticker, 29 | fromBaseUnit(transfer.amount, config.decimals), 30 | ctx.tx.hash, 31 | ctx.chain.chain_name, 32 | usdValue 33 | ) 34 | } 35 | } -------------------------------------------------------------------------------- /src/messages/msgSwapExactAmount.ts: -------------------------------------------------------------------------------- 1 | import { MsgSwapExactAmountIn, MsgSwapExactAmountOut } from "osmojs/dist/codegen/osmosis/gamm/v1beta1/tx"; 2 | import { HandlerContext } from "."; 3 | import { getNotifyDenomConfig } from "../config"; 4 | import Big from "big.js"; 5 | import { notifyOsmosisSwap } from "../integrations/telegram"; 6 | import { fromBaseUnit, parseStringCoin } from "../helpers"; 7 | import { prisma } from "../db"; 8 | import { Token } from "@prisma/client"; 9 | import { getPriceByIdentifier } from "../integrations/coingecko"; 10 | import { TokenSwapInfo } from "../types"; 11 | 12 | 13 | export const handleMsgSwapExactAmountInOut = async (ctx: HandlerContext) => { 14 | let decodedMsg = ctx.decodedMsg as MsgSwapExactAmountOut; 15 | let swap: TokenSwapInfo | undefined; 16 | if (ctx.msgType.includes("MsgSwapExactAmountIn")) 17 | swap = await parseSwapMsgIn(ctx); 18 | else if (ctx.msgType.includes("MsgSwapExactAmountOut")) 19 | swap = await parseSwapMsgOut(ctx); 20 | 21 | if (!swap || swap.tokenIn.ticker === swap.tokenOut.ticker) 22 | return; 23 | 24 | let inAmountConfig = await getNotifyDenomConfig(ctx.chain.chain_name, swap.tokenIn.identifier, "msgSwapExactAmountInOut"); 25 | let outAmountConfig = await getNotifyDenomConfig(ctx.chain.chain_name, swap.tokenOut.identifier, "msgSwapExactAmountInOut"); 26 | 27 | let inUsdPriceValue = await getPriceByIdentifier(inAmountConfig?.identifier); 28 | let outUsdPriceValue = await getPriceByIdentifier(outAmountConfig?.identifier); 29 | let inUsdValue = inUsdPriceValue && fromBaseUnit(swap.tokenIn.amount, swap.tokenIn.decimals).mul(inUsdPriceValue).toNumber(); 30 | let outUsdValue = outUsdPriceValue && fromBaseUnit(swap.tokenOut.amount, swap.tokenOut.decimals).mul(outUsdPriceValue).toNumber(); 31 | 32 | if (inAmountConfig && Big(swap.tokenIn.amount).gte(Big(inAmountConfig.thresholdAmount)) || 33 | outAmountConfig && Big(swap.tokenOut.amount).gte(Big(outAmountConfig.thresholdAmount))) 34 | await notifyOsmosisSwap( 35 | decodedMsg.sender, 36 | fromBaseUnit(swap.tokenIn.amount, swap.tokenIn.decimals), 37 | swap.tokenIn.ticker, 38 | fromBaseUnit(swap.tokenOut.amount, swap.tokenOut.decimals), 39 | swap.tokenOut.ticker, 40 | ctx.tx.hash, 41 | ctx.chain.chain_name, 42 | inUsdValue || outUsdValue 43 | ); 44 | } 45 | 46 | const parseSwapMsgOut = async (ctx: HandlerContext): Promise => { 47 | let decodedMsg = ctx.decodedMsg as MsgSwapExactAmountOut; 48 | 49 | let tokenSwappedFirst = ctx.tx.events 50 | .filter(x => x.type === "token_swapped") 51 | .find(x => x.attributes.find(y => y?.key === "pool_id")?.value.toString() === decodedMsg.routes.at(1)?.poolId.toString()); 52 | let tokenIn = tokenSwappedFirst?.attributes.find(x => x.key === "tokens_in")?.value; 53 | if (!tokenIn) 54 | return; 55 | 56 | let tokenInMeta = await parseStringCoin(tokenIn); 57 | if (!tokenInMeta) 58 | return; 59 | 60 | let tokenOutMeta = await prisma.token.findUnique({ 61 | where: { 62 | identifier: decodedMsg.tokenOut.denom 63 | } 64 | }); 65 | if (!tokenOutMeta) 66 | return; 67 | 68 | return { 69 | tokenIn: { 70 | ...tokenInMeta 71 | }, 72 | tokenOut: { 73 | ...tokenOutMeta, 74 | amount: decodedMsg.tokenOut.amount 75 | } 76 | } 77 | } 78 | 79 | const parseSwapMsgIn = async (ctx: HandlerContext): Promise => { 80 | let decodedMsg = ctx.decodedMsg as MsgSwapExactAmountIn; 81 | 82 | let tokenSwappedLast = ctx.tx.events 83 | .filter(x => x.type === "token_swapped") 84 | .find(x => x.attributes.find(y => y?.key === "pool_id")?.value.toString() === decodedMsg.routes.at(-1)?.poolId.toString()); 85 | let tokenOut = tokenSwappedLast?.attributes.find(x => x.key === "tokens_out")?.value; 86 | if (!tokenOut) 87 | return; 88 | 89 | let parsedTokenOut = await parseStringCoin(tokenOut); 90 | if (!parsedTokenOut) 91 | return; 92 | 93 | let tokenInResult = await prisma.token.findUnique({ 94 | where: { 95 | network: "osmosis", 96 | identifier: decodedMsg.tokenIn.denom 97 | } 98 | }); 99 | if (!tokenInResult) 100 | return; 101 | 102 | return { 103 | tokenIn: { 104 | ...tokenInResult, 105 | amount: decodedMsg.tokenIn.amount 106 | }, 107 | tokenOut: { ...parsedTokenOut } 108 | } 109 | } -------------------------------------------------------------------------------- /src/messages/msgUndelegate.ts: -------------------------------------------------------------------------------- 1 | import { MsgDelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; 2 | import { HandlerContext } from "."; 3 | import { getNotifyDenomConfig } from "../config"; 4 | import Big from "big.js"; 5 | import { fromBaseUnit } from "../helpers"; 6 | import { notifyMsgUndelegate } from "../integrations/telegram"; 7 | import { getValidatorMoniker } from "../integrations/validators"; 8 | import { getPriceByIdentifier } from "../integrations/coingecko"; 9 | 10 | export const handleMsgUndelegate = async (ctx: HandlerContext) => { 11 | let decodedMsg = ctx.decodedMsg as MsgDelegate; 12 | let coin = decodedMsg.amount; 13 | 14 | let config = await getNotifyDenomConfig(ctx.chain.chain_name, coin.denom, "msgUndelegate"); 15 | if (!config) 16 | return; 17 | 18 | if (!coin.amount || !config.thresholdAmount) 19 | return; 20 | 21 | if (Big(coin.amount).lt(Big(config.thresholdAmount))) 22 | return; 23 | 24 | let usdPrice = await getPriceByIdentifier(config.identifier); 25 | if (!usdPrice) 26 | return; 27 | let usdValue = fromBaseUnit(coin.amount, config.decimals).mul(usdPrice).toNumber(); 28 | 29 | await notifyMsgUndelegate( 30 | decodedMsg.delegatorAddress, 31 | await getValidatorMoniker(ctx.chain.chain_name, decodedMsg.validatorAddress), 32 | config.ticker, 33 | fromBaseUnit(coin.amount, config.decimals), 34 | ctx.tx.hash, 35 | ctx.chain.chain_name, 36 | usdValue); 37 | } 38 | -------------------------------------------------------------------------------- /src/messages/msgWithdrawPosition.ts: -------------------------------------------------------------------------------- 1 | import { HandlerContext } from "."; 2 | import { getNotifyDenomConfig } from "../config"; 3 | import { notifyOsmosisExitPool, notifyOsmosisExitPoolOneSide } from "../integrations/telegram"; 4 | import { fromBaseUnit, isContractAddress, parseStringCoin, shortAddress } from "../helpers"; 5 | import { getPriceByIdentifier } from "../integrations/coingecko"; 6 | import { MsgWithdrawPosition } from "osmojs/dist/codegen/osmosis/concentrated-liquidity/tx"; 7 | import Big from "big.js"; 8 | 9 | export const msgWithdrawPosition = async (ctx: HandlerContext) => { 10 | let decodedMsg = ctx.decodedMsg as MsgWithdrawPosition; 11 | let oneSidePosition = false; 12 | let sender = decodedMsg.sender; 13 | 14 | let positionEvent = ctx.tx.events.find(x => x.type === "withdraw_position"); 15 | let amount0 = positionEvent?.attributes.find(x => x.key === "amount0")?.value; 16 | let amount1 = positionEvent?.attributes.find(x => x.key === "amount1")?.value; 17 | if (!positionEvent || !amount0 || !amount1) 18 | return; 19 | 20 | let amount0Big = Big(amount0).abs(); 21 | let amount1Big = Big(amount1).abs(); 22 | 23 | if (amount0Big.eq(0) || amount1Big.eq(0)) 24 | oneSidePosition = true; 25 | 26 | //just for example tx B029F5A54C3A48A0688DE5028BA71DE5BFC99FB2C6537EAC80D25DD398A402F7 27 | //we want to find transfer from contract's address to sender where 28 | //amount0 = 4253 and amount1 = 314737 from withdraw_position match transfer's amount 29 | //4253factory/osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k/stuibcx,314737uosmo 30 | let trasferEvent = ctx.tx.events.find(x => { 31 | let withdrawnAmounts = x.attributes.find(y => y.key === "amount")?.value; 32 | if (!withdrawnAmounts) 33 | return false; 34 | //split 4253factory/osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k/stuibcx,314737uosmo 35 | //to 4253factory/osmo1xqw2sl9zk8a6pch0csaw78n4swg5ws8t62wc5qta4gnjxfqg6v2qcs243k/stuibcx AND 314737uosmo 36 | let assets = withdrawnAmounts.split(","); 37 | 38 | //check if there's asset starts with 4253 amount, if amount0 === 0 then it's one sided withdraw 39 | if (amount0Big.gt(0) && !assets.find(x => x.startsWith(amount0Big.toFixed()))) 40 | return false; 41 | 42 | //check if there's asset starts with 314737 amount, if amount0 === 0 then it's one sided withdraw 43 | if (amount1Big.gt(0) && !assets.find(x => x.startsWith(amount1Big.toFixed()))) 44 | return false; 45 | 46 | return x.type === "transfer" && 47 | //we search transfer from sender's address 48 | x.attributes.find(y => y.key === "recipient")?.value === sender && 49 | //to contract address 50 | isContractAddress(x.attributes.find(y => y.key === "sender")?.value) && 51 | //if there's multiple msgs executed through authz, we should also check msg_index 52 | ((ctx.msgIndex > 0 && ctx.isAuthzTx) ? x.attributes.find(y => y.key === "authz_msg_index")?.value === ctx.msgIndex.toString() : true) 53 | }); 54 | 55 | let poolIdValue = positionEvent.attributes.find(x => x.key === "pool_id")?.value; 56 | let transferEventValue = trasferEvent?.attributes.find(x => x.key === "amount")?.value; 57 | if (!poolIdValue || !transferEventValue || !sender) 58 | return; 59 | 60 | let [token1, token2] = await Promise.all(transferEventValue.split(",").map(x => parseStringCoin(x, true))); 61 | let token1Config = await getNotifyDenomConfig(ctx.chain.chain_name, token1?.identifier, "msgWithdrawPosition"); 62 | let token2Config = await getNotifyDenomConfig(ctx.chain.chain_name, token2?.identifier, "msgWithdrawPosition"); 63 | if (!token1Config && !token2Config) 64 | return; 65 | 66 | let matchByToken1 = token1Config?.thresholdAmount && token1?.amount && Big(token1.amount).gt(token1Config.thresholdAmount); 67 | let matchByToken2 = token2Config?.thresholdAmount && token2?.amount && Big(token2.amount).gt(token2Config.thresholdAmount); 68 | if (!matchByToken1 && !matchByToken2) 69 | return; 70 | 71 | let token1Price = await getPriceByIdentifier(token1?.identifier); 72 | let token2Price = await getPriceByIdentifier(token2?.identifier); 73 | let token1Value = fromBaseUnit(token1?.amount || 0, token1?.decimals).mul(token1Price || 0); 74 | let token2Value = fromBaseUnit(token2?.amount || 0, token2?.decimals).mul(token2Price || 0); 75 | let usdValue: number | undefined; 76 | if (oneSidePosition) 77 | usdValue = (token1Price ? token1Value : token2Value).toNumber(); 78 | else 79 | usdValue = token1Price && token2Price ? token1Value.plus(token2Value).toNumber() : undefined 80 | 81 | 82 | if (oneSidePosition) { 83 | return await notifyOsmosisExitPoolOneSide( 84 | sender, 85 | fromBaseUnit(token1?.amount || 0, token1?.decimals).toFixed(), 86 | token1Config!.ticker, 87 | ctx.tx.hash, 88 | ctx.chain.chain_name, 89 | poolIdValue, 90 | usdValue 91 | ); 92 | }; 93 | 94 | await notifyOsmosisExitPool( 95 | sender, 96 | fromBaseUnit(token1?.amount || 0, token1?.decimals).toFixed() || "", 97 | token1?.ticker || shortAddress(token1?.identifier || "") || "", 98 | fromBaseUnit(token2?.amount || 0, token2?.decimals).toFixed() || "", 99 | token2?.ticker || shortAddress(token2?.identifier || "") || "", 100 | ctx.tx.hash, 101 | ctx.chain.chain_name, 102 | poolIdValue, 103 | usdValue, 104 | true 105 | ) 106 | } -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { Token } from "@prisma/client"; 2 | 3 | export type MsgTypes = 4 | "msgSwapExactAmountInOut" | 5 | "msgDelegate" | 6 | "msgExecuteContract" | 7 | "msgSend" | 8 | "msgUndelegate" | 9 | "msgBeginRedelegate" | 10 | "msgSifchainSwap" | 11 | "msgJoinPool" | 12 | "msgExitPool" | 13 | "msgCreatePosition" | 14 | "msgWithdrawPosition"; 15 | 16 | 17 | export type CoinWithMetadata = Token & { amount: string }; 18 | 19 | export type TokenSwapInfo = { 20 | tokenIn: CoinWithMetadata, 21 | tokenOut: CoinWithMetadata 22 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | /* Projects */ 5 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 6 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 7 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 8 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 9 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 10 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 11 | /* Language and Environment */ 12 | "target": "ES6", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 13 | "lib": [ 14 | "ES2022", 15 | "ES2022.String" 16 | ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 17 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 18 | "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 19 | "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 20 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 21 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 22 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 23 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 24 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 25 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 26 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 27 | /* Modules */ 28 | "module": "CommonJS", /* Specify what module code is generated. */ 29 | // "rootDir": "", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | "resolveJsonModule": true, /* Enable importing .json files. */ 39 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 40 | /* JavaScript Support */ 41 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 42 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 43 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 44 | /* Emit */ 45 | "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 46 | "declarationMap": true, /* Create sourcemaps for d.ts files. */ 47 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 48 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 49 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 50 | "outDir": "./build", /* Specify an output folder for all emitted files. */ 51 | // "removeComments": true, /* Disable emitting comments. */ 52 | // "noEmit": true, /* Disable emitting files from a compilation. */ 53 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 54 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 55 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 56 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 59 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 60 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 61 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 62 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 63 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 64 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 65 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 66 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 67 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 68 | /* Interop Constraints */ 69 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 70 | "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 71 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 72 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 73 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 74 | /* Type Checking */ 75 | "strict": true, /* Enable all strict type-checking options. */ 76 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 77 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 78 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 79 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 80 | "strictPropertyInitialization": false, /* Check for class properties that are declared but not set in the constructor. */ 81 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 82 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 83 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 84 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 85 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 86 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 87 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 88 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 89 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 90 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 91 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 92 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 93 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 94 | /* Completeness */ 95 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 96 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 97 | }, 98 | "include": [ 99 | "src/**/*.ts" 100 | ], 101 | "exclude": [ 102 | "node_modules", 103 | "./build" 104 | ] 105 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.21.0": 6 | version "7.23.7" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.7.tgz#dd7c88deeb218a0f8bd34d5db1aa242e0f203193" 8 | integrity sha512-w06OXVOFso7LcbzMiDGt+3X7Rh7Ho8MmgPoWU3rarH+8upf+wSU/grlGbWzQyr3DkdN6ZeuMFjpdwW0Q+HxobA== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@chain-registry/types@^0.17.1": 13 | version "0.17.1" 14 | resolved "https://registry.yarnpkg.com/@chain-registry/types/-/types-0.17.1.tgz#0ac7bda6178d3917834578627f232a247fe5def8" 15 | integrity sha512-O0CgrtJgIlqXvZm1CqDZe/7jZz068O/uuCIoyDXCegFHK03rdHacKcDGwEIUuI0MNUf8YV3jdE4xHQMSAX+79w== 16 | dependencies: 17 | "@babel/runtime" "^7.21.0" 18 | 19 | "@confio/ics23@^0.6.8": 20 | version "0.6.8" 21 | resolved "https://registry.yarnpkg.com/@confio/ics23/-/ics23-0.6.8.tgz#2a6b4f1f2b7b20a35d9a0745bb5a446e72930b3d" 22 | integrity sha512-wB6uo+3A50m0sW/EWcU64xpV/8wShZ6bMTa7pF8eYsTrSkQA7oLUIJcs/wb8g4y2Oyq701BaGiO6n/ak5WXO1w== 23 | dependencies: 24 | "@noble/hashes" "^1.0.0" 25 | protobufjs "^6.8.8" 26 | 27 | "@cosmjs/amino@0.29.3": 28 | version "0.29.3" 29 | resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.3.tgz#5aa338a301ea970a93e15522706615efea507c10" 30 | integrity sha512-BFz1++ERerIggiFc7iGHhGe1CeV3rCv8BvkoBQTBN/ZwzHOaKvqQj8smDlRGlQxX3HWlTwgiLN2A+OB5yX4ZRw== 31 | dependencies: 32 | "@cosmjs/crypto" "^0.29.3" 33 | "@cosmjs/encoding" "^0.29.3" 34 | "@cosmjs/math" "^0.29.3" 35 | "@cosmjs/utils" "^0.29.3" 36 | 37 | "@cosmjs/amino@^0.29.3", "@cosmjs/amino@^0.29.5": 38 | version "0.29.5" 39 | resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.29.5.tgz#053b4739a90b15b9e2b781ccd484faf64bd49aec" 40 | integrity sha512-Qo8jpC0BiziTSUqpkNatBcwtKNhCovUnFul9SlT/74JUCdLYaeG5hxr3q1cssQt++l4LvlcpF+OUXL48XjNjLw== 41 | dependencies: 42 | "@cosmjs/crypto" "^0.29.5" 43 | "@cosmjs/encoding" "^0.29.5" 44 | "@cosmjs/math" "^0.29.5" 45 | "@cosmjs/utils" "^0.29.5" 46 | 47 | "@cosmjs/amino@^0.32.0", "@cosmjs/amino@^0.32.1", "@cosmjs/amino@^0.32.2": 48 | version "0.32.2" 49 | resolved "https://registry.yarnpkg.com/@cosmjs/amino/-/amino-0.32.2.tgz#ba3cf255e4e6b1ba67461f1ef7b0b8ad3f895da7" 50 | integrity sha512-lcK5RCVm4OfdAooxKcF2+NwaDVVpghOq6o/A40c2mHXDUzUoRZ33VAHjVJ9Me6vOFxshrw/XEFn1f4KObntjYA== 51 | dependencies: 52 | "@cosmjs/crypto" "^0.32.2" 53 | "@cosmjs/encoding" "^0.32.2" 54 | "@cosmjs/math" "^0.32.2" 55 | "@cosmjs/utils" "^0.32.2" 56 | 57 | "@cosmjs/cosmwasm-stargate@0.32.0": 58 | version "0.32.0" 59 | resolved "https://registry.yarnpkg.com/@cosmjs/cosmwasm-stargate/-/cosmwasm-stargate-0.32.0.tgz#b35bd57edf9aac9008990b366bfad9ece35d71b1" 60 | integrity sha512-XcCedSMNV5/choH3JCXAiwytBq0uqGI2k5tzifjUifnwd4v58hVA4NUIxUaXk4nWJ5Izd8iylCSmR2owH77Eqw== 61 | dependencies: 62 | "@cosmjs/amino" "^0.32.0" 63 | "@cosmjs/crypto" "^0.32.0" 64 | "@cosmjs/encoding" "^0.32.0" 65 | "@cosmjs/math" "^0.32.0" 66 | "@cosmjs/proto-signing" "^0.32.0" 67 | "@cosmjs/stargate" "^0.32.0" 68 | "@cosmjs/tendermint-rpc" "^0.32.0" 69 | "@cosmjs/utils" "^0.32.0" 70 | cosmjs-types "^0.9.0" 71 | pako "^2.0.2" 72 | 73 | "@cosmjs/crypto@^0.29.3", "@cosmjs/crypto@^0.29.5": 74 | version "0.29.5" 75 | resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.29.5.tgz#ab99fc382b93d8a8db075780cf07487a0f9519fd" 76 | integrity sha512-2bKkaLGictaNL0UipQCL6C1afaisv6k8Wr/GCLx9FqiyFkh9ZgRHDyetD64ZsjnWV/N/D44s/esI+k6oPREaiQ== 77 | dependencies: 78 | "@cosmjs/encoding" "^0.29.5" 79 | "@cosmjs/math" "^0.29.5" 80 | "@cosmjs/utils" "^0.29.5" 81 | "@noble/hashes" "^1" 82 | bn.js "^5.2.0" 83 | elliptic "^6.5.4" 84 | libsodium-wrappers "^0.7.6" 85 | 86 | "@cosmjs/crypto@^0.32.0", "@cosmjs/crypto@^0.32.2": 87 | version "0.32.2" 88 | resolved "https://registry.yarnpkg.com/@cosmjs/crypto/-/crypto-0.32.2.tgz#8ed255d3d1c1c4d916a1586f8cbc33eaab82f511" 89 | integrity sha512-RuxrYKzhrPF9g6NmU7VEq++Hn1vZJjqqJpZ9Tmw9lOYOV8BUsv+j/0BE86kmWi7xVJ7EwxiuxYsKuM8IR18CIA== 90 | dependencies: 91 | "@cosmjs/encoding" "^0.32.2" 92 | "@cosmjs/math" "^0.32.2" 93 | "@cosmjs/utils" "^0.32.2" 94 | "@noble/hashes" "^1" 95 | bn.js "^5.2.0" 96 | elliptic "^6.5.4" 97 | libsodium-wrappers-sumo "^0.7.11" 98 | 99 | "@cosmjs/encoding@^0.29.3", "@cosmjs/encoding@^0.29.5": 100 | version "0.29.5" 101 | resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.29.5.tgz#009a4b1c596cdfd326f30ccfa79f5e56daa264f2" 102 | integrity sha512-G4rGl/Jg4dMCw5u6PEZHZcoHnUBlukZODHbm/wcL4Uu91fkn5jVo5cXXZcvs4VCkArVGrEj/52eUgTZCmOBGWQ== 103 | dependencies: 104 | base64-js "^1.3.0" 105 | bech32 "^1.1.4" 106 | readonly-date "^1.0.0" 107 | 108 | "@cosmjs/encoding@^0.32.0", "@cosmjs/encoding@^0.32.1", "@cosmjs/encoding@^0.32.2": 109 | version "0.32.2" 110 | resolved "https://registry.yarnpkg.com/@cosmjs/encoding/-/encoding-0.32.2.tgz#8c5c64481a85cd570740c34dccce69d024a29805" 111 | integrity sha512-WX7m1wLpA9V/zH0zRcz4EmgZdAv1F44g4dbXOgNj1eXZw1PIGR12p58OEkLN51Ha3S4DKRtCv5CkhK1KHEvQtg== 112 | dependencies: 113 | base64-js "^1.3.0" 114 | bech32 "^1.1.4" 115 | readonly-date "^1.0.0" 116 | 117 | "@cosmjs/json-rpc@^0.29.5": 118 | version "0.29.5" 119 | resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.29.5.tgz#5e483a9bd98a6270f935adf0dfd8a1e7eb777fe4" 120 | integrity sha512-C78+X06l+r9xwdM1yFWIpGl03LhB9NdM1xvZpQHwgCOl0Ir/WV8pw48y3Ez2awAoUBRfTeejPe4KvrE6NoIi/w== 121 | dependencies: 122 | "@cosmjs/stream" "^0.29.5" 123 | xstream "^11.14.0" 124 | 125 | "@cosmjs/json-rpc@^0.32.2": 126 | version "0.32.2" 127 | resolved "https://registry.yarnpkg.com/@cosmjs/json-rpc/-/json-rpc-0.32.2.tgz#f87fab0d6975ed1d1c7daafcf6f1f81e5e296912" 128 | integrity sha512-lan2lOgmz4yVE/HR8eCOSiII/1OudIulk8836koyIDCsPEpt6eKBuctnAD168vABGArKccLAo7Mr2gy9nrKrOQ== 129 | dependencies: 130 | "@cosmjs/stream" "^0.32.2" 131 | xstream "^11.14.0" 132 | 133 | "@cosmjs/math@^0.29.3", "@cosmjs/math@^0.29.5": 134 | version "0.29.5" 135 | resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.29.5.tgz#722c96e080d6c2b62215ce9f4c70da7625b241b6" 136 | integrity sha512-2GjKcv+A9f86MAWYLUkjhw1/WpRl2R1BTb3m9qPG7lzMA7ioYff9jY5SPCfafKdxM4TIQGxXQlYGewQL16O68Q== 137 | dependencies: 138 | bn.js "^5.2.0" 139 | 140 | "@cosmjs/math@^0.32.0", "@cosmjs/math@^0.32.1", "@cosmjs/math@^0.32.2": 141 | version "0.32.2" 142 | resolved "https://registry.yarnpkg.com/@cosmjs/math/-/math-0.32.2.tgz#4522312769197e132679e4960862bcec0eed4cb8" 143 | integrity sha512-b8+ruAAY8aKtVKWSft2IvtCVCUH1LigIlf9ALIiY8n9jtM4kMASiaRbQ/27etnSAInV88IaezKK9rQZrtxTjcw== 144 | dependencies: 145 | bn.js "^5.2.0" 146 | 147 | "@cosmjs/proto-signing@0.29.3": 148 | version "0.29.3" 149 | resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.3.tgz#fa5ed609ed2a0007d8d5eacbeb1f5a89ba1b77ff" 150 | integrity sha512-Ai3l9THjMOrLJ4Ebn1Dgptwg6W5ZIRJqtnJjijHhGwTVC1WT0WdYU3aMZ7+PwubcA/cA1rH4ZTK7jrfYbra63g== 151 | dependencies: 152 | "@cosmjs/amino" "^0.29.3" 153 | "@cosmjs/crypto" "^0.29.3" 154 | "@cosmjs/encoding" "^0.29.3" 155 | "@cosmjs/math" "^0.29.3" 156 | "@cosmjs/utils" "^0.29.3" 157 | cosmjs-types "^0.5.2" 158 | long "^4.0.0" 159 | 160 | "@cosmjs/proto-signing@0.32.0": 161 | version "0.32.0" 162 | resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.0.tgz#3f182552257b68d040d945913356c399281df0ce" 163 | integrity sha512-9401CI0U5rvKMmYrEN4DAl7wvRd5PwfOTPgxoee+O0d3LzK4FUbTjnNIM7DeUi0zaQw/qU3vSbA3ZcMqPifSbQ== 164 | dependencies: 165 | "@cosmjs/amino" "^0.32.0" 166 | "@cosmjs/crypto" "^0.32.0" 167 | "@cosmjs/encoding" "^0.32.0" 168 | "@cosmjs/math" "^0.32.0" 169 | "@cosmjs/utils" "^0.32.0" 170 | cosmjs-types "^0.9.0" 171 | 172 | "@cosmjs/proto-signing@^0.29.3": 173 | version "0.29.5" 174 | resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.29.5.tgz#af3b62a46c2c2f1d2327d678b13b7262db1fe87c" 175 | integrity sha512-QRrS7CiKaoETdgIqvi/7JC2qCwCR7lnWaUsTzh/XfRy3McLkEd+cXbKAW3cygykv7IN0VAEIhZd2lyIfT8KwNA== 176 | dependencies: 177 | "@cosmjs/amino" "^0.29.5" 178 | "@cosmjs/crypto" "^0.29.5" 179 | "@cosmjs/encoding" "^0.29.5" 180 | "@cosmjs/math" "^0.29.5" 181 | "@cosmjs/utils" "^0.29.5" 182 | cosmjs-types "^0.5.2" 183 | long "^4.0.0" 184 | 185 | "@cosmjs/proto-signing@^0.32.0", "@cosmjs/proto-signing@^0.32.1", "@cosmjs/proto-signing@^0.32.2": 186 | version "0.32.2" 187 | resolved "https://registry.yarnpkg.com/@cosmjs/proto-signing/-/proto-signing-0.32.2.tgz#26ed2675978ce24078981f4c15a06c5d6b808f44" 188 | integrity sha512-UV4WwkE3W3G3s7wwU9rizNcUEz2g0W8jQZS5J6/3fiN0mRPwtPKQ6EinPN9ASqcAJ7/VQH4/9EPOw7d6XQGnqw== 189 | dependencies: 190 | "@cosmjs/amino" "^0.32.2" 191 | "@cosmjs/crypto" "^0.32.2" 192 | "@cosmjs/encoding" "^0.32.2" 193 | "@cosmjs/math" "^0.32.2" 194 | "@cosmjs/utils" "^0.32.2" 195 | cosmjs-types "^0.9.0" 196 | 197 | "@cosmjs/socket@^0.29.5": 198 | version "0.29.5" 199 | resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.29.5.tgz#a48df6b4c45dc6a6ef8e47232725dd4aa556ac2d" 200 | integrity sha512-5VYDupIWbIXq3ftPV1LkS5Ya/T7Ol/AzWVhNxZ79hPe/mBfv1bGau/LqIYOm2zxGlgm9hBHOTmWGqNYDwr9LNQ== 201 | dependencies: 202 | "@cosmjs/stream" "^0.29.5" 203 | isomorphic-ws "^4.0.1" 204 | ws "^7" 205 | xstream "^11.14.0" 206 | 207 | "@cosmjs/socket@^0.32.2": 208 | version "0.32.2" 209 | resolved "https://registry.yarnpkg.com/@cosmjs/socket/-/socket-0.32.2.tgz#a66be3863d03bf2d8df0433af476df010ff10e8c" 210 | integrity sha512-Qc8jaw4uSBJm09UwPgkqe3g9TBFx4ZR9HkXpwT6Z9I+6kbLerXPR0Gy3NSJFSUgxIfTpO8O1yqoWAyf0Ay17Mw== 211 | dependencies: 212 | "@cosmjs/stream" "^0.32.2" 213 | isomorphic-ws "^4.0.1" 214 | ws "^7" 215 | xstream "^11.14.0" 216 | 217 | "@cosmjs/stargate@0.29.3": 218 | version "0.29.3" 219 | resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.29.3.tgz#9bd303bfd32a7399a233e662864e7cc32e2607af" 220 | integrity sha512-455TgXStCi6E8KDjnhDAM8wt6aLSjobH4Dixvd7Up1DfCH6UB9NkC/G0fMJANNcNXMaM4wSX14niTXwD1d31BA== 221 | dependencies: 222 | "@confio/ics23" "^0.6.8" 223 | "@cosmjs/amino" "^0.29.3" 224 | "@cosmjs/encoding" "^0.29.3" 225 | "@cosmjs/math" "^0.29.3" 226 | "@cosmjs/proto-signing" "^0.29.3" 227 | "@cosmjs/stream" "^0.29.3" 228 | "@cosmjs/tendermint-rpc" "^0.29.3" 229 | "@cosmjs/utils" "^0.29.3" 230 | cosmjs-types "^0.5.2" 231 | long "^4.0.0" 232 | protobufjs "~6.11.3" 233 | xstream "^11.14.0" 234 | 235 | "@cosmjs/stargate@0.32.0": 236 | version "0.32.0" 237 | resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.0.tgz#2f1e1af50ad3156747e377a350b39673c664d324" 238 | integrity sha512-Yo3l+A4vdy3ql30cIanY/j2uD3zxRXTQPrn2YUc67qCxacFkf7Fn3N9GdI7D/B2LQlguf/B5OwheizzWucapkw== 239 | dependencies: 240 | "@confio/ics23" "^0.6.8" 241 | "@cosmjs/amino" "^0.32.0" 242 | "@cosmjs/encoding" "^0.32.0" 243 | "@cosmjs/math" "^0.32.0" 244 | "@cosmjs/proto-signing" "^0.32.0" 245 | "@cosmjs/stream" "^0.32.0" 246 | "@cosmjs/tendermint-rpc" "^0.32.0" 247 | "@cosmjs/utils" "^0.32.0" 248 | cosmjs-types "^0.9.0" 249 | xstream "^11.14.0" 250 | 251 | "@cosmjs/stargate@0.32.1": 252 | version "0.32.1" 253 | resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.1.tgz#c4e3a4b6847ef45c26275e64f4668274cae01f9c" 254 | integrity sha512-S0E1qKQ2CMJU79G8bQTquTyrbU03gFsvCkbo3RvK8v2OltVCByjFNh+0nGN5do+uDOzwwmDvnNLhR+SaIyNQoQ== 255 | dependencies: 256 | "@confio/ics23" "^0.6.8" 257 | "@cosmjs/amino" "^0.32.1" 258 | "@cosmjs/encoding" "^0.32.1" 259 | "@cosmjs/math" "^0.32.1" 260 | "@cosmjs/proto-signing" "^0.32.1" 261 | "@cosmjs/stream" "^0.32.1" 262 | "@cosmjs/tendermint-rpc" "^0.32.1" 263 | "@cosmjs/utils" "^0.32.1" 264 | cosmjs-types "^0.9.0" 265 | xstream "^11.14.0" 266 | 267 | "@cosmjs/stargate@^0.32.0": 268 | version "0.32.2" 269 | resolved "https://registry.yarnpkg.com/@cosmjs/stargate/-/stargate-0.32.2.tgz#73718c5c6a3ae138682ee9987333d911eca22a13" 270 | integrity sha512-AsJa29fT7Jd4xt9Ai+HMqhyj7UQu7fyYKdXj/8+/9PD74xe6lZSYhQPcitUmMLJ1ckKPgXSk5Dd2LbsQT0IhZg== 271 | dependencies: 272 | "@confio/ics23" "^0.6.8" 273 | "@cosmjs/amino" "^0.32.2" 274 | "@cosmjs/encoding" "^0.32.2" 275 | "@cosmjs/math" "^0.32.2" 276 | "@cosmjs/proto-signing" "^0.32.2" 277 | "@cosmjs/stream" "^0.32.2" 278 | "@cosmjs/tendermint-rpc" "^0.32.2" 279 | "@cosmjs/utils" "^0.32.2" 280 | cosmjs-types "^0.9.0" 281 | xstream "^11.14.0" 282 | 283 | "@cosmjs/stream@^0.29.3", "@cosmjs/stream@^0.29.5": 284 | version "0.29.5" 285 | resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.29.5.tgz#350981cac496d04939b92ee793b9b19f44bc1d4e" 286 | integrity sha512-TToTDWyH1p05GBtF0Y8jFw2C+4783ueDCmDyxOMM6EU82IqpmIbfwcdMOCAm0JhnyMh+ocdebbFvnX/sGKzRAA== 287 | dependencies: 288 | xstream "^11.14.0" 289 | 290 | "@cosmjs/stream@^0.32.0", "@cosmjs/stream@^0.32.1", "@cosmjs/stream@^0.32.2": 291 | version "0.32.2" 292 | resolved "https://registry.yarnpkg.com/@cosmjs/stream/-/stream-0.32.2.tgz#b1e8f977d25313d659f1aa89ad21614b5391cd93" 293 | integrity sha512-gpCufLfHAD8Zp1ZKge7AHbDf4RA0TZp66wZY6JaQR5bSiEF2Drjtp4mwXZPGejtaUMnaAgff3LrUzPJfKYdQwg== 294 | dependencies: 295 | xstream "^11.14.0" 296 | 297 | "@cosmjs/tendermint-rpc@^0.29.3": 298 | version "0.29.5" 299 | resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.29.5.tgz#f205c10464212bdf843f91bb2e4a093b618cb5c2" 300 | integrity sha512-ar80twieuAxsy0x2za/aO3kBr2DFPAXDmk2ikDbmkda+qqfXgl35l9CVAAjKRqd9d+cRvbQyb5M4wy6XQpEV6w== 301 | dependencies: 302 | "@cosmjs/crypto" "^0.29.5" 303 | "@cosmjs/encoding" "^0.29.5" 304 | "@cosmjs/json-rpc" "^0.29.5" 305 | "@cosmjs/math" "^0.29.5" 306 | "@cosmjs/socket" "^0.29.5" 307 | "@cosmjs/stream" "^0.29.5" 308 | "@cosmjs/utils" "^0.29.5" 309 | axios "^0.21.2" 310 | readonly-date "^1.0.0" 311 | xstream "^11.14.0" 312 | 313 | "@cosmjs/tendermint-rpc@^0.32.0", "@cosmjs/tendermint-rpc@^0.32.1", "@cosmjs/tendermint-rpc@^0.32.2": 314 | version "0.32.2" 315 | resolved "https://registry.yarnpkg.com/@cosmjs/tendermint-rpc/-/tendermint-rpc-0.32.2.tgz#c5607b8d472e5bf9fd58d5453db7194f500ccc62" 316 | integrity sha512-DXyJHDmcAfCix4H/7/dKR0UMdshP01KxJOXHdHxBCbLIpck94BsWD3B2ZTXwfA6sv98so9wOzhp7qGQa5malxg== 317 | dependencies: 318 | "@cosmjs/crypto" "^0.32.2" 319 | "@cosmjs/encoding" "^0.32.2" 320 | "@cosmjs/json-rpc" "^0.32.2" 321 | "@cosmjs/math" "^0.32.2" 322 | "@cosmjs/socket" "^0.32.2" 323 | "@cosmjs/stream" "^0.32.2" 324 | "@cosmjs/utils" "^0.32.2" 325 | axios "^1.6.0" 326 | readonly-date "^1.0.0" 327 | xstream "^11.14.0" 328 | 329 | "@cosmjs/utils@^0.29.3", "@cosmjs/utils@^0.29.5": 330 | version "0.29.5" 331 | resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.29.5.tgz#3fed1b3528ae8c5f1eb5d29b68755bebfd3294ee" 332 | integrity sha512-m7h+RXDUxOzEOGt4P+3OVPX7PuakZT3GBmaM/Y2u+abN3xZkziykD/NvedYFvvCCdQo714XcGl33bwifS9FZPQ== 333 | 334 | "@cosmjs/utils@^0.32.0", "@cosmjs/utils@^0.32.1", "@cosmjs/utils@^0.32.2": 335 | version "0.32.2" 336 | resolved "https://registry.yarnpkg.com/@cosmjs/utils/-/utils-0.32.2.tgz#324304aa85bfa6f10561cc17781d824d02130897" 337 | integrity sha512-Gg5t+eR7vPJMAmhkFt6CZrzPd0EKpAslWwk5rFVYZpJsM8JG5KT9XQ99hgNM3Ov6ScNoIWbXkpX27F6A9cXR4Q== 338 | 339 | "@cosmology/lcd@^0.12.0": 340 | version "0.12.0" 341 | resolved "https://registry.yarnpkg.com/@cosmology/lcd/-/lcd-0.12.0.tgz#a6594fc00a8c84c7341e90840627e62a7e63fd1b" 342 | integrity sha512-f2mcySYO1xdislAhuWtNFmg4q/bzY3Aem2UkDzYzI0ZELVev5i2Pi0bQrYUNTeNg1isAo0Kyrdqj/4YPqEwjGA== 343 | dependencies: 344 | "@babel/runtime" "^7.21.0" 345 | axios "0.27.2" 346 | 347 | "@cspotcode/source-map-support@^0.8.0": 348 | version "0.8.1" 349 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 350 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 351 | dependencies: 352 | "@jridgewell/trace-mapping" "0.3.9" 353 | 354 | "@jridgewell/resolve-uri@^3.0.3": 355 | version "3.1.1" 356 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" 357 | integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== 358 | 359 | "@jridgewell/sourcemap-codec@^1.4.10": 360 | version "1.4.15" 361 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 362 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 363 | 364 | "@jridgewell/trace-mapping@0.3.9": 365 | version "0.3.9" 366 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 367 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 368 | dependencies: 369 | "@jridgewell/resolve-uri" "^3.0.3" 370 | "@jridgewell/sourcemap-codec" "^1.4.10" 371 | 372 | "@noble/hashes@^1", "@noble/hashes@^1.0.0": 373 | version "1.3.3" 374 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.3.3.tgz#39908da56a4adc270147bb07968bf3b16cfe1699" 375 | integrity sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA== 376 | 377 | "@prisma/client@5.7.1": 378 | version "5.7.1" 379 | resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.7.1.tgz#a124afd05663267f7255a639a81d28303684a063" 380 | integrity sha512-TUSa4nUcC4nf/e7X3jyO1pEd6XcI/TLRCA0KjkA46RDIpxUaRsBYEOqITwXRW2c0bMFyKcCRXrH4f7h4q9oOlg== 381 | 382 | "@prisma/debug@5.7.1": 383 | version "5.7.1" 384 | resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.7.1.tgz#064177066e630beb43492ffa608acc21a118e2ce" 385 | integrity sha512-yrVSO/YZOxdeIxcBtZ5BaNqUfPrZkNsAKQIQg36cJKMxj/VYK3Vk5jMKkI+gQLl0KReo1YvX8GWKfV788SELjw== 386 | 387 | "@prisma/engines-version@5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5": 388 | version "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" 389 | resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5.tgz#b7845425313e5395a3a3e64f3e0d04c1f320fa92" 390 | integrity sha512-dIR5IQK/ZxEoWRBDOHF87r1Jy+m2ih3Joi4vzJRP+FOj5yxCwS2pS5SBR3TWoVnEK1zxtLI/3N7BjHyGF84fgw== 391 | 392 | "@prisma/engines@5.7.1": 393 | version "5.7.1" 394 | resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.7.1.tgz#631c27daa326bbacd5d7119446e0d3f15c0f274c" 395 | integrity sha512-R+Pqbra8tpLP2cvyiUpx+SIKglav3nTCpA+rn6826CThviQ8yvbNG0s8jNpo51vS9FuZO3pOkARqG062vKX7uA== 396 | dependencies: 397 | "@prisma/debug" "5.7.1" 398 | "@prisma/engines-version" "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" 399 | "@prisma/fetch-engine" "5.7.1" 400 | "@prisma/get-platform" "5.7.1" 401 | 402 | "@prisma/fetch-engine@5.7.1": 403 | version "5.7.1" 404 | resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.7.1.tgz#d7baa3493867c6f7cedfc41df477cfd0963059ca" 405 | integrity sha512-9ELauIEBkIaEUpMIYPRlh5QELfoC6pyHolHVQgbNxglaINikZ9w9X7r1TIePAcm05pCNp2XPY1ObQIJW5nYfBQ== 406 | dependencies: 407 | "@prisma/debug" "5.7.1" 408 | "@prisma/engines-version" "5.7.1-1.0ca5ccbcfa6bdc81c003cf549abe4269f59c41e5" 409 | "@prisma/get-platform" "5.7.1" 410 | 411 | "@prisma/get-platform@5.7.1": 412 | version "5.7.1" 413 | resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.7.1.tgz#bc2fe43838c7d47b321aa4728a0f60990d02bc9e" 414 | integrity sha512-eDlswr3a1m5z9D/55Iyt/nZqS5UpD+DZ9MooBB3hvrcPhDQrcf9m4Tl7buy4mvAtrubQ626ECtb8c6L/f7rGSQ== 415 | dependencies: 416 | "@prisma/debug" "5.7.1" 417 | 418 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 419 | version "1.1.2" 420 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 421 | integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== 422 | 423 | "@protobufjs/base64@^1.1.2": 424 | version "1.1.2" 425 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 426 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 427 | 428 | "@protobufjs/codegen@^2.0.4": 429 | version "2.0.4" 430 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 431 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 432 | 433 | "@protobufjs/eventemitter@^1.1.0": 434 | version "1.1.0" 435 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 436 | integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== 437 | 438 | "@protobufjs/fetch@^1.1.0": 439 | version "1.1.0" 440 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 441 | integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== 442 | dependencies: 443 | "@protobufjs/aspromise" "^1.1.1" 444 | "@protobufjs/inquire" "^1.1.0" 445 | 446 | "@protobufjs/float@^1.0.2": 447 | version "1.0.2" 448 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 449 | integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== 450 | 451 | "@protobufjs/inquire@^1.1.0": 452 | version "1.1.0" 453 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 454 | integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== 455 | 456 | "@protobufjs/path@^1.1.2": 457 | version "1.1.2" 458 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 459 | integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== 460 | 461 | "@protobufjs/pool@^1.1.0": 462 | version "1.1.0" 463 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 464 | integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== 465 | 466 | "@protobufjs/utf8@^1.1.0": 467 | version "1.1.0" 468 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 469 | integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== 470 | 471 | "@sqltools/formatter@^1.2.5": 472 | version "1.2.5" 473 | resolved "https://registry.yarnpkg.com/@sqltools/formatter/-/formatter-1.2.5.tgz#3abc203c79b8c3e90fd6c156a0c62d5403520e12" 474 | integrity sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw== 475 | 476 | "@telegraf/types@^6.9.1": 477 | version "6.9.1" 478 | resolved "https://registry.yarnpkg.com/@telegraf/types/-/types-6.9.1.tgz#ee2d335164f582db55337d77cc440c1faeadd510" 479 | integrity sha512-bzqwhicZq401T0e09tu8b1KvGfJObPmzKU/iKCT5V466AsAZZWQrBYQ5edbmD1VZuHLEwopoOVY5wPP4HaLtug== 480 | 481 | "@tsconfig/node10@^1.0.7": 482 | version "1.0.9" 483 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" 484 | integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== 485 | 486 | "@tsconfig/node12@^1.0.7": 487 | version "1.0.11" 488 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 489 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 490 | 491 | "@tsconfig/node14@^1.0.0": 492 | version "1.0.3" 493 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 494 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 495 | 496 | "@tsconfig/node16@^1.0.2": 497 | version "1.0.4" 498 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 499 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 500 | 501 | "@types/big.js@^6.2.2": 502 | version "6.2.2" 503 | resolved "https://registry.yarnpkg.com/@types/big.js/-/big.js-6.2.2.tgz#69422ec9ef59df1330ccfde2106d9e1159a083c3" 504 | integrity sha512-e2cOW9YlVzFY2iScnGBBkplKsrn2CsObHQ2Hiw4V1sSyiGbgWL8IyqE3zFi1Pt5o1pdAtYkDAIsF3KKUPjdzaA== 505 | 506 | "@types/body-parser@*": 507 | version "1.19.5" 508 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.5.tgz#04ce9a3b677dc8bd681a17da1ab9835dc9d3ede4" 509 | integrity sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg== 510 | dependencies: 511 | "@types/connect" "*" 512 | "@types/node" "*" 513 | 514 | "@types/connect@*": 515 | version "3.4.38" 516 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 517 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 518 | dependencies: 519 | "@types/node" "*" 520 | 521 | "@types/express-serve-static-core@^4.17.33": 522 | version "4.17.41" 523 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" 524 | integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== 525 | dependencies: 526 | "@types/node" "*" 527 | "@types/qs" "*" 528 | "@types/range-parser" "*" 529 | "@types/send" "*" 530 | 531 | "@types/express@^4.17.21": 532 | version "4.17.21" 533 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.21.tgz#c26d4a151e60efe0084b23dc3369ebc631ed192d" 534 | integrity sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ== 535 | dependencies: 536 | "@types/body-parser" "*" 537 | "@types/express-serve-static-core" "^4.17.33" 538 | "@types/qs" "*" 539 | "@types/serve-static" "*" 540 | 541 | "@types/http-errors@*": 542 | version "2.0.4" 543 | resolved "https://registry.yarnpkg.com/@types/http-errors/-/http-errors-2.0.4.tgz#7eb47726c391b7345a6ec35ad7f4de469cf5ba4f" 544 | integrity sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA== 545 | 546 | "@types/lodash@^4.14.202": 547 | version "4.14.202" 548 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.202.tgz#f09dbd2fb082d507178b2f2a5c7e74bd72ff98f8" 549 | integrity sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ== 550 | 551 | "@types/long@^4.0.1": 552 | version "4.0.2" 553 | resolved "https://registry.yarnpkg.com/@types/long/-/long-4.0.2.tgz#b74129719fc8d11c01868010082d483b7545591a" 554 | integrity sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA== 555 | 556 | "@types/mime@*": 557 | version "3.0.4" 558 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" 559 | integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== 560 | 561 | "@types/mime@^1": 562 | version "1.3.5" 563 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-1.3.5.tgz#1ef302e01cf7d2b5a0fa526790c9123bf1d06690" 564 | integrity sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w== 565 | 566 | "@types/node@*", "@types/node@>=13.7.0": 567 | version "20.10.6" 568 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" 569 | integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== 570 | dependencies: 571 | undici-types "~5.26.4" 572 | 573 | "@types/qs@*": 574 | version "6.9.11" 575 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.11.tgz#208d8a30bc507bd82e03ada29e4732ea46a6bbda" 576 | integrity sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ== 577 | 578 | "@types/range-parser@*": 579 | version "1.2.7" 580 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.7.tgz#50ae4353eaaddc04044279812f52c8c65857dbcb" 581 | integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== 582 | 583 | "@types/send@*": 584 | version "0.17.4" 585 | resolved "https://registry.yarnpkg.com/@types/send/-/send-0.17.4.tgz#6619cd24e7270793702e4e6a4b958a9010cfc57a" 586 | integrity sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA== 587 | dependencies: 588 | "@types/mime" "^1" 589 | "@types/node" "*" 590 | 591 | "@types/serve-static@*": 592 | version "1.15.5" 593 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.5.tgz#15e67500ec40789a1e8c9defc2d32a896f05b033" 594 | integrity sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ== 595 | dependencies: 596 | "@types/http-errors" "*" 597 | "@types/mime" "*" 598 | "@types/node" "*" 599 | 600 | abort-controller@^3.0.0: 601 | version "3.0.0" 602 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 603 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 604 | dependencies: 605 | event-target-shim "^5.0.0" 606 | 607 | accepts@~1.3.8: 608 | version "1.3.8" 609 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" 610 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 611 | dependencies: 612 | mime-types "~2.1.34" 613 | negotiator "0.6.3" 614 | 615 | acorn-walk@^8.1.1: 616 | version "8.3.1" 617 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" 618 | integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== 619 | 620 | acorn@^8.4.1: 621 | version "8.11.3" 622 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 623 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 624 | 625 | ansi-regex@^5.0.1: 626 | version "5.0.1" 627 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 628 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 629 | 630 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 631 | version "4.3.0" 632 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 633 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 634 | dependencies: 635 | color-convert "^2.0.1" 636 | 637 | any-promise@^1.0.0: 638 | version "1.3.0" 639 | resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" 640 | integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== 641 | 642 | app-root-path@^3.1.0: 643 | version "3.1.0" 644 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-3.1.0.tgz#5971a2fc12ba170369a7a1ef018c71e6e47c2e86" 645 | integrity sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA== 646 | 647 | arg@^4.1.0: 648 | version "4.1.3" 649 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 650 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 651 | 652 | array-flatten@1.1.1: 653 | version "1.1.1" 654 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 655 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 656 | 657 | asynckit@^0.4.0: 658 | version "0.4.0" 659 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 660 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 661 | 662 | axios@0.27.2: 663 | version "0.27.2" 664 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" 665 | integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== 666 | dependencies: 667 | follow-redirects "^1.14.9" 668 | form-data "^4.0.0" 669 | 670 | axios@^0.21.2: 671 | version "0.21.4" 672 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.21.4.tgz#c67b90dc0568e5c1cf2b0b858c43ba28e2eda575" 673 | integrity sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg== 674 | dependencies: 675 | follow-redirects "^1.14.0" 676 | 677 | axios@^1.6.0: 678 | version "1.6.3" 679 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.3.tgz#7f50f23b3aa246eff43c54834272346c396613f4" 680 | integrity sha512-fWyNdeawGam70jXSVlKl+SUNVcL6j6W79CuSIPfi6HnDUmSCH6gyUys/HrqHeA/wU0Az41rRgean494d0Jb+ww== 681 | dependencies: 682 | follow-redirects "^1.15.0" 683 | form-data "^4.0.0" 684 | proxy-from-env "^1.1.0" 685 | 686 | balanced-match@^1.0.0: 687 | version "1.0.2" 688 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 689 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 690 | 691 | base64-js@^1.3.0, base64-js@^1.3.1: 692 | version "1.5.1" 693 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 694 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 695 | 696 | bech32@^1.1.4: 697 | version "1.1.4" 698 | resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" 699 | integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== 700 | 701 | big.js@^6.2.1: 702 | version "6.2.1" 703 | resolved "https://registry.yarnpkg.com/big.js/-/big.js-6.2.1.tgz#7205ce763efb17c2e41f26f121c420c6a7c2744f" 704 | integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== 705 | 706 | bn.js@^4.11.9: 707 | version "4.12.0" 708 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 709 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 710 | 711 | bn.js@^5.2.0: 712 | version "5.2.1" 713 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" 714 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 715 | 716 | body-parser@1.20.1: 717 | version "1.20.1" 718 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" 719 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 720 | dependencies: 721 | bytes "3.1.2" 722 | content-type "~1.0.4" 723 | debug "2.6.9" 724 | depd "2.0.0" 725 | destroy "1.2.0" 726 | http-errors "2.0.0" 727 | iconv-lite "0.4.24" 728 | on-finished "2.4.1" 729 | qs "6.11.0" 730 | raw-body "2.5.1" 731 | type-is "~1.6.18" 732 | unpipe "1.0.0" 733 | 734 | brace-expansion@^2.0.1: 735 | version "2.0.1" 736 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 737 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 738 | dependencies: 739 | balanced-match "^1.0.0" 740 | 741 | brorand@^1.1.0: 742 | version "1.1.0" 743 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 744 | integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== 745 | 746 | buffer-alloc-unsafe@^1.1.0: 747 | version "1.1.0" 748 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 749 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 750 | 751 | buffer-alloc@^1.2.0: 752 | version "1.2.0" 753 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 754 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 755 | dependencies: 756 | buffer-alloc-unsafe "^1.1.0" 757 | buffer-fill "^1.0.0" 758 | 759 | buffer-fill@^1.0.0: 760 | version "1.0.0" 761 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 762 | integrity sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ== 763 | 764 | buffer-writer@2.0.0: 765 | version "2.0.0" 766 | resolved "https://registry.yarnpkg.com/buffer-writer/-/buffer-writer-2.0.0.tgz#ce7eb81a38f7829db09c873f2fbb792c0c98ec04" 767 | integrity sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw== 768 | 769 | buffer@^6.0.3: 770 | version "6.0.3" 771 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 772 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 773 | dependencies: 774 | base64-js "^1.3.1" 775 | ieee754 "^1.2.1" 776 | 777 | bytes@3.1.2: 778 | version "3.1.2" 779 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" 780 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 781 | 782 | call-bind@^1.0.0: 783 | version "1.0.5" 784 | resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" 785 | integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== 786 | dependencies: 787 | function-bind "^1.1.2" 788 | get-intrinsic "^1.2.1" 789 | set-function-length "^1.1.1" 790 | 791 | chain-registry@1.25.0, chain-registry@latest: 792 | version "1.25.0" 793 | resolved "https://registry.yarnpkg.com/chain-registry/-/chain-registry-1.25.0.tgz#59df7fcfe5c05ac3e1291d801a58fa75b5c422ac" 794 | integrity sha512-u+i64OW5hBRGc1HZtZRr7Givgnj0uvcRV1XnJjPMBcSkEP0zTuMWg032HX7wpuu8C47I6aosQ00CGFDLfKtzSQ== 795 | dependencies: 796 | "@babel/runtime" "^7.21.0" 797 | "@chain-registry/types" "^0.17.1" 798 | 799 | chalk@^4.0.0, chalk@^4.1.2: 800 | version "4.1.2" 801 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 802 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 803 | dependencies: 804 | ansi-styles "^4.1.0" 805 | supports-color "^7.1.0" 806 | 807 | cli-highlight@^2.1.11: 808 | version "2.1.11" 809 | resolved "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.11.tgz#49736fa452f0aaf4fae580e30acb26828d2dc1bf" 810 | integrity sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg== 811 | dependencies: 812 | chalk "^4.0.0" 813 | highlight.js "^10.7.1" 814 | mz "^2.4.0" 815 | parse5 "^5.1.1" 816 | parse5-htmlparser2-tree-adapter "^6.0.0" 817 | yargs "^16.0.0" 818 | 819 | cliui@^7.0.2: 820 | version "7.0.4" 821 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 822 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 823 | dependencies: 824 | string-width "^4.2.0" 825 | strip-ansi "^6.0.0" 826 | wrap-ansi "^7.0.0" 827 | 828 | cliui@^8.0.1: 829 | version "8.0.1" 830 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 831 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 832 | dependencies: 833 | string-width "^4.2.0" 834 | strip-ansi "^6.0.1" 835 | wrap-ansi "^7.0.0" 836 | 837 | color-convert@^2.0.1: 838 | version "2.0.1" 839 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 840 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 841 | dependencies: 842 | color-name "~1.1.4" 843 | 844 | color-name@~1.1.4: 845 | version "1.1.4" 846 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 847 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 848 | 849 | combined-stream@^1.0.8: 850 | version "1.0.8" 851 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 852 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 853 | dependencies: 854 | delayed-stream "~1.0.0" 855 | 856 | content-disposition@0.5.4: 857 | version "0.5.4" 858 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" 859 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 860 | dependencies: 861 | safe-buffer "5.2.1" 862 | 863 | content-type@~1.0.4: 864 | version "1.0.5" 865 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918" 866 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 867 | 868 | cookie-signature@1.0.6: 869 | version "1.0.6" 870 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 871 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 872 | 873 | cookie@0.5.0: 874 | version "0.5.0" 875 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" 876 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 877 | 878 | cosmjs-types@^0.5.2: 879 | version "0.5.2" 880 | resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.5.2.tgz#2d42b354946f330dfb5c90a87fdc2a36f97b965d" 881 | integrity sha512-zxCtIJj8v3Di7s39uN4LNcN3HIE1z0B9Z0SPE8ZNQR0oSzsuSe1ACgxoFkvhkS7WBasCAFcglS11G2hyfd5tPg== 882 | dependencies: 883 | long "^4.0.0" 884 | protobufjs "~6.11.2" 885 | 886 | cosmjs-types@^0.9.0: 887 | version "0.9.0" 888 | resolved "https://registry.yarnpkg.com/cosmjs-types/-/cosmjs-types-0.9.0.tgz#c3bc482d28c7dfa25d1445093fdb2d9da1f6cfcc" 889 | integrity sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ== 890 | 891 | "cosmos-indexer@https://github.com/seleniumforest/cosmos-indexer": 892 | version "0.4.0" 893 | resolved "https://github.com/seleniumforest/cosmos-indexer#023f4cf2e8f2c3947e16c9f705aa3f2a64b1887f" 894 | dependencies: 895 | "@cosmjs/stargate" "0.32.1" 896 | "@cosmjs/tendermint-rpc" "^0.32.1" 897 | chain-registry "1.25.0" 898 | pg "^8.11.3" 899 | ts-node "10.9.1" 900 | typeorm "^0.3.17" 901 | typescript "5.3.2" 902 | 903 | create-require@^1.1.0: 904 | version "1.1.1" 905 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 906 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 907 | 908 | date-fns@^2.29.3: 909 | version "2.30.0" 910 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" 911 | integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== 912 | dependencies: 913 | "@babel/runtime" "^7.21.0" 914 | 915 | debug@2.6.9: 916 | version "2.6.9" 917 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 918 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 919 | dependencies: 920 | ms "2.0.0" 921 | 922 | debug@^4.3.4: 923 | version "4.3.4" 924 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 925 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 926 | dependencies: 927 | ms "2.1.2" 928 | 929 | define-data-property@^1.0.1, define-data-property@^1.1.1: 930 | version "1.1.1" 931 | resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" 932 | integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== 933 | dependencies: 934 | get-intrinsic "^1.2.1" 935 | gopd "^1.0.1" 936 | has-property-descriptors "^1.0.0" 937 | 938 | define-properties@^1.1.3: 939 | version "1.2.1" 940 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" 941 | integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== 942 | dependencies: 943 | define-data-property "^1.0.1" 944 | has-property-descriptors "^1.0.0" 945 | object-keys "^1.1.1" 946 | 947 | delayed-stream@~1.0.0: 948 | version "1.0.0" 949 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 950 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 951 | 952 | depd@2.0.0: 953 | version "2.0.0" 954 | resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" 955 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 956 | 957 | destroy@1.2.0: 958 | version "1.2.0" 959 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" 960 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 961 | 962 | diff@^4.0.1: 963 | version "4.0.2" 964 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 965 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 966 | 967 | dom-walk@^0.1.0: 968 | version "0.1.2" 969 | resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84" 970 | integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w== 971 | 972 | dotenv@^16.0.3: 973 | version "16.3.1" 974 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" 975 | integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== 976 | 977 | ee-first@1.1.1: 978 | version "1.1.1" 979 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 980 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 981 | 982 | elliptic@^6.5.4: 983 | version "6.5.4" 984 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 985 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 986 | dependencies: 987 | bn.js "^4.11.9" 988 | brorand "^1.1.0" 989 | hash.js "^1.0.0" 990 | hmac-drbg "^1.0.1" 991 | inherits "^2.0.4" 992 | minimalistic-assert "^1.0.1" 993 | minimalistic-crypto-utils "^1.0.1" 994 | 995 | emoji-regex@^8.0.0: 996 | version "8.0.0" 997 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 998 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 999 | 1000 | encodeurl@~1.0.2: 1001 | version "1.0.2" 1002 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 1003 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 1004 | 1005 | escalade@^3.1.1: 1006 | version "3.1.1" 1007 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 1008 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 1009 | 1010 | escape-html@~1.0.3: 1011 | version "1.0.3" 1012 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 1013 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 1014 | 1015 | etag@~1.8.1: 1016 | version "1.8.1" 1017 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 1018 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 1019 | 1020 | event-target-shim@^5.0.0: 1021 | version "5.0.1" 1022 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 1023 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 1024 | 1025 | express@^4.18.1: 1026 | version "4.18.2" 1027 | resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" 1028 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 1029 | dependencies: 1030 | accepts "~1.3.8" 1031 | array-flatten "1.1.1" 1032 | body-parser "1.20.1" 1033 | content-disposition "0.5.4" 1034 | content-type "~1.0.4" 1035 | cookie "0.5.0" 1036 | cookie-signature "1.0.6" 1037 | debug "2.6.9" 1038 | depd "2.0.0" 1039 | encodeurl "~1.0.2" 1040 | escape-html "~1.0.3" 1041 | etag "~1.8.1" 1042 | finalhandler "1.2.0" 1043 | fresh "0.5.2" 1044 | http-errors "2.0.0" 1045 | merge-descriptors "1.0.1" 1046 | methods "~1.1.2" 1047 | on-finished "2.4.1" 1048 | parseurl "~1.3.3" 1049 | path-to-regexp "0.1.7" 1050 | proxy-addr "~2.0.7" 1051 | qs "6.11.0" 1052 | range-parser "~1.2.1" 1053 | safe-buffer "5.2.1" 1054 | send "0.18.0" 1055 | serve-static "1.15.0" 1056 | setprototypeof "1.2.0" 1057 | statuses "2.0.1" 1058 | type-is "~1.6.18" 1059 | utils-merge "1.0.1" 1060 | vary "~1.1.2" 1061 | 1062 | finalhandler@1.2.0: 1063 | version "1.2.0" 1064 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" 1065 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 1066 | dependencies: 1067 | debug "2.6.9" 1068 | encodeurl "~1.0.2" 1069 | escape-html "~1.0.3" 1070 | on-finished "2.4.1" 1071 | parseurl "~1.3.3" 1072 | statuses "2.0.1" 1073 | unpipe "~1.0.0" 1074 | 1075 | follow-redirects@^1.14.0, follow-redirects@^1.14.9, follow-redirects@^1.15.0: 1076 | version "1.15.4" 1077 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" 1078 | integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== 1079 | 1080 | form-data@^4.0.0: 1081 | version "4.0.0" 1082 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 1083 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 1084 | dependencies: 1085 | asynckit "^0.4.0" 1086 | combined-stream "^1.0.8" 1087 | mime-types "^2.1.12" 1088 | 1089 | forwarded@0.2.0: 1090 | version "0.2.0" 1091 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" 1092 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 1093 | 1094 | fresh@0.5.2: 1095 | version "0.5.2" 1096 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 1097 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 1098 | 1099 | fs.realpath@^1.0.0: 1100 | version "1.0.0" 1101 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 1102 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 1103 | 1104 | function-bind@^1.1.2: 1105 | version "1.1.2" 1106 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" 1107 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 1108 | 1109 | get-caller-file@^2.0.5: 1110 | version "2.0.5" 1111 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 1112 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 1113 | 1114 | get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: 1115 | version "1.2.2" 1116 | resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" 1117 | integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== 1118 | dependencies: 1119 | function-bind "^1.1.2" 1120 | has-proto "^1.0.1" 1121 | has-symbols "^1.0.3" 1122 | hasown "^2.0.0" 1123 | 1124 | glob@^8.1.0: 1125 | version "8.1.0" 1126 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 1127 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 1128 | dependencies: 1129 | fs.realpath "^1.0.0" 1130 | inflight "^1.0.4" 1131 | inherits "2" 1132 | minimatch "^5.0.1" 1133 | once "^1.3.0" 1134 | 1135 | global@^4.4.0: 1136 | version "4.4.0" 1137 | resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" 1138 | integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w== 1139 | dependencies: 1140 | min-document "^2.19.0" 1141 | process "^0.11.10" 1142 | 1143 | globalthis@^1.0.1: 1144 | version "1.0.3" 1145 | resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" 1146 | integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== 1147 | dependencies: 1148 | define-properties "^1.1.3" 1149 | 1150 | gopd@^1.0.1: 1151 | version "1.0.1" 1152 | resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" 1153 | integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== 1154 | dependencies: 1155 | get-intrinsic "^1.1.3" 1156 | 1157 | has-flag@^4.0.0: 1158 | version "4.0.0" 1159 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 1160 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 1161 | 1162 | has-property-descriptors@^1.0.0: 1163 | version "1.0.1" 1164 | resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" 1165 | integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== 1166 | dependencies: 1167 | get-intrinsic "^1.2.2" 1168 | 1169 | has-proto@^1.0.1: 1170 | version "1.0.1" 1171 | resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" 1172 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 1173 | 1174 | has-symbols@^1.0.3: 1175 | version "1.0.3" 1176 | resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" 1177 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 1178 | 1179 | hash.js@^1.0.0, hash.js@^1.0.3: 1180 | version "1.1.7" 1181 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 1182 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 1183 | dependencies: 1184 | inherits "^2.0.3" 1185 | minimalistic-assert "^1.0.1" 1186 | 1187 | hasown@^2.0.0: 1188 | version "2.0.0" 1189 | resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" 1190 | integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== 1191 | dependencies: 1192 | function-bind "^1.1.2" 1193 | 1194 | highlight.js@^10.7.1: 1195 | version "10.7.3" 1196 | resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" 1197 | integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== 1198 | 1199 | hmac-drbg@^1.0.1: 1200 | version "1.0.1" 1201 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 1202 | integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== 1203 | dependencies: 1204 | hash.js "^1.0.3" 1205 | minimalistic-assert "^1.0.0" 1206 | minimalistic-crypto-utils "^1.0.1" 1207 | 1208 | http-errors@2.0.0: 1209 | version "2.0.0" 1210 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" 1211 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 1212 | dependencies: 1213 | depd "2.0.0" 1214 | inherits "2.0.4" 1215 | setprototypeof "1.2.0" 1216 | statuses "2.0.1" 1217 | toidentifier "1.0.1" 1218 | 1219 | iconv-lite@0.4.24: 1220 | version "0.4.24" 1221 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 1222 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 1223 | dependencies: 1224 | safer-buffer ">= 2.1.2 < 3" 1225 | 1226 | ieee754@^1.2.1: 1227 | version "1.2.1" 1228 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1229 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1230 | 1231 | inflight@^1.0.4: 1232 | version "1.0.6" 1233 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1234 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1235 | dependencies: 1236 | once "^1.3.0" 1237 | wrappy "1" 1238 | 1239 | inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4: 1240 | version "2.0.4" 1241 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1242 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1243 | 1244 | ipaddr.js@1.9.1: 1245 | version "1.9.1" 1246 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" 1247 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 1248 | 1249 | is-fullwidth-code-point@^3.0.0: 1250 | version "3.0.0" 1251 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1252 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1253 | 1254 | isomorphic-ws@^4.0.1: 1255 | version "4.0.1" 1256 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 1257 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 1258 | 1259 | libsodium-sumo@^0.7.13: 1260 | version "0.7.13" 1261 | resolved "https://registry.yarnpkg.com/libsodium-sumo/-/libsodium-sumo-0.7.13.tgz#533b97d2be44b1277e59c1f9f60805978ac5542d" 1262 | integrity sha512-zTGdLu4b9zSNLfovImpBCbdAA4xkpkZbMnSQjP8HShyOutnGjRHmSOKlsylh1okao6QhLiz7nG98EGn+04cZjQ== 1263 | 1264 | libsodium-wrappers-sumo@^0.7.11: 1265 | version "0.7.13" 1266 | resolved "https://registry.yarnpkg.com/libsodium-wrappers-sumo/-/libsodium-wrappers-sumo-0.7.13.tgz#a33aea845a0bb56db067548f04feba28c730ab8e" 1267 | integrity sha512-lz4YdplzDRh6AhnLGF2Dj2IUj94xRN6Bh8T0HLNwzYGwPehQJX6c7iYVrFUPZ3QqxE0bqC+K0IIqqZJYWumwSQ== 1268 | dependencies: 1269 | libsodium-sumo "^0.7.13" 1270 | 1271 | libsodium-wrappers@^0.7.6: 1272 | version "0.7.13" 1273 | resolved "https://registry.yarnpkg.com/libsodium-wrappers/-/libsodium-wrappers-0.7.13.tgz#83299e06ee1466057ba0e64e532777d2929b90d3" 1274 | integrity sha512-kasvDsEi/r1fMzKouIDv7B8I6vNmknXwGiYodErGuESoFTohGSKZplFtVxZqHaoQ217AynyIFgnOVRitpHs0Qw== 1275 | dependencies: 1276 | libsodium "^0.7.13" 1277 | 1278 | libsodium@^0.7.13: 1279 | version "0.7.13" 1280 | resolved "https://registry.yarnpkg.com/libsodium/-/libsodium-0.7.13.tgz#230712ec0b7447c57b39489c48a4af01985fb393" 1281 | integrity sha512-mK8ju0fnrKXXfleL53vtp9xiPq5hKM0zbDQtcxQIsSmxNgSxqCj6R7Hl9PkrNe2j29T4yoDaF7DJLK9/i5iWUw== 1282 | 1283 | lodash@^4.17.21: 1284 | version "4.17.21" 1285 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 1286 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 1287 | 1288 | long@^4.0.0: 1289 | version "4.0.0" 1290 | resolved "https://registry.yarnpkg.com/long/-/long-4.0.0.tgz#9a7b71cfb7d361a194ea555241c92f7468d5bf28" 1291 | integrity sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA== 1292 | 1293 | make-error@^1.1.1: 1294 | version "1.3.6" 1295 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1296 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1297 | 1298 | media-typer@0.3.0: 1299 | version "0.3.0" 1300 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 1301 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 1302 | 1303 | merge-descriptors@1.0.1: 1304 | version "1.0.1" 1305 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 1306 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 1307 | 1308 | methods@~1.1.2: 1309 | version "1.1.2" 1310 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 1311 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 1312 | 1313 | mime-db@1.52.0: 1314 | version "1.52.0" 1315 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 1316 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 1317 | 1318 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 1319 | version "2.1.35" 1320 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 1321 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 1322 | dependencies: 1323 | mime-db "1.52.0" 1324 | 1325 | mime@1.6.0: 1326 | version "1.6.0" 1327 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" 1328 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 1329 | 1330 | min-document@^2.19.0: 1331 | version "2.19.0" 1332 | resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" 1333 | integrity sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ== 1334 | dependencies: 1335 | dom-walk "^0.1.0" 1336 | 1337 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 1338 | version "1.0.1" 1339 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 1340 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 1341 | 1342 | minimalistic-crypto-utils@^1.0.1: 1343 | version "1.0.1" 1344 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 1345 | integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== 1346 | 1347 | minimatch@^5.0.1: 1348 | version "5.1.6" 1349 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 1350 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 1351 | dependencies: 1352 | brace-expansion "^2.0.1" 1353 | 1354 | mkdirp@^2.1.3: 1355 | version "2.1.6" 1356 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-2.1.6.tgz#964fbcb12b2d8c5d6fbc62a963ac95a273e2cc19" 1357 | integrity sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A== 1358 | 1359 | mri@^1.2.0: 1360 | version "1.2.0" 1361 | resolved "https://registry.yarnpkg.com/mri/-/mri-1.2.0.tgz#6721480fec2a11a4889861115a48b6cbe7cc8f0b" 1362 | integrity sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA== 1363 | 1364 | ms@2.0.0: 1365 | version "2.0.0" 1366 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 1367 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 1368 | 1369 | ms@2.1.2: 1370 | version "2.1.2" 1371 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1372 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1373 | 1374 | ms@2.1.3: 1375 | version "2.1.3" 1376 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1377 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1378 | 1379 | mz@^2.4.0, mz@^2.7.0: 1380 | version "2.7.0" 1381 | resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" 1382 | integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== 1383 | dependencies: 1384 | any-promise "^1.0.0" 1385 | object-assign "^4.0.1" 1386 | thenify-all "^1.0.0" 1387 | 1388 | negotiator@0.6.3: 1389 | version "0.6.3" 1390 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" 1391 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 1392 | 1393 | node-fetch@^2.6.8: 1394 | version "2.7.0" 1395 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1396 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1397 | dependencies: 1398 | whatwg-url "^5.0.0" 1399 | 1400 | object-assign@^4.0.1: 1401 | version "4.1.1" 1402 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1403 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 1404 | 1405 | object-inspect@^1.9.0: 1406 | version "1.13.1" 1407 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" 1408 | integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== 1409 | 1410 | object-keys@^1.1.1: 1411 | version "1.1.1" 1412 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" 1413 | integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== 1414 | 1415 | on-finished@2.4.1: 1416 | version "2.4.1" 1417 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" 1418 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 1419 | dependencies: 1420 | ee-first "1.1.1" 1421 | 1422 | once@^1.3.0: 1423 | version "1.4.0" 1424 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1425 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1426 | dependencies: 1427 | wrappy "1" 1428 | 1429 | osmojs@16.5.1: 1430 | version "16.5.1" 1431 | resolved "https://registry.yarnpkg.com/osmojs/-/osmojs-16.5.1.tgz#38f2fe3cd65dbd4e4b415e9f22f387a24b634155" 1432 | integrity sha512-V2Q2yMt7Paax6i+S5Q1l29Km0As/waXKmSVRe8gtd9he42kcbkpwwk/QUCvgS98XsL7Qz+vas2Tca016uBQHTQ== 1433 | dependencies: 1434 | "@cosmjs/amino" "0.29.3" 1435 | "@cosmjs/proto-signing" "0.29.3" 1436 | "@cosmjs/stargate" "0.29.3" 1437 | "@cosmjs/tendermint-rpc" "^0.29.3" 1438 | "@cosmology/lcd" "^0.12.0" 1439 | 1440 | p-timeout@^4.1.0: 1441 | version "4.1.0" 1442 | resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" 1443 | integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== 1444 | 1445 | packet-reader@1.0.0: 1446 | version "1.0.0" 1447 | resolved "https://registry.yarnpkg.com/packet-reader/-/packet-reader-1.0.0.tgz#9238e5480dedabacfe1fe3f2771063f164157d74" 1448 | integrity sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ== 1449 | 1450 | pako@^2.0.2: 1451 | version "2.1.0" 1452 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" 1453 | integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== 1454 | 1455 | parse5-htmlparser2-tree-adapter@^6.0.0: 1456 | version "6.0.1" 1457 | resolved "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz#2cdf9ad823321140370d4dbf5d3e92c7c8ddc6e6" 1458 | integrity sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA== 1459 | dependencies: 1460 | parse5 "^6.0.1" 1461 | 1462 | parse5@^5.1.1: 1463 | version "5.1.1" 1464 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" 1465 | integrity sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug== 1466 | 1467 | parse5@^6.0.1: 1468 | version "6.0.1" 1469 | resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b" 1470 | integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== 1471 | 1472 | parseurl@~1.3.3: 1473 | version "1.3.3" 1474 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" 1475 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 1476 | 1477 | path-to-regexp@0.1.7: 1478 | version "0.1.7" 1479 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 1480 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 1481 | 1482 | pg-cloudflare@^1.1.1: 1483 | version "1.1.1" 1484 | resolved "https://registry.yarnpkg.com/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz#e6d5833015b170e23ae819e8c5d7eaedb472ca98" 1485 | integrity sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q== 1486 | 1487 | pg-connection-string@^2.6.2: 1488 | version "2.6.2" 1489 | resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.6.2.tgz#713d82053de4e2bd166fab70cd4f26ad36aab475" 1490 | integrity sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA== 1491 | 1492 | pg-int8@1.0.1: 1493 | version "1.0.1" 1494 | resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c" 1495 | integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw== 1496 | 1497 | pg-pool@^3.6.1: 1498 | version "3.6.1" 1499 | resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-3.6.1.tgz#5a902eda79a8d7e3c928b77abf776b3cb7d351f7" 1500 | integrity sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og== 1501 | 1502 | pg-protocol@^1.6.0: 1503 | version "1.6.0" 1504 | resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.6.0.tgz#4c91613c0315349363af2084608db843502f8833" 1505 | integrity sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q== 1506 | 1507 | pg-types@^2.1.0: 1508 | version "2.2.0" 1509 | resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3" 1510 | integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA== 1511 | dependencies: 1512 | pg-int8 "1.0.1" 1513 | postgres-array "~2.0.0" 1514 | postgres-bytea "~1.0.0" 1515 | postgres-date "~1.0.4" 1516 | postgres-interval "^1.1.0" 1517 | 1518 | pg@^8.11.3: 1519 | version "8.11.3" 1520 | resolved "https://registry.yarnpkg.com/pg/-/pg-8.11.3.tgz#d7db6e3fe268fcedd65b8e4599cda0b8b4bf76cb" 1521 | integrity sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g== 1522 | dependencies: 1523 | buffer-writer "2.0.0" 1524 | packet-reader "1.0.0" 1525 | pg-connection-string "^2.6.2" 1526 | pg-pool "^3.6.1" 1527 | pg-protocol "^1.6.0" 1528 | pg-types "^2.1.0" 1529 | pgpass "1.x" 1530 | optionalDependencies: 1531 | pg-cloudflare "^1.1.1" 1532 | 1533 | pgpass@1.x: 1534 | version "1.0.5" 1535 | resolved "https://registry.yarnpkg.com/pgpass/-/pgpass-1.0.5.tgz#9b873e4a564bb10fa7a7dbd55312728d422a223d" 1536 | integrity sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug== 1537 | dependencies: 1538 | split2 "^4.1.0" 1539 | 1540 | postgres-array@~2.0.0: 1541 | version "2.0.0" 1542 | resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 1543 | integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA== 1544 | 1545 | postgres-bytea@~1.0.0: 1546 | version "1.0.0" 1547 | resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35" 1548 | integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w== 1549 | 1550 | postgres-date@~1.0.4: 1551 | version "1.0.7" 1552 | resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8" 1553 | integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q== 1554 | 1555 | postgres-interval@^1.1.0: 1556 | version "1.2.0" 1557 | resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695" 1558 | integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ== 1559 | dependencies: 1560 | xtend "^4.0.0" 1561 | 1562 | prisma@^5.7.1: 1563 | version "5.7.1" 1564 | resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.7.1.tgz#af60ed90531adc0ab8a683c9b1fc86d841c39864" 1565 | integrity sha512-ekho7ziH0WEJvC4AxuJz+ewRTMskrebPcrKuBwcNzVDniYxx+dXOGcorNeIb9VEMO5vrKzwNYvhD271Ui2jnNw== 1566 | dependencies: 1567 | "@prisma/engines" "5.7.1" 1568 | 1569 | process@^0.11.10: 1570 | version "0.11.10" 1571 | resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" 1572 | integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== 1573 | 1574 | protobufjs@^6.8.8, protobufjs@~6.11.2, protobufjs@~6.11.3: 1575 | version "6.11.4" 1576 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-6.11.4.tgz#29a412c38bf70d89e537b6d02d904a6f448173aa" 1577 | integrity sha512-5kQWPaJHi1WoCpjTGszzQ32PG2F4+wRY6BmAT4Vfw56Q2FZ4YZzK20xUYQH4YkfehY1e6QSICrJquM6xXZNcrw== 1578 | dependencies: 1579 | "@protobufjs/aspromise" "^1.1.2" 1580 | "@protobufjs/base64" "^1.1.2" 1581 | "@protobufjs/codegen" "^2.0.4" 1582 | "@protobufjs/eventemitter" "^1.1.0" 1583 | "@protobufjs/fetch" "^1.1.0" 1584 | "@protobufjs/float" "^1.0.2" 1585 | "@protobufjs/inquire" "^1.1.0" 1586 | "@protobufjs/path" "^1.1.2" 1587 | "@protobufjs/pool" "^1.1.0" 1588 | "@protobufjs/utf8" "^1.1.0" 1589 | "@types/long" "^4.0.1" 1590 | "@types/node" ">=13.7.0" 1591 | long "^4.0.0" 1592 | 1593 | proxy-addr@~2.0.7: 1594 | version "2.0.7" 1595 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" 1596 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 1597 | dependencies: 1598 | forwarded "0.2.0" 1599 | ipaddr.js "1.9.1" 1600 | 1601 | proxy-from-env@^1.1.0: 1602 | version "1.1.0" 1603 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 1604 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1605 | 1606 | qs@6.11.0: 1607 | version "6.11.0" 1608 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" 1609 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 1610 | dependencies: 1611 | side-channel "^1.0.4" 1612 | 1613 | range-parser@~1.2.1: 1614 | version "1.2.1" 1615 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" 1616 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 1617 | 1618 | raw-body@2.5.1: 1619 | version "2.5.1" 1620 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" 1621 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 1622 | dependencies: 1623 | bytes "3.1.2" 1624 | http-errors "2.0.0" 1625 | iconv-lite "0.4.24" 1626 | unpipe "1.0.0" 1627 | 1628 | read-last-lines@^1.8.0: 1629 | version "1.8.0" 1630 | resolved "https://registry.yarnpkg.com/read-last-lines/-/read-last-lines-1.8.0.tgz#4f94d4345ece7b8083ebb71c5fcdf60bd7afb9cc" 1631 | integrity sha512-oPL0cnZkhsO2xF7DBrdzVhXSNajPP5TzzCim/2IAjeGb17ArLLTRriI/ceV6Rook3L27mvbrOvLlf9xYYnaftQ== 1632 | dependencies: 1633 | mz "^2.7.0" 1634 | 1635 | readonly-date@^1.0.0: 1636 | version "1.0.0" 1637 | resolved "https://registry.yarnpkg.com/readonly-date/-/readonly-date-1.0.0.tgz#5af785464d8c7d7c40b9d738cbde8c646f97dcd9" 1638 | integrity sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ== 1639 | 1640 | reflect-metadata@^0.1.13: 1641 | version "0.1.14" 1642 | resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.14.tgz#24cf721fe60677146bb77eeb0e1f9dece3d65859" 1643 | integrity sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A== 1644 | 1645 | regenerator-runtime@^0.14.0: 1646 | version "0.14.1" 1647 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" 1648 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 1649 | 1650 | require-directory@^2.1.1: 1651 | version "2.1.1" 1652 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1653 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1654 | 1655 | safe-buffer@5.2.1, safe-buffer@^5.0.1: 1656 | version "5.2.1" 1657 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1658 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1659 | 1660 | safe-compare@^1.1.4: 1661 | version "1.1.4" 1662 | resolved "https://registry.yarnpkg.com/safe-compare/-/safe-compare-1.1.4.tgz#5e0128538a82820e2e9250cd78e45da6786ba593" 1663 | integrity sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ== 1664 | dependencies: 1665 | buffer-alloc "^1.2.0" 1666 | 1667 | "safer-buffer@>= 2.1.2 < 3": 1668 | version "2.1.2" 1669 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 1670 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 1671 | 1672 | sandwich-stream@^2.0.2: 1673 | version "2.0.2" 1674 | resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" 1675 | integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== 1676 | 1677 | send@0.18.0: 1678 | version "0.18.0" 1679 | resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" 1680 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 1681 | dependencies: 1682 | debug "2.6.9" 1683 | depd "2.0.0" 1684 | destroy "1.2.0" 1685 | encodeurl "~1.0.2" 1686 | escape-html "~1.0.3" 1687 | etag "~1.8.1" 1688 | fresh "0.5.2" 1689 | http-errors "2.0.0" 1690 | mime "1.6.0" 1691 | ms "2.1.3" 1692 | on-finished "2.4.1" 1693 | range-parser "~1.2.1" 1694 | statuses "2.0.1" 1695 | 1696 | serve-static@1.15.0: 1697 | version "1.15.0" 1698 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" 1699 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 1700 | dependencies: 1701 | encodeurl "~1.0.2" 1702 | escape-html "~1.0.3" 1703 | parseurl "~1.3.3" 1704 | send "0.18.0" 1705 | 1706 | set-function-length@^1.1.1: 1707 | version "1.1.1" 1708 | resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" 1709 | integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== 1710 | dependencies: 1711 | define-data-property "^1.1.1" 1712 | get-intrinsic "^1.2.1" 1713 | gopd "^1.0.1" 1714 | has-property-descriptors "^1.0.0" 1715 | 1716 | setprototypeof@1.2.0: 1717 | version "1.2.0" 1718 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424" 1719 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 1720 | 1721 | sha.js@^2.4.11: 1722 | version "2.4.11" 1723 | resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 1724 | integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 1725 | dependencies: 1726 | inherits "^2.0.1" 1727 | safe-buffer "^5.0.1" 1728 | 1729 | side-channel@^1.0.4: 1730 | version "1.0.4" 1731 | resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" 1732 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 1733 | dependencies: 1734 | call-bind "^1.0.0" 1735 | get-intrinsic "^1.0.2" 1736 | object-inspect "^1.9.0" 1737 | 1738 | split2@^4.1.0: 1739 | version "4.2.0" 1740 | resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" 1741 | integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== 1742 | 1743 | statuses@2.0.1: 1744 | version "2.0.1" 1745 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" 1746 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 1747 | 1748 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 1749 | version "4.2.3" 1750 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1751 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1752 | dependencies: 1753 | emoji-regex "^8.0.0" 1754 | is-fullwidth-code-point "^3.0.0" 1755 | strip-ansi "^6.0.1" 1756 | 1757 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1758 | version "6.0.1" 1759 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1760 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1761 | dependencies: 1762 | ansi-regex "^5.0.1" 1763 | 1764 | supports-color@^7.1.0: 1765 | version "7.2.0" 1766 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1767 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1768 | dependencies: 1769 | has-flag "^4.0.0" 1770 | 1771 | symbol-observable@^2.0.3: 1772 | version "2.0.3" 1773 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-2.0.3.tgz#5b521d3d07a43c351055fa43b8355b62d33fd16a" 1774 | integrity sha512-sQV7phh2WCYAn81oAkakC5qjq2Ml0g8ozqz03wOGnx9dDlG1de6yrF+0RAzSJD8fPUow3PTSMf2SAbOGxb93BA== 1775 | 1776 | telegraf@^4.8.6: 1777 | version "4.15.3" 1778 | resolved "https://registry.yarnpkg.com/telegraf/-/telegraf-4.15.3.tgz#72e28e62c3cc7f97b88b5f1b04a0e0700a7df251" 1779 | integrity sha512-pm2ZQAisd0YlUvnq6xdymDfoQR++8wTalw0nfw7Tjy0va+V/0HaBLzM8kMNid8pbbt7GHTU29lEyA5CAAr8AqA== 1780 | dependencies: 1781 | "@telegraf/types" "^6.9.1" 1782 | abort-controller "^3.0.0" 1783 | debug "^4.3.4" 1784 | mri "^1.2.0" 1785 | node-fetch "^2.6.8" 1786 | p-timeout "^4.1.0" 1787 | safe-compare "^1.1.4" 1788 | sandwich-stream "^2.0.2" 1789 | 1790 | thenify-all@^1.0.0: 1791 | version "1.6.0" 1792 | resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" 1793 | integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== 1794 | dependencies: 1795 | thenify ">= 3.1.0 < 4" 1796 | 1797 | "thenify@>= 3.1.0 < 4": 1798 | version "3.3.1" 1799 | resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" 1800 | integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== 1801 | dependencies: 1802 | any-promise "^1.0.0" 1803 | 1804 | timespan-ts@^1.0.3: 1805 | version "1.0.3" 1806 | resolved "https://registry.yarnpkg.com/timespan-ts/-/timespan-ts-1.0.3.tgz#be05af7a08d0cf85fd17b7c787de30e6f825e06e" 1807 | integrity sha512-FnrxI8Jd2595wuR9cjMUz1TfncTcbYJTKbuptwCnQZf124KQe0WCEreVJUi5PkzrGUn5s/wntb0tFLTgAbsoyw== 1808 | 1809 | toidentifier@1.0.1: 1810 | version "1.0.1" 1811 | resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" 1812 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 1813 | 1814 | tr46@~0.0.3: 1815 | version "0.0.3" 1816 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1817 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1818 | 1819 | ts-node@10.9.1: 1820 | version "10.9.1" 1821 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.1.tgz#e73de9102958af9e1f0b168a6ff320e25adcff4b" 1822 | integrity sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw== 1823 | dependencies: 1824 | "@cspotcode/source-map-support" "^0.8.0" 1825 | "@tsconfig/node10" "^1.0.7" 1826 | "@tsconfig/node12" "^1.0.7" 1827 | "@tsconfig/node14" "^1.0.0" 1828 | "@tsconfig/node16" "^1.0.2" 1829 | acorn "^8.4.1" 1830 | acorn-walk "^8.1.1" 1831 | arg "^4.1.0" 1832 | create-require "^1.1.0" 1833 | diff "^4.0.1" 1834 | make-error "^1.1.1" 1835 | v8-compile-cache-lib "^3.0.1" 1836 | yn "3.1.1" 1837 | 1838 | ts-node@^10.9.2: 1839 | version "10.9.2" 1840 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 1841 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 1842 | dependencies: 1843 | "@cspotcode/source-map-support" "^0.8.0" 1844 | "@tsconfig/node10" "^1.0.7" 1845 | "@tsconfig/node12" "^1.0.7" 1846 | "@tsconfig/node14" "^1.0.0" 1847 | "@tsconfig/node16" "^1.0.2" 1848 | acorn "^8.4.1" 1849 | acorn-walk "^8.1.1" 1850 | arg "^4.1.0" 1851 | create-require "^1.1.0" 1852 | diff "^4.0.1" 1853 | make-error "^1.1.1" 1854 | v8-compile-cache-lib "^3.0.1" 1855 | yn "3.1.1" 1856 | 1857 | tslib@^2.5.0: 1858 | version "2.6.2" 1859 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 1860 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 1861 | 1862 | type-is@~1.6.18: 1863 | version "1.6.18" 1864 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" 1865 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 1866 | dependencies: 1867 | media-typer "0.3.0" 1868 | mime-types "~2.1.24" 1869 | 1870 | typeorm@^0.3.17: 1871 | version "0.3.17" 1872 | resolved "https://registry.yarnpkg.com/typeorm/-/typeorm-0.3.17.tgz#a73c121a52e4fbe419b596b244777be4e4b57949" 1873 | integrity sha512-UDjUEwIQalO9tWw9O2A4GU+sT3oyoUXheHJy4ft+RFdnRdQctdQ34L9SqE2p7LdwzafHx1maxT+bqXON+Qnmig== 1874 | dependencies: 1875 | "@sqltools/formatter" "^1.2.5" 1876 | app-root-path "^3.1.0" 1877 | buffer "^6.0.3" 1878 | chalk "^4.1.2" 1879 | cli-highlight "^2.1.11" 1880 | date-fns "^2.29.3" 1881 | debug "^4.3.4" 1882 | dotenv "^16.0.3" 1883 | glob "^8.1.0" 1884 | mkdirp "^2.1.3" 1885 | reflect-metadata "^0.1.13" 1886 | sha.js "^2.4.11" 1887 | tslib "^2.5.0" 1888 | uuid "^9.0.0" 1889 | yargs "^17.6.2" 1890 | 1891 | typescript@5.3.2: 1892 | version "5.3.2" 1893 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.2.tgz#00d1c7c1c46928c5845c1ee8d0cc2791031d4c43" 1894 | integrity sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ== 1895 | 1896 | typescript@^5.3.3: 1897 | version "5.3.3" 1898 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" 1899 | integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== 1900 | 1901 | undici-types@~5.26.4: 1902 | version "5.26.5" 1903 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1904 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1905 | 1906 | unpipe@1.0.0, unpipe@~1.0.0: 1907 | version "1.0.0" 1908 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 1909 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 1910 | 1911 | utils-merge@1.0.1: 1912 | version "1.0.1" 1913 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 1914 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 1915 | 1916 | uuid@^9.0.0: 1917 | version "9.0.1" 1918 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30" 1919 | integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== 1920 | 1921 | v8-compile-cache-lib@^3.0.1: 1922 | version "3.0.1" 1923 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 1924 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1925 | 1926 | vary@~1.1.2: 1927 | version "1.1.2" 1928 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 1929 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 1930 | 1931 | webidl-conversions@^3.0.0: 1932 | version "3.0.1" 1933 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1934 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1935 | 1936 | whatwg-url@^5.0.0: 1937 | version "5.0.0" 1938 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1939 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1940 | dependencies: 1941 | tr46 "~0.0.3" 1942 | webidl-conversions "^3.0.0" 1943 | 1944 | wrap-ansi@^7.0.0: 1945 | version "7.0.0" 1946 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1947 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1948 | dependencies: 1949 | ansi-styles "^4.0.0" 1950 | string-width "^4.1.0" 1951 | strip-ansi "^6.0.0" 1952 | 1953 | wrappy@1: 1954 | version "1.0.2" 1955 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1956 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1957 | 1958 | ws@^7: 1959 | version "7.5.9" 1960 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" 1961 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 1962 | 1963 | xstream@^11.14.0: 1964 | version "11.14.0" 1965 | resolved "https://registry.yarnpkg.com/xstream/-/xstream-11.14.0.tgz#2c071d26b18310523b6877e86b4e54df068a9ae5" 1966 | integrity sha512-1bLb+kKKtKPbgTK6i/BaoAn03g47PpFstlbe1BA+y3pNS/LfvcaghS5BFf9+EE1J+KwSQsEpfJvFN5GqFtiNmw== 1967 | dependencies: 1968 | globalthis "^1.0.1" 1969 | symbol-observable "^2.0.3" 1970 | 1971 | xtend@^4.0.0: 1972 | version "4.0.2" 1973 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 1974 | integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 1975 | 1976 | y18n@^5.0.5: 1977 | version "5.0.8" 1978 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1979 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1980 | 1981 | yargs-parser@^20.2.2: 1982 | version "20.2.9" 1983 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1984 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1985 | 1986 | yargs-parser@^21.1.1: 1987 | version "21.1.1" 1988 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 1989 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 1990 | 1991 | yargs@^16.0.0: 1992 | version "16.2.0" 1993 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1994 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1995 | dependencies: 1996 | cliui "^7.0.2" 1997 | escalade "^3.1.1" 1998 | get-caller-file "^2.0.5" 1999 | require-directory "^2.1.1" 2000 | string-width "^4.2.0" 2001 | y18n "^5.0.5" 2002 | yargs-parser "^20.2.2" 2003 | 2004 | yargs@^17.6.2: 2005 | version "17.7.2" 2006 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 2007 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 2008 | dependencies: 2009 | cliui "^8.0.1" 2010 | escalade "^3.1.1" 2011 | get-caller-file "^2.0.5" 2012 | require-directory "^2.1.1" 2013 | string-width "^4.2.3" 2014 | y18n "^5.0.5" 2015 | yargs-parser "^21.1.1" 2016 | 2017 | yn@3.1.1: 2018 | version "3.1.1" 2019 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 2020 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 2021 | --------------------------------------------------------------------------------