Boilertalk / Web3.swift

A pure swift Ethereum Web3 library
MIT License
639 stars 188 forks source link

Can't call my smart contract functions #76

Open PabloBlanco10 opened 5 years ago

PabloBlanco10 commented 5 years ago

I have a simple smart contract deployed in rinkeby :

pragma solidity ^0.4.18;

contract CarChain {

    struct Car {
        uint id;
        string plate;
        uint userId;
        bool registered;
    }

    struct User{
        uint id;
        uint credit;
        uint carId;
        bool registered;
    }

    mapping(uint => User) public users;
    mapping(uint => Car) public cars;

    uint public minimumRentCredit;

    address manager;

    function CarChain(uint _minimumRentCredit) public {
        manager = msg.sender;
        minimumRentCredit = _minimumRentCredit;
    }

    function registerNewUser(uint _id, uint _credit) public{
        //Check there is no User registered with this id
        require(_id != 0);
        require(users[_id].registered == false);

        User storage newUser = users[_id];
        newUser.id = _id;
        newUser.credit = _credit;
        newUser.carId = 0;
        newUser.registered = true;
    }

    function registerNewCar(uint _id, string _plate) public restricted{
        //Check there is no Car registered with this id
        require(_id != 0);
        require(cars[_id].registered == false);

        Car storage newCar = cars[_id];
        newCar.id = _id;
        newCar.plate = _plate;
        newCar.registered = true;
    }

    function rentCar(uint _carId, uint _userId) public {
        require(cars[_carId].registered == true);
        require(users[_userId].registered == true);
        require(cars[_carId].userId == 0);
        require(users[_userId].carId == 0);
        require(users[_userId].credit >= minimumRentCredit);

        User storage user = users[_userId];
        user.carId = _carId;
        user.credit = user.credit - minimumRentCredit;
        Car storage car = cars[_carId];
        car.userId = _userId;
    }

    function returnCar(uint _carId, uint _userId) public {
        require(cars[_carId].registered == true);
        require(users[_userId].registered == true);
        require(cars[_carId].userId != 0);
        require(users[_userId].carId != 0);

        User storage user = users[_userId];
        user.carId = 0;
        Car storage car = cars[_carId];
        car.userId = 0;
    }

    function getUserCredit(uint _id) public view returns (uint){
        return users[_id].credit;
    }

    modifier restricted(){
        require(msg.sender == manager);
        _;
    }
}

But I think I am not calling the functions correctly.


 let contractJsonABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"},{\"name\":\"_credit\",\"type\":\"uint256\"}],\"name\":\"registerNewUser\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"users\",\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\"},{\"name\":\"credit\",\"type\":\"uint256\"},{\"name\":\"carId\",\"type\":\"uint256\"},{\"name\":\"registered\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"},{\"name\":\"_plate\",\"type\":\"string\"}],\"name\":\"registerNewCar\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"getUserCredit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_carId\",\"type\":\"uint256\"},{\"name\":\"_userId\",\"type\":\"uint256\"}],\"name\":\"rentCar\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_carId\",\"type\":\"uint256\"},{\"name\":\"_userId\",\"type\":\"uint256\"}],\"name\":\"returnCar\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"cars\",\"outputs\":[{\"name\":\"id\",\"type\":\"uint256\"},{\"name\":\"plate\",\"type\":\"string\"},{\"name\":\"userId\",\"type\":\"uint256\"},{\"name\":\"registered\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"minimumRentCredit\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"}]".data(using: .utf8)!

let web3 = Web3(rpcURL: "https://rinkeby.infura.io/v3/9...")
let contractAddress = try! EthereumAddress(hex: "0x526F5F06D6f1f9e63c6f344Ab5b160DE7b1eaCEa", eip55: true)
let contract = try! web3.eth.Contract(json: contractJsonABI, abiKey: nil, address: contractAddress)
let myPrivateKey = try! EthereumPrivateKey(hexPrivateKey: "***************")

        do {

            let c = contract["registerNewUser"]?(contractAddress, BigUInt(1), BigUInt(100))
            let transaction: EthereumTransaction = c!
                .createTransaction(nonce: 14,
                                   from: myPrivateKey.address,
                                   value: 0,
                                   gas: 210000,
                                   gasPrice: EthereumQuantity(quantity: 1.gwei))!

            let signedTx: EthereumSignedTransaction = try transaction.sign(with: myPrivateKey, chainId: 4)

            firstly {
                web3.eth.sendRawTransaction(transaction: signedTx)
                }.done { txHash in
                    print(txHash)
                }.catch { error in
                    print(error)
            }

        } catch {
            print(error)
        }

It enters in .done section with a txHash but when I test at remix the deployed contract there is no proof that something got setted.

Any help to call the functions? Am I doing it right?

Thank you in advance.