-
Notifications
You must be signed in to change notification settings - Fork 14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
refactor(staking/precompile): split into method and abi #785
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -18,15 +18,13 @@ import ( | |||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
type DelegateV2Method struct { | ||||||||||||||||||||||||||||||||||||||||||||
*Keeper | ||||||||||||||||||||||||||||||||||||||||||||
abi.Method | ||||||||||||||||||||||||||||||||||||||||||||
abi.Event | ||||||||||||||||||||||||||||||||||||||||||||
DelegateV2ABI | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func NewDelegateV2Method(keeper *Keeper) *DelegateV2Method { | ||||||||||||||||||||||||||||||||||||||||||||
return &DelegateV2Method{ | ||||||||||||||||||||||||||||||||||||||||||||
Keeper: keeper, | ||||||||||||||||||||||||||||||||||||||||||||
Method: stakingABI.Methods["delegateV2"], | ||||||||||||||||||||||||||||||||||||||||||||
Event: stakingABI.Events["DelegateV2"], | ||||||||||||||||||||||||||||||||||||||||||||
Keeper: keeper, | ||||||||||||||||||||||||||||||||||||||||||||
DelegateV2ABI: NewDelegateV2ABI(), | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
|
@@ -71,41 +69,53 @@ func (m *DelegateV2Method) Run(evm *vm.EVM, contract *vm.Contract) ([]byte, erro | |||||||||||||||||||||||||||||||||||||||||||
return m.PackOutput(true) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) NewDelegateEvent(sender common.Address, validator string, amount *big.Int) (data []byte, topic []common.Hash, err error) { | ||||||||||||||||||||||||||||||||||||||||||||
type DelegateV2ABI struct { | ||||||||||||||||||||||||||||||||||||||||||||
abi.Method | ||||||||||||||||||||||||||||||||||||||||||||
abi.Event | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func NewDelegateV2ABI() DelegateV2ABI { | ||||||||||||||||||||||||||||||||||||||||||||
return DelegateV2ABI{ | ||||||||||||||||||||||||||||||||||||||||||||
Method: stakingABI.Methods["delegateV2"], | ||||||||||||||||||||||||||||||||||||||||||||
Event: stakingABI.Events["DelegateV2"], | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) NewDelegateEvent(sender common.Address, validator string, amount *big.Int) (data []byte, topic []common.Hash, err error) { | ||||||||||||||||||||||||||||||||||||||||||||
data, topic, err = types.PackTopicData(m.Event, []common.Hash{sender.Hash()}, validator, amount) | ||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||
return nil, nil, err | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
return data, topic, nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) PackInput(args fxstakingtypes.DelegateV2Args) ([]byte, error) { | ||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) PackInput(args fxstakingtypes.DelegateV2Args) ([]byte, error) { | ||||||||||||||||||||||||||||||||||||||||||||
arguments, err := m.Method.Inputs.Pack(args.Validator, args.Amount) | ||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||
return nil, err | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
return append(m.GetMethodId(), arguments...), nil | ||||||||||||||||||||||||||||||||||||||||||||
return append(m.Method.ID, arguments...), nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) UnpackInput(data []byte) (*fxstakingtypes.DelegateV2Args, error) { | ||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) UnpackInput(data []byte) (*fxstakingtypes.DelegateV2Args, error) { | ||||||||||||||||||||||||||||||||||||||||||||
args := new(fxstakingtypes.DelegateV2Args) | ||||||||||||||||||||||||||||||||||||||||||||
err := types.ParseMethodArgs(m.Method, args, data[4:]) | ||||||||||||||||||||||||||||||||||||||||||||
return args, err | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) PackOutput(result bool) ([]byte, error) { | ||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) PackOutput(result bool) ([]byte, error) { | ||||||||||||||||||||||||||||||||||||||||||||
return m.Method.Outputs.Pack(result) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) UnpackOutput(data []byte) (bool, error) { | ||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) UnpackOutput(data []byte) (bool, error) { | ||||||||||||||||||||||||||||||||||||||||||||
amount, err := m.Method.Outputs.Unpack(data) | ||||||||||||||||||||||||||||||||||||||||||||
if err != nil { | ||||||||||||||||||||||||||||||||||||||||||||
return false, err | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
return amount[0].(bool), nil | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+110
to
116
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add type assertion safety check in UnpackOutput. The type assertion func (m DelegateV2ABI) UnpackOutput(data []byte) (bool, error) {
amount, err := m.Method.Outputs.Unpack(data)
if err != nil {
return false, err
}
+ if len(amount) == 0 {
+ return false, errors.New("empty output data")
+ }
+ val, ok := amount[0].(bool)
+ if !ok {
+ return false, errors.New("invalid output type: expected bool")
+ }
- return amount[0].(bool), nil
+ return val, nil
} 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
func (m *DelegateV2Method) UnpackEvent(log *ethtypes.Log) (*fxcontract.IStakingDelegateV2, error) { | ||||||||||||||||||||||||||||||||||||||||||||
func (m DelegateV2ABI) UnpackEvent(log *ethtypes.Log) (*fxcontract.IStakingDelegateV2, error) { | ||||||||||||||||||||||||||||||||||||||||||||
if log == nil { | ||||||||||||||||||||||||||||||||||||||||||||
return nil, errors.New("empty log") | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider using pointer receivers to avoid unnecessary copying
Currently, the methods of
AllowanceSharesABI
use value receivers. Sinceabi.Method
may be a sizable struct, using pointer receivers can improve performance by preventing unnecessary copying of the struct when methods are called.Apply this diff to change the method receivers to pointers:
📝 Committable suggestion