2022-12-16 09:48:38 +00:00
|
|
|
// Copyright 2021 Evmos Foundation
|
|
|
|
// This file is part of Evmos' Ethermint library.
|
|
|
|
//
|
|
|
|
// The Ethermint library is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU Lesser General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// The Ethermint library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public License
|
|
|
|
// along with the Ethermint library. If not, see https://github.com/evmos/ethermint/blob/main/LICENSE
|
2020-09-24 17:50:47 +00:00
|
|
|
package types
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"math/big"
|
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
|
2022-11-14 19:40:14 +00:00
|
|
|
errorsmod "cosmossdk.io/errors"
|
2020-09-24 17:50:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
2021-08-17 14:11:26 +00:00
|
|
|
regexChainID = `[a-z]{1,}`
|
|
|
|
regexEIP155Separator = `_{1}`
|
|
|
|
regexEIP155 = `[1-9][0-9]*`
|
|
|
|
regexEpochSeparator = `-{1}`
|
|
|
|
regexEpoch = `[1-9][0-9]*`
|
2022-08-26 10:30:55 +00:00
|
|
|
ethermintChainID = regexp.MustCompile(fmt.Sprintf(`^(%s)%s(%s)%s(%s)$`,
|
|
|
|
regexChainID,
|
|
|
|
regexEIP155Separator,
|
|
|
|
regexEIP155,
|
|
|
|
regexEpochSeparator,
|
|
|
|
regexEpoch))
|
2020-09-24 17:50:47 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
// IsValidChainID returns false if the given chain identifier is incorrectly formatted.
|
|
|
|
func IsValidChainID(chainID string) bool {
|
|
|
|
if len(chainID) > 48 {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return ethermintChainID.MatchString(chainID)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ParseChainID parses a string chain identifier's epoch to an Ethereum-compatible
|
|
|
|
// chain-id in *big.Int format. The function returns an error if the chain-id has an invalid format
|
|
|
|
func ParseChainID(chainID string) (*big.Int, error) {
|
|
|
|
chainID = strings.TrimSpace(chainID)
|
|
|
|
if len(chainID) > 48 {
|
2022-11-14 19:40:14 +00:00
|
|
|
return nil, errorsmod.Wrapf(ErrInvalidChainID, "chain-id '%s' cannot exceed 48 chars", chainID)
|
2020-09-24 17:50:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
matches := ethermintChainID.FindStringSubmatch(chainID)
|
2021-08-17 14:11:26 +00:00
|
|
|
if matches == nil || len(matches) != 4 || matches[1] == "" {
|
2022-11-14 19:40:14 +00:00
|
|
|
return nil, errorsmod.Wrapf(ErrInvalidChainID, "%s: %v", chainID, matches)
|
2020-09-24 17:50:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// verify that the chain-id entered is a base 10 integer
|
|
|
|
chainIDInt, ok := new(big.Int).SetString(matches[2], 10)
|
|
|
|
if !ok {
|
2022-11-14 19:40:14 +00:00
|
|
|
return nil, errorsmod.Wrapf(ErrInvalidChainID, "epoch %s must be base-10 integer format", matches[2])
|
2020-09-24 17:50:47 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return chainIDInt, nil
|
|
|
|
}
|