Skip to content

Commit c4e8fa8

Browse files
reduce panic chance by checking CallToMethod return len on all cases (#2695)
* reduce panics * address RS comments * fix merge * version 1.8.8 * udpate sig agg dep --------- Signed-off-by: sukantoraymond <rsukanto@umich.edu> Co-authored-by: sukantoraymond <rsukanto@umich.edu>
1 parent fc941df commit c4e8fa8

File tree

20 files changed

+78
-114
lines changed

20 files changed

+78
-114
lines changed

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.8.7
1+
1.8.8

cmd/blockchaincmd/change_weight.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,7 @@ func setWeight(_ *cobra.Command, args []string) error {
166166
return fmt.Errorf("unable to find Validator Manager address")
167167
}
168168
validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress
169-
validationID, err := validator.GetValidationID(rpcURL, nodeID, validatorManagerAddress)
169+
validationID, err := validator.GetValidationID(rpcURL, common.HexToAddress(validatorManagerAddress), nodeID)
170170
if err != nil {
171171
return err
172172
}

cmd/blockchaincmd/remove_validator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func removeValidator(_ *cobra.Command, args []string) error {
167167
}
168168
}
169169
validatorManagerAddress = sc.Networks[network.Name()].ValidatorManagerAddress
170-
validationID, err := validatorsdk.GetRegisteredValidator(
170+
validationID, err := validatorsdk.GetValidationID(
171171
rpcURL,
172172
common.HexToAddress(validatorManagerAddress),
173173
nodeID,

cmd/validatorcmd/getBalance.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ func getNodeValidationID(
194194
return ids.Empty, false, err
195195
}
196196
managerAddress := common.HexToAddress(validatorManagerAddress)
197-
validationID, err = validator.GetRegisteredValidator(rpcURL, managerAddress, nodeID)
197+
validationID, err = validator.GetValidationID(rpcURL, managerAddress, nodeID)
198198
if err != nil {
199199
return ids.Empty, false, err
200200
}

cmd/validatorcmd/list.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ func list(_ *cobra.Command, args []string) error {
107107
return err
108108
}
109109
balance := uint64(0)
110-
validationID, err := validator.GetRegisteredValidator(rpcURL, managerAddress, nodeID)
110+
validationID, err := validator.GetValidationID(rpcURL, managerAddress, nodeID)
111111
if err != nil {
112112
ux.Logger.RedXToUser("could not get validation ID for node %s due to %s", nodeID, err)
113113
} else {

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ toolchain go1.23.7
77
require (
88
github.com/ava-labs/apm v1.0.0
99
github.com/ava-labs/avalanche-network-runner v1.8.4-0.20250324213418-9a0709b1ecfa
10-
github.com/ava-labs/avalanchego v1.13.1-0.20250324225627-486823637d34
10+
github.com/ava-labs/avalanchego v1.13.1-0.20250326010016-044f93f83526
1111
github.com/ava-labs/coreth v0.15.0-rc.0
12-
github.com/ava-labs/icm-services v1.4.1-0.20250325155249-78c179bf6bd0
12+
github.com/ava-labs/icm-services v1.4.1-0.20250326180348-905d5a5cea3a
1313
github.com/ava-labs/subnet-evm v0.7.2
1414
github.com/aws/aws-sdk-go-v2 v1.36.3
1515
github.com/aws/aws-sdk-go-v2/config v1.29.10
@@ -28,8 +28,8 @@ require (
2828
github.com/mitchellh/go-wordwrap v1.0.1
2929
github.com/okteto/remote v0.0.0-20210428052247-99de42c04148
3030
github.com/olekukonko/tablewriter v0.0.5
31-
github.com/onsi/ginkgo/v2 v2.23.2
32-
github.com/onsi/gomega v1.36.2
31+
github.com/onsi/ginkgo/v2 v2.23.3
32+
github.com/onsi/gomega v1.36.3
3333
github.com/otiai10/copy v1.14.1
3434
github.com/pborman/ansi v1.0.0
3535
github.com/pingcap/errors v0.11.4
@@ -136,7 +136,7 @@ require (
136136
github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect
137137
github.com/google/btree v1.1.2 // indirect
138138
github.com/google/gnostic-models v0.6.8 // indirect
139-
github.com/google/go-cmp v0.6.0 // indirect
139+
github.com/google/go-cmp v0.7.0 // indirect
140140
github.com/google/gofuzz v1.2.0 // indirect
141141
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
142142
github.com/google/renameio/v2 v2.0.0 // indirect

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ github.com/ava-labs/apm v1.0.0 h1:6FwozH67hEkbWVsOXNZGexBy5KLpNeYucN9zcFUHv+Q=
8787
github.com/ava-labs/apm v1.0.0/go.mod h1:TJL7pTlZNvQatsQPsLUtDHApEwVZ/qS7iSNtRFU83mc=
8888
github.com/ava-labs/avalanche-network-runner v1.8.4-0.20250324213418-9a0709b1ecfa h1:au/JtMdG7G/2gLGj9aQ16vuXCH+2G7lom/nB50JU83g=
8989
github.com/ava-labs/avalanche-network-runner v1.8.4-0.20250324213418-9a0709b1ecfa/go.mod h1:pc9xuk13LI/T//cd7otZKxnYwac6/ego6twNO5TOB9Q=
90-
github.com/ava-labs/avalanchego v1.13.1-0.20250324225627-486823637d34 h1:ytaybTqpkow2XgTuXsURe2rfFEepip776RNcOaaYNaU=
91-
github.com/ava-labs/avalanchego v1.13.1-0.20250324225627-486823637d34/go.mod h1:fpV/GmbfIB3P53gkq6zFpyeQtyAsJIuZCCKnm7TJ4sQ=
90+
github.com/ava-labs/avalanchego v1.13.1-0.20250326010016-044f93f83526 h1:SfanfD6LKFujnsVGnEa3vfqIXpCVLVh7ZYbcfqcAF+w=
91+
github.com/ava-labs/avalanchego v1.13.1-0.20250326010016-044f93f83526/go.mod h1:fpV/GmbfIB3P53gkq6zFpyeQtyAsJIuZCCKnm7TJ4sQ=
9292
github.com/ava-labs/coreth v0.15.0-rc.0 h1:wabaNbSXcqhhO6Qg/9fnrgDNCuP3StwB5sls45dHbiI=
9393
github.com/ava-labs/coreth v0.15.0-rc.0/go.mod h1:gIGr+5WDNX1DrFvUMy53AtTpkxlM/8cNOD/PDIChKfM=
9494
github.com/ava-labs/icm-contracts v1.0.9-0.20250313201018-6720d04bee51 h1:M5VSWigKuet7z1LTfCC60Zu+Z3Q2+ZxmB7a94cxiEKI=
9595
github.com/ava-labs/icm-contracts v1.0.9-0.20250313201018-6720d04bee51/go.mod h1:lbL9AI0C2COWBGtygUCQkSudwUbLw46AG1maAFv4J5k=
96-
github.com/ava-labs/icm-services v1.4.1-0.20250325155249-78c179bf6bd0 h1:PdP8qATBm6HUw1OHJu9w8K2XixghyVEqjRlKSFbcT/o=
97-
github.com/ava-labs/icm-services v1.4.1-0.20250325155249-78c179bf6bd0/go.mod h1:qFMuFfIx8//yKwC1W+GtquQaHhryMsWg4/fjrS2njks=
96+
github.com/ava-labs/icm-services v1.4.1-0.20250326180348-905d5a5cea3a h1:4RyktAqntpt+3HW8h7SnqHwPXqYC9nRDaJpOpqLENBM=
97+
github.com/ava-labs/icm-services v1.4.1-0.20250326180348-905d5a5cea3a/go.mod h1:y1B9eagKHioYYboJ1r3RyYX2kAMj9TaIJgLAbk9Pb4Q=
9898
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60 h1:EL66gtXOAwR/4KYBjOV03LTWgkEXvLePribLlJNu4g0=
9999
github.com/ava-labs/ledger-avalanche/go v0.0.0-20241009183145-e6f90a8a1a60/go.mod h1:/7qKobTfbzBu7eSTVaXMTr56yTYk4j2Px6/8G+idxHo=
100100
github.com/ava-labs/subnet-evm v0.7.2 h1:AxmXT9tmuxmUi+hDqtoS0OVi0zi8fPqPcoQ7yjZ6FZQ=
@@ -441,8 +441,8 @@ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
441441
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
442442
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
443443
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
444-
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
445-
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
444+
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
445+
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
446446
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
447447
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
448448
github.com/google/gofuzz v1.1.1-0.20200604201612-c04b05f3adfa/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
@@ -702,16 +702,16 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
702702
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
703703
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
704704
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
705-
github.com/onsi/ginkgo/v2 v2.23.2 h1:LYLd7Wz401p0N7xR8y7WL6D2QZwKpbirDg0EVIvzvMM=
706-
github.com/onsi/ginkgo/v2 v2.23.2/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM=
705+
github.com/onsi/ginkgo/v2 v2.23.3 h1:edHxnszytJ4lD9D5Jjc4tiDkPBZ3siDeJJkUZJJVkp0=
706+
github.com/onsi/ginkgo/v2 v2.23.3/go.mod h1:zXTP6xIp3U8aVuXN8ENK9IXRaTjFnpVB9mGmaSRvxnM=
707707
github.com/onsi/gomega v1.4.1/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA=
708708
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
709709
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
710710
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
711711
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
712712
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
713-
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
714-
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
713+
github.com/onsi/gomega v1.36.3 h1:hID7cr8t3Wp26+cYnfcjR6HpJ00fdogN6dqZ1t6IylU=
714+
github.com/onsi/gomega v1.36.3/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
715715
github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
716716
github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
717717
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=

pkg/contract/contract.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,21 @@ func CallToMethod(
604604
return out, nil
605605
}
606606

607+
func GetSmartContractCallResult[T any](methodName string, out []interface{}) (T, error) {
608+
empty := new(T)
609+
if len(out) == 0 {
610+
return *empty, fmt.Errorf("error at %s call: no return value", methodName)
611+
}
612+
if len(out) != 1 {
613+
return *empty, fmt.Errorf("error at %s call: expected 1 return value, got %d", methodName, len(out))
614+
}
615+
received, typeIsOk := out[0].(T)
616+
if !typeIsOk {
617+
return *empty, fmt.Errorf("error at %s call, expected %T, got %T", methodName, *empty, out[0])
618+
}
619+
return received, nil
620+
}
621+
607622
func DeployContract(
608623
rpcURL string,
609624
privateKey string,

pkg/contract/ownable.go

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@
22
// See the file LICENSE for licensing terms.
33
package contract
44

5-
import (
6-
_ "embed"
7-
"fmt"
8-
9-
"github.com/ethereum/go-ethereum/common"
10-
)
5+
import "github.com/ethereum/go-ethereum/common"
116

127
// GetContractOwner gets owner for https://docs.openzeppelin.com/contracts/2.x/api/ownership#Ownable-owner contracts
138
func GetContractOwner(
@@ -22,10 +17,5 @@ func GetContractOwner(
2217
if err != nil {
2318
return common.Address{}, err
2419
}
25-
26-
ownerAddr, ok := out[0].(common.Address)
27-
if !ok {
28-
return common.Address{}, fmt.Errorf("error at owner() call, expected common.Address, got %T", out[0])
29-
}
30-
return ownerAddr, nil
20+
return GetSmartContractCallResult[common.Address]("owner", out)
3121
}

pkg/ictt/operate.go

Lines changed: 9 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,7 @@ func ERC20TokenHomeGetTokenAddress(
5555
if err != nil {
5656
return common.Address{}, err
5757
}
58-
tokenAddress, b := out[0].(common.Address)
59-
if !b {
60-
return common.Address{}, fmt.Errorf("error at token call, expected common.Address, got %T", out[0])
61-
}
62-
return tokenAddress, nil
58+
return contract.GetSmartContractCallResult[common.Address]("token", out)
6359
}
6460

6561
func NativeTokenHomeGetTokenAddress(
@@ -74,11 +70,7 @@ func NativeTokenHomeGetTokenAddress(
7470
if err != nil {
7571
return common.Address{}, err
7672
}
77-
tokenAddress, b := out[0].(common.Address)
78-
if !b {
79-
return common.Address{}, fmt.Errorf("error at wrappedToken call, expected common.Address, got %T", out[0])
80-
}
81-
return tokenAddress, nil
73+
return contract.GetSmartContractCallResult[common.Address]("wrappedToken", out)
8274
}
8375

8476
func TokenRemoteIsCollateralized(
@@ -93,11 +85,7 @@ func TokenRemoteIsCollateralized(
9385
if err != nil {
9486
return false, err
9587
}
96-
isCollateralized, b := out[0].(bool)
97-
if !b {
98-
return false, fmt.Errorf("error at isCollateralized call, expected bool, got %T", out[0])
99-
}
100-
return isCollateralized, nil
88+
return contract.GetSmartContractCallResult[bool]("isCollateralized", out)
10189
}
10290

10391
func TokenHomeGetDecimals(
@@ -112,11 +100,7 @@ func TokenHomeGetDecimals(
112100
if err != nil {
113101
return 0, err
114102
}
115-
decimals, b := out[0].(uint8)
116-
if !b {
117-
return 0, fmt.Errorf("error at tokenDecimals, expected uint8, got %T", out[0])
118-
}
119-
return decimals, nil
103+
return contract.GetSmartContractCallResult[uint8]("tokenDecimals", out)
120104
}
121105

122106
type RegisteredRemote struct {
@@ -146,6 +130,9 @@ func TokenHomeGetRegisteredRemote(
146130
registeredRemote RegisteredRemote
147131
b bool
148132
)
133+
if len(out) != 4 {
134+
return RegisteredRemote{}, fmt.Errorf("error at registeredRemotes call, expected 4 return values, got %d", len(out))
135+
}
149136
registeredRemote.Registered, b = out[0].(bool)
150137
if !b {
151138
return RegisteredRemote{}, fmt.Errorf("error at registeredRemotes call, expected bool, got %T", out[0])
@@ -177,11 +164,7 @@ func ERC20TokenRemoteGetTokenHomeAddress(
177164
if err != nil {
178165
return common.Address{}, err
179166
}
180-
tokenHubAddress, b := out[0].(common.Address)
181-
if !b {
182-
return common.Address{}, fmt.Errorf("error at tokenHubAddress call, expected common.Address, got %T", out[0])
183-
}
184-
return tokenHubAddress, nil
167+
return contract.GetSmartContractCallResult[common.Address]("tokenHomeAddress", out)
185168
}
186169

187170
func NativeTokenRemoteGetTotalNativeAssetSupply(
@@ -196,11 +179,7 @@ func NativeTokenRemoteGetTotalNativeAssetSupply(
196179
if err != nil {
197180
return nil, err
198181
}
199-
supply, b := out[0].(*big.Int)
200-
if !b {
201-
return nil, fmt.Errorf("error at totalNativeAssetSupply, expected *big.Int, got %T", out[0])
202-
}
203-
return supply, nil
182+
return contract.GetSmartContractCallResult[*big.Int]("totalNativeAssetSupply", out)
204183
}
205184

206185
func ERC20TokenHomeSend(

0 commit comments

Comments
 (0)