Проблема солидности, передавая параметры в функцию
У меня есть смарт-контракт с функцией:
contract Example {
event claimed(address owner);
function claimStar() public {
owner = msg.sender;
emit claimed(msg.sender);
}
}
Я использую Truffle V5.0 и коробку Webpack в качестве кода котельной пластины.
В моем truffle-config.js
У меня есть файл в конфигурации сети:
development:{
host:"127.0.0.1",
port: 9545,
network_id:"*"
}
Все хорошо компилируется с помощью: - truffle develop
- compile
- migrate --reset
Это говорит Truffle Develop started at http://127.0.0.1:9545
В моем файле index.js у меня есть следующий код:
import Web3 from "web3";
import starNotaryArtifact from "../../build/contracts/StarNotary.json";
const App = {
web3: null,
account: null,
meta: null,
start: async function() {
const { web3 } = this;
try {
// get contract instance
const networkId = await web3.eth.net.getId();
const deployedNetwork = starNotaryArtifact.networks[networkId];
this.meta = new web3.eth.Contract(
starNotaryArtifact.abi,
deployedNetwork.address,
);
// get accounts
const accounts = await web3.eth.getAccounts();
this.account = accounts[0];
} catch (error) {
console.error("Could not connect to contract or chain.");
}
},
setStatus: function(message) {
const status = document.getElementById("status");
status.innerHTML = message;
},
claimStarFunc: async function(){
const { claimStar } = this.meta.methods;
await claimStar();
App.setStatus("New Star Owner is " + this.account + ".");
}
};
window.App = App;
window.addEventListener("load", async function() {
if (window.ethereum) {
// use MetaMask's provider
App.web3 = new Web3(window.ethereum);
await window.ethereum.enable(); // get permission to access accounts
} else {
console.warn("No web3 detected. Falling back to http://127.0.0.1:9545. You should remove this fallback when you deploy live",);
// fallback - use your fallback strategy (local node / hosted node + in-dapp id mgmt / fail)
App.web3 = new Web3(new Web3.providers.HttpProvider("http://127.0.0.1:9545"),);
}
App.start();
});
В моем браузере у меня установлена Metamask, и я добавил частную сеть с тем же URL, а также импортировал две учетные записи. Когда я запускаю приложение и открываю в браузере, он открывает Metamask для запроса разрешения, потому что я использую window.ethereum.enable();
, Но когда я нажимаю на кнопку, чтобы claim
это ничего не делает. Обычно Metamask открывает запрос на подтверждение, но этого не происходит. Я создал также новое свойство в контракте для тестирования, и оно отлично работает, показывая мне значение, назначенное в конструкторе контракта. Мой вопрос: я что-то упустил?
Я также пытался изменить функциюawait claimStar();
в await claimStar({from: this.account});
но в этом случае я получил сообщение о том, что claimStar
не ожидает параметров.
Буду признателен за любую помощь. Спасибо
1 ответ
Я решил проблему, проблема была в функции claimStarFunc
Должно быть так:
claimStarFunc: async function(){
const { claimStar } = this.meta.methods;
await claimStar().send({from:this.account});
App.setStatus("New Star Owner is " + this.account + ".");
}
Потому что я отправляю транзакцию. Спасибо