Wie erhalte ich Methodenargumente mit Taquito?

Oct 29 2020

Wenn ich ein Objekt vom Typ habe ContractAbstraction<ContractProvider>, kann ich eine Schlüssel- / Wertzuordnung aller Endpunkte im bereitgestellten Vertrag wie folgt abrufen:

const contract: ContractAbstraction<ContractProvider> = client.contract.at(this.state.contractAddress);
const methods = contract.methods;

Dabei clienthat Typ TezosToolkitund behandelt die RPC-Interaktion mit einem Knoten.

Und ich kann eine Liste solcher Methodennamen (Smart Contract Function) erhalten

function getObjectMethodNames(obj: any): string[] {
  if (!obj) {
    return [];
  }

  return Object.getOwnPropertyNames(obj)
    .filter((p) => typeof obj[p] === 'function')
    .map((name) => name.toLowerCase());
}
const methodNames: string[] = getObjectMethodNames(contract.methods);

Aber wie erhalte ich Informationen darüber, wie viele Argumente jede Funktion benötigt und welchen Typ die Argumente haben? Ist das mit Taquito möglich?

Ich kann dem Block-Explorer Better Call Dev entnehmen, dass dies möglich sein sollte, da sie nicht nur eine Liste von Funktionen für einen intelligenten Vertrag anzeigen, sondern auch die Signatur jeder Funktion.

Antworten

1 ThorkilVærge Oct 29 2020 at 21:00

Ja, Sie können die Funktionssignatur erhalten, nicht nur die Funktionsnamen. Dies kann so gemacht werden.

const contract: ContractAbstraction<ContractProvider> = client.contract.at(this.state.contractAddress);
const signatures: string[][] = contract.parameterSchema.ExtractSignatures();

signatures enthält dann ein Array eines Arrays von Zeichenfolgen, wobei Element 0 in jedem Array der Funktionsname ist und der Rest der Elemente die Typen aus der Funktionssignatur sind.

Für einen FA1.2-Basisvertrag hätten Sie beispielsweise.

signatures = [
["approve", "address", "nat"],
["get_allowance", "address", "address", "contract"],
["get_balance", "address", "contract"],
["get_total_supply", "unit", "contract"],
["transfer", "address", "address", "nat"]]

Wenn Sie ein Diktat der Typen wünschen , die jede Funktion mit dem Funktionsnamen als Schlüssel verwendet , können Sie es folgendermaßen erhalten:

  const signatures: string[][] = contract.parameterSchema.ExtractSignatures();
  let signatureDict: StringDictionary<string[]> = {};
  for (let i = 0; i < signatures.length; i++) {

    // 0th element is key, the rest are values of the dict
    signatureDict[signatures[i][0]] = signatures[i];
    signatureDict[signatures[i][0]].shift();
  }
ClaudeBarde Oct 29 2020 at 18:18

Ich habe mich im Taquito-Quellcode umgesehen und kann keine Informationen zu den Argumenten für jeden Einstiegspunkt finden.
Nachdem Sie die Vertragsabstraktion erstellt haben, können Sie die parameterSchemaEigenschaft verwenden, um eine JSON-Darstellung des vom Vertrag erwarteten Werts als Parameter abzurufen:

const contract: ContractAbstraction<ContractProvider> = client.contract.at(this.state.contractAddress);
const parameters = contract.parameterSchema;

Dies gibt aus: { "root": { "val": (JSON value) } }

Abgesehen davon bin ich mir nicht sicher, wie diese Informationen nützlich sein würden, da Taquito intern überprüft, ob die angegebenen Argumente korrekt sind, bevor eine Transaktion ausgegeben wird, sodass Sie sich darüber keine Sorgen machen müssen :)