HelloCount.sol
Mainnet Address: 0x3258b57a3c93578dc4e8cd0d92184bd482859da3
Ropsten Address: 0x93b098Ce1b4A51e86569191aC1A53A85fC897AA6
code:HelloCount.sol
pragma solidity ^0.4.25;
contract HelloCount {
address owner;
string message;
uint public count;
event DidCountUp(uint currentCount, address sender);
event DidCountDown(uint currentCount, address sender);
constructor ()
public
{
owner = msg.sender;
message = "hello!";
}
function hello()
public
view
returns(string)
{
return message;
}
function getCount()
public
view
returns(uint)
{
return count;
}
function countUp()
public
{
count += 1;
emit DidCountUp(count, msg.sender);
}
function countDown()
public
{
count -= 1;
emit DidCountDown(count, msg.sender);
}
function destroy()
public
{
require(msg.sender == owner);
selfdestruct(owner);
}
}
code:ABI
[{"constant":true,"inputs":[],"name":"count","outputs":{"name":"","type":"uint256"},"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"countUp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hello","outputs":{"name":"","type":"string"},"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"countDown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCount","outputs":{"name":"","type":"uint256"},"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":{"indexed":false,"name":"currentCount","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},"name":"DidCountUp","type":"event"},{"anonymous":false,"inputs":{"indexed":false,"name":"currentCount","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},"name":"DidCountDown","type":"event"}] 動作デモ(web3.js v0.20.6, Ropsten)
code:demo.js
var web3js;
const CONTRACT_ADDRESS = '0x93b098Ce1b4A51e86569191aC1A53A85fC897AA6';
const CONTRACT_ABI = [{"constant":true,"inputs":[],"name":"count","outputs":{"name":"","type":"uint256"},"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"countUp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hello","outputs":{"name":"","type":"string"},"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"countDown","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCount","outputs":{"name":"","type":"uint256"},"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":{"indexed":false,"name":"currentCount","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},"name":"DidCountUp","type":"event"},{"anonymous":false,"inputs":{"indexed":false,"name":"currentCount","type":"uint256"},{"indexed":false,"name":"sender","type":"address"},"name":"DidCountDown","type":"event"}]; $(document.body).append('current count <input id="current-count" type="text" size="80" readonly><button onclick="refresh()">refresh</button><br>')
$(document.body).append('<button onclick="countUp()">countUp</button><br>')
$(document.body).append('<button onclick="countDown()">countDown</button><br>')
$(document.body).append('<textarea id="result" cols="10" rows="10" readonly></textarea><br>')
var web3js;
if (typeof web3 !== 'undefined') {
console.log("Use MetaMask")
web3js = new Web3(web3.currentProvider)
} else {
console.log("Use Infura")
}
let contract = web3js.eth.contract(CONTRACT_ABI).at(CONTRACT_ADDRESS)
function refresh() {
contract.getCount((error, result) => {
$('#current-count').val(result.toNumber())
})
}
function countUp() {
let txObj = {gasPrice: 40000000000}
contract.countUp(txObj,(error, result) => {
$('#result').val(result)
addEtherScanUrl(result)
})
}
function countDown() {
let txObj = {gasPrice: 40000000000}
contract.countDown(txObj, (error, result) => {
$('#result').val(result)
addEtherScanUrl(result)
})
}
function addEtherScanUrl(txId) {
$(document.body).append('<a href="' + url + '" target="_blank">' + txId + '</a><br>')
}
// ポーリングし、使用しているネットワークをチェックします。
// ネットワークが Ropsten でなければ、エラーを表示します。
setInterval(function () {
web3js.version.getNetwork(checkNetwork)
}, 300)
function checkNetwork (err, currentNetwork) {
if (window.lastNetwork != currentNetwork) {
console.log("Ethereum Network has been changed: " + currentNetwork)
window.lastNetwork = currentNetwork
if(!isRopestenNetwork()) {
alert("Ropsten ネットワークを使用してください");
}
}
}
function isRopestenNetwork() {
let network = web3js.version.network
console.log(network)
if (network == 3) {
return true
} else {
return false
}
}
let countUpEvent = contract.DidCountUp()
countUpEvent.watch((error, result) => {
alert("DidCountUp")
console.log(result)
refresh()
})
let countDownEvent = contract.DidCountDown()
countDownEvent.watch((error, result) => {
alert("DidCountDown")
console.log(result)
refresh()
})
refresh()
関連