Merge branch 'master' of github.com:jacqueswww/vyper-debug
This commit is contained in:
commit
7c8b646c35
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3.6
|
#!/usr/bin/env python3.6
|
||||||
import argparse
|
import argparse
|
||||||
import vyper
|
import vyper
|
||||||
|
from collections import Counter
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
from vyper import compiler
|
from vyper import compiler
|
||||||
from vyper.parser import (
|
from vyper.parser import (
|
||||||
|
@ -78,6 +78,44 @@ def get_contract(w3, source_code, *args, **kwargs):
|
||||||
return contract
|
return contract
|
||||||
|
|
||||||
|
|
||||||
|
def get_func_abi(abi, func_name, args):
|
||||||
|
# next(filter(lambda func: func["name"] == func_name, abi))
|
||||||
|
def guess_type(v):
|
||||||
|
# is annotated type.
|
||||||
|
if ':' in v:
|
||||||
|
return v.split(':')[1]
|
||||||
|
# otherwise just guess
|
||||||
|
try:
|
||||||
|
int(v)
|
||||||
|
return 'int128'
|
||||||
|
except ValueError:
|
||||||
|
return 'bytes'
|
||||||
|
|
||||||
|
func_name_count_map = dict(Counter([a['name'] for a in abi]))
|
||||||
|
for candidate_func_abi in abi:
|
||||||
|
if candidate_func_abi["type"] == "function":
|
||||||
|
# try func name first.
|
||||||
|
if candidate_func_abi["name"] == func_name and \
|
||||||
|
func_name_count_map[candidate_func_abi['name']] == 1:
|
||||||
|
if len(args) != candidate_func_abi['inputs']:
|
||||||
|
print('Incorrect arguments for {}'.format(func_name))
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
return candidate_func_abi
|
||||||
|
# is overloaded function, use full signature.
|
||||||
|
else:
|
||||||
|
full_sig = "{func_name}({type_str})".format(
|
||||||
|
func_name=func_name,
|
||||||
|
type_str=','.join([guess_type(x) for x in args])
|
||||||
|
)
|
||||||
|
method = "{func_name}({type_str})".format(
|
||||||
|
func_name=candidate_func_abi['name'],
|
||||||
|
type_str=','.join([x['type'] for x in candidate_func_abi['inputs']])
|
||||||
|
)
|
||||||
|
if method == full_sig:
|
||||||
|
return candidate_func_abi
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
|
|
||||||
with open(args.input_file) as fh:
|
with open(args.input_file) as fh:
|
||||||
|
@ -118,17 +156,18 @@ if __name__ == '__main__':
|
||||||
continue
|
continue
|
||||||
|
|
||||||
print('\n* Calling {}({})'.format(func_name, ','.join(args)))
|
print('\n* Calling {}({})'.format(func_name, ','.join(args)))
|
||||||
func_abi = next(filter(lambda func: func["name"] == func_name, abi))
|
|
||||||
if len(args) != len(func_abi['inputs']):
|
func_abi = get_func_abi(abi, func_name, args)
|
||||||
print('Argument mismatch, please provide correct arguments.')
|
if not func_abi:
|
||||||
|
print('Did not find function in abi.')
|
||||||
break
|
break
|
||||||
|
|
||||||
cast_args = cast_types(args, func_abi)
|
cast_args = cast_types(args, func_abi)
|
||||||
res = getattr(contract.functions, func_name)(*cast_args).call({'gas': func_abi['gas'] + 22000})
|
res = getattr(contract.functions, func_name)(*cast_args).call({'gas': func_abi.get('gas', 0) + 50000})
|
||||||
|
|
||||||
source_map = produce_source_map(code)
|
source_map = produce_source_map(code)
|
||||||
set_evm_opcode_debugger(source_code=code, source_map=source_map)
|
set_evm_opcode_debugger(source_code=code, source_map=source_map)
|
||||||
tx_hash = getattr(contract.functions, func_name)(*cast_args).transact({'gas': func_abi['gas'] + 22000})
|
tx_hash = getattr(contract.functions, func_name)(*cast_args).transact({'gas': func_abi.get('gas', 0) + 50000})
|
||||||
set_evm_opcode_pass()
|
set_evm_opcode_pass()
|
||||||
|
|
||||||
print('- Returns:')
|
print('- Returns:')
|
||||||
|
|
Loading…
Reference in New Issue