Aufruffunktion mit web3 funktioniert nicht richtig?

Ich habe so ein Problem. Ich habe einen Smart Contract erstellt und im infura-Netzwerk bereitgestellt. Alle anderen Funktionen funktionieren korrekt, wenn ich mit web3 interagiere, aber wenn ich eine Funktion aufrufe, gibt es mir einen Fehler, wenn ich das sage

__WEBPACK_IMPORTED_MODULE_4__ethereum_factory__.a.methods.getDeployedContract is not a function

So interagiere ich damit.

import React,{ Component } from 'react';
import { Button, Form, Grid, Message } from 'semantic-ui-react';

import web3 from '../ethereum/web3';
import factory from '../ethereum/factory';
import Driver from '../ethereum/driver';

import Layout from './Layout';
import Header from './Header';


export default class Dofine extends Component {
  state ={
    offenceId: 0,
    location: '',
    driver: 0
  };

  handleChange = (event) => {
    this.setState({
        offenceId: event.target.value
    });
}


  onSubmit = async (event) =>{
    event.preventDefault();
    this.setState({ loading: true, errorMessage: ''});
    console.log(this.state.driver);
    console.log(this.state.offenceId);

    try{
      const accounts = await web3.eth.getAccounts();
      const driverCd = await factory.methods.getDeployedContract(this.state.driver).call();

      // const driver = Driver(driverCd);
      // const user = driver.methods.getDetails().call();
      console.log(driverCd);

      // await factory.methods.doFine(this.state.offenceId,this.state.location,this.state.driver)
      //   .send({
      //       gas:"3000000",
      //       from: accounts[0]
      //   });

    }catch(err){
      this.setState({ errorMessage: err.message})
    }

    this.setState({ loading: false});
  }
    render(){
        return(
          <div>
          <Header></Header>
          <Layout>
            <Grid>
              <Grid.Row>
              <Grid.Column width={5}></Grid.Column>
              <Grid.Column width={6}>
           <Form onSubmit={this.onSubmit} error={!!this.state.errorMessage}>
             <center><h3>Do Fine</h3></center>
              <Form.Field>
                <label>Offence</label>
                <select value={this.state.offenceId} onChange ={this.handleChange}>
                    <option value="1">Overtake on the Zebra Crossing</option>
                    <option value="2">Overtake On the Left</option>
                    {/* <option value="coconut">Coconut</option>
                    <option value="mango">Mango</option> */}
                </select>
              </Form.Field>
              <Form.Field>
                <label>Location</label>
                <input placeholder='Colombo'  value={this.state.location}
                        onChange ={event => this.setState({ location: event.target.value})}/>
              </Form.Field>
              <Form.Field>
                <label>Address Of the Driver</label>
                <input placeholder='0xdCF0A9F8413B1229E426DF2dE76873150d8B1c9B'  value={this.state.driver}
                        onChange ={event => this.setState({ driver: event.target.value})}/>
              </Form.Field>
              <Message error header="Oops!" content={this.state.errorMessage} />
                    <Button loading={this.state.loading} color="green" basic>Do Fine</Button> <Button  loading={this.state.loading} color="red" basic >Clear</Button>
            </Form>
            </Grid.Column>
            </Grid.Row>
            </Grid>
            </Layout>

            </div>

        )
    }
}

Das ist mein Fabrikvertrag.

pragma solidity ^0.4.17;

contract Driverfactory{

    struct Driver {
        address contractd;
        address account;
    }

    address[] private deployedDriverContracts;

    mapping(address=>Driver) public drivers;

    function createDriver(string lisenceId,string firstName,string lastName,string vehicle,string vehicleType) public{
        require(msg.sender!=drivers[msg.sender].account);
        address newDriver = new DriverProfile(lisenceId,firstName,lastName,vehicle,vehicleType,msg.sender);
        deployedDriverContracts.push(newDriver);
        Driver  memory newDriver1 = Driver({
            contractd:newDriver,
            account:msg.sender
        });
        drivers[msg.sender] = newDriver1;
    }

    function getDeployedDriverContracts() public view returns(address[]){
        return deployedDriverContracts; 
    }

    function checkDriver(address driver) public view returns(bool){
        if(driver==drivers[driver].account){
            return true;
        }

        else{
            return false;
        }

    }

    function driverContract(address driver) public view returns(address){
        address dc_adrs =drivers[driver].contractd;
        return dc_adrs;
    }



}



contract DriverProfile{
    struct Driver{
        string lisenceId;
        string firstName ;
        string lastName; 
        address account;
        string vehicle;
        string vehicleType;
        uint totalOffenceAmount;
        uint offenceCount;
        uint pendingPayments;
        mapping(uint=>Fine)  fines;
    }

    Driver public driver;

    constructor(string lisenceId,string firstName,string lastName,string vehicle,string vehicleType,address owner) public{
        driver = Driver({
            lisenceId:lisenceId,
            lastName:lastName,
            firstName:firstName,
            account:owner,
            vehicle:vehicle,
            vehicleType:vehicleType,
            totalOffenceAmount:0,
            offenceCount:0,
            pendingPayments:0
        });
    }





}

Und das funktioniert gut, wenn ich mit dem bereitgestellten Vertrag über den Remix-Editor interagiere. Kann mir jemand helfen dieses Problem zu lösen? Danke schön.

Es ist ziemlich schwierig, einen Grund zu verstehen, basierend auf der Beschreibung. Stellen Sie sicher, dass Sie die letzte Vertragsversion kompiliert haben und die Funktionen der neuesten Vertragsversion ausführen, die mit Ihrem Code übereinstimmen sollten. Wenn es nicht funktioniert, teilen Sie sich bitte einen Fabrik-Smart-Vertrag.
Überprüfen Sie factory und web3, möglicherweise exportieren Sie ein falsches Objekt
@KashishKhullar Aber alle anderen Methoden in diesem Vertrag funktionieren
@Aquila ja, wenn ich diesen Vertrag unter Verwendung der Adressoption in Remix abschließe, funktionieren alle Funktionen wie erwartet
@Aquila Ich habe die Frage mit meinem Fabrikvertrag aktualisiert.
Versuchen Sie, den Vertrag erneut bereitzustellen
@dwp Fabrikvertrag hat keine getDeployedContractFunktion, bedeutet das Problem im Zusammenhang mit der Implementierung von '../ethereum/factory'. Es kann sich um einen einfachen Fehler bei der Ausführung der Funktion handeln, da factoryder in einen Code importierte Code kein Vertragsfall ist.

Antworten (1)

Die Funktion in Ihrem Vertrag ist

getDeployedDriverContracts()

Und in dem Fehler, den Sie sehen, ist es

ethereum_factory__.a.methods.getDeployedContract ist keine Funktion

Die falsche Schreibweise muss den Fehler verursacht haben.