├── .env.example ├── .gitignore ├── README.md ├── exports └── ordi.json ├── indexers ├── brc20.js └── inscription.js ├── package.json ├── scripts ├── export.js ├── stats.js └── valid.js └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | DB_URI= 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # TypeScript v1 declaration files 45 | typings/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | 78 | # Next.js build output 79 | .next 80 | 81 | # Nuxt.js build / generate output 82 | .nuxt 83 | dist 84 | 85 | # Gatsby files 86 | .cache/ 87 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 88 | # https://nextjs.org/blog/next-9-1#public-directory-support 89 | # public 90 | 91 | # vuepress build output 92 | .vuepress/dist 93 | 94 | # Serverless directories 95 | .serverless/ 96 | 97 | # FuseBox cache 98 | .fusebox/ 99 | 100 | # DynamoDB Local files 101 | .dynamodb/ 102 | 103 | # TernJS port file 104 | .tern-port 105 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BRC20 Indexer 2 | 3 | # Project Setup Guide 4 | 5 | This guide will walk you through setting up the environment for a Node.js project that connects to a MongoDB database, fetches data from the Ordinals Wallet API, and generates various statistics related to valid inscriptions of a specified brc-20 tick. 6 | 7 | ## Prerequisites 8 | 9 | - Node.js and npm installed 10 | - MongoDB instance (local or cloud-hosted) 11 | 12 | ## Setup 13 | 14 | 1. **Install dependencies**: Run `npm install` to install the required packages. 15 | 16 | 2. **Create a .env file**: Create a .env file in your project root directory. The code uses the dotenv package to load environment variables from this file. 17 | 18 | 3. **Set the DB_URI environment variable**: In the ``.env`` file, define the `DB_URI` environment variable. The value should be the connection string for your MongoDB instance. 19 | 20 | For a local MongoDB instance: 21 | ``` 22 | DB_URI=mongodb://localhost:27017/your-db-name 23 | ``` 24 | 25 | For MongoDB Atlas, obtain the connection string from the Atlas dashboard. 26 | 4. **Fetch and index inscriptions**: Run the following commands in order to fetch and index inscriptions from the Ordinals Wallet API: 27 | bash 28 | ``` 29 | node indexers/inscriptions.js 30 | node indexers/brc20.js 31 | ``` 32 | 5. **Generate statistics**: Run the scripts/stats.js script to generate and display the desired information: 33 | 34 | ``` 35 | node scripts/stats.js your-tick-value 36 | ``` 37 | 6. **Export data**: Run the provided export script to export the data: 38 | 39 | ``` 40 | node scripts/export.js your-tick-value 41 | ``` 42 | Replace your-tick-value and your-export-script-file.js with the appropriate tick value and export script filename, respectively. 43 | 44 |
**Note**: MongoDB creates collections automatically when you insert data, so you don't need to create any collections beforehand. Ensure your .env file contains the correct DB_URI for connecting to your MongoDB instance. 45 | -------------------------------------------------------------------------------- /indexers/brc20.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const { MongoClient } = require("mongodb"); 3 | const _ = require("underscore"); 4 | 5 | require("dotenv").config(); 6 | 7 | const client = new MongoClient(process.env.DB_URI); 8 | const FIRST_INSCRIPTION_NUM = 348020; // $ordi deploy 9 | const ORD_URL = "https://turbo.ordinalswallet.com"; 10 | 11 | const fetchContent = async (id) => { 12 | const res = await axios.get(`${ORD_URL}/inscription/content/${id}`); 13 | return res.data; 14 | }; 15 | 16 | const fetchMetadata = async (id) => { 17 | const res = await axios.get(`${ORD_URL}/inscription/${id}`); 18 | return res.data; 19 | }; 20 | 21 | const index = async () => { 22 | const database = client.db("ordinals"); 23 | const inscriptions = database.collection("inscriptions"); 24 | 25 | const cursor = await inscriptions.find({ 26 | brc20: { $exists: false }, 27 | content_type: { $in: ["text/plain;charset=utf-8", "application/json"] }, 28 | num: { $gte: FIRST_INSCRIPTION_NUM }, 29 | }); 30 | const data = await cursor.toArray(); 31 | 32 | for (const item of data) { 33 | console.log("Updating database for item:"); 34 | console.log(item); 35 | 36 | const content = await fetchContent(item.id); 37 | const metadata = await fetchMetadata(item.id); 38 | 39 | let brc20 = false; 40 | 41 | if (typeof content === "object" && content.p === "brc-20") { 42 | brc20 = true; 43 | 44 | if (content.op === "transfer" || content.op === "mint") { 45 | content.amount = parseInt(content.amt, 10); 46 | } 47 | } 48 | await inscriptions.updateOne( 49 | { _id: item._id }, 50 | { $set: { content, metadata, brc20 } } 51 | ); 52 | } 53 | 54 | process.exit(); 55 | }; 56 | 57 | index(); 58 | -------------------------------------------------------------------------------- /indexers/inscription.js: -------------------------------------------------------------------------------- 1 | const axios = require("axios"); 2 | const { MongoClient } = require("mongodb"); 3 | 4 | require("dotenv").config(); 5 | 6 | const client = new MongoClient(process.env.DB_URI); 7 | const ORD_URL = "https://turbo.ordinalswallet.com"; 8 | 9 | const fetchInscriptions = async (offset) => { 10 | console.log(`Fethcing inscription list with offset: ${offset}...`); 11 | const res = await axios.get(`${ORD_URL}/inscriptions`, { 12 | params: { 13 | offset, 14 | }, 15 | }); 16 | return res.data; 17 | }; 18 | 19 | const index = async () => { 20 | let offset = 0; 21 | 22 | while (true) { 23 | const data = await fetchInscriptions(offset); 24 | if (data.length == 0) { 25 | break; 26 | } 27 | offset += data.length; 28 | 29 | try { 30 | const database = client.db("ordinals"); 31 | const inscriptions = database.collection("inscriptions"); 32 | const result = await inscriptions.insertMany(data, { ordered: false }); 33 | } catch (e) { 34 | if (e.name === "MongoBulkWriteError") { 35 | break; 36 | } 37 | throw e; 38 | } 39 | } 40 | 41 | await client.close(); 42 | process.exit(); 43 | }; 44 | 45 | index(); 46 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "brc20_indexer", 3 | "version": "1.0.0", 4 | "main": "index.js", 5 | "repository": "git@github.com:Next-DAO/brc20_indexer.git", 6 | "author": "shep.eth ", 7 | "license": "MIT", 8 | "dependencies": { 9 | "axios": "^1.3.4", 10 | "dotenv": "^16.0.3", 11 | "mongodb": "^5.1.0", 12 | "underscore": "^1.13.6" 13 | }, 14 | "scripts": { 15 | "export": "node scripts/export.js", 16 | "stats": "node scripts/stats.js" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /scripts/export.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const { MongoClient } = require("mongodb"); 3 | const { getValidInscriptions } = require("./valid.js"); 4 | 5 | require("dotenv").config(); 6 | 7 | const client = new MongoClient(process.env.DB_URI); 8 | 9 | const exportBRC20 = async (tick) => { 10 | const validInsctipitons = await getValidInscriptions(client, tick); 11 | const exportData = validInsctipitons.map((item) => ({ 12 | inscriptionID: item.id, 13 | inscriptionNumber: item.num, 14 | currentSupply: item.currentSupply, 15 | created: item.metadata.created, 16 | genesisHeight: item.metadata.genesis_height, 17 | validAmount: item.validAmount, 18 | })); 19 | 20 | fs.writeFileSync( 21 | `./exports/${tick}.json`, 22 | JSON.stringify(exportData, null, 4) 23 | ); 24 | 25 | process.exit(); 26 | }; 27 | 28 | const args = process.argv; 29 | if (args.length <= 2) { 30 | throw new Error("brc-20 tick not specified!"); 31 | } 32 | 33 | const tick = args[2]; 34 | 35 | exportBRC20(tick.trim().toLowerCase()); 36 | -------------------------------------------------------------------------------- /scripts/stats.js: -------------------------------------------------------------------------------- 1 | const fs = require("fs"); 2 | const _ = require("underscore"); 3 | const { MongoClient } = require("mongodb"); 4 | const { getValidInscriptions } = require("./valid.js"); 5 | 6 | require("dotenv").config(); 7 | 8 | const client = new MongoClient(process.env.DB_URI); 9 | 10 | const stats = async (tick) => { 11 | const validInsctipitons = await getValidInscriptions(client, tick); 12 | const content = validInsctipitons.map((i) => ({ 13 | validAmount: i.validAmount, 14 | })); 15 | const first = validInsctipitons[0]; 16 | const last = validInsctipitons.slice(-1)[0]; 17 | 18 | console.log(`Total valid $${tick} mint inscriptions: ${content.length}`); 19 | console.log( 20 | `First valid $${tick} mint inscription: ${first.id} (Inscription #${first.num})` 21 | ); 22 | console.log( 23 | `Last valid $${tick} mint inscription: ${last.id} (inscription #${last.num})` 24 | ); 25 | console.log(`Valid mint inscriptions range: [${first.num}, ${last.num}]`); 26 | 27 | const counts = _.countBy(content, "validAmount"); 28 | const list = _.map(counts, (count, key) => ({ 29 | validAmount: key, 30 | Count: count, 31 | })); 32 | const sorted = _.sortBy(list, "Count").reverse(); 33 | 34 | console.log("Valid amount distribution:"); 35 | console.table(sorted); 36 | 37 | process.exit(); 38 | }; 39 | 40 | const args = process.argv; 41 | if (args.length <= 2) { 42 | throw new Error("brc-20 tick not specified!"); 43 | } 44 | 45 | const tick = args[2]; 46 | 47 | stats(tick.trim().toLowerCase()); 48 | -------------------------------------------------------------------------------- /scripts/valid.js: -------------------------------------------------------------------------------- 1 | const getValidInscriptions = async (client, tick) => { 2 | const database = client.db("ordinals"); 3 | const inscriptions = database.collection("inscriptions"); 4 | 5 | const deployInsciptions = await inscriptions 6 | .find({ brc20: true, "content.tick": tick, "content.op": "deploy" }) 7 | .sort({ num: 1 }) 8 | .limit(1); 9 | const deployments = await deployInsciptions.toArray(); 10 | const deployment = deployments[0]; 11 | 12 | const maxSupply = parseInt(deployment.content.max, 10); 13 | 14 | const cursor = await inscriptions 15 | .find({ 16 | brc20: true, 17 | num: { $gt: deployment.num }, 18 | "content.tick": tick, 19 | "content.op": "mint", 20 | "content.amount": { $lte: parseInt(deployment.content.lim, 10) }, 21 | }) 22 | .collation({ locale: "en", strength: 2 }) 23 | .sort({ num: 1 }); 24 | const data = await cursor.toArray(); 25 | 26 | let currentSupply = 0; 27 | const validInsctipitons = []; 28 | 29 | for (const item of data) { 30 | let validAmount = item.content.amount; 31 | 32 | currentSupply += validAmount; 33 | 34 | // stop when supply exceeded limit for the first time 35 | // but keep the last inscription as valid 36 | if (currentSupply >= maxSupply) { 37 | validAmount = maxSupply - (currentSupply - validAmount); 38 | currentSupply = maxSupply; 39 | 40 | validInsctipitons.push({ 41 | ...item, 42 | currentSupply, 43 | validAmount, 44 | }); 45 | break; 46 | } 47 | 48 | validInsctipitons.push({ ...item, currentSupply, validAmount }); 49 | } 50 | return validInsctipitons; 51 | }; 52 | 53 | module.exports = { getValidInscriptions }; 54 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/node@*": 6 | version "18.15.0" 7 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.0.tgz#286a65e3fdffd691e170541e6ecb0410b16a38be" 8 | integrity sha512-z6nr0TTEOBGkzLGmbypWOGnpSpSIBorEhC4L+4HeQ2iezKCi4f77kyslRwvHeNitymGQ+oFyIWGP96l/DPSV9w== 9 | 10 | "@types/webidl-conversions@*": 11 | version "7.0.0" 12 | resolved "https://registry.yarnpkg.com/@types/webidl-conversions/-/webidl-conversions-7.0.0.tgz#2b8e60e33906459219aa587e9d1a612ae994cfe7" 13 | integrity sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog== 14 | 15 | "@types/whatwg-url@^8.2.1": 16 | version "8.2.2" 17 | resolved "https://registry.yarnpkg.com/@types/whatwg-url/-/whatwg-url-8.2.2.tgz#749d5b3873e845897ada99be4448041d4cc39e63" 18 | integrity sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA== 19 | dependencies: 20 | "@types/node" "*" 21 | "@types/webidl-conversions" "*" 22 | 23 | asynckit@^0.4.0: 24 | version "0.4.0" 25 | resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" 26 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 27 | 28 | axios@^1.3.4: 29 | version "1.3.4" 30 | resolved "https://registry.yarnpkg.com/axios/-/axios-1.3.4.tgz#f5760cefd9cfb51fd2481acf88c05f67c4523024" 31 | integrity sha512-toYm+Bsyl6VC5wSkfkbbNB6ROv7KY93PEBBL6xyDczaIHasAiv4wPqQ/c4RjoQzipxRD2W5g21cOqQulZ7rHwQ== 32 | dependencies: 33 | follow-redirects "^1.15.0" 34 | form-data "^4.0.0" 35 | proxy-from-env "^1.1.0" 36 | 37 | bson@^5.0.1: 38 | version "5.0.1" 39 | resolved "https://registry.yarnpkg.com/bson/-/bson-5.0.1.tgz#4cd3eeeabf6652ef0d6ab600f9a18212d39baac3" 40 | integrity sha512-y09gBGusgHtinMon/GVbv1J6FrXhnr/+6hqLlSmEFzkz6PodqF6TxjyvfvY3AfO+oG1mgUtbC86xSbOlwvM62Q== 41 | 42 | combined-stream@^1.0.8: 43 | version "1.0.8" 44 | resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" 45 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 46 | dependencies: 47 | delayed-stream "~1.0.0" 48 | 49 | delayed-stream@~1.0.0: 50 | version "1.0.0" 51 | resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" 52 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 53 | 54 | dotenv@^16.0.3: 55 | version "16.0.3" 56 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.0.3.tgz#115aec42bac5053db3c456db30cc243a5a836a07" 57 | integrity sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ== 58 | 59 | follow-redirects@^1.15.0: 60 | version "1.15.2" 61 | resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" 62 | integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== 63 | 64 | form-data@^4.0.0: 65 | version "4.0.0" 66 | resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" 67 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 68 | dependencies: 69 | asynckit "^0.4.0" 70 | combined-stream "^1.0.8" 71 | mime-types "^2.1.12" 72 | 73 | ip@^2.0.0: 74 | version "2.0.0" 75 | resolved "https://registry.yarnpkg.com/ip/-/ip-2.0.0.tgz#4cf4ab182fee2314c75ede1276f8c80b479936da" 76 | integrity sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ== 77 | 78 | memory-pager@^1.0.2: 79 | version "1.5.0" 80 | resolved "https://registry.yarnpkg.com/memory-pager/-/memory-pager-1.5.0.tgz#d8751655d22d384682741c972f2c3d6dfa3e66b5" 81 | integrity sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg== 82 | 83 | mime-db@1.52.0: 84 | version "1.52.0" 85 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" 86 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 87 | 88 | mime-types@^2.1.12: 89 | version "2.1.35" 90 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" 91 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 92 | dependencies: 93 | mime-db "1.52.0" 94 | 95 | mongodb-connection-string-url@^2.6.0: 96 | version "2.6.0" 97 | resolved "https://registry.yarnpkg.com/mongodb-connection-string-url/-/mongodb-connection-string-url-2.6.0.tgz#57901bf352372abdde812c81be47b75c6b2ec5cf" 98 | integrity sha512-WvTZlI9ab0QYtTYnuMLgobULWhokRjtC7db9LtcVfJ+Hsnyr5eo6ZtNAt3Ly24XZScGMelOcGtm7lSn0332tPQ== 99 | dependencies: 100 | "@types/whatwg-url" "^8.2.1" 101 | whatwg-url "^11.0.0" 102 | 103 | mongodb@^5.1.0: 104 | version "5.1.0" 105 | resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-5.1.0.tgz#e551f9e496777bde9173e51d16c163ab2c805b9d" 106 | integrity sha512-qgKb7y+EI90y4weY3z5+lIgm8wmexbonz0GalHkSElQXVKtRuwqXuhXKccyvIjXCJVy9qPV82zsinY0W1FBnJw== 107 | dependencies: 108 | bson "^5.0.1" 109 | mongodb-connection-string-url "^2.6.0" 110 | socks "^2.7.1" 111 | optionalDependencies: 112 | saslprep "^1.0.3" 113 | 114 | proxy-from-env@^1.1.0: 115 | version "1.1.0" 116 | resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" 117 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 118 | 119 | punycode@^2.1.1: 120 | version "2.3.0" 121 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" 122 | integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== 123 | 124 | saslprep@^1.0.3: 125 | version "1.0.3" 126 | resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226" 127 | integrity sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag== 128 | dependencies: 129 | sparse-bitfield "^3.0.3" 130 | 131 | smart-buffer@^4.2.0: 132 | version "4.2.0" 133 | resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" 134 | integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== 135 | 136 | socks@^2.7.1: 137 | version "2.7.1" 138 | resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" 139 | integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== 140 | dependencies: 141 | ip "^2.0.0" 142 | smart-buffer "^4.2.0" 143 | 144 | sparse-bitfield@^3.0.3: 145 | version "3.0.3" 146 | resolved "https://registry.yarnpkg.com/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz#ff4ae6e68656056ba4b3e792ab3334d38273ca11" 147 | integrity sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ== 148 | dependencies: 149 | memory-pager "^1.0.2" 150 | 151 | tr46@^3.0.0: 152 | version "3.0.0" 153 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-3.0.0.tgz#555c4e297a950617e8eeddef633c87d4d9d6cbf9" 154 | integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== 155 | dependencies: 156 | punycode "^2.1.1" 157 | 158 | underscore@^1.13.6: 159 | version "1.13.6" 160 | resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.13.6.tgz#04786a1f589dc6c09f761fc5f45b89e935136441" 161 | integrity sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A== 162 | 163 | webidl-conversions@^7.0.0: 164 | version "7.0.0" 165 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a" 166 | integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== 167 | 168 | whatwg-url@^11.0.0: 169 | version "11.0.0" 170 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-11.0.0.tgz#0a849eebb5faf2119b901bb76fd795c2848d4018" 171 | integrity sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ== 172 | dependencies: 173 | tr46 "^3.0.0" 174 | webidl-conversions "^7.0.0" 175 | --------------------------------------------------------------------------------