From 8b82887ac8b1588f8e7aff6ec1b1e902650dc174 Mon Sep 17 00:00:00 2001 From: JD Date: Sun, 7 Apr 2024 16:50:46 +0200 Subject: [PATCH 1/2] fix: encoding ints and uints should use bits --- Sources/Web3Core/EthereumABI/ABIEncoding.swift | 8 ++++---- Tests/web3swiftTests/localTests/ABIEncoderTest.swift | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Sources/Web3Core/EthereumABI/ABIEncoding.swift b/Sources/Web3Core/EthereumABI/ABIEncoding.swift index 5ce2183d3..21944fa38 100755 --- a/Sources/Web3Core/EthereumABI/ABIEncoding.swift +++ b/Sources/Web3Core/EthereumABI/ABIEncoding.swift @@ -219,12 +219,12 @@ public struct ABIEncoder { /// - encoding has failed (e.g. type mismatch). public static func encodeSingleType(type: ABI.Element.ParameterType, value: Any) -> Data? { switch type { - case .uint: + case .uint(let bits): let biguint = convertToBigUInt(value) - return biguint == nil ? nil : biguint!.abiEncode(bits: 256) - case .int: + return biguint == nil ? nil : biguint!.abiEncode(bits: bits) + case .int(let bits): let bigint = convertToBigInt(value) - return bigint == nil ? nil : bigint!.abiEncode(bits: 256) + return bigint == nil ? nil : bigint!.abiEncode(bits: bits) case .address: if let string = value as? String { guard let address = EthereumAddress(string) else { return nil } diff --git a/Tests/web3swiftTests/localTests/ABIEncoderTest.swift b/Tests/web3swiftTests/localTests/ABIEncoderTest.swift index 2e13e4334..2b4cafb18 100644 --- a/Tests/web3swiftTests/localTests/ABIEncoderTest.swift +++ b/Tests/web3swiftTests/localTests/ABIEncoderTest.swift @@ -15,13 +15,13 @@ import BigInt class ABIEncoderTest: XCTestCase { func testEncodeInt() { - XCTAssertEqual(ABIEncoder.encodeSingleType(type: .int(bits: 32), value: -10 as AnyObject)?.toHexString(), "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6") - XCTAssertEqual(ABIEncoder.encodeSingleType(type: .int(bits: 32), value: 10 as AnyObject)?.toHexString(), "000000000000000000000000000000000000000000000000000000000000000a") + XCTAssertEqual(ABIEncoder.encodeSingleType(type: .int(bits: 32), value: -10 as AnyObject)?.toHexString(), "fffffff6") + XCTAssertEqual(ABIEncoder.encodeSingleType(type: .int(bits: 32), value: 10 as AnyObject)?.toHexString(), "0000000a") } func testEncodeUInt() { XCTAssertEqual(ABIEncoder.encodeSingleType(type: .uint(bits: 32), value: -10 as AnyObject), nil) - XCTAssertEqual(ABIEncoder.encodeSingleType(type: .uint(bits: 32), value: 10 as AnyObject)?.toHexString(), "000000000000000000000000000000000000000000000000000000000000000a") + XCTAssertEqual(ABIEncoder.encodeSingleType(type: .uint(bits: 32), value: 10 as AnyObject)?.toHexString(), "0000000a") } func testSoliditySha3() throws { From da654003950d3795ccbd61d9f0c4c3fa1064fac9 Mon Sep 17 00:00:00 2001 From: JD Date: Sun, 7 Apr 2024 16:51:27 +0200 Subject: [PATCH 2/2] fix: tests according to updates int/uint changes --- Tests/web3swiftTests/localTests/ABIEncoderTest.swift | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Tests/web3swiftTests/localTests/ABIEncoderTest.swift b/Tests/web3swiftTests/localTests/ABIEncoderTest.swift index 2b4cafb18..239b48c45 100644 --- a/Tests/web3swiftTests/localTests/ABIEncoderTest.swift +++ b/Tests/web3swiftTests/localTests/ABIEncoderTest.swift @@ -202,13 +202,12 @@ class ABIEncoderTest: XCTestCase { XCTAssertEqual(hexData, "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000") hexData = ABIEncoder.encode(types: [.array(type: .uint(bits: 8), length: 0)], values: [[1, 2, 3, 4]])?.toHexString() XCTAssertEqual(hexData?[0..<64], "0000000000000000000000000000000000000000000000000000000000000020") - XCTAssertEqual(hexData, "000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004") - + XCTAssertEqual(hexData, "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000401020304") // This one shouldn't have data offset hexData = ABIEncoder.encode(types: [.array(type: .uint(bits: 8), length: 4)], values: [[1, 2, 3, 4]])?.toHexString() // First 32 bytes are the first value from the array - XCTAssertEqual(hexData?[0..<64], "0000000000000000000000000000000000000000000000000000000000000001") - XCTAssertEqual(hexData, "0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004") +// XCTAssertEqual(hexData?[0..<32], "0000000000000000000000000000000000000000000000000000000000000001") + XCTAssertEqual(hexData, "01020304") let types: [ABI.Element.ParameterType] = [.uint(bits: 8), .bool, @@ -216,8 +215,8 @@ class ABIEncoderTest: XCTestCase { .bytes(length: 2)] let values: [Any] = [10, false, [1, 2, 3, 4], Data(count: 2)] hexData = ABIEncoder.encode(types: types, values: values)?.toHexString() - XCTAssertEqual(hexData?[128..<192], "0000000000000000000000000000000000000000000000000000000000000080") - XCTAssertEqual(hexData, "000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000004") + XCTAssertEqual(hexData?[128..<192], "6100000000000000000000000000000000000000000000000000000000000000") + XCTAssertEqual(hexData, "0a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000401020304") } /// Test for the expected output when encoding dynamic types.