📝

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

2023/03/10に公開

本日は、Polkadot.jsを用いて、アドレスの残高の取得と、残高が変化したときに通知を受けてみましょう。

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

こちらの「Listen to balance changes」を見ていきましょう。


https://polkadot.js.org/docs/api/examples/promise/listen-to-balance-change

今回は、こちらのコードを使用します。

const ALICE = '5D2MwJP4v1TeauSooBvJ8ueUyxtmrqpq6FpJTXbENwWSzn8M';

async function main () {
  // Initialise the provider to connect to the local node
  const provider = new WsProvider('wss://rpc.shibuya.astar.network');

  // Create the API and wait until ready
  const api = await ApiPromise.create({ provider });

  // Retrieve the initial balance. Since the call has no callback, it is simply a promise
  // that resolves to the current on-chain value
  let account = await api.query.system.account(ALICE);
  console.log("account", account)
  let { data: { free: previousFree }, nonce: previousNonce } = await api.query.system.account(ALICE);

  console.log(`${ALICE} has a balance of ${previousFree}, nonce ${previousNonce}`);
  console.log(`You may leave this example running and start example 06 or transfer any value to ${ALICE}`);

  // Here we subscribe to any balance changes and update the on-screen value
  api.query.system.account(ALICE, ({ data: { free: currentFree }, nonce: currentNonce }) => {
    // Calculate the delta
    const change = currentFree.sub(previousFree);

    // Only display positive value changes (Since we are pulling `previous` above already,
    // the initial balance change will also be zero)
    if (!change.isZero()) {
      console.log(`New balance change of ${change}, nonce ${currentNonce}`);

      previousFree = currentFree;
      previousNonce = currentNonce;
    }
  });
}

main().then(() => console.log('completed'))

確認したいアドレスはこちらに入れてください。

また、このように、エラーも発生してしまっています。

こちらによると、TypeScriptの場合、デフォルトでは「Substrate types」「endpoints」がデコレートされていないようです。

そのため、「import '@polkadot/api-augment';」を入れる必要があります。


https://github.com/polkadot-js/api/releases/tag/v7.0.1

このように入れると、エラーが消えたようです。

では、中身を少し見てみましょう。

「await api.query.system.account(ALICE)」の結果を、下のように分割代入しています。

実際にaccountを確認すると、下のような構造になっていることが確認できました。

こちらも見てみましょう。

取得した値をもとに、コールバック関数を実行しています。

また、上の「sub」は「Balance」オブジェクトのメソッドであり、差分を計算しているようです。

別でトランザクションを起こし、ガス代分の残高を減らすと、下のように変化した量と、新しいnonceを表示しました。

今回は以上です。

Discussion