cic-monitor/ge_render/__init__.py

137 lines
3.7 KiB
Python
Raw Normal View History

2022-01-30 21:07:37 +01:00
# standard imports
import logging
import os
2022-01-30 21:07:37 +01:00
# external imports
from eth_accounts_index import AccountsIndex
from erc20_faucet import Faucet
from cic_contracts.erc20 import ERC20
2022-01-30 21:07:37 +01:00
from chainlib.eth.error import RequestMismatchException
from chainlib.eth.address import AddressChecksum
from chainlib.eth.constant import ZERO_ADDRESS
from hexathon import uniform, add_0x
2022-01-30 21:07:37 +01:00
logg = logging.getLogger(__name__)
faucet_token_cache = {}
token_cache = {}
2022-01-30 21:07:37 +01:00
def get_method(chain_str, tx):
data = tx.payload
s = None
if len(data) < 8:
raise ValueError('not minimum signature length')
data = uniform(data[:8])
2022-01-30 21:07:37 +01:00
chainmap = addrmap.get(chain_str)
if chainmap != None:
contractmap = chainmap.get(uniform(tx.inputs[0]))
if contractmap != None:
m = contractmap.get(data)
if m != None:
return m
chainmap = sigmap.get(chain_str)
if chainmap != None:
return chainmap.get(data)
def apply(c, s, chain_spec, conn, block, tx, db_session=None):
2022-01-30 21:07:37 +01:00
try:
m = get_method(str(chain_spec), tx)
2022-01-30 21:07:37 +01:00
except ValueError as e:
return s
if m == None:
return s
r = m(c, s, chain_spec, conn, block, tx)
if r != None:
s = r
return s
2022-01-30 21:07:37 +01:00
def account_registry_add(c, s, chain_spec, conn, block, tx):
2022-01-30 21:07:37 +01:00
try:
o = AccountsIndex.parse_add_request(tx.payload)
s = '{} block {} tx {} account registration for {}'.format(c, block.number, tx.index, o[0])
return s
except RequestMismatchException as e:
pass
return None
def ge_faucet_gift(i, s, chain_spec, conn, block, tx):
c = Faucet(chain_spec)
o = c.token_amount(tx.inputs[0], sender_address=ZERO_ADDRESS, height=block.number)
r = conn.do(o)
v = c.parse_token_amount(r)
logg.info('retrieved token amount {} at block height {} for faucet {}'.format(v, block.number, tx.inputs[0]))
token = faucet_token_cache.get(tx.inputs[0])
if token == None:
o = c.token(tx.inputs[0], sender_address=ZERO_ADDRESS)
r = conn.do(o)
token = c.parse_token(r)
token = uniform(token)
faucet_token_cache[tx.inputs[0]] = token
logg.info('found token {} for faucet {}'.format(v, token, tx.inputs[0]))
token_symbol = token_cache.get(token)
if token_symbol == None:
c = ERC20(chain_spec)
o = c.symbol(token, sender_address=ZERO_ADDRESS)
r = conn.do(o)
token_symbol = c.parse_symbol(r)
token_cache[token] = token_symbol
logg.info('resolved token {} to symbol'.format(v, block.number, tx.inputs[0]))
try:
o = Faucet.parse_give_to_request(tx.payload)
s = '{} GE faucet was triggered for {} {} by {} on block {} tx {}'.format(i, v, token_symbol, o[0], block.number, tx.index)
return s
2022-01-30 21:07:37 +01:00
except RequestMismatchException as e:
pass
return None
2022-01-30 21:07:37 +01:00
def erc20_transfer(c, s, chain_spec, conn, block, tx):
t = ERC20(chain_spec)
try:
transfer_data = t.parse_transfer_request(tx.payload)
token_sender = tx.outputs[0]
token_recipient = transfer_data[0]
token_value = transfer_data[1]
return '{} GFT {} sent from {} to {}'.format(c, token_value ,add_0x(token_sender), add_0x(token_recipient))
except RequestMismatchException as e:
pass
return None
2022-01-30 21:07:37 +01:00
sigmap = {
'evm:byzantium:8996:bloxberg': {
'0a3b0a4f': account_registry_add,
},
}
addrmap = {
'evm:byzantium:8996:bloxberg': {
'd462aadb7251d418e6a9e4f205928f678e1c6b3b': {
'63e4bff4': ge_faucet_gift,
},
'32e860c2a0645d1b7b005273696905f5d6dc5d05': {
'a9059cbb': erc20_transfer,
},
},
}