77
88import XCTest
99import Web3Core
10+ import BigInt
1011
1112@testable import web3swift
1213
1314class EventTests : XCTestCase {
14- func testEncodeTopc( ) throws {
15+
16+ /// Solidity event allows up to 3 indexed field, this is just for test.
17+ let testEvent = """
18+ [{ " anonymous " :false, " inputs " :[{ " indexed " :true, " internalType " : " bytes32 " , " name " : " userOpHash " , " type " : " bytes32 " },{ " indexed " :true, " internalType " : " address " , " name " : " sender " , " type " : " address " },{ " indexed " :true, " internalType " : " string " , " name " : " a " , " type " : " string " },{ " indexed " :true, " internalType " : " bool " , " name " : " b " , " type " : " bool " },{ " indexed " :true, " internalType " : " bytes " , " name " : " c " , " type " : " bytes " },{ " indexed " :true, " internalType " : " uint256 " , " name " : " d " , " type " : " uint256 " }], " name " : " UserOperationEvent " , " type " : " event " }]
19+ """
20+
21+ func testEncodeTopicToJSON( ) throws {
1522 let encoder = JSONEncoder ( )
1623 let t1 : [ EventFilterParameters . Topic ] = [ ]
1724 let t2 : [ EventFilterParameters . Topic ] = [ . string( nil ) ]
1825 let t3 : [ EventFilterParameters . Topic ] = [ . strings( [ . string( nil ) , . string( " 1 " ) ] ) ]
26+ let t4 : [ EventFilterParameters . Topic ] = [ . strings( [ nil , . string( " 1 " ) ] ) ]
1927 XCTAssertNoThrow ( try encoder. encode ( t1) )
2028 XCTAssertNoThrow ( try encoder. encode ( t2) )
2129 XCTAssertNoThrow ( try encoder. encode ( t3) )
30+ XCTAssertNoThrow ( try encoder. encode ( t4) )
2231
23- let t4 : [ EventFilterParameters . Topic ] = [
32+ let topics : [ EventFilterParameters . Topic ] = [
2433 . string( " 1 " ) ,
2534 . strings( [
2635 . string( " 2 " ) ,
2736 . string( " 3 " ) ,
2837 ]
2938 ) ]
30- let encoded = try encoder. encode ( t4 )
39+ let encoded = try encoder. encode ( topics )
3140 let json = try JSONSerialization . jsonObject ( with: encoded)
3241 XCTAssertEqual ( json as? NSArray , [ " 1 " , [ " 2 " , " 3 " ] ] )
3342 }
3443
3544 func testEncodeLogs( ) throws {
36- let contract = try EthereumContract ( TestEvent)
37- let logs = contract. events [ " UserOperationEvent " ] ? . encodeParameters (
45+ let contract = try EthereumContract ( testEvent)
46+ let topic = contract. events [ " UserOperationEvent " ] !. topic
47+ let logs = contract. events [ " UserOperationEvent " ] !. encodeParameters (
3848 [
3949 " 0x2c16c07e1c68d502e9c7ad05f0402b365671a0e6517cb807b2de4edd95657042 " ,
4050 " 0x581074D2d9e50913eB37665b07CAFa9bFFdd1640 " ,
@@ -44,11 +54,34 @@ class EventTests: XCTestCase {
4454 nil
4555 ]
4656 )
57+ XCTAssertEqual ( logs. count, 6 )
4758
48- XCTAssert ( logs? . count == 7 )
59+ XCTAssertTrue ( logs [ 0 ] == topic. toHexString ( ) . addHexPrefix ( ) )
60+ XCTAssertTrue ( logs [ 1 ] == nil )
61+ XCTAssertTrue ( logs [ 2 ] == " 0x000000000000000000000000581074d2d9e50913eb37665b07cafa9bffdd1640 " )
62+ XCTAssertTrue ( logs [ 3 ] == " 0xab036729af8b8f9b610af4e11b14fa30c348f40c2c230cce92ef6ef37726fee7 " )
63+ XCTAssertTrue ( logs [ 4 ] == " 0x0000000000000000000000000000000000000000000000000000000000000001 " )
64+ XCTAssertTrue ( logs [ 5 ] == " 0x56f5a6cba57d26b32db8dc756fda960dcd3687770a300575a5f8107591eff63f " )
4965 }
5066
51- let TestEvent = """
52- [{ " anonymous " :false, " inputs " :[{ " indexed " :true, " internalType " : " bytes32 " , " name " : " userOpHash " , " type " : " bytes32 " },{ " indexed " :true, " internalType " : " address " , " name " : " sender " , " type " : " address " },{ " indexed " :true, " internalType " : " string " , " name " : " a " , " type " : " string " },{ " indexed " :true, " internalType " : " bool " , " name " : " b " , " type " : " bool " },{ " indexed " :true, " internalType " : " bytes " , " name " : " c " , " type " : " bytes " },{ " indexed " :true, " internalType " : " uint256 " , " name " : " d " , " type " : " uint256 " }], " name " : " UserOperationEvent " , " type " : " event " }]
53- """
67+ func testEncodeTopic( ) throws {
68+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . string, indexed: true ) , value: " hello,world " ) == " 0xab036729af8b8f9b610af4e11b14fa30c348f40c2c230cce92ef6ef37726fee7 " )
69+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . address, indexed: true ) , value: " 0x003e36550908907c2a2da960fd19a419b9a774b7 " ) == " 0x000000000000000000000000003e36550908907c2a2da960fd19a419b9a774b7 " )
70+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . address, indexed: true ) , value: EthereumAddress ( " 0x003e36550908907c2a2da960fd19a419b9a774b7 " ) !) == " 0x000000000000000000000000003e36550908907c2a2da960fd19a419b9a774b7 " )
71+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . bool, indexed: true ) , value: true ) == " 0x0000000000000000000000000000000000000000000000000000000000000001 " )
72+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . uint( bits: 256 ) , indexed: true ) , value: BigUInt ( " dbe20a " , radix: 16 ) !) == " 0x0000000000000000000000000000000000000000000000000000000000dbe20a " )
73+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . int( bits: 32 ) , indexed: true ) , value: 100 ) == " 0x0000000000000000000000000000000000000000000000000000000000000064 " )
74+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . dynamicBytes, indexed: true ) , value: Data ( hex: " 6761766f66796f726b " ) ) == " 0xe0859ceea0a2fd2474deef2b2183f10f4c741ebba702e9a07d337522c0af55fb " )
75+ XCTAssertTrue ( ABI . Element. Event. encodeTopic ( input: . init( name: " " , type: . bytes( length: 32 ) , indexed: true ) , value: Data ( hex: " 6761766f66796f726b " ) ) == " 0x00000000000000000000000000000000000000000000006761766f66796f726b " )
76+ }
77+ }
78+
79+ private func == ( lhs: EventFilterParameters . Topic ? , rhs: String ? ) -> Bool {
80+ if let lhs = lhs, case . string( let string) = lhs {
81+ return string == rhs
82+ }
83+ if lhs == nil && rhs == nil {
84+ return true
85+ }
86+ return false
5487}
0 commit comments