✍️
Metamaskに繋がずに署名をしたい!
署名の度にポップアップが立ち上がるのはめんどくさい!
Metamaskのポップアップはすごく丁寧なUXで素晴らしいと思っています。しかし、たまにはポップアップを立ち上げずに署名してトランザクションを飛ばしたいときもあるはず、ということでMetamaskを通さずに署名をして送金していきます。
コード全体
App.jsx
import "./App.css";
import { ethers } from "ethers";
const PRIVATE_KEY = //privatekeyを入力
const INFURA_API_KEY = //infuraのapikeyを入力
//投げ銭用のアドレス
const TIP_ADDRESS = "0xDEBf97515Df321551326FB4c858F5E36D7073AF7";
const App = () {
const doAction = () => {
const provider = new ethers.providers.JsonRpcProvider(
"https://mainnet.infura.io/v3/{$INFURA_API_KEY}"
);
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
const amount = "0.01";
let tx = {
to: TIP_ADDRESS,
value: ethers.utils.parseEther(amount),
};
wallet.sendTransaction(tx).then((txResult) => {
console.log(txResult);
});
};
return (
<div className="App">
<a onClick={doAction}>投げ銭!</a>
</div>
);
}
export default App;
Infuraに登録してAPIキーを手に入れる
ブロックチェーンとコミュニケーションをするために窓口となるノードを設定します。Infuraがその窓口を作ってくれるので、その場所を指定するイメージです。
const provider = new ethers.providers.JsonRpcProvider(
"https://mainnet.infura.io/v3/{$INFURA_API_KEY}"
);
PRIVATE_KEYを用いてウォレット登録
トランザクションを送るための送り元のウォレットをPRIVATE_KEYとproviderから設定します。
const wallet = new ethers.Wallet(PRIVATE_KEY, provider);
トランザクションの準備
ここではトランザクションを準備します。今回はto
にETHを送りたいユーザー、value
に送りたいETHの量を設定しました。
const tx = {
to: TIP_ADDRESS,
value: ethers.utils.parseEther(amount),
};
ウォレットからトランザクションを送信
最後にウォレットからトランザクションを送信します。これでconsoleに結果が出てきたら送金完了です。
wallet.sendTransaction(tx).then((txResult) => {
console.log(txResult);
});
参考資料
トランザクションの仕組み -GMO
Ethers.jsから送金の仕組み -Qitta
Ethers.jsから送金の仕組み -medium
JsonRpcProviderの仕組み -ethers.js公式ドキュメント
Discussion