From 2204745e34bd3a6e6ee657efb19404dcca98fd79 Mon Sep 17 00:00:00 2001 From: Nazar <85495047+cryptomanz1@users.noreply.github.com> Date: Fri, 12 Jan 2024 13:49:54 +0200 Subject: [PATCH] Add Injective assets (#27191) * Create logo .png * Create logo.png * Create info.json * Create logo.png * Create info.json * Create info.json * Create logo.png * Create info.json * Create logo.png * Create info.json * Update info.json * Update info.json * Update info.json * Update info.json * Update info.json * Create logo.png * Delete logo .png * tokens * tokens * tokens * tokens * tokens * tokens --------- Co-authored-by: Denis <136321897+defisaur@users.noreply.github.com> --- .github/workflows/fix-dryrun.yml | 50 ++-- .github/workflows/fix.yml | 92 +++--- .golangci.yml | 1 - .../info.json | 29 ++ .../logo.png | Bin 0 -> 36884 bytes .../info.json | 21 ++ .../logo.png | Bin 0 -> 35201 bytes .../info.json | 40 +++ .../logo.png | Bin 0 -> 6382 bytes .../info.json | 37 +++ .../logo.png | Bin 0 -> 20363 bytes .../info.json | 32 +++ .../logo.png | Bin 0 -> 11636 bytes go.mod | 2 +- go.sum | 8 + internal/info/asset.go | 56 ++++ internal/info/coin.go | 47 ++++ internal/info/external/erc20.go | 35 +++ internal/info/external/external.go | 85 ++++++ internal/info/external/spl.go | 37 +++ internal/info/external/trc10.go | 38 +++ internal/info/external/trc20.go | 38 +++ internal/info/fields_validators.go | 263 ++++++++++++++++++ internal/info/model.go | 55 ++++ internal/info/values.go | 79 ++++++ internal/processor/validators.go | 2 +- 26 files changed, 975 insertions(+), 72 deletions(-) create mode 100644 blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/info.json create mode 100644 blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/logo.png create mode 100644 blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/info.json create mode 100644 blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/logo.png create mode 100644 blockchains/nativeinjective/assets/inj1q6kpxy6ar5lkxqudjvryarrrttmakwsvzkvcyh/info.json create mode 100644 blockchains/nativeinjective/assets/inj1q6kpxy6ar5lkxqudjvryarrrttmakwsvzkvcyh/logo.png create mode 100644 blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/info.json create mode 100644 blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/logo.png create mode 100644 blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/info.json create mode 100644 blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/logo.png create mode 100644 internal/info/asset.go create mode 100644 internal/info/coin.go create mode 100644 internal/info/external/erc20.go create mode 100644 internal/info/external/external.go create mode 100644 internal/info/external/spl.go create mode 100644 internal/info/external/trc10.go create mode 100644 internal/info/external/trc20.go create mode 100644 internal/info/fields_validators.go create mode 100644 internal/info/model.go create mode 100644 internal/info/values.go diff --git a/.github/workflows/fix-dryrun.yml b/.github/workflows/fix-dryrun.yml index a42ef0fbf..01ff854ca 100644 --- a/.github/workflows/fix-dryrun.yml +++ b/.github/workflows/fix-dryrun.yml @@ -1,25 +1,27 @@ -name: Fix (Dry run) -on: - pull_request: - branches: [ master ] +#Disabled, we have 'check' job, 'fix' job do invisible changes which is not convenient to debug -jobs: - fix-dryrun: - runs-on: ubuntu-latest - steps: - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: 1.18 - - - name: Check out code - uses: actions/checkout@v3 - - - name: Run fix - run: make fix - - - name: Show fix result (diff) - run: | - git config core.ignorecase false - git status - git diff +#name: Fix (Dry run) +#on: +# pull_request: +# branches: [ master ] +# +#jobs: +# fix-dryrun: +# runs-on: ubuntu-latest +# steps: +# - name: Set up Go +# uses: actions/setup-go@v4 +# with: +# go-version: 1.18 +# +# - name: Check out code +# uses: actions/checkout@v3 +# +# - name: Run fix +# run: make fix +# +# - name: Show fix result (diff) +# run: | +# git config core.ignorecase false +# git status +# git diff diff --git a/.github/workflows/fix.yml b/.github/workflows/fix.yml index 8dec678a5..3d80ad089 100644 --- a/.github/workflows/fix.yml +++ b/.github/workflows/fix.yml @@ -1,46 +1,48 @@ -name: Fix All +#Disabled, we have 'check' job, 'fix' job do invisible changes which is not convenient to debug -on: - push: - branches: - - '*' - workflow_dispatch: - -jobs: - fix-all: - runs-on: ubuntu-latest - - if: github.repository_owner == 'trustwallet' && github.event.repository.fork == false - - steps: - - name: Checkout (trustwallet repo, secret token) - uses: actions/checkout@v3 - with: - # Use trust-ci fine-grained PAT to checkout and later commit the code - # Do not use for forked repos - token: ${{ secrets.CI_GITHUB_TOKEN }} - ref: ${{ github.ref }} - - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: 1.18 - - - name: Run fix - run: make fix - - - name: Show fix result (diff) - run: | - git status - git diff - - - name: Run check - run: make check - - - name: Commit changes - if: success() - uses: stefanzweifel/git-auto-commit-action@v4.16.0 - with: - commit_user_name: trust-ci - commit_user_email: "117647528+trust-ci@users.noreply.github.com" - commit_message: Auto fix all (sanity and consistency) +#name: Fix All +# +#on: +# push: +# branches: +# - '*' +# workflow_dispatch: +# +#jobs: +# fix-all: +# runs-on: ubuntu-latest +# +# if: github.repository_owner == 'trustwallet' && github.event.repository.fork == false +# +# steps: +# - name: Checkout (trustwallet repo, secret token) +# uses: actions/checkout@v3 +# with: +# # Use trust-ci fine-grained PAT to checkout and later commit the code +# # Do not use for forked repos +# token: ${{ secrets.CI_GITHUB_TOKEN }} +# ref: ${{ github.ref }} +# +# - name: Set up Go +# uses: actions/setup-go@v4 +# with: +# go-version: 1.18 +# +# - name: Run fix +# run: make fix +# +# - name: Show fix result (diff) +# run: | +# git status +# git diff +# +# - name: Run check +# run: make check +# +# - name: Commit changes +# if: success() +# uses: stefanzweifel/git-auto-commit-action@v4.16.0 +# with: +# commit_user_name: trust-ci +# commit_user_email: "117647528+trust-ci@users.noreply.github.com" +# commit_message: Auto fix all (sanity and consistency) diff --git a/.golangci.yml b/.golangci.yml index 6633927eb..e8bdcae7d 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -192,7 +192,6 @@ linters: - deadcode - depguard - dogsled - - dupl - errcheck - exportloopref - exhaustive diff --git a/blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/info.json b/blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/info.json new file mode 100644 index 000000000..9d30b30ff --- /dev/null +++ b/blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/info.json @@ -0,0 +1,29 @@ +{ + "name": "Arbitrum", + "type": "INJECTIVE", + "symbol": "ARB", + "decimals": 8, + "website": "https://arbitrum.foundation/", + "description": "$ARB tokens can be used to vote on Arbitrum DAO governance proposals, allowing $ARB holders to collectively shape the future of Arbitrum protocols and chains. Token holders can also delegate their voting power to delegates.", + "explorer": "https://explorer.injective.network/asset/?tokenType=tokenFactory&denom=factory/inj14ejqjyq8um4p3xfqj74yld5waqljf88f9eneuk/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd", + "status": "active", + "id": "inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd", + "links": [ + { + "name": "twitter", + "url": "https://twitter.com/arbitrum" + }, + { + "name": "whitepaper", + "url": "https://docs.arbitrum.foundation/deployment-addresses" + }, + { + "name": "discord", + "url": "https://discord.com/arbitrum" + }, + { + "name": "coinmarketcap", + "url": "https://coinmarketcap.com/ru/currencies/arbitrum-iou/" + } + ] +} \ No newline at end of file diff --git a/blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/logo.png b/blockchains/nativeinjective/assets/inj1d5vz0uzwlpfvgwrwulxg6syy82axa58y4fuszd/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..5402ed6bc17ad6dcbdf911fc7a612935591c3831 GIT binary patch literal 36884 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 literal 0 HcmV?d00001 diff --git a/blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/info.json b/blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/info.json new file mode 100644 index 000000000..407407953 --- /dev/null +++ b/blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/info.json @@ -0,0 +1,21 @@ +{ + "name": "Talis", + "website": "https://injective.talis.art", + "description": "In the dynamic landscape of NFTs and cryptocurrency, platforms that offer innovative solutions and tools play a crucial role in shaping the ecosystem.", + "explorer": "https://explorer.injective.network/asset/?tokenType=tokenFactory&denom=factory/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/Talis", + "type": "INJECTIVE", + "symbol": "TALIS", + "decimals": 6, + "status": "active", + "id": "inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3", + "links": [ + { + "name": "twitter", + "url": "https://twitter.com/ProtocolTalis" + }, + { + "name": "telegram", + "url": "https://t.me/talisprotocol" + } + ] +} \ No newline at end of file diff --git a/blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/logo.png b/blockchains/nativeinjective/assets/inj1maeyvxfamtn8lfyxpjca8kuvauuf2qeu6gtxm3/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..4dc87c4c30ad26134334a7f9f5869df95dff1012 GIT binary patch literal 35201 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 literal 0 HcmV?d00001 diff --git a/blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/info.json b/blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/info.json new file mode 100644 index 000000000..5c36e623c --- /dev/null +++ b/blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/info.json @@ -0,0 +1,37 @@ +{ + "name": "USD Coin", + "website": "https://centre.io/usdc", + "description": "USDC is a fully collateralized US dollar stablecoin, an Ethereum powered coin and is the brainchild of CENTRE, an open source project bootstrapped by contributions from Circle and Coinbase.", + "explorer": "https://explorer.injective.network/asset/?tokenType=tokenFactory&denom=factory/inj14ejqjyq8um4p3xfqj74yld5waqljf88f9eneuk/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk", + "type": "INJECTIVE", + "symbol": "USDCET", + "decimals": 6, + "status": "active", + "id": "inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk", + "tags": [ + "defi", + "stablecoin" + ], + "links": [ + { + "name": "github", + "url": "https://github.com/centrehq" + }, + { + "name": "medium", + "url": "https://medium.com/centre-blog" + }, + { + "name": "whitepaper", + "url": "https://centre.io/pdfs/centre-whitepaper.pdf" + }, + { + "name": "coinmarketcap", + "url": "https://coinmarketcap.com/currencies/usd-coin/" + }, + { + "name": "coingecko", + "url": "https://coingecko.com/en/coins/usd-coin/" + } + ] +} \ No newline at end of file diff --git a/blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/logo.png b/blockchains/nativeinjective/assets/inj1q6zlut7gtkzknkk773jecujwsdkgq882akqksk/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..c4def0472868c99b99c5f7f7b6fe2b38425a5778 GIT binary patch literal 20363 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 literal 0 HcmV?d00001 diff --git a/blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/info.json b/blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/info.json new file mode 100644 index 000000000..2402cacd3 --- /dev/null +++ b/blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/info.json @@ -0,0 +1,32 @@ +{ + "name": "Solana", + "website": "https://solana.com/", + "description": "Solana is the worlds most performant blockchain in the world at 710k transactions per second. 710k TPS is achieved by encoding the passage of time as data.", + "explorer": "https://explorer.injective.network/asset/?tokenType=tokenFactory&denom=factory/inj14ejqjyq8um4p3xfqj74yld5waqljf88f9eneuk/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3", + "symbol": "SOL", + "type": "INJECTIVE", + "decimals": 8, + "status": "active", + "id": "inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3", + "tags": [ + "staking-native" + ], + "links": [ + { + "name": "github", + "url": "https://github.com/solana-labs" + }, + { + "name": "twitter", + "url": "https://twitter.com/solana" + }, + { + "name": "reddit", + "url": "https://reddit.com/solana" + }, + { + "name": "whitepaper", + "url": "https://github.com/solana-labs/whitepaper" + } + ] +} \ No newline at end of file diff --git a/blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/logo.png b/blockchains/nativeinjective/assets/inj1sthrn5ep8ls5vzz8f9gp89khhmedahhdkqa8z3/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..1d045ec77ef4db4e89c0e89d9ccc61abbeaf3c9b GIT binary patch literal 11636 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 0 { + return compErr + } + + return nil +} diff --git a/internal/info/coin.go b/internal/info/coin.go new file mode 100644 index 000000000..623ea2470 --- /dev/null +++ b/internal/info/coin.go @@ -0,0 +1,47 @@ +package info + +import ( + "github.com/trustwallet/assets-go-libs/validation" +) + +func ValidateCoin(c CoinModel, allowedTags []string) error { + if err := ValidateCoinRequiredKeys(c); err != nil { + return err + } + + // All fields validated for nil and can be safety used. + compErr := validation.NewErrComposite() + if err := ValidateCoinType(*c.Type); err != nil { + compErr.Append(err) + } + + if err := ValidateDecimals(*c.Decimals); err != nil { + compErr.Append(err) + } + + if err := ValidateStatus(*c.Status); err != nil { + compErr.Append(err) + } + + if err := ValidateTags(c.Tags, allowedTags); err != nil { + compErr.Append(err) + } + + if err := ValidateDescription(*c.Description); err != nil { + compErr.Append(err) + } + + if err := ValidateDescriptionWebsite(*c.Description, *c.Website); err != nil { + compErr.Append(err) + } + + if err := ValidateLinks(c.Links); err != nil { + compErr.Append(err) + } + + if compErr.Len() > 0 { + return compErr + } + + return nil +} diff --git a/internal/info/external/erc20.go b/internal/info/external/erc20.go new file mode 100644 index 000000000..adf5981af --- /dev/null +++ b/internal/info/external/erc20.go @@ -0,0 +1,35 @@ +package external + +import ( + "fmt" + "strconv" + + "github.com/trustwallet/assets-go-libs/http" +) + +const ethAPIURL = "https://api.ethplorer.io/getTokenInfo/%s?apiKey=freekey" + +type TokenInfoERC20 struct { + Decimals string `json:"decimals"` + HoldersCount int `json:"holdersCount"` +} + +func GetTokenInfoForERC20(tokenID string) (*TokenInfo, error) { + url := fmt.Sprintf(ethAPIURL, tokenID) + + var result TokenInfoERC20 + err := http.GetHTTPResponse(url, &result) + if err != nil { + return nil, err + } + + decimals, err := strconv.Atoi(result.Decimals) + if err != nil { + return nil, err + } + + return &TokenInfo{ + Decimals: decimals, + HoldersCount: result.HoldersCount, + }, nil +} diff --git a/internal/info/external/external.go b/internal/info/external/external.go new file mode 100644 index 000000000..727015884 --- /dev/null +++ b/internal/info/external/external.go @@ -0,0 +1,85 @@ +package external + +import ( + "fmt" + "regexp" + "strconv" + "strings" + + "github.com/trustwallet/assets-go-libs/http" +) + +var ( + holdersRegexp = regexp.MustCompile(`(\d+)\saddresses`) + decimalsRegexp = regexp.MustCompile(`(\d+)\s+<\/div>`) + symbolRegexp = regexp.MustCompile(`(\w+)<\/b>\s 1 { + symbol = match[1] + } + + match = decimalsRegexp.FindStringSubmatch(pageContent) + if len(match) > 1 { + decimals, err = strconv.Atoi(match[1]) + if err != nil { + return nil, err + } + } + + match = holdersRegexp.FindStringSubmatch(pageContent) + if len(match) > 1 { + holders, err = strconv.Atoi(match[1]) + if err != nil { + return nil, err + } + } + + return &TokenInfo{ + Symbol: symbol, + Decimals: decimals, + HoldersCount: holders, + }, nil +} diff --git a/internal/info/external/spl.go b/internal/info/external/spl.go new file mode 100644 index 000000000..a95addf68 --- /dev/null +++ b/internal/info/external/spl.go @@ -0,0 +1,37 @@ +package external + +import ( + "fmt" + + "github.com/trustwallet/assets-go-libs/http" +) + +const splAPIURL = "https://public-api.solscan.io/token/holders?tokenAddress=%s" + +type TokenInfoSPL struct { + Data []Data `json:"data"` + HoldersCount int `json:"total"` +} + +type Data struct { + Decimals int `json:"decimals"` +} + +func GetTokenInfoForSPL(tokenID string) (*TokenInfo, error) { + url := fmt.Sprintf(splAPIURL, tokenID) + + var result TokenInfoSPL + err := http.GetHTTPResponse(url, &result) + if err != nil { + return nil, err + } + + if len(result.Data) == 0 { + return nil, fmt.Errorf("failed to get token info for SPL token") + } + + return &TokenInfo{ + Decimals: result.Data[0].Decimals, + HoldersCount: result.HoldersCount, + }, nil +} diff --git a/internal/info/external/trc10.go b/internal/info/external/trc10.go new file mode 100644 index 000000000..9a585f8d2 --- /dev/null +++ b/internal/info/external/trc10.go @@ -0,0 +1,38 @@ +package external + +import ( + "errors" + "fmt" + + "github.com/trustwallet/assets-go-libs/http" +) + +const trc10APIURL = "https://apilist.tronscan.io/api/token?id=%s" + +type TRC10TokensResponse struct { + Data []struct { + Symbol string `json:"abbr"` + Decimals int `json:"precision"` + HoldersCount int `json:"nrOfTokenHolders"` + } `json:"data"` +} + +func GetTokenInfoForTRC10(tokenID string) (*TokenInfo, error) { + url := fmt.Sprintf(trc10APIURL, tokenID) + + var res TRC10TokensResponse + err := http.GetHTTPResponse(url, &res) + if err != nil { + return nil, err + } + + if len(res.Data) == 0 { + return nil, errors.New("not found") + } + + return &TokenInfo{ + Symbol: res.Data[0].Symbol, + Decimals: res.Data[0].Decimals, + HoldersCount: res.Data[0].HoldersCount, + }, nil +} diff --git a/internal/info/external/trc20.go b/internal/info/external/trc20.go new file mode 100644 index 000000000..3f4c22885 --- /dev/null +++ b/internal/info/external/trc20.go @@ -0,0 +1,38 @@ +package external + +import ( + "errors" + "fmt" + + "github.com/trustwallet/assets-go-libs/http" +) + +const trc20APIURL = "https://apilist.tronscan.io/api/token_trc20?contract=%s" + +type TRC20TokensResponse struct { + TRC20Tokens []struct { + Symbol string `json:"symbol"` + Decimals int `json:"decimals"` + HoldersCount int `json:"holders_count"` + } `json:"trc20_tokens"` +} + +func GetTokenInfoForTRC20(tokenID string) (*TokenInfo, error) { + url := fmt.Sprintf(trc20APIURL, tokenID) + + var res TRC20TokensResponse + err := http.GetHTTPResponse(url, &res) + if err != nil { + return nil, err + } + + if len(res.TRC20Tokens) == 0 { + return nil, errors.New("not found") + } + + return &TokenInfo{ + Symbol: res.TRC20Tokens[0].Symbol, + Decimals: res.TRC20Tokens[0].Decimals, + HoldersCount: res.TRC20Tokens[0].HoldersCount, + }, nil +} diff --git a/internal/info/fields_validators.go b/internal/info/fields_validators.go new file mode 100644 index 000000000..0d87b3239 --- /dev/null +++ b/internal/info/fields_validators.go @@ -0,0 +1,263 @@ +package info + +import ( + "fmt" + "strings" + + str "github.com/trustwallet/assets-go-libs/strings" + "github.com/trustwallet/assets-go-libs/validation" + "github.com/trustwallet/go-primitives/coin" + "github.com/trustwallet/go-primitives/types" +) + +// Asset info specific validators. + +func ValidateAssetRequiredKeys(a AssetModel) error { + var fields []string + if a.Name != nil && !isEmpty(*a.Name) { + fields = append(fields, "name") + } + if a.Symbol != nil && !isEmpty(*a.Symbol) { + fields = append(fields, "symbol") + } + if a.Type != nil && !isEmpty(*a.Type) { + fields = append(fields, "type") + } + if a.Decimals != nil { + fields = append(fields, "decimals") + } + if a.Description != nil && !isEmpty(*a.Description) { + fields = append(fields, "description") + } + if a.Website != nil { + fields = append(fields, "website") + } + if a.Explorer != nil && !isEmpty(*a.Explorer) { + fields = append(fields, "explorer") + } + if a.Status != nil && !isEmpty(*a.Status) { + fields = append(fields, "status") + } + if a.ID != nil && !isEmpty(*a.ID) { + fields = append(fields, "id") + } + + if len(fields) != len(requiredAssetFields) { + return fmt.Errorf("%w: %s", validation.ErrMissingField, + strings.Join(str.Difference(requiredAssetFields, fields), ", ")) + } + + return nil +} + +func ValidateAssetType(assetType string, chain coin.Coin) error { + chainFromType, err := types.GetChainFromAssetType(assetType) + if err != nil { + return fmt.Errorf("failed to get chain from asset type: %w", err) + } + + if chainFromType != chain { + return fmt.Errorf("%w: asset type field", validation.ErrInvalidField) + } + + if strings.ToUpper(assetType) != assetType { + return fmt.Errorf("%w: asset type should be ALLCAPS", validation.ErrInvalidField) + } + + return nil +} + +func ValidateAssetID(id, address string) error { + if id != address { + if !strings.EqualFold(id, address) { + return fmt.Errorf("%w: invalid id field", validation.ErrInvalidField) + } + + return fmt.Errorf("%w: invalid case for id field", validation.ErrInvalidField) + } + + return nil +} + +func ValidateAssetDecimalsAccordingType(assetType string, decimals int) error { + if assetType == "BEP2" && decimals != 8 { + return fmt.Errorf("%w: invalid decimals field, BEP2 tokens have 8 decimals", validation.ErrInvalidField) + } + + return nil +} + +// CoinModel info specific validators. + +func ValidateCoinRequiredKeys(c CoinModel) error { + var fields []string + if c.Name != nil && !isEmpty(*c.Name) { + fields = append(fields, "name") + } + if c.Symbol != nil && !isEmpty(*c.Symbol) { + fields = append(fields, "symbol") + } + if c.Type != nil && !isEmpty(*c.Type) { + fields = append(fields, "type") + } + if c.Decimals != nil { + fields = append(fields, "decimals") + } + if c.Description != nil && !isEmpty(*c.Description) { + fields = append(fields, "description") + } + if c.Website != nil && !isEmpty(*c.Website) { + fields = append(fields, "website") + } + if c.Explorer != nil && !isEmpty(*c.Explorer) { + fields = append(fields, "explorer") + } + if c.Status != nil && !isEmpty(*c.Status) { + fields = append(fields, "status") + } + + if len(fields) != len(requiredCoinFields) { + return fmt.Errorf("%w: %s", validation.ErrMissingField, + strings.Join(str.Difference(requiredCoinFields, fields), ", ")) + } + + return nil +} + +func ValidateLinks(links []Link) error { + if len(links) < 2 { + return nil + } + + for _, l := range links { + if l.Name == nil || l.URL == nil { + return fmt.Errorf("%w: missing required fields links.url and links.name", validation.ErrMissingField) + } + + if !linkNameAllowed(*l.Name) { + return fmt.Errorf("invalid value for links.name filed, allowed only: %s", + strings.Join(supportedLinkNames(), ", ")) + } + + prefix := allowedLinkKeys[*l.Name] + if prefix != "" { + if !strings.HasPrefix(*l.URL, prefix) { + return fmt.Errorf("invalid value '%s' for %s link url, allowed only with prefix: %s", + *l.URL, *l.Name, prefix) + } + } + + if !strings.HasPrefix(*l.URL, "https://") { + return fmt.Errorf("invalid value for links.url field, allowed only with https:// prefix") + } + + if *l.Name == "medium" { + if !strings.Contains(*l.URL, "medium.com") { + return fmt.Errorf("invalid value for links.url field, should contain medium.com") + } + } + } + + return nil +} + +func ValidateCoinType(assetType string) error { + if assetType != "coin" { + return fmt.Errorf("%w: only \"coin\" type allowed for coin field", validation.ErrInvalidField) + } + + return nil +} + +func ValidateTags(tags, allowedTags []string) error { + for _, t := range tags { + if !str.Contains(t, allowedTags) { + return fmt.Errorf("%w: tag '%s' not allowed", validation.ErrInvalidField, t) + } + } + + return nil +} + +// Both infos can be validated by this validators. + +func ValidateDecimals(decimals int) error { + if decimals > 30 || decimals < 0 { + return fmt.Errorf("%w: decimals field", validation.ErrInvalidField) + } + + return nil +} + +func ValidateStatus(status string) error { + for _, f := range allowedStatusValues { + if f == status { + return nil + } + } + + return fmt.Errorf("%w: allowed status field values: %s", validation.ErrInvalidField, + strings.Join(allowedStatusValues, ", ")) +} + +func ValidateDescription(description string) error { + if len(description) > 600 { + return fmt.Errorf("%w: invalid length for description field", validation.ErrInvalidField) + } + + for _, ch := range whiteSpaceCharacters { + if strings.Contains(description, ch) { + return fmt.Errorf("%w: description contains not allowed characters (new line, double space)", + validation.ErrInvalidField) + } + } + + return nil +} + +func ValidateDescriptionWebsite(description, website string) error { + if description != "-" && website == "" { + return fmt.Errorf("%w: website field", validation.ErrMissingField) + } + + return nil +} + +func ValidateExplorer(explorer, name string, chain coin.Coin, addr, tokenType string) error { + // explorer url is composed with values outside info.json. + if chain == coin.Nativeinjective() { + return nil + } + + explorerExpected, err := coin.GetCoinExploreURL(chain, addr, tokenType) + if err != nil { + explorerExpected = "" + } + + explorerActual := explorer + + if !strings.EqualFold(explorerActual, explorerExpected) { + explorerAlt := explorerURLAlternatives(chain.Handle, name) + if len(explorerAlt) == 0 { + return nil + } + + var matchCount int + + for _, e := range explorerAlt { + if strings.EqualFold(e, explorerActual) { + matchCount++ + } + } + + if matchCount == 0 { + return fmt.Errorf("invalid value for explorer field, %s insted of %s", explorerActual, explorerExpected) + } + } + + return nil +} + +func isEmpty(field string) bool { + return field == "" +} diff --git a/internal/info/model.go b/internal/info/model.go new file mode 100644 index 000000000..0a5d237e9 --- /dev/null +++ b/internal/info/model.go @@ -0,0 +1,55 @@ +package info + +type ( + CoinModel struct { + Name *string `json:"name,omitempty"` + Website *string `json:"website,omitempty"` + Description *string `json:"description,omitempty"` + Explorer *string `json:"explorer,omitempty"` + Research string `json:"research,omitempty"` + Symbol *string `json:"symbol,omitempty"` + Type *string `json:"type,omitempty"` + Decimals *int `json:"decimals,omitempty"` + Status *string `json:"status,omitempty"` + Tags []string `json:"tags,omitempty"` + Links []Link `json:"links,omitempty"` + } + + AssetModel struct { + Name *string `json:"name,omitempty"` + Symbol *string `json:"symbol,omitempty"` + Type *string `json:"type,omitempty"` + Decimals *int `json:"decimals,omitempty"` + Description *string `json:"description,omitempty"` + Website *string `json:"website,omitempty"` + Explorer *string `json:"explorer,omitempty"` + Research string `json:"research,omitempty"` + Status *string `json:"status,omitempty"` + ID *string `json:"id,omitempty"` + Links []Link `json:"links,omitempty"` + ShortDesc *string `json:"short_desc,omitempty"` + Audit *string `json:"audit,omitempty"` + AuditReport *string `json:"audit_report,omitempty"` + Tags []string `json:"tags,omitempty"` + Code *string `json:"code,omitempty"` + Ticker *string `json:"ticker,omitempty"` + ExplorerEth *string `json:"explorer-ETH,omitempty"` + Address *string `json:"address,omitempty"` + Twitter *string `json:"twitter,omitempty"` + CoinMarketcap *string `json:"coinmarketcap,omitempty"` + DataSource *string `json:"data_source,omitempty"` + } + + Link struct { + Name *string `json:"name,omitempty"` + URL *string `json:"url,omitempty"` + } +) + +func (a *AssetModel) GetStatus() string { + if a.Status == nil { + return "" + } + + return *a.Status +} diff --git a/internal/info/values.go b/internal/info/values.go new file mode 100644 index 000000000..9463c1082 --- /dev/null +++ b/internal/info/values.go @@ -0,0 +1,79 @@ +package info + +import ( + "fmt" + "strings" + + "github.com/trustwallet/go-primitives/coin" +) + +//nolint:gochecknoglobals +var ( + requiredCoinFields = []string{ + "name", "type", "symbol", "decimals", + "description", "website", "explorer", "status", + } + + requiredAssetFields = []string{ + "name", "type", "symbol", "decimals", + "description", "website", "explorer", "status", "id", + } + + allowedStatusValues = []string{"active", "spam", "abandoned"} + + allowedLinkKeys = map[string]string{ + "github": "https://github.com/", + "whitepaper": "", + "twitter": "https://twitter.com/", + "telegram": "https://t.me/", + "telegram_news": "https://t.me/", // Read-only announcement channel. + "medium": "", // URL contains 'medium.com'. + "discord": "https://discord.com/", + "reddit": "https://reddit.com/", + "facebook": "https://facebook.com/", + "youtube": "https://youtube.com/", + "coinmarketcap": "https://coinmarketcap.com/", + "coingecko": "https://coingecko.com/", + "blog": "", // Blog, other than medium. + "forum": "", // Community site. + "docs": "", + "source_code": "", // Other than github. + } + + whiteSpaceCharacters = []string{"\n", " "} +) + +func explorerURLAlternatives(chain, name string) []string { + var altUrls []string + + if name != "" { + nameNorm := strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( + strings.ToLower(name), " ", ""), ")", ""), "(", "") + + if strings.ToLower(chain) == coin.Coins[coin.ETHEREUM].Name { + altUrls = append(altUrls, fmt.Sprintf("https://etherscan.io/token/%s", nameNorm)) + } + + altUrls = append(altUrls, fmt.Sprintf("https://explorer.%s.io", nameNorm)) + altUrls = append(altUrls, fmt.Sprintf("https://scan.%s.io", nameNorm)) + } + + return altUrls +} + +func linkNameAllowed(str string) bool { + if _, exists := allowedLinkKeys[str]; !exists { + return false + } + + return true +} + +func supportedLinkNames() []string { + names := make([]string, 0, len(allowedLinkKeys)) + for k := range allowedLinkKeys { + names = append(names, k) + } + + return names +} diff --git a/internal/processor/validators.go b/internal/processor/validators.go index c01f15902..61842118c 100644 --- a/internal/processor/validators.go +++ b/internal/processor/validators.go @@ -8,10 +8,10 @@ import ( "github.com/trustwallet/assets-go-libs/file" "github.com/trustwallet/assets-go-libs/path" "github.com/trustwallet/assets-go-libs/validation" - "github.com/trustwallet/assets-go-libs/validation/info" "github.com/trustwallet/assets-go-libs/validation/list" "github.com/trustwallet/assets-go-libs/validation/tokenlist" "github.com/trustwallet/assets/internal/config" + "github.com/trustwallet/assets/internal/info" "github.com/trustwallet/go-primitives/coin" )