erhalten Sie die Adresse des neuen Vertrags von der Vertragsfabrik

Ich muss einen Mietvertrag zur Laufzeit bereitstellen, wenn der Benutzer den Vertrag starten möchte. zu diesem zweck habe ich eine vertragsfabrik. Hier ist der eigentliche Code für facotry

pragma solidity ^0.4.8;
import './RentalContract.sol';


contract contractFactory {
  address[] public contracts;


  function getContractCount() public returns(uint) {
    return contracts.length;
  }

  function newContract(uint _rent, uint _security_deposit, string _house, address _owner, address _tenant)
  public payable returns(address)  {
    Rental c = new Rental(_rent, _security_deposit, _house, _owner, _tenant);
    contracts.push(c);
    return c;
  }
}

Diese Funktion newContract soll die Adresse des neuen Mietvertrags zurückgeben. Hier ist der my angle-Dienst, der diese Funktion aufruft, um die Adresse des neuen Vertrags zu erhalten.

   import { Injectable } from '@angular/core';
    import * as Web3 from 'web3';
    import {Observable} from 'rxjs/Observable';
    import { fromPromise } from 'rxjs/observable/fromPromise';
    import {observable} from "rxjs/symbol/observable";
    import {reject} from "q";

    const FactoryArtifacts = require('/home/work/angularplustruffle/angular4-truffle-starter-dapp/build/contracts/contractFactory.json');
    const contract = require('truffle-contract');
    const RentalArtifacts = require('/home/work/angularplustruffle/angular4-truffle-starter-dapp/build/contracts/Rental.json');

    declare let require: any;
    declare let window: any;

    @Injectable()
    export class ContractsService {
      ContractFactory = contract(FactoryArtifacts);
      Rental = contract(RentalArtifacts);
      private web3: any;
      public acc_no: any = 5;

      constructor() {
        if (typeof window.web3 !== 'undefined') {
          // Use Mist/MetaMask's provider
          this.web3 = new Web3(window.web3.currentProvider);
          this.ContractFactory.setProvider(window.web3.currentProvider);
          this.Rental.setProvider(window.web3.currentProvider);

          /* if (this.web3.version.network !== '4') {
            alert('Please connect to the Rinkeby network');
          } */
        } else {
          console.warn(
            'Please use a dapp browser like mist or MetaMask plugin for chrome'
          );
        }
      }

 public deployRentalContract(rent, security_deposit, house, owner, tenant): Observable<any> {
    let meta;
      return Observable.create( observer => {
        this.ContractFactory
          .deployed()
          .then( instance => {
              meta = instance;
              console.log('data to send:' + "rent " + rent, " security " + security_deposit + " house" + house + " owner" + owner + " tenant" + tenant);
              return meta.newContract(rent, security_deposit, house, owner, tenant, {from: this.web3.eth.accounts[0],
                gas:1000000, value: this.web3.toWei(0.01, "ether")});
          })
          .then(value => {
            console.log("value is");
            console.log(value);
            observer.next(value);
            observer.complete();
          })
          .catch(e => {
            console.log(e);
            observer.error(e);
          });
      });
  }
}

aber anstatt eine Adresse zu bekommen, bekomme ich folgende AntwortGeben Sie hier die Bildbeschreibung ein

Wie kann ich stattdessen die tatsächliche Adresse erhalten?

Antworten (2)

Die Antwort, die Sie erhalten, ist der Eingang der Transaktion. Rückgabewerte von Funktionen, die Transaktionen erstellen, können meines Wissens nur trueoder sein false.

Sie sollten jedoch in der Lage sein, ein Ereignis auszugeben, das die Adresse des Vertrags enthält, nachdem dieser in der Factory erstellt wurde.

event ContractCreated(address newAddress);

Dann können Sie in Ihrer newContract()Funktion, nachdem Sie einen neuen Vertrag erstellt haben, Folgendes tun:

ContractCreated(c);

Dadurch wird ein Ereignis erstellt, nach dem Sie suchen können, um Ihre Adresse zu finden. Ich glaube, dieses Ereignis wird auch im Empfangsobjekt von web3 erscheinen, sodass Sie die Adresse möglicherweise auch von dort erhalten können.

Vielen Dank. Ich habe fast die letzten 5 Stunden damit gekämpft. Danke noch einmal

Wenn Sie Zacks Antwort oben hinzufügen, können Sie die Adresse des Vertrags mit dem Schlüsselwort address abrufen. Das Ereignis, das Sie aussenden, wird also sein

emit ContractCreated(address(c));