mirror of
				https://github.com/Instadapp/trustwallet-assets.git
				synced 2024-07-29 22:37:31 +00:00 
			
		
		
		
	Add tokenlist validation (#17111)
* Add tokenlist validation * Fix according to review
This commit is contained in:
		
							parent
							
								
									905931934d
								
							
						
					
					
						commit
						e7f9efcd2c
					
				
							
								
								
									
										1
									
								
								.github/assets.config.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.github/assets.config.yaml
									
									
									
									
										vendored
									
									
								
							|  | @ -37,6 +37,7 @@ validators_settings: | |||
|       - "go.sum" | ||||
|       - ".golangci.yml" | ||||
|       - "Makefile" | ||||
|       - "bin" | ||||
|     skip_files: | ||||
|       - "node_modules" | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|     "name": "BakeryToken", | ||||
|     "type": "BEP2", | ||||
|     "symbol": "BAKE-5E0", | ||||
|     "symbol": "BAKE", | ||||
|     "decimals": 8, | ||||
|     "website": "", | ||||
|     "description": "-", | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|     "name": "Burger Swap", | ||||
|     "type": "BEP2", | ||||
|     "symbol": "BURGER-33A", | ||||
|     "symbol": "BURGER", | ||||
|     "decimals": 8, | ||||
|     "website": "", | ||||
|     "description": "-", | ||||
|  |  | |||
|  | @ -1089,16 +1089,6 @@ | |||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/binance/assets/BET-844/logo.png", | ||||
|             "pairs": [] | ||||
|         }, | ||||
|         { | ||||
|             "asset": "c714_tBIFI-290", | ||||
|             "type": "BEP2", | ||||
|             "address": "BIFI-290", | ||||
|             "name": "beefy.finance", | ||||
|             "symbol": "BIFI", | ||||
|             "decimals": 8, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/binance/assets/BIFI-290/logo.png", | ||||
|             "pairs": [] | ||||
|         }, | ||||
|         { | ||||
|             "asset": "c714_tBKBT-3A6", | ||||
|             "type": "BEP2", | ||||
|  |  | |||
|  | @ -1,6 +1,6 @@ | |||
| { | ||||
|     "name": "LTO", | ||||
|     "symbol": "XLTO", | ||||
|     "symbol": "LTO", | ||||
|     "type": "ERC20", | ||||
|     "decimals": 8, | ||||
|     "description": "Old ERC20 Smart Contract for LTO Network, please swap to v2. LTO Network is a layer-1 platform for decentralized identities, verifiable credentials and decentralized workflow applications, while maintaining data privacy and GDPR compliance.", | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|     "name": "Wrapped CrescoFin (WCRES)", | ||||
|     "type": "ERC20", | ||||
|     "symbol": "WCRES", | ||||
|     "symbol": "wCRES", | ||||
|     "decimals": 18, | ||||
|     "website": "https://defi.crescofin.ch", | ||||
|     "description": "wCRES represents unregistered equity in CrescoFin, a better banking alternative, with higher rates than in a bank and fully insured deposits and returns.\n\nIncorporated and regulated in Switzerland.", | ||||
|  |  | |||
|  | @ -1350,7 +1350,7 @@ | |||
|         { | ||||
|             "asset": "c60_t0x41a3dba3d677e573636ba691a70ff2d606c29666", | ||||
|             "type": "ERC20", | ||||
|             "address": "0x41a3dba3d677e573636ba691a70ff2d606c29666", | ||||
|             "address": "0x41A3Dba3D677E573636BA691a70ff2D606c29666", | ||||
|             "name": "GoBlank", | ||||
|             "symbol": "BLANK", | ||||
|             "decimals": 18, | ||||
|  | @ -1503,7 +1503,7 @@ | |||
|             "type": "ERC20", | ||||
|             "address": "0x514910771AF9Ca656af840dff83E8264EcF986CA", | ||||
|             "name": "ChainLink", | ||||
|             "symbol": "Link", | ||||
|             "symbol": "LINK", | ||||
|             "decimals": 18, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/ethereum/assets/0x514910771AF9Ca656af840dff83E8264EcF986CA/logo.png", | ||||
|             "pairs": [] | ||||
|  | @ -2190,16 +2190,6 @@ | |||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/ethereum/assets/0x8c15Ef5b4B21951d50E53E4fbdA8298FFAD25057/logo.png", | ||||
|             "pairs": [] | ||||
|         }, | ||||
|         { | ||||
|             "asset": "c60_t0x8c8687fC965593DFb2F0b4EAeFD55E9D8df348df", | ||||
|             "type": "ERC20", | ||||
|             "address": "0x8c8687fC965593DFb2F0b4EAeFD55E9D8df348df", | ||||
|             "name": "PAID Network", | ||||
|             "symbol": "PAID", | ||||
|             "decimals": 18, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/ethereum/assets/0x8c8687fC965593DFb2F0b4EAeFD55E9D8df348df/logo.png", | ||||
|             "pairs": [] | ||||
|         }, | ||||
|         { | ||||
|             "chainId": 1, | ||||
|             "asset": "c60_t0x8CE9137d39326AD0cD6491fb5CC0CbA0e089b6A9", | ||||
|  | @ -3178,7 +3168,7 @@ | |||
|             "type": "ERC20", | ||||
|             "address": "0xdd974D5C2e2928deA5F71b9825b8b646686BD200", | ||||
|             "name": "Kyber Network Crystal", | ||||
|             "symbol": "KNC", | ||||
|             "symbol": "KNCL", | ||||
|             "decimals": 18, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/ethereum/assets/0xdd974D5C2e2928deA5F71b9825b8b646686BD200/logo.png", | ||||
|             "pairs": [] | ||||
|  | @ -3279,7 +3269,7 @@ | |||
|             "type": "ERC20", | ||||
|             "address": "0xE95A203B1a91a908F9B9CE46459d101078c2c3cb", | ||||
|             "name": "aEthereum", | ||||
|             "symbol": "aEth", | ||||
|             "symbol": "aETHc", | ||||
|             "decimals": 18, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/ethereum/assets/0xE95A203B1a91a908F9B9CE46459d101078c2c3cb/logo.png", | ||||
|             "pairs": [] | ||||
|  |  | |||
|  | @ -1,5 +1,5 @@ | |||
| { | ||||
|     "name": "Filecoin", | ||||
|     "name": "Binance-Peg Filecoin", | ||||
|     "website": "https://filecoin.io", | ||||
|     "description": "Filecoin provides a blockchain-based marketplace that aims to revolutionize the global storage economy.", | ||||
|     "explorer": "https://bscscan.com/token/0x0D8Ce2A99Bb6e3B7Db580eD848240e4a0F9aE153", | ||||
|  |  | |||
|  | @ -5,7 +5,7 @@ | |||
|     "explorer": "https://bscscan.com/token/0x63870a18b6e42b01ef1ad8a2302ef50b7132054f", | ||||
|     "research": "", | ||||
|     "type": "BEP20", | ||||
|     "symbol": "blink", | ||||
|     "symbol": "BLINK", | ||||
|     "decimals": 6, | ||||
|     "status": "active", | ||||
|     "id": "0x63870A18B6e42b01Ef1Ad8A2302ef50B7132054F" | ||||
|  |  | |||
|  | @ -213,7 +213,7 @@ | |||
|             "type": "BEP20", | ||||
|             "address": "0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82", | ||||
|             "name": "PancakeSwap Token", | ||||
|             "symbol": "Cake", | ||||
|             "symbol": "CAKE", | ||||
|             "decimals": 18, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/smartchain/assets/0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82/logo.png", | ||||
|             "pairs": [] | ||||
|  | @ -511,7 +511,7 @@ | |||
|             "address": "0x78650B139471520656b9E7aA7A5e9276814a38e9", | ||||
|             "name": "StandardBTCHashrateToken", | ||||
|             "symbol": "BTCST", | ||||
|             "decimals": 18, | ||||
|             "decimals": 17, | ||||
|             "logoURI": "https://assets.trustwalletapp.com/blockchains/smartchain/assets/0x78650B139471520656b9E7aA7A5e9276814a38e9/logo.png", | ||||
|             "pairs": [] | ||||
|         }, | ||||
|  |  | |||
							
								
								
									
										16
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								go.sum
									
									
									
									
									
								
							|  | @ -40,26 +40,10 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P | |||
| github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= | ||||
| github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= | ||||
| github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= | ||||
| github.com/trustwallet/assets-go-libs v0.0.16 h1:nbKrf/pHKQCut4Q5Mdg5BinLdFxOqvzEeAgIgzX0/P8= | ||||
| github.com/trustwallet/assets-go-libs v0.0.16/go.mod h1:agKWTQ9ECSzQ++7P/9viSxJnG1Kp+WhfDyI3pAmtnVM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220141041-3b3a722649fa h1:d+FAYtxmN8mJK9jobkzOotwSEU2KPZ9H4gmuBg6dv3M= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220141041-3b3a722649fa/go.mod h1:agKWTQ9ECSzQ++7P/9viSxJnG1Kp+WhfDyI3pAmtnVM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220141745-408afc4f7467 h1:JYCmTXnQfR/RElBY9aFppwLVwvy7wuBNbtW5f31j1Vs= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220141745-408afc4f7467/go.mod h1:agKWTQ9ECSzQ++7P/9viSxJnG1Kp+WhfDyI3pAmtnVM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220144503-44a66d3a5e92 h1:TT3IFY3cBZBQAMdoVA8bzdH8q58d8hkiiVpBAmZJ+J8= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17-0.20211220144503-44a66d3a5e92/go.mod h1:agKWTQ9ECSzQ++7P/9viSxJnG1Kp+WhfDyI3pAmtnVM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17 h1:s/XF4C7peyFuKadoRr9YhjfMoWAx9yKzk2IFmtT5ZpM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.17/go.mod h1:agKWTQ9ECSzQ++7P/9viSxJnG1Kp+WhfDyI3pAmtnVM= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19-0.20211224113937-74dc923bd4b5 h1:3bqdCY+jcpx6QCYc+Eb/Kci3ZRljI7CP6t3H+JhKAmo= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19-0.20211224113937-74dc923bd4b5/go.mod h1:jPJ2JP6SF+/6fXLETojEtSssCB5Lyeid8rjS6NLS4e4= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19-0.20211224115115-e2089570f2fd h1:QtDE54pHNtql9sQvyAyO6alzyaXcnIUuwNytcF25EyU= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19-0.20211224115115-e2089570f2fd/go.mod h1:jPJ2JP6SF+/6fXLETojEtSssCB5Lyeid8rjS6NLS4e4= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19 h1:Zn7su7wSrJLOHSeEoM+jz8smmIFsX+tAGI3FQ7rwwqQ= | ||||
| github.com/trustwallet/assets-go-libs v0.0.19/go.mod h1:/il5tQtqP3uSDbyDTfP1OsL3kSIg+v6+QBRz3okXZpc= | ||||
| github.com/trustwallet/go-libs v0.2.21-0.20211217144209-59d4828f9793 h1:KFtyLpBPbMyUdeCth/Zcej/SSgAFIo6fxdS2eEPEg3I= | ||||
| github.com/trustwallet/go-libs v0.2.21-0.20211217144209-59d4828f9793/go.mod h1:7QdAp1lcteKKI0DYqGoaO8KO4eTNYjGmg8vHy0YXkKc= | ||||
| github.com/trustwallet/go-primitives v0.0.17 h1:1fBxZMKGCHdHtgdUzsqdFlD21+1GneIk/sxN6jxYBds= | ||||
| github.com/trustwallet/go-primitives v0.0.17/go.mod h1:jLqd7rm+4EYG5JdpxhngM9HwbqfEXzKy/wK4vUB7STs= | ||||
| github.com/trustwallet/go-primitives v0.0.19 h1:IvuzU1tB5u+UpjPkJqPqVvb8axLj1LI5nQmTvhmNIck= | ||||
| github.com/trustwallet/go-primitives v0.0.19/go.mod h1:jLqd7rm+4EYG5JdpxhngM9HwbqfEXzKy/wK4vUB7STs= | ||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||
|  |  | |||
|  | @ -1,6 +1,9 @@ | |||
| package processor | ||||
| 
 | ||||
| import "github.com/trustwallet/assets/internal/file" | ||||
| import ( | ||||
| 	"github.com/trustwallet/assets/internal/file" | ||||
| 	"github.com/trustwallet/go-primitives/types" | ||||
| ) | ||||
| 
 | ||||
| type ( | ||||
| 	Validator struct { | ||||
|  | @ -29,14 +32,14 @@ type ( | |||
| 	} | ||||
| 
 | ||||
| 	TokenItem struct { | ||||
| 		Asset    string `json:"asset"` | ||||
| 		Type     string `json:"type"` | ||||
| 		Address  string `json:"address"` | ||||
| 		Name     string `json:"name"` | ||||
| 		Symbol   string `json:"symbol"` | ||||
| 		Decimals uint   `json:"decimals"` | ||||
| 		LogoURI  string `json:"logoURI"` | ||||
| 		Pairs    []Pair `json:"pairs"` | ||||
| 		Asset    string          `json:"asset"` | ||||
| 		Type     types.TokenType `json:"type"` | ||||
| 		Address  string          `json:"address"` | ||||
| 		Name     string          `json:"name"` | ||||
| 		Symbol   string          `json:"symbol"` | ||||
| 		Decimals uint            `json:"decimals"` | ||||
| 		LogoURI  string          `json:"logoURI"` | ||||
| 		Pairs    []Pair          `json:"pairs"` | ||||
| 	} | ||||
| 
 | ||||
| 	Pair struct { | ||||
|  |  | |||
|  | @ -12,62 +12,51 @@ func NewService(fileProvider *file.Service) *Service { | |||
| 	return &Service{fileService: fileProvider} | ||||
| } | ||||
| 
 | ||||
| func (s *Service) GetValidator(f *file.AssetFile) *Validator { | ||||
| func (s *Service) GetValidator(f *file.AssetFile) []Validator { | ||||
| 	switch f.Type() { | ||||
| 	case file.TypeRootFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Root folder contains only allowed files", | ||||
| 			Run:  s.ValidateRootFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Root folder contains only allowed files", Run: s.ValidateRootFolder}, | ||||
| 		} | ||||
| 	case file.TypeChainFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Chain folders are lowercase and contains only allowed files", | ||||
| 			Run:  s.ValidateChainFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Chain folders are lowercase and contains only allowed files", Run: s.ValidateChainFolder}, | ||||
| 		} | ||||
| 	case file.TypeChainLogoFile, file.TypeAssetLogoFile, file.TypeValidatorsLogoFile, file.TypeDappsLogoFile: | ||||
| 		return &Validator{ | ||||
| 			Name: "Logos (size, dimension)", | ||||
| 			Run:  s.ValidateImage, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Logos (size, dimension)", Run: s.ValidateImage}, | ||||
| 		} | ||||
| 	case file.TypeAssetFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Each asset folder has valid asset address and contains logo/info", | ||||
| 			Run:  s.ValidateAssetFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Each asset folder has valid asset address and contains logo/info", Run: s.ValidateAssetFolder}, | ||||
| 		} | ||||
| 	case file.TypeDappsFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Dapps folder (allowed only png files, lowercase)", | ||||
| 			Run:  s.ValidateDappsFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Dapps folder (allowed only png files, lowercase)", Run: s.ValidateDappsFolder}, | ||||
| 		} | ||||
| 	case file.TypeAssetInfoFile: | ||||
| 		return &Validator{ | ||||
| 			Name: "Asset info (is valid json, fields)", | ||||
| 			Run:  s.ValidateAssetInfoFile, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Asset info (is valid json, fields)", Run: s.ValidateAssetInfoFile}, | ||||
| 		} | ||||
| 	case file.TypeChainInfoFile: | ||||
| 		return &Validator{ | ||||
| 			Name: "Chain Info (is valid json, fields)", | ||||
| 			Run:  s.ValidateChainInfoFile, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Chain Info (is valid json, fields)", Run: s.ValidateChainInfoFile}, | ||||
| 		} | ||||
| 	case file.TypeValidatorsListFile: | ||||
| 		return &Validator{ | ||||
| 			Name: "Validators list file", | ||||
| 			Run:  s.ValidateValidatorsListFile, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Validators list file", Run: s.ValidateValidatorsListFile}, | ||||
| 		} | ||||
| 	case file.TypeTokenListFile: | ||||
| 		return &Validator{ | ||||
| 			Name: "Token list (if assets from list present in chain)", | ||||
| 			Run:  s.ValidateTokenListFile, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Token list (if assets from list present in chain)", Run: s.ValidateTokenListFile}, | ||||
| 		} | ||||
| 	case file.TypeChainInfoFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Chain Info Folder (has files)", | ||||
| 			Run:  s.ValidateInfoFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Chain Info Folder (has files)", Run: s.ValidateInfoFolder}, | ||||
| 		} | ||||
| 	case file.TypeValidatorsAssetFolder: | ||||
| 		return &Validator{ | ||||
| 			Name: "Validators asset folder (has logo, valid asset address)", | ||||
| 			Run:  s.ValidateValidatorsAssetFolder, | ||||
| 		return []Validator{ | ||||
| 			{Name: "Validators asset folder (has logo, valid asset address)", Run: s.ValidateValidatorsAssetFolder}, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -75,53 +64,33 @@ func (s *Service) GetValidator(f *file.AssetFile) *Validator { | |||
| } | ||||
| 
 | ||||
| func (s *Service) GetFixers(f *file.AssetFile) []Fixer { | ||||
| 	infoFixer := Fixer{ | ||||
| 		Name: "Formatting all info.json files", | ||||
| 	jsonFixer := Fixer{ | ||||
| 		Name: "Formatting all json files", | ||||
| 		Run:  s.FixJSON, | ||||
| 	} | ||||
| 
 | ||||
| 	ethAssetFixer := Fixer{ | ||||
| 		Name: "Renaming EVM's asset folder to valid address checksum", | ||||
| 		Run:  s.FixETHAddressChecksum, | ||||
| 	} | ||||
| 
 | ||||
| 	logoFixer := Fixer{ | ||||
| 		Name: "Resizing and compressing logo images", | ||||
| 		Run:  s.FixLogo, | ||||
| 	} | ||||
| 
 | ||||
| 	chainInfoFixer := Fixer{ | ||||
| 		Name: "Fixing chain info.json files", | ||||
| 		Run:  s.FixChainInfoJSON, | ||||
| 	} | ||||
| 
 | ||||
| 	assetInfoFixer := Fixer{ | ||||
| 		Name: "Fixing asset info.json files", | ||||
| 		Run:  s.FixAssetInfoJSON, | ||||
| 	} | ||||
| 
 | ||||
| 	switch f.Type() { | ||||
| 	case file.TypeChainInfoFile: | ||||
| 		return []Fixer{ | ||||
| 			infoFixer, | ||||
| 			chainInfoFixer, | ||||
| 			jsonFixer, | ||||
| 			{Name: "Fixing chain info.json files", Run: s.FixChainInfoJSON}, | ||||
| 		} | ||||
| 	case file.TypeAssetInfoFile: | ||||
| 		return []Fixer{ | ||||
| 			infoFixer, | ||||
| 			assetInfoFixer, | ||||
| 			jsonFixer, | ||||
| 			{Name: "Fixing asset info.json files", Run: s.FixAssetInfoJSON}, | ||||
| 		} | ||||
| 	case file.TypeValidatorsListFile: | ||||
| 		return []Fixer{ | ||||
| 			infoFixer, | ||||
| 			jsonFixer, | ||||
| 		} | ||||
| 	case file.TypeAssetFolder: | ||||
| 		return []Fixer{ | ||||
| 			ethAssetFixer, | ||||
| 			{Name: "Renaming EVM's asset folder to valid address checksum", Run: s.FixETHAddressChecksum}, | ||||
| 		} | ||||
| 	case file.TypeChainLogoFile, file.TypeAssetLogoFile, file.TypeValidatorsLogoFile, file.TypeDappsLogoFile: | ||||
| 		return []Fixer{ | ||||
| 			logoFixer, | ||||
| 			{Name: "Resizing and compressing logo images", Run: s.FixLogo}, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
|  | @ -130,22 +99,13 @@ func (s *Service) GetFixers(f *file.AssetFile) []Fixer { | |||
| 
 | ||||
| func (s *Service) GetUpdatersAuto() []Updater { | ||||
| 	return []Updater{ | ||||
| 		{ | ||||
| 			Name: "Retrieving missing token images, creating binance token list.", | ||||
| 			Run:  s.UpdateBinanceTokens, | ||||
| 		}, | ||||
| 		{Name: "Retrieving missing token images, creating binance token list.", Run: s.UpdateBinanceTokens}, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (s *Service) GetUpdatersManual() []Updater { | ||||
| 	return []Updater{ | ||||
| 		{ | ||||
| 			Name: "Update tokenlist.json for Ethereum", | ||||
| 			Run:  s.UpdateEthereumTokenlist, | ||||
| 		}, | ||||
| 		{ | ||||
| 			Name: "Update tokenlist.json for Smartchain", | ||||
| 			Run:  s.UpdateSmartchainTokenlist, | ||||
| 		}, | ||||
| 		{Name: "Update tokenlist.json for Ethereum", Run: s.UpdateEthereumTokenlist}, | ||||
| 		{Name: "Update tokenlist.json for Smartchain", Run: s.UpdateSmartchainTokenlist}, | ||||
| 	} | ||||
| } | ||||
|  |  | |||
|  | @ -230,7 +230,7 @@ func generateTokenList(marketPairs []binance.MarketPair, tokenList binance.Token | |||
| 
 | ||||
| 		tokenItems = append(tokenItems, TokenItem{ | ||||
| 			Asset:    getAssetIDSymbol(token.Symbol, coin.Coins[coin.BINANCE].Symbol, coin.BINANCE), | ||||
| 			Type:     getTokenType(token.Symbol, coin.Coins[coin.BINANCE].Symbol, string(types.BEP2)), | ||||
| 			Type:     getTokenType(token.Symbol, coin.Coins[coin.BINANCE].Symbol, types.BEP2), | ||||
| 			Address:  token.Symbol, | ||||
| 			Name:     token.Name, | ||||
| 			Symbol:   token.OriginalSymbol, | ||||
|  | @ -259,9 +259,9 @@ func getAssetIDSymbol(tokenID string, nativeCoinID string, coinType uint) string | |||
| 	return assetlib.BuildID(coinType, tokenID) | ||||
| } | ||||
| 
 | ||||
| func getTokenType(symbol string, nativeCoinSymbol string, tokenType string) string { | ||||
| func getTokenType(symbol string, nativeCoinSymbol string, tokenType types.TokenType) types.TokenType { | ||||
| 	if symbol == nativeCoinSymbol { | ||||
| 		return "coin" | ||||
| 		return types.Coin | ||||
| 	} | ||||
| 
 | ||||
| 	return tokenType | ||||
|  |  | |||
|  | @ -288,7 +288,7 @@ func getTokenInfoFromSubgraphToken(chain coin.Coin, token *TokenInfo) (*TokenIte | |||
| 
 | ||||
| 	return &TokenItem{ | ||||
| 		Asset:    getAssetIDSymbol(checksum, chain.Symbol, chain.ID), | ||||
| 		Type:     tokenType, | ||||
| 		Type:     types.TokenType(tokenType), | ||||
| 		Address:  checksum, | ||||
| 		Name:     token.Name, | ||||
| 		Symbol:   token.Symbol, | ||||
|  |  | |||
|  | @ -14,6 +14,7 @@ import ( | |||
| 	"github.com/trustwallet/assets/internal/config" | ||||
| 	"github.com/trustwallet/assets/internal/file" | ||||
| 	"github.com/trustwallet/go-primitives/coin" | ||||
| 	"github.com/trustwallet/go-primitives/types" | ||||
| ) | ||||
| 
 | ||||
| func (s *Service) ValidateRootFolder(f *file.AssetFile) error { | ||||
|  | @ -352,6 +353,65 @@ func (s *Service) ValidateTokenListFile(f *file.AssetFile) error { | |||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	var model TokenList | ||||
| 	err = json.Unmarshal(buf.Bytes(), &model) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	err = compareTokenlistWithAssets(model.Tokens, f.Chain().Handle) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func compareTokenlistWithAssets(tokens []TokenItem, chain string) error { | ||||
| 	compErr := validation.NewErrComposite() | ||||
| 
 | ||||
| 	for _, token := range tokens { | ||||
| 		if token.Type == types.Coin { | ||||
| 			continue | ||||
| 		} | ||||
| 
 | ||||
| 		assetPath := path.GetAssetInfoPath(chain, token.Address) | ||||
| 
 | ||||
| 		infoFile, err := os.Open(assetPath) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		buf := bytes.NewBuffer(nil) | ||||
| 		if _, err = buf.ReadFrom(infoFile); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		infoFile.Close() | ||||
| 
 | ||||
| 		var infoAsset info.AssetModel | ||||
| 		err = json.Unmarshal(buf.Bytes(), &infoAsset) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 
 | ||||
| 		if string(token.Type) != *infoAsset.Type { | ||||
| 			compErr.Append(fmt.Errorf("field type differs from %s", assetPath)) | ||||
| 		} | ||||
| 
 | ||||
| 		if token.Symbol != *infoAsset.Symbol { | ||||
| 			compErr.Append(fmt.Errorf("field symbol differs from %s", assetPath)) | ||||
| 		} | ||||
| 
 | ||||
| 		if token.Decimals != uint(*infoAsset.Decimals) { | ||||
| 			compErr.Append(fmt.Errorf("field decimals differs from %s", assetPath)) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if compErr.Len() > 0 { | ||||
| 		return compErr | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -32,9 +32,9 @@ func (s *Service) RunJob(paths []string, job func(*file.AssetFile)) { | |||
| } | ||||
| 
 | ||||
| func (s *Service) Check(f *file.AssetFile) { | ||||
| 	validator := s.processorService.GetValidator(f) | ||||
| 	validators := s.processorService.GetValidator(f) | ||||
| 
 | ||||
| 	if validator != nil { | ||||
| 	for _, validator := range validators { | ||||
| 		if err := validator.Run(f); err != nil { | ||||
| 			s.handleError(err, f, validator.Name) | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel
						Daniel