I deployed my contract at 0xa518a732606baae1c72490313cb7bb42c62c7a50. Now, what I try to do is to interact with my functions.. I've created an node.js application over web3 and truffle/contract but I can't access my smart contract(it is named Diploma). My error: UnhandledPromiseRejectionWarning: Error: Cannot create instance of Diploma; no code at address 0xa518a732606baae1c72490313cb7bb42c62c7a50
Also, I made this post for asking more things I don't know if I understand good..
This is what I tried:
const express = require("express");
const app = express();
const Web3 = require("web3");
const contract = require("@truffle/contract");
const artifact = require("./build/contracts/Diploma.json");
app.use(express.json());
if (typeof web3 !== "undefined") {
var web3 = new Web3(web3.currentProvider);
} else {
var web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:7545"));
}
// when I npm start my default provider is taken as Ganache. I suppose it's normal since my node
// can't see my Metamask, right?
const Diploma = contract(artifact);
Diploma.setProvider(web3.currentProvider);
app.listen(8082, async () => {
const accounts = await web3.eth.getAccounts(); // if I console.log this, all my 10 ganache
// accounts are shown
const balance = await web3.eth.getBalance(accounts[0], function(err, result) {
console.log('result', result);
})
var contract_address = "0xa518A732606baae1C72490313Cb7bB42c62c7a50";
Diploma.at(contract_address).then(function (instance) { // here is where I get the error
console.log(instance);
});
});
Also, I have one more question. If I make transactions which I want to persist on Ropsten using my smart contract methods, can I choose the transaction hash / address where my data to be stocked or something like this? And after to retrieve them from that address?
Let's say this are my method:
function method(bytes32 _checksum, uint _data) public {
require(!myMapping[_checksum].isSet);
myMapping[_checksum].isSet = true;
myMapping[_checksum].timestamp = block.timestamp;
myMapping[_checksum].data = _data;
myMapping[_checksum].setBy = msg.sender;
some Event for logs
}
function getDiploma(bytes32 _checksum) public view returns(uint, address) {
return (myMapping[_checksum].data, myMapping[_checksum].setBy);
}
I suppose it's pretty obvious what I try to make. If this is not an optimum method can you give my an advice of how can I implement something to work how I want to..? If this is possible.