├── .github ├── CODEOWNERS └── workflows │ ├── go.yml │ └── immutability-check.yml ├── .gitignore ├── LICENSE ├── README.md ├── aptos.go ├── aptos_test.go ├── evm.go ├── evm_e2e_test.go ├── evm_test.go ├── genchains_aptos.go ├── genchains_evm.go ├── genchains_solana.go ├── genchains_sui.go ├── genchains_ton.go ├── genchains_tron.go ├── generated_chains_aptos.go ├── generated_chains_evm.go ├── generated_chains_solana.go ├── generated_chains_sui.go ├── generated_chains_ton.go ├── generated_chains_tron.go ├── go.mod ├── go.sum ├── selectors.go ├── selectors.yml ├── selectors_aptos.yml ├── selectors_solana.yml ├── selectors_sui.yml ├── selectors_ton.yml ├── selectors_tron.yml ├── solana.go ├── solana_test.go ├── sui.go ├── sui_test.go ├── test_selectors.yml ├── test_selectors_solana.yml ├── ton.go ├── ton_test.go ├── tron.go └── tron_test.go /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @smartcontractkit/bix-ship @smartcontractkit/ccip @smartcontractkit/bix-framework 2 | -------------------------------------------------------------------------------- /.github/workflows/go.yml: -------------------------------------------------------------------------------- 1 | name: Go - Build and test 2 | 3 | on: [ push ] 4 | 5 | jobs: 6 | build-test: 7 | name: Build and test 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Check out code into the Go module directory 11 | uses: actions/checkout@v2 12 | - name: Set up Go 13 | uses: actions/setup-go@v3 14 | with: 15 | go-version-file: "go.mod" 16 | cache: false 17 | - name: Build 18 | run: go build -v ./... 19 | - name: Make sure generated files are updated 20 | run: | 21 | if go generate | grep -q 'no changes detected'; then 22 | exit 0; 23 | fi 24 | exit 1; 25 | - name: Test 26 | run: go test -v ./... 27 | -------------------------------------------------------------------------------- /.github/workflows/immutability-check.yml: -------------------------------------------------------------------------------- 1 | # In order to prevent accidental changes to selectors, we're ensuring their immutability 2 | # This action will fail if the immutability is violated 3 | name: Ensure Selector Immutability 4 | 5 | on: [ pull_request ] 6 | 7 | jobs: 8 | immutability-check: 9 | name: Check Selector Immutability 10 | runs-on: ubuntu-latest 11 | permissions: 12 | contents: read 13 | pull-requests: write 14 | steps: 15 | - name: Checkout Changes 16 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 17 | - name: Checkout Previous Ref 18 | uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 19 | with: 20 | ref: ${{ github.event.pull_request.base.ref }} 21 | path: old 22 | 23 | - name: Extract Immutability Violations 24 | id: immutability-check 25 | uses: mikefarah/yq@bc5b54cb1d1f720db16c9f75c5b45384d00e5cbf # v4.44.5 26 | with: 27 | # Checks if any selector that is present in the previous ref has been modified in the current ref 28 | cmd: yq e '.selectors as $old | load("selectors.yml") | .selectors as $new | $new | with_entries(select(.key as $key | $old | has($key))) | with_entries(select(.key as $key | $old[$key].selector != $new[$key].selector))' old/selectors.yml 29 | 30 | - name: Extract Removed Selectors 31 | id: removed-selectors-check 32 | uses: mikefarah/yq@bc5b54cb1d1f720db16c9f75c5b45384d00e5cbf # v4.44.5 33 | with: 34 | # Checks if any selector that previously existed has been removed 35 | cmd: yq e '.selectors as $old | load("selectors.yml").selectors as $new | $old | with_entries(select(.key as $key | $new | has($key) == false))' old/selectors.yml 36 | 37 | - name: Check Immutability Violations 38 | id: check-violations 39 | run: | 40 | violations=$(echo '${{ steps.immutability-check.outputs.result }}') 41 | removed=$(echo '${{ steps.removed-selectors-check.outputs.result }}') 42 | 43 | if [[ ! $violations == "{}" ]]; then 44 | echo "Selector immutability has been violated. Please ensure that exisiting selectors are not modified." 45 | exit 1 46 | fi 47 | 48 | if [[ ! $removed == "{}" ]]; then 49 | echo "Selector immutability has been violated. Please ensure that exisiting selectors are not removed." 50 | exit 1 51 | fi 52 | 53 | - name: Create comment 54 | if: failure() 55 | uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0 56 | with: 57 | issue-number: ${{ github.event.pull_request.number }} 58 | body: | 59 | **Selector Immutability has been violated ❌** 60 | 61 | Existing `chain-selectors` are immutable. Please ensure you have not modified or removed an existing selector 62 | 63 | ```yaml 64 | ${{ (steps.immutability-check.outputs.result != '{}') && steps.immutability-check.outputs.result || steps.removed-selectors-check.outputs.result }} 65 | ``` 66 | reactions: '+1' 67 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # If you prefer the allow list template instead of the deny list, see community template: 2 | # https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore 3 | # 4 | # Binaries for programs and plugins 5 | *.exe 6 | *.exe~ 7 | *.dll 8 | *.so 9 | *.dylib 10 | 11 | # Test binary, built with `go test -c` 12 | *.test 13 | 14 | # Output of the go coverage tool, specifically when used with LiteIDE 15 | *.out 16 | 17 | # Dependency directories (remove the comment below to include it) 18 | # vendor/ 19 | 20 | # Go workspace file 21 | go.work 22 | 23 | 24 | .idea 25 | .vscode/ 26 | *.iml 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 SmartContract 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Chain Selectors 2 | 3 | CCIP uses its own set of chain selectors represented by uint64 to identify blockchains. It is a random 4 | integer generated as follows: 5 | ```python3 6 | python3 7 | >>> import random 8 | >>> random.randint(1, 2**64-1) 9 | ``` 10 | The scheme is used for several reasons: 11 | - Global uniqueness across blockchain families 12 | - Very unlikely to collide with existing chain ID schemes, reducing confusion 13 | - Efficient on/off-chain representation 14 | - No preference towards any family or chain 15 | - Decoupled from chain name which may change over time with rebrands/forks 16 | 17 | 18 | This repository contains a 19 | mapping between the custom chain identifiers (`chainSelectorId`) chain names and the chain identifiers 20 | used by the blockchains themselves (`chainId`). For solana we use the base58 encoded genesis hash as the chain id. 21 | 22 | Please refer to the [official documentation](https://docs.chain.link/ccip/supported-networks) to learn more about 23 | supported networks and their selectors. 24 | 25 | ### Installation 26 | 27 | `go get github.com/smartcontractkit/chain-selectors` 28 | 29 | ### Usage 30 | 31 | ```go 32 | import ( 33 | chainselectors "github.com/smartcontractkit/chain-selectors" 34 | ) 35 | 36 | func main() { 37 | // -------------------Chains agnostic --------------------: 38 | 39 | // Getting chain family based on selector 40 | family, err := GetSelectorFamily(2664363617261496610) 41 | 42 | // -------------------For EVM chains-------------------- 43 | 44 | // Getting selector based on ChainId 45 | selector, err := chainselectors.SelectorFromChainId(420) 46 | 47 | // Getting ChainId based on ChainSelector 48 | chainId, err := chainselectors.ChainIdFromSelector(2664363617261496610) 49 | 50 | // Getting ChainName based on ChainId 51 | chainName, err := chainselectors.NameFromChainId(420) 52 | 53 | // Getting ChainId based on the ChainName 54 | chainId, err := chainselectors.ChainIdFromName("binance_smart_chain-testnet") 55 | 56 | // Accessing mapping directly 57 | lookupChainId := uint64(1337) 58 | if chainSelector, exists := chainselectors.EvmChainIdToChainSelector()[lookupChainId]; exists { 59 | fmt.Println("Found evm chain selector for chain", lookupChainId, ":", chainSelector) 60 | } 61 | 62 | // -------------------Solana Chain --------------------: 63 | 64 | // Getting chain family based on selector 65 | family, err := SolanaNameFromChainId("5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d") 66 | 67 | // Getting chain id from chain selector 68 | chainId, err := chainselectors.SolanaChainIdFromSelector(124615329519749607) 69 | 70 | // Accessing mapping directly 71 | lookupChainId := "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d" 72 | if chainSelector, exists:= chainselectors.SolanaChainIdToChainSelector()[lookupChainId]; exists { 73 | fmt.Println("Found solana chain selector for chain", lookupChainId, ":", chainSelector) 74 | } 75 | } 76 | ``` 77 | 78 | ### Contributing 79 | 80 | #### Naming new chains 81 | 82 | Chain names must respect the following format: 83 | `--` 84 | 85 | When a component requires more than 1 word, use snake-case to connect them, e.g `polygon-zkevm`. 86 | 87 | | Parameter | Description | Example | 88 | | --- | --- |-------------------------------| 89 | | blockchain | Name of the chain | `ethereum`, `avalanche`, `polygon-zkevm` | 90 | | type | Type of network | `testnet`, `mainnet`, `devnet` | 91 | | network_instance | [Only if not mainnet] Identifier of specific network | `alfajores`, `holesky`, `sepolia`, `1` | 92 | 93 | More on `network_instance`: only include it if `type` is not mainnet. This is because legacy testnet instances are often dropped after a new one is spun up, e.g Ethereum Rinkeby. 94 | 95 | Rules for `network_instance`: 96 | 1. If chain has an officially-named testnet, use it, e.g 97 | `celo-testnet-alfajores`, `ethereum-testnet-holesky` 98 | 2. If not above, and chain is a rollup, use the name of its settlement network, e.g `base-testnet-sepolia` 99 | 3. If not above, use a number, e.g `bsc-testnet-1` 100 | 101 | Example chain names that comply with the format: 102 | ``` 103 | astar-mainnet 104 | astar-testnet-shibuya 105 | celo-mainnet 106 | celo-testnet-sepolia 107 | polygon-zkevm-mainnet 108 | polygon-zkevm-testnet-cardona 109 | ethereum-mainnet 110 | ethereum-testnet-sepolia 111 | ethereum-testnet-holesky 112 | optimism-mainnet 113 | optimism-testnet-sepolia 114 | bsc-mainnet 115 | bsc-testnet-1 116 | ``` 117 | 118 | You may find some existing names follow a legacy naming pattern: `-----`. Those names are kept as is due to complexity of migration. The transition form legacy pattern to the new pattern is motivated by chain migrations, e.g Celo migrating from an L1 into an L2, rendering the legacy name stale. 119 | 120 | 121 | #### Adding new chains 122 | 123 | Any new chains and selectors should be always added to [selectors.yml](selectors.yml) and client libraries should load 124 | details from this file. This ensures that all client libraries are in sync and use the same mapping. 125 | To add a new chain, please add new entry to the `selectors.yml` file and use the following format: 126 | 127 | Make sure to run `go generate` after making any changes. 128 | 129 | ```yaml 130 | $chain_id: 131 | selector: $chain_selector as uint64 132 | name: $chain_name as string # Although name is optional parameter, please provide it and respect the format described below 133 | ``` 134 | 135 | [selectors.yml](selectors.yml) file is divided into sections based on the blockchain type. 136 | Please make sure to add new entries to the both sections and keep them sorted by chain id within these sections. 137 | 138 | If you need to add a new chain for testing purposes (e.g. running tests with simulated environment) don't mix it with 139 | the main file and use [test_selectors.yml](test_selectors.yml) instead. This file is used only for testing purposes. 140 | 141 | 142 | #### Adding new client libraries 143 | 144 | If you need a support for a new language, please open a PR with the following changes: 145 | 146 | - Library codebase is in a separate directory 147 | - Library uses selectors.yml as a source of truth 148 | - Proper Github workflow is present to make sure code compiles and tests pass 149 | 150 | -------------------------------------------------------------------------------- /aptos.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | 7 | "gopkg.in/yaml.v3" 8 | ) 9 | 10 | //go:generate go run genchains_aptos.go 11 | 12 | //go:embed selectors_aptos.yml 13 | var aptosSelectorsYml []byte 14 | 15 | var ( 16 | aptosSelectorsMap = parseAptosYml(aptosSelectorsYml) 17 | aptosChainsBySelector = make(map[uint64]AptosChain) 18 | ) 19 | 20 | func init() { 21 | for _, v := range AptosALL { 22 | aptosChainsBySelector[v.Selector] = v 23 | } 24 | } 25 | 26 | func parseAptosYml(ymlFile []byte) map[uint64]ChainDetails { 27 | type ymlData struct { 28 | SelectorsByAptosChainId map[uint64]ChainDetails `yaml:"selectors"` 29 | } 30 | 31 | var data ymlData 32 | err := yaml.Unmarshal(ymlFile, &data) 33 | if err != nil { 34 | panic(err) 35 | } 36 | 37 | validateAptosChainID(data.SelectorsByAptosChainId) 38 | return data.SelectorsByAptosChainId 39 | } 40 | 41 | func validateAptosChainID(data map[uint64]ChainDetails) { 42 | // TODO: https://smartcontract-it.atlassian.net/browse/NONEVM-890 43 | } 44 | 45 | func AptosChainIdToChainSelector() map[uint64]uint64 { 46 | copyMap := make(map[uint64]uint64, len(aptosSelectorsMap)) 47 | for k, v := range aptosSelectorsMap { 48 | copyMap[k] = v.ChainSelector 49 | } 50 | return copyMap 51 | } 52 | 53 | func AptosNameFromChainId(chainId uint64) (string, error) { 54 | details, exist := aptosSelectorsMap[chainId] 55 | if !exist { 56 | return "", fmt.Errorf("chain name not found for chain %v", chainId) 57 | } 58 | if details.ChainName == "" { 59 | return fmt.Sprint(chainId), nil 60 | } 61 | return details.ChainName, nil 62 | } 63 | 64 | func AptosChainIdFromSelector(selector uint64) (uint64, error) { 65 | chain, exist := aptosChainsBySelector[selector] 66 | if !exist { 67 | return 0, fmt.Errorf("chain id not found for selector %d", selector) 68 | } 69 | 70 | return chain.ChainID, nil 71 | } 72 | 73 | func AptosChainBySelector(selector uint64) (AptosChain, bool) { 74 | chain, exist := aptosChainsBySelector[selector] 75 | return chain, exist 76 | } 77 | -------------------------------------------------------------------------------- /aptos_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "github.com/stretchr/testify/require" 9 | ) 10 | 11 | func Test_AptosYmlAreValid(t *testing.T) { 12 | tests := []struct { 13 | name string 14 | chainSelector uint64 15 | chainsId uint64 16 | expectErr bool 17 | }{ 18 | { 19 | name: "aptos-mainnet", 20 | chainSelector: 124615329519749607, 21 | chainsId: 1, 22 | expectErr: false, 23 | }, 24 | { 25 | name: "aptos-testnet", 26 | chainSelector: 6302590918974934319, 27 | chainsId: 2, 28 | expectErr: false, 29 | }, 30 | { 31 | name: "non-existing", 32 | chainSelector: 81923186267, 33 | chainsId: 471, 34 | expectErr: true, 35 | }, 36 | } 37 | for _, test := range tests { 38 | t.Run(test.name, func(t *testing.T) { 39 | name, err1 := AptosNameFromChainId(test.chainsId) 40 | if test.expectErr { 41 | require.Error(t, err1) 42 | return 43 | } 44 | require.NoError(t, err1) 45 | assert.Equal(t, test.name, name) 46 | }) 47 | } 48 | } 49 | 50 | func Test_AptosChainSelectors(t *testing.T) { 51 | for selector, chain := range aptosChainsBySelector { 52 | family, err := GetSelectorFamily(selector) 53 | require.NoError(t, err, 54 | "selector %v should be returned as aptos family, but received %v", 55 | selector, err) 56 | require.NotEmpty(t, family) 57 | require.Equal(t, FamilyAptos, family) 58 | 59 | id, err := AptosChainIdFromSelector(selector) 60 | require.Nil(t, err) 61 | require.Equal(t, chain.ChainID, id) 62 | 63 | returnedChain, exists := AptosChainBySelector(selector) 64 | require.True(t, exists) 65 | require.Equal(t, returnedChain.ChainID, id) 66 | require.Equal(t, id, returnedChain.ChainID) 67 | } 68 | } 69 | 70 | func Test_AptosGetChainDetailsByChainIDAndFamily(t *testing.T) { 71 | for k, v := range aptosSelectorsMap { 72 | details, err := GetChainDetailsByChainIDAndFamily(fmt.Sprint(k), FamilyAptos) 73 | assert.NoError(t, err) 74 | assert.Equal(t, v, details) 75 | } 76 | } 77 | 78 | func Test_AptosGetChainIDByChainSelector(t *testing.T) { 79 | for k, v := range aptosSelectorsMap { 80 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 81 | assert.NoError(t, err) 82 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /evm.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | "strconv" 7 | 8 | "gopkg.in/yaml.v3" 9 | ) 10 | 11 | //go:generate go run genchains_evm.go 12 | 13 | //go:embed selectors.yml 14 | var selectorsYml []byte 15 | 16 | //go:embed test_selectors.yml 17 | var testSelectorsYml []byte 18 | 19 | type ChainDetails struct { 20 | ChainSelector uint64 `yaml:"selector"` 21 | ChainName string `yaml:"name"` 22 | } 23 | 24 | var ( 25 | evmSelectorsMap = parseYml(selectorsYml) 26 | evmTestSelectorsMap = parseYml(testSelectorsYml) 27 | evmChainIdToChainSelector = loadAllEVMSelectors() 28 | evmChainsBySelector = make(map[uint64]Chain) 29 | evmChainsByEvmChainID = make(map[uint64]Chain) 30 | ) 31 | 32 | func init() { 33 | for _, ch := range ALL { 34 | evmChainsBySelector[ch.Selector] = ch 35 | evmChainsByEvmChainID[ch.EvmChainID] = ch 36 | } 37 | } 38 | 39 | func loadAllEVMSelectors() map[uint64]ChainDetails { 40 | output := make(map[uint64]ChainDetails, len(evmSelectorsMap)+len(evmTestSelectorsMap)) 41 | for k, v := range evmSelectorsMap { 42 | output[k] = v 43 | } 44 | for k, v := range evmTestSelectorsMap { 45 | output[k] = v 46 | } 47 | return output 48 | } 49 | 50 | func parseYml(ymlFile []byte) map[uint64]ChainDetails { 51 | type ymlData struct { 52 | SelectorsByEvmChainId map[uint64]ChainDetails `yaml:"selectors"` 53 | } 54 | 55 | var data ymlData 56 | err := yaml.Unmarshal(ymlFile, &data) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | return data.SelectorsByEvmChainId 62 | } 63 | 64 | func EvmChainIdToChainSelector() map[uint64]uint64 { 65 | copyMap := make(map[uint64]uint64, len(evmChainIdToChainSelector)) 66 | for k, v := range evmChainIdToChainSelector { 67 | copyMap[k] = v.ChainSelector 68 | } 69 | return copyMap 70 | } 71 | 72 | // Deprecated, this only supports EVM chains, use the chain agnostic `GetChainIDFromSelector` instead 73 | func ChainIdFromSelector(chainSelectorId uint64) (uint64, error) { 74 | for k, v := range evmChainIdToChainSelector { 75 | if v.ChainSelector == chainSelectorId { 76 | return k, nil 77 | } 78 | } 79 | return 0, fmt.Errorf("chain not found for chain selector %d", chainSelectorId) 80 | } 81 | 82 | // Deprecated, this only supports EVM chains, use the chain agnostic `GetChainDetailsByChainIDAndFamily` instead 83 | func SelectorFromChainId(chainId uint64) (uint64, error) { 84 | if chainSelectorId, exist := evmChainIdToChainSelector[chainId]; exist { 85 | return chainSelectorId.ChainSelector, nil 86 | } 87 | return 0, fmt.Errorf("chain selector not found for chain %d", chainId) 88 | } 89 | 90 | // Deprecated, this only supports EVM chains, use the chain agnostic `NameFromChainId` instead 91 | func NameFromChainId(chainId uint64) (string, error) { 92 | details, exist := evmChainIdToChainSelector[chainId] 93 | if !exist { 94 | return "", fmt.Errorf("chain name not found for chain %d", chainId) 95 | } 96 | if details.ChainName == "" { 97 | return strconv.FormatUint(chainId, 10), nil 98 | } 99 | return details.ChainName, nil 100 | } 101 | 102 | func ChainIdFromName(name string) (uint64, error) { 103 | for k, v := range evmChainIdToChainSelector { 104 | if v.ChainName == name { 105 | return k, nil 106 | } 107 | } 108 | chainId, err := strconv.ParseUint(name, 10, 64) 109 | if err == nil { 110 | if details, exist := evmChainIdToChainSelector[chainId]; exist && details.ChainName == "" { 111 | return chainId, nil 112 | } 113 | } 114 | return 0, fmt.Errorf("chain not found for name %s", name) 115 | } 116 | 117 | func TestChainIds() []uint64 { 118 | chainIds := make([]uint64, 0, len(evmTestSelectorsMap)) 119 | for k := range evmTestSelectorsMap { 120 | chainIds = append(chainIds, k) 121 | } 122 | return chainIds 123 | } 124 | 125 | func ChainBySelector(sel uint64) (Chain, bool) { 126 | ch, exists := evmChainsBySelector[sel] 127 | return ch, exists 128 | } 129 | 130 | func ChainByEvmChainID(evmChainID uint64) (Chain, bool) { 131 | ch, exists := evmChainsByEvmChainID[evmChainID] 132 | return ch, exists 133 | } 134 | 135 | func IsEvm(chainSel uint64) (bool, error) { 136 | _, exists := ChainBySelector(chainSel) 137 | if !exists { 138 | return false, fmt.Errorf("chain %d not found", chainSel) 139 | } 140 | // We always return true since only evm chains are supported atm. 141 | return true, nil 142 | } 143 | -------------------------------------------------------------------------------- /evm_e2e_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors_test 2 | 3 | import ( 4 | "testing" 5 | 6 | chain_selectors "github.com/smartcontractkit/chain-selectors" 7 | "github.com/stretchr/testify/assert" 8 | ) 9 | 10 | func TestAccessGeneratedChain(t *testing.T) { 11 | assert.Equal(t, uint64(43114), chain_selectors.AVALANCHE_MAINNET.EvmChainID) 12 | } 13 | -------------------------------------------------------------------------------- /evm_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "math/rand" 6 | "strconv" 7 | "testing" 8 | 9 | "github.com/stretchr/testify/assert" 10 | "github.com/stretchr/testify/require" 11 | ) 12 | 13 | func TestNoSameChainSelectorsAreGenerated(t *testing.T) { 14 | chainSelectors := map[uint64]struct{}{} 15 | 16 | for k, v := range evmChainIdToChainSelector { 17 | selector := v.ChainSelector 18 | _, exist := chainSelectors[selector] 19 | assert.False(t, exist, "Chain Selectors should be unique. Selector %d is duplicated for chain %d", selector, k) 20 | chainSelectors[selector] = struct{}{} 21 | } 22 | } 23 | 24 | func TestNoOverlapBetweenRealAndTestChains(t *testing.T) { 25 | for k, _ := range evmSelectorsMap { 26 | _, exist := evmTestSelectorsMap[k] 27 | assert.False(t, exist, "Chain %d is duplicated between real and test chains", k) 28 | } 29 | } 30 | 31 | func TestBothSelectorsYmlAndTestSelectorsYmlAreValid(t *testing.T) { 32 | optimismGoerliSelector, err := SelectorFromChainId(420) 33 | require.NoError(t, err) 34 | assert.Equal(t, uint64(2664363617261496610), optimismGoerliSelector) 35 | 36 | testChainSelector, err := SelectorFromChainId(90000020) 37 | require.NoError(t, err) 38 | assert.Equal(t, uint64(17810359353458878177), testChainSelector) 39 | } 40 | 41 | func TestEvmChainIdToChainSelectorReturningCopiedMap(t *testing.T) { 42 | selectors := EvmChainIdToChainSelector() 43 | selectors[1] = 2 44 | 45 | _, err := ChainIdFromSelector(2) 46 | assert.Error(t, err) 47 | 48 | _, err = ChainIdFromSelector(1) 49 | assert.Error(t, err) 50 | } 51 | 52 | func TestAllChainSelectorsHaveFamilies(t *testing.T) { 53 | for _, ch := range ALL { 54 | family, err := GetSelectorFamily(ch.Selector) 55 | require.NoError(t, err, 56 | "Family not found for selector %d (chain id %d, name %s), please update selector.yml with the appropriate chain family for this chain", 57 | ch.Selector, ch.EvmChainID, ch.Name) 58 | require.NotEmpty(t, family) 59 | require.Equal(t, FamilyEVM, family) 60 | } 61 | } 62 | 63 | func Test_ChainSelectors(t *testing.T) { 64 | tests := []struct { 65 | name string 66 | chainSelector uint64 67 | chainId uint64 68 | expectErr bool 69 | }{ 70 | { 71 | name: "bsc chain", 72 | chainSelector: 13264668187771770619, 73 | chainId: 97, 74 | }, 75 | { 76 | name: "optimism chain", 77 | chainSelector: 2664363617261496610, 78 | chainId: 420, 79 | }, 80 | { 81 | name: "test chain", 82 | chainSelector: 17810359353458878177, 83 | chainId: 90000020, 84 | }, 85 | { 86 | name: "not existing chain", 87 | chainSelector: 120398123, 88 | chainId: 123454312, 89 | expectErr: true, 90 | }, 91 | { 92 | name: "invalid selector and chain id", 93 | chainSelector: 0, 94 | chainId: 0, 95 | expectErr: true, 96 | }, 97 | } 98 | 99 | for _, test := range tests { 100 | t.Run(test.name, func(t *testing.T) { 101 | chainId, err1 := ChainIdFromSelector(test.chainSelector) 102 | chainSelector, err2 := SelectorFromChainId(test.chainId) 103 | if test.expectErr { 104 | require.Error(t, err1) 105 | require.Error(t, err2) 106 | return 107 | } 108 | require.NoError(t, err1) 109 | assert.Equal(t, test.chainId, chainId) 110 | 111 | require.NoError(t, err2) 112 | assert.Equal(t, test.chainSelector, chainSelector) 113 | }) 114 | } 115 | } 116 | 117 | func Test_TestChainIds(t *testing.T) { 118 | chainIds := TestChainIds() 119 | assert.Equal(t, len(chainIds), len(evmTestSelectorsMap), "Should return correct number of test chain ids") 120 | 121 | for _, chainId := range chainIds { 122 | _, exist := evmTestSelectorsMap[chainId] 123 | assert.True(t, exist) 124 | } 125 | } 126 | 127 | func Test_ChainNames(t *testing.T) { 128 | tests := []struct { 129 | name string 130 | chainName string 131 | chainId uint64 132 | expectErr bool 133 | }{ 134 | { 135 | name: "zkevm chain with a dedicated name", 136 | chainName: "ethereum-testnet-goerli-polygon-zkevm-1", 137 | chainId: 1442, 138 | }, 139 | { 140 | name: "bsc chain with a dedicated name", 141 | chainName: "binance_smart_chain-testnet", 142 | chainId: 97, 143 | }, 144 | { 145 | name: "chain without a name defined", 146 | chainName: "geth-testnet", 147 | chainId: 1337, 148 | }, 149 | { 150 | name: "test simulated chain without a dedicated name", 151 | chainName: "90000013", 152 | chainId: 90000013, 153 | }, 154 | { 155 | name: "not existing chain", 156 | chainName: "avalanche-testnet-mumbai-1", 157 | chainId: 120398123, 158 | expectErr: true, 159 | }, 160 | { 161 | name: "should return error if chain id passed as a name for chain with a full name", 162 | chainName: "1", 163 | expectErr: true, 164 | }, 165 | } 166 | 167 | for _, test := range tests { 168 | t.Run(test.name, func(t *testing.T) { 169 | chainId, err1 := ChainIdFromName(test.chainName) 170 | chainName, err2 := NameFromChainId(test.chainId) 171 | if test.expectErr { 172 | require.Error(t, err1) 173 | require.Error(t, err2) 174 | return 175 | } 176 | require.NoError(t, err1) 177 | assert.Equal(t, test.chainId, chainId) 178 | 179 | require.NoError(t, err2) 180 | assert.Equal(t, test.chainName, chainName) 181 | }) 182 | } 183 | } 184 | 185 | func Test_ChainBySelector(t *testing.T) { 186 | t.Run("exist", func(t *testing.T) { 187 | for _, ch := range ALL { 188 | v, exists := ChainBySelector(ch.Selector) 189 | assert.True(t, exists) 190 | assert.Equal(t, ch, v) 191 | } 192 | }) 193 | 194 | t.Run("non existent", func(t *testing.T) { 195 | _, exists := ChainBySelector(rand.Uint64()) 196 | assert.False(t, exists) 197 | }) 198 | } 199 | 200 | func Test_ChainByEvmChainID(t *testing.T) { 201 | t.Run("exist", func(t *testing.T) { 202 | for _, ch := range ALL { 203 | v, exists := ChainByEvmChainID(ch.EvmChainID) 204 | assert.True(t, exists) 205 | assert.Equal(t, ch, v) 206 | } 207 | }) 208 | 209 | t.Run("non existent", func(t *testing.T) { 210 | _, exists := ChainByEvmChainID(rand.Uint64()) 211 | assert.False(t, exists) 212 | }) 213 | } 214 | 215 | func Test_IsEvm(t *testing.T) { 216 | t.Run("exist", func(t *testing.T) { 217 | for _, ch := range ALL { 218 | isEvm, err := IsEvm(ch.Selector) 219 | assert.NoError(t, err) 220 | assert.True(t, isEvm) 221 | } 222 | }) 223 | 224 | t.Run("non existent", func(t *testing.T) { 225 | isEvm, err := IsEvm(rand.Uint64()) 226 | assert.Error(t, err) 227 | assert.False(t, isEvm) 228 | }) 229 | } 230 | 231 | func Test_EVMGetChainDetailsByChainIDAndFamily(t *testing.T) { 232 | for k, v := range evmChainIdToChainSelector { 233 | strChainID := strconv.FormatUint(k, 10) 234 | details, err := GetChainDetailsByChainIDAndFamily(strChainID, FamilyEVM) 235 | assert.NoError(t, err) 236 | assert.Equal(t, v, details) 237 | } 238 | } 239 | 240 | func Test_EVMGetChainIDByChainSelector(t *testing.T) { 241 | for k, v := range evmSelectorsMap { 242 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 243 | assert.NoError(t, err) 244 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 245 | } 246 | } 247 | -------------------------------------------------------------------------------- /genchains_aptos.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | "unicode" 15 | 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_aptos.go" 20 | 21 | type chain struct { 22 | ChainID uint64 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type AptosChain struct { 32 | ChainID uint64 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = AptosChain{ChainID: {{ .ChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var AptosALL = []AptosChain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | panic(err) 64 | } 65 | 66 | if string(existingContent) == string(formatted) { 67 | fmt.Println("aptos: no changes detected") 68 | return 69 | } 70 | fmt.Println("aptos: updating generations") 71 | 72 | err = os.WriteFile(filename, formatted, 0644) 73 | if err != nil { 74 | panic(err) 75 | } 76 | } 77 | 78 | func genChainsSourceCode() (string, error) { 79 | var wr = new(bytes.Buffer) 80 | chains := make([]chain, 0) 81 | 82 | for ChainID, chainSel := range chain_selectors.AptosChainIdToChainSelector() { 83 | name, err := chain_selectors.AptosNameFromChainId(ChainID) 84 | if err != nil { 85 | return "", err 86 | } 87 | 88 | chains = append(chains, chain{ 89 | ChainID: ChainID, 90 | Selector: chainSel, 91 | Name: name, 92 | VarName: toVarName(name, chainSel), 93 | }) 94 | } 95 | 96 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 97 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 98 | return "", err 99 | } 100 | return wr.String(), nil 101 | } 102 | 103 | func toVarName(name string, chainSel uint64) string { 104 | const unnamed = "TEST" 105 | x := strings.ReplaceAll(name, "-", "_") 106 | x = strings.ToUpper(x) 107 | if len(x) > 0 && unicode.IsDigit(rune(x[0])) { 108 | x = unnamed + "_" + x 109 | } 110 | if len(x) == 0 { 111 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 112 | } 113 | return x 114 | } 115 | -------------------------------------------------------------------------------- /genchains_evm.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | "unicode" 15 | 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_evm.go" 20 | 21 | type chain struct { 22 | EvmChainID uint64 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type Chain struct { 32 | EvmChainID uint64 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = Chain{EvmChainID: {{ .EvmChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var ALL = []Chain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | panic(err) 64 | } 65 | 66 | if string(existingContent) == string(formatted) { 67 | fmt.Println("evm: no changes detected") 68 | return 69 | } 70 | fmt.Println("evm: updating generations") 71 | 72 | err = os.WriteFile(filename, formatted, 0644) 73 | if err != nil { 74 | panic(err) 75 | } 76 | } 77 | 78 | func genChainsSourceCode() (string, error) { 79 | var wr = new(bytes.Buffer) 80 | chains := make([]chain, 0) 81 | 82 | for evmChainID, chainSel := range chain_selectors.EvmChainIdToChainSelector() { 83 | name, err := chain_selectors.NameFromChainId(evmChainID) 84 | if err != nil { 85 | return "", err 86 | } 87 | 88 | chains = append(chains, chain{ 89 | EvmChainID: evmChainID, 90 | Selector: chainSel, 91 | Name: name, 92 | VarName: toVarName(name, chainSel), 93 | }) 94 | } 95 | 96 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 97 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 98 | return "", err 99 | } 100 | return wr.String(), nil 101 | } 102 | 103 | func toVarName(name string, chainSel uint64) string { 104 | const unnamed = "TEST" 105 | x := strings.ReplaceAll(name, "-", "_") 106 | x = strings.ToUpper(x) 107 | if len(x) > 0 && unicode.IsDigit(rune(x[0])) { 108 | x = unnamed + "_" + x 109 | } 110 | if len(x) == 0 { 111 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 112 | } 113 | return x 114 | } 115 | -------------------------------------------------------------------------------- /genchains_solana.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | 15 | "github.com/mr-tron/base58" 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_solana.go" 20 | 21 | type chain struct { 22 | ChainID string 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type SolanaChain struct { 32 | ChainID string 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = SolanaChain{ChainID: "{{ .ChainID }}", Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var SolanaALL = []SolanaChain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | panic(err) 64 | } 65 | 66 | if string(existingContent) == string(formatted) { 67 | fmt.Println("solana: no changes detected") 68 | return 69 | } 70 | fmt.Println("solana: updating generations") 71 | 72 | err = os.WriteFile(filename, formatted, 0644) 73 | if err != nil { 74 | panic(err) 75 | } 76 | } 77 | 78 | func genChainsSourceCode() (string, error) { 79 | var wr = new(bytes.Buffer) 80 | chains := make([]chain, 0) 81 | 82 | for ChainID, chainSel := range chain_selectors.SolanaChainIdToChainSelector() { 83 | name, err := chain_selectors.SolanaNameFromChainId(ChainID) 84 | if err != nil { 85 | return "", err 86 | } 87 | 88 | chains = append(chains, chain{ 89 | ChainID: ChainID, 90 | Selector: chainSel, 91 | Name: name, 92 | VarName: toVarName(name, chainSel), 93 | }) 94 | } 95 | 96 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 97 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 98 | return "", err 99 | } 100 | return wr.String(), nil 101 | } 102 | 103 | func toVarName(name string, chainSel uint64) string { 104 | const unnamed = "TEST" 105 | x := strings.ReplaceAll(name, "-", "_") 106 | x = strings.ToUpper(x) 107 | 108 | // if len(x) > 0 && unicode.IsDigit(rune(x[0])) 109 | // for evm, the above condition is used to detect if name == chainId == (some number) -> which means its a test chain 110 | // for solana, as chainId is not a number but a base58 encoded hash, we cannot use the above condition 111 | // we need to check if the name == chainId == a valid base58 encoded hash 112 | 113 | _, err := base58.Decode(name) 114 | if err == nil { 115 | x = unnamed + "_" + x 116 | } 117 | if len(x) == 0 { 118 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 119 | } 120 | return x 121 | } 122 | -------------------------------------------------------------------------------- /genchains_sui.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | "unicode" 15 | 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_sui.go" 20 | 21 | type chain struct { 22 | ChainID uint64 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type SuiChain struct { 32 | ChainID uint64 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = SuiChain{ChainID: {{ .ChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var SuiALL = []SuiChain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | panic(err) 64 | } 65 | 66 | if string(existingContent) == string(formatted) { 67 | fmt.Println("sui: no changes detected") 68 | return 69 | } 70 | fmt.Println("sui: updating generations") 71 | 72 | err = os.WriteFile(filename, formatted, 0644) 73 | if err != nil { 74 | panic(err) 75 | } 76 | } 77 | 78 | func genChainsSourceCode() (string, error) { 79 | var wr = new(bytes.Buffer) 80 | chains := make([]chain, 0) 81 | 82 | for ChainID, chainSel := range chain_selectors.SuiChainIdToChainSelector() { 83 | name, err := chain_selectors.SuiNameFromChainId(ChainID) 84 | if err != nil { 85 | return "", err 86 | } 87 | 88 | chains = append(chains, chain{ 89 | ChainID: ChainID, 90 | Selector: chainSel, 91 | Name: name, 92 | VarName: toVarName(name, chainSel), 93 | }) 94 | } 95 | 96 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 97 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 98 | return "", err 99 | } 100 | return wr.String(), nil 101 | } 102 | 103 | func toVarName(name string, chainSel uint64) string { 104 | const unnamed = "TEST" 105 | x := strings.ReplaceAll(name, "-", "_") 106 | x = strings.ToUpper(x) 107 | if len(x) > 0 && unicode.IsDigit(rune(x[0])) { 108 | x = unnamed + "_" + x 109 | } 110 | if len(x) == 0 { 111 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 112 | } 113 | return x 114 | } 115 | -------------------------------------------------------------------------------- /genchains_ton.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | "unicode" 15 | 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_ton.go" 20 | 21 | type chain struct { 22 | ChainID int32 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type TonChain struct { 32 | ChainID int32 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = TonChain{ChainID: {{ .ChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var TonALL = []TonChain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | if os.IsNotExist(err) { 64 | fmt.Println("ton: no existing generations found") 65 | existingContent = nil 66 | } else { 67 | panic(err) 68 | } 69 | } 70 | 71 | if string(existingContent) == string(formatted) { 72 | fmt.Println("ton: no changes detected") 73 | return 74 | } 75 | fmt.Println("ton: updating generations") 76 | 77 | err = os.WriteFile(filename, formatted, 0644) 78 | if err != nil { 79 | panic(err) 80 | } 81 | } 82 | 83 | func genChainsSourceCode() (string, error) { 84 | var wr = new(bytes.Buffer) 85 | chains := make([]chain, 0) 86 | 87 | for ChainID, chainSel := range chain_selectors.TonChainIdToChainSelector() { 88 | name, err := chain_selectors.TonNameFromChainId(ChainID) 89 | if err != nil { 90 | return "", err 91 | } 92 | 93 | chains = append(chains, chain{ 94 | ChainID: ChainID, 95 | Selector: chainSel, 96 | Name: name, 97 | VarName: toVarName(name, chainSel), 98 | }) 99 | } 100 | 101 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 102 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 103 | return "", err 104 | } 105 | return wr.String(), nil 106 | } 107 | 108 | func toVarName(name string, chainSel uint64) string { 109 | const unnamed = "TEST" 110 | x := strings.ReplaceAll(name, "-", "_") 111 | x = strings.ToUpper(x) 112 | if len(x) > 0 && unicode.IsDigit(rune(x[0])) { 113 | x = unnamed + "_" + x 114 | } 115 | if len(x) == 0 { 116 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 117 | } 118 | return x 119 | } 120 | -------------------------------------------------------------------------------- /genchains_tron.go: -------------------------------------------------------------------------------- 1 | //go:build ignore 2 | 3 | package main 4 | 5 | import ( 6 | "bytes" 7 | "fmt" 8 | "go/format" 9 | "html/template" 10 | "os" 11 | "sort" 12 | "strconv" 13 | "strings" 14 | "unicode" 15 | 16 | chain_selectors "github.com/smartcontractkit/chain-selectors" 17 | ) 18 | 19 | const filename = "generated_chains_tron.go" 20 | 21 | type chain struct { 22 | ChainID uint64 23 | Selector uint64 24 | Name string 25 | VarName string 26 | } 27 | 28 | var chainTemplate, _ = template.New("").Parse(`// Code generated by go generate please DO NOT EDIT 29 | package chain_selectors 30 | 31 | type TronChain struct { 32 | ChainID uint64 33 | Selector uint64 34 | Name string 35 | VarName string 36 | } 37 | 38 | var ( 39 | {{ range . }} 40 | {{.VarName}} = TronChain{ChainID: {{ .ChainID }}, Selector: {{ .Selector }}, Name: "{{ .Name }}"}{{ end }} 41 | ) 42 | 43 | var TronALL = []TronChain{ 44 | {{ range . }}{{ .VarName }}, 45 | {{ end }} 46 | } 47 | 48 | `) 49 | 50 | func main() { 51 | src, err := genChainsSourceCode() 52 | if err != nil { 53 | panic(err) 54 | } 55 | 56 | formatted, err := format.Source([]byte(src)) 57 | if err != nil { 58 | panic(err) 59 | } 60 | 61 | existingContent, err := os.ReadFile(filename) 62 | if err != nil { 63 | if os.IsNotExist(err) { 64 | fmt.Println("tron: no existing generations found") 65 | existingContent = nil 66 | } else { 67 | panic(err) 68 | } 69 | } 70 | 71 | if string(existingContent) == string(formatted) { 72 | fmt.Println("tron: no changes detected") 73 | return 74 | } 75 | fmt.Println("tron: updating generations") 76 | 77 | err = os.WriteFile(filename, formatted, 0644) 78 | if err != nil { 79 | panic(err) 80 | } 81 | } 82 | 83 | func genChainsSourceCode() (string, error) { 84 | var wr = new(bytes.Buffer) 85 | chains := make([]chain, 0) 86 | 87 | for ChainID, chainSel := range chain_selectors.TronChainIdToChainSelector() { 88 | name, err := chain_selectors.TronNameFromChainId(ChainID) 89 | if err != nil { 90 | return "", err 91 | } 92 | 93 | chains = append(chains, chain{ 94 | ChainID: ChainID, 95 | Selector: chainSel, 96 | Name: name, 97 | VarName: toVarName(name, chainSel), 98 | }) 99 | } 100 | 101 | sort.Slice(chains, func(i, j int) bool { return chains[i].VarName < chains[j].VarName }) 102 | if err := chainTemplate.ExecuteTemplate(wr, "", chains); err != nil { 103 | return "", err 104 | } 105 | return wr.String(), nil 106 | } 107 | 108 | func toVarName(name string, chainSel uint64) string { 109 | const unnamed = "TEST" 110 | x := strings.ReplaceAll(name, "-", "_") 111 | x = strings.ToUpper(x) 112 | if len(x) > 0 && unicode.IsDigit(rune(x[0])) { 113 | x = unnamed + "_" + x 114 | } 115 | if len(x) == 0 { 116 | x = unnamed + "_" + strconv.FormatUint(chainSel, 10) 117 | } 118 | return x 119 | } 120 | -------------------------------------------------------------------------------- /generated_chains_aptos.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type AptosChain struct { 5 | ChainID uint64 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | APTOS_LOCALNET = AptosChain{ChainID: 4, Selector: 4457093679053095497, Name: "aptos-localnet"} 13 | APTOS_MAINNET = AptosChain{ChainID: 1, Selector: 4741433654826277614, Name: "aptos-mainnet"} 14 | APTOS_TESTNET = AptosChain{ChainID: 2, Selector: 743186221051783445, Name: "aptos-testnet"} 15 | ) 16 | 17 | var AptosALL = []AptosChain{ 18 | APTOS_LOCALNET, 19 | APTOS_MAINNET, 20 | APTOS_TESTNET, 21 | } 22 | -------------------------------------------------------------------------------- /generated_chains_evm.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type Chain struct { 5 | EvmChainID uint64 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | ABSTRACT_MAINNET = Chain{EvmChainID: 2741, Selector: 3577778157919314504, Name: "abstract-mainnet"} 13 | ABSTRACT_TESTNET = Chain{EvmChainID: 11124, Selector: 16235373811196386733, Name: "abstract-testnet"} 14 | ANVIL_DEVNET = Chain{EvmChainID: 31337, Selector: 7759470850252068959, Name: "anvil-devnet"} 15 | APECHAIN_MAINNET = Chain{EvmChainID: 33139, Selector: 14894068710063348487, Name: "apechain-mainnet"} 16 | APECHAIN_TESTNET_CURTIS = Chain{EvmChainID: 33111, Selector: 9900119385908781505, Name: "apechain-testnet-curtis"} 17 | AREON_MAINNET = Chain{EvmChainID: 463, Selector: 1939936305787790600, Name: "areon-mainnet"} 18 | AREON_TESTNET = Chain{EvmChainID: 462, Selector: 7317911323415911000, Name: "areon-testnet"} 19 | AVALANCHE_MAINNET = Chain{EvmChainID: 43114, Selector: 6433500567565415381, Name: "avalanche-mainnet"} 20 | AVALANCHE_SUBNET_DEXALOT_MAINNET = Chain{EvmChainID: 432204, Selector: 5463201557265485081, Name: "avalanche-subnet-dexalot-mainnet"} 21 | AVALANCHE_SUBNET_DEXALOT_TESTNET = Chain{EvmChainID: 432201, Selector: 1458281248224512906, Name: "avalanche-subnet-dexalot-testnet"} 22 | AVALANCHE_TESTNET_FUJI = Chain{EvmChainID: 43113, Selector: 14767482510784806043, Name: "avalanche-testnet-fuji"} 23 | AVALANCHE_TESTNET_NEXON = Chain{EvmChainID: 595581, Selector: 7837562506228496256, Name: "avalanche-testnet-nexon"} 24 | BERACHAIN_MAINNET = Chain{EvmChainID: 80094, Selector: 1294465214383781161, Name: "berachain-mainnet"} 25 | BERACHAIN_TESTNET_ARTIO = Chain{EvmChainID: 80085, Selector: 12336603543561911511, Name: "berachain-testnet-artio"} 26 | BERACHAIN_TESTNET_BARTIO = Chain{EvmChainID: 80084, Selector: 8999465244383784164, Name: "berachain-testnet-bartio"} 27 | BERACHAIN_TESTNET_BEPOLIA = Chain{EvmChainID: 80069, Selector: 7728255861635209484, Name: "berachain-testnet-bepolia"} 28 | BINANCE_SMART_CHAIN_MAINNET = Chain{EvmChainID: 56, Selector: 11344663589394136015, Name: "binance_smart_chain-mainnet"} 29 | BINANCE_SMART_CHAIN_MAINNET_OPBNB_1 = Chain{EvmChainID: 204, Selector: 465944652040885897, Name: "binance_smart_chain-mainnet-opbnb-1"} 30 | BINANCE_SMART_CHAIN_TESTNET = Chain{EvmChainID: 97, Selector: 13264668187771770619, Name: "binance_smart_chain-testnet"} 31 | BINANCE_SMART_CHAIN_TESTNET_OPBNB_1 = Chain{EvmChainID: 5611, Selector: 13274425992935471758, Name: "binance_smart_chain-testnet-opbnb-1"} 32 | BITCICHAIN_MAINNET = Chain{EvmChainID: 1907, Selector: 4874388048629246000, Name: "bitcichain-mainnet"} 33 | BITCICHAIN_TESTNET = Chain{EvmChainID: 1908, Selector: 4888058894222120000, Name: "bitcichain-testnet"} 34 | BITCOIN_MAINNET_BITLAYER_1 = Chain{EvmChainID: 200901, Selector: 7937294810946806131, Name: "bitcoin-mainnet-bitlayer-1"} 35 | BITCOIN_MAINNET_BOB_1 = Chain{EvmChainID: 60808, Selector: 3849287863852499584, Name: "bitcoin-mainnet-bob-1"} 36 | BITCOIN_MAINNET_BOTANIX = Chain{EvmChainID: 3637, Selector: 4560701533377838164, Name: "bitcoin-mainnet-botanix"} 37 | BITCOIN_MAINNET_BSQUARED_1 = Chain{EvmChainID: 223, Selector: 5406759801798337480, Name: "bitcoin-mainnet-bsquared-1"} 38 | BITCOIN_MERLIN_MAINNET = Chain{EvmChainID: 4200, Selector: 241851231317828981, Name: "bitcoin-merlin-mainnet"} 39 | BITCOIN_TESTNET_BITLAYER_1 = Chain{EvmChainID: 200810, Selector: 3789623672476206327, Name: "bitcoin-testnet-bitlayer-1"} 40 | BITCOIN_TESTNET_BOTANIX = Chain{EvmChainID: 3636, Selector: 1467223411771711614, Name: "bitcoin-testnet-botanix"} 41 | BITCOIN_TESTNET_BSQUARED_1 = Chain{EvmChainID: 1123, Selector: 1948510578179542068, Name: "bitcoin-testnet-bsquared-1"} 42 | BITCOIN_TESTNET_MERLIN = Chain{EvmChainID: 686868, Selector: 5269261765892944301, Name: "bitcoin-testnet-merlin"} 43 | BITCOIN_TESTNET_ROOTSTOCK = Chain{EvmChainID: 31, Selector: 8953668971247136127, Name: "bitcoin-testnet-rootstock"} 44 | BITCOIN_TESTNET_SEPOLIA_BOB_1 = Chain{EvmChainID: 808813, Selector: 5535534526963509396, Name: "bitcoin-testnet-sepolia-bob-1"} 45 | BITTORRENT_CHAIN_MAINNET = Chain{EvmChainID: 199, Selector: 3776006016387883143, Name: "bittorrent_chain-mainnet"} 46 | BITTORRENT_CHAIN_TESTNET = Chain{EvmChainID: 1029, Selector: 4459371029167934217, Name: "bittorrent_chain-testnet"} 47 | CELO_MAINNET = Chain{EvmChainID: 42220, Selector: 1346049177634351622, Name: "celo-mainnet"} 48 | CELO_TESTNET_ALFAJORES = Chain{EvmChainID: 44787, Selector: 3552045678561919002, Name: "celo-testnet-alfajores"} 49 | COINEX_SMART_CHAIN_MAINNET = Chain{EvmChainID: 52, Selector: 1761333065194157300, Name: "coinex_smart_chain-mainnet"} 50 | COINEX_SMART_CHAIN_TESTNET = Chain{EvmChainID: 53, Selector: 8955032871639343000, Name: "coinex_smart_chain-testnet"} 51 | CONFLUX_MAINNET = Chain{EvmChainID: 1030, Selector: 3358365939762719202, Name: "conflux-mainnet"} 52 | CORE_MAINNET = Chain{EvmChainID: 1116, Selector: 1224752112135636129, Name: "core-mainnet"} 53 | CORE_TESTNET = Chain{EvmChainID: 1114, Selector: 4264732132125536123, Name: "core-testnet"} 54 | CORN_MAINNET = Chain{EvmChainID: 21000000, Selector: 9043146809313071210, Name: "corn-mainnet"} 55 | CRONOS_MAINNET = Chain{EvmChainID: 25, Selector: 1456215246176062136, Name: "cronos-mainnet"} 56 | CRONOS_TESTNET = Chain{EvmChainID: 338, Selector: 2995292832068775165, Name: "cronos-testnet"} 57 | CRONOS_TESTNET_ZKEVM_1 = Chain{EvmChainID: 282, Selector: 3842103497652714138, Name: "cronos-testnet-zkevm-1"} 58 | CRONOS_ZKEVM_MAINNET = Chain{EvmChainID: 388, Selector: 8788096068760390840, Name: "cronos-zkevm-mainnet"} 59 | CRONOS_ZKEVM_TESTNET_SEPOLIA = Chain{EvmChainID: 240, Selector: 16487132492576884721, Name: "cronos-zkevm-testnet-sepolia"} 60 | ETHEREUM_MAINNET = Chain{EvmChainID: 1, Selector: 5009297550715157269, Name: "ethereum-mainnet"} 61 | ETHEREUM_MAINNET_ARBITRUM_1 = Chain{EvmChainID: 42161, Selector: 4949039107694359620, Name: "ethereum-mainnet-arbitrum-1"} 62 | ETHEREUM_MAINNET_ARBITRUM_1_L3X_1 = Chain{EvmChainID: 12324, Selector: 3162193654116181371, Name: "ethereum-mainnet-arbitrum-1-l3x-1"} 63 | ETHEREUM_MAINNET_ARBITRUM_1_TREASURE_1 = Chain{EvmChainID: 978670, Selector: 1010349088906777999, Name: "ethereum-mainnet-arbitrum-1-treasure-1"} 64 | ETHEREUM_MAINNET_ASTAR_ZKEVM_1 = Chain{EvmChainID: 3776, Selector: 1540201334317828111, Name: "ethereum-mainnet-astar-zkevm-1"} 65 | ETHEREUM_MAINNET_BASE_1 = Chain{EvmChainID: 8453, Selector: 15971525489660198786, Name: "ethereum-mainnet-base-1"} 66 | ETHEREUM_MAINNET_BLAST_1 = Chain{EvmChainID: 81457, Selector: 4411394078118774322, Name: "ethereum-mainnet-blast-1"} 67 | ETHEREUM_MAINNET_HASHKEY_1 = Chain{EvmChainID: 177, Selector: 7613811247471741961, Name: "ethereum-mainnet-hashkey-1"} 68 | ETHEREUM_MAINNET_IMMUTABLE_ZKEVM_1 = Chain{EvmChainID: 13371, Selector: 1237925231416731909, Name: "ethereum-mainnet-immutable-zkevm-1"} 69 | ETHEREUM_MAINNET_INK_1 = Chain{EvmChainID: 57073, Selector: 3461204551265785888, Name: "ethereum-mainnet-ink-1"} 70 | ETHEREUM_MAINNET_KROMA_1 = Chain{EvmChainID: 255, Selector: 3719320017875267166, Name: "ethereum-mainnet-kroma-1"} 71 | ETHEREUM_MAINNET_LINEA_1 = Chain{EvmChainID: 59144, Selector: 4627098889531055414, Name: "ethereum-mainnet-linea-1"} 72 | ETHEREUM_MAINNET_MANTLE_1 = Chain{EvmChainID: 5000, Selector: 1556008542357238666, Name: "ethereum-mainnet-mantle-1"} 73 | ETHEREUM_MAINNET_METIS_1 = Chain{EvmChainID: 1088, Selector: 8805746078405598895, Name: "ethereum-mainnet-metis-1"} 74 | ETHEREUM_MAINNET_MODE_1 = Chain{EvmChainID: 34443, Selector: 7264351850409363825, Name: "ethereum-mainnet-mode-1"} 75 | ETHEREUM_MAINNET_OPTIMISM_1 = Chain{EvmChainID: 10, Selector: 3734403246176062136, Name: "ethereum-mainnet-optimism-1"} 76 | ETHEREUM_MAINNET_POLYGON_ZKEVM_1 = Chain{EvmChainID: 1101, Selector: 4348158687435793198, Name: "ethereum-mainnet-polygon-zkevm-1"} 77 | ETHEREUM_MAINNET_SCROLL_1 = Chain{EvmChainID: 534352, Selector: 13204309965629103672, Name: "ethereum-mainnet-scroll-1"} 78 | ETHEREUM_MAINNET_TAIKO_1 = Chain{EvmChainID: 167000, Selector: 16468599424800719238, Name: "ethereum-mainnet-taiko-1"} 79 | ETHEREUM_MAINNET_UNICHAIN_1 = Chain{EvmChainID: 130, Selector: 1923510103922296319, Name: "ethereum-mainnet-unichain-1"} 80 | ETHEREUM_MAINNET_WORLDCHAIN_1 = Chain{EvmChainID: 480, Selector: 2049429975587534727, Name: "ethereum-mainnet-worldchain-1"} 81 | ETHEREUM_MAINNET_XLAYER_1 = Chain{EvmChainID: 196, Selector: 3016212468291539606, Name: "ethereum-mainnet-xlayer-1"} 82 | ETHEREUM_MAINNET_ZIRCUIT_1 = Chain{EvmChainID: 48900, Selector: 17198166215261833993, Name: "ethereum-mainnet-zircuit-1"} 83 | ETHEREUM_MAINNET_ZKSYNC_1 = Chain{EvmChainID: 324, Selector: 1562403441176082196, Name: "ethereum-mainnet-zksync-1"} 84 | ETHEREUM_TESTNET_GOERLI_ARBITRUM_1 = Chain{EvmChainID: 421613, Selector: 6101244977088475029, Name: "ethereum-testnet-goerli-arbitrum-1"} 85 | ETHEREUM_TESTNET_GOERLI_BASE_1 = Chain{EvmChainID: 84531, Selector: 5790810961207155433, Name: "ethereum-testnet-goerli-base-1"} 86 | ETHEREUM_TESTNET_GOERLI_LINEA_1 = Chain{EvmChainID: 59140, Selector: 1355246678561316402, Name: "ethereum-testnet-goerli-linea-1"} 87 | ETHEREUM_TESTNET_GOERLI_MANTLE_1 = Chain{EvmChainID: 5001, Selector: 4168263376276232250, Name: "ethereum-testnet-goerli-mantle-1"} 88 | ETHEREUM_TESTNET_GOERLI_OPTIMISM_1 = Chain{EvmChainID: 420, Selector: 2664363617261496610, Name: "ethereum-testnet-goerli-optimism-1"} 89 | ETHEREUM_TESTNET_GOERLI_POLYGON_ZKEVM_1 = Chain{EvmChainID: 1442, Selector: 11059667695644972511, Name: "ethereum-testnet-goerli-polygon-zkevm-1"} 90 | ETHEREUM_TESTNET_GOERLI_ZKSYNC_1 = Chain{EvmChainID: 280, Selector: 6802309497652714138, Name: "ethereum-testnet-goerli-zksync-1"} 91 | ETHEREUM_TESTNET_HOLESKY = Chain{EvmChainID: 17000, Selector: 7717148896336251131, Name: "ethereum-testnet-holesky"} 92 | ETHEREUM_TESTNET_HOLESKY_FRAXTAL_1 = Chain{EvmChainID: 2522, Selector: 8901520481741771655, Name: "ethereum-testnet-holesky-fraxtal-1"} 93 | ETHEREUM_TESTNET_HOLESKY_MORPH_1 = Chain{EvmChainID: 2810, Selector: 8304510386741731151, Name: "ethereum-testnet-holesky-morph-1"} 94 | ETHEREUM_TESTNET_HOLESKY_TAIKO_1 = Chain{EvmChainID: 167009, Selector: 7248756420937879088, Name: "ethereum-testnet-holesky-taiko-1"} 95 | ETHEREUM_TESTNET_SEPOLIA = Chain{EvmChainID: 11155111, Selector: 16015286601757825753, Name: "ethereum-testnet-sepolia"} 96 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1 = Chain{EvmChainID: 421614, Selector: 3478487238524512106, Name: "ethereum-testnet-sepolia-arbitrum-1"} 97 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1_L3X_1 = Chain{EvmChainID: 12325, Selector: 3486622437121596122, Name: "ethereum-testnet-sepolia-arbitrum-1-l3x-1"} 98 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1_TREASURE_1 = Chain{EvmChainID: 978657, Selector: 10443705513486043421, Name: "ethereum-testnet-sepolia-arbitrum-1-treasure-1"} 99 | ETHEREUM_TESTNET_SEPOLIA_BASE_1 = Chain{EvmChainID: 84532, Selector: 10344971235874465080, Name: "ethereum-testnet-sepolia-base-1"} 100 | ETHEREUM_TESTNET_SEPOLIA_BLAST_1 = Chain{EvmChainID: 168587773, Selector: 2027362563942762617, Name: "ethereum-testnet-sepolia-blast-1"} 101 | ETHEREUM_TESTNET_SEPOLIA_CORN_1 = Chain{EvmChainID: 21000001, Selector: 1467427327723633929, Name: "ethereum-testnet-sepolia-corn-1"} 102 | ETHEREUM_TESTNET_SEPOLIA_HASHKEY_1 = Chain{EvmChainID: 133, Selector: 4356164186791070119, Name: "ethereum-testnet-sepolia-hashkey-1"} 103 | ETHEREUM_TESTNET_SEPOLIA_IMMUTABLE_ZKEVM_1 = Chain{EvmChainID: 13473, Selector: 4526165231216331901, Name: "ethereum-testnet-sepolia-immutable-zkevm-1"} 104 | ETHEREUM_TESTNET_SEPOLIA_KROMA_1 = Chain{EvmChainID: 2358, Selector: 5990477251245693094, Name: "ethereum-testnet-sepolia-kroma-1"} 105 | ETHEREUM_TESTNET_SEPOLIA_LENS_1 = Chain{EvmChainID: 37111, Selector: 6827576821754315911, Name: "ethereum-testnet-sepolia-lens-1"} 106 | ETHEREUM_TESTNET_SEPOLIA_LINEA_1 = Chain{EvmChainID: 59141, Selector: 5719461335882077547, Name: "ethereum-testnet-sepolia-linea-1"} 107 | ETHEREUM_TESTNET_SEPOLIA_LISK_1 = Chain{EvmChainID: 4202, Selector: 5298399861320400553, Name: "ethereum-testnet-sepolia-lisk-1"} 108 | ETHEREUM_TESTNET_SEPOLIA_MANTLE_1 = Chain{EvmChainID: 5003, Selector: 8236463271206331221, Name: "ethereum-testnet-sepolia-mantle-1"} 109 | ETHEREUM_TESTNET_SEPOLIA_METIS_1 = Chain{EvmChainID: 59902, Selector: 3777822886988675105, Name: "ethereum-testnet-sepolia-metis-1"} 110 | ETHEREUM_TESTNET_SEPOLIA_MODE_1 = Chain{EvmChainID: 919, Selector: 829525985033418733, Name: "ethereum-testnet-sepolia-mode-1"} 111 | ETHEREUM_TESTNET_SEPOLIA_OPTIMISM_1 = Chain{EvmChainID: 11155420, Selector: 5224473277236331295, Name: "ethereum-testnet-sepolia-optimism-1"} 112 | ETHEREUM_TESTNET_SEPOLIA_POLYGON_VALIDIUM_1 = Chain{EvmChainID: 717160, Selector: 4418231248214522936, Name: "ethereum-testnet-sepolia-polygon-validium-1"} 113 | ETHEREUM_TESTNET_SEPOLIA_POLYGON_ZKEVM_1 = Chain{EvmChainID: 2442, Selector: 1654667687261492630, Name: "ethereum-testnet-sepolia-polygon-zkevm-1"} 114 | ETHEREUM_TESTNET_SEPOLIA_SCROLL_1 = Chain{EvmChainID: 534351, Selector: 2279865765895943307, Name: "ethereum-testnet-sepolia-scroll-1"} 115 | ETHEREUM_TESTNET_SEPOLIA_SONEIUM_1 = Chain{EvmChainID: 1946, Selector: 686603546605904534, Name: "ethereum-testnet-sepolia-soneium-1"} 116 | ETHEREUM_TESTNET_SEPOLIA_UNICHAIN_1 = Chain{EvmChainID: 1301, Selector: 14135854469784514356, Name: "ethereum-testnet-sepolia-unichain-1"} 117 | ETHEREUM_TESTNET_SEPOLIA_WORLDCHAIN_1 = Chain{EvmChainID: 4801, Selector: 5299555114858065850, Name: "ethereum-testnet-sepolia-worldchain-1"} 118 | ETHEREUM_TESTNET_SEPOLIA_XLAYER_1 = Chain{EvmChainID: 195, Selector: 2066098519157881736, Name: "ethereum-testnet-sepolia-xlayer-1"} 119 | ETHEREUM_TESTNET_SEPOLIA_ZIRCUIT_1 = Chain{EvmChainID: 48899, Selector: 4562743618362911021, Name: "ethereum-testnet-sepolia-zircuit-1"} 120 | ETHEREUM_TESTNET_SEPOLIA_ZKSYNC_1 = Chain{EvmChainID: 300, Selector: 6898391096552792247, Name: "ethereum-testnet-sepolia-zksync-1"} 121 | ETHERLINK_MAINNET = Chain{EvmChainID: 42793, Selector: 13624601974233774587, Name: "etherlink-mainnet"} 122 | ETHERLINK_TESTNET = Chain{EvmChainID: 128123, Selector: 1910019406958449359, Name: "etherlink-testnet"} 123 | FANTOM_MAINNET = Chain{EvmChainID: 250, Selector: 3768048213127883732, Name: "fantom-mainnet"} 124 | FANTOM_TESTNET = Chain{EvmChainID: 4002, Selector: 4905564228793744293, Name: "fantom-testnet"} 125 | FILECOIN_MAINNET = Chain{EvmChainID: 314, Selector: 4561443241176882990, Name: "filecoin-mainnet"} 126 | FILECOIN_TESTNET = Chain{EvmChainID: 31415926, Selector: 7060342227814389000, Name: "filecoin-testnet"} 127 | FRAXTAL_MAINNET = Chain{EvmChainID: 252, Selector: 1462016016387883143, Name: "fraxtal-mainnet"} 128 | GETH_DEVNET_2 = Chain{EvmChainID: 2337, Selector: 12922642891491394802, Name: "geth-devnet-2"} 129 | GETH_DEVNET_3 = Chain{EvmChainID: 3337, Selector: 4793464827907405086, Name: "geth-devnet-3"} 130 | GETH_TESTNET = Chain{EvmChainID: 1337, Selector: 3379446385462418246, Name: "geth-testnet"} 131 | GNOSIS_CHAIN_MAINNET = Chain{EvmChainID: 100, Selector: 465200170687744372, Name: "gnosis_chain-mainnet"} 132 | GNOSIS_CHAIN_TESTNET_CHIADO = Chain{EvmChainID: 10200, Selector: 8871595565390010547, Name: "gnosis_chain-testnet-chiado"} 133 | HEDERA_MAINNET = Chain{EvmChainID: 295, Selector: 3229138320728879060, Name: "hedera-mainnet"} 134 | HEDERA_TESTNET = Chain{EvmChainID: 296, Selector: 222782988166878823, Name: "hedera-testnet"} 135 | HEMI_MAINNET = Chain{EvmChainID: 43111, Selector: 1804312132722180201, Name: "hemi-mainnet"} 136 | HEMI_TESTNET_SEPOLIA = Chain{EvmChainID: 743111, Selector: 16126893759944359622, Name: "hemi-testnet-sepolia"} 137 | HYPERLIQUID_MAINNET = Chain{EvmChainID: 999, Selector: 2442541497099098535, Name: "hyperliquid-mainnet"} 138 | HYPERLIQUID_TESTNET = Chain{EvmChainID: 998, Selector: 4286062357653186312, Name: "hyperliquid-testnet"} 139 | INK_TESTNET_SEPOLIA = Chain{EvmChainID: 763373, Selector: 9763904284804119144, Name: "ink-testnet-sepolia"} 140 | JANCTION_MAINNET = Chain{EvmChainID: 678, Selector: 9107126442626377432, Name: "janction-mainnet"} 141 | JANCTION_TESTNET_SEPOLIA = Chain{EvmChainID: 679, Selector: 5059197667603797935, Name: "janction-testnet-sepolia"} 142 | KAVA_MAINNET = Chain{EvmChainID: 2222, Selector: 7550000543357438061, Name: "kava-mainnet"} 143 | KAVA_TESTNET = Chain{EvmChainID: 2221, Selector: 2110537777356199208, Name: "kava-testnet"} 144 | KUSAMA_MAINNET_MOONRIVER = Chain{EvmChainID: 1285, Selector: 1355020143337428062, Name: "kusama-mainnet-moonriver"} 145 | LENS_MAINNET = Chain{EvmChainID: 232, Selector: 5608378062013572713, Name: "lens-mainnet"} 146 | LISK_MAINNET = Chain{EvmChainID: 1135, Selector: 15293031020466096408, Name: "lisk-mainnet"} 147 | MEGAETH_TESTNET = Chain{EvmChainID: 6342, Selector: 2443239559770384419, Name: "megaeth-testnet"} 148 | METAL_MAINNET = Chain{EvmChainID: 1750, Selector: 13447077090413146373, Name: "metal-mainnet"} 149 | METAL_TESTNET = Chain{EvmChainID: 1740, Selector: 6286293440461807648, Name: "metal-testnet"} 150 | MIND_MAINNET = Chain{EvmChainID: 228, Selector: 11690709103138290329, Name: "mind-mainnet"} 151 | MIND_TESTNET = Chain{EvmChainID: 192940, Selector: 7189150270347329685, Name: "mind-testnet"} 152 | MINT_MAINNET = Chain{EvmChainID: 185, Selector: 17164792800244661392, Name: "mint-mainnet"} 153 | MINT_TESTNET = Chain{EvmChainID: 1687, Selector: 10749384167430721561, Name: "mint-testnet"} 154 | MONAD_TESTNET = Chain{EvmChainID: 10143, Selector: 2183018362218727504, Name: "monad-testnet"} 155 | MORPH_MAINNET = Chain{EvmChainID: 2818, Selector: 18164309074156128038, Name: "morph-mainnet"} 156 | NEAR_MAINNET = Chain{EvmChainID: 397, Selector: 2039744413822257700, Name: "near-mainnet"} 157 | NEAR_TESTNET = Chain{EvmChainID: 398, Selector: 5061593697262339000, Name: "near-testnet"} 158 | NEONLINK_MAINNET = Chain{EvmChainID: 259, Selector: 8239338020728974000, Name: "neonlink-mainnet"} 159 | NEONLINK_TESTNET = Chain{EvmChainID: 9559, Selector: 1113014352258747600, Name: "neonlink-testnet"} 160 | NEOX_MAINNET = Chain{EvmChainID: 47763, Selector: 7222032299962346917, Name: "neox-mainnet"} 161 | NEOX_TESTNET_T4 = Chain{EvmChainID: 12227332, Selector: 2217764097022649312, Name: "neox-testnet-t4"} 162 | NEXON_DEV = Chain{EvmChainID: 5668, Selector: 8911150974185440581, Name: "nexon-dev"} 163 | NEXON_MAINNET_HENESYS = Chain{EvmChainID: 68414, Selector: 12657445206920369324, Name: "nexon-mainnet-henesys"} 164 | NEXON_MAINNET_LITH = Chain{EvmChainID: 60118, Selector: 15758750456714168963, Name: "nexon-mainnet-lith"} 165 | NEXON_QA = Chain{EvmChainID: 807424, Selector: 14632960069656270105, Name: "nexon-qa"} 166 | NEXON_STAGE = Chain{EvmChainID: 847799, Selector: 5556806327594153475, Name: "nexon-stage"} 167 | NIBIRU_MAINNET = Chain{EvmChainID: 6900, Selector: 17349189558768828726, Name: "nibiru-mainnet"} 168 | NIBIRU_TESTNET = Chain{EvmChainID: 6930, Selector: 305104239123120457, Name: "nibiru-testnet"} 169 | ONDO_TESTNET = Chain{EvmChainID: 9000, Selector: 344208382356656551, Name: "ondo-testnet"} 170 | PLUME_DEVNET = Chain{EvmChainID: 98864, Selector: 3743020999916460931, Name: "plume-devnet"} 171 | PLUME_MAINNET = Chain{EvmChainID: 98866, Selector: 17912061998839310979, Name: "plume-mainnet"} 172 | PLUME_TESTNET = Chain{EvmChainID: 161221135, Selector: 14684575664602284776, Name: "plume-testnet"} 173 | PLUME_TESTNET_SEPOLIA = Chain{EvmChainID: 98867, Selector: 13874588925447303949, Name: "plume-testnet-sepolia"} 174 | POLKADOT_MAINNET_ASTAR = Chain{EvmChainID: 592, Selector: 6422105447186081193, Name: "polkadot-mainnet-astar"} 175 | POLKADOT_MAINNET_CENTRIFUGE = Chain{EvmChainID: 2031, Selector: 8175830712062617656, Name: "polkadot-mainnet-centrifuge"} 176 | POLKADOT_MAINNET_DARWINIA = Chain{EvmChainID: 46, Selector: 8866418665544333000, Name: "polkadot-mainnet-darwinia"} 177 | POLKADOT_MAINNET_MOONBEAM = Chain{EvmChainID: 1284, Selector: 1252863800116739621, Name: "polkadot-mainnet-moonbeam"} 178 | POLKADOT_TESTNET_ASTAR_SHIBUYA = Chain{EvmChainID: 81, Selector: 6955638871347136141, Name: "polkadot-testnet-astar-shibuya"} 179 | POLKADOT_TESTNET_CENTRIFUGE_ALTAIR = Chain{EvmChainID: 2088, Selector: 2333097300889804761, Name: "polkadot-testnet-centrifuge-altair"} 180 | POLKADOT_TESTNET_DARWINIA_PANGORO = Chain{EvmChainID: 45, Selector: 4340886533089894000, Name: "polkadot-testnet-darwinia-pangoro"} 181 | POLKADOT_TESTNET_MOONBEAM_MOONBASE = Chain{EvmChainID: 1287, Selector: 5361632739113536121, Name: "polkadot-testnet-moonbeam-moonbase"} 182 | POLYGON_MAINNET = Chain{EvmChainID: 137, Selector: 4051577828743386545, Name: "polygon-mainnet"} 183 | POLYGON_MAINNET_KATANA = Chain{EvmChainID: 747474, Selector: 2459028469735686113, Name: "polygon-mainnet-katana"} 184 | POLYGON_TESTNET_AMOY = Chain{EvmChainID: 80002, Selector: 16281711391670634445, Name: "polygon-testnet-amoy"} 185 | POLYGON_TESTNET_MUMBAI = Chain{EvmChainID: 80001, Selector: 12532609583862916517, Name: "polygon-testnet-mumbai"} 186 | POLYGON_TESTNET_TATARA = Chain{EvmChainID: 129399, Selector: 9090863410735740267, Name: "polygon-testnet-tatara"} 187 | PRIVATE_TESTNET_ANDESITE = Chain{EvmChainID: 2024, Selector: 6915682381028791124, Name: "private-testnet-andesite"} 188 | PRIVATE_TESTNET_GRANITE = Chain{EvmChainID: 2023, Selector: 3260900564719373474, Name: "private-testnet-granite"} 189 | PRIVATE_TESTNET_MICA = Chain{EvmChainID: 424242, Selector: 4489326297382772450, Name: "private-testnet-mica"} 190 | PRIVATE_TESTNET_OPALA = Chain{EvmChainID: 45439, Selector: 8446413392851542429, Name: "private-testnet-opala"} 191 | RONIN_MAINNET = Chain{EvmChainID: 2020, Selector: 6916147374840168594, Name: "ronin-mainnet"} 192 | RONIN_TESTNET_SAIGON = Chain{EvmChainID: 2021, Selector: 13116810400804392105, Name: "ronin-testnet-saigon"} 193 | ROOTSTOCK_MAINNET = Chain{EvmChainID: 30, Selector: 11964252391146578476, Name: "rootstock-mainnet"} 194 | SEI_MAINNET = Chain{EvmChainID: 1329, Selector: 9027416829622342829, Name: "sei-mainnet"} 195 | SEI_TESTNET_ATLANTIC = Chain{EvmChainID: 1328, Selector: 1216300075444106652, Name: "sei-testnet-atlantic"} 196 | SHIBARIUM_MAINNET = Chain{EvmChainID: 109, Selector: 3993510008929295315, Name: "shibarium-mainnet"} 197 | SHIBARIUM_TESTNET_PUPPYNET = Chain{EvmChainID: 157, Selector: 17833296867764334567, Name: "shibarium-testnet-puppynet"} 198 | SONEIUM_MAINNET = Chain{EvmChainID: 1868, Selector: 12505351618335765396, Name: "soneium-mainnet"} 199 | SONIC_MAINNET = Chain{EvmChainID: 146, Selector: 1673871237479749969, Name: "sonic-mainnet"} 200 | SONIC_TESTNET_BLAZE = Chain{EvmChainID: 57054, Selector: 3676871237479449268, Name: "sonic-testnet-blaze"} 201 | STORY_TESTNET = Chain{EvmChainID: 1513, Selector: 4237030917318060427, Name: "story-testnet"} 202 | SUPERSEED_MAINNET = Chain{EvmChainID: 5330, Selector: 470401360549526817, Name: "superseed-mainnet"} 203 | SUPERSEED_TESTNET = Chain{EvmChainID: 53302, Selector: 13694007683517087973, Name: "superseed-testnet"} 204 | TELOS_EVM_MAINNET = Chain{EvmChainID: 40, Selector: 1477345371608778000, Name: "telos-evm-mainnet"} 205 | TELOS_EVM_TESTNET = Chain{EvmChainID: 41, Selector: 729797994450396300, Name: "telos-evm-testnet"} 206 | TEST_0G_TESTNET_GALILEO = Chain{EvmChainID: 16601, Selector: 2131427466778448014, Name: "0g-testnet-galileo"} 207 | TEST_0G_TESTNET_NEWTON = Chain{EvmChainID: 16600, Selector: 16088006396410204581, Name: "0g-testnet-newton"} 208 | TEST_1000 = Chain{EvmChainID: 1000, Selector: 11787463284727550157, Name: "1000"} 209 | TEST_1338 = Chain{EvmChainID: 1338, Selector: 2181150070347029680, Name: "1338"} 210 | TEST_76578 = Chain{EvmChainID: 76578, Selector: 781901677223027175, Name: "76578"} 211 | TEST_90000001 = Chain{EvmChainID: 90000001, Selector: 909606746561742123, Name: "90000001"} 212 | TEST_90000002 = Chain{EvmChainID: 90000002, Selector: 5548718428018410741, Name: "90000002"} 213 | TEST_90000003 = Chain{EvmChainID: 90000003, Selector: 789068866484373046, Name: "90000003"} 214 | TEST_90000004 = Chain{EvmChainID: 90000004, Selector: 5721565186521185178, Name: "90000004"} 215 | TEST_90000005 = Chain{EvmChainID: 90000005, Selector: 964127714438319834, Name: "90000005"} 216 | TEST_90000006 = Chain{EvmChainID: 90000006, Selector: 8966794841936584464, Name: "90000006"} 217 | TEST_90000007 = Chain{EvmChainID: 90000007, Selector: 8412806778050735057, Name: "90000007"} 218 | TEST_90000008 = Chain{EvmChainID: 90000008, Selector: 4066443121807923198, Name: "90000008"} 219 | TEST_90000009 = Chain{EvmChainID: 90000009, Selector: 6747736380229414777, Name: "90000009"} 220 | TEST_90000010 = Chain{EvmChainID: 90000010, Selector: 8694984074292254623, Name: "90000010"} 221 | TEST_90000011 = Chain{EvmChainID: 90000011, Selector: 328334718812072308, Name: "90000011"} 222 | TEST_90000012 = Chain{EvmChainID: 90000012, Selector: 7715160997071429212, Name: "90000012"} 223 | TEST_90000013 = Chain{EvmChainID: 90000013, Selector: 3574539439524578558, Name: "90000013"} 224 | TEST_90000014 = Chain{EvmChainID: 90000014, Selector: 4543928599863227519, Name: "90000014"} 225 | TEST_90000015 = Chain{EvmChainID: 90000015, Selector: 6443235356619661032, Name: "90000015"} 226 | TEST_90000016 = Chain{EvmChainID: 90000016, Selector: 13087962012083037329, Name: "90000016"} 227 | TEST_90000017 = Chain{EvmChainID: 90000017, Selector: 11985232338641871056, Name: "90000017"} 228 | TEST_90000018 = Chain{EvmChainID: 90000018, Selector: 7777066535355430289, Name: "90000018"} 229 | TEST_90000019 = Chain{EvmChainID: 90000019, Selector: 1273605685587320666, Name: "90000019"} 230 | TEST_90000020 = Chain{EvmChainID: 90000020, Selector: 17810359353458878177, Name: "90000020"} 231 | TEST_90000021 = Chain{EvmChainID: 90000021, Selector: 13648736134397881410, Name: "90000021"} 232 | TEST_90000022 = Chain{EvmChainID: 90000022, Selector: 6742472197519042017, Name: "90000022"} 233 | TEST_90000023 = Chain{EvmChainID: 90000023, Selector: 16702426279731183946, Name: "90000023"} 234 | TEST_90000024 = Chain{EvmChainID: 90000024, Selector: 16449698933146693970, Name: "90000024"} 235 | TEST_90000025 = Chain{EvmChainID: 90000025, Selector: 5614341928911841614, Name: "90000025"} 236 | TEST_90000026 = Chain{EvmChainID: 90000026, Selector: 9932483170498916221, Name: "90000026"} 237 | TEST_90000027 = Chain{EvmChainID: 90000027, Selector: 9248511054298050610, Name: "90000027"} 238 | TEST_90000028 = Chain{EvmChainID: 90000028, Selector: 15733873364998401606, Name: "90000028"} 239 | TEST_90000029 = Chain{EvmChainID: 90000029, Selector: 10199579733509604193, Name: "90000029"} 240 | TEST_90000030 = Chain{EvmChainID: 90000030, Selector: 11754399446572002459, Name: "90000030"} 241 | TEST_90000031 = Chain{EvmChainID: 90000031, Selector: 15804983202763665802, Name: "90000031"} 242 | TEST_90000032 = Chain{EvmChainID: 90000032, Selector: 8794884152664322911, Name: "90000032"} 243 | TEST_90000033 = Chain{EvmChainID: 90000033, Selector: 7005880874640146484, Name: "90000033"} 244 | TEST_90000034 = Chain{EvmChainID: 90000034, Selector: 15998314635132476942, Name: "90000034"} 245 | TEST_90000035 = Chain{EvmChainID: 90000035, Selector: 6676710761873615962, Name: "90000035"} 246 | TEST_90000036 = Chain{EvmChainID: 90000036, Selector: 13973515790491921010, Name: "90000036"} 247 | TEST_90000037 = Chain{EvmChainID: 90000037, Selector: 12226902941055802385, Name: "90000037"} 248 | TEST_90000038 = Chain{EvmChainID: 90000038, Selector: 10547673735879567911, Name: "90000038"} 249 | TEST_90000039 = Chain{EvmChainID: 90000039, Selector: 2953028829530698683, Name: "90000039"} 250 | TEST_90000040 = Chain{EvmChainID: 90000040, Selector: 3740583887329090549, Name: "90000040"} 251 | TEST_90000041 = Chain{EvmChainID: 90000041, Selector: 4716670523656754658, Name: "90000041"} 252 | TEST_90000042 = Chain{EvmChainID: 90000042, Selector: 12965905455277595820, Name: "90000042"} 253 | TEST_90000043 = Chain{EvmChainID: 90000043, Selector: 6448403805635971860, Name: "90000043"} 254 | TEST_90000044 = Chain{EvmChainID: 90000044, Selector: 176199025415897437, Name: "90000044"} 255 | TEST_90000045 = Chain{EvmChainID: 90000045, Selector: 17251043223284625647, Name: "90000045"} 256 | TEST_90000046 = Chain{EvmChainID: 90000046, Selector: 14943531413383612703, Name: "90000046"} 257 | TEST_90000047 = Chain{EvmChainID: 90000047, Selector: 8015762103567576333, Name: "90000047"} 258 | TEST_90000048 = Chain{EvmChainID: 90000048, Selector: 2783890746839497525, Name: "90000048"} 259 | TEST_90000049 = Chain{EvmChainID: 90000049, Selector: 16591966440843528322, Name: "90000049"} 260 | TEST_90000050 = Chain{EvmChainID: 90000050, Selector: 9156614022853705708, Name: "90000050"} 261 | TEST_90000051 = Chain{EvmChainID: 90000051, Selector: 10089241509396411113, Name: "90000051"} 262 | TEST_90000052 = Chain{EvmChainID: 90000052, Selector: 7585715102059681757, Name: "90000052"} 263 | TEST_90000053 = Chain{EvmChainID: 90000053, Selector: 9574369650680012313, Name: "90000053"} 264 | TEST_90000054 = Chain{EvmChainID: 90000054, Selector: 15767478222558315144, Name: "90000054"} 265 | TEST_90000055 = Chain{EvmChainID: 90000055, Selector: 928756709184343973, Name: "90000055"} 266 | TEST_90000056 = Chain{EvmChainID: 90000056, Selector: 13936493323944617843, Name: "90000056"} 267 | TEST_90000057 = Chain{EvmChainID: 90000057, Selector: 9264503539336248559, Name: "90000057"} 268 | TEST_90000058 = Chain{EvmChainID: 90000058, Selector: 7032045258883126022, Name: "90000058"} 269 | TEST_90000059 = Chain{EvmChainID: 90000059, Selector: 13781595843667691007, Name: "90000059"} 270 | TEST_90000060 = Chain{EvmChainID: 90000060, Selector: 6751512843227450641, Name: "90000060"} 271 | TEST_90000061 = Chain{EvmChainID: 90000061, Selector: 12027427861168955422, Name: "90000061"} 272 | TEST_90000062 = Chain{EvmChainID: 90000062, Selector: 6690738652320128159, Name: "90000062"} 273 | TEST_90000063 = Chain{EvmChainID: 90000063, Selector: 12513826466599144030, Name: "90000063"} 274 | TEST_90000064 = Chain{EvmChainID: 90000064, Selector: 7823363553221722351, Name: "90000064"} 275 | TEST_90000065 = Chain{EvmChainID: 90000065, Selector: 17759418850483131633, Name: "90000065"} 276 | TEST_90000066 = Chain{EvmChainID: 90000066, Selector: 1488785539820432596, Name: "90000066"} 277 | TEST_90000067 = Chain{EvmChainID: 90000067, Selector: 12470167056735102403, Name: "90000067"} 278 | TEST_90000068 = Chain{EvmChainID: 90000068, Selector: 6059917085984771915, Name: "90000068"} 279 | TEST_90000069 = Chain{EvmChainID: 90000069, Selector: 8698844633699288298, Name: "90000069"} 280 | TEST_90000070 = Chain{EvmChainID: 90000070, Selector: 11335955773964346155, Name: "90000070"} 281 | TEST_90000071 = Chain{EvmChainID: 90000071, Selector: 15210860601736105873, Name: "90000071"} 282 | TEST_90000072 = Chain{EvmChainID: 90000072, Selector: 15447447865219782832, Name: "90000072"} 283 | TEST_90000073 = Chain{EvmChainID: 90000073, Selector: 7404045285477377670, Name: "90000073"} 284 | TEST_90000074 = Chain{EvmChainID: 90000074, Selector: 14506622911400094011, Name: "90000074"} 285 | TEST_90000075 = Chain{EvmChainID: 90000075, Selector: 18316006852148771137, Name: "90000075"} 286 | TEST_90000076 = Chain{EvmChainID: 90000076, Selector: 7961714422080771198, Name: "90000076"} 287 | TEST_90000077 = Chain{EvmChainID: 90000077, Selector: 15168140751097121912, Name: "90000077"} 288 | TEST_90000078 = Chain{EvmChainID: 90000078, Selector: 8354317460459584308, Name: "90000078"} 289 | TEST_90000079 = Chain{EvmChainID: 90000079, Selector: 1974710175227680991, Name: "90000079"} 290 | TEST_90000080 = Chain{EvmChainID: 90000080, Selector: 15896959195233368219, Name: "90000080"} 291 | TEST_90000081 = Chain{EvmChainID: 90000081, Selector: 13819071330241498802, Name: "90000081"} 292 | TEST_90000082 = Chain{EvmChainID: 90000082, Selector: 3632230855428784129, Name: "90000082"} 293 | TEST_90000083 = Chain{EvmChainID: 90000083, Selector: 3330151784927722907, Name: "90000083"} 294 | TEST_90000084 = Chain{EvmChainID: 90000084, Selector: 973671184102733124, Name: "90000084"} 295 | TEST_90000085 = Chain{EvmChainID: 90000085, Selector: 7353384334508842175, Name: "90000085"} 296 | TEST_90000086 = Chain{EvmChainID: 90000086, Selector: 4174149892778961910, Name: "90000086"} 297 | TEST_90000087 = Chain{EvmChainID: 90000087, Selector: 10497629267361915835, Name: "90000087"} 298 | TEST_90000088 = Chain{EvmChainID: 90000088, Selector: 10537986502862404866, Name: "90000088"} 299 | TEST_90000089 = Chain{EvmChainID: 90000089, Selector: 10106333385848939617, Name: "90000089"} 300 | TEST_90000090 = Chain{EvmChainID: 90000090, Selector: 2509173735760116798, Name: "90000090"} 301 | TEST_90000091 = Chain{EvmChainID: 90000091, Selector: 12499149790922928210, Name: "90000091"} 302 | TEST_90000092 = Chain{EvmChainID: 90000092, Selector: 665284410079532457, Name: "90000092"} 303 | TEST_90000093 = Chain{EvmChainID: 90000093, Selector: 17514102371649734225, Name: "90000093"} 304 | TEST_90000094 = Chain{EvmChainID: 90000094, Selector: 8211981504472319767, Name: "90000094"} 305 | TEST_90000095 = Chain{EvmChainID: 90000095, Selector: 15945074456050759193, Name: "90000095"} 306 | TEST_90000096 = Chain{EvmChainID: 90000096, Selector: 17580537314894454709, Name: "90000096"} 307 | TEST_90000097 = Chain{EvmChainID: 90000097, Selector: 13443138560923813712, Name: "90000097"} 308 | TEST_90000098 = Chain{EvmChainID: 90000098, Selector: 9675086780529785020, Name: "90000098"} 309 | TEST_90000099 = Chain{EvmChainID: 90000099, Selector: 7431973150957944526, Name: "90000099"} 310 | TEST_90000100 = Chain{EvmChainID: 90000100, Selector: 6875898693582952601, Name: "90000100"} 311 | TEST_98865 = Chain{EvmChainID: 98865, Selector: 3208172210661564830, Name: "98865"} 312 | TREASURE_MAINNET = Chain{EvmChainID: 61166, Selector: 5214452172935136222, Name: "treasure-mainnet"} 313 | TREASURE_TESTNET_TOPAZ = Chain{EvmChainID: 978658, Selector: 3676916124122457866, Name: "treasure-testnet-topaz"} 314 | TRON_MAINNET_EVM = Chain{EvmChainID: 728126428, Selector: 1546563616611573946, Name: "tron-mainnet-evm"} 315 | TRON_TESTNET_NILE_EVM = Chain{EvmChainID: 3448148188, Selector: 2052925811360307749, Name: "tron-testnet-nile-evm"} 316 | TRON_TESTNET_SHASTA_EVM = Chain{EvmChainID: 2494104990, Selector: 13231703482326770598, Name: "tron-testnet-shasta-evm"} 317 | VELAS_MAINNET = Chain{EvmChainID: 106, Selector: 374210358663784372, Name: "velas-mainnet"} 318 | VELAS_TESTNET = Chain{EvmChainID: 111, Selector: 572210378683744374, Name: "velas-testnet"} 319 | WEMIX_MAINNET = Chain{EvmChainID: 1111, Selector: 5142893604156789321, Name: "wemix-mainnet"} 320 | WEMIX_TESTNET = Chain{EvmChainID: 1112, Selector: 9284632837123596123, Name: "wemix-testnet"} 321 | ZERO_G_TESTNET_GALILEO = Chain{EvmChainID: 80087, Selector: 2285225387454015855, Name: "zero-g-testnet-galileo"} 322 | ZETACHAIN_MAINNET = Chain{EvmChainID: 7000, Selector: 10817664450262215148, Name: "zetachain-mainnet"} 323 | ZIRCUIT_TESTNET_GARFIELD = Chain{EvmChainID: 48898, Selector: 13781831279385219069, Name: "zircuit-testnet-garfield"} 324 | ZKLINK_NOVA_MAINNET = Chain{EvmChainID: 810180, Selector: 4350319965322101699, Name: "zklink_nova-mainnet"} 325 | ZKLINK_NOVA_TESTNET = Chain{EvmChainID: 810181, Selector: 5837261596322416298, Name: "zklink_nova-testnet"} 326 | ZORA_MAINNET = Chain{EvmChainID: 7777777, Selector: 3555797439612589184, Name: "zora-mainnet"} 327 | ZORA_TESTNET = Chain{EvmChainID: 999999999, Selector: 16244020411108056671, Name: "zora-testnet"} 328 | ) 329 | 330 | var ALL = []Chain{ 331 | ABSTRACT_MAINNET, 332 | ABSTRACT_TESTNET, 333 | ANVIL_DEVNET, 334 | APECHAIN_MAINNET, 335 | APECHAIN_TESTNET_CURTIS, 336 | AREON_MAINNET, 337 | AREON_TESTNET, 338 | AVALANCHE_MAINNET, 339 | AVALANCHE_SUBNET_DEXALOT_MAINNET, 340 | AVALANCHE_SUBNET_DEXALOT_TESTNET, 341 | AVALANCHE_TESTNET_FUJI, 342 | AVALANCHE_TESTNET_NEXON, 343 | BERACHAIN_MAINNET, 344 | BERACHAIN_TESTNET_ARTIO, 345 | BERACHAIN_TESTNET_BARTIO, 346 | BERACHAIN_TESTNET_BEPOLIA, 347 | BINANCE_SMART_CHAIN_MAINNET, 348 | BINANCE_SMART_CHAIN_MAINNET_OPBNB_1, 349 | BINANCE_SMART_CHAIN_TESTNET, 350 | BINANCE_SMART_CHAIN_TESTNET_OPBNB_1, 351 | BITCICHAIN_MAINNET, 352 | BITCICHAIN_TESTNET, 353 | BITCOIN_MAINNET_BITLAYER_1, 354 | BITCOIN_MAINNET_BOB_1, 355 | BITCOIN_MAINNET_BOTANIX, 356 | BITCOIN_MAINNET_BSQUARED_1, 357 | BITCOIN_MERLIN_MAINNET, 358 | BITCOIN_TESTNET_BITLAYER_1, 359 | BITCOIN_TESTNET_BOTANIX, 360 | BITCOIN_TESTNET_BSQUARED_1, 361 | BITCOIN_TESTNET_MERLIN, 362 | BITCOIN_TESTNET_ROOTSTOCK, 363 | BITCOIN_TESTNET_SEPOLIA_BOB_1, 364 | BITTORRENT_CHAIN_MAINNET, 365 | BITTORRENT_CHAIN_TESTNET, 366 | CELO_MAINNET, 367 | CELO_TESTNET_ALFAJORES, 368 | COINEX_SMART_CHAIN_MAINNET, 369 | COINEX_SMART_CHAIN_TESTNET, 370 | CONFLUX_MAINNET, 371 | CORE_MAINNET, 372 | CORE_TESTNET, 373 | CORN_MAINNET, 374 | CRONOS_MAINNET, 375 | CRONOS_TESTNET, 376 | CRONOS_TESTNET_ZKEVM_1, 377 | CRONOS_ZKEVM_MAINNET, 378 | CRONOS_ZKEVM_TESTNET_SEPOLIA, 379 | ETHEREUM_MAINNET, 380 | ETHEREUM_MAINNET_ARBITRUM_1, 381 | ETHEREUM_MAINNET_ARBITRUM_1_L3X_1, 382 | ETHEREUM_MAINNET_ARBITRUM_1_TREASURE_1, 383 | ETHEREUM_MAINNET_ASTAR_ZKEVM_1, 384 | ETHEREUM_MAINNET_BASE_1, 385 | ETHEREUM_MAINNET_BLAST_1, 386 | ETHEREUM_MAINNET_HASHKEY_1, 387 | ETHEREUM_MAINNET_IMMUTABLE_ZKEVM_1, 388 | ETHEREUM_MAINNET_INK_1, 389 | ETHEREUM_MAINNET_KROMA_1, 390 | ETHEREUM_MAINNET_LINEA_1, 391 | ETHEREUM_MAINNET_MANTLE_1, 392 | ETHEREUM_MAINNET_METIS_1, 393 | ETHEREUM_MAINNET_MODE_1, 394 | ETHEREUM_MAINNET_OPTIMISM_1, 395 | ETHEREUM_MAINNET_POLYGON_ZKEVM_1, 396 | ETHEREUM_MAINNET_SCROLL_1, 397 | ETHEREUM_MAINNET_TAIKO_1, 398 | ETHEREUM_MAINNET_UNICHAIN_1, 399 | ETHEREUM_MAINNET_WORLDCHAIN_1, 400 | ETHEREUM_MAINNET_XLAYER_1, 401 | ETHEREUM_MAINNET_ZIRCUIT_1, 402 | ETHEREUM_MAINNET_ZKSYNC_1, 403 | ETHEREUM_TESTNET_GOERLI_ARBITRUM_1, 404 | ETHEREUM_TESTNET_GOERLI_BASE_1, 405 | ETHEREUM_TESTNET_GOERLI_LINEA_1, 406 | ETHEREUM_TESTNET_GOERLI_MANTLE_1, 407 | ETHEREUM_TESTNET_GOERLI_OPTIMISM_1, 408 | ETHEREUM_TESTNET_GOERLI_POLYGON_ZKEVM_1, 409 | ETHEREUM_TESTNET_GOERLI_ZKSYNC_1, 410 | ETHEREUM_TESTNET_HOLESKY, 411 | ETHEREUM_TESTNET_HOLESKY_FRAXTAL_1, 412 | ETHEREUM_TESTNET_HOLESKY_MORPH_1, 413 | ETHEREUM_TESTNET_HOLESKY_TAIKO_1, 414 | ETHEREUM_TESTNET_SEPOLIA, 415 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1, 416 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1_L3X_1, 417 | ETHEREUM_TESTNET_SEPOLIA_ARBITRUM_1_TREASURE_1, 418 | ETHEREUM_TESTNET_SEPOLIA_BASE_1, 419 | ETHEREUM_TESTNET_SEPOLIA_BLAST_1, 420 | ETHEREUM_TESTNET_SEPOLIA_CORN_1, 421 | ETHEREUM_TESTNET_SEPOLIA_HASHKEY_1, 422 | ETHEREUM_TESTNET_SEPOLIA_IMMUTABLE_ZKEVM_1, 423 | ETHEREUM_TESTNET_SEPOLIA_KROMA_1, 424 | ETHEREUM_TESTNET_SEPOLIA_LENS_1, 425 | ETHEREUM_TESTNET_SEPOLIA_LINEA_1, 426 | ETHEREUM_TESTNET_SEPOLIA_LISK_1, 427 | ETHEREUM_TESTNET_SEPOLIA_MANTLE_1, 428 | ETHEREUM_TESTNET_SEPOLIA_METIS_1, 429 | ETHEREUM_TESTNET_SEPOLIA_MODE_1, 430 | ETHEREUM_TESTNET_SEPOLIA_OPTIMISM_1, 431 | ETHEREUM_TESTNET_SEPOLIA_POLYGON_VALIDIUM_1, 432 | ETHEREUM_TESTNET_SEPOLIA_POLYGON_ZKEVM_1, 433 | ETHEREUM_TESTNET_SEPOLIA_SCROLL_1, 434 | ETHEREUM_TESTNET_SEPOLIA_SONEIUM_1, 435 | ETHEREUM_TESTNET_SEPOLIA_UNICHAIN_1, 436 | ETHEREUM_TESTNET_SEPOLIA_WORLDCHAIN_1, 437 | ETHEREUM_TESTNET_SEPOLIA_XLAYER_1, 438 | ETHEREUM_TESTNET_SEPOLIA_ZIRCUIT_1, 439 | ETHEREUM_TESTNET_SEPOLIA_ZKSYNC_1, 440 | ETHERLINK_MAINNET, 441 | ETHERLINK_TESTNET, 442 | FANTOM_MAINNET, 443 | FANTOM_TESTNET, 444 | FILECOIN_MAINNET, 445 | FILECOIN_TESTNET, 446 | FRAXTAL_MAINNET, 447 | GETH_DEVNET_2, 448 | GETH_DEVNET_3, 449 | GETH_TESTNET, 450 | GNOSIS_CHAIN_MAINNET, 451 | GNOSIS_CHAIN_TESTNET_CHIADO, 452 | HEDERA_MAINNET, 453 | HEDERA_TESTNET, 454 | HEMI_MAINNET, 455 | HEMI_TESTNET_SEPOLIA, 456 | HYPERLIQUID_MAINNET, 457 | HYPERLIQUID_TESTNET, 458 | INK_TESTNET_SEPOLIA, 459 | JANCTION_MAINNET, 460 | JANCTION_TESTNET_SEPOLIA, 461 | KAVA_MAINNET, 462 | KAVA_TESTNET, 463 | KUSAMA_MAINNET_MOONRIVER, 464 | LENS_MAINNET, 465 | LISK_MAINNET, 466 | MEGAETH_TESTNET, 467 | METAL_MAINNET, 468 | METAL_TESTNET, 469 | MIND_MAINNET, 470 | MIND_TESTNET, 471 | MINT_MAINNET, 472 | MINT_TESTNET, 473 | MONAD_TESTNET, 474 | MORPH_MAINNET, 475 | NEAR_MAINNET, 476 | NEAR_TESTNET, 477 | NEONLINK_MAINNET, 478 | NEONLINK_TESTNET, 479 | NEOX_MAINNET, 480 | NEOX_TESTNET_T4, 481 | NEXON_DEV, 482 | NEXON_MAINNET_HENESYS, 483 | NEXON_MAINNET_LITH, 484 | NEXON_QA, 485 | NEXON_STAGE, 486 | NIBIRU_MAINNET, 487 | NIBIRU_TESTNET, 488 | ONDO_TESTNET, 489 | PLUME_DEVNET, 490 | PLUME_MAINNET, 491 | PLUME_TESTNET, 492 | PLUME_TESTNET_SEPOLIA, 493 | POLKADOT_MAINNET_ASTAR, 494 | POLKADOT_MAINNET_CENTRIFUGE, 495 | POLKADOT_MAINNET_DARWINIA, 496 | POLKADOT_MAINNET_MOONBEAM, 497 | POLKADOT_TESTNET_ASTAR_SHIBUYA, 498 | POLKADOT_TESTNET_CENTRIFUGE_ALTAIR, 499 | POLKADOT_TESTNET_DARWINIA_PANGORO, 500 | POLKADOT_TESTNET_MOONBEAM_MOONBASE, 501 | POLYGON_MAINNET, 502 | POLYGON_MAINNET_KATANA, 503 | POLYGON_TESTNET_AMOY, 504 | POLYGON_TESTNET_MUMBAI, 505 | POLYGON_TESTNET_TATARA, 506 | PRIVATE_TESTNET_ANDESITE, 507 | PRIVATE_TESTNET_GRANITE, 508 | PRIVATE_TESTNET_MICA, 509 | PRIVATE_TESTNET_OPALA, 510 | RONIN_MAINNET, 511 | RONIN_TESTNET_SAIGON, 512 | ROOTSTOCK_MAINNET, 513 | SEI_MAINNET, 514 | SEI_TESTNET_ATLANTIC, 515 | SHIBARIUM_MAINNET, 516 | SHIBARIUM_TESTNET_PUPPYNET, 517 | SONEIUM_MAINNET, 518 | SONIC_MAINNET, 519 | SONIC_TESTNET_BLAZE, 520 | STORY_TESTNET, 521 | SUPERSEED_MAINNET, 522 | SUPERSEED_TESTNET, 523 | TELOS_EVM_MAINNET, 524 | TELOS_EVM_TESTNET, 525 | TEST_0G_TESTNET_GALILEO, 526 | TEST_0G_TESTNET_NEWTON, 527 | TEST_1000, 528 | TEST_1338, 529 | TEST_76578, 530 | TEST_90000001, 531 | TEST_90000002, 532 | TEST_90000003, 533 | TEST_90000004, 534 | TEST_90000005, 535 | TEST_90000006, 536 | TEST_90000007, 537 | TEST_90000008, 538 | TEST_90000009, 539 | TEST_90000010, 540 | TEST_90000011, 541 | TEST_90000012, 542 | TEST_90000013, 543 | TEST_90000014, 544 | TEST_90000015, 545 | TEST_90000016, 546 | TEST_90000017, 547 | TEST_90000018, 548 | TEST_90000019, 549 | TEST_90000020, 550 | TEST_90000021, 551 | TEST_90000022, 552 | TEST_90000023, 553 | TEST_90000024, 554 | TEST_90000025, 555 | TEST_90000026, 556 | TEST_90000027, 557 | TEST_90000028, 558 | TEST_90000029, 559 | TEST_90000030, 560 | TEST_90000031, 561 | TEST_90000032, 562 | TEST_90000033, 563 | TEST_90000034, 564 | TEST_90000035, 565 | TEST_90000036, 566 | TEST_90000037, 567 | TEST_90000038, 568 | TEST_90000039, 569 | TEST_90000040, 570 | TEST_90000041, 571 | TEST_90000042, 572 | TEST_90000043, 573 | TEST_90000044, 574 | TEST_90000045, 575 | TEST_90000046, 576 | TEST_90000047, 577 | TEST_90000048, 578 | TEST_90000049, 579 | TEST_90000050, 580 | TEST_90000051, 581 | TEST_90000052, 582 | TEST_90000053, 583 | TEST_90000054, 584 | TEST_90000055, 585 | TEST_90000056, 586 | TEST_90000057, 587 | TEST_90000058, 588 | TEST_90000059, 589 | TEST_90000060, 590 | TEST_90000061, 591 | TEST_90000062, 592 | TEST_90000063, 593 | TEST_90000064, 594 | TEST_90000065, 595 | TEST_90000066, 596 | TEST_90000067, 597 | TEST_90000068, 598 | TEST_90000069, 599 | TEST_90000070, 600 | TEST_90000071, 601 | TEST_90000072, 602 | TEST_90000073, 603 | TEST_90000074, 604 | TEST_90000075, 605 | TEST_90000076, 606 | TEST_90000077, 607 | TEST_90000078, 608 | TEST_90000079, 609 | TEST_90000080, 610 | TEST_90000081, 611 | TEST_90000082, 612 | TEST_90000083, 613 | TEST_90000084, 614 | TEST_90000085, 615 | TEST_90000086, 616 | TEST_90000087, 617 | TEST_90000088, 618 | TEST_90000089, 619 | TEST_90000090, 620 | TEST_90000091, 621 | TEST_90000092, 622 | TEST_90000093, 623 | TEST_90000094, 624 | TEST_90000095, 625 | TEST_90000096, 626 | TEST_90000097, 627 | TEST_90000098, 628 | TEST_90000099, 629 | TEST_90000100, 630 | TEST_98865, 631 | TREASURE_MAINNET, 632 | TREASURE_TESTNET_TOPAZ, 633 | TRON_MAINNET_EVM, 634 | TRON_TESTNET_NILE_EVM, 635 | TRON_TESTNET_SHASTA_EVM, 636 | VELAS_MAINNET, 637 | VELAS_TESTNET, 638 | WEMIX_MAINNET, 639 | WEMIX_TESTNET, 640 | ZERO_G_TESTNET_GALILEO, 641 | ZETACHAIN_MAINNET, 642 | ZIRCUIT_TESTNET_GARFIELD, 643 | ZKLINK_NOVA_MAINNET, 644 | ZKLINK_NOVA_TESTNET, 645 | ZORA_MAINNET, 646 | ZORA_TESTNET, 647 | } 648 | -------------------------------------------------------------------------------- /generated_chains_solana.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type SolanaChain struct { 5 | ChainID string 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | SOLANA_DEVNET = SolanaChain{ChainID: "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG", Selector: 16423721717087811551, Name: "solana-devnet"} 13 | SOLANA_MAINNET = SolanaChain{ChainID: "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d", Selector: 124615329519749607, Name: "solana-mainnet"} 14 | SOLANA_TESTNET = SolanaChain{ChainID: "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY", Selector: 6302590918974934319, Name: "solana-testnet"} 15 | TEST_22222222222222222222222222222222222222222222 = SolanaChain{ChainID: "22222222222222222222222222222222222222222222", Selector: 12463857294658392847, Name: "22222222222222222222222222222222222222222222"} 16 | TEST_33333333333333333333333333333333333333333333 = SolanaChain{ChainID: "33333333333333333333333333333333333333333333", Selector: 9837465928374658293, Name: "33333333333333333333333333333333333333333333"} 17 | TEST_44444444444444444444444444444444444444444444 = SolanaChain{ChainID: "44444444444444444444444444444444444444444444", Selector: 16574839267584930184, Name: "44444444444444444444444444444444444444444444"} 18 | ) 19 | 20 | var SolanaALL = []SolanaChain{ 21 | SOLANA_DEVNET, 22 | SOLANA_MAINNET, 23 | SOLANA_TESTNET, 24 | TEST_22222222222222222222222222222222222222222222, 25 | TEST_33333333333333333333333333333333333333333333, 26 | TEST_44444444444444444444444444444444444444444444, 27 | } 28 | -------------------------------------------------------------------------------- /generated_chains_sui.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type SuiChain struct { 5 | ChainID uint64 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | SUI_LOCALNET = SuiChain{ChainID: 4, Selector: 18395503381733958356, Name: "sui-localnet"} 13 | SUI_MAINNET = SuiChain{ChainID: 1, Selector: 17529533435026248318, Name: "sui-mainnet"} 14 | SUI_TESTNET = SuiChain{ChainID: 2, Selector: 9762610643973837292, Name: "sui-testnet"} 15 | ) 16 | 17 | var SuiALL = []SuiChain{ 18 | SUI_LOCALNET, 19 | SUI_MAINNET, 20 | SUI_TESTNET, 21 | } 22 | -------------------------------------------------------------------------------- /generated_chains_ton.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type TonChain struct { 5 | ChainID int32 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | TON_LOCALNET = TonChain{ChainID: -217, Selector: 13879075125137744094, Name: "ton-localnet"} 13 | TON_MAINNET = TonChain{ChainID: -239, Selector: 16448340667252469081, Name: "ton-mainnet"} 14 | TON_TESTNET = TonChain{ChainID: -3, Selector: 1399300952838017768, Name: "ton-testnet"} 15 | ) 16 | 17 | var TonALL = []TonChain{ 18 | TON_LOCALNET, 19 | TON_MAINNET, 20 | TON_TESTNET, 21 | } 22 | -------------------------------------------------------------------------------- /generated_chains_tron.go: -------------------------------------------------------------------------------- 1 | // Code generated by go generate please DO NOT EDIT 2 | package chain_selectors 3 | 4 | type TronChain struct { 5 | ChainID uint64 6 | Selector uint64 7 | Name string 8 | VarName string 9 | } 10 | 11 | var ( 12 | TRON_MAINNET = TronChain{ChainID: 728126428, Selector: 1546563616611573945, Name: "tron-mainnet"} 13 | TRON_TESTNET_NILE = TronChain{ChainID: 3448148188, Selector: 2052925811360307740, Name: "tron-testnet-nile"} 14 | TRON_TESTNET_SHASTA = TronChain{ChainID: 2494104990, Selector: 13231703482326770597, Name: "tron-testnet-shasta"} 15 | ) 16 | 17 | var TronALL = []TronChain{ 18 | TRON_MAINNET, 19 | TRON_TESTNET_NILE, 20 | TRON_TESTNET_SHASTA, 21 | } 22 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/smartcontractkit/chain-selectors 2 | 3 | go 1.20 4 | 5 | require ( 6 | github.com/mr-tron/base58 v1.2.0 7 | github.com/stretchr/testify v1.8.4 8 | gopkg.in/yaml.v3 v3.0.1 9 | ) 10 | 11 | require ( 12 | github.com/davecgh/go-spew v1.1.1 // indirect 13 | github.com/pmezard/go-difflib v1.0.0 // indirect 14 | ) 15 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= 4 | github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= 5 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 6 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 7 | github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= 8 | github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= 9 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= 10 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 11 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 12 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 13 | -------------------------------------------------------------------------------- /selectors.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "strconv" 6 | ) 7 | 8 | const ( 9 | FamilyEVM = "evm" 10 | FamilySolana = "solana" 11 | FamilyStarknet = "starknet" 12 | FamilyCosmos = "cosmos" 13 | FamilyAptos = "aptos" 14 | FamilySui = "sui" 15 | FamilyTron = "tron" 16 | FamilyTon = "ton" 17 | ) 18 | 19 | type chainInfo struct { 20 | Family string 21 | ChainID string 22 | ChainDetails ChainDetails 23 | } 24 | 25 | func getChainInfo(selector uint64) (chainInfo, error) { 26 | // check EVM 27 | _, exist := evmChainsBySelector[selector] 28 | if exist { 29 | family := FamilyEVM 30 | 31 | evmChainId, err := ChainIdFromSelector(selector) 32 | if err != nil { 33 | return chainInfo{}, fmt.Errorf("failed to get %v chain ID from selector %d: %w", family, selector, err) 34 | } 35 | 36 | details, exist := evmChainIdToChainSelector[evmChainId] 37 | if !exist { 38 | return chainInfo{}, fmt.Errorf("invalid chain id %d for %s", evmChainId, family) 39 | } 40 | 41 | return chainInfo{ 42 | Family: family, 43 | ChainID: fmt.Sprintf("%d", evmChainId), 44 | ChainDetails: details, 45 | }, nil 46 | } 47 | 48 | // check solana 49 | _, exist = solanaChainsBySelector[selector] 50 | if exist { 51 | family := FamilySolana 52 | 53 | chainID, err := SolanaChainIdFromSelector(selector) 54 | if err != nil { 55 | return chainInfo{}, fmt.Errorf("failed to get %s chain ID from selector %d: %w", chainID, selector, err) 56 | } 57 | 58 | details, exist := solanaChainIdToChainSelector[chainID] 59 | if !exist { 60 | return chainInfo{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 61 | } 62 | 63 | return chainInfo{ 64 | Family: family, 65 | ChainID: chainID, 66 | ChainDetails: details, 67 | }, nil 68 | 69 | } 70 | 71 | // check aptos 72 | _, exist = aptosChainsBySelector[selector] 73 | if exist { 74 | family := FamilyAptos 75 | 76 | chainID, err := AptosChainIdFromSelector(selector) 77 | if err != nil { 78 | return chainInfo{}, fmt.Errorf("failed to get %v chain ID from selector %d: %w", chainID, selector, err) 79 | } 80 | 81 | details, exist := aptosSelectorsMap[chainID] 82 | if !exist { 83 | return chainInfo{}, fmt.Errorf("invalid chain id %d for %s", chainID, family) 84 | } 85 | 86 | return chainInfo{ 87 | Family: family, 88 | ChainID: fmt.Sprintf("%d", chainID), 89 | ChainDetails: details, 90 | }, nil 91 | } 92 | 93 | // check sui 94 | _, exist = suiChainsBySelector[selector] 95 | if exist { 96 | family := FamilySui 97 | 98 | chainID, err := SuiChainIdFromSelector(selector) 99 | if err != nil { 100 | return chainInfo{}, fmt.Errorf("failed to get %v chain ID from selector %d: %w", chainID, selector, err) 101 | } 102 | 103 | details, exist := suiSelectorsMap[chainID] 104 | if !exist { 105 | return chainInfo{}, fmt.Errorf("invalid chain id %d for %s", chainID, family) 106 | } 107 | 108 | return chainInfo{ 109 | Family: family, 110 | ChainID: fmt.Sprintf("%d", chainID), 111 | ChainDetails: details, 112 | }, nil 113 | } 114 | 115 | // check tron 116 | _, exist = tronChainIdBySelector[selector] 117 | if exist { 118 | family := FamilyTron 119 | 120 | chainID, err := TronChainIdFromSelector(selector) 121 | if err != nil { 122 | return chainInfo{}, fmt.Errorf("failed to get %v chain ID from selector %d: %w", chainID, selector, err) 123 | } 124 | 125 | details, exist := tronSelectorsMap[chainID] 126 | if !exist { 127 | return chainInfo{}, fmt.Errorf("invalid chain id %d for %s", chainID, family) 128 | } 129 | 130 | return chainInfo{ 131 | Family: family, 132 | ChainID: fmt.Sprintf("%d", chainID), 133 | ChainDetails: details, 134 | }, nil 135 | } 136 | 137 | // check ton 138 | _, exist = tonChainIdBySelector[selector] 139 | if exist { 140 | family := FamilyTon 141 | 142 | chainID, err := TonChainIdFromSelector(selector) 143 | if err != nil { 144 | return chainInfo{}, fmt.Errorf("failed to get %v chain ID from selector %d: %w", chainID, selector, err) 145 | } 146 | 147 | details, exist := tonSelectorsMap[chainID] 148 | if !exist { 149 | return chainInfo{}, fmt.Errorf("invalid chain id %d for %s", chainID, family) 150 | } 151 | 152 | return chainInfo{ 153 | Family: family, 154 | ChainID: fmt.Sprintf("%d", chainID), 155 | ChainDetails: details, 156 | }, nil 157 | } 158 | 159 | return chainInfo{}, fmt.Errorf("unknown chain selector %d", selector) 160 | } 161 | 162 | func GetSelectorFamily(selector uint64) (string, error) { 163 | chainInfo, err := getChainInfo(selector) 164 | if err != nil { 165 | return "", fmt.Errorf("unknown chain selector %d", selector) 166 | } 167 | 168 | return chainInfo.Family, nil 169 | } 170 | 171 | func GetChainIDFromSelector(selector uint64) (string, error) { 172 | chainInfo, err := getChainInfo(selector) 173 | if err != nil { 174 | return "", fmt.Errorf("unknown chain selector %d", selector) 175 | } 176 | 177 | return chainInfo.ChainID, nil 178 | } 179 | 180 | func GetChainDetailsByChainIDAndFamily(chainID string, family string) (ChainDetails, error) { 181 | switch family { 182 | case FamilyEVM: 183 | evmChainId, err := strconv.ParseUint(chainID, 10, 64) 184 | if err != nil { 185 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 186 | } 187 | 188 | details, exist := evmChainIdToChainSelector[evmChainId] 189 | if !exist { 190 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 191 | } 192 | 193 | return details, nil 194 | case FamilySolana: 195 | details, exist := solanaChainIdToChainSelector[chainID] 196 | if !exist { 197 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 198 | } 199 | 200 | return details, nil 201 | case FamilyAptos: 202 | aptosChainId, err := strconv.ParseUint(chainID, 10, 64) 203 | if err != nil { 204 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 205 | } 206 | 207 | details, exist := aptosSelectorsMap[aptosChainId] 208 | if !exist { 209 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 210 | } 211 | 212 | return details, nil 213 | case FamilySui: 214 | suiChainId, err := strconv.ParseUint(chainID, 10, 64) 215 | if err != nil { 216 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 217 | } 218 | 219 | details, exist := suiSelectorsMap[suiChainId] 220 | if !exist { 221 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 222 | } 223 | 224 | return details, nil 225 | case FamilyTron: 226 | tronChainId, err := strconv.ParseUint(chainID, 10, 64) 227 | if err != nil { 228 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 229 | } 230 | 231 | details, exist := tronSelectorsMap[tronChainId] 232 | if !exist { 233 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 234 | } 235 | 236 | return details, nil 237 | 238 | case FamilyTon: 239 | tonChainId, err := strconv.ParseInt(chainID, 10, 32) 240 | if err != nil { 241 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 242 | } 243 | details, exist := tonSelectorsMap[int32(tonChainId)] 244 | if !exist { 245 | return ChainDetails{}, fmt.Errorf("invalid chain id %s for %s", chainID, family) 246 | } 247 | 248 | return details, nil 249 | default: 250 | return ChainDetails{}, fmt.Errorf("family %s is not yet support", family) 251 | } 252 | } 253 | -------------------------------------------------------------------------------- /selectors.yml: -------------------------------------------------------------------------------- 1 | # EVM selectors. 2 | # File doesn't have a family suffix for backwards compatibility. 3 | --- 4 | selectors: 5 | # Testnets 6 | 31: 7 | selector: 8953668971247136127 8 | name: "bitcoin-testnet-rootstock" 9 | 41: 10 | selector: 729797994450396300 11 | name: "telos-evm-testnet" 12 | 45: 13 | selector: 4340886533089894000 14 | name: "polkadot-testnet-darwinia-pangoro" 15 | 53: 16 | selector: 8955032871639343000 17 | name: "coinex_smart_chain-testnet" 18 | 81: 19 | selector: 6955638871347136141 20 | name: "polkadot-testnet-astar-shibuya" 21 | 97: 22 | selector: 13264668187771770619 23 | name: "binance_smart_chain-testnet" 24 | 133: 25 | selector: 4356164186791070119 26 | name: "ethereum-testnet-sepolia-hashkey-1" 27 | 157: 28 | selector: 17833296867764334567 29 | name: "shibarium-testnet-puppynet" 30 | 111: 31 | selector: 572210378683744374 32 | name: "velas-testnet" 33 | 195: 34 | selector: 2066098519157881736 35 | name: "ethereum-testnet-sepolia-xlayer-1" 36 | 240: 37 | selector: 16487132492576884721 38 | name: "cronos-zkevm-testnet-sepolia" 39 | 280: 40 | selector: 6802309497652714138 41 | name: "ethereum-testnet-goerli-zksync-1" 42 | 282: 43 | selector: 3842103497652714138 44 | name: "cronos-testnet-zkevm-1" 45 | 296: 46 | selector: 222782988166878823 47 | name: "hedera-testnet" 48 | 300: 49 | selector: 6898391096552792247 50 | name: "ethereum-testnet-sepolia-zksync-1" 51 | 338: 52 | selector: 2995292832068775165 53 | name: "cronos-testnet" 54 | 398: 55 | selector: 5061593697262339000 56 | name: "near-testnet" 57 | 420: 58 | selector: 2664363617261496610 59 | name: "ethereum-testnet-goerli-optimism-1" 60 | 462: 61 | selector: 7317911323415911000 62 | name: "areon-testnet" 63 | 678: 64 | selector: 9107126442626377432 65 | name: "janction-mainnet" 66 | 679: 67 | selector: 5059197667603797935 68 | name: "janction-testnet-sepolia" 69 | 919: 70 | selector: 829525985033418733 71 | name: "ethereum-testnet-sepolia-mode-1" 72 | 1029: 73 | selector: 4459371029167934217 74 | name: "bittorrent_chain-testnet" 75 | 1112: 76 | selector: 9284632837123596123 77 | name: "wemix-testnet" 78 | 1114: 79 | selector: 4264732132125536123 80 | name: "core-testnet" 81 | 1123: 82 | selector: 1948510578179542068 83 | name: "bitcoin-testnet-bsquared-1" 84 | 12325: 85 | selector: 3486622437121596122 86 | name: "ethereum-testnet-sepolia-arbitrum-1-l3x-1" 87 | 1287: 88 | selector: 5361632739113536121 89 | name: "polkadot-testnet-moonbeam-moonbase" 90 | 2088: 91 | selector: 2333097300889804761 92 | name: "polkadot-testnet-centrifuge-altair" 93 | 1337: 94 | selector: 3379446385462418246 95 | name: "geth-testnet" 96 | 31337: 97 | selector: 7759470850252068959 98 | name: "anvil-devnet" 99 | 45439: 100 | selector: 8446413392851542429 101 | name: "private-testnet-opala" 102 | 1442: 103 | selector: 11059667695644972511 104 | name: "ethereum-testnet-goerli-polygon-zkevm-1" 105 | 1908: 106 | selector: 4888058894222120000 107 | name: "bitcichain-testnet" 108 | 2221: 109 | selector: 2110537777356199208 110 | name: "kava-testnet" 111 | 2358: 112 | selector: 5990477251245693094 113 | name: "ethereum-testnet-sepolia-kroma-1" 114 | 2442: 115 | selector: 1654667687261492630 116 | name: "ethereum-testnet-sepolia-polygon-zkevm-1" 117 | 2522: 118 | selector: 8901520481741771655 119 | name: "ethereum-testnet-holesky-fraxtal-1" 120 | 2810: 121 | selector: 8304510386741731151 122 | name: "ethereum-testnet-holesky-morph-1" 123 | 3636: 124 | selector: 1467223411771711614 125 | name: "bitcoin-testnet-botanix" 126 | 4002: 127 | selector: 4905564228793744293 128 | name: "fantom-testnet" 129 | 4202: 130 | selector: 5298399861320400553 131 | name: "ethereum-testnet-sepolia-lisk-1" 132 | 5001: 133 | selector: 4168263376276232250 134 | name: "ethereum-testnet-goerli-mantle-1" 135 | 5003: 136 | selector: 8236463271206331221 137 | name: "ethereum-testnet-sepolia-mantle-1" 138 | 9559: 139 | selector: 1113014352258747600 140 | name: "neonlink-testnet" 141 | 10143: 142 | selector: 2183018362218727504 143 | name: "monad-testnet" 144 | 13473: 145 | selector: 4526165231216331901 146 | name: "ethereum-testnet-sepolia-immutable-zkevm-1" 147 | 16600: 148 | selector: 16088006396410204581 149 | name: "0g-testnet-newton" 150 | 16601: 151 | selector: 2131427466778448014 152 | name: "0g-testnet-galileo" 153 | 33111: 154 | selector: 9900119385908781505 155 | name: "apechain-testnet-curtis" 156 | 43111: 157 | selector: 1804312132722180201 158 | name: "hemi-mainnet" 159 | 43113: 160 | selector: 14767482510784806043 161 | name: "avalanche-testnet-fuji" 162 | 44787: 163 | selector: 3552045678561919002 164 | name: "celo-testnet-alfajores" 165 | 48898: 166 | selector: 13781831279385219069 167 | name: "zircuit-testnet-garfield" 168 | 48899: 169 | selector: 4562743618362911021 170 | name: "ethereum-testnet-sepolia-zircuit-1" 171 | 59140: 172 | selector: 1355246678561316402 173 | name: "ethereum-testnet-goerli-linea-1" 174 | 59141: 175 | selector: 5719461335882077547 176 | name: "ethereum-testnet-sepolia-linea-1" 177 | 59902: 178 | selector: 3777822886988675105 179 | name: "ethereum-testnet-sepolia-metis-1" 180 | 76578: 181 | selector: 781901677223027175 182 | 80001: 183 | selector: 12532609583862916517 184 | name: "polygon-testnet-mumbai" 185 | 80002: 186 | selector: 16281711391670634445 187 | name: "polygon-testnet-amoy" 188 | 80085: 189 | selector: 12336603543561911511 190 | name: "berachain-testnet-artio" 191 | 80084: 192 | selector: 8999465244383784164 193 | name: "berachain-testnet-bartio" 194 | 80069: 195 | selector: 7728255861635209484 196 | name: "berachain-testnet-bepolia" 197 | 80087: 198 | selector: 2285225387454015855 199 | name: "zero-g-testnet-galileo" 200 | 84531: 201 | selector: 5790810961207155433 202 | name: "ethereum-testnet-goerli-base-1" 203 | 84532: 204 | selector: 10344971235874465080 205 | name: "ethereum-testnet-sepolia-base-1" 206 | 98867: 207 | selector: 13874588925447303949 208 | name: "plume-testnet-sepolia" 209 | 10200: 210 | selector: 8871595565390010547 211 | name: "gnosis_chain-testnet-chiado" 212 | 421613: 213 | selector: 6101244977088475029 214 | name: "ethereum-testnet-goerli-arbitrum-1" 215 | 421614: 216 | selector: 3478487238524512106 217 | name: "ethereum-testnet-sepolia-arbitrum-1" 218 | 432201: 219 | selector: 1458281248224512906 220 | name: "avalanche-subnet-dexalot-testnet" 221 | 717160: 222 | selector: 4418231248214522936 223 | name: "ethereum-testnet-sepolia-polygon-validium-1" 224 | 743111: 225 | selector: 16126893759944359622 226 | name: "hemi-testnet-sepolia" 227 | 763373: 228 | selector: 9763904284804119144 229 | name: "ink-testnet-sepolia" 230 | 534351: 231 | selector: 2279865765895943307 232 | name: "ethereum-testnet-sepolia-scroll-1" 233 | 686868: 234 | selector: 5269261765892944301 235 | name: "bitcoin-testnet-merlin" 236 | 5668: 237 | selector: 8911150974185440581 238 | name: "nexon-dev" 239 | 595581: 240 | selector: 7837562506228496256 241 | name: "avalanche-testnet-nexon" 242 | 807424: 243 | selector: 14632960069656270105 244 | name: "nexon-qa" 245 | 847799: 246 | selector: 5556806327594153475 247 | name: "nexon-stage" 248 | 810181: 249 | selector: 5837261596322416298 250 | name: "zklink_nova-testnet" 251 | 978658: 252 | selector: 3676916124122457866 253 | name: "treasure-testnet-topaz" 254 | 31415926: 255 | selector: 7060342227814389000 256 | name: "filecoin-testnet" 257 | 11155111: 258 | selector: 16015286601757825753 259 | name: "ethereum-testnet-sepolia" 260 | 11155420: 261 | selector: 5224473277236331295 262 | name: "ethereum-testnet-sepolia-optimism-1" 263 | 21000001: 264 | selector: 1467427327723633929 265 | name: "ethereum-testnet-sepolia-corn-1" 266 | 168587773: 267 | selector: 2027362563942762617 268 | name: "ethereum-testnet-sepolia-blast-1" 269 | 978657: 270 | selector: 10443705513486043421 271 | name: "ethereum-testnet-sepolia-arbitrum-1-treasure-1" 272 | 1946: 273 | selector: 686603546605904534 274 | name: "ethereum-testnet-sepolia-soneium-1" 275 | 2021: 276 | selector: 13116810400804392105 277 | name: "ronin-testnet-saigon" 278 | 2023: 279 | selector: 3260900564719373474 280 | name: "private-testnet-granite" 281 | 2024: 282 | selector: 6915682381028791124 283 | name: "private-testnet-andesite" 284 | 200810: 285 | selector: 3789623672476206327 286 | name: "bitcoin-testnet-bitlayer-1" 287 | 808813: 288 | selector: 5535534526963509396 289 | name: "bitcoin-testnet-sepolia-bob-1" 290 | 37111: 291 | selector: 6827576821754315911 292 | name: "ethereum-testnet-sepolia-lens-1" 293 | 1328: 294 | selector: 1216300075444106652 295 | name: "sei-testnet-atlantic" 296 | 57054: 297 | selector: 3676871237479449268 298 | name: "sonic-testnet-blaze" 299 | 998: 300 | selector: 4286062357653186312 301 | name: "hyperliquid-testnet" 302 | 1513: 303 | selector: 4237030917318060427 304 | name: "story-testnet" 305 | 5611: 306 | selector: 13274425992935471758 307 | name: "binance_smart_chain-testnet-opbnb-1" 308 | 17000: 309 | selector: 7717148896336251131 310 | name: "ethereum-testnet-holesky" 311 | 1301: 312 | selector: 14135854469784514356 313 | name: "ethereum-testnet-sepolia-unichain-1" 314 | 167009: 315 | selector: 7248756420937879088 316 | name: "ethereum-testnet-holesky-taiko-1" 317 | 161221135: 318 | selector: 14684575664602284776 319 | name: "plume-testnet" 320 | 98864: 321 | selector: 3743020999916460931 322 | name: "plume-devnet" 323 | 4801: 324 | selector: 5299555114858065850 325 | name: "ethereum-testnet-sepolia-worldchain-1" 326 | 192940: 327 | selector: 7189150270347329685 328 | name: "mind-testnet" 329 | 1338: 330 | selector: 2181150070347029680 331 | 6342: 332 | selector: 2443239559770384419 333 | name: "megaeth-testnet" 334 | 999999999: 335 | selector: 16244020411108056671 336 | name: "zora-testnet" 337 | 1687: 338 | selector: 10749384167430721561 339 | name: "mint-testnet" 340 | 11124: 341 | selector: 16235373811196386733 342 | name: "abstract-testnet" 343 | 53302: 344 | selector: 13694007683517087973 345 | name: "superseed-testnet" 346 | 128123: 347 | selector: 1910019406958449359 348 | name: "etherlink-testnet" 349 | 1740: 350 | selector: 6286293440461807648 351 | name: "metal-testnet" 352 | 6930: 353 | selector: 305104239123120457 354 | name: "nibiru-testnet" 355 | 9000: 356 | selector: 344208382356656551 357 | name: "ondo-testnet" 358 | 129399: 359 | selector: 9090863410735740267 360 | name: "polygon-testnet-tatara" 361 | 362 | # Mainnets 363 | 1: 364 | selector: 5009297550715157269 365 | name: "ethereum-mainnet" 366 | 10: 367 | selector: 3734403246176062136 368 | name: "ethereum-mainnet-optimism-1" 369 | 25: 370 | selector: 1456215246176062136 371 | name: "cronos-mainnet" 372 | 30: 373 | selector: 11964252391146578476 374 | name: "rootstock-mainnet" 375 | 40: 376 | selector: 1477345371608778000 377 | name: "telos-evm-mainnet" 378 | 46: 379 | selector: 8866418665544333000 380 | name: "polkadot-mainnet-darwinia" 381 | 52: 382 | selector: 1761333065194157300 383 | name: "coinex_smart_chain-mainnet" 384 | 56: 385 | selector: 11344663589394136015 386 | name: "binance_smart_chain-mainnet" 387 | 100: 388 | selector: 465200170687744372 389 | name: "gnosis_chain-mainnet" 390 | 106: 391 | selector: 374210358663784372 392 | name: "velas-mainnet" 393 | 109: 394 | selector: 3993510008929295315 395 | name: "shibarium-mainnet" 396 | 130: 397 | selector: 1923510103922296319 398 | name: "ethereum-mainnet-unichain-1" 399 | 137: 400 | selector: 4051577828743386545 401 | name: "polygon-mainnet" 402 | 146: 403 | selector: 1673871237479749969 404 | name: "sonic-mainnet" 405 | 177: 406 | selector: 7613811247471741961 407 | name: "ethereum-mainnet-hashkey-1" 408 | 196: 409 | selector: 3016212468291539606 410 | name: "ethereum-mainnet-xlayer-1" 411 | 199: 412 | selector: 3776006016387883143 413 | name: "bittorrent_chain-mainnet" 414 | 252: 415 | selector: 1462016016387883143 416 | name: "fraxtal-mainnet" 417 | 255: 418 | selector: 3719320017875267166 419 | name: "ethereum-mainnet-kroma-1" 420 | 259: 421 | selector: 8239338020728974000 422 | name: "neonlink-mainnet" 423 | 295: 424 | selector: 3229138320728879060 425 | name: "hedera-mainnet" 426 | 314: 427 | selector: 4561443241176882990 428 | name: "filecoin-mainnet" 429 | 324: 430 | selector: 1562403441176082196 431 | name: "ethereum-mainnet-zksync-1" 432 | 388: 433 | selector: 8788096068760390840 434 | name: "cronos-zkevm-mainnet" 435 | 397: 436 | selector: 2039744413822257700 437 | name: "near-mainnet" 438 | 463: 439 | selector: 1939936305787790600 440 | name: "areon-mainnet" 441 | 592: 442 | selector: 6422105447186081193 443 | name: "polkadot-mainnet-astar" 444 | 999: 445 | selector: 2442541497099098535 446 | name: "hyperliquid-mainnet" 447 | 1088: 448 | selector: 8805746078405598895 449 | name: "ethereum-mainnet-metis-1" 450 | 1101: 451 | selector: 4348158687435793198 452 | name: "ethereum-mainnet-polygon-zkevm-1" 453 | 1111: 454 | selector: 5142893604156789321 455 | name: "wemix-mainnet" 456 | 1116: 457 | selector: 1224752112135636129 458 | name: "core-mainnet" 459 | 61166: 460 | selector: 5214452172935136222 461 | name: "treasure-mainnet" 462 | 12227332: 463 | selector: 2217764097022649312 464 | name: "neox-testnet-t4" 465 | 12324: 466 | selector: 3162193654116181371 467 | name: "ethereum-mainnet-arbitrum-1-l3x-1" 468 | 1284: 469 | selector: 1252863800116739621 470 | name: "polkadot-mainnet-moonbeam" 471 | 1285: 472 | selector: 1355020143337428062 473 | name: "kusama-mainnet-moonriver" 474 | 1868: 475 | selector: 12505351618335765396 476 | name: "soneium-mainnet" 477 | 1907: 478 | selector: 4874388048629246000 479 | name: "bitcichain-mainnet" 480 | 2222: 481 | selector: 7550000543357438061 482 | name: "kava-mainnet" 483 | 3637: 484 | selector: 4560701533377838164 485 | name: "bitcoin-mainnet-botanix" 486 | 3776: 487 | selector: 1540201334317828111 488 | name: "ethereum-mainnet-astar-zkevm-1" 489 | 4200: 490 | selector: 241851231317828981 491 | name: "bitcoin-merlin-mainnet" 492 | 5000: 493 | selector: 1556008542357238666 494 | name: "ethereum-mainnet-mantle-1" 495 | 8453: 496 | selector: 15971525489660198786 497 | name: "ethereum-mainnet-base-1" 498 | 13371: 499 | selector: 1237925231416731909 500 | name: "ethereum-mainnet-immutable-zkevm-1" 501 | 33139: 502 | selector: 14894068710063348487 503 | name: "apechain-mainnet" 504 | 34443: 505 | selector: 7264351850409363825 506 | name: "ethereum-mainnet-mode-1" 507 | 42161: 508 | selector: 4949039107694359620 509 | name: "ethereum-mainnet-arbitrum-1" 510 | 42220: 511 | selector: 1346049177634351622 512 | name: "celo-mainnet" 513 | 43114: 514 | selector: 6433500567565415381 515 | name: "avalanche-mainnet" 516 | 47763: 517 | selector: 7222032299962346917 518 | name: "neox-mainnet" 519 | 80094: 520 | selector: 1294465214383781161 521 | name: "berachain-mainnet" 522 | 98865: 523 | selector: 3208172210661564830 524 | 98866: 525 | selector: 17912061998839310979 526 | name: "plume-mainnet" 527 | 432204: 528 | selector: 5463201557265485081 529 | name: "avalanche-subnet-dexalot-mainnet" 530 | 57073: 531 | selector: 3461204551265785888 532 | name: "ethereum-mainnet-ink-1" 533 | 59144: 534 | selector: 4627098889531055414 535 | name: "ethereum-mainnet-linea-1" 536 | 81457: 537 | selector: 4411394078118774322 538 | name: "ethereum-mainnet-blast-1" 539 | 534352: 540 | selector: 13204309965629103672 541 | name: "ethereum-mainnet-scroll-1" 542 | 810180: 543 | selector: 4350319965322101699 544 | name: "zklink_nova-mainnet" 545 | 2031: 546 | selector: 8175830712062617656 547 | name: "polkadot-mainnet-centrifuge" 548 | 978670: 549 | selector: 1010349088906777999 550 | name: "ethereum-mainnet-arbitrum-1-treasure-1" 551 | 424242: 552 | selector: 4489326297382772450 553 | name: "private-testnet-mica" 554 | 48900: 555 | selector: 17198166215261833993 556 | name: "ethereum-mainnet-zircuit-1" 557 | 223: 558 | selector: 5406759801798337480 559 | name: "bitcoin-mainnet-bsquared-1" 560 | 200901: 561 | selector: 7937294810946806131 562 | name: "bitcoin-mainnet-bitlayer-1" 563 | 60808: 564 | selector: 3849287863852499584 565 | name: "bitcoin-mainnet-bob-1" 566 | 1329: 567 | selector: 9027416829622342829 568 | name: "sei-mainnet" 569 | 2020: 570 | selector: 6916147374840168594 571 | name: "ronin-mainnet" 572 | 204: 573 | selector: 465944652040885897 574 | name: "binance_smart_chain-mainnet-opbnb-1" 575 | 167000: 576 | selector: 16468599424800719238 577 | name: "ethereum-mainnet-taiko-1" 578 | 250: 579 | selector: 3768048213127883732 580 | name: "fantom-mainnet" 581 | 480: 582 | selector: 2049429975587534727 583 | name: "ethereum-mainnet-worldchain-1" 584 | 21000000: 585 | selector: 9043146809313071210 586 | name: "corn-mainnet" 587 | 2818: 588 | selector: 18164309074156128038 589 | name: "morph-mainnet" 590 | 232: 591 | selector: 5608378062013572713 592 | name: "lens-mainnet" 593 | 228: 594 | selector: 11690709103138290329 595 | name: "mind-mainnet" 596 | 3448148188: 597 | selector: 2052925811360307749 598 | name: "tron-testnet-nile-evm" 599 | 2494104990: 600 | selector: 13231703482326770598 601 | name: "tron-testnet-shasta-evm" 602 | 728126428: 603 | selector: 1546563616611573946 604 | name: "tron-mainnet-evm" 605 | 7777777: 606 | selector: 3555797439612589184 607 | name: "zora-mainnet" 608 | 5330: 609 | selector: 470401360549526817 610 | name: "superseed-mainnet" 611 | 2741: 612 | selector: 3577778157919314504 613 | name: "abstract-mainnet" 614 | 1135: 615 | selector: 15293031020466096408 616 | name: "lisk-mainnet" 617 | 185: 618 | selector: 17164792800244661392 619 | name: "mint-mainnet" 620 | 42793: 621 | selector: 13624601974233774587 622 | name: "etherlink-mainnet" 623 | 1750: 624 | selector: 13447077090413146373 625 | name: "metal-mainnet" 626 | 6900: 627 | selector: 17349189558768828726 628 | name: "nibiru-mainnet" 629 | 60118: 630 | selector: 15758750456714168963 631 | name: "nexon-mainnet-lith" 632 | 68414: 633 | selector: 12657445206920369324 634 | name: "nexon-mainnet-henesys" 635 | 7000: 636 | selector: 10817664450262215148 637 | name: "zetachain-mainnet" 638 | 1030: 639 | selector: 3358365939762719202 640 | name: "conflux-mainnet" 641 | 747474: 642 | selector: 2459028469735686113 643 | name: "polygon-mainnet-katana" 644 | -------------------------------------------------------------------------------- /selectors_aptos.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | 1: 3 | name: aptos-mainnet 4 | selector: 4741433654826277614 5 | 2: 6 | name: aptos-testnet 7 | selector: 743186221051783445 8 | 4: 9 | name: aptos-localnet 10 | selector: 4457093679053095497 11 | -------------------------------------------------------------------------------- /selectors_solana.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d": # bash58 encoded genesis hash, https://solana.com/docs/rpc/http/getgenesishash 3 | name: solana-mainnet 4 | selector: 124615329519749607 5 | "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY": 6 | name: solana-testnet 7 | selector: 6302590918974934319 8 | "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG": 9 | name: solana-devnet 10 | selector: 16423721717087811551 11 | 12 | -------------------------------------------------------------------------------- /selectors_sui.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | 1: 3 | name: sui-mainnet 4 | selector: 17529533435026248318 5 | 2: 6 | name: sui-testnet 7 | selector: 9762610643973837292 8 | 4: 9 | name: sui-localnet 10 | selector: 18395503381733958356 11 | -------------------------------------------------------------------------------- /selectors_ton.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | -239: 3 | name: ton-mainnet 4 | selector: 16448340667252469081 5 | -3: 6 | name: ton-testnet 7 | selector: 1399300952838017768 8 | -217: 9 | name: ton-localnet 10 | selector: 13879075125137744094 11 | 12 | -------------------------------------------------------------------------------- /selectors_tron.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | 3448148188: 3 | selector: 2052925811360307740 4 | name: "tron-testnet-nile" 5 | 2494104990: 6 | selector: 13231703482326770597 7 | name: "tron-testnet-shasta" 8 | 728126428: 9 | selector: 1546563616611573945 10 | name: "tron-mainnet" 11 | -------------------------------------------------------------------------------- /solana.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | 7 | "github.com/mr-tron/base58" 8 | "gopkg.in/yaml.v3" 9 | ) 10 | 11 | //go:generate go run genchains_solana.go 12 | 13 | //go:embed selectors_solana.yml 14 | var solanaSelectorsYml []byte 15 | 16 | //go:embed test_selectors_solana.yml 17 | var testSelectorsSolanaYml []byte 18 | 19 | var ( 20 | solanaSelectorsMap = parseSolanaYml(solanaSelectorsYml) 21 | solanaTestSelectorsMap = parseSolanaYml(testSelectorsSolanaYml) 22 | solanaChainIdToChainSelector = loadAllSolanaSelectors() 23 | solanaChainsBySelector = make(map[uint64]SolanaChain) 24 | ) 25 | 26 | func init() { 27 | for _, v := range SolanaALL { 28 | solanaChainsBySelector[v.Selector] = v 29 | } 30 | } 31 | 32 | func loadAllSolanaSelectors() map[string]ChainDetails { 33 | output := make(map[string]ChainDetails, len(solanaSelectorsMap)+len(solanaTestSelectorsMap)) 34 | for k, v := range solanaSelectorsMap { 35 | output[k] = v 36 | } 37 | for k, v := range solanaTestSelectorsMap { 38 | output[k] = v 39 | } 40 | return output 41 | } 42 | 43 | func parseSolanaYml(ymlFile []byte) map[string]ChainDetails { 44 | type ymlData struct { 45 | SelectorsBySolanaChainId map[string]ChainDetails `yaml:"selectors"` 46 | } 47 | 48 | var data ymlData 49 | err := yaml.Unmarshal(ymlFile, &data) 50 | if err != nil { 51 | panic(err) 52 | } 53 | 54 | validateSolanaChainID(data.SelectorsBySolanaChainId) 55 | return data.SelectorsBySolanaChainId 56 | } 57 | 58 | func validateSolanaChainID(data map[string]ChainDetails) { 59 | for genesisHash := range data { 60 | b, err := base58.Decode(genesisHash) 61 | if err != nil { 62 | panic(fmt.Errorf("failed to decode base58 genesis hash %s: %w", genesisHash, err)) 63 | } 64 | if len(b) != 32 { 65 | panic(fmt.Errorf("decoded genesis hash %s is not 32 bytes long", genesisHash)) 66 | } 67 | } 68 | } 69 | 70 | func SolanaChainIdToChainSelector() map[string]uint64 { 71 | copyMap := make(map[string]uint64, len(solanaChainIdToChainSelector)) 72 | for k, v := range solanaChainIdToChainSelector { 73 | copyMap[k] = v.ChainSelector 74 | } 75 | return copyMap 76 | } 77 | 78 | func SolanaNameFromChainId(chainId string) (string, error) { 79 | details, exist := solanaChainIdToChainSelector[chainId] 80 | if !exist { 81 | return "", fmt.Errorf("chain name not found for chain %v", chainId) 82 | } 83 | if details.ChainName == "" { 84 | return chainId, nil 85 | } 86 | return details.ChainName, nil 87 | } 88 | 89 | func SolanaChainIdFromSelector(selector uint64) (string, error) { 90 | chain, exist := solanaChainsBySelector[selector] 91 | if !exist { 92 | return "", fmt.Errorf("chain not found for selector %d", selector) 93 | } 94 | 95 | return chain.ChainID, nil 96 | } 97 | 98 | func SolanaChainBySelector(selector uint64) (SolanaChain, bool) { 99 | chain, exists := solanaChainsBySelector[selector] 100 | 101 | return chain, exists 102 | } 103 | -------------------------------------------------------------------------------- /solana_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "math/rand" 6 | "testing" 7 | 8 | "github.com/stretchr/testify/assert" 9 | "github.com/stretchr/testify/require" 10 | ) 11 | 12 | func Test_YmlAreValid(t *testing.T) { 13 | tests := []struct { 14 | name string 15 | chainSelector uint64 16 | chainsId string 17 | expectErr bool 18 | }{ 19 | { 20 | name: "solana-mainnet", 21 | chainSelector: 124615329519749607, 22 | chainsId: "5eykt4UsFv8P8NJdTREpY1vzqKqZKvdpKuc147dw2N9d", 23 | expectErr: false, 24 | }, 25 | { 26 | name: "solana-testnet", 27 | chainSelector: 6302590918974934319, 28 | chainsId: "4uhcVJyU9pJkvQyS88uRDiswHXSCkY3zQawwpjk2NsNY", 29 | expectErr: false, 30 | }, 31 | { 32 | name: "solana-devnet", 33 | chainSelector: 16423721717087811551, 34 | chainsId: "EtWTRABZaYq6iMfeYKouRu166VU2xqa1wcaWoxPkrZBG", 35 | expectErr: false, 36 | }, 37 | { 38 | name: "non-existing", 39 | chainSelector: rand.Uint64(), 40 | chainsId: "non-existing", 41 | expectErr: true, 42 | }, 43 | } 44 | for _, test := range tests { 45 | t.Run(test.name, func(t *testing.T) { 46 | name, err1 := SolanaNameFromChainId(test.chainsId) 47 | if test.expectErr { 48 | require.Error(t, err1) 49 | return 50 | } 51 | require.NoError(t, err1) 52 | assert.Equal(t, test.name, name) 53 | }) 54 | } 55 | } 56 | 57 | func Test_SolanaChainSelectors(t *testing.T) { 58 | for selector, chain := range solanaChainsBySelector { 59 | family, err := GetSelectorFamily(selector) 60 | require.NoError(t, err, 61 | "selector %v should be returned as solana family, but received %v", 62 | selector, err) 63 | require.NotEmpty(t, family) 64 | require.Equal(t, FamilySolana, family) 65 | 66 | id, err := SolanaChainIdFromSelector(selector) 67 | require.Nil(t, err) 68 | require.Equal(t, chain.ChainID, id) 69 | 70 | returnedChain, exists := SolanaChainBySelector(selector) 71 | require.True(t, exists) 72 | require.Equal(t, returnedChain.ChainID, id) 73 | 74 | require.Equal(t, id, returnedChain.ChainID) 75 | } 76 | } 77 | 78 | func Test_SolanaGetChainDetailsByChainIDAndFamily(t *testing.T) { 79 | for k, v := range solanaSelectorsMap { 80 | details, err := GetChainDetailsByChainIDAndFamily(k, FamilySolana) 81 | assert.NoError(t, err) 82 | assert.Equal(t, v, details) 83 | } 84 | } 85 | 86 | func Test_SolanaGetChainIDByChainSelector(t *testing.T) { 87 | for k, v := range solanaSelectorsMap { 88 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 89 | assert.NoError(t, err) 90 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 91 | } 92 | } 93 | 94 | func Test_SolanaNoOverlapBetweenRealAndTestChains(t *testing.T) { 95 | for k, _ := range solanaSelectorsMap { 96 | _, exist := solanaTestSelectorsMap[k] 97 | assert.False(t, exist, "Chain %d is duplicated between real and test chains", k) 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /sui.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | 7 | "gopkg.in/yaml.v3" 8 | ) 9 | 10 | //go:generate go run genchains_sui.go 11 | 12 | //go:embed selectors_sui.yml 13 | var suiSelectorsYml []byte 14 | 15 | var ( 16 | suiSelectorsMap = parseSuiYml(suiSelectorsYml) 17 | suiChainsBySelector = make(map[uint64]SuiChain) 18 | ) 19 | 20 | func init() { 21 | for _, v := range SuiALL { 22 | suiChainsBySelector[v.Selector] = v 23 | } 24 | } 25 | 26 | func parseSuiYml(ymlFile []byte) map[uint64]ChainDetails { 27 | type ymlData struct { 28 | SelectorsBySuiChainId map[uint64]ChainDetails `yaml:"selectors"` 29 | } 30 | 31 | var data ymlData 32 | err := yaml.Unmarshal(ymlFile, &data) 33 | if err != nil { 34 | panic(err) 35 | } 36 | 37 | validateSuiChainID(data.SelectorsBySuiChainId) 38 | return data.SelectorsBySuiChainId 39 | } 40 | 41 | func validateSuiChainID(data map[uint64]ChainDetails) { 42 | // TODO: https://smartcontract-it.atlassian.net/browse/NONEVM-890 43 | } 44 | 45 | func SuiChainIdToChainSelector() map[uint64]uint64 { 46 | copyMap := make(map[uint64]uint64, len(suiSelectorsMap)) 47 | for k, v := range suiSelectorsMap { 48 | copyMap[k] = v.ChainSelector 49 | } 50 | return copyMap 51 | } 52 | 53 | func SuiNameFromChainId(chainId uint64) (string, error) { 54 | details, exist := suiSelectorsMap[chainId] 55 | if !exist { 56 | return "", fmt.Errorf("chain name not found for chain %v", chainId) 57 | } 58 | if details.ChainName == "" { 59 | return fmt.Sprint(chainId), nil 60 | } 61 | return details.ChainName, nil 62 | } 63 | 64 | func SuiChainIdFromSelector(selector uint64) (uint64, error) { 65 | chain, exist := suiChainsBySelector[selector] 66 | if !exist { 67 | return 0, fmt.Errorf("chain id not found for selector %d", selector) 68 | } 69 | 70 | return chain.ChainID, nil 71 | } 72 | 73 | func SuiChainBySelector(selector uint64) (SuiChain, bool) { 74 | chain, exist := suiChainsBySelector[selector] 75 | return chain, exist 76 | } 77 | -------------------------------------------------------------------------------- /sui_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "github.com/stretchr/testify/require" 9 | ) 10 | 11 | func Test_SuiYmlAreValid(t *testing.T) { 12 | tests := []struct { 13 | name string 14 | chainSelector uint64 15 | chainsId uint64 16 | expectErr bool 17 | }{ 18 | { 19 | name: "sui-mainnet", 20 | chainSelector: 17529533435026248318, 21 | chainsId: 1, 22 | expectErr: false, 23 | }, 24 | { 25 | name: "sui-testnet", 26 | chainSelector: 9762610643973837292, 27 | chainsId: 2, 28 | expectErr: false, 29 | }, 30 | { 31 | name: "non-existing", 32 | chainSelector: 81923186267, 33 | chainsId: 471, 34 | expectErr: true, 35 | }, 36 | } 37 | for _, test := range tests { 38 | t.Run(test.name, func(t *testing.T) { 39 | name, err1 := SuiNameFromChainId(test.chainsId) 40 | if test.expectErr { 41 | require.Error(t, err1) 42 | return 43 | } 44 | require.NoError(t, err1) 45 | assert.Equal(t, test.name, name) 46 | }) 47 | } 48 | } 49 | 50 | func Test_SuiChainSelectors(t *testing.T) { 51 | for selector, chain := range suiChainsBySelector { 52 | family, err := GetSelectorFamily(selector) 53 | require.NoError(t, err, 54 | "selector %v should be returned as sui family, but received %v", 55 | selector, err) 56 | require.NotEmpty(t, family) 57 | require.Equal(t, FamilySui, family) 58 | 59 | id, err := SuiChainIdFromSelector(selector) 60 | require.Nil(t, err) 61 | require.Equal(t, chain.ChainID, id) 62 | 63 | returnedChain, exists := SuiChainBySelector(selector) 64 | require.True(t, exists) 65 | require.Equal(t, returnedChain.ChainID, id) 66 | require.Equal(t, id, returnedChain.ChainID) 67 | } 68 | } 69 | 70 | func Test_SuiGetChainDetailsByChainIDAndFamily(t *testing.T) { 71 | for k, v := range suiSelectorsMap { 72 | details, err := GetChainDetailsByChainIDAndFamily(fmt.Sprint(k), FamilySui) 73 | assert.NoError(t, err) 74 | assert.Equal(t, v, details) 75 | } 76 | } 77 | 78 | func Test_SuiGetChainIDByChainSelector(t *testing.T) { 79 | for k, v := range suiSelectorsMap { 80 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 81 | assert.NoError(t, err) 82 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /test_selectors.yml: -------------------------------------------------------------------------------- 1 | # EVM test selectors. 2 | # File doesn't have a family suffix for backwards compatibility. 3 | selectors: 4 | # For testing purposes 5 | 1000: 6 | selector: 11787463284727550157 7 | 2337: 8 | selector: 12922642891491394802 9 | name: geth-devnet-2 10 | 3337: 11 | selector: 4793464827907405086 12 | name: geth-devnet-3 13 | 90000001: 14 | selector: 909606746561742123 15 | 90000002: 16 | selector: 5548718428018410741 17 | 90000003: 18 | selector: 789068866484373046 19 | 90000004: 20 | selector: 5721565186521185178 21 | 90000005: 22 | selector: 964127714438319834 23 | 90000006: 24 | selector: 8966794841936584464 25 | 90000007: 26 | selector: 8412806778050735057 27 | 90000008: 28 | selector: 4066443121807923198 29 | 90000009: 30 | selector: 6747736380229414777 31 | 90000010: 32 | selector: 8694984074292254623 33 | 90000011: 34 | selector: 328334718812072308 35 | 90000012: 36 | selector: 7715160997071429212 37 | 90000013: 38 | selector: 3574539439524578558 39 | 90000014: 40 | selector: 4543928599863227519 41 | 90000015: 42 | selector: 6443235356619661032 43 | 90000016: 44 | selector: 13087962012083037329 45 | 90000017: 46 | selector: 11985232338641871056 47 | 90000018: 48 | selector: 7777066535355430289 49 | 90000019: 50 | selector: 1273605685587320666 51 | 90000020: 52 | selector: 17810359353458878177 53 | 90000021: 54 | selector: 13648736134397881410 55 | 90000022: 56 | selector: 6742472197519042017 57 | 90000023: 58 | selector: 16702426279731183946 59 | 90000024: 60 | selector: 16449698933146693970 61 | 90000025: 62 | selector: 5614341928911841614 63 | 90000026: 64 | selector: 9932483170498916221 65 | 90000027: 66 | selector: 9248511054298050610 67 | 90000028: 68 | selector: 15733873364998401606 69 | 90000029: 70 | selector: 10199579733509604193 71 | 90000030: 72 | selector: 11754399446572002459 73 | 90000031: 74 | selector: 15804983202763665802 75 | 90000032: 76 | selector: 8794884152664322911 77 | 90000033: 78 | selector: 7005880874640146484 79 | 90000034: 80 | selector: 15998314635132476942 81 | 90000035: 82 | selector: 6676710761873615962 83 | 90000036: 84 | selector: 13973515790491921010 85 | 90000037: 86 | selector: 12226902941055802385 87 | 90000038: 88 | selector: 10547673735879567911 89 | 90000039: 90 | selector: 2953028829530698683 91 | 90000040: 92 | selector: 3740583887329090549 93 | 90000041: 94 | selector: 4716670523656754658 95 | 90000042: 96 | selector: 12965905455277595820 97 | 90000043: 98 | selector: 6448403805635971860 99 | 90000044: 100 | selector: 176199025415897437 101 | 90000045: 102 | selector: 17251043223284625647 103 | 90000046: 104 | selector: 14943531413383612703 105 | 90000047: 106 | selector: 8015762103567576333 107 | 90000048: 108 | selector: 2783890746839497525 109 | 90000049: 110 | selector: 16591966440843528322 111 | 90000050: 112 | selector: 9156614022853705708 113 | 90000051: 114 | selector: 10089241509396411113 115 | 90000052: 116 | selector: 7585715102059681757 117 | 90000053: 118 | selector: 9574369650680012313 119 | 90000054: 120 | selector: 15767478222558315144 121 | 90000055: 122 | selector: 928756709184343973 123 | 90000056: 124 | selector: 13936493323944617843 125 | 90000057: 126 | selector: 9264503539336248559 127 | 90000058: 128 | selector: 7032045258883126022 129 | 90000059: 130 | selector: 13781595843667691007 131 | 90000060: 132 | selector: 6751512843227450641 133 | 90000061: 134 | selector: 12027427861168955422 135 | 90000062: 136 | selector: 6690738652320128159 137 | 90000063: 138 | selector: 12513826466599144030 139 | 90000064: 140 | selector: 7823363553221722351 141 | 90000065: 142 | selector: 17759418850483131633 143 | 90000066: 144 | selector: 1488785539820432596 145 | 90000067: 146 | selector: 12470167056735102403 147 | 90000068: 148 | selector: 6059917085984771915 149 | 90000069: 150 | selector: 8698844633699288298 151 | 90000070: 152 | selector: 11335955773964346155 153 | 90000071: 154 | selector: 15210860601736105873 155 | 90000072: 156 | selector: 15447447865219782832 157 | 90000073: 158 | selector: 7404045285477377670 159 | 90000074: 160 | selector: 14506622911400094011 161 | 90000075: 162 | selector: 18316006852148771137 163 | 90000076: 164 | selector: 7961714422080771198 165 | 90000077: 166 | selector: 15168140751097121912 167 | 90000078: 168 | selector: 8354317460459584308 169 | 90000079: 170 | selector: 1974710175227680991 171 | 90000080: 172 | selector: 15896959195233368219 173 | 90000081: 174 | selector: 13819071330241498802 175 | 90000082: 176 | selector: 3632230855428784129 177 | 90000083: 178 | selector: 3330151784927722907 179 | 90000084: 180 | selector: 973671184102733124 181 | 90000085: 182 | selector: 7353384334508842175 183 | 90000086: 184 | selector: 4174149892778961910 185 | 90000087: 186 | selector: 10497629267361915835 187 | 90000088: 188 | selector: 10537986502862404866 189 | 90000089: 190 | selector: 10106333385848939617 191 | 90000090: 192 | selector: 2509173735760116798 193 | 90000091: 194 | selector: 12499149790922928210 195 | 90000092: 196 | selector: 665284410079532457 197 | 90000093: 198 | selector: 17514102371649734225 199 | 90000094: 200 | selector: 8211981504472319767 201 | 90000095: 202 | selector: 15945074456050759193 203 | 90000096: 204 | selector: 17580537314894454709 205 | 90000097: 206 | selector: 13443138560923813712 207 | 90000098: 208 | selector: 9675086780529785020 209 | 90000099: 210 | selector: 7431973150957944526 211 | 90000100: 212 | selector: 6875898693582952601 213 | -------------------------------------------------------------------------------- /test_selectors_solana.yml: -------------------------------------------------------------------------------- 1 | selectors: 2 | # "11111111111111111111111111111111111111111111" -> system program address 3 | "22222222222222222222222222222222222222222222": 4 | selector: 12463857294658392847 5 | "33333333333333333333333333333333333333333333": 6 | selector: 9837465928374658293 7 | "44444444444444444444444444444444444444444444": 8 | selector: 16574839267584930184 9 | 10 | -------------------------------------------------------------------------------- /ton.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | 7 | "gopkg.in/yaml.v3" 8 | ) 9 | 10 | //go:generate go run genchains_ton.go 11 | 12 | //go:embed selectors_ton.yml 13 | var tonSelectorsYml []byte 14 | 15 | var ( 16 | tonSelectorsMap = parseTonYml(tonSelectorsYml) 17 | tonChainIdBySelector = make(map[uint64]int32) 18 | ) 19 | 20 | func init() { 21 | for k, v := range tonSelectorsMap { 22 | tonChainIdBySelector[v.ChainSelector] = k 23 | } 24 | } 25 | 26 | func parseTonYml(ymlFile []byte) map[int32]ChainDetails { 27 | type ymlData struct { 28 | SelectorsByTonChainId map[int32]ChainDetails `yaml:"selectors"` 29 | } 30 | 31 | var data ymlData 32 | err := yaml.Unmarshal(ymlFile, &data) 33 | if err != nil { 34 | panic(err) 35 | } 36 | 37 | return data.SelectorsByTonChainId 38 | } 39 | 40 | func TonChainIdToChainSelector() map[int32]uint64 { 41 | copyMap := make(map[int32]uint64, len(tonSelectorsMap)) 42 | for k, v := range tonSelectorsMap { 43 | copyMap[k] = v.ChainSelector 44 | } 45 | return copyMap 46 | } 47 | 48 | func TonNameFromChainId(chainId int32) (string, error) { 49 | details, exist := tonSelectorsMap[chainId] 50 | if !exist { 51 | return "", fmt.Errorf("chain name not found for chain %v", chainId) 52 | } 53 | if details.ChainName == "" { 54 | return fmt.Sprint(chainId), nil 55 | } 56 | return details.ChainName, nil 57 | } 58 | 59 | func TonChainIdFromSelector(selector uint64) (int32, error) { 60 | chainId, exist := tonChainIdBySelector[selector] 61 | if !exist { 62 | return 0, fmt.Errorf("chain id not found for selector %d", selector) 63 | } 64 | 65 | return chainId, nil 66 | } 67 | -------------------------------------------------------------------------------- /ton_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "github.com/stretchr/testify/require" 9 | ) 10 | 11 | func Test_TonYmlAreValid(t *testing.T) { 12 | tests := []struct { 13 | name string 14 | chainSelector uint64 15 | chainsId int32 16 | expectErr bool 17 | }{ 18 | { 19 | name: "ton-mainnet", 20 | chainSelector: 16448340667252469081, 21 | chainsId: -239, 22 | expectErr: false, 23 | }, 24 | { 25 | name: "ton-testnet", 26 | chainSelector: 1399300952838017768, 27 | chainsId: -3, 28 | expectErr: false, 29 | }, 30 | { 31 | name: "ton-localnet", 32 | chainSelector: 13879075125137744094, 33 | chainsId: -217, 34 | }, 35 | } 36 | for _, test := range tests { 37 | t.Run(test.name, func(t *testing.T) { 38 | name, err1 := TonNameFromChainId(test.chainsId) 39 | if test.expectErr { 40 | require.Error(t, err1) 41 | return 42 | } 43 | require.NoError(t, err1) 44 | assert.Equal(t, test.name, name) 45 | }) 46 | } 47 | } 48 | 49 | func Test_TonChainSelectors(t *testing.T) { 50 | for selector, chainId := range tonChainIdBySelector { 51 | family, err := GetSelectorFamily(selector) 52 | require.NoError(t, err, 53 | "selector %v should be returned as ton family, but received %v", 54 | selector, err) 55 | require.NotEmpty(t, family) 56 | require.Equal(t, FamilyTon, family) 57 | 58 | id, err := TonChainIdFromSelector(selector) 59 | require.Nil(t, err) 60 | require.Equal(t, chainId, id) 61 | } 62 | } 63 | 64 | func Test_TonGetChainDetailsByChainIDAndFamily(t *testing.T) { 65 | for k, v := range tonSelectorsMap { 66 | details, err := GetChainDetailsByChainIDAndFamily(fmt.Sprint(k), FamilyTon) 67 | assert.NoError(t, err) 68 | assert.Equal(t, v, details) 69 | } 70 | } 71 | 72 | func Test_TonGetChainIDByChainSelector(t *testing.T) { 73 | for k, v := range tonSelectorsMap { 74 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 75 | assert.NoError(t, err) 76 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /tron.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | _ "embed" 5 | "fmt" 6 | 7 | "gopkg.in/yaml.v3" 8 | ) 9 | 10 | //go:generate go run genchains_tron.go 11 | 12 | //go:embed selectors_tron.yml 13 | var tronSelectorsYml []byte 14 | 15 | var ( 16 | tronSelectorsMap = parseTronYml(tronSelectorsYml) 17 | tronChainIdBySelector = make(map[uint64]uint64) 18 | ) 19 | 20 | func init() { 21 | for k, v := range tronSelectorsMap { 22 | tronChainIdBySelector[v.ChainSelector] = k 23 | } 24 | } 25 | 26 | func parseTronYml(ymlFile []byte) map[uint64]ChainDetails { 27 | type ymlData struct { 28 | SelectorsByTronChainId map[uint64]ChainDetails `yaml:"selectors"` 29 | } 30 | 31 | var data ymlData 32 | err := yaml.Unmarshal(ymlFile, &data) 33 | if err != nil { 34 | panic(err) 35 | } 36 | 37 | return data.SelectorsByTronChainId 38 | } 39 | 40 | func TronChainIdToChainSelector() map[uint64]uint64 { 41 | copyMap := make(map[uint64]uint64, len(tronSelectorsMap)) 42 | for k, v := range tronSelectorsMap { 43 | copyMap[k] = v.ChainSelector 44 | } 45 | return copyMap 46 | } 47 | 48 | func TronNameFromChainId(chainId uint64) (string, error) { 49 | details, exist := tronSelectorsMap[chainId] 50 | if !exist { 51 | return "", fmt.Errorf("chain name not found for chain %v", chainId) 52 | } 53 | if details.ChainName == "" { 54 | return fmt.Sprint(chainId), nil 55 | } 56 | return details.ChainName, nil 57 | } 58 | 59 | func TronChainIdFromSelector(selector uint64) (uint64, error) { 60 | chainId, exist := tronChainIdBySelector[selector] 61 | if !exist { 62 | return 0, fmt.Errorf("chain id not found for selector %d", selector) 63 | } 64 | 65 | return chainId, nil 66 | } 67 | -------------------------------------------------------------------------------- /tron_test.go: -------------------------------------------------------------------------------- 1 | package chain_selectors 2 | 3 | import ( 4 | "fmt" 5 | "testing" 6 | 7 | "github.com/stretchr/testify/assert" 8 | "github.com/stretchr/testify/require" 9 | ) 10 | 11 | func Test_TronYmlAreValid(t *testing.T) { 12 | tests := []struct { 13 | name string 14 | chainSelector uint64 15 | chainsId uint64 16 | expectErr bool 17 | }{ 18 | { 19 | name: "tron-mainnet", 20 | chainSelector: 1546563616611573945, 21 | chainsId: 728126428, 22 | expectErr: false, 23 | }, 24 | { 25 | name: "tron-testnet-nile", 26 | chainSelector: 2052925811360307740, 27 | chainsId: 3448148188, 28 | expectErr: false, 29 | }, 30 | { 31 | name: "tron-testnet-shasta", 32 | chainSelector: 13231703482326770597, 33 | chainsId: 2494104990, 34 | expectErr: false, 35 | }, 36 | { 37 | name: "non-existing", 38 | chainSelector: 81923186267, 39 | chainsId: 471, 40 | expectErr: true, 41 | }, 42 | } 43 | for _, test := range tests { 44 | t.Run(test.name, func(t *testing.T) { 45 | name, err1 := TronNameFromChainId(test.chainsId) 46 | if test.expectErr { 47 | require.Error(t, err1) 48 | return 49 | } 50 | require.NoError(t, err1) 51 | assert.Equal(t, test.name, name) 52 | }) 53 | } 54 | } 55 | 56 | func Test_TronChainSelectors(t *testing.T) { 57 | for selector, chainId := range tronChainIdBySelector { 58 | family, err := GetSelectorFamily(selector) 59 | require.NoError(t, err, 60 | "selector %v should be returned as tron family, but received %v", 61 | selector, err) 62 | require.NotEmpty(t, family) 63 | require.Equal(t, FamilyTron, family) 64 | 65 | id, err := TronChainIdFromSelector(selector) 66 | require.Nil(t, err) 67 | require.Equal(t, chainId, id) 68 | } 69 | } 70 | 71 | func Test_TronGetChainDetailsByChainIDAndFamily(t *testing.T) { 72 | for k, v := range tronSelectorsMap { 73 | details, err := GetChainDetailsByChainIDAndFamily(fmt.Sprint(k), FamilyTron) 74 | assert.NoError(t, err) 75 | assert.Equal(t, v, details) 76 | } 77 | } 78 | 79 | func Test_TronGetChainIDByChainSelector(t *testing.T) { 80 | for k, v := range tronSelectorsMap { 81 | chainID, err := GetChainIDFromSelector(v.ChainSelector) 82 | assert.NoError(t, err) 83 | assert.Equal(t, chainID, fmt.Sprintf("%v", k)) 84 | } 85 | } 86 | --------------------------------------------------------------------------------