Skip to content

Instantly share code, notes, and snippets.

@rakanalh
Created November 7, 2018 14:35
Show Gist options
  • Save rakanalh/6a85ce5f9dd9913856ed1b642ec91fac to your computer and use it in GitHub Desktop.
Save rakanalh/6a85ce5f9dd9913856ed1b642ec91fac to your computer and use it in GitHub Desktop.
Negative balance
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