Created
November 7, 2018 14:35
-
-
Save rakanalh/6a85ce5f9dd9913856ed1b642ec91fac to your computer and use it in GitHub Desktop.
Negative balance
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from eth_utils import to_canonical_address | |
from raiden.storage import serialize, sqlite | |
from raiden.storage.wal import WriteAheadLog | |
from raiden.transfer import channel, node, views | |
from raiden.transfer.architecture import StateManager | |
serializer = serialize.JSONSerializer() | |
def replay_wal(storage): | |
all_state_changes = storage.get_statechanges_by_identifier( | |
from_identifier=0, | |
to_identifier='latest', | |
) | |
state_manager = StateManager(state_transition=node.state_transition, current_state=None) | |
wal = WriteAheadLog(state_manager, storage) | |
payment_network_identifier = '0xB9633dd9a9a71F22C933bF121d7a22008f66B908' | |
token_address = '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2' | |
partner_address = '0xf9ED3cCa3e56A7B72049e6e830C39fd842A2F8e6' | |
for _, state_change in enumerate(all_state_changes): | |
state = wal.state_manager.current_state | |
snap = serializer.serialize(state) | |
restored = serializer.deserialize(snap) | |
state_manager = StateManager(node.state_transition, restored) | |
wal = WriteAheadLog(state_manager, storage) | |
wal.state_manager.dispatch(state_change) | |
if state_manager.current_state is not None: | |
chain_state = wal.state_manager.current_state | |
channel_state = views.get_channelstate_for( | |
chain_state, | |
to_canonical_address(payment_network_identifier), | |
to_canonical_address(token_address), | |
to_canonical_address(partner_address), | |
) | |
if not channel_state: | |
continue | |
# import pdb; pdb.set_trace() | |
if channel.get_balance(channel_state.our_state, channel_state.partner_state) < 0: | |
print(channel_state) | |
import pdb; pdb.set_trace() | |
break | |
if channel.get_balance(channel_state.partner_state, channel_state.our_state) < 0: | |
print(channel_state) | |
import pdb; pdb.set_trace() | |
break | |
def main(): | |
import argparse | |
parser = argparse.ArgumentParser() | |
parser.add_argument('database') | |
args = parser.parse_args() | |
replay_wal( | |
storage=sqlite.SQLiteStorage(args.database, serialize.JSONSerializer()), | |
) | |
if __name__ == '__main__': | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment