Metamask (Ethereum mainnet) 上の通貨の残高を取得する方法のメモ。
概要
- Node.js + Infura + ether.jsで割と簡単に取得できる。ただし、本記事のサンプルコードだと秘匿情報の管理方法に問題があるので、その点については追加の考慮が必要。エラー処理についても同様。
- ERC20対応のUSDCなど、ETH以外の通貨についてはスマートコントラクトのclientを追加で実装する必要がある。
Infura (インフューラ)
- API経由でアクセス可能な、Ethereum mainnetのフルノードサービス。
Metamaskの提供会社が提供しており、Metamask Developer に会員登録し、API KEYを発行することで利用可能になる。
詳細は以下ページを参照。
ether.js
- EthereumノードにRPCリクエストを送信するためのjsのライブラリ。
- Infuraと組み合わせることで、任意のwalletのbalanceを簡単に取得できる。
サンプルコード
最も簡素なコード
import { ethers } from "ethers";
const INFURA_API_KEY = "xxx";
const provider = new ethers.InfuraProvider("mainnet", INFURA_API_KEY);
const WALLET_ADDRESS = "xxx";
const balance = await provider.getBalance(WALLET_ADDRESS);
console.log("Address:", WALLET_ADDRESS);
console.log("Balance:", ethers.formatEther(balance), "ETH");
ERC20対応の他の通貨のbalanceを取得したい場合
const usdc = new ethers.Contract(USDC_ADDRESS, ERC20_MIN_ABI, provider);
- コード全文は以下
import { ethers } from "ethers";
const INFURA_API_KEY = "xxx";
const ADDRESS = "xxx";
// Ethereum Mainnetに接続
const provider = new ethers.InfuraProvider("mainnet", INFURA_API_KEY);
// USDC(Ethereum Mainnet)のコントラクトアドレスと最小ABI
const USDC_ADDRESS = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
const ERC20_MIN_ABI = [
"function balanceOf(address) view returns (uint256)",
"function decimals() view returns (uint8)",
"function symbol() view returns (string)"
];
const usdc = new ethers.Contract(USDC_ADDRESS, ERC20_MIN_ABI, provider);
const main = async () => {
// ETH(ネイティブ)の残高
const ethBal = await provider.getBalance(ADDRESS);
console.log("ETH:", ethers.formatEther(ethBal));
// USDC(ERC-20)の残高
const [raw, decimals, symbol] = await Promise.all([
usdc.balanceOf(ADDRESS),
usdc.decimals(),
usdc.symbol(),
]);
console.log(`${symbol}:`, ethers.formatUnits(raw, decimals));
};
main().catch(console.error);