commit e5a7886b9c82792eddb42feef1495ec4ed10ff76 Author: uxname Date: Tue Jul 30 14:45:43 2024 +0300 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f0c92ad --- /dev/null +++ b/.gitignore @@ -0,0 +1,76 @@ +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets +.history/ +*.vsix +cmake-build-*/ +*.iws +out/ +atlassian-ide-plugin.xml +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json +pids +*.pid +*.seed +*.pid.lock +lib-cov +coverage +*.lcov +.nyc_output +.grunt +bower_components +.lock-wscript +build/Release +node_modules/ +jspm_packages/ +web_modules/ +*.tsbuildinfo +.npm +.eslintcache +.stylelintcache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ +.node_repl_history +*.tgz +.yarn-integrity +.env +.env.development.local +.env.test.local +.env.production.local +.env.local +.cache +.parcel-cache +.next +out +.nuxt +dist +.cache/ +.vuepress/dist +.temp +.docusaurus +.serverless/ +.fusebox/ +.dynamodb/ +.tern-port +.vscode-test +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* +.idea \ No newline at end of file diff --git a/data/0x1234567890abcdef1234567890abcdef12345678.json b/data/0x1234567890abcdef1234567890abcdef12345678.json new file mode 100644 index 0000000..a678422 --- /dev/null +++ b/data/0x1234567890abcdef1234567890abcdef12345678.json @@ -0,0 +1,16 @@ +{ + "name": "ExampleToken", + "ticker": "EXT", + "title": "Example Token Network", + "iconFileName": "0x1234567890abcdef1234567890abcdef12345678.png", + "infoURL": "https://example.com/info", + "contractAddress": "0x1234567890abcdef1234567890abcdef12345678", + "type": "fungible", + "decimals": 18, + "description": "This is an example token used for demonstrating the JSON schema validation.", + "website": "https://example.com", + "whitepaper": "https://example.com/whitepaper", + "initialSupply": 1000000, + "totalSupply": 5000000, + "maxSupply": 10000000 +} diff --git a/data/icons/0x1234567890abcdef1234567890abcdef12345678.png b/data/icons/0x1234567890abcdef1234567890abcdef12345678.png new file mode 100644 index 0000000..875c375 Binary files /dev/null and b/data/icons/0x1234567890abcdef1234567890abcdef12345678.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..97ad226 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,71 @@ +{ + "name": "token-list", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "token-list", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f624dd7 --- /dev/null +++ b/package.json @@ -0,0 +1,20 @@ +{ + "name": "token-list", + "version": "1.0.0", + "description": "Vara Network token list", + "main": "scripts/verifier.js", + "scripts": { + "start": "node scripts/verifier.js" + }, + "keywords": [ + "vara network", + "varan wallet", + "token list" + ], + "author": "uxname", + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1" + } +} diff --git a/scripts/token-schema.json b/scripts/token-schema.json new file mode 100644 index 0000000..b68cca9 --- /dev/null +++ b/scripts/token-schema.json @@ -0,0 +1,88 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "title": "Token Schema", + "description": "Schema for validating token information in a blockchain context.", + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "The name of the token." + }, + "ticker": { + "type": "string", + "description": "The short name of the token." + }, + "title": { + "type": "string", + "description": "The full name of the network or token." + }, + "iconFileName": { + "type": "string", + "description": "The icon file name for the token." + }, + "infoURL": { + "type": "string", + "format": "uri", + "description": "URL for additional information about the token." + }, + "contractAddress": { + "type": "string", + "description": "The smart contract address of the token." + }, + "type": { + "type": "string", + "enum": [ + "fungible", + "nft" + ], + "description": "The type of token (fungible or NFT)." + }, + "decimals": { + "type": "integer", + "description": "The number of decimal places." + }, + "description": { + "type": "string", + "description": "A description of the token.", + "default": "" + }, + "website": { + "type": "string", + "format": "uri", + "description": "Link to the project's website.", + "default": "" + }, + "whitepaper": { + "type": "string", + "format": "uri", + "description": "Link to the project's whitepaper.", + "default": "" + }, + "initialSupply": { + "type": "number", + "description": "The initial supply of tokens.", + "default": 0 + }, + "totalSupply": { + "type": "number", + "description": "The total supply of tokens.", + "default": 0 + }, + "maxSupply": { + "type": "number", + "description": "The maximum supply of tokens.", + "default": 0 + } + }, + "required": [ + "name", + "ticker", + "title", + "iconFileName", + "infoURL", + "contractAddress", + "type", + "decimals" + ], + "additionalProperties": false +} diff --git a/scripts/verifier.js b/scripts/verifier.js new file mode 100644 index 0000000..4604e30 --- /dev/null +++ b/scripts/verifier.js @@ -0,0 +1,45 @@ +const Ajv = require('ajv'); +const addFormats = require('ajv-formats'); +const fs = require('fs'); +const path = require('path'); + +const schema = require('./token-schema.json'); + +function validateJsonFile(filePath) { + try { + const data = JSON.parse(fs.readFileSync(filePath, 'utf8')); + const valid = validate(data); + if (valid) { + console.log(`File ${path.basename(filePath)} is valid.`); + } else { + console.log(`File ${path.basename(filePath)} is invalid:`, validate.errors); + } + } catch (error) { + console.error(`Error reading or parsing the file ${path.basename(filePath)}:`, error); + } +} + +function validateAllJsonFilesInDirectory(directoryPath) { + fs.readdir(directoryPath, (err, files) => { + if (err) { + console.error('Error reading directory:', err); + return; + } + + files.forEach(file => { + const filePath = path.join(directoryPath, file); + if (path.extname(file) === '.json') { + validateJsonFile(filePath); + } + }); + }); +} + +const ajv = new Ajv(); +addFormats(ajv); + +const validate = ajv.compile(schema); + +const dataDirectoryPath = path.resolve(process.cwd(), 'data'); + +validateAllJsonFilesInDirectory(dataDirectoryPath);