eth_tool 0.1.2 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 0d39009c73c72ae1efc9514d64fc8604adc71ab4
4
- data.tar.gz: 9eb045ee35fe673a92638a9554afcee04c0b6e09
3
+ metadata.gz: 42582922f086da93a06a03794c5f7fc8dc597d99
4
+ data.tar.gz: b47aba46aa564894485d3e9d3972f3c12767bd96
5
5
  SHA512:
6
- metadata.gz: 1b9dc1275802f494eb411042609d1668e7d9e8eb2cd4d7c429998a910adc9022953133ec52c6677906b60337ae4b0317dffc819f1103f7d2da8bf9f37874be98
7
- data.tar.gz: bd07deeb2f188b8aea0f77fb46d344dd5b2d53da357bcdb2a07b6b897dda563f28e8b7a9c6683b54e29277e753699d1d620026053c3c60df0c93e2d8a2b796f6
6
+ metadata.gz: d063fbb0bbeaf4193e40ecbe494c96cf44c294916be0c5fda3144875f245c8ef579b1aff156c24f27947c85e1079bb43dee88bd60ee5c3223055d75934ef7f6a
7
+ data.tar.gz: 2e8393d5a93f7008fde1380cdc29fb18fb7e6e290d7618ce2d1d8f8d49b44e5a211a60d3ff4b5467d763dec4e708b1ced04e7f63566af500b7d83f585334a53d
Binary file
@@ -1,19 +1,19 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- eth_tool (0.1.2)
4
+ eth_tool (0.1.5)
5
5
  bip44 (~> 0.2.14)
6
6
  ethereum.rb (~> 2.1.8)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- activesupport (5.1.5)
11
+ activesupport (5.2.0)
12
12
  concurrent-ruby (~> 1.0, >= 1.0.2)
13
- i18n (~> 0.7)
13
+ i18n (>= 0.7, < 2)
14
14
  minitest (~> 5.1)
15
15
  tzinfo (~> 1.1)
16
- bip44 (0.2.14)
16
+ bip44 (0.2.15)
17
17
  bip_mnemonic
18
18
  digest-sha3 (~> 1.1.0)
19
19
  ecdsa (~> 1.2.0)
@@ -33,11 +33,11 @@ GEM
33
33
  ethereum.rb (2.1.8)
34
34
  activesupport (~> 5.0)
35
35
  digest-sha3 (~> 1.1)
36
- ffi (1.9.22)
36
+ ffi (1.9.23)
37
37
  ffi-compiler (1.0.1)
38
38
  ffi (>= 1.0.0)
39
39
  rake
40
- i18n (0.9.5)
40
+ i18n (1.0.1)
41
41
  concurrent-ruby (~> 1.0)
42
42
  minitest (5.11.3)
43
43
  money-tree (0.9.0)
Binary file
@@ -5,8 +5,6 @@ require 'eth'
5
5
  require 'bigdecimal'
6
6
 
7
7
  module EthTool
8
- @@gas_limit = 60000
9
- @@gas_price = 5_000_000_000
10
8
 
11
9
  def self.rpc=(url)
12
10
  @@rpc = Ethereum::HttpClient.new(url)
@@ -16,16 +14,8 @@ module EthTool
16
14
  @@rpc
17
15
  end
18
16
 
19
- def self.gas_limit=(gas_limit)
20
- @@gas_limit = gas_limit
21
- end
22
-
23
- def self.gas_price=(gas_price)
24
- @@gas_price = gas_price
25
- end
26
-
27
- def self.fee
28
- BigDecimal(@@gas_limit) * BigDecimal(@@gas_price) / 10**18.to_f
17
+ def self.fee(gas_limit, gas_price)
18
+ BigDecimal(gas_limit) * BigDecimal(gas_price) / 10**18.to_f
29
19
  end
30
20
 
31
21
  class << self
@@ -33,6 +23,7 @@ module EthTool
33
23
  end
34
24
 
35
25
  ############################################################################
26
+
36
27
 
37
28
  def self.get_token_balance(address, token_contract_address, token_decimals)
38
29
  data = '0x70a08231' + padding(address) # Ethereum::Function.calc_id('balanceOf(address)') # 70a08231
@@ -70,7 +61,39 @@ module EthTool
70
61
  tx.hex
71
62
  end
72
63
 
73
- def self.transfer_token(private_key, token_contract_address, token_decimals, amount, gas_limit, gas_price, to)
64
+ # def self.wputs(text)
65
+ # File.open('/Users/wuminzhe/Projects/eth_tool/scripts/fuck.txt', 'a') { |f| f.puts(text) }
66
+ # end
67
+
68
+ def self.estimate_gas(to, data)
69
+ @@rpc.eth_estimate_gas({to: to, data: data})["result"].to_i(16)
70
+ end
71
+
72
+ def self.build_airdrop_data(token_contract_address, addresses, values)
73
+ data = "0xad8733ca"
74
+ data = data + padding(token_contract_address)
75
+ data = data + "0000000000000000000000000000000000000000000000000000000000000060"
76
+ data = data + "0000000000000000000000000000000000000000000000000000000000001840"
77
+ data = data + "00000000000000000000000000000000000000000000000000000000000000be"
78
+ addresses.each do |address|
79
+ data = data + padding(address.downcase)
80
+ end
81
+ data = data + "00000000000000000000000000000000000000000000000000000000000000be"
82
+ values.each do |value|
83
+ data = data + padding(value.to_i.to_s(16))
84
+ end
85
+ return data
86
+ end
87
+
88
+ def self.airdrop(private_key, airdrop_contract_address, token_contract_address, addresses, values, gas_limit, gas_price)
89
+ data = build_airdrop_data(token_contract_address, addresses, values)
90
+
91
+ rawtx = generate_raw_transaction(private_key, 0, data, gas_limit, gas_price, airdrop_contract_address)
92
+
93
+ @@rpc.eth_send_raw_transaction(rawtx)
94
+ end
95
+
96
+ def self.transfer_token(private_key, token_contract_address, token_decimals, amount, gas_limit, gas_price, to, nonce=nil)
74
97
  if amount < (1.0/10**token_decimals)
75
98
  logger.info "转账金额不能小于精度最小单位(#{token_contract_address}, #{token_decimals})"
76
99
  return
@@ -79,7 +102,7 @@ module EthTool
79
102
  # 生成raw transaction
80
103
  amount_in_wei = (amount * (10**token_decimals)).to_i
81
104
  data = '0xa9059cbb' + padding(to) + padding(dec_to_hex(amount_in_wei)) # Ethereum::Function.calc_id('transfer(address,uint256)') # a9059cbb
82
- rawtx = generate_raw_transaction(private_key, 0, data, gas_limit, gas_price, token_contract_address)
105
+ rawtx = generate_raw_transaction(private_key, 0, data, gas_limit, gas_price, token_contract_address, nonce)
83
106
 
84
107
  @@rpc.eth_send_raw_transaction(rawtx)
85
108
  end
@@ -93,33 +116,33 @@ module EthTool
93
116
  @@rpc.eth_send_raw_transaction(rawtx)
94
117
  end
95
118
 
96
- #
97
- def self.sweep_token(private_key, token_contract_address, token_decimals, to)
119
+ # sweep
120
+ def self.sweep_token(private_key, token_contract_address, token_decimals, to, gas_limit=60000, gas_price=5_000_000_000)
98
121
  address = ::Eth::Key.new(priv: private_key).address
99
122
  token_balance = get_token_balance(address, token_contract_address, token_decimals)
100
123
  return if token_balance == 0
101
- transfer_token(private_key, token_contract_address, token_decimals, token_balance, @@gas_limit, @@gas_price, to)
124
+ transfer_token(private_key, token_contract_address, token_decimals, token_balance, gas_limit, gas_price, to)
102
125
  end
103
126
 
104
- def self.sweep_eth(private_key, to)
127
+ def self.sweep_eth(private_key, to, gas_limit=60000, gas_price=5_000_000_000)
105
128
  address = ::Eth::Key.new(priv: private_key).address
106
129
  eth_balance = get_eth_balance(address)
107
- keep = BigDecimal(@@gas_limit) * BigDecimal(@@gas_price) / 10**18
130
+ # 转eth不能都转,要留一点作为gas费用
131
+ keep = BigDecimal(gas_limit) * BigDecimal(gas_price) / 10**18
108
132
  amount = eth_balance - keep
109
133
  return if amount <= 0
110
- transfer_eth(private_key, amount, @@gas_limit, @@gas_price, to)
134
+ transfer_eth(private_key, amount, gas_limit, gas_price, to)
111
135
  end
112
136
 
113
- def self.fill_eth(private_key, to)
137
+ # 目标地址上需要填充满这么多eth
138
+ # amount = BigDecimal(gas_limit) * BigDecimal(gas_price) / 10**18
139
+ def self.fill_eth(private_key, to, amount, gas_limit=60000, gas_price=5_000_000_000)
114
140
  # 目标地址上现有eth
115
141
  eth_balance = get_eth_balance(to)
116
142
 
117
- # 目标地址上需要填充满这么多eth
118
- amount = BigDecimal(@@gas_limit) * BigDecimal(@@gas_price) / 10**18
119
-
120
143
  return unless eth_balance < amount # 如果有足够多的eth,就直接返回
121
144
 
122
- transfer_eth(private_key, (amount-eth_balance), @@gas_limit, @@gas_price, to)
145
+ transfer_eth(private_key, (amount-eth_balance), gas_limit, gas_price, to)
123
146
  end
124
147
 
125
148
  def self.tx_replace(private_key, txhash, gas_price)
@@ -221,9 +244,5 @@ module EthTool
221
244
  end
222
245
  str.rjust(64, '0')
223
246
  end
224
-
225
- def self.wputs(file, text)
226
- File.open(file, 'a') { |f| f.puts(text) }
227
- end
228
247
 
229
248
  end
@@ -1,3 +1,3 @@
1
1
  module EthTool
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eth_tool
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wu Minzhe
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-03-01 00:00:00.000000000 Z
11
+ date: 2018-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -73,6 +73,7 @@ executables: []
73
73
  extensions: []
74
74
  extra_rdoc_files: []
75
75
  files:
76
+ - ".DS_Store"
76
77
  - ".gitignore"
77
78
  - CODE_OF_CONDUCT.md
78
79
  - Gemfile
@@ -83,6 +84,7 @@ files:
83
84
  - bin/console
84
85
  - bin/setup
85
86
  - eth_tool.gemspec
87
+ - lib/.DS_Store
86
88
  - lib/eth_tool.rb
87
89
  - lib/eth_tool/version.rb
88
90
  homepage: ''