Solidity
松露控制台中的“instance.at(addr) 不是函式”(訪問非遷移契約)
我有一個帶有單例契約的設置,並通過松露控制台遷移到例如測試網。該合約“創建”了我想在 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。它提高了可讀性。