🐷
(動画付き)[Astar]コントラクト備忘録40(Polkadot.jsを使ってコントラクトの値を取得しよう!)
本日は、Polkadot.jsを用いて、コントラクトから読み取る関数を実行しようと思います。
この記事に対応するYouTubeはこちらです。
こちらの公式を元にします。
下のように、「contract.query.<messageName>」で利用することができます。
また、「dry run」を行うため、ガス代が消費されないことがわかります。
https://polkadot.js.org/docs/api-contract/start/contract.read
しかし、この通りやっても下のようにうまくいかないと思います。
こちらを参照してください。
この原因は「Shibuya」が「WeightV2」にアップロードされたためのようなので、それに沿って下のように修正します。
コードはこちらです。
import Head from 'next/head'
import Image from 'next/image'
import { Inter } from 'next/font/google'
import styles from '@/styles/Home.module.css'
import { ApiPromise, WsProvider } from '@polkadot/api';
import { ContractPromise } from '@polkadot/api-contract';
import { BN, BN_ONE } from "@polkadot/util";
import type { WeightV2 } from '@polkadot/types/interfaces'
import '@polkadot/api-augment'
import metadata from "./metadata.json";
const inter = Inter({ subsets: ['latin'] })
const ALICE = "5D2MwJP4v1TeauSooBvJ8ueUyxtmrqpq6FpJTXbENwWSzn8M"
const MAX_CALL_WEIGHT = new BN(5_000_000_000_000).isub(BN_ONE);
const PROOFSIZE = new BN(1_000_000);
const storageDepositLimit = null;
async function main () {
// Initialise the provider to connect to the local node
const provider = new WsProvider('wss://rpc.shibuya.astar.network');
const api = await ApiPromise.create({ provider});
const contract = new ContractPromise(api, metadata, "YWkppgzx5oZAHLWRDymDnftRBt64okRqNCdufdifFgfjmSH")
console.log("contract", contract.address.toString())
const { gasRequired, storageDeposit, result, output } = await contract.query.get(ALICE,
{
gasLimit: api?.registry.createType('WeightV2', {
refTime: MAX_CALL_WEIGHT,
proofSize: PROOFSIZE,
}) as WeightV2,
storageDepositLimit,
},)
console.log("output", output)
// The actual result from RPC as `ContractExecResult`
console.log(result.toHuman());
// the gas consumed for contract execution
console.log(gasRequired.toHuman());
}
main().then(() => console.log('completed'))
このように、コントラクトのストレージを取ってくることができました。
今回は以上です。
Discussion