Cryptocurrency Research Lab.

Cryptocurrency関連技術についての調査・研究

ethers in Deno

Denoは、Node.jsの開発者であるRyan Dahl氏による『10 Things I Regret About Node.js』の発表以降、開発が進められてきたJavaScript/TypeScript ランタイム実行環境です。とくにセキュリティ面において、不必要なネットワークアクセスやファイルアクセスを制限できる点は非常に気に入っています。

Node.js向けにはWeb3ethersなどのライブラリが用意されていますが、Denoの場合には、esm.sh経由でethersを呼び出せばよさそうです。

ウォレットアドレスの作成

ウォレットを用意する際は、オフラインでプログラムを実行するのが安心ですね。

create.ts
import { ethers } from "https://esm.sh/ethers?dts";

const wallet = ethers.Wallet.createRandom();
console.log(`mnemonic: ${wallet.mnemonic.phrase}`);
console.log(`privateKey: ${wallet.privateKey}`);
console.log(`address: ${wallet.address}`);

実行する際には、以下のようなコマンドを実行するとよいでしょう。依存ライブラリの中で環境変数NODE_DEBUGへアクセスしているようですので、--allow-envで参照権限を付与しておきましょう。(使用バージョンに依るのかもしれません)

$ deno run --allow-env=NODE_DEBUG createWallet.ts 

指定アドレスのトーク保有

指定ウォレットアドレスの トークン量を見るプログラムを書いてみましょう。筆者は、EthereumよりもEVM互換のBNB Chainをよく利用しますから、BabySwapのBABYトーク保有量を見てみたいと思います。

JSON-RPCエンドポイントの接続先を変えれば、アクセスするチェーンも変わります。BNB ChainのエンドポイントはMetamaskなどのウォレットで設定するものと同様、ここを参考にするとよいでしょう。
本サンプルでは、https://bsc-dataseed.binance.org/ を使用しています。

test.ts
import { ethers } from "https://esm.sh/ethers?dts";

// Wallet Address
const walletAddress = "<ウォレットアドレス>";

// BABY Token on BNB Chain
const contractAddress = "0x53e562b9b7e5e94b81f10e96ee70ad06df3d2657";
const abi = [
  "function balanceOf(address) view returns (uint)",
];

const provider = new ethers.providers.JsonRpcProvider('https://bsc-dataseed.binance.org/'); 
const babyContract = new ethers.Contract(contractAddress, abi, provider);
const balance = await babyContract.balanceOf(walletAddress );

// Format the BABY for displaying to the user
const amount = ethers.utils.formatUnits(balance, 18)
console.log(amount);

ネットワークを使用しますので、--allow-netオプションを指定する必要があります。アクセス先が限定している場合には、「=<ホスト名>」のように指定すればより安心でしょう。

$ deno run --allow-net=bsc-dataseed.binance.org --allow-env=NODE_DEBUG test.ts