-
Notifications
You must be signed in to change notification settings - Fork 109
/
types.go
114 lines (89 loc) · 2.76 KB
/
types.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package types
import (
"crypto/sha256"
"fmt"
"sort"
"strings"
"github.com/axelarnetwork/axelar-core/utils"
"github.com/axelarnetwork/axelar-core/x/axelarnet/exported"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/address"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)
// NewLinkedAddress creates a new address to make a deposit which can be transferred to another blockchain
func NewLinkedAddress(ctx sdk.Context, chain, symbol, recipientAddr string) sdk.AccAddress {
nonce := utils.GetNonce(ctx.HeaderHash(), ctx.BlockGasMeter())
hash := sha256.Sum256([]byte(fmt.Sprintf("%s_%s_%s_%x", chain, symbol, recipientAddr, nonce)))
return hash[:address.Len]
}
// GetEscrowAddress creates an address for an ibc denomination
func GetEscrowAddress(denom string) sdk.AccAddress {
hash := sha256.Sum256([]byte(denom))
return hash[:address.Len]
}
// Validate checks the stateless validity of the transfer
func (m IBCTransfer) Validate() error {
if err := sdk.VerifyAddressFormat(m.Sender); err != nil {
return err
}
if err := utils.ValidateString(m.PortID); err != nil {
return sdkerrors.Wrap(err, "invalid port ID")
}
if err := utils.ValidateString(m.ChannelID); err != nil {
return sdkerrors.Wrap(err, "invalid channel ID")
}
if err := utils.ValidateString(m.Receiver); err != nil {
return sdkerrors.Wrap(err, "invalid receiver")
}
if err := m.Token.Validate(); err != nil {
return err
}
return nil
}
type sortedChains []CosmosChain
func (s sortedChains) Len() int {
return len(s)
}
func (s sortedChains) Less(i, j int) bool {
return s[i].Name < s[j].Name
}
func (s sortedChains) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
// SortChains sorts the given slice
func SortChains(chains []CosmosChain) {
sort.Stable(sortedChains(chains))
}
type sortedTransfers []IBCTransfer
func (s sortedTransfers) Len() int {
return len(s)
}
func (s sortedTransfers) Less(i, j int) bool {
return s[i].String() < s[j].String()
}
func (s sortedTransfers) Swap(i, j int) {
s[i], s[j] = s[j], s[i]
}
// SortTransfers sorts the given slice
func SortTransfers(transfers []IBCTransfer) {
sort.Stable(sortedTransfers(transfers))
}
// Validate checks the stateless validity of the cosmos chain
func (m CosmosChain) Validate() error {
if strings.EqualFold(m.Name, exported.Axelarnet.Name) {
if m.IBCPath != "" {
return fmt.Errorf("IBC path should be empty for %s", exported.Axelarnet.Name)
}
} else {
if err := utils.ValidateString(m.IBCPath); err != nil {
return sdkerrors.Wrap(err, "invalid IBC path")
}
}
if err := utils.ValidateString(m.Name); err != nil {
return sdkerrors.Wrap(err, "invalid name")
}
if err := utils.ValidateString(m.AddrPrefix); err != nil {
return sdkerrors.Wrap(err, "invalid address prefix")
}
return nil
}