huginn_callisto_network_agent 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/huginn_callisto_network_agent/callisto_network_agent.rb +130 -62
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddf73844731bf49acb35b590bd5fc598ba67df6c4db546d568f3b9269f9c8760
|
4
|
+
data.tar.gz: f8163830f26b16c7708f460730ec769894e3c0ffb1c4d3516cac77a29cc5e87a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dca5bdb5fb8f7bf1e7abd0aec593d8ea2ff08109ccdc80049cb495ace905ed53f12698747fce034d6bdac2a831c8d9cc44edeaf45a0f566923fd3543d02a57e
|
7
|
+
data.tar.gz: 8550c96cb4af5d1990e500fffa0558c1576f8df51645074481573fd5dc28fb1e19ba71666076c9598f66f189d24c98b1a8119f4a9273142c504ae01461451986
|
@@ -52,6 +52,7 @@ module Agents
|
|
52
52
|
'wallet_dest' => '',
|
53
53
|
'changes_only' => 'true',
|
54
54
|
'filter_for_method_id' => '',
|
55
|
+
'first_block' => '',
|
55
56
|
'last_block' => ''
|
56
57
|
}
|
57
58
|
end
|
@@ -60,7 +61,7 @@ module Agents
|
|
60
61
|
form_configurable :emit_events, type: :boolean
|
61
62
|
form_configurable :expected_receive_period_in_days, type: :string
|
62
63
|
form_configurable :changes_only, type: :boolean
|
63
|
-
form_configurable :type, type: :array, values: ['get_balance', 'net_peerCount', 'net_version', 'eth_protocolVersion', 'eth_gasPrice', 'eth_getTransactionCount', 'stake_reward_clo', 'get_tokens_balance', 'eth_getBlockByNumber', 'soy_farming_soy_clo_pending_rewards', 'soy_farming_soy_cloe_pending_rewards', 'stake_reward_soy', 'soy_farming_soy_btt_pending_rewards', 'soy_cs_pending_rewards', 'clo_sendtx', 'get_tx_by_address_with_filter', 'start_cs_clo', 'withdraw_cs_clo']
|
64
|
+
form_configurable :type, type: :array, values: ['get_balance', 'net_peerCount', 'net_version', 'eth_protocolVersion', 'eth_gasPrice', 'eth_getTransactionCount', 'stake_reward_clo', 'get_tokens_balance', 'eth_getBlockByNumber', 'soy_farming_soy_clo_pending_rewards', 'soy_farming_soy_cloe_pending_rewards', 'stake_reward_soy', 'soy_farming_soy_btt_pending_rewards', 'soy_cs_pending_rewards', 'clo_sendtx', 'get_tx_by_address_with_filter', 'start_cs_clo', 'withdraw_cs_clo', 'get_tx_stats']
|
64
65
|
form_configurable :wallet, type: :string
|
65
66
|
form_configurable :rpc_server, type: :string
|
66
67
|
form_configurable :wallet_password, type: :string
|
@@ -68,9 +69,10 @@ module Agents
|
|
68
69
|
form_configurable :round, type: :string
|
69
70
|
form_configurable :wallet_dest, type: :string
|
70
71
|
form_configurable :filter_for_method_id, type: :string
|
72
|
+
form_configurable :first_block, type: :string
|
71
73
|
form_configurable :last_block, type: :string
|
72
74
|
def validate_options
|
73
|
-
errors.add(:base, "type has invalid value: should be 'get_balance' 'net_peerCount' 'net_version' 'eth_protocolVersion' 'eth_gasPrice' 'eth_getTransactionCount' 'stake_reward_clo' 'get_tokens_balance' 'eth_getBlockByNumber' 'soy_farming_soy_clo_pending_rewards' 'soy_farming_soy_cloe_pending_rewards' 'stake_reward_soy' 'soy_farming_soy_btt_pending_rewards' 'soy_cs_pending_rewards' 'clo_sendtx' 'get_tx_by_address_with_filter' 'start_cs_clo' 'withdraw_cs_clo'") if interpolated['type'].present? && !%w(get_balance net_peerCount net_version eth_protocolVersion eth_gasPrice eth_getTransactionCount stake_reward_clo get_tokens_balance eth_getBlockByNumber soy_farming_soy_clo_pending_rewards soy_farming_soy_cloe_pending_rewards stake_reward_soy soy_farming_soy_btt_pending_rewards soy_cs_pending_rewards clo_sendtx get_tx_by_address_with_filter start_cs_clo withdraw_cs_clo).include?(interpolated['type'])
|
75
|
+
errors.add(:base, "type has invalid value: should be 'get_balance' 'net_peerCount' 'net_version' 'eth_protocolVersion' 'eth_gasPrice' 'eth_getTransactionCount' 'stake_reward_clo' 'get_tokens_balance' 'eth_getBlockByNumber' 'soy_farming_soy_clo_pending_rewards' 'soy_farming_soy_cloe_pending_rewards' 'stake_reward_soy' 'soy_farming_soy_btt_pending_rewards' 'soy_cs_pending_rewards' 'clo_sendtx' 'get_tx_by_address_with_filter' 'start_cs_clo' 'withdraw_cs_clo' 'get_tx_stats'") if interpolated['type'].present? && !%w(get_balance net_peerCount net_version eth_protocolVersion eth_gasPrice eth_getTransactionCount stake_reward_clo get_tokens_balance eth_getBlockByNumber soy_farming_soy_clo_pending_rewards soy_farming_soy_cloe_pending_rewards stake_reward_soy soy_farming_soy_btt_pending_rewards soy_cs_pending_rewards clo_sendtx get_tx_by_address_with_filter start_cs_clo withdraw_cs_clo get_tx_stats).include?(interpolated['type'])
|
74
76
|
|
75
77
|
unless options['wallet_password'].present? || !['clo_sendtx' 'start_cs_clo' 'withdraw_cs_clo'].include?(options['type'])
|
76
78
|
errors.add(:base, "wallet_password is a required field")
|
@@ -96,7 +98,11 @@ module Agents
|
|
96
98
|
errors.add(:base, "wallet is a required field")
|
97
99
|
end
|
98
100
|
|
99
|
-
unless options['
|
101
|
+
unless options['first_block'].present? || !['get_tx_stats'].include?(options['type'])
|
102
|
+
errors.add(:base, "first_block is a required field")
|
103
|
+
end
|
104
|
+
|
105
|
+
unless options['last_block'].present? || !['get_tx_by_address_with_filter' 'get_tx_stats'].include?(options['type'])
|
100
106
|
errors.add(:base, "last_block is a required field")
|
101
107
|
end
|
102
108
|
|
@@ -198,8 +204,64 @@ module Agents
|
|
198
204
|
|
199
205
|
end
|
200
206
|
|
207
|
+
def percentage(number, total)
|
208
|
+
log number
|
209
|
+
log total
|
210
|
+
(number/total.to_f*100).round(2)
|
211
|
+
end
|
201
212
|
|
202
|
-
def
|
213
|
+
def most_common_from(transactions)
|
214
|
+
seen = {}
|
215
|
+
transactions.each do |tx|
|
216
|
+
seen[tx['from']] = (seen[tx['from']] || 0) + 1
|
217
|
+
end
|
218
|
+
seen.keys.max_by { |k| seen[k] }
|
219
|
+
end
|
220
|
+
|
221
|
+
def counter(list,patterns)
|
222
|
+
total = 0
|
223
|
+
|
224
|
+
list.each do |element|
|
225
|
+
from_value = element["from"].downcase
|
226
|
+
if patterns.include?(from_value)
|
227
|
+
total += 1
|
228
|
+
end
|
229
|
+
end
|
230
|
+
return total
|
231
|
+
end
|
232
|
+
|
233
|
+
def get_tx_stats()
|
234
|
+
all_miners = ['0xf34eaf6e2cf4744b5e29734295135c4213d59149', '0xed15b7b7b5dc81daae277a081b47a04c3a8bea1b' ,'0xd125b3b146d21d058edac7a5b5f7481a571e4c46', '0xe683de43ccfbef16424ecb577f288cf343dfbc5a', '0x0073cf1b9230cf3ee8cab1971b8dbef21ea7b595', '0x40b67778d97a7d15a519d907ed991948e8ea486c', '0x8845ee5cae61b807678415bb8a68773df9d48f8e', '0x52f0458c70af5cdeb555cad800add5f82c3e59f7', '0xd06bb917c099acf24d43552b5aa760aeef7cd4aa', '0xf35074bbd0a9aee46f4ea137971feec024ab704e', '0xd144e30a0571aaf0d0c050070ac435deba461fab', '0x8057c50c6d72f4399862fefbc8d3b8a8757cde57', '0xfbf679d6ed0cb9747e05e7e8ae06e890e6bf2b66', '0x11905bd0863ba579023f662d1935e39d0c671933', '0xe4f3cab1f11d5a917ac73c80927e64ee4b1a445a', '0xae83a3e136e6714e6c1e5483950936d7872fb999', '0x39ec1c88a7a7c1a575e8c8f42eff7630d9278179', '0xd6d27255eaef8c3fcb5433acb5494bf04cb5f2c3', '0x004730417cd2b1d19f6be2679906ded4fa8a64e2', '0x89308111f17a395b82f1e5a2824bd01fd13a53b5', '0x800f25eb68a06ff9671605bd450c29e80f593e0a', '0xa5d9018f6c99ec3230633c1187c5cb607c704ed8', '0xfe59743b65f2afec200ce279a289cb4a43eb7eeb', '0x811bad1a4041a9f6ed8fc2f4e9d421dc82626f81', '0xbd12b4511ec9fd1cf481d5643f307252ae6f55e2', '0x5f7661e493d4f1a318c02e9383568597e8a09b5a', '0xe0bac765ca88706a12e4f5a9c0e92dc823fe6293', '0x40c48b386e15981df5a10552cb97ee6d232c8547', '0x458ddc6a7e924554756f95715a53bf948560ee38', '0x3c6b9edb1f8ec6c85436b7cb384eb607489c732f', '0x2a1efdf9f09869a82e5e6b0f3736aabcb5381206', '0xf30a30315d5214e490458d0511595e42b3d917d0', '0x8c2fdc530815eb4267c8b12f10adafc4ca73484a', '0x254b0e1dee486908345e608da64afe35caa02a1c']
|
235
|
+
shitty_wallets = ['0x7971d8defa89bf68ff4142b2bb1e1e3866927b36', '0x33344541086c709fe585caeabc83e5947e783333', '0xcbb8aaf930497c7bd0de6b19903410698e8adab4', '0xc352d245f25fec51ff15c77fc5bf767bf655276a', '0x9daa24510951bc0ac5d1e4f89de5efd89cc8e0b0', '0x941dab361e6d3f0b310f78c2c9eb6779608de0c3', '0x8877e6657f48aee236b47eb1c65be8e7a44f11f8', '0x1a146e329333919542cdb6d2d87de370275124c6', '0xf7d862d42976662d649cc356f4ca3854d595d53d', '0xd125b9d1415b77e0951d5b91dce3ce5d9e4375d0', '0xb94f03ad1b8ddddb82b08cd038b652cbfc47fbb4', '0x8832abcd7248ed2bd740d3eafdeb774ab8332623', '0x6dfb81b6945967e57052e4132a9ca328f8d12f7c', '0x11817fa65a9c2f68fc03bbbc9f2113d59b96908b']
|
236
|
+
internal = true
|
237
|
+
tx_list = []
|
238
|
+
burnt_ether = 0
|
239
|
+
(interpolated['first_block']..interpolated['last_block']).each do |i|
|
240
|
+
transactions = get_data(i.to_i,internal)
|
241
|
+
gas_used = transactions['result']['gasUsed'].to_i(16)
|
242
|
+
transactions['result']['transactions'].each do |tx|
|
243
|
+
if !tx.empty?
|
244
|
+
gas_price = tx['gasPrice'].to_i(16)
|
245
|
+
fees = gas_price * gas_used.to_f / 10**18
|
246
|
+
tx_list << tx
|
247
|
+
end
|
248
|
+
burnt_ether += fees
|
249
|
+
end
|
250
|
+
end
|
251
|
+
top_tx = most_common_from(tx_list)
|
252
|
+
top_count = tx_list.count { |hash| hash['from'] == top_tx }
|
253
|
+
miners_count = tx_list.select { |hash| all_miners.include?(hash['from']) }
|
254
|
+
log "miners_count #{miners_count.count}"
|
255
|
+
shitty_count = tx_list.select { |hash| shitty_wallets.include?(hash['from']) }
|
256
|
+
log "shitty_count #{shitty_count.count}"
|
257
|
+
active = tx_list.map { |p| p['from'] }.uniq.count
|
258
|
+
log "top_count : #{top_count}"
|
259
|
+
log "total : #{tx_list.count}"
|
260
|
+
create_event :payload => { 'total_tx' => "#{tx_list.count}", 'total_active' => "#{active}", 'burnt_clo' => "#{burnt_ether}", 'top_wallet': {'address' => "#{top_tx}", 'percentage' => "#{percentage(top_count.to_i,tx_list.count.to_i)}"}, 'shitty': {'address': 'shitty', 'shitty_percentage' => "#{percentage(shitty_count.count,tx_list.count.to_i)}"}, 'miners': {'address': "miners", 'percentage' => "#{percentage(miners_count.count,tx_list.count.to_i)}"}}
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
def get_data(x,internal=false)
|
203
265
|
hexa_block = x.to_s(16)
|
204
266
|
uri = URI.parse("#{interpolated['rpc_server']}")
|
205
267
|
request = Net::HTTP::Post.new(uri)
|
@@ -225,68 +287,72 @@ module Agents
|
|
225
287
|
log_curl_output(response.code,response.body)
|
226
288
|
|
227
289
|
tx = JSON.parse(response.body)
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
tx['result']['transactions'].
|
232
|
-
|
233
|
-
if
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
transaction['to'] =
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
290
|
+
if internal == false
|
291
|
+
timestamp = tx['result']['timestamp'].to_i(16)
|
292
|
+
power = (10 ** 18).to_i
|
293
|
+
if !tx['result']['transactions'].empty?
|
294
|
+
tx['result']['transactions'].each do |transaction|
|
295
|
+
if ( !transaction['from'].nil? && interpolated['wallet'].upcase.include?(transaction['from'].upcase) ) || ( !transaction['to'].nil? && interpolated['wallet_dest'].upcase.include?(transaction['to'].upcase) )
|
296
|
+
if interpolated['filter_for_method_id'].empty? || interpolated['filter_for_method_id'].include?(transaction['input'][0, 10])
|
297
|
+
transaction['blockNumber'] = transaction['blockNumber'].to_i(16)
|
298
|
+
transaction['timestamp'] = timestamp
|
299
|
+
receipt_data = get_tx_receipt(transaction['hash'])
|
300
|
+
transaction['status'] = receipt_data['result']['status']
|
301
|
+
# transaction['input_converted_utf8'] = [transaction['input']].pack("H*")
|
302
|
+
case transaction['input'][0, 10]
|
303
|
+
when "0xb88a802f"
|
304
|
+
transaction['call_type'] = 'claimReward'
|
305
|
+
transaction['symbol'] = find_symbol(transaction['to'])
|
306
|
+
when "0xe80233c6"
|
307
|
+
transaction['call_type'] = 'activateNode'
|
308
|
+
when "0x65814455"
|
309
|
+
transaction['call_type'] = 'deactivateNode'
|
310
|
+
when "0xb199892a"
|
311
|
+
transaction['call_type'] = 'addNode'
|
312
|
+
when "0xcdfdb7dc"
|
313
|
+
transaction['call_type'] = 'setRatios'
|
314
|
+
when "0x01026099"
|
315
|
+
transaction['call_type'] = 'addTokens'
|
316
|
+
when "0xb2b99ec9"
|
317
|
+
transaction['call_type'] = 'removeNode'
|
318
|
+
when "0x095ea7b3"
|
319
|
+
transaction['call_type'] = 'approve'
|
320
|
+
when "0xf2fde38b"
|
321
|
+
transaction['call_type'] = 'transferOwnership'
|
322
|
+
when "0x38ed1739"
|
323
|
+
transaction['call_type'] = 'swapExactTokensForTokens'
|
324
|
+
when "0x2e9b3dc3"
|
325
|
+
transaction['call_type'] = 'swapExactCLOForTokens'
|
326
|
+
when "0xa6e83852"
|
327
|
+
transaction['call_type'] = 'swapTokensForExactCLO'
|
328
|
+
when "0x487cda0d"
|
329
|
+
transaction['call_type'] = 'depositTokens'
|
330
|
+
when "0x8803dbee"
|
331
|
+
transaction['call_type'] = 'swapTokensForExactTokens'
|
332
|
+
when "0xa9059cbb"
|
333
|
+
transaction['call_type'] = 'TokenTransfer'
|
334
|
+
transaction['symbol'] = find_symbol(transaction['to'])
|
335
|
+
# transaction['to'] = transaction['input'][10, 64]
|
336
|
+
transaction['to'] = "0x#{transaction['input'][34, 40]}"
|
337
|
+
transaction['value'] = "#{transaction['input'][74, 64].to_i(16) / power.to_i.to_f}"
|
338
|
+
when "0x"
|
339
|
+
transaction['call_type'] = 'Transfer'
|
340
|
+
transaction['symbol'] = "CLO"
|
341
|
+
transaction['value'] = "#{transaction['value'].to_i(16) / power.to_i.to_f}"
|
342
|
+
when "0xa2e62045"
|
343
|
+
transaction['call_type'] = 'update'
|
344
|
+
when "0x40c10f19"
|
345
|
+
transaction['call_type'] = 'mint'
|
346
|
+
else
|
347
|
+
transaction['call_type'] = 'unknown'
|
348
|
+
end
|
349
|
+
create_event payload: transaction
|
285
350
|
end
|
286
|
-
create_event payload: transaction
|
287
351
|
end
|
288
352
|
end
|
289
353
|
end
|
354
|
+
else
|
355
|
+
return tx
|
290
356
|
end
|
291
357
|
end
|
292
358
|
|
@@ -1384,6 +1450,8 @@ module Agents
|
|
1384
1450
|
withdraw_cs_clo()
|
1385
1451
|
when "get_tx_by_address_with_filter"
|
1386
1452
|
get_tx_by_address_with_filter()
|
1453
|
+
when "get_tx_stats"
|
1454
|
+
get_tx_stats()
|
1387
1455
|
else
|
1388
1456
|
log "Error: type has an invalid value (#{type})"
|
1389
1457
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: huginn_callisto_network_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nicolas Germain
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|