Skip to content

Instantly share code, notes, and snippets.

@tokchin
Last active August 2, 2019 10:03
Show Gist options
  • Save tokchin/b92b6208a19311b9ef4c3b1d94860e72 to your computer and use it in GitHub Desktop.
Save tokchin/b92b6208a19311b9ef4c3b1d94860e72 to your computer and use it in GitHub Desktop.
import Web3 from 'web3'
import axios from 'axios'
//メタマスクのロード(メタマスク公式の初期化処理)
function getWeb3(){
let web3
//metamaskの場合
if (window.ethereum) {
//web3インスタンスを生成
web3 = new Web3(ethereum);
try {
//ユーザーのアカウントにweb3でアクセスできるかチェック
ethereum.enable();
// エラーの場合
} catch (error) {
// User denied account access...
console.log('User denied account access...');
}
}
// レガシーなdappブラウザの場合
else if (window.web3) {
web3 = new Web3(web3.currentProvider);
}
// DAPPブラウザでない場合
else {
console.log('Non-Ethereum browser detected. You should consider trying MetaMask!');
}
return web3
}
//コントラクトのロード
function getContract(){
//web3インスタンスの生成
let web3 =getWeb3()
//イーサリアムのコントラクトのメソッドを実行するときにtokenABIの設定が必要(APIみたいなやつ)
const tokenABI =[{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isPauser","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"tokenURI","type":"string"}],"name":"mintWithTokenURI","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_extensionType","type":"uint16"},{"name":"_supplyLimit","type":"uint16"}],"name":"setSupplyLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_extensionType","type":"uint16"}],"name":"getSupplyLimit","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenURIPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"isAlreadyMinted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isMinter","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokenURIPrefix","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXTENSION_TYPE_OFFSET","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"mintExtensionAsset","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[],"name":"MintingFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
//マイクリ エクステのトークンアドレス
const contractHashMCHE = "0xdceaf1652a131F32a821468Dc03A92df0edd86Ea" 
//マイクリ エクステのコントラクトをweb3jsで読み込み
return web3.eth.Contract(tokenABI, contractHashMCHE)
}
//tokenidからjsonを取得
//引数[2002023,2002012,2002022]
//戻り値[json,json,json,json]
function getJsonFromTokenIds(tokenids){
//出力する内容を宣言
let output = []
//web3のcontractインスタンスを生成
let contract = getContract()
//引数で渡されたtoken_idの数だけループ
for(let i=0;i<tokenids.length;i++){
//生成したマイクリ のコントラクトインスタンスにトークンIDを投げ
//メタデータのダウンロードURIを入手
contract.methods.tokenURI(tokenids[i]).call().then(function(value){
//ゲットしたURIからメターデータをダウンロード
axios
.get(value)
.then(response => (output.push(response.data)))
})
}
//アウトプットを出力
return output
}
//ウォレットアドレスにひもづくマイクリ アセットを全て取得する。
//引数 "0x6B3c92AADB19750F3dFaAD31974d8B3c7E7A171E"
//戻り値[json, json, json...]
export async function getJsonFromWalletAddress(address){
let num
let assets = []
let contract = getContract()
//生成したコントラクトのインスタンスに引数として私たアドレスに
//何個のアセットが紐づいているかを問い合わせ
await contract.methods.balanceOf(address).call().then(function(value){
//受け取ったインデックスを16進数のHEXから10進数に変換
num = parseInt(value._hex,16)
})
//保有アセットの数だけ、token_idを取得
for(let i=0;i<num;i++){
await contract.methods.tokenOfOwnerByIndex(address,i).call().then(function(value){
assets.push(value)
})
}
return getJsonFromTokenIds(assets)
}
//自分の持ってるアセットのメタデータをjsonで取得
//引数 自分のウォレットアドレス
//戻り値[json, json, json...]
export async function getMyAssets(){
let web3 = getWeb3()  //web3の情報の読み込み
//web3jsを使って自分のアドレスを取得
let address = await web3.eth.getAccounts().then(function(value){return value[0]})
//getJsonFromWalletAddressに引数として
//自分のアドレスを送って自分の保有アセットをjsonで取得
return getJsonFromWalletAddress(address)
}
//index 1-10のアセットを取得
//引数 なし
//戻り値[asset1, asset2... asset10]
export async function getRandomAssets(){ //実はrandomではない。。。
let contract = getContract()
let tokenids2 = []
//インデックス番号が1−10のアセットのtoken_idを入手
for(let i=0;i<10;i++){
await contract.methods.tokenByIndex(i).call().then(function(value){
tokenids2.push(parseInt(value._hex,16))
})
}
//token_idからjsonファイルを入手する。
return getJsonFromTokenIds(tokenids2)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment