def are_valid_swaps(swaps): if not all(is_successful_swap(s) for s in swaps): return False if args.buys and any(s['metadata']['side'] != 'buy' for s in swaps): return False if args.sells and any(s['metadata']['side'] != 'sell' for s in swaps): return False tokens = args.tokens.split(',') if len(args.tokens) else [] if len(tokens) > 0 and any(\ s['metadata']['makerToken'] not in tokens or \ s['metadata']['takerToken'] not in tokens \ for s in swaps): return False return True
help='include protocol fees') args.add_argument('--no-native', action='store_true', help='exclude native orders') return args.parse_args() args = get_program_args() data = load_ab_data(args.path) tokens = args.tokens.split(',') if args.tokens else None print(f'Loaded {len(data)} data items') costs_by_url_by_value = {} urls = sorted(set(list(itertools.chain(*(d.keys() for d in data))))) for d in data: if not all(is_successful_swap(swap) for swap in d.values()): continue costs = {} for url, swap in d.items(): metadata = swap['metadata'] if tokens: if metadata['makerToken'] not in tokens \ or metadata['takerToken'] not in tokens: continue if args.no_native: if any(s['name'] == '0x' for s in swap['sources']): continue if args.forwarder: if metadata['takerToken'] != 'ETH': continue fees = 0
args.add_argument('path', type=str) args.add_argument('--url', type=str) return args.parse_args() def get_slippage(swap_data): price = max( Decimal(o['makerAssetAmount']) / Decimal(o['takerAssetAmount']) for o in swap_data['orders']) filled_price = Decimal(swap_data['metadata']['swapResult']['boughtAmount']) / \ Decimal(swap_data['metadata']['swapResult']['soldAmount']) return (filled_price - price) / price args = get_program_args() data = [d for d in load_data(args.path, args.url) if is_successful_swap(d)] print(f'Loaded {len(data)} data items') sources = sorted( set( itertools.chain( *[ i for i in [[s['name'] for s in d['sources'] if s['name'] != '0x'] for d in data] ], ))) print(f'Found {len(sources)} sources') data_by_source = { s: [ d for d in data
swap_by_pair = { p: [ d for d in data if get_pair(d) == p ] for p in pairs } sns.catplot( x='pair', y='revert rate', hue='delay', data=pd.DataFrame([ [ pair, min_delay, sum(1 for s in swap_by_pair[pair] if not is_successful_swap(s) and s['metadata']['fillDelay'] >= min_delay and s['metadata']['fillDelay'] < max_delay ) / max(1, sum(1 for s in swap_by_pair[pair] if s['metadata']['fillDelay'] >= min_delay and s['metadata']['fillDelay'] < max_delay )), ] for pair, (min_delay, max_delay) in itertools.product(pairs, DELAYS) ], columns=['pair', 'delay', 'revert rate'], ), kind='bar', legend_out=False, legend=True, )
sns.set(color_codes=True) sns.set_palette('muted') def get_program_args(): args = argparse.ArgumentParser() args.add_argument('path', type=str) args.add_argument('--url', type=str) return args.parse_args() args = get_program_args() data = [ d for d in load_data(args.path, args.url) if len(d['sources']) == 1 and is_successful_swap(d) ] print(f'Loaded {len(data)} data items') sources = sorted(set(d['sources'][0]['name'] for d in data)) sns.catplot( x='source', y='gas used', hue='swap value', data=pd.DataFrame( [[ d['sources'][0]['name'], d['metadata']['swapResult']['gasUsed'], get_max_value(d) ] for d in data], columns=['source', 'gas used', 'swap value'], ),