├── .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 |
--------------------------------------------------------------------------------