Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 24 additions & 26 deletions Tests/web3swiftTests/localTests/EthereumContractTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ class EthereumContractTest: LocalTestCase {
private static let overloadedFunctionsABI = "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"operation\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ContractCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"dataKey\",\"type\":\"bytes32\"}],\"name\":\"DataChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"operation\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes4\",\"name\":\"selector\",\"type\":\"bytes4\"}],\"name\":\"Executed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"typeId\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes\",\"name\":\"returnedValue\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"receivedData\",\"type\":\"bytes\"}],\"name\":\"UniversalReceiver\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"ValueReceived\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataKeys\",\"type\":\"bytes32[]\"}],\"name\":\"getData\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"dataValues\",\"type\":\"bytes[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataKey\",\"type\":\"bytes32\"}],\"name\":\"getData\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"dataValue\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"noInputFunction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32[]\",\"name\":\"dataKeys\",\"type\":\"bytes32[]\"},{\"internalType\":\"bytes[]\",\"name\":\"dataValues\",\"type\":\"bytes[]\"}],\"name\":\"setData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"dataKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"dataValue\",\"type\":\"bytes\"}],\"name\":\"setData\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]"

func test_decodeEvents() async throws {
let web3 = try! await Web3.new(LocalTestCase.url)
let contract = web3.contract(EthereumContractTest.eventsOnlyABI)!
let web3 = try await Web3.new(LocalTestCase.url)
let contract = try XCTUnwrap(web3.contract(EthereumContractTest.eventsOnlyABI))

XCTAssertTrue(contract.contract.allEvents.count == 6)
XCTAssertNotNil(contract.contract.events["ContractCreated"])
Expand All @@ -30,8 +30,8 @@ class EthereumContractTest: LocalTestCase {
}

func test_decodedAllFunctions() async throws {
let web3 = try! await Web3.new(LocalTestCase.url)
let contract = web3.contract(EthereumContractTest.overloadedFunctionsABI)!
let web3 = try await Web3.new(LocalTestCase.url)
let contract = try XCTUnwrap(web3.contract(EthereumContractTest.overloadedFunctionsABI))

XCTAssertTrue(contract.contract.allMethods.count == 5)

Expand All @@ -53,8 +53,8 @@ class EthereumContractTest: LocalTestCase {
}

func test_encodeMethodBasedOnNameWithParameters_mustFail() async throws {
let web3 = try! await Web3.new(LocalTestCase.url)
let contract = web3.contract(EthereumContractTest.overloadedFunctionsABI)!
let web3 = try await Web3.new(LocalTestCase.url)
let contract = try XCTUnwrap(web3.contract(EthereumContractTest.overloadedFunctionsABI))

/// Encoding method that expects parameters but we are not giving any.
/// Result must be `nil`.
Expand All @@ -63,43 +63,41 @@ class EthereumContractTest: LocalTestCase {
}

func test_encodeMethodBasedOnNameWithParameters() async throws {
let web3 = try! await Web3.new(LocalTestCase.url)
let contract = web3.contract(EthereumContractTest.overloadedFunctionsABI,
at: EthereumAddress("0x6394b37Cf80A7358b38068f0CA4760ad49983a1B")!)!
let web3 = try await Web3.new(LocalTestCase.url)
let contract = try XCTUnwrap(web3.contract(EthereumContractTest.overloadedFunctionsABI, at: EthereumAddress("0x6394b37Cf80A7358b38068f0CA4760ad49983a1B")))
let parameters: [AnyObject] = [
[Data.randomBytes(length: 32)!,
Data.randomBytes(length: 32)!],
[Data.randomBytes(length: 32)!,
Data.randomBytes(length: 32)!]
[Data.randomBytes(length: 32), Data.randomBytes(length: 32)],
[Data.randomBytes(length: 32), Data.randomBytes(length: 32)]
] as [AnyObject]
let functionNameWithParameters = "setData(bytes32[],bytes[])"
let transaction = contract.createWriteOperation(functionNameWithParameters, parameters: parameters)
XCTAssertNotNil(transaction)

func testDecoding(_ method: String) {
let decodedData = contract.contract.methods[method]?.first?.decodeInputData(transaction!.transaction.data)
func testDecoding(_ method: String) throws {
let data = try XCTUnwrap(transaction?.transaction.data)
let decodedData = try XCTUnwrap(contract.contract.methods[method]?.first?.decodeInputData(data))
XCTAssertNotNil(decodedData)
XCTAssertEqual(decodedData!["0"] as! [Data], parameters[0] as! [Data])
XCTAssertEqual(decodedData!["1"] as! [Data], parameters[1] as! [Data])
XCTAssertEqual(try XCTUnwrap(decodedData["0"] as? [Data]), try XCTUnwrap(parameters[0] as? [Data]))
XCTAssertEqual(try XCTUnwrap(decodedData["1"] as? [Data]), try XCTUnwrap(parameters[1] as? [Data]))
}

testDecoding(functionNameWithParameters)
testDecoding(getFuncSignature(functionNameWithParameters))
try testDecoding(functionNameWithParameters)
try testDecoding(getFuncSignature(functionNameWithParameters))
}

func test_encodeMethodBasedOnHexSignature() async throws {
let web3 = try! await Web3.new(LocalTestCase.url)
let contract = web3.contract(EthereumContractTest.overloadedFunctionsABI,
at: EthereumAddress("0x6394b37Cf80A7358b38068f0CA4760ad49983a1B")!)!
let parameters: [AnyObject] = [Data.randomBytes(length: 32)!, Data.randomBytes(length: 32)!] as [AnyObject]
let web3 = try await Web3.new(LocalTestCase.url)
let contract = try XCTUnwrap(web3.contract(EthereumContractTest.overloadedFunctionsABI, at: EthereumAddress("0x6394b37Cf80A7358b38068f0CA4760ad49983a1B")))
let parameters: [AnyObject] = [Data.randomBytes(length: 32), Data.randomBytes(length: 32)] as [AnyObject]
let functionSignature = getFuncSignature("setData(bytes32,bytes)")
let transaction = contract.createWriteOperation(functionSignature, parameters: parameters)
XCTAssertNotNil(transaction)

let decodedData = contract.contract.methods[functionSignature]?.first?.decodeInputData(transaction!.transaction.data)
let data = try XCTUnwrap(transaction?.transaction.data)
let decodedData = try XCTUnwrap(contract.contract.methods[functionSignature]?.first?.decodeInputData(data))
XCTAssertNotNil(decodedData)
XCTAssertEqual(decodedData!["0"] as! Data, parameters[0] as! Data)
XCTAssertEqual(decodedData!["1"] as! Data, parameters[1] as! Data)
XCTAssertEqual(try XCTUnwrap(decodedData["0"] as? Data), try XCTUnwrap(parameters[0] as? Data))
XCTAssertEqual(try XCTUnwrap(decodedData["1"] as? Data), try XCTUnwrap(parameters[1] as? Data))
}
}

Expand Down