lotus/itests/kit/solidity.go
Steven Allen f1381ad535 refactor: use EthHash for event topics
This ensures they're always 32 bytes and padded, as required.
2023-02-10 07:41:29 -08:00

69 lines
3.2 KiB
Go

package kit
import (
"golang.org/x/crypto/sha3"
"github.com/filecoin-project/lotus/chain/types/ethtypes"
)
func EthTopicHash(sig string) ethtypes.EthHash {
hasher := sha3.NewLegacyKeccak256()
hasher.Write([]byte(sig))
var hash ethtypes.EthHash
copy(hash[:], hasher.Sum(nil))
return hash
}
func EthFunctionHash(sig string) []byte {
hasher := sha3.NewLegacyKeccak256()
hasher.Write([]byte(sig))
return hasher.Sum(nil)[:4]
}
// SolidityContractDef holds information about one of the test contracts
type SolidityContractDef struct {
Filename string // filename of the hex of the contract, e.g. contracts/EventMatrix.hex
Fn map[string][]byte // mapping of function names to 32-bit selector
Ev map[string]ethtypes.EthHash // mapping of event names to 256-bit signature hashes
}
var EventMatrixContract = SolidityContractDef{
Filename: "contracts/EventMatrix.hex",
Fn: map[string][]byte{
"logEventZeroData": EthFunctionHash("logEventZeroData()"),
"logEventOneData": EthFunctionHash("logEventOneData(uint256)"),
"logEventTwoData": EthFunctionHash("logEventTwoData(uint256,uint256)"),
"logEventThreeData": EthFunctionHash("logEventThreeData(uint256,uint256,uint256)"),
"logEventFourData": EthFunctionHash("logEventFourData(uint256,uint256,uint256,uint256)"),
"logEventOneIndexed": EthFunctionHash("logEventOneIndexed(uint256)"),
"logEventTwoIndexed": EthFunctionHash("logEventTwoIndexed(uint256,uint256)"),
"logEventThreeIndexed": EthFunctionHash("logEventThreeIndexed(uint256,uint256,uint256)"),
"logEventOneIndexedWithData": EthFunctionHash("logEventOneIndexedWithData(uint256,uint256)"),
"logEventTwoIndexedWithData": EthFunctionHash("logEventTwoIndexedWithData(uint256,uint256,uint256)"),
"logEventThreeIndexedWithData": EthFunctionHash("logEventThreeIndexedWithData(uint256,uint256,uint256,uint256)"),
},
Ev: map[string]ethtypes.EthHash{
"EventZeroData": EthTopicHash("EventZeroData()"),
"EventOneData": EthTopicHash("EventOneData(uint256)"),
"EventTwoData": EthTopicHash("EventTwoData(uint256,uint256)"),
"EventThreeData": EthTopicHash("EventThreeData(uint256,uint256,uint256)"),
"EventFourData": EthTopicHash("EventFourData(uint256,uint256,uint256,uint256)"),
"EventOneIndexed": EthTopicHash("EventOneIndexed(uint256)"),
"EventTwoIndexed": EthTopicHash("EventTwoIndexed(uint256,uint256)"),
"EventThreeIndexed": EthTopicHash("EventThreeIndexed(uint256,uint256,uint256)"),
"EventOneIndexedWithData": EthTopicHash("EventOneIndexedWithData(uint256,uint256)"),
"EventTwoIndexedWithData": EthTopicHash("EventTwoIndexedWithData(uint256,uint256,uint256)"),
"EventThreeIndexedWithData": EthTopicHash("EventThreeIndexedWithData(uint256,uint256,uint256,uint256)"),
},
}
var EventsContract = SolidityContractDef{
Filename: "contracts/events.bin",
Fn: map[string][]byte{
"log_zero_data": {0x00, 0x00, 0x00, 0x00},
"log_zero_nodata": {0x00, 0x00, 0x00, 0x01},
"log_four_data": {0x00, 0x00, 0x00, 0x02},
},
Ev: map[string]ethtypes.EthHash{},
}