Skip to content

Commit 52ec2b5

Browse files
authored
accounts/abi: fix panic when check event with log has empty or nil topics (#32503)
When the log has empty or nil topics, the generated bindings code will panic when accessing `log.Topics[0]`, add a check to avoid it.
1 parent 7db6c91 commit 52ec2b5

File tree

12 files changed

+48
-23
lines changed

12 files changed

+48
-23
lines changed

accounts/abi/abigen/source2.go.tpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ var (
183183
// Solidity: {{.Original.String}}
184184
func ({{ decapitalise $contract.Type}} *{{$contract.Type}}) Unpack{{.Normalized.Name}}Event(log *types.Log) (*{{$contract.Type}}{{.Normalized.Name}}, error) {
185185
event := "{{.Original.Name}}"
186-
if log.Topics[0] != {{ decapitalise $contract.Type}}.abi.Events[event].ID {
186+
if len(log.Topics) == 0 || log.Topics[0] != {{ decapitalise $contract.Type}}.abi.Events[event].ID {
187187
return nil, errors.New("event signature mismatch")
188188
}
189189
out := new({{$contract.Type}}{{.Normalized.Name}})

accounts/abi/abigen/testdata/v2/crowdsale.go.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -360,7 +360,7 @@ func (CrowdsaleFundTransfer) ContractEventName() string {
360360
// Solidity: event FundTransfer(address backer, uint256 amount, bool isContribution)
361361
func (crowdsale *Crowdsale) UnpackFundTransferEvent(log *types.Log) (*CrowdsaleFundTransfer, error) {
362362
event := "FundTransfer"
363-
if log.Topics[0] != crowdsale.abi.Events[event].ID {
363+
if len(log.Topics) == 0 || log.Topics[0] != crowdsale.abi.Events[event].ID {
364364
return nil, errors.New("event signature mismatch")
365365
}
366366
out := new(CrowdsaleFundTransfer)

accounts/abi/abigen/testdata/v2/dao.go.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -606,7 +606,7 @@ func (DAOChangeOfRules) ContractEventName() string {
606606
// Solidity: event ChangeOfRules(uint256 minimumQuorum, uint256 debatingPeriodInMinutes, int256 majorityMargin)
607607
func (dAO *DAO) UnpackChangeOfRulesEvent(log *types.Log) (*DAOChangeOfRules, error) {
608608
event := "ChangeOfRules"
609-
if log.Topics[0] != dAO.abi.Events[event].ID {
609+
if len(log.Topics) == 0 || log.Topics[0] != dAO.abi.Events[event].ID {
610610
return nil, errors.New("event signature mismatch")
611611
}
612612
out := new(DAOChangeOfRules)
@@ -648,7 +648,7 @@ func (DAOMembershipChanged) ContractEventName() string {
648648
// Solidity: event MembershipChanged(address member, bool isMember)
649649
func (dAO *DAO) UnpackMembershipChangedEvent(log *types.Log) (*DAOMembershipChanged, error) {
650650
event := "MembershipChanged"
651-
if log.Topics[0] != dAO.abi.Events[event].ID {
651+
if len(log.Topics) == 0 || log.Topics[0] != dAO.abi.Events[event].ID {
652652
return nil, errors.New("event signature mismatch")
653653
}
654654
out := new(DAOMembershipChanged)
@@ -692,7 +692,7 @@ func (DAOProposalAdded) ContractEventName() string {
692692
// Solidity: event ProposalAdded(uint256 proposalID, address recipient, uint256 amount, string description)
693693
func (dAO *DAO) UnpackProposalAddedEvent(log *types.Log) (*DAOProposalAdded, error) {
694694
event := "ProposalAdded"
695-
if log.Topics[0] != dAO.abi.Events[event].ID {
695+
if len(log.Topics) == 0 || log.Topics[0] != dAO.abi.Events[event].ID {
696696
return nil, errors.New("event signature mismatch")
697697
}
698698
out := new(DAOProposalAdded)
@@ -736,7 +736,7 @@ func (DAOProposalTallied) ContractEventName() string {
736736
// Solidity: event ProposalTallied(uint256 proposalID, int256 result, uint256 quorum, bool active)
737737
func (dAO *DAO) UnpackProposalTalliedEvent(log *types.Log) (*DAOProposalTallied, error) {
738738
event := "ProposalTallied"
739-
if log.Topics[0] != dAO.abi.Events[event].ID {
739+
if len(log.Topics) == 0 || log.Topics[0] != dAO.abi.Events[event].ID {
740740
return nil, errors.New("event signature mismatch")
741741
}
742742
out := new(DAOProposalTallied)
@@ -780,7 +780,7 @@ func (DAOVoted) ContractEventName() string {
780780
// Solidity: event Voted(uint256 proposalID, bool position, address voter, string justification)
781781
func (dAO *DAO) UnpackVotedEvent(log *types.Log) (*DAOVoted, error) {
782782
event := "Voted"
783-
if log.Topics[0] != dAO.abi.Events[event].ID {
783+
if len(log.Topics) == 0 || log.Topics[0] != dAO.abi.Events[event].ID {
784784
return nil, errors.New("event signature mismatch")
785785
}
786786
out := new(DAOVoted)

accounts/abi/abigen/testdata/v2/eventchecker.go.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func (EventCheckerDynamic) ContractEventName() string {
7272
// Solidity: event dynamic(string indexed idxStr, bytes indexed idxDat, string str, bytes dat)
7373
func (eventChecker *EventChecker) UnpackDynamicEvent(log *types.Log) (*EventCheckerDynamic, error) {
7474
event := "dynamic"
75-
if log.Topics[0] != eventChecker.abi.Events[event].ID {
75+
if len(log.Topics) == 0 || log.Topics[0] != eventChecker.abi.Events[event].ID {
7676
return nil, errors.New("event signature mismatch")
7777
}
7878
out := new(EventCheckerDynamic)
@@ -112,7 +112,7 @@ func (EventCheckerEmpty) ContractEventName() string {
112112
// Solidity: event empty()
113113
func (eventChecker *EventChecker) UnpackEmptyEvent(log *types.Log) (*EventCheckerEmpty, error) {
114114
event := "empty"
115-
if log.Topics[0] != eventChecker.abi.Events[event].ID {
115+
if len(log.Topics) == 0 || log.Topics[0] != eventChecker.abi.Events[event].ID {
116116
return nil, errors.New("event signature mismatch")
117117
}
118118
out := new(EventCheckerEmpty)
@@ -154,7 +154,7 @@ func (EventCheckerIndexed) ContractEventName() string {
154154
// Solidity: event indexed(address indexed addr, int256 indexed num)
155155
func (eventChecker *EventChecker) UnpackIndexedEvent(log *types.Log) (*EventCheckerIndexed, error) {
156156
event := "indexed"
157-
if log.Topics[0] != eventChecker.abi.Events[event].ID {
157+
if len(log.Topics) == 0 || log.Topics[0] != eventChecker.abi.Events[event].ID {
158158
return nil, errors.New("event signature mismatch")
159159
}
160160
out := new(EventCheckerIndexed)
@@ -196,7 +196,7 @@ func (EventCheckerMixed) ContractEventName() string {
196196
// Solidity: event mixed(address indexed addr, int256 num)
197197
func (eventChecker *EventChecker) UnpackMixedEvent(log *types.Log) (*EventCheckerMixed, error) {
198198
event := "mixed"
199-
if log.Topics[0] != eventChecker.abi.Events[event].ID {
199+
if len(log.Topics) == 0 || log.Topics[0] != eventChecker.abi.Events[event].ID {
200200
return nil, errors.New("event signature mismatch")
201201
}
202202
out := new(EventCheckerMixed)
@@ -238,7 +238,7 @@ func (EventCheckerUnnamed) ContractEventName() string {
238238
// Solidity: event unnamed(uint256 indexed arg0, uint256 indexed arg1)
239239
func (eventChecker *EventChecker) UnpackUnnamedEvent(log *types.Log) (*EventCheckerUnnamed, error) {
240240
event := "unnamed"
241-
if log.Topics[0] != eventChecker.abi.Events[event].ID {
241+
if len(log.Topics) == 0 || log.Topics[0] != eventChecker.abi.Events[event].ID {
242242
return nil, errors.New("event signature mismatch")
243243
}
244244
out := new(EventCheckerUnnamed)

accounts/abi/abigen/testdata/v2/nameconflict.go.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ func (NameConflictLog) ContractEventName() string {
134134
// Solidity: event log(int256 msg, int256 _msg)
135135
func (nameConflict *NameConflict) UnpackLogEvent(log *types.Log) (*NameConflictLog, error) {
136136
event := "log"
137-
if log.Topics[0] != nameConflict.abi.Events[event].ID {
137+
if len(log.Topics) == 0 || log.Topics[0] != nameConflict.abi.Events[event].ID {
138138
return nil, errors.New("event signature mismatch")
139139
}
140140
out := new(NameConflictLog)

accounts/abi/abigen/testdata/v2/numericmethodname.go.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (NumericMethodNameE1TestEvent) ContractEventName() string {
136136
// Solidity: event _1TestEvent(address _param)
137137
func (numericMethodName *NumericMethodName) UnpackE1TestEventEvent(log *types.Log) (*NumericMethodNameE1TestEvent, error) {
138138
event := "_1TestEvent"
139-
if log.Topics[0] != numericMethodName.abi.Events[event].ID {
139+
if len(log.Topics) == 0 || log.Topics[0] != numericMethodName.abi.Events[event].ID {
140140
return nil, errors.New("event signature mismatch")
141141
}
142142
out := new(NumericMethodNameE1TestEvent)

accounts/abi/abigen/testdata/v2/overload.go.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ func (OverloadBar) ContractEventName() string {
114114
// Solidity: event bar(uint256 i)
115115
func (overload *Overload) UnpackBarEvent(log *types.Log) (*OverloadBar, error) {
116116
event := "bar"
117-
if log.Topics[0] != overload.abi.Events[event].ID {
117+
if len(log.Topics) == 0 || log.Topics[0] != overload.abi.Events[event].ID {
118118
return nil, errors.New("event signature mismatch")
119119
}
120120
out := new(OverloadBar)
@@ -156,7 +156,7 @@ func (OverloadBar0) ContractEventName() string {
156156
// Solidity: event bar(uint256 i, uint256 j)
157157
func (overload *Overload) UnpackBar0Event(log *types.Log) (*OverloadBar0, error) {
158158
event := "bar0"
159-
if log.Topics[0] != overload.abi.Events[event].ID {
159+
if len(log.Topics) == 0 || log.Topics[0] != overload.abi.Events[event].ID {
160160
return nil, errors.New("event signature mismatch")
161161
}
162162
out := new(OverloadBar0)

accounts/abi/abigen/testdata/v2/token.go.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ func (TokenTransfer) ContractEventName() string {
386386
// Solidity: event Transfer(address indexed from, address indexed to, uint256 value)
387387
func (token *Token) UnpackTransferEvent(log *types.Log) (*TokenTransfer, error) {
388388
event := "Transfer"
389-
if log.Topics[0] != token.abi.Events[event].ID {
389+
if len(log.Topics) == 0 || log.Topics[0] != token.abi.Events[event].ID {
390390
return nil, errors.New("event signature mismatch")
391391
}
392392
out := new(TokenTransfer)

accounts/abi/abigen/testdata/v2/tuple.go.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ func (TupleTupleEvent) ContractEventName() string {
193193
// Solidity: event TupleEvent((uint256,uint256[],(uint256,uint256)[]) a, (uint256,uint256)[2][] b, (uint256,uint256)[][2] c, (uint256,uint256[],(uint256,uint256)[])[] d, uint256[] e)
194194
func (tuple *Tuple) UnpackTupleEventEvent(log *types.Log) (*TupleTupleEvent, error) {
195195
event := "TupleEvent"
196-
if log.Topics[0] != tuple.abi.Events[event].ID {
196+
if len(log.Topics) == 0 || log.Topics[0] != tuple.abi.Events[event].ID {
197197
return nil, errors.New("event signature mismatch")
198198
}
199199
out := new(TupleTupleEvent)
@@ -234,7 +234,7 @@ func (TupleTupleEvent2) ContractEventName() string {
234234
// Solidity: event TupleEvent2((uint8,uint8)[] arg0)
235235
func (tuple *Tuple) UnpackTupleEvent2Event(log *types.Log) (*TupleTupleEvent2, error) {
236236
event := "TupleEvent2"
237-
if log.Topics[0] != tuple.abi.Events[event].ID {
237+
if len(log.Topics) == 0 || log.Topics[0] != tuple.abi.Events[event].ID {
238238
return nil, errors.New("event signature mismatch")
239239
}
240240
out := new(TupleTupleEvent2)

accounts/abi/bind/v2/internal/contracts/db/bindings.go

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)