Solidity

松露控制台中的“instance.at(addr) 不是函式”(訪問非遷移契約)

  • February 27, 2018

我有一個帶有單例契約的設置,並通過松露控制台遷移到例如測試網。該合約“創建”了我想在 truffle 控制台中訪問的新合約。由於新契約不是通過控制台遷移的,因此我想instance.at(address)在命令中使用我將在 truffle 中執行的命令。但是,它無法辨識實例…

合約:

Singleton.sol → 通過 truffle 遷移 ManyOfMe.sol→ 通過 Singleton.sol 創建

錯誤:

TypeError:ManyOfMe.at 不是函式

程式碼: run.js通過松露控制台執行: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:如果我只是在 truffle 控制台中鍵入 ManyOfMe,我at會看到該功能,所以我不確定為什麼它不起作用。

當您使用 執行腳本時truffle exec,您已經擁有 truffle 上下文(例如artifacts),因此您不需要手動導入所有內容。

你想要達到的目標是這樣的:

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();
   })();
}

此外,如果您可以使用async/ await,則不需要then-chains。它提高了可讀性。

引用自:https://ethereum.stackexchange.com/questions/41023