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
Example #4
0
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,
)
Example #5
0
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'],
    ),