🐷

(動画付き)[Astar]コントラクト備忘録40(Polkadot.jsを使ってコントラクトの値を取得しよう!)

2023/03/12に公開

本日は、Polkadot.jsを用いて、コントラクトから読み取る関数を実行しようと思います。

この記事に対応するYouTubeはこちらです。
https://www.youtube.com/watch?v=yIu3l_ksBy8

こちらの公式を元にします。

https://polkadot.js.org/docs/api-contract/start/contract.read

下のように、「contract.query.<messageName>」で利用することができます。

また、「dry run」を行うため、ガス代が消費されないことがわかります。

https://polkadot.js.org/docs/api-contract/start/contract.read

しかし、この通りやっても下のようにうまくいかないと思います。

こちらを参照してください。
https://zenn.dev/yuki2020/articles/4d4a60ecd87b07

この原因は「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