diff --git a/contractabi/selector.nim b/contractabi/selector.nim index 8e18049..8cdfa3c 100644 --- a/contractabi/selector.nim +++ b/contractabi/selector.nim @@ -8,12 +8,16 @@ export address export stint type FunctionSelector* = distinct array[4, byte] +type EventTopic* = distinct array[32, byte] proc toArray*(selector: FunctionSelector): array[4, byte] = array[4, byte](selector) -proc `$`*(selector: FunctionSelector): string = - "0x" & selector.toArray.toHex +proc toArray*(topic: EventTopic): array[32, byte] = + array[32, byte](topic) + +proc `$`*(value: FunctionSelector | EventTopic): string = + "0x" & value.toArray.toHex template solidityType(T: type, s: string) = func solidityType*(_: type T): string = s @@ -64,3 +68,6 @@ func selector*(function: string, parameters: type tuple): FunctionSelector = var selector: array[4, byte] selector[0..<4] = hash[0..<4] FunctionSelector(selector) + +func topic*(event: string, parameters: type tuple): EventTopic = + EventTopic(hash(signature(event, parameters))) diff --git a/tests/contractabi/testSelector.nim b/tests/contractabi/testSelector.nim index 9438dd9..808d067 100644 --- a/tests/contractabi/testSelector.nim +++ b/tests/contractabi/testSelector.nim @@ -1,5 +1,6 @@ import std/unittest -import pkg/contractabi/selector +import pkg/stew/byteutils +import pkg/contractabi suite "function selector": @@ -29,3 +30,8 @@ suite "function selector": test "calculates solidity function selector": check $selector("transfer", (Address, UInt256)) == "0xa9059cbb" check $selector("transferFrom", (Address, Address, UInt256)) == "0x23b872dd" + + test "calculates solidity event topic": + let expected = "0xddf252ad1be2c89b69c2b068fc378daa" & + "952ba7f163c4a11628f55a4df523b3ef" + check $topic("Transfer", (Address, Address, UInt256)) == expected