@@ -11,26 +11,23 @@ import Web3Core
1111class ABIElementErrorDecodingTest : XCTestCase {
1212 typealias EthError = ABI . Element . EthError
1313
14- /// Function with any parameters should be able to decode `require` and `revert` calls in soliditiy.
15- /// Note: `require(expression)` and `revert()` without a message return 0 bytes thus we cannot guarantee
16- /// that 0 bytes response will be interpreted correctly.
17- private let emptyFunction = ABI . Element. Function ( name: " any " ,
18- inputs: [ ] ,
19- outputs: [ ] ,
20- constant: false ,
21- payable: false )
22- private let oneOutputFunction = ABI . Element. Function ( name: " any " ,
23- inputs: [ ] ,
24- outputs: [ . init( name: " " , type: . bool) ] ,
25- constant: false ,
26- payable: false )
27-
2814 func testErrorRepresentation( ) {
2915 XCTAssertEqual ( EthError ( name: " Error " , inputs: [ ] ) . errorDeclaration, " Error() " )
3016 XCTAssertEqual ( EthError ( name: " Error " , inputs: [ . init( name: " " , type: . address) ] ) . errorDeclaration, " Error(address) " )
31- XCTAssertEqual ( EthError ( name: " Error " , inputs: [ . init( name: " " , type: . address) ] ) . errorDeclaration, " Error(address) " )
32- XCTAssertEqual ( EthError ( name: " Error " , inputs: [ . init( name: " " , type: . address) , . init( name: " " , type: . uint( bits: 256 ) ) ] ) . errorDeclaration, " Error(address,uint256) " )
33- XCTAssertEqual ( EthError ( name: " Error " , inputs: [ . init( name: " sender " , type: . address) , . init( name: " " , type: . uint( bits: 256 ) ) ] ) . errorDeclaration, " Error(address sender,uint256) " )
17+ XCTAssertEqual (
18+ EthError ( name: " Error " , inputs: [ . init( name: " " , type: . address) ] ) . errorDeclaration,
19+ " Error(address) "
20+ )
21+ XCTAssertEqual (
22+ EthError ( name: " Error " , inputs: [ . init( name: " " , type: . address) , . init( name: " " , type: . uint( bits: 256 ) ) ] )
23+ . errorDeclaration,
24+ " Error(address,uint256) "
25+ )
26+ XCTAssertEqual (
27+ EthError ( name: " Error " , inputs: [ . init( name: " sender " , type: . address) , . init( name: " " , type: . uint( bits: 256 ) ) ] )
28+ . errorDeclaration,
29+ " Error(address sender,uint256) "
30+ )
3431 // Not all types are supported in errors, e.g. tuples and functions are not supported
3532 let allTypesNamedAndNot : [ ABI . Element . InOut ] = [
3633 . init( name: " sender " , type: . address) ,
@@ -67,38 +64,43 @@ class ABIElementErrorDecodingTest: XCTestCase {
6764
6865 /// `require(expression)` and `revert()` without a message return 0 bytes,
6966 /// we can noly catch an error when function has a return value
70- func testDecodeEmptyErrorOnOneOutputFunction( ) throws {
71- let contract = try EthereumContract ( abi: [ . function( emptyFunction) ] )
72- do {
73- try contract. decodeReturnData ( emptyFunction. signature, data: Data ( ) )
74- } catch {
75- XCTFail ( )
76- }
77-
78- let contract2 = try EthereumContract ( abi: [ . function( oneOutputFunction) ] )
79- do {
80- try contract2. decodeReturnData ( oneOutputFunction. signature, data: Data ( ) )
81- XCTFail ( )
82- } catch {
83- print ( error)
84- }
85- }
86-
87- /// Data is decoded as a call of `revert` or `require` with a message no matter the number of outputs configured in the ``ABI/Element/Function``.
88- /// `revert(message)` and `require(false,message)`return at least 128 bytes. We cannot differentiate between `require` or `revert`.
67+ // func testDecodeEmptyErrorOnOneOutputFunction() throws {
68+ // let contract = try EthereumContract(abi: [.function(emptyFunction)])
69+ // do {
70+ // try contract.decodeReturnData(emptyFunction.signature, data: Data())
71+ // } catch {
72+ // XCTFail()
73+ // }
74+
75+ // let contract2 = try EthereumContract(abi: [.function(oneOutputFunction)])
76+ // do {
77+ // try contract2.decodeReturnData(oneOutputFunction.signature, data: Data())
78+ // XCTFail()
79+ // } catch {
80+ // print(error)
81+ // }
82+ // }
83+
84+ /// Data is decoded as a call of `revert` or `require` with a message no matter the number of outputs configured in the
85+ /// ``ABI/Element/Function``.
86+ /// `revert(message)` and `require(false,message)`return at least 128 bytes. We cannot differentiate between `require` or
87+ /// `revert`.
8988 func testDecodeDefaultErrorWithMessage( ) throws {
9089 /// 08c379a0 - Error(string) function selector
9190 /// 0000000000000000000000000000000000000000000000000000000000000020 - Data offset
9291 /// 000000000000000000000000000000000000000000000000000000000000001a - Message length
9392 /// 4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 - Message + 0 bytes padding
9493 /// 0000... - some more 0 bytes padding to make the number of bytes match 32 bytes chunks
95- let errorResponse = Data . fromHex ( " 08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e0000000000000000000000000000000000000000000000000000000000000000000000000000 " ) !
94+ let errorResponse = Data
95+ . fromHex (
96+ " 08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000001a4e6f7420656e6f7567682045746865722070726f76696465642e0000000000000000000000000000000000000000000000000000000000000000000000000000 "
97+ ) !
9698 let contract = try EthereumContract ( abi: [ . function( emptyFunction) ] )
9799
98100 do {
99101 try contract. decodeReturnData ( emptyFunction. signature, data: errorResponse)
100102 XCTFail ( " decode function should throw an error " )
101- } catch Web3Error . revert( _, let reason) {
103+ } catch let Web3Error . revert( _, reason) {
102104 XCTAssertEqual ( reason, " Not enough Ether provided. " )
103105 }
104106
@@ -111,12 +113,12 @@ class ABIElementErrorDecodingTest: XCTestCase {
111113 /// 00000000000000000000000000000000000000000000000000000000 - padding bytes
112114 let errorResponse = Data . fromHex ( " 82b429000000000000000000000000000000000000000000000000000000000000000000 " ) !
113115 let error = ABI . Element. EthError ( name: " Unauthorized " , inputs: [ ] )
114- let contract = try EthereumContract ( abi: [ . function( emptyFunction) , . error( error) ] )
116+ let contract = try EthereumContract ( abi: [ . function( emptyFunction) , . error( error) ] )
115117
116118 do {
117119 try contract. decodeReturnData ( emptyFunction. signature, data: errorResponse)
118120 XCTFail ( " decode function should throw an error " )
119- } catch Web3Error . revertCustom( let signature, let args) {
121+ } catch let Web3Error . revertCustom( signature, args) {
120122 XCTAssertEqual ( signature, " Unauthorized() " )
121123 XCTAssertTrue ( args. isEmpty)
122124 }
@@ -135,12 +137,12 @@ class ABIElementErrorDecodingTest: XCTestCase {
135137 /// 00000000000000000000000000000000000000000000000000000000 - padding bytes
136138 let errorResponse = Data . fromHex ( " 5caef9920000000000000000000000000000000000000000000000000000000000000000 " ) !
137139 let error = ABI . Element. EthError ( name: " Unauthorized " , inputs: [ . init( name: " " , type: . bool) ] )
138- let contract = try EthereumContract ( abi: [ . function( oneOutputFunction) , . error( error) ] )
140+ let contract = try EthereumContract ( abi: [ . function( oneOutputFunction) , . error( error) ] )
139141
140142 do {
141143 try contract. decodeReturnData ( oneOutputFunction. signature, data: errorResponse)
142144 XCTFail ( " decode function should throw an error " )
143- } catch Web3Error . revertCustom( let signature, let args) {
145+ } catch let Web3Error . revertCustom( signature, args) {
144146 XCTAssertEqual ( signature, " Unauthorized(bool) " )
145147 XCTAssertEqual ( args [ " 0 " ] as? Bool , false )
146148 }
@@ -160,14 +162,17 @@ class ABIElementErrorDecodingTest: XCTestCase {
160162 /// 0000000000000000000000000000000000000000000000000000000000000006 - first custom argument length
161163 /// 526561736f6e0000000000000000000000000000000000000000000000000000 - first custom argument bytes + 0 bytes padding
162164 /// 0000... - some more 0 bytes padding to make the number of bytes match 32 bytes chunks
163- let errorResponse = Data . fromHex ( " 973d02cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006526561736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 " ) !
165+ let errorResponse = Data
166+ . fromHex (
167+ " 973d02cb00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000006526561736f6e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 "
168+ ) !
164169 let error = ABI . Element. EthError ( name: " Unauthorized " , inputs: [ . init( name: " message_arg " , type: . string) ] )
165170 let contract = try EthereumContract ( abi: [ . function( emptyFunction) , . error( error) ] )
166171
167172 do {
168173 try contract. decodeReturnData ( emptyFunction. signature, data: errorResponse)
169174 XCTFail ( " decode function should throw an error " )
170- } catch Web3Error . revertCustom( let signature, let args) {
175+ } catch let Web3Error . revertCustom( signature, args) {
171176 XCTAssertEqual ( signature, " Unauthorized(string) " )
172177 XCTAssertEqual ( args [ " 0 " ] as? String , " Reason " )
173178 XCTAssertEqual ( args [ " message_arg " ] as? String , " Reason " )
@@ -194,11 +199,25 @@ class ABIElementErrorDecodingTest: XCTestCase {
194199
195200 do {
196201 try contract. decodeReturnData ( emptyFunction. signature, data: errorResponse)
197- } catch Web3Error . revert( let message, let code) {
202+ } catch let Web3Error . revert( message, code) {
198203 XCTAssertTrue ( message. contains ( " reverted with panic code 0x01 " ) )
199204 XCTAssertEqual ( code, " 0x01 " )
200205 }
201206
202207 XCTAssertEqual ( EthError . decodePanicError ( errorResponse [ 4 ... ] ) , 1 )
203208 }
209+
210+ /// Function with any parameters should be able to decode `require` and `revert` calls in soliditiy.
211+ /// Note: `require(expression)` and `revert()` without a message return 0 bytes thus we cannot guarantee
212+ /// that 0 bytes response will be interpreted correctly.
213+ private let emptyFunction = ABI . Element. Function ( name: " any " ,
214+ inputs: [ ] ,
215+ outputs: [ ] ,
216+ constant: false ,
217+ payable: false )
218+ private let oneOutputFunction = ABI . Element. Function ( name: " any " ,
219+ inputs: [ ] ,
220+ outputs: [ . init( name: " " , type: . bool) ] ,
221+ constant: false ,
222+ payable: false )
204223}
0 commit comments