diff --git a/README.md b/README.md
index 713748513..fb1076513 100644
--- a/README.md
+++ b/README.md
@@ -19,9 +19,11 @@ Token repository [https://github.com/trustwallet/assets](https://github.com/trus
4. [coins](https://github.com/satoshilabs/slips/blob/master/slip-0044.md) integrated in [Wallet Core](https://developer.trustwallet.com/wallet-core)
-5. dApp images available in `Browser` section in Trust Wallet and at https://dapps.trustwallet.com. [Folder for upload](https://github.com/trustwallet/assets/tree/master/dapps)
+5. dApp images available in `Browser` section in Trust Wallet and at https://dapps.trustwallet.com and bookmarks icons. [read requirments](#dApp-image-naming-requirments)
-6. Coming soon: token info, token price, blacklisted and whitelisted tokens (mostly scam/spam ones)
+6. Staking validators info avalible on [Trust Wallet Staking Platform](https://github.com/trustwallet/developer/blob/master/platform/staking.md)
+
+7. Coming soon: token info, token price, blacklisted and whitelisted tokens (mostly scam/spam ones)
@@ -38,6 +40,13 @@ Token repository [https://github.com/trustwallet/assets](https://github.com/trus
- background: preferably transparent
- use simple drag and drop online service [tinypng](https://tinypng.com/) to optimize image size
+## dApp image naming requirments
+- [Folder for upload](https://github.com/trustwallet/assets/tree/master/dapps)
+- `..png` e.g:
+ https://app.compound.finance/ => `app.compound.finance.png`
+ https://kyberswap.com/ => `kyberswap.com.png`
+
+
## Repository structure
`blockchains` folder contains many subfolders and represents chains e.g. `ethereum`, `binance` ...
diff --git a/test/index.js b/test/index.js
index 4bbacaf8b..91249636b 100644
--- a/test/index.js
+++ b/test/index.js
@@ -1,13 +1,16 @@
const fs = require('fs')
const axios = require('axios')
const path = require('path')
+const assert = require('assert')
const pngExp = /\.png$/
-const upperCaseExp = /[A-F]/
+const uppercaseExp = /[A-F]/
-const isAddress = address => /^(0x)?[0-9a-f]{40}$/i.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)
+const isEthereumAddress = address => /^(0x)?[0-9a-f]{40}$/i.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)
const isFilePng = name => pngExp.test(name)
const readDirSync = path => fs.readdirSync(path)
+const isLowerCase = str => str.toLowerCase() === str
+const blockchainsFolderPath = './blockchains'
checkRootDir()
function checkRootDir () {
@@ -17,7 +20,7 @@ function checkRootDir () {
}
})
- if(fs.existsSync("./images")) {
+ if(isPathExistsSync(`./images`)) {
exitWithMsg(`Adding to ./image folder is restricted, please update your fork`)
}
}
@@ -26,7 +29,8 @@ checkBlockhainsFolder()
function checkBlockhainsFolder(){
const currentBlockchains = 59
- const foundBlockchains = readDirSync('./blockchains')
+
+ const foundBlockchains = readDirSync(blockchainsFolderPath)
if (foundBlockchains.length !== currentBlockchains) {
exitWithMsg(`Expected amount of chains in "./blockchains" = ${currentBlockchains}, found ${foundBlockchains.length}. Add tests for new folder`)
@@ -42,17 +46,17 @@ function checkBlockhainsFolder(){
const assets = readDirSync(assetsPath)
assets.forEach(asset => {
- if (upperCaseExp.test(asset)) {
+ if (uppercaseExp.test(asset)) {
exitWithMsg(`${asset} folder must be in lowercase`)
}
- if (!isAddress(asset)) {
+ if (!isEthereumAddress(asset)) {
exitWithMsg(`Invalid asset naming "${assetsPath}"`)
}
// Check if asset folder contains logo.png image
const assetLogoPath = `${assetsPath}/${asset}/logo.png`
- if (!fs.existsSync(assetLogoPath)) {
+ if (!isPathExistsSync(assetLogoPath)) {
exitWithMsg(`${assetLogoPath} mush have logo.png`)
}
})
@@ -66,18 +70,25 @@ function checkBlockhainsFolder(){
checkTron()
}
+ // Check staking supported chains
+ const stakingChains = ["cosmos"]
+ if (stakingChains.indexOf(folder) !== -1) {
+ const folderPath = `${blockchainsFolderPath}/${folder}`
+ checkValidatorsFolder(folderPath)
+ }
+
console.log(`Folder ${folder} passed all checks`)
})
}
function commonChainCheck(folder) {
- if (upperCaseExp.test(folder)) {
+ if (uppercaseExp.test(folder)) {
exitWithMsg(`"${folder}" must be in lowercase register`)
}
const pathToInfo = path.join(__dirname, '..', `blockchains/${folder}/info/logo.png`)
- if (!fs.existsSync(pathToInfo)) {
+ if (!isPathExistsSync(pathToInfo)) {
exitWithMsg(`Can't find coin image inside "${pathToInfo}"`)
}
}
@@ -88,7 +99,7 @@ async function checkBinance() {
const assets = readDirSync(path)
assets.forEach(asset => {
- if (upperCaseExp.test(asset)) {
+ if (uppercaseExp.test(asset)) {
exitWithMsg(`${asset} folder must be in lowercase`)
}
@@ -97,7 +108,7 @@ async function checkBinance() {
}
const assetLogoPath = `${path}/${asset}/logo.png`
- if (!fs.existsSync(assetLogoPath)) {
+ if (!isPathExistsSync(assetLogoPath)) {
exitWithMsg(`Path ${assetLogoPath} mush have logo.png`)
}
})
@@ -113,16 +124,67 @@ function checkTron() {
}
const assetLogoPath = `${path}/${asset}/logo.png`
- if (!fs.existsSync(assetLogoPath)) {
+ if (!isPathExistsSync(assetLogoPath)) {
exitWithMsg(`Path ${assetLogoPath} mush have logo.png`)
}
})
}
-async function getBinanceTokenSymbols() {
- return axios.get(`https://dex-atlantic.binance.org/api/v1/tokens?limit=1000`).then(res => {
- return res.data.map(token => token.symbol)
+function checkValidatorsFolder(networkPath) {
+ const validatorsFolderPath = `${networkPath}/validators`
+
+ if (!isPathExistsSync(validatorsFolderPath)) {
+ exitWithMsg(`Validators folder doesn't exists at path ${networkPath}`)
+ }
+
+ const validatorsAssetsFolderPath = validatorsFolderPath + `/assets`
+ if (!isPathExistsSync(validatorsAssetsFolderPath)) {
+ exitWithMsg(`Validators assets folder doesn't exists at path ${validatorsAssetsFolderPath}`)
+ }
+
+ readDirSync(validatorsAssetsFolderPath).forEach(address => {
+ testCosmosAddress(address)
+
+ const validatoAssetLogo = `${validatorsAssetsFolderPath}/${address}/logo.png`
+ if (!isPathExistsSync(validatoAssetLogo)) {
+ exitWithMsg(`Path ${validatoAssetLogo} mush have logo.png`)
+ }
})
+
+ fs.readFile(validatorsFolderPath + `/list.json`, (err, data) => {
+ if (err) throw err
+ const validators = JSON.parse(data)
+
+ validators.forEach(validator => {
+ const keys = Object.keys(validator)
+ if (keys.length !== 4) {
+ exitWithMsg(`Add test for new validator object key: ${keys.length}`)
+ }
+
+ keys.forEach(key => {
+ const keyType = typeof key
+ if (keyType !== "string") {
+ exitWithMsg(`Key ${key} must be "string" type, actual ${keyType}`)
+ }
+ })
+ })
+
+ })
+
+}
+
+function testCosmosAddress(address) {
+ if (!isLowerCase(address)) {
+ exitWithMsg(`${address} folder must be in lowercase`)
+ }
+}
+
+function isPathExistsSync(path) {
+ return fs.existsSync(path)
+}
+
+async function getBinanceTokenSymbols() {
+ return axios.get(`https://dex-atlantic.binance.org/api/v1/tokens?limit=1000`).then(res => res.data.map(token => token.symbol))
}
function exitWithMsg (msg) {