|
| 1 | +// |
| 2 | +// EventTests.swift |
| 3 | +// |
| 4 | +// |
| 5 | +// Created by liugang zhang on 2023/8/24. |
| 6 | +// |
| 7 | + |
| 8 | +import XCTest |
| 9 | +import Web3Core |
| 10 | +import BigInt |
| 11 | + |
| 12 | +@testable import web3swift |
| 13 | + |
| 14 | +class EventTests: XCTestCase { |
| 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 { |
| 22 | + let encoder = JSONEncoder() |
| 23 | + let t1: [EventFilterParameters.Topic] = [] |
| 24 | + let t2: [EventFilterParameters.Topic] = [.string(nil)] |
| 25 | + let t3: [EventFilterParameters.Topic] = [.strings([.string(nil), .string("1")])] |
| 26 | + let t4: [EventFilterParameters.Topic] = [.strings([nil, .string("1")])] |
| 27 | + XCTAssertNoThrow(try encoder.encode(t1)) |
| 28 | + XCTAssertNoThrow(try encoder.encode(t2)) |
| 29 | + XCTAssertNoThrow(try encoder.encode(t3)) |
| 30 | + XCTAssertNoThrow(try encoder.encode(t4)) |
| 31 | + |
| 32 | + let topics: [EventFilterParameters.Topic] = [ |
| 33 | + .string("1"), |
| 34 | + .strings([ |
| 35 | + .string("2"), |
| 36 | + .string("3"), |
| 37 | + ] |
| 38 | + )] |
| 39 | + let encoded = try encoder.encode(topics) |
| 40 | + let json = try JSONSerialization.jsonObject(with: encoded) |
| 41 | + XCTAssertEqual(json as? NSArray, ["1", ["2", "3"]]) |
| 42 | + } |
| 43 | + |
| 44 | + func testEncodeLogs() throws { |
| 45 | + let contract = try EthereumContract(testEvent) |
| 46 | + let topic = contract.events["UserOperationEvent"]!.topic |
| 47 | + let logs = contract.events["UserOperationEvent"]!.encodeParameters( |
| 48 | + [ |
| 49 | + "0x2c16c07e1c68d502e9c7ad05f0402b365671a0e6517cb807b2de4edd95657042", |
| 50 | + "0x581074D2d9e50913eB37665b07CAFa9bFFdd1640", |
| 51 | + "hello,world", |
| 52 | + true, |
| 53 | + "0x02c16c07e1c68d50", |
| 54 | + nil |
| 55 | + ] |
| 56 | + ) |
| 57 | + XCTAssertEqual(logs.count, 6) |
| 58 | + |
| 59 | + XCTAssertTrue(logs[0] == topic.toHexString().addHexPrefix()) |
| 60 | + XCTAssertTrue(logs[1] == "0x2c16c07e1c68d502e9c7ad05f0402b365671a0e6517cb807b2de4edd95657042") |
| 61 | + XCTAssertTrue(logs[2] == "0x000000000000000000000000581074d2d9e50913eb37665b07cafa9bffdd1640") |
| 62 | + XCTAssertTrue(logs[3] == "0xab036729af8b8f9b610af4e11b14fa30c348f40c2c230cce92ef6ef37726fee7") |
| 63 | + XCTAssertTrue(logs[4] == "0x0000000000000000000000000000000000000000000000000000000000000001") |
| 64 | + XCTAssertTrue(logs[5] == "0x56f5a6cba57d26b32db8dc756fda960dcd3687770a300575a5f8107591eff63f") |
| 65 | + } |
| 66 | + |
| 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: .bool, indexed: true), value: false) == "0x0000000000000000000000000000000000000000000000000000000000000000") |
| 73 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .uint(bits: 256), indexed: true), value: BigUInt("dbe20a", radix: 16)!) == "0x0000000000000000000000000000000000000000000000000000000000dbe20a") |
| 74 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .uint(bits: 256), indexed: true), value: "dbe20a") == "0x0000000000000000000000000000000000000000000000000000000000dbe20a") |
| 75 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .int(bits: 32), indexed: true), value: 100) == "0x0000000000000000000000000000000000000000000000000000000000000064") |
| 76 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .dynamicBytes, indexed: true), value: Data(hex: "6761766f66796f726b")) == "0xe0859ceea0a2fd2474deef2b2183f10f4c741ebba702e9a07d337522c0af55fb") |
| 77 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .bytes(length: 32), indexed: true), value: Data(hex: "6761766f66796f726b")) == "0x00000000000000000000000000000000000000000000006761766f66796f726b") |
| 78 | + XCTAssertTrue(ABI.Element.Event.encodeTopic(input: .init(name: "", type: .bytes(length: 32), indexed: true), value: "0x6761766f66796f726b") == "0x00000000000000000000000000000000000000000000006761766f66796f726b") |
| 79 | + } |
| 80 | +} |
| 81 | + |
| 82 | +private func ==(lhs: EventFilterParameters.Topic?, rhs: String?) -> Bool { |
| 83 | + if let lhs = lhs, case .string(let string) = lhs { |
| 84 | + return string == rhs |
| 85 | + } |
| 86 | + if lhs == nil && rhs == nil { |
| 87 | + return true |
| 88 | + } |
| 89 | + return false |
| 90 | +} |
0 commit comments