„instance.at(addr) ist keine Funktion“ in der Truffle-Konsole (Zugriff auf nicht migrierte Verträge)

Ich habe ein Setup mit einem Vertrag, der ein Singleton ist und z. B. über die Truffle-Konsole zu einem Testnet migriert wird. Dieser Vertrag „erstellt“ neue Verträge, auf die ich in der Truffle-Konsole zugreifen möchte. instance.at(address)Da die neuen Verträge nicht über die Konsole migriert werden, möchte ich sie in einem Befehl verwenden, den ich in Truffle ausführen werde. Die Instanz wird jedoch nicht erkannt ...

Verträge:
Singleton.sol → über Truffle migriert ManyOfMe.sol→ über Singleton.sol erstellt

Fehler:

TypeError: ManyOfMe.at ist keine Funktion

Code: run.js ausgeführt durch die Truffle-Konsole:exec ./run.js

const artifacts = require('./build/contracts/Singleton.json')
const ManyOfMe = require('./build/contracts/ManyOfMe.json')
const contract = require('truffle-contract')
const MyContract = contract(artifacts)
MyContract.setProvider(web3.currentProvider)

let Singleton
MyContract.deployed()
.then(async function(instance) {
  Singleton = instance

  let tokenAddress
  await Singleton.tokens(0).then(_ => {
    tokenAddress = _
  })
  return ManyOfMe.at(tokenAddress)
})
.then(function(instance) {
  instance.doSomething().then(_ => console.log(_))
})
.catch(function(error) {
  console.error(error)
})

PS: Wenn ich einfach ManyOfMe in die Truffle-Konsole eingebe, sehe ich die atFunktion, also bin ich mir nicht sicher, warum es nicht funktionieren wird.

Antworten (1)

Wenn Sie das Skript mit ausführen truffle exec, haben Sie bereits den Truffle-Kontext (z. B. artifacts), sodass Sie nicht alles manuell importieren müssen.

Was Sie erreichen möchten, ist ungefähr so ​​​​hier:

const Singleton = artifacts.require("Singleton");
const ManyOfMe = artifacts.require("ManyOfMe");

module.exports = function(done) {
    // code rewritten with async/await
    (async () => {
            var singleton = await Singleton.deployed();
            var manyOfMeAt0 = await ManyOfMe.at(await singleton.tokens(0));
            console.log(await manyOfMeAt0.doSomething());           

            done();
    })();
}

Wenn Sie außerdem async/ verwenden können await, sind then-Ketten nicht erforderlich. Es verbessert die Lesbarkeit.

Gute Antwort! Ich liebe die Lesbarkeit! Vieles für mich geklärt. Letzte Frage: Was ist das done()?
done ist das Signal für Truffle, dass Sie mit Ihrem Skript fertig sind. Da Sie hier Asnyc-Code haben, kehrt die Funktion sofort zurück.
Danke, Mann! Großes Upvoting! Du warst eine echte Hilfe. Du bist ein Pfirsich.
Gern geschehen. Fühlen Sie sich frei, meine anderen Antworten zu überprüfen. ;)