/
external_token.go
69 lines (59 loc) · 1.95 KB
/
external_token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package types
import (
"bytes"
"errors"
"fmt"
"regexp"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/ethereum/go-ethereum/common"
)
var (
ExternalAddressRegular = regexp.MustCompile("^0x[0-9a-fA-F]{40}$")
)
// ExternalContractAddressLen is the length of contract address strings
const ExternalContractAddressLen = 42
// ExternalAddrLessThan migrates the Ethereum address less than function
func ExternalAddrLessThan(e, o string) bool {
return bytes.Compare([]byte(e)[:], []byte(o)[:]) == -1
}
// ValidateExternalAddress validates the ethereum address strings
func ValidateExternalAddress(addr string) error {
if addr == "" {
return fmt.Errorf("empty")
}
if len(addr) != ExternalContractAddressLen {
return fmt.Errorf("address(%s) of the wrong length exp(%d) actual(%d)", addr, len(addr), ExternalContractAddressLen)
}
if !ExternalAddressRegular.MatchString(addr) {
return fmt.Errorf("address(%s) doesn't pass regex", addr)
}
// add ethereum address checksum check 2021-09-02.
if !common.IsHexAddress(addr) {
return fmt.Errorf("invalid address: %s", addr)
}
expectAddress := common.HexToAddress(addr).Hex()
if expectAddress != addr {
return fmt.Errorf("invalid address got:%s, expected:%s", addr, expectAddress)
}
return nil
}
/////////////////////////
// ExternalToken //
/////////////////////////
func NewExternalToken(amount uint64, contract string) *ExternalToken {
return &ExternalToken{Amount: sdk.NewIntFromUint64(amount), Contract: contract}
}
func NewExternalTokenBySdkInt(amount sdk.Int, contract string) *ExternalToken {
return &ExternalToken{Amount: amount, Contract: contract}
}
// ValidateBasic permforms stateless validation
func (m *ExternalToken) ValidateBasic() error {
if err := ValidateExternalAddress(m.Contract); err != nil {
return sdkerrors.Wrap(err, "ethereum address")
}
if !m.Amount.IsPositive() {
return errors.New("invalid amount")
}
return nil
}