├── .gitignore ├── CHANGELOG.md ├── README.md ├── config.ts ├── example.env ├── package.json ├── src ├── data │ └── token.ts ├── index.ts ├── lib │ ├── 1inch.ts │ ├── aggr.ts │ ├── bot.ts │ ├── dex.ag.ts │ ├── index.ts │ ├── matcha.xyz.ts │ └── paraswap.io.ts ├── models │ ├── approve.ts │ ├── index.ts │ └── user.ts ├── types │ ├── 1inch.ts │ ├── enums.ts │ └── index.ts └── utils │ ├── common.ts │ └── index.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | #### CHANGELOG 2 | 3 | `v0.0.1 - v0.9.9` 4 | 5 | - Project Setup :heavy_check_mark: 6 | - Initial commit :heavy_check_mark: 7 | - Add support for 1inch price aggregator :heavy_check_mark: 8 | - Add ability to monitor multiple tokens concurrently :heavy_check_mark: 9 | - Add ability to buy and sell tokens across various supported exchanges on different blockchains :heavy_check_mark: 10 | - Add support for ethereum blockchain :heavy_check_mark: 11 | 12 | `v1.0.0` 13 | 14 | - Bug fix and optimizations 15 | - Add support for binance smart chain(BSC) :heavy_check_mark: 16 | - Testing on mainnet 17 | 18 | `v1.0.2` 19 | 20 | - Add support for Optimism Blockchain :heavy_check_mark: 21 | 22 | `v1.0.3` 23 | 24 | - Add support for Arbitrum Blockchain :heavy_check_mark: 25 | 26 | `v1.0.4` 27 | 28 | - Add support for Polygon Matic Blockchain :heavy_check_mark: 29 | 30 | `v1.0.5` 31 | 32 | - Integrate Telegram for notifications :heavy_check_mark: 33 | 34 | `v1.0.6` 35 | 36 | - Add suppport for auto approval of assets :heavy_check_mark: 37 | 38 | `v1.0.7` 39 | 40 | - Optimize the bot to buy and sell on the same block 41 | 42 | #### [TODO] 43 | 44 | `v1.0.8` 45 | 46 | - Add Support for Dex.arg Aggregator 47 | 48 | `v1.0.9` 49 | 50 | - Add Support for Paraswap Aggregator 51 | 52 | `v1.1.0` 53 | 54 | - Add Support Matcha Aggregator 55 | 56 | `v2.0.0` 57 | 58 | - Add support for flashloans 59 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | #### MultiDexArbBot 2 | 3 | This is an arbitrage bot that uses existing price aggregators such as `1inch`, `Paraswap`, `dex.ag`, `matcha` and more 4 | to get the best exchange rates across different decentralized exchanges on different blockchains and ecosystems. 5 | 6 | #### INSTALL && RUN 7 | 8 | - Clone our repo 9 | 10 | ``` 11 | git clone git@github.com:dennohpeter/MultiDexArbBot.git 12 | ``` 13 | 14 | - cd into `MultiDexArbBot` 15 | 16 | ``` 17 | cd MultiDexArbBot 18 | ``` 19 | 20 | - Install all the dependencies 21 | 22 | ``` 23 | yarn install 24 | ``` 25 | 26 | - Rename `example.env` to `.env` 27 | 28 | ``` 29 | mv example.env .env 30 | ``` 31 | 32 | - Update `.env` to contain your trading preferences and wallet info such private and public key 33 | 34 | - Finally run the app by 35 | 36 | ``` 37 | yarn start 38 | ``` 39 | 40 | #### AUTHORS 41 | 42 | - Enock Kipkoech `(theNodeG)` 43 | 44 | - Dennoh Peter `` (Rust`edSoul) `` 45 | 46 | #### CONTRIBUTION 47 | 48 | - If you would like to add a feature or suggestion please feel free to fork, open a pull request or an issue. 49 | 50 | - Wanna Buy the Devs Some Coffee ☕️☕️☕️☕️? 51 | 52 | ETH 53 | 54 | - `theNodeG` - `0x88f852D7DB6fd080c4fA257F755A517e9db0d124` 55 | - `` Rust`edSoul `` - `0xE5dB9FCf40eFb3975F9C695fF89FdB51fB4C553F` 56 | 57 | BSC 58 | 59 | - `theNodeG` - `0x88f852D7DB6fd080c4fA257F755A517e9db0d124` 60 | - `` Rust`edSoul `` - `0xE5dB9FCf40eFb3975F9C695fF89FdB51fB4C553F` 61 | -------------------------------------------------------------------------------- /config.ts: -------------------------------------------------------------------------------- 1 | if (!process.env.BOT_TOKEN && !process.env.INFURA_API_KEY && !process.env.PUBLIC_KEY && !process.env.PRIVATE_KEY && !process.env.ETH_IN_AMOUNT && !process.env.DB_URL) { 2 | 3 | throw new Error("BOT_TOKEN, && INFURA_API_KEY && PUBLIC_KEY && PRIVATE_KEY && ETH_IN_AMOUNT && DB_URL, Must be defined in your .env file"); 4 | } 5 | export const config = { 6 | BOT_TOKEN: process.env.BOT_TOKEN!, 7 | WALLET: { 8 | PUBLIC_KEY: process.env.PUBLIC_KEY!, 9 | PRIVATE_KEY: process.env.PRIVATE_KEY! 10 | }, 11 | PROVIDERS: { 12 | INFURA_API_KEY: process.env.INFURA_API_KEY! 13 | }, 14 | NETWORK: { 15 | ID: process.env.NETWORK_ID || 1 // 1 eth, 56 is bsc, 137 polygon, 10 optimism, 42161 arbitrum 16 | }, 17 | PROFIT_THRESHOLD: { // profit % you atleast want 18 | BUY: 2, 19 | SELL: 2 20 | }, 21 | SLIPPAGE: 0.5, 22 | GAS_LIMIT: process.env.GAS_LIMIT!, 23 | EXPLORER: process.env.EXPLORER || 'https://etherscan.io/', 24 | PRICE_CHECK_INTERVAL_IN_SECONDS: process.env.PRICE_CHECK_INTERVAL_IN_SECONDS || 45, 25 | ETH_IN_AMOUNT: parseFloat(process.env.ETH_IN_AMOUNT!), 26 | DB_URL: process.env.DB_URL! 27 | 28 | } -------------------------------------------------------------------------------- /example.env: -------------------------------------------------------------------------------- 1 | # Telegram 2 | BOT_TOKEN = '1981913038...' 3 | 4 | # Provider 5 | # INFURA_API_KEY = 'https://mainnet.infura.io/v3/ab96b536fe83489f8599d9e2cab6d9ce' 6 | INFURA_API_KEY="https://bsc-dataseed1.binance.org/" 7 | 8 | # Wallet 9 | PRIVATE_KEY = '' 10 | PUBLIC_KEY = '' 11 | 12 | PRICE_CHECK_INTERVAL_IN_SECONDS = '10' 13 | 14 | # Trading Preference 15 | ETH_IN_AMOUNT = '0.001' 16 | 17 | # NETWORKS SUPPORTED; 1 eth, 56 is bsc, 137 polygon, 10 optimism, 42161 arbitrum 18 | NETWORK_ID = '56' 19 | 20 | # Database 21 | DB_URL = 'mongodb+srv://dennoh:PDNSk1niA90AQNkl@cluster0.drqlx.mongodb.net/multidexarbbot?authSource=admin&replicaSet=atlas-nskznp-shard-0&readPreference=primary&appname=MongoDB%20Compass&ssl=true' 22 | 23 | # Explorer to view Txs 24 | EXPLORER = 'https://bscscan.com/tx' 25 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "multidexarbbot", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "src/index.ts", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "ts-node-dev -r dotenv/config src/index.ts" 9 | }, 10 | "author": { 11 | "name": "Dennoh Peter", 12 | "email": "dennoh@coredevs.co" 13 | }, 14 | "keywords": [ 15 | "Arbitrage", 16 | "MultiDex", 17 | "Trading" 18 | ], 19 | "license": "MIT", 20 | "dependencies": { 21 | "@types/node-cron": "^3.0.0", 22 | "axios": "^0.22.0", 23 | "bignumber.js": "^9.0.1", 24 | "chalk": "^4.1.2", 25 | "chalk-table": "^1.0.2", 26 | "dotenv": "^10.0.0", 27 | "ethers": "^5.4.7", 28 | "mongoose": "^6.0.9", 29 | "node-cron": "^3.0.0", 30 | "telegraf": "^4.4.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/data/token.ts: -------------------------------------------------------------------------------- 1 | export const MONITORED_TOKENS = [ 2 | 3 | // ETHEREUM 4 | // { address: "0xdac17f958d2ee523a2206206994597c13d831ec7", symbol: "USDT", name: "USD Tether" }, 5 | // { address: "0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48", symbol: "USDC", name: "USD Coin" }, 6 | // // { address: "0x6b175474e89094c44da98b954eedeac495271d0f", symbol: "DAI", name: "MakerDao StableCoin" }, 7 | // // // { address: "0x3845badade8e6dff049820680d1f14bd3903a5d0", symbol: "SAND", name: "Sandbox" }, 8 | // // { address: "0xd46ba6d942050d489dbd938a2c909a5d5039a161", symbol: "AMPL", name: "Ampleforth" }, 9 | // // // { address: "0x956f47f50a910163d8bf957cf5846d573e7f87ca", symbol: "FEI", name: "Fei Protocol StableCoin" }, 10 | // // { address: "0xbc396689893d065f41bc2c6ecbee5e0085233447", symbol: "PERP", name: "Defi Trading Platform with AMMs" }, 11 | // // // { address: "0x1453dbb8a29551ade11d89825ca812e05317eaeb", symbol: "TEND", name: "Tendies" }, 12 | // // // { address: "0x2b591e99afe9f32eaa6214f7b7629768c40eeb39", symbol: "HEX", name: "Staking" }, 13 | // // { address: "0xe53ec727dbdeb9e2d5456c3be40cff031ab40a55", symbol: "SUPER", name: "SuperFarm" }, 14 | // // { address: "0xa47c8bf37f92abed4a126bda807a7b7498661acd", symbol: "UST", name: "Mirror StableCoin" }, 15 | // // // { address: "0x853d955acef822db058eb8505911ed77f175b99e", symbol: "FRAX", name: "Frax" }, 16 | // // { address: "0x2260fac5e5542a773aa44fbcfedf7c193bc2c599", symbol: "WBTC", name: "Wrapped Bitcoin" }, 17 | // // // { address: "0x72e364f2abdc788b7e918bc238b21f109cd634d7", symbol: "MVI", name: "Metaverse Virtual Reality" }, 18 | // // // { address: "0x95ad61b0a150d79219dcf64e1e6cc01f0b64c4ce", symbol: "SHIB", name: "Shiba Inu" }, 19 | // // { address: "0x1f9840a85d5af5bf1d1762f925bdaddc4201f984", symbol: "UNI", name: "Uniswap" }, 20 | // // // { address: "0x1c9922314ed1415c95b9fd453c3818fd41867d0b", symbol: "TOWER", name: "Crazy Defense Heroes" }, 21 | // // // { address: "0x990f341946a3fdb507ae7e52d17851b87168017c", symbol: "STRONG", name: "StrongBlock Eth MasterNodes as a service" }, 22 | // // // { address: "0x07150e919b4de5fd6a63de1f9384828396f25fdc", symbol: "BASE", name: "Base Protocol" }, 23 | // // // { address: "0xc770eefad204b5180df6a14ee197d99d808ee52d", symbol: "FOX", name: "Fox" }, 24 | // // // { address: "0xfb7b4564402e5500db5bb6d63ae671302777c75a", symbol: "DEXT", name: "Dex Tools " }, 25 | // // // { address: "0x514910771af9ca656af840dff83e8264ecf986ca", symbol: "LINK", name: "Chainlink Oracle" }, 26 | // // { address: "0x557b933a7c2c45672b610f8954a3deb39a51a8ca", symbol: "REVV", name: "REv Motorsport" }, 27 | // // { address: "0x09a3ecafa817268f77be1283176b946c4ff2e608", symbol: "MIR", name: "Mirror Protocol" }, 28 | // { address: "0x8e870d67f660d95d5be530380d0ec0bd388289e1", symbol: "PAX", name: "Paxos Standard" }, 29 | // { address: "0x111111111117dc0aa78b770fa6a738034120c302", symbol: "1INCH", name: "1Inch Token" }, 30 | // { address: "0x0f5d2fb29fb7d3cfee444a200298f468908cc942", symbol: "MANA", name: "Decentralland" }, 31 | // { address: "0x7d1afa7b718fb893db30a3abc0cfc608aacfebb0", symbol: "MATIC", name: "Polygon Network" }, 32 | // { address: "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", symbol: "GTC", name: "GitCoin" }, 33 | // { address: "0xa0246c9032bc3a600820415ae600c6388619a14d", symbol: "FARM", name: "Harvest Finance Staking" }, 34 | // { address: "0xc011a73ee8576fb46f5e1c5751ca3b9fe0af2a6f", symbol: "SNX", name: "Synthetix" }, 35 | // { address: "0xd2877702675e6ceb975b4a1dff9fb7baf4c91ea9", symbol: "LUNA", name: "Mirror synthetics protocol token" }, 36 | // { address: "0x35a532d376ffd9a705d0bb319532837337a398e7", symbol: "WDOGE", name: "Wrapped DogeCoin" }, 37 | 38 | 39 | // BSC MAINNET 40 | { address: "0xc12ecee46ed65d970ee5c899fcc7ae133aff9b03", symbol: "TRY", name: "TRY BSC" }, 41 | { address: "0xc7bc24c4c18f8251d31611114d0e7b5f5ef76762", symbol: "RICH", name: "RICHIE" }, 42 | { address: "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", symbol: "CAKE", name: "CAKE" }, 43 | { address: "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c", symbol: "WBNB", name: "Wrapped BNB" }, 44 | { address: "0xe9e7cea3dedca5984780bafc599bd69add087d56", symbol: "BUSD", name: "BUSD" }, 45 | { address: "0x55d398326f99059ff775485246999027b3197955", symbol: "USDT", name: "Tether USD" }, 46 | { address: "0x3203c9e46ca618c8c1ce5dc67e7e9d75f5da2377", symbol: "MBOX", name: "MOBOX" }, 47 | { address: "0x0e09fabb73bd3ade0a17ecc321fd13a19e81ce82", symbol: "CAKE", name: "Pancake Token" }, 48 | { address: "0x2170ed0880ac9a755fd29b2688956bd959f933f8", symbol: "ETH", name: "Ehereum Token" }, 49 | { address: "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c", symbol: "BTCB", name: "BTCB Token" }, 50 | { address: "0xacb8f52dc63bb752a51186d1c55868adbffee9c1", symbol: "BP", name: "BunnyPark" }, 51 | { address: "0xe8176d414560cfe1bf82fd73b986823b89e4f545", symbol: "HERO", name: "StepHero" }, 52 | ] -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import chalk from "chalk"; 2 | import { connect } from "mongoose"; 3 | import { schedule } from "node-cron"; 4 | import { config } from "../config"; 5 | import { OneInch } from "./lib"; 6 | import { Quote, Direction } from "./types"; 7 | const chalkTable = require('chalk-table'); 8 | import BigNumber from "bignumber.js"; 9 | import { buildTradeMsg, flat, sendMessage } from "./utils"; 10 | import { MONITORED_TOKENS } from "./data/token"; 11 | import { Approve, User } from "./models"; 12 | import { bot } from "./lib/bot"; 13 | 14 | const Main = async () => { 15 | const oneInch = new OneInch() 16 | console.log('Starting...'); 17 | console.log(`---`.repeat(10)); 18 | 19 | try { 20 | bot.stop() 21 | } 22 | catch (err) { 23 | } 24 | 25 | console.log('Connecting to telegram bot...\n---'); 26 | await bot.launch().then((result) => { 27 | console.log('Connected to telegram bot ✅✅✅'); 28 | 29 | }).catch(async (err) => { 30 | let error = JSON.parse(JSON.stringify(err)) 31 | console.log('Telegram Error:', error?.message); 32 | 33 | }).catch((error: any) => { 34 | console.log('Telegram error:', error); 35 | }) 36 | 37 | console.log(`---`.repeat(10)); 38 | console.log('Connecting to MongoDb...\n---'); 39 | const options = { 40 | useNewUrlParser: true, 41 | useUnifiedTopology: true, 42 | keepAlive: true, 43 | connectTimeoutMS: 60000, 44 | socketTimeoutMS: 60000, 45 | } 46 | 47 | await connect(config.DB_URL, options).then((result) => { 48 | console.log("Connected to MongoDb :) ✅✅✅"); 49 | }).catch(async (err) => { 50 | let error = JSON.parse(JSON.stringify(err)) 51 | console.log('Mongo Error:', error); 52 | }); 53 | console.log(`---`.repeat(10)); 54 | 55 | await oneInch.getProtocols() 56 | .then((protocols: string[]) => { 57 | console.log(`Finding the best route for trade on: ${protocols.join(', ')}...👀👀👀`); 58 | }) 59 | .catch((err: any) => { }) 60 | 61 | console.log(`---`.repeat(10)); 62 | 63 | let ethInAmount = new BigNumber(config.ETH_IN_AMOUNT).shiftedBy(18).toString() 64 | let on_cooldown = false 65 | let message = '' 66 | let users = await User.find({ is_active: true }) 67 | 68 | schedule(`*/${config.PRICE_CHECK_INTERVAL_IN_SECONDS} * * * * *`, async function () { 69 | console.log(`***`.repeat(10)); 70 | MONITORED_TOKENS.forEach(async (token: any) => { 71 | try { 72 | const buy_quote: Quote = await oneInch.getQuote({ 73 | srcToken: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', 74 | toToken: token.address, 75 | srcAmount: ethInAmount 76 | }) 77 | let token_amount = buy_quote.toAmount 78 | const sell_quote: Quote = await oneInch.getQuote({ 79 | srcToken: token.address, 80 | toToken: buy_quote.srcToken.address, 81 | srcAmount: token_amount 82 | }) 83 | 84 | const options = { 85 | leftPad: 0, 86 | columns: [ 87 | { field: "eth_in", name: chalk.cyan("ETH IN") }, 88 | { field: "buy_on_dex", name: chalk.green(`BEST BUY ROUTEs`) }, 89 | { field: "sell_on_dex", name: chalk.yellow("BEST SELL ROUTEs") }, 90 | { field: "token_amount", name: chalk.yellow("Token OUT") }, 91 | { field: "eth_out", name: chalk.yellow("ETH OUT") }, 92 | { field: "profit", name: chalk.yellow("PROFIT PCT") }, 93 | { field: "time", name: chalk.magenta("Time 📅") }, 94 | { field: "rate", name: chalk.blue("Fetch Rate 🕠") }, 95 | ] 96 | }; 97 | const timestamp = new Date() 98 | let eth_out = parseFloat(new BigNumber(sell_quote.toAmount).shiftedBy(-sell_quote.toToken.decimals!).toFixed(6)) 99 | 100 | const profit_pct = ((eth_out - config.ETH_IN_AMOUNT) / config.ETH_IN_AMOUNT) * 100 101 | let token_out = parseFloat(new BigNumber(token_amount).shiftedBy(-buy_quote.toToken.decimals!).toFixed(6)) 102 | let best_buy_protocols = (await flat(buy_quote.protocols)).map((quote: any) => quote.name).join(',') 103 | let best_sell_protocols = (await flat(sell_quote.protocols)).map((quote: any) => quote.name).join(',') 104 | const table = chalkTable(options, [ 105 | { 106 | eth_in: config.ETH_IN_AMOUNT, 107 | buy_on_dex: best_buy_protocols, 108 | sell_on_dex: best_sell_protocols, 109 | token_amount: `${token_out} ${buy_quote.toToken.symbol}`, 110 | eth_out: `${eth_out} ${sell_quote.toToken.symbol}`, 111 | profit: `${profit_pct.toFixed(6)}%`, 112 | time: timestamp.toISOString().replace(/T/, ' ').replace(/\..+/, ''), 113 | rate: `${config.PRICE_CHECK_INTERVAL_IN_SECONDS}s` 114 | }, 115 | ]); 116 | if (JSON.stringify(best_buy_protocols) != JSON.stringify(best_sell_protocols)) { 117 | console.log(table); 118 | 119 | 120 | if (profit_pct >= config.PROFIT_THRESHOLD.BUY && !on_cooldown) { 121 | let nonce: number = await oneInch.getNonce() 122 | console.log(`Nonce:`, nonce); 123 | 124 | on_cooldown = true 125 | /** 126 | * Start of Buy => Approve? => Sell Txs 127 | */ 128 | try { 129 | 130 | console.log(`Initiating a buy for token ${token.symbol} ...`); 131 | // build buy Tx 132 | let txData = await oneInch.buildTx({ 133 | srcToken: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', 134 | toToken: token.address, 135 | srcAmount: ethInAmount, 136 | slippage: config.SLIPPAGE 137 | }) 138 | console.log(`Buy Tx Data:`, txData); 139 | 140 | // send a buy Tx 141 | nonce += 1; 142 | oneInch.sendTx({ 143 | data: txData.tx, 144 | nonce 145 | }).then(async (tx: any) => { 146 | if (tx.hash) { 147 | 148 | console.log('Tx hash for buy:', tx.hash) 149 | // build Buy Tg Msg 150 | // message = await buildTradeMsg({ data: tx, profit_pct: profit_pct, side: Direction.BUY }) 151 | // send Msg to Tg 152 | // sendMessage(users, message); 153 | 154 | try { 155 | /** 156 | * Approve Token if it has not been approved before and save it to db 157 | */ 158 | // approve if token has not been approved 159 | const token_is_approved = await Approve.exists({ token: token }) 160 | if (!token_is_approved) { 161 | // approve if not approved 162 | message = `Approving ${token.name}...` 163 | sendMessage(users, message) 164 | let txData = await oneInch.approve(token.address) 165 | nonce += 1; 166 | await oneInch.sendTx({ 167 | data: txData.tx, 168 | nonce 169 | }).then((tx: any) => { 170 | console.log(`${token.symbol} has been approved successfully.`) 171 | sendMessage(users, message) 172 | }).catch((err) => { 173 | console.log(`Error: `, err) 174 | }); 175 | } 176 | 177 | 178 | /** 179 | * Get the balance of the bought token shpuld be atleast be 1/2 of what was expected 180 | */ 181 | 182 | let tries = 0 183 | let tokenBalance = '0' 184 | while (tries < 2000) { 185 | tokenBalance = await oneInch.balanceOf(token.address) 186 | if (parseInt(tokenBalance) > parseInt(new BigNumber(token_amount).multipliedBy(0.5).toString())) { 187 | break 188 | } 189 | tries++ 190 | } 191 | /** 192 | * End of Balance Check 193 | */ 194 | 195 | /** 196 | * Sell the bought tokens/assets to the exchange with the best rates 197 | */ 198 | message = `Initiating a sell for token ${token.symbol}...` 199 | // build Sell Tx 200 | let txData = await oneInch.buildTx({ 201 | srcToken: token.address, 202 | toToken: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', 203 | srcAmount: tokenBalance, 204 | slippage: config.SLIPPAGE 205 | }) 206 | console.log(`Sell Tx Data:`, txData); 207 | 208 | // send the sell Tx 209 | nonce += 1; 210 | oneInch.sendTx({ 211 | data: txData.tx, 212 | nonce, 213 | gasLimit: config.GAS_LIMIT 214 | }).then(async (tx: any) => { 215 | if (tx.hash) { 216 | console.log(`Tx for Sell:`, tx.hash) 217 | // build Sell Tg Msg 218 | // message = await buildTradeMsg({ data: tx, profit_pct: profit_pct, side: Direction.SELL }) 219 | // send Msg to Tg 220 | // sendMessage(users, message); 221 | 222 | // unlock to continue trading 223 | on_cooldown = true 224 | 225 | } 226 | }).catch((err) => { 227 | console.log(`Error:`, err) 228 | 229 | // unlock to continue trading 230 | on_cooldown = true 231 | }) 232 | 233 | /** 234 | * End of Sell Tx 235 | */ 236 | 237 | } 238 | catch (error) { 239 | console.error(`Error:`, error) 240 | } 241 | } 242 | } 243 | ).catch((err: any) => { 244 | 245 | console.log(`Error:`, err); 246 | 247 | // unlock to continue trading 248 | on_cooldown = true 249 | }); 250 | 251 | 252 | } catch (error) { 253 | console.error(`Error:`, error) 254 | } 255 | /** 256 | * End of Buy => Approve? => Sell Txs 257 | */ 258 | 259 | } 260 | } 261 | 262 | 263 | } catch (error: any) { 264 | // console.error('Error:', error); 265 | } 266 | 267 | }); 268 | }) 269 | 270 | } 271 | 272 | 273 | Main() -------------------------------------------------------------------------------- /src/lib/1inch.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { config } from "../../config"; 3 | import { Quote } from "../types/1inch"; 4 | import { toHex } from "../utils"; 5 | import { Aggr } from "./aggr"; 6 | 7 | export class OneInch extends Aggr { 8 | constructor() { 9 | super(`1Inch`, `https://api.1inch.exchange/v3.0/`); 10 | } 11 | /** 12 | * Gets the best exchange rate for a given pair 13 | * @param srcToken - from token 14 | * @param toToken - to token 15 | * @param srcAmount - from token amount 16 | * @param side - trade direction i.e buy or sell 17 | * @returns best quote found 18 | */ 19 | getQuote = async (params: { srcToken: string, toToken: string, srcAmount: number | string, side?: string }): Promise => { 20 | const { srcToken, toToken, srcAmount, side } = params 21 | try { 22 | const { data }: any = await axios({ 23 | method: 'GET', 24 | url: `${this.API_URL}${config.NETWORK.ID}/quote?fromTokenAddress=${srcToken}&toTokenAddress=${toToken}&amount=${srcAmount}` 25 | }) 26 | return { 27 | srcToken: data.fromToken, 28 | srcAmount: data.fromTokenAmount, 29 | toToken: data.toToken, 30 | toAmount: data.toTokenAmount, 31 | protocols: data.protocols 32 | } 33 | } catch (error: any) { 34 | throw new Error(JSON.stringify(error)); 35 | 36 | } 37 | } 38 | /** 39 | * Builds a tx based on the given params 40 | * @param srcToken - from Token 41 | * @param toToken - to Token 42 | * @param srcAmount - from Token amount 43 | * @param slippage - slippage tolerance 44 | * @returns tx data that can be send to the network 45 | */ 46 | buildTx = async (params: { srcToken: string, toToken: string, srcAmount: number | string, slippage?: number, gasLimit?: string }) => { 47 | const { srcToken, toToken, srcAmount, slippage, gasLimit } = params; 48 | try { 49 | let defaultSlippage = 0.5 50 | console.log(defaultSlippage) 51 | const { data }: any = await axios({ 52 | method: "GET", 53 | url: `${this.API_URL}${config.NETWORK.ID}/swap?fromTokenAddress=${srcToken}&toTokenAddress=${toToken}&amount=${srcAmount}&fromAddress=${config.WALLET.PUBLIC_KEY}&disableEstimate=true&slippage=${slippage ? `${slippage}` : defaultSlippage}` 54 | }) 55 | delete data.tx.gasPrice; //ethersjs will find the gasPrice needed 56 | delete data.tx.gas; 57 | 58 | if (gasLimit) { 59 | data.tx.gasLimit = toHex(parseInt(gasLimit)) 60 | } 61 | 62 | data.tx["value"] = toHex(parseInt(data.tx["value"])) 63 | 64 | return data 65 | } catch (error: any) { 66 | throw new Error(JSON.stringify(error)); 67 | } 68 | } 69 | 70 | /** 71 | * Gets supported protocols by 1inch price aggregator 72 | * @returns Supported protocols by 1inch price aggregator 73 | */ 74 | getProtocols = async (): Promise => { 75 | try { 76 | const { data }: any = await axios({ 77 | method: "GET", 78 | url: `${this.API_URL}${config.NETWORK.ID}/protocols` 79 | }) 80 | return data.protocols 81 | 82 | } catch (error) { 83 | throw new Error(JSON.stringify(error)); 84 | } 85 | } 86 | 87 | /** 88 | * Approves spender to trade the given amount of a token 89 | * @param tokenAddress address of the token to approve 90 | * @param amount amount of the the quantity to approve: default is infinity 91 | * @returns approve data that can be send to the network 92 | */ 93 | approve = async (tokenAddress: string, amount?: string) => { 94 | try { 95 | const { data }: any = await axios({ 96 | method: "GET", 97 | url: `${this.API_URL}${config.NETWORK.ID}/approve/calldata?tokenAddress=${tokenAddress}` 98 | }) 99 | console.log(data) 100 | delete data.gasPrice; //ethersjs will find the gasPrice needed 101 | delete data.gas; 102 | 103 | data["value"] = toHex(parseInt(data["value"])) 104 | return data 105 | } catch (error: any) { 106 | throw new Error(error); 107 | } 108 | } 109 | 110 | } -------------------------------------------------------------------------------- /src/lib/aggr.ts: -------------------------------------------------------------------------------- 1 | import { ethers, Wallet } from "ethers"; 2 | import { config } from "../../config"; 3 | 4 | export abstract class Aggr { 5 | readonly name: string; 6 | readonly provider: ethers.providers.JsonRpcProvider; 7 | readonly account: Wallet 8 | readonly API_URL: string 9 | 10 | constructor(name: string, api_url: string) { 11 | this.name = name; 12 | this.provider = new ethers.providers.JsonRpcProvider(config.PROVIDERS.INFURA_API_KEY) 13 | this.account = new Wallet(config.WALLET.PRIVATE_KEY, this.provider); 14 | this.API_URL = api_url 15 | } 16 | /** 17 | * Sends a tx to the blockchain 18 | * @param data - Tx data 19 | * @param nonce - wallet current nonce 20 | * @returns Tx hash if successful else error message 21 | */ 22 | sendTx = async (params: { data: any, gasLimit?: string, nonce: number }) => { 23 | const { data, gasLimit, nonce } = params 24 | try { 25 | 26 | // if (!isNaN(nonce)) { 27 | // data.nonce = nonce + 1 28 | // } 29 | if (gasLimit) { 30 | data.gasLimit = gasLimit 31 | } 32 | 33 | const tx = await this.account.sendTransaction(data) 34 | return tx 35 | console.log("Tx success"); 36 | } catch (e) { 37 | throw new Error(`Tx failure ${e}`); 38 | } 39 | } 40 | 41 | /** 42 | * Gets balance of a token in a wallet address 43 | * @param tokenAddress token address to check to check balance 44 | * @returns balance of token in a wallet 45 | */ 46 | balanceOf = async (tokenAddress: string) => { 47 | let contract = new ethers.Contract( 48 | tokenAddress, 49 | ['function balanceOf(address account) external view returns (uint256)'], 50 | this.account 51 | ) 52 | return await contract.balanceOf(config.WALLET.PUBLIC_KEY); 53 | 54 | } 55 | 56 | /** 57 | * Gets the current nonce of a wallet 58 | * @returns wallet's current nonce 59 | */ 60 | getNonce = async (): Promise => { 61 | return await this.account.getTransactionCount() 62 | } 63 | } -------------------------------------------------------------------------------- /src/lib/bot.ts: -------------------------------------------------------------------------------- 1 | import { Context, Telegraf } from 'telegraf' 2 | import { Update, Message } from 'typegram'; 3 | import { config } from '../../config'; 4 | import { User, UserAttrs } from '../models'; 5 | 6 | /** 7 | * 8 | * @param params.id User's telegram id; 9 | * @param params.is_bot User type; 10 | * @param params.first_name User's first name; 11 | * @param params.last_name User's last name; 12 | * @param params.username User's telegram username; 13 | * @returns userObject 14 | */ 15 | const getOrCreateUser = async (context: Context<{ message: Update.New & Update.NonChannel & Message.TextMessage; update_id: number; }> & Omit, keyof Context>) => { 16 | 17 | const params = context.message?.from ? context?.message?.from : context.update?.message.from 18 | 19 | 20 | const { id, is_bot, first_name, last_name, username } = params 21 | 22 | const user = await User.findOne({ tg_id: id, bot_name: context.me }) 23 | 24 | if (user) { 25 | return user 26 | } else { 27 | 28 | const new_user = new User({ 29 | tg_id: id, 30 | is_bot: is_bot, 31 | is_active: await User.exists({ tg_id: id }), 32 | first_name: first_name, 33 | last_name: last_name, 34 | username: username, 35 | bot_name: context.me 36 | 37 | }) 38 | await new_user.save() 39 | 40 | return await User.findOne({ tg_id: id }) 41 | } 42 | } 43 | /** 44 | * Bot 45 | */ 46 | let bot: Telegraf = new Telegraf(config.BOT_TOKEN) 47 | 48 | /** middlewares */ 49 | bot.use(async (ctx: any, next) => { 50 | try { 51 | const user = (await getOrCreateUser( 52 | ctx.message?.from ? ctx : ctx 53 | )) as UserAttrs; 54 | 55 | if (!user.is_active) { 56 | return ctx.reply(`Please contact @dennohpeter to activate your account.`); 57 | } else { 58 | await next(); 59 | return; 60 | } 61 | } 62 | catch (error) { 63 | console.log(error); 64 | 65 | } 66 | }); 67 | 68 | bot.start(async (ctx: any) => { 69 | const user = (await getOrCreateUser(ctx)) as UserAttrs 70 | const defaultMessage = `Hello ${user?.username ? user.username : user?.last_name}, welcome to ${ctx.me}` 71 | return ctx.reply(defaultMessage) 72 | }) 73 | bot.on('text', async (ctx: any) => { 74 | const user = await (getOrCreateUser(ctx)) as UserAttrs 75 | }) 76 | 77 | export { bot } 78 | 79 | 80 | -------------------------------------------------------------------------------- /src/lib/dex.ag.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wittyCodeX/MultiDexArbBot/b99ed6a31e409051bca61c5ca0a072c1b4292a08/src/lib/dex.ag.ts -------------------------------------------------------------------------------- /src/lib/index.ts: -------------------------------------------------------------------------------- 1 | export * from './1inch' -------------------------------------------------------------------------------- /src/lib/matcha.xyz.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wittyCodeX/MultiDexArbBot/b99ed6a31e409051bca61c5ca0a072c1b4292a08/src/lib/matcha.xyz.ts -------------------------------------------------------------------------------- /src/lib/paraswap.io.ts: -------------------------------------------------------------------------------- 1 | import axios from "axios"; 2 | import { config } from "../../config"; 3 | import { Quote } from "../types/1inch"; 4 | import { Aggr } from "./aggr"; 5 | 6 | export class ParaSwap extends Aggr { 7 | constructor() { 8 | super(`ParaSwap`, `https://apiv5.paraswap.io/`); 9 | } 10 | getQuote = async (srcToken: string, toToken: string, srcAmount: number): Promise => { 11 | try { 12 | const { data }: any = await axios({ 13 | method: 'GET', 14 | url: `${this.API_URL}price/?srcToken=${srcToken}&destToken=${toToken}&amount=${srcAmount}` 15 | }) 16 | return { 17 | srcToken: data.fromToken, 18 | srcAmount: data.fromTokenAmount, 19 | toToken: data.toToken, 20 | toAmount: data.toTokenAmount, 21 | protocols: data.protocols 22 | } 23 | } catch (error: any) { 24 | throw new Error(JSON.stringify(error)); 25 | 26 | } 27 | } 28 | buildTx = async (srcToken: string, toToken: string, srcAmount: number, slippage?: number): Promise => { 29 | try { 30 | const { data } = await axios({ 31 | method: "GET", 32 | url: `${this.API_URL}${config.NETWORK.ID}/swap?fromTokenAddress=${srcToken}&toTokenAddress=${toToken}&amount=${srcAmount}&fromAddress=${config.WALLET.PUBLIC_KEY}&disableEstimate=true&slippage=${slippage}` 33 | }) 34 | return data 35 | } catch (error: any) { 36 | throw new Error(JSON.stringify(error)); 37 | } 38 | } 39 | 40 | getProtocols = async (): Promise => { 41 | try { 42 | const { data }: any = await axios({ 43 | method: "GET", 44 | url: `${this.API_URL}${config.NETWORK.ID}/protocols` 45 | }) 46 | return data.protocols 47 | 48 | } catch (error) { 49 | throw new Error(JSON.stringify(error)); 50 | } 51 | } 52 | 53 | } -------------------------------------------------------------------------------- /src/models/approve.ts: -------------------------------------------------------------------------------- 1 | import { Model, Document, model, Schema } from "mongoose"; 2 | import { Token } from "../types"; 3 | 4 | // An interface that describes attributes that a transaction should have 5 | interface ApproveAttrs { 6 | token: Token; 7 | } 8 | 9 | // An interface that describes what attributes a transaction model should have 10 | interface ApproveModel extends Model { 11 | build(attrs: ApproveAttrs): ApproveDoc; 12 | } 13 | 14 | // An interface that descibes single transaction properties 15 | interface ApproveDoc extends Document { 16 | token: Token; 17 | } 18 | 19 | // Creating transaction schema 20 | const approveSchema = new Schema( 21 | { 22 | token: { 23 | type: { 24 | name: String, 25 | symbol: String, 26 | address: String 27 | }, unique: true 28 | }, 29 | }, 30 | { 31 | timestamps: true, 32 | } 33 | ); 34 | 35 | // Statics 36 | approveSchema.statics.build = (attrs: ApproveAttrs) => { 37 | return new Approve(attrs); 38 | }; 39 | 40 | // Creating transaction model 41 | const Approve = model("Approve", approveSchema); 42 | 43 | export { Approve, ApproveDoc }; 44 | -------------------------------------------------------------------------------- /src/models/index.ts: -------------------------------------------------------------------------------- 1 | export * from './approve' 2 | export * from './user' -------------------------------------------------------------------------------- /src/models/user.ts: -------------------------------------------------------------------------------- 1 | import { Schema, model, Model } from 'mongoose'; 2 | 3 | // An interface that describes attributes that a user should have 4 | interface UserAttrs { 5 | tg_id: number; 6 | first_name?: string; 7 | last_name?: string; 8 | username?: string; 9 | is_bot: boolean; 10 | is_active?: boolean; 11 | bot_name?: string; 12 | } 13 | 14 | // An interface that describes what attributes a user model should have 15 | interface UserModel extends Model { 16 | build(attrs: UserAttrs): UserDoc 17 | } 18 | 19 | // An interface that descibes single user properties 20 | interface UserDoc extends Document { 21 | tg_id: number; 22 | first_name?: string; 23 | last_name?: string; 24 | username?: string; 25 | is_bot: boolean; 26 | is_active?: boolean; 27 | last_action?: string; 28 | created_at?: Date; 29 | bot_name?: string; 30 | } 31 | 32 | // Creating user schema 33 | const userSchema = new Schema({ 34 | tg_id: { type: Number }, 35 | is_bot: { type: Boolean }, 36 | first_name: { type: String }, 37 | last_name: { type: String }, 38 | username: { type: String }, 39 | bot_name: { type: String }, 40 | is_active: { type: Boolean, default: false }, 41 | last_action: { type: String }, 42 | created_at: { type: Date, default: Date.now } 43 | 44 | }) 45 | // Statics 46 | userSchema.static('build', (attrs: UserAttrs) => { return new User(attrs) }) 47 | 48 | // Creating user model 49 | const User = model('User', userSchema) 50 | 51 | export { User, UserAttrs, UserDoc } -------------------------------------------------------------------------------- /src/types/1inch.ts: -------------------------------------------------------------------------------- 1 | export interface Token { 2 | symbol: string, 3 | name: string, 4 | address: string, 5 | decimals?: number, 6 | logoURI?: string 7 | } 8 | export interface Quote { 9 | srcToken: Token, 10 | toToken: Token, 11 | srcAmount: string, 12 | toAmount: string, 13 | protocols: any 14 | } -------------------------------------------------------------------------------- /src/types/enums.ts: -------------------------------------------------------------------------------- 1 | export enum Direction { 2 | SELL = 'SELL', 3 | BUY = 'BUY' 4 | } -------------------------------------------------------------------------------- /src/types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './1inch'; 2 | export * from './enums'; -------------------------------------------------------------------------------- /src/utils/common.ts: -------------------------------------------------------------------------------- 1 | import BigNumber from "bignumber.js" 2 | import { config } from "../../config" 3 | import { bot } from "../lib/bot" 4 | import { UserDoc } from "../models" 5 | import { Direction } from "../types" 6 | 7 | export const flat = async (arr: any, start: number = 0, end: number = 3): Promise> => { 8 | if (start < end) { 9 | start += 1 10 | return flat([].concat(...arr), start) 11 | } 12 | return arr 13 | } 14 | 15 | export const toHex = (value: number) => { 16 | return `0x${value.toString(16)}` 17 | } 18 | export const humanizeBalance = async (balance: string | number, decimals: number) => { 19 | return new BigNumber(balance).shiftedBy(-decimals).toString() 20 | } 21 | 22 | export const buildTradeMsg = async (params: { data: any, profit_pct: number, side: Direction }): Promise => { 23 | const { data, profit_pct, side } = params 24 | 25 | let dexes = (await flat(data.protocols)).map((quote: any) => quote.name).join(', ') 26 | let msg = `* NEW TRADE NOTIFICATION *\n-- - ` 27 | msg += `\n*Direction:* ${side}` 28 | if (side == Direction.SELL) { 29 | 30 | msg += `\n*Token Amount:* ${await humanizeBalance(data.fromTokenAmount, data.fromToken.decimals)}` 31 | msg += `\n*Token:* ${data.fromToken.name}` 32 | msg += `\n*ETH Amount:* ${await humanizeBalance(data.toTokenAmount, data.toToken.decimals)}` 33 | } else { 34 | msg += `\n*ETH Amount:* ${await humanizeBalance(data.fromTokenAmount, data.fromToken.decimals)}` 35 | msg += `\n*Token Amount:* ${await humanizeBalance(data.toTokenAmount, data.toToken.decimals)}` 36 | msg += `\n*Token:* ${data.fromToken.name}` 37 | } 38 | msg += `\n*Profit PCT:* ${profit_pct.toFixed(6)}%` 39 | msg += `\n*Dex:* ${dexes}` 40 | msg += `\n*Gas Limit:* ${data.gasLimit}` 41 | msg += `\n*Hash:* [${data.hash.toUpperCase()}](${config.EXPLORER}${data.hash})` 42 | 43 | return msg 44 | } 45 | 46 | export const sendMessage = async (users: UserDoc[], message: string) => { 47 | 48 | users.map(async (user: UserDoc) => { 49 | try { 50 | await bot.telegram.sendMessage(user.tg_id, message 51 | .replaceAll("_", "\\_") 52 | .replaceAll("|", "\\|") 53 | .replaceAll(".", "\\.") 54 | .replaceAll("{", "\\{") 55 | .replaceAll("+", "\\+") 56 | .replaceAll("}", "\\}") 57 | .replaceAll("=", "\\=") 58 | .replaceAll(">", "\\>") 59 | .replaceAll("<", "\\<") 60 | .replaceAll("-", "\\-") 61 | .replaceAll("!", "\\!"), 62 | { parse_mode: 'MarkdownV2', disable_web_page_preview: true }) 63 | } catch (error) { 64 | console.log(error); 65 | 66 | } 67 | } 68 | ) 69 | } -------------------------------------------------------------------------------- /src/utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './common'; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "ES2021", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ 22 | // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | 26 | /* Modules */ 27 | "module": "commonjs", /* Specify what module code is generated. */ 28 | // "rootDir": "./", /* Specify the root folder within your source files. */ 29 | // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ 30 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 31 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 32 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 33 | // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ 34 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 35 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 36 | // "resolveJsonModule": true, /* Enable importing .json files */ 37 | // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ 38 | 39 | /* JavaScript Support */ 40 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 41 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 42 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ 43 | 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 | 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 | 75 | /* Type Checking */ 76 | "strict": true, /* Enable all strict type-checking options. */ 77 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ 78 | // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ 79 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 80 | // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ 81 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 82 | // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ 83 | // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ 84 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 85 | // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ 86 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ 87 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 88 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 89 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 90 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 91 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 92 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ 93 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 94 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 95 | 96 | /* Completeness */ 97 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 98 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 99 | } 100 | } 101 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@ethersproject/abi@5.4.1", "@ethersproject/abi@^5.4.0": 6 | version "5.4.1" 7 | resolved "https://registry.yarnpkg.com/@ethersproject/abi/-/abi-5.4.1.tgz#6ac28fafc9ef6f5a7a37e30356a2eb31fa05d39b" 8 | integrity sha512-9mhbjUk76BiSluiiW4BaYyI58KSbDMMQpCLdsAR+RsT2GyATiNYxVv+pGWRrekmsIdY3I+hOqsYQSTkc8L/mcg== 9 | dependencies: 10 | "@ethersproject/address" "^5.4.0" 11 | "@ethersproject/bignumber" "^5.4.0" 12 | "@ethersproject/bytes" "^5.4.0" 13 | "@ethersproject/constants" "^5.4.0" 14 | "@ethersproject/hash" "^5.4.0" 15 | "@ethersproject/keccak256" "^5.4.0" 16 | "@ethersproject/logger" "^5.4.0" 17 | "@ethersproject/properties" "^5.4.0" 18 | "@ethersproject/strings" "^5.4.0" 19 | 20 | "@ethersproject/abstract-provider@5.4.1", "@ethersproject/abstract-provider@^5.4.0": 21 | version "5.4.1" 22 | resolved "https://registry.yarnpkg.com/@ethersproject/abstract-provider/-/abstract-provider-5.4.1.tgz#e404309a29f771bd4d28dbafadcaa184668c2a6e" 23 | integrity sha512-3EedfKI3LVpjSKgAxoUaI+gB27frKsxzm+r21w9G60Ugk+3wVLQwhi1LsEJAKNV7WoZc8CIpNrATlL1QFABjtQ== 24 | dependencies: 25 | "@ethersproject/bignumber" "^5.4.0" 26 | "@ethersproject/bytes" "^5.4.0" 27 | "@ethersproject/logger" "^5.4.0" 28 | "@ethersproject/networks" "^5.4.0" 29 | "@ethersproject/properties" "^5.4.0" 30 | "@ethersproject/transactions" "^5.4.0" 31 | "@ethersproject/web" "^5.4.0" 32 | 33 | "@ethersproject/abstract-signer@5.4.1", "@ethersproject/abstract-signer@^5.4.0": 34 | version "5.4.1" 35 | resolved "https://registry.yarnpkg.com/@ethersproject/abstract-signer/-/abstract-signer-5.4.1.tgz#e4e9abcf4dd4f1ba0db7dff9746a5f78f355ea81" 36 | integrity sha512-SkkFL5HVq1k4/25dM+NWP9MILgohJCgGv5xT5AcRruGz4ILpfHeBtO/y6j+Z3UN/PAjDeb4P7E51Yh8wcGNLGA== 37 | dependencies: 38 | "@ethersproject/abstract-provider" "^5.4.0" 39 | "@ethersproject/bignumber" "^5.4.0" 40 | "@ethersproject/bytes" "^5.4.0" 41 | "@ethersproject/logger" "^5.4.0" 42 | "@ethersproject/properties" "^5.4.0" 43 | 44 | "@ethersproject/address@5.4.0", "@ethersproject/address@^5.4.0": 45 | version "5.4.0" 46 | resolved "https://registry.yarnpkg.com/@ethersproject/address/-/address-5.4.0.tgz#ba2d00a0f8c4c0854933b963b9a3a9f6eb4a37a3" 47 | integrity sha512-SD0VgOEkcACEG/C6xavlU1Hy3m5DGSXW3CUHkaaEHbAPPsgi0coP5oNPsxau8eTlZOk/bpa/hKeCNoK5IzVI2Q== 48 | dependencies: 49 | "@ethersproject/bignumber" "^5.4.0" 50 | "@ethersproject/bytes" "^5.4.0" 51 | "@ethersproject/keccak256" "^5.4.0" 52 | "@ethersproject/logger" "^5.4.0" 53 | "@ethersproject/rlp" "^5.4.0" 54 | 55 | "@ethersproject/base64@5.4.0", "@ethersproject/base64@^5.4.0": 56 | version "5.4.0" 57 | resolved "https://registry.yarnpkg.com/@ethersproject/base64/-/base64-5.4.0.tgz#7252bf65295954c9048c7ca5f43e5c86441b2a9a" 58 | integrity sha512-CjQw6E17QDSSC5jiM9YpF7N1aSCHmYGMt9bWD8PWv6YPMxjsys2/Q8xLrROKI3IWJ7sFfZ8B3flKDTM5wlWuZQ== 59 | dependencies: 60 | "@ethersproject/bytes" "^5.4.0" 61 | 62 | "@ethersproject/basex@5.4.0", "@ethersproject/basex@^5.4.0": 63 | version "5.4.0" 64 | resolved "https://registry.yarnpkg.com/@ethersproject/basex/-/basex-5.4.0.tgz#0a2da0f4e76c504a94f2b21d3161ed9438c7f8a6" 65 | integrity sha512-J07+QCVJ7np2bcpxydFVf/CuYo9mZ7T73Pe7KQY4c1lRlrixMeblauMxHXD0MPwFmUHZIILDNViVkykFBZylbg== 66 | dependencies: 67 | "@ethersproject/bytes" "^5.4.0" 68 | "@ethersproject/properties" "^5.4.0" 69 | 70 | "@ethersproject/bignumber@5.4.2", "@ethersproject/bignumber@^5.4.0": 71 | version "5.4.2" 72 | resolved "https://registry.yarnpkg.com/@ethersproject/bignumber/-/bignumber-5.4.2.tgz#44232e015ae4ce82ac034de549eb3583c71283d8" 73 | integrity sha512-oIBDhsKy5bs7j36JlaTzFgNPaZjiNDOXsdSgSpXRucUl+UA6L/1YLlFeI3cPAoodcenzF4nxNPV13pcy7XbWjA== 74 | dependencies: 75 | "@ethersproject/bytes" "^5.4.0" 76 | "@ethersproject/logger" "^5.4.0" 77 | bn.js "^4.11.9" 78 | 79 | "@ethersproject/bytes@5.4.0", "@ethersproject/bytes@^5.4.0": 80 | version "5.4.0" 81 | resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.4.0.tgz#56fa32ce3bf67153756dbaefda921d1d4774404e" 82 | integrity sha512-H60ceqgTHbhzOj4uRc/83SCN9d+BSUnOkrr2intevqdtEMO1JFVZ1XL84OEZV+QjV36OaZYxtnt4lGmxcGsPfA== 83 | dependencies: 84 | "@ethersproject/logger" "^5.4.0" 85 | 86 | "@ethersproject/constants@5.4.0", "@ethersproject/constants@^5.4.0": 87 | version "5.4.0" 88 | resolved "https://registry.yarnpkg.com/@ethersproject/constants/-/constants-5.4.0.tgz#ee0bdcb30bf1b532d2353c977bf2ef1ee117958a" 89 | integrity sha512-tzjn6S7sj9+DIIeKTJLjK9WGN2Tj0P++Z8ONEIlZjyoTkBuODN+0VfhAyYksKi43l1Sx9tX2VlFfzjfmr5Wl3Q== 90 | dependencies: 91 | "@ethersproject/bignumber" "^5.4.0" 92 | 93 | "@ethersproject/contracts@5.4.1": 94 | version "5.4.1" 95 | resolved "https://registry.yarnpkg.com/@ethersproject/contracts/-/contracts-5.4.1.tgz#3eb4f35b7fe60a962a75804ada2746494df3e470" 96 | integrity sha512-m+z2ZgPy4pyR15Je//dUaymRUZq5MtDajF6GwFbGAVmKz/RF+DNIPwF0k5qEcL3wPGVqUjFg2/krlCRVTU4T5w== 97 | dependencies: 98 | "@ethersproject/abi" "^5.4.0" 99 | "@ethersproject/abstract-provider" "^5.4.0" 100 | "@ethersproject/abstract-signer" "^5.4.0" 101 | "@ethersproject/address" "^5.4.0" 102 | "@ethersproject/bignumber" "^5.4.0" 103 | "@ethersproject/bytes" "^5.4.0" 104 | "@ethersproject/constants" "^5.4.0" 105 | "@ethersproject/logger" "^5.4.0" 106 | "@ethersproject/properties" "^5.4.0" 107 | "@ethersproject/transactions" "^5.4.0" 108 | 109 | "@ethersproject/hash@5.4.0", "@ethersproject/hash@^5.4.0": 110 | version "5.4.0" 111 | resolved "https://registry.yarnpkg.com/@ethersproject/hash/-/hash-5.4.0.tgz#d18a8e927e828e22860a011f39e429d388344ae0" 112 | integrity sha512-xymAM9tmikKgbktOCjW60Z5sdouiIIurkZUr9oW5NOex5uwxrbsYG09kb5bMcNjlVeJD3yPivTNzViIs1GCbqA== 113 | dependencies: 114 | "@ethersproject/abstract-signer" "^5.4.0" 115 | "@ethersproject/address" "^5.4.0" 116 | "@ethersproject/bignumber" "^5.4.0" 117 | "@ethersproject/bytes" "^5.4.0" 118 | "@ethersproject/keccak256" "^5.4.0" 119 | "@ethersproject/logger" "^5.4.0" 120 | "@ethersproject/properties" "^5.4.0" 121 | "@ethersproject/strings" "^5.4.0" 122 | 123 | "@ethersproject/hdnode@5.4.0", "@ethersproject/hdnode@^5.4.0": 124 | version "5.4.0" 125 | resolved "https://registry.yarnpkg.com/@ethersproject/hdnode/-/hdnode-5.4.0.tgz#4bc9999b9a12eb5ce80c5faa83114a57e4107cac" 126 | integrity sha512-pKxdS0KAaeVGfZPp1KOiDLB0jba11tG6OP1u11QnYfb7pXn6IZx0xceqWRr6ygke8+Kw74IpOoSi7/DwANhy8Q== 127 | dependencies: 128 | "@ethersproject/abstract-signer" "^5.4.0" 129 | "@ethersproject/basex" "^5.4.0" 130 | "@ethersproject/bignumber" "^5.4.0" 131 | "@ethersproject/bytes" "^5.4.0" 132 | "@ethersproject/logger" "^5.4.0" 133 | "@ethersproject/pbkdf2" "^5.4.0" 134 | "@ethersproject/properties" "^5.4.0" 135 | "@ethersproject/sha2" "^5.4.0" 136 | "@ethersproject/signing-key" "^5.4.0" 137 | "@ethersproject/strings" "^5.4.0" 138 | "@ethersproject/transactions" "^5.4.0" 139 | "@ethersproject/wordlists" "^5.4.0" 140 | 141 | "@ethersproject/json-wallets@5.4.0", "@ethersproject/json-wallets@^5.4.0": 142 | version "5.4.0" 143 | resolved "https://registry.yarnpkg.com/@ethersproject/json-wallets/-/json-wallets-5.4.0.tgz#2583341cfe313fc9856642e8ace3080154145e95" 144 | integrity sha512-igWcu3fx4aiczrzEHwG1xJZo9l1cFfQOWzTqwRw/xcvxTk58q4f9M7cjh51EKphMHvrJtcezJ1gf1q1AUOfEQQ== 145 | dependencies: 146 | "@ethersproject/abstract-signer" "^5.4.0" 147 | "@ethersproject/address" "^5.4.0" 148 | "@ethersproject/bytes" "^5.4.0" 149 | "@ethersproject/hdnode" "^5.4.0" 150 | "@ethersproject/keccak256" "^5.4.0" 151 | "@ethersproject/logger" "^5.4.0" 152 | "@ethersproject/pbkdf2" "^5.4.0" 153 | "@ethersproject/properties" "^5.4.0" 154 | "@ethersproject/random" "^5.4.0" 155 | "@ethersproject/strings" "^5.4.0" 156 | "@ethersproject/transactions" "^5.4.0" 157 | aes-js "3.0.0" 158 | scrypt-js "3.0.1" 159 | 160 | "@ethersproject/keccak256@5.4.0", "@ethersproject/keccak256@^5.4.0": 161 | version "5.4.0" 162 | resolved "https://registry.yarnpkg.com/@ethersproject/keccak256/-/keccak256-5.4.0.tgz#7143b8eea4976080241d2bd92e3b1f1bf7025318" 163 | integrity sha512-FBI1plWet+dPUvAzPAeHzRKiPpETQzqSUWR1wXJGHVWi4i8bOSrpC3NwpkPjgeXG7MnugVc1B42VbfnQikyC/A== 164 | dependencies: 165 | "@ethersproject/bytes" "^5.4.0" 166 | js-sha3 "0.5.7" 167 | 168 | "@ethersproject/logger@5.4.1", "@ethersproject/logger@^5.4.0": 169 | version "5.4.1" 170 | resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.4.1.tgz#503bd33683538b923c578c07d1c2c0dd18672054" 171 | integrity sha512-DZ+bRinnYLPw1yAC64oRl0QyVZj43QeHIhVKfD/+YwSz4wsv1pfwb5SOFjz+r710YEWzU6LrhuSjpSO+6PeE4A== 172 | 173 | "@ethersproject/networks@5.4.2", "@ethersproject/networks@^5.4.0": 174 | version "5.4.2" 175 | resolved "https://registry.yarnpkg.com/@ethersproject/networks/-/networks-5.4.2.tgz#2247d977626e97e2c3b8ee73cd2457babde0ce35" 176 | integrity sha512-eekOhvJyBnuibfJnhtK46b8HimBc5+4gqpvd1/H9LEl7Q7/qhsIhM81dI9Fcnjpk3jB1aTy6bj0hz3cifhNeYw== 177 | dependencies: 178 | "@ethersproject/logger" "^5.4.0" 179 | 180 | "@ethersproject/pbkdf2@5.4.0", "@ethersproject/pbkdf2@^5.4.0": 181 | version "5.4.0" 182 | resolved "https://registry.yarnpkg.com/@ethersproject/pbkdf2/-/pbkdf2-5.4.0.tgz#ed88782a67fda1594c22d60d0ca911a9d669641c" 183 | integrity sha512-x94aIv6tiA04g6BnazZSLoRXqyusawRyZWlUhKip2jvoLpzJuLb//KtMM6PEovE47pMbW+Qe1uw+68ameJjB7g== 184 | dependencies: 185 | "@ethersproject/bytes" "^5.4.0" 186 | "@ethersproject/sha2" "^5.4.0" 187 | 188 | "@ethersproject/properties@5.4.1", "@ethersproject/properties@^5.4.0": 189 | version "5.4.1" 190 | resolved "https://registry.yarnpkg.com/@ethersproject/properties/-/properties-5.4.1.tgz#9f051f976ce790142c6261ccb7b826eaae1f2f36" 191 | integrity sha512-cyCGlF8wWlIZyizsj2PpbJ9I7rIlUAfnHYwy/T90pdkSn/NFTa5YWZx2wTJBe9V7dD65dcrrEMisCRUJiq6n3w== 192 | dependencies: 193 | "@ethersproject/logger" "^5.4.0" 194 | 195 | "@ethersproject/providers@5.4.5": 196 | version "5.4.5" 197 | resolved "https://registry.yarnpkg.com/@ethersproject/providers/-/providers-5.4.5.tgz#eb2ea2a743a8115f79604a8157233a3a2c832928" 198 | integrity sha512-1GkrvkiAw3Fj28cwi1Sqm8ED1RtERtpdXmRfwIBGmqBSN5MoeRUHuwHPppMtbPayPgpFcvD7/Gdc9doO5fGYgw== 199 | dependencies: 200 | "@ethersproject/abstract-provider" "^5.4.0" 201 | "@ethersproject/abstract-signer" "^5.4.0" 202 | "@ethersproject/address" "^5.4.0" 203 | "@ethersproject/basex" "^5.4.0" 204 | "@ethersproject/bignumber" "^5.4.0" 205 | "@ethersproject/bytes" "^5.4.0" 206 | "@ethersproject/constants" "^5.4.0" 207 | "@ethersproject/hash" "^5.4.0" 208 | "@ethersproject/logger" "^5.4.0" 209 | "@ethersproject/networks" "^5.4.0" 210 | "@ethersproject/properties" "^5.4.0" 211 | "@ethersproject/random" "^5.4.0" 212 | "@ethersproject/rlp" "^5.4.0" 213 | "@ethersproject/sha2" "^5.4.0" 214 | "@ethersproject/strings" "^5.4.0" 215 | "@ethersproject/transactions" "^5.4.0" 216 | "@ethersproject/web" "^5.4.0" 217 | bech32 "1.1.4" 218 | ws "7.4.6" 219 | 220 | "@ethersproject/random@5.4.0", "@ethersproject/random@^5.4.0": 221 | version "5.4.0" 222 | resolved "https://registry.yarnpkg.com/@ethersproject/random/-/random-5.4.0.tgz#9cdde60e160d024be39cc16f8de3b9ce39191e16" 223 | integrity sha512-pnpWNQlf0VAZDEOVp1rsYQosmv2o0ITS/PecNw+mS2/btF8eYdspkN0vIXrCMtkX09EAh9bdk8GoXmFXM1eAKw== 224 | dependencies: 225 | "@ethersproject/bytes" "^5.4.0" 226 | "@ethersproject/logger" "^5.4.0" 227 | 228 | "@ethersproject/rlp@5.4.0", "@ethersproject/rlp@^5.4.0": 229 | version "5.4.0" 230 | resolved "https://registry.yarnpkg.com/@ethersproject/rlp/-/rlp-5.4.0.tgz#de61afda5ff979454e76d3b3310a6c32ad060931" 231 | integrity sha512-0I7MZKfi+T5+G8atId9QaQKHRvvasM/kqLyAH4XxBCBchAooH2EX5rL9kYZWwcm3awYV+XC7VF6nLhfeQFKVPg== 232 | dependencies: 233 | "@ethersproject/bytes" "^5.4.0" 234 | "@ethersproject/logger" "^5.4.0" 235 | 236 | "@ethersproject/sha2@5.4.0", "@ethersproject/sha2@^5.4.0": 237 | version "5.4.0" 238 | resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.4.0.tgz#c9a8db1037014cbc4e9482bd662f86c090440371" 239 | integrity sha512-siheo36r1WD7Cy+bDdE1BJ8y0bDtqXCOxRMzPa4bV1TGt/eTUUt03BHoJNB6reWJD8A30E/pdJ8WFkq+/uz4Gg== 240 | dependencies: 241 | "@ethersproject/bytes" "^5.4.0" 242 | "@ethersproject/logger" "^5.4.0" 243 | hash.js "1.1.7" 244 | 245 | "@ethersproject/signing-key@5.4.0", "@ethersproject/signing-key@^5.4.0": 246 | version "5.4.0" 247 | resolved "https://registry.yarnpkg.com/@ethersproject/signing-key/-/signing-key-5.4.0.tgz#2f05120984e81cf89a3d5f6dec5c68ee0894fbec" 248 | integrity sha512-q8POUeywx6AKg2/jX9qBYZIAmKSB4ubGXdQ88l40hmATj29JnG5pp331nAWwwxPn2Qao4JpWHNZsQN+bPiSW9A== 249 | dependencies: 250 | "@ethersproject/bytes" "^5.4.0" 251 | "@ethersproject/logger" "^5.4.0" 252 | "@ethersproject/properties" "^5.4.0" 253 | bn.js "^4.11.9" 254 | elliptic "6.5.4" 255 | hash.js "1.1.7" 256 | 257 | "@ethersproject/solidity@5.4.0": 258 | version "5.4.0" 259 | resolved "https://registry.yarnpkg.com/@ethersproject/solidity/-/solidity-5.4.0.tgz#1305e058ea02dc4891df18b33232b11a14ece9ec" 260 | integrity sha512-XFQTZ7wFSHOhHcV1DpcWj7VXECEiSrBuv7JErJvB9Uo+KfCdc3QtUZV+Vjh/AAaYgezUEKbCtE6Khjm44seevQ== 261 | dependencies: 262 | "@ethersproject/bignumber" "^5.4.0" 263 | "@ethersproject/bytes" "^5.4.0" 264 | "@ethersproject/keccak256" "^5.4.0" 265 | "@ethersproject/sha2" "^5.4.0" 266 | "@ethersproject/strings" "^5.4.0" 267 | 268 | "@ethersproject/strings@5.4.0", "@ethersproject/strings@^5.4.0": 269 | version "5.4.0" 270 | resolved "https://registry.yarnpkg.com/@ethersproject/strings/-/strings-5.4.0.tgz#fb12270132dd84b02906a8d895ae7e7fa3d07d9a" 271 | integrity sha512-k/9DkH5UGDhv7aReXLluFG5ExurwtIpUfnDNhQA29w896Dw3i4uDTz01Quaptbks1Uj9kI8wo9tmW73wcIEaWA== 272 | dependencies: 273 | "@ethersproject/bytes" "^5.4.0" 274 | "@ethersproject/constants" "^5.4.0" 275 | "@ethersproject/logger" "^5.4.0" 276 | 277 | "@ethersproject/transactions@5.4.0", "@ethersproject/transactions@^5.4.0": 278 | version "5.4.0" 279 | resolved "https://registry.yarnpkg.com/@ethersproject/transactions/-/transactions-5.4.0.tgz#a159d035179334bd92f340ce0f77e83e9e1522e0" 280 | integrity sha512-s3EjZZt7xa4BkLknJZ98QGoIza94rVjaEed0rzZ/jB9WrIuu/1+tjvYCWzVrystXtDswy7TPBeIepyXwSYa4WQ== 281 | dependencies: 282 | "@ethersproject/address" "^5.4.0" 283 | "@ethersproject/bignumber" "^5.4.0" 284 | "@ethersproject/bytes" "^5.4.0" 285 | "@ethersproject/constants" "^5.4.0" 286 | "@ethersproject/keccak256" "^5.4.0" 287 | "@ethersproject/logger" "^5.4.0" 288 | "@ethersproject/properties" "^5.4.0" 289 | "@ethersproject/rlp" "^5.4.0" 290 | "@ethersproject/signing-key" "^5.4.0" 291 | 292 | "@ethersproject/units@5.4.0": 293 | version "5.4.0" 294 | resolved "https://registry.yarnpkg.com/@ethersproject/units/-/units-5.4.0.tgz#d57477a4498b14b88b10396062c8cbbaf20c79fe" 295 | integrity sha512-Z88krX40KCp+JqPCP5oPv5p750g+uU6gopDYRTBGcDvOASh6qhiEYCRatuM/suC4S2XW9Zz90QI35MfSrTIaFg== 296 | dependencies: 297 | "@ethersproject/bignumber" "^5.4.0" 298 | "@ethersproject/constants" "^5.4.0" 299 | "@ethersproject/logger" "^5.4.0" 300 | 301 | "@ethersproject/wallet@5.4.0": 302 | version "5.4.0" 303 | resolved "https://registry.yarnpkg.com/@ethersproject/wallet/-/wallet-5.4.0.tgz#fa5b59830b42e9be56eadd45a16a2e0933ad9353" 304 | integrity sha512-wU29majLjM6AjCjpat21mPPviG+EpK7wY1+jzKD0fg3ui5fgedf2zEu1RDgpfIMsfn8fJHJuzM4zXZ2+hSHaSQ== 305 | dependencies: 306 | "@ethersproject/abstract-provider" "^5.4.0" 307 | "@ethersproject/abstract-signer" "^5.4.0" 308 | "@ethersproject/address" "^5.4.0" 309 | "@ethersproject/bignumber" "^5.4.0" 310 | "@ethersproject/bytes" "^5.4.0" 311 | "@ethersproject/hash" "^5.4.0" 312 | "@ethersproject/hdnode" "^5.4.0" 313 | "@ethersproject/json-wallets" "^5.4.0" 314 | "@ethersproject/keccak256" "^5.4.0" 315 | "@ethersproject/logger" "^5.4.0" 316 | "@ethersproject/properties" "^5.4.0" 317 | "@ethersproject/random" "^5.4.0" 318 | "@ethersproject/signing-key" "^5.4.0" 319 | "@ethersproject/transactions" "^5.4.0" 320 | "@ethersproject/wordlists" "^5.4.0" 321 | 322 | "@ethersproject/web@5.4.0", "@ethersproject/web@^5.4.0": 323 | version "5.4.0" 324 | resolved "https://registry.yarnpkg.com/@ethersproject/web/-/web-5.4.0.tgz#49fac173b96992334ed36a175538ba07a7413d1f" 325 | integrity sha512-1bUusGmcoRLYgMn6c1BLk1tOKUIFuTg8j+6N8lYlbMpDesnle+i3pGSagGNvwjaiLo4Y5gBibwctpPRmjrh4Og== 326 | dependencies: 327 | "@ethersproject/base64" "^5.4.0" 328 | "@ethersproject/bytes" "^5.4.0" 329 | "@ethersproject/logger" "^5.4.0" 330 | "@ethersproject/properties" "^5.4.0" 331 | "@ethersproject/strings" "^5.4.0" 332 | 333 | "@ethersproject/wordlists@5.4.0", "@ethersproject/wordlists@^5.4.0": 334 | version "5.4.0" 335 | resolved "https://registry.yarnpkg.com/@ethersproject/wordlists/-/wordlists-5.4.0.tgz#f34205ec3bbc9e2c49cadaee774cf0b07e7573d7" 336 | integrity sha512-FemEkf6a+EBKEPxlzeVgUaVSodU7G0Na89jqKjmWMlDB0tomoU8RlEMgUvXyqtrg8N4cwpLh8nyRnm1Nay1isA== 337 | dependencies: 338 | "@ethersproject/bytes" "^5.4.0" 339 | "@ethersproject/hash" "^5.4.0" 340 | "@ethersproject/logger" "^5.4.0" 341 | "@ethersproject/properties" "^5.4.0" 342 | "@ethersproject/strings" "^5.4.0" 343 | 344 | "@types/node-cron@^3.0.0": 345 | version "3.0.0" 346 | resolved "https://registry.yarnpkg.com/@types/node-cron/-/node-cron-3.0.0.tgz#f946cefb5c05c64f460090f6be97bd50460c8898" 347 | integrity sha512-RNBIyVwa/1v2r8/SqK8tadH2sJlFRAo5Ghac/cOcCv4Kp94m0I03UmAh9WVhCqS9ZdB84dF3x47p9aTw8E4c4A== 348 | 349 | "@types/node@*": 350 | version "16.11.0" 351 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.0.tgz#4b95f2327bacd1ef8f08d8ceda193039c5d7f52e" 352 | integrity sha512-8MLkBIYQMuhRBQzGN9875bYsOhPnf/0rgXGo66S2FemHkhbn9qtsz9ywV1iCG+vbjigE4WUNVvw37Dx+L0qsPg== 353 | 354 | "@types/webidl-conversions@*": 355 | version "6.1.1" 356 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-6.1.1.tgz#e33bc8ea812a01f63f90481c666334844b12a09e" 357 | integrity sha512-XAahCdThVuCFDQLT7R7Pk/vqeObFNL3YqRyFZg+AqAP/W1/w3xHaIxuW7WszQqTbIBOPRcItYJIou3i/mppu3Q== 358 | 359 | "@types/whatwg-url@^8.2.1": 360 | version "8.2.1" 361 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.1.tgz#f1aac222dab7c59e011663a0cb0a3117b2ef05d4" 362 | integrity sha512-2YubE1sjj5ifxievI5Ge1sckb9k/Er66HyR2c+3+I6VDUUg1TLPdYYTEbQ+DjRkS4nTxMJhgWfSfMRD2sl2EYQ== 363 | dependencies: 364 | "@types/node" "*" 365 | "@types/webidl-conversions" "*" 366 | 367 | abort-controller@^3.0.0: 368 | version "3.0.0" 369 | resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" 370 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 371 | dependencies: 372 | event-target-shim "^5.0.0" 373 | 374 | aes-js@3.0.0: 375 | version "3.0.0" 376 | resolved "https://registry.yarnpkg.com/aes-js/-/aes-js-3.0.0.tgz#e21df10ad6c2053295bcbb8dab40b09dbea87e4d" 377 | integrity sha1-4h3xCtbCBTKVvLuNq0Cwnb6ofk0= 378 | 379 | ansi-regex@^4.1.0: 380 | version "4.1.0" 381 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" 382 | integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== 383 | 384 | ansi-styles@^3.2.1: 385 | version "3.2.1" 386 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 387 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 388 | dependencies: 389 | color-convert "^1.9.0" 390 | 391 | ansi-styles@^4.1.0: 392 | version "4.3.0" 393 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 394 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 395 | dependencies: 396 | color-convert "^2.0.1" 397 | 398 | axios@^0.22.0: 399 | version "0.22.0" 400 | resolved "https://registry.yarnpkg.com/axios/-/axios-0.22.0.tgz#bf702c41fb50fbca4539589d839a077117b79b25" 401 | integrity sha512-Z0U3uhqQeg1oNcihswf4ZD57O3NrR1+ZXhxaROaWpDmsDTx7T2HNBV2ulBtie2hwJptu8UvgnJoK+BIqdzh/1w== 402 | dependencies: 403 | follow-redirects "^1.14.4" 404 | 405 | base64-js@^1.3.1: 406 | version "1.5.1" 407 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 408 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 409 | 410 | bech32@1.1.4: 411 | version "1.1.4" 412 | resolved "https://registry.yarnpkg.com/bech32/-/bech32-1.1.4.tgz#e38c9f37bf179b8eb16ae3a772b40c356d4832e9" 413 | integrity sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ== 414 | 415 | bignumber.js@^9.0.1: 416 | version "9.0.1" 417 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.1.tgz#8d7ba124c882bfd8e43260c67475518d0689e4e5" 418 | integrity sha512-IdZR9mh6ahOBv/hYGiXyVuyCetmGJhtYkqLBpTStdhEGjegpPlUawydyaF3pbIOFynJTpllEs+NP+CS9jKFLjA== 419 | 420 | bn.js@^4.11.9: 421 | version "4.12.0" 422 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 423 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 424 | 425 | brorand@^1.1.0: 426 | version "1.1.0" 427 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 428 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 429 | 430 | bson@^4.2.2, bson@^4.5.2: 431 | version "4.5.3" 432 | resolved "https://registry.yarnpkg.com/bson/-/bson-4.5.3.tgz#de3783b357a407d935510beb1fbb285fef43bb06" 433 | integrity sha512-qVX7LX79Mtj7B3NPLzCfBiCP6RAsjiV8N63DjlaVVpZW+PFoDTxQ4SeDbSpcqgE6mXksM5CAwZnXxxxn/XwC0g== 434 | dependencies: 435 | buffer "^5.6.0" 436 | 437 | buffer-alloc-unsafe@^1.1.0: 438 | version "1.1.0" 439 | resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" 440 | integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== 441 | 442 | buffer-alloc@^1.2.0: 443 | version "1.2.0" 444 | resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" 445 | integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== 446 | dependencies: 447 | buffer-alloc-unsafe "^1.1.0" 448 | buffer-fill "^1.0.0" 449 | 450 | buffer-fill@^1.0.0: 451 | version "1.0.0" 452 | resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" 453 | integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= 454 | 455 | buffer@^5.6.0: 456 | version "5.7.1" 457 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" 458 | integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== 459 | dependencies: 460 | base64-js "^1.3.1" 461 | ieee754 "^1.1.13" 462 | 463 | chalk-table@^1.0.2: 464 | version "1.0.2" 465 | resolved "https://registry.yarnpkg.com/chalk-table/-/chalk-table-1.0.2.tgz#b4038e291265d71d649319b647bda1b26e1106f9" 466 | integrity sha512-lmtmQtr/GCtbiJiiuXPE5lj0arIXJir5hSjIhye/4Uyr7oTQlP+ufPnHzUS3Bre0xS/VWbz9NfeuPnvse9BXoQ== 467 | dependencies: 468 | chalk "^2.4.2" 469 | strip-ansi "^5.2.0" 470 | 471 | chalk@^2.4.2: 472 | version "2.4.2" 473 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 474 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 475 | dependencies: 476 | ansi-styles "^3.2.1" 477 | escape-string-regexp "^1.0.5" 478 | supports-color "^5.3.0" 479 | 480 | chalk@^4.1.2: 481 | version "4.1.2" 482 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 483 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 484 | dependencies: 485 | ansi-styles "^4.1.0" 486 | supports-color "^7.1.0" 487 | 488 | color-convert@^1.9.0: 489 | version "1.9.3" 490 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 491 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 492 | dependencies: 493 | color-name "1.1.3" 494 | 495 | color-convert@^2.0.1: 496 | version "2.0.1" 497 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 498 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 499 | dependencies: 500 | color-name "~1.1.4" 501 | 502 | color-name@1.1.3: 503 | version "1.1.3" 504 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 505 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 506 | 507 | color-name@~1.1.4: 508 | version "1.1.4" 509 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 510 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 511 | 512 | debug@4.x, debug@^4.3.1: 513 | version "4.3.2" 514 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 515 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 516 | dependencies: 517 | ms "2.1.2" 518 | 519 | denque@^2.0.1: 520 | version "2.0.1" 521 | resolved "https://registry.yarnpkg.com/denque/-/denque-2.0.1.tgz#bcef4c1b80dc32efe97515744f21a4229ab8934a" 522 | integrity sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ== 523 | 524 | dotenv@^10.0.0: 525 | version "10.0.0" 526 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" 527 | integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== 528 | 529 | elliptic@6.5.4: 530 | version "6.5.4" 531 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 532 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 533 | dependencies: 534 | bn.js "^4.11.9" 535 | brorand "^1.1.0" 536 | hash.js "^1.0.0" 537 | hmac-drbg "^1.0.1" 538 | inherits "^2.0.4" 539 | minimalistic-assert "^1.0.1" 540 | minimalistic-crypto-utils "^1.0.1" 541 | 542 | escape-string-regexp@^1.0.5: 543 | version "1.0.5" 544 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 545 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 546 | 547 | ethers@^5.4.7: 548 | version "5.4.7" 549 | resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.4.7.tgz#0fd491a5da7c9793de2d6058d76b41b1e7efba8f" 550 | integrity sha512-iZc5p2nqfWK1sj8RabwsPM28cr37Bpq7ehTQ5rWExBr2Y09Sn1lDKZOED26n+TsZMye7Y6mIgQ/1cwpSD8XZew== 551 | dependencies: 552 | "@ethersproject/abi" "5.4.1" 553 | "@ethersproject/abstract-provider" "5.4.1" 554 | "@ethersproject/abstract-signer" "5.4.1" 555 | "@ethersproject/address" "5.4.0" 556 | "@ethersproject/base64" "5.4.0" 557 | "@ethersproject/basex" "5.4.0" 558 | "@ethersproject/bignumber" "5.4.2" 559 | "@ethersproject/bytes" "5.4.0" 560 | "@ethersproject/constants" "5.4.0" 561 | "@ethersproject/contracts" "5.4.1" 562 | "@ethersproject/hash" "5.4.0" 563 | "@ethersproject/hdnode" "5.4.0" 564 | "@ethersproject/json-wallets" "5.4.0" 565 | "@ethersproject/keccak256" "5.4.0" 566 | "@ethersproject/logger" "5.4.1" 567 | "@ethersproject/networks" "5.4.2" 568 | "@ethersproject/pbkdf2" "5.4.0" 569 | "@ethersproject/properties" "5.4.1" 570 | "@ethersproject/providers" "5.4.5" 571 | "@ethersproject/random" "5.4.0" 572 | "@ethersproject/rlp" "5.4.0" 573 | "@ethersproject/sha2" "5.4.0" 574 | "@ethersproject/signing-key" "5.4.0" 575 | "@ethersproject/solidity" "5.4.0" 576 | "@ethersproject/strings" "5.4.0" 577 | "@ethersproject/transactions" "5.4.0" 578 | "@ethersproject/units" "5.4.0" 579 | "@ethersproject/wallet" "5.4.0" 580 | "@ethersproject/web" "5.4.0" 581 | "@ethersproject/wordlists" "5.4.0" 582 | 583 | event-target-shim@^5.0.0: 584 | version "5.0.1" 585 | resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789" 586 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 587 | 588 | follow-redirects@^1.14.4: 589 | version "1.14.4" 590 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.14.4.tgz#838fdf48a8bbdd79e52ee51fb1c94e3ed98b9379" 591 | integrity sha512-zwGkiSXC1MUJG/qmeIFH2HBJx9u0V46QGUe3YR1fXG8bXQxq7fLj0RjLZQ5nubr9qNJUZrH+xUcwXEoXNpfS+g== 592 | 593 | has-flag@^3.0.0: 594 | version "3.0.0" 595 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 596 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 597 | 598 | has-flag@^4.0.0: 599 | version "4.0.0" 600 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 601 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 602 | 603 | hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: 604 | version "1.1.7" 605 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 606 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 607 | dependencies: 608 | inherits "^2.0.3" 609 | minimalistic-assert "^1.0.1" 610 | 611 | hmac-drbg@^1.0.1: 612 | version "1.0.1" 613 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 614 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 615 | dependencies: 616 | hash.js "^1.0.3" 617 | minimalistic-assert "^1.0.0" 618 | minimalistic-crypto-utils "^1.0.1" 619 | 620 | ieee754@^1.1.13: 621 | version "1.2.1" 622 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 623 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 624 | 625 | inherits@^2.0.3, inherits@^2.0.4: 626 | version "2.0.4" 627 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 628 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 629 | 630 | js-sha3@0.5.7: 631 | version "0.5.7" 632 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.5.7.tgz#0d4ffd8002d5333aabaf4a23eed2f6374c9f28e7" 633 | integrity sha1-DU/9gALVMzqrr0oj7tL2N0yfKOc= 634 | 635 | kareem@2.3.2: 636 | version "2.3.2" 637 | resolved "https://registry.yarnpkg.com/kareem/-/kareem-2.3.2.tgz#78c4508894985b8d38a0dc15e1a8e11078f2ca93" 638 | integrity sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ== 639 | 640 | memory-pager@^1.0.2: 641 | version "1.5.0" 642 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 643 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 644 | 645 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 646 | version "1.0.1" 647 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 648 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 649 | 650 | minimalistic-crypto-utils@^1.0.1: 651 | version "1.0.1" 652 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 653 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 654 | 655 | minimist@^1.2.5: 656 | version "1.2.5" 657 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 658 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 659 | 660 | module-alias@^2.2.2: 661 | version "2.2.2" 662 | resolved "https://registry.yarnpkg.com/module-alias/-/module-alias-2.2.2.tgz#151cdcecc24e25739ff0aa6e51e1c5716974c0e0" 663 | integrity sha512-A/78XjoX2EmNvppVWEhM2oGk3x4lLxnkEA4jTbaK97QKSDjkIoOsKQlfylt/d3kKKi596Qy3NP5XrXJ6fZIC9Q== 664 | 665 | moment-timezone@^0.5.31: 666 | version "0.5.33" 667 | resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.33.tgz#b252fd6bb57f341c9b59a5ab61a8e51a73bbd22c" 668 | integrity sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w== 669 | dependencies: 670 | moment ">= 2.9.0" 671 | 672 | "moment@>= 2.9.0": 673 | version "2.29.1" 674 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3" 675 | integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ== 676 | 677 | mongodb-connection-string-url@^2.0.0: 678 | version "2.1.0" 679 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.1.0.tgz#9c522c11c37f571fecddcb267ac4a76ef432aeb7" 680 | integrity sha512-Qf9Zw7KGiRljWvMrrUFDdVqo46KIEiDuCzvEN97rh/PcKzk2bd6n9KuzEwBwW9xo5glwx69y1mI6s+jFUD/aIQ== 681 | dependencies: 682 | "@types/whatwg-url" "^8.2.1" 683 | whatwg-url "^9.1.0" 684 | 685 | mongodb@4.1.2: 686 | version "4.1.2" 687 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-4.1.2.tgz#36ab494db3a9a827df41ccb0d9b36a94bfeae8d7" 688 | integrity sha512-pHCKDoOy1h6mVurziJmXmTMPatYWOx8pbnyFgSgshja9Y36Q+caHUzTDY6rrIy9HCSrjnbXmx3pCtvNZHmR8xg== 689 | dependencies: 690 | bson "^4.5.2" 691 | denque "^2.0.1" 692 | mongodb-connection-string-url "^2.0.0" 693 | optionalDependencies: 694 | saslprep "^1.0.3" 695 | 696 | mongoose@^6.0.9: 697 | version "6.0.11" 698 | resolved "https://registry.yarnpkg.com/mongoose/-/mongoose-6.0.11.tgz#579cda5157a58b155812974567d7a9a92b26a118" 699 | integrity sha512-ESLnGIZB15xpqAbtjL/wcx+NEmzewlNuST/Dp/md4eqirVGTuEeN+IhS4qr3D5GFhnQAGdadpGlTfrWj5Ggykw== 700 | dependencies: 701 | bson "^4.2.2" 702 | kareem "2.3.2" 703 | mongodb "4.1.2" 704 | mpath "0.8.4" 705 | mquery "4.0.0" 706 | ms "2.1.2" 707 | regexp-clone "1.0.0" 708 | sift "13.5.2" 709 | sliced "1.0.1" 710 | 711 | mpath@0.8.4: 712 | version "0.8.4" 713 | resolved "https://registry.yarnpkg.com/mpath/-/mpath-0.8.4.tgz#6b566d9581621d9e931dd3b142ed3618e7599313" 714 | integrity sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g== 715 | 716 | mquery@4.0.0: 717 | version "4.0.0" 718 | resolved "https://registry.yarnpkg.com/mquery/-/mquery-4.0.0.tgz#6c62160ad25289e99e0840907757cdfd62bde775" 719 | integrity sha512-nGjm89lHja+T/b8cybAby6H0YgA4qYC/lx6UlwvHGqvTq8bDaNeCwl1sY8uRELrNbVWJzIihxVd+vphGGn1vBw== 720 | dependencies: 721 | debug "4.x" 722 | regexp-clone "^1.0.0" 723 | sliced "1.0.1" 724 | 725 | ms@2.1.2: 726 | version "2.1.2" 727 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 728 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 729 | 730 | node-cron@^3.0.0: 731 | version "3.0.0" 732 | resolved "https://registry.yarnpkg.com/node-cron/-/node-cron-3.0.0.tgz#b33252803e430f9cd8590cf85738efa1497a9522" 733 | integrity sha512-DDwIvvuCwrNiaU7HEivFDULcaQualDv7KoNlB/UU1wPW0n1tDEmBJKhEIE6DlF2FuoOHcNbLJ8ITL2Iv/3AWmA== 734 | dependencies: 735 | moment-timezone "^0.5.31" 736 | 737 | node-fetch@^2.6.1: 738 | version "2.6.5" 739 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" 740 | integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== 741 | dependencies: 742 | whatwg-url "^5.0.0" 743 | 744 | p-timeout@^4.1.0: 745 | version "4.1.0" 746 | resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-4.1.0.tgz#788253c0452ab0ffecf18a62dff94ff1bd09ca0a" 747 | integrity sha512-+/wmHtzJuWii1sXn3HCuH/FTwGhrp4tmJTxSKJbfS+vkipci6osxXM5mY0jUiRzWKMTgUT8l7HFbeSwZAynqHw== 748 | 749 | punycode@^2.1.1: 750 | version "2.1.1" 751 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 752 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 753 | 754 | regexp-clone@1.0.0, regexp-clone@^1.0.0: 755 | version "1.0.0" 756 | resolved "https://registry.yarnpkg.com/regexp-clone/-/regexp-clone-1.0.0.tgz#222db967623277056260b992626354a04ce9bf63" 757 | integrity sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw== 758 | 759 | safe-compare@^1.1.4: 760 | version "1.1.4" 761 | resolved "https://registry.yarnpkg.com/safe-compare/-/safe-compare-1.1.4.tgz#5e0128538a82820e2e9250cd78e45da6786ba593" 762 | integrity sha512-b9wZ986HHCo/HbKrRpBJb2kqXMK9CEWIE1egeEvZsYn69ay3kdfl9nG3RyOcR+jInTDf7a86WQ1d4VJX7goSSQ== 763 | dependencies: 764 | buffer-alloc "^1.2.0" 765 | 766 | sandwich-stream@^2.0.2: 767 | version "2.0.2" 768 | resolved "https://registry.yarnpkg.com/sandwich-stream/-/sandwich-stream-2.0.2.tgz#6d1feb6cf7e9fe9fadb41513459a72c2e84000fa" 769 | integrity sha512-jLYV0DORrzY3xaz/S9ydJL6Iz7essZeAfnAavsJ+zsJGZ1MOnsS52yRjU3uF3pJa/lla7+wisp//fxOwOH8SKQ== 770 | 771 | saslprep@^1.0.3: 772 | version "1.0.3" 773 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 774 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 775 | dependencies: 776 | sparse-bitfield "^3.0.3" 777 | 778 | scrypt-js@3.0.1: 779 | version "3.0.1" 780 | resolved "https://registry.yarnpkg.com/scrypt-js/-/scrypt-js-3.0.1.tgz#d314a57c2aef69d1ad98a138a21fe9eafa9ee312" 781 | integrity sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA== 782 | 783 | sift@13.5.2: 784 | version "13.5.2" 785 | resolved "https://registry.yarnpkg.com/sift/-/sift-13.5.2.tgz#24a715e13c617b086166cd04917d204a591c9da6" 786 | integrity sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA== 787 | 788 | sliced@1.0.1: 789 | version "1.0.1" 790 | resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" 791 | integrity sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E= 792 | 793 | sparse-bitfield@^3.0.3: 794 | version "3.0.3" 795 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 796 | integrity sha1-/0rm5oZWBWuks+eSqzM004JzyhE= 797 | dependencies: 798 | memory-pager "^1.0.2" 799 | 800 | strip-ansi@^5.2.0: 801 | version "5.2.0" 802 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" 803 | integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== 804 | dependencies: 805 | ansi-regex "^4.1.0" 806 | 807 | supports-color@^5.3.0: 808 | version "5.5.0" 809 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 810 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 811 | dependencies: 812 | has-flag "^3.0.0" 813 | 814 | supports-color@^7.1.0: 815 | version "7.2.0" 816 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 817 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 818 | dependencies: 819 | has-flag "^4.0.0" 820 | 821 | telegraf@^4.4.2: 822 | version "4.4.2" 823 | resolved "https://registry.yarnpkg.com/telegraf/-/telegraf-4.4.2.tgz#dd1b99a50593de303c8f47bbe98201a93a125f31" 824 | integrity sha512-OGt9w1LbxYUOsRk3htAavBnL9hqWycmJNiOmS74oARzxKFnYS/MdwW8b5CX9VLCJt537AXkm8/eBNiEYD8E7lQ== 825 | dependencies: 826 | abort-controller "^3.0.0" 827 | debug "^4.3.1" 828 | minimist "^1.2.5" 829 | module-alias "^2.2.2" 830 | node-fetch "^2.6.1" 831 | p-timeout "^4.1.0" 832 | safe-compare "^1.1.4" 833 | sandwich-stream "^2.0.2" 834 | typegram "^3.4.2" 835 | 836 | tr46@^2.1.0: 837 | version "2.1.0" 838 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.1.0.tgz#fa87aa81ca5d5941da8cbf1f9b749dc969a4e240" 839 | integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== 840 | dependencies: 841 | punycode "^2.1.1" 842 | 843 | tr46@~0.0.3: 844 | version "0.0.3" 845 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 846 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 847 | 848 | typegram@^3.4.2: 849 | version "3.4.3" 850 | resolved "https://registry.yarnpkg.com/typegram/-/typegram-3.4.3.tgz#a1e212beaf6b43079a3774457b40d6eab1a93acf" 851 | integrity sha512-pH0TQJzCWM2+7y6yiBoQVNt7PO9ZvAu/lQukVx4sm68FIBBZEBWI+2MzuMcdbwrD5mD5NrEMAyml9N6DupUZag== 852 | 853 | webidl-conversions@^3.0.0: 854 | version "3.0.1" 855 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 856 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 857 | 858 | webidl-conversions@^6.1.0: 859 | version "6.1.0" 860 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" 861 | integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== 862 | 863 | whatwg-url@^5.0.0: 864 | version "5.0.0" 865 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 866 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 867 | dependencies: 868 | tr46 "~0.0.3" 869 | webidl-conversions "^3.0.0" 870 | 871 | whatwg-url@^9.1.0: 872 | version "9.1.0" 873 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-9.1.0.tgz#1b112cf237d72cd64fa7882b9c3f6234a1c3050d" 874 | integrity sha512-CQ0UcrPHyomtlOCot1TL77WyMIm/bCwrJ2D6AOKGwEczU9EpyoqAokfqrf/MioU9kHcMsmJZcg1egXix2KYEsA== 875 | dependencies: 876 | tr46 "^2.1.0" 877 | webidl-conversions "^6.1.0" 878 | 879 | ws@7.4.6: 880 | version "7.4.6" 881 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.6.tgz#5654ca8ecdeee47c33a9a4bf6d28e2be2980377c" 882 | integrity sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A== 883 | --------------------------------------------------------------------------------