-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherc20Mainnet.js
99 lines (86 loc) · 4.59 KB
/
erc20Mainnet.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
async function app() {
let Web3 = require('web3'); //送金にweb3.jsを使用
const csvtojson = require("csvtojson/v2"); //csvファイルからJSONデータを生成する
var EthereumTx = require('ethereumjs-tx').Transaction; //ethereumjsを用いてトランザクションに署名する
//Infra.ioのAPIキーでweb3のインスタンを生成
let web3 = await new Web3(new Web3.providers.HttpProvider(process.argv[4])); //Infra.ioのAPIキー(https://mainnet.infura.io/apiキー)
//addressListに送金先アドレスを格納
let addressList = [];
await csvtojson()
.fromFile('./address.csv') //送金先アドレスのcsvファイルのパス
.then((jsonObj)=>{
addressList = jsonObj
})
//pkに秘送金者の密鍵を格納
let pk = "";
await csvtojson()
.fromFile('./privatekey.csv') //送金者の秘密鍵のcvsのファイルのパス
.then((jsonObj)=>{
pk = jsonObj[0]['privatekey']
})
//fromAddressに送金者のアドレスを格納
const fromAddress = process.argv[3]; //送金者のアドレス
//web3のwalletに送金者の秘密鍵とアドレスを設定
await web3.eth.accounts.wallet.add({
privateKey: pk,
address: fromAddress
})
//デフォルトのアカウントに送金者のアドレスを設定
web3.eth.defaultAccount = fromAddress;
//コントラクトを取得するためにコントラクトの情報が必要。ABI(Contract Application Binary Interface)とコントラクトアドレス。
//コントラクトのアクセスする関数のABI情報を記述。balanceOf()とtransfer()。
let contractABI = [
{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}], "stateMutability":"view","type":"function","constant":true,"signature":"0x70a08231"},
{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function","signature":"0xa9059cbb"},
]
//JPYCのコントラクトアドレス。ネットワークによって異なる。
let tokenAddress = process.argv[2]; //Etherscanで確認できる
//ABIとコントラクトアドレスによってコントラクトのインスタンスを生成
let contract = await new web3.eth.Contract(contractABI, tokenAddress);
//addressListのアドレスに送金していく
for (let i = 0; i < addressList.length; i++) {
//送金者のアドレスから所持金を確認
let tokenBalance = await contract.methods.balanceOf(fromAddress).call({
from: fromAddress,
})
//文字列を数値に変換し、所持金が送金額より少ない場合ログを出力して終了する。
if (Number(tokenBalance) < Number(addressList[i]['amount'])) { return console.log('Token balance insufficient') }
//ノンスの計算
var nonce = await web3.eth.getTransactionCount(fromAddress, 'pending')
var nonceHex = await web3.utils.toHex(nonce)
//ガス代の計算
var gasPrice = await web3.eth.getGasPrice()
var gasEstimate = await contract.methods
.transfer(addressList[i]['address'], addressList[i]['amount'])
.estimateGas({ from: fromAddress })
var gasPriceHex = await web3.utils.toHex(gasPrice)
var gasLimitHex = await web3.utils.toHex(gasEstimate)
//コントラクトのメソッドのABIをエンコードする
var myData = await contract.methods.transfer(addressList[i]['address'], addressList[i]['amount']).encodeABI();
//取引の詳細
var details = {
nonce: nonceHex,
gasPrice: gasPriceHex,
gasLimit: gasLimitHex,
to: tokenAddress,
from: fromAddress,
data: myData,
}
//取引詳細とchainでトランザクションのインスタンを生成
var transaction = new EthereumTx(details, {chain: process.argv[5], hardfork: 'petersburg' })
//秘密鍵をBufferに変換
var privatekey = Buffer.from(pk, 'hex')
//トランザクションに秘密鍵のBufferで署名
transaction.sign(privatekey)
//シリアライズして16真数のバイト形式にする
var rawdata = '0x' + transaction.serialize().toString('hex')
//署名したデータをweb3で送信
await web3.eth.sendSignedTransaction(rawdata)
.on('receipt', function(receipt){
console.log('successfully transferred tokens to ' + addressList[i]['address'] +', transactionHash is ' + receipt.transactionHash)
})
}
return
}
//async/await関数のapp()を実行
app()