Source code for microraiden.make_helpers
"""Helper functions to make initialization of the components simpler
Example::
proxy = make_paywalled_proxy(receiver_privkey, '/tmp/proxy.db')
"""
import sys
import logging
from web3 import Web3, HTTPProvider
from web3.contract import Contract
from eth_utils import to_checksum_address
from microraiden.channel_manager import ChannelManager
from microraiden.exceptions import (
StateReceiverAddrMismatch,
StateContractAddrMismatch
)
from microraiden import constants
from microraiden.config import NETWORK_CFG
from microraiden.proxy.paywalled_proxy import PaywalledProxy
log = logging.getLogger(__name__)
[docs]def make_channel_manager_contract(web3: Web3, channel_manager_address: str) -> Contract:
"""
Args:
web3 (Web3): web3 provider
channel_manager_address (str): channel manager contract to use
Returns:
Contract: contract wrapper class
"""
channel_manager_address = to_checksum_address(channel_manager_address)
return web3.eth.contract(
abi=constants.CONTRACT_METADATA[constants.CHANNEL_MANAGER_ABI_NAME]['abi'],
address=channel_manager_address
)
[docs]def make_channel_manager(
private_key: str,
channel_manager_address: str,
state_filename: str,
web3: Web3
) -> ChannelManager:
"""
Args:
private_key (str): receiver's private key
channel_manager_address (str): channel manager contract to use
state_filename (str): path to the channel manager state database
web3 (Web3): web3 provider
Returns:
ChannelManager: intialized and synced channel manager
"""
channel_manager_address = to_checksum_address(channel_manager_address)
channel_manager_contract = make_channel_manager_contract(web3, channel_manager_address)
token_address = channel_manager_contract.call().token()
token_abi = constants.CONTRACT_METADATA[constants.TOKEN_ABI_NAME]['abi']
token_contract = web3.eth.contract(abi=token_abi, address=token_address)
try:
return ChannelManager(
web3,
channel_manager_contract,
token_contract,
private_key,
state_filename=state_filename
)
except StateReceiverAddrMismatch as e:
log.error(
'Receiver address does not match address stored in a saved state. '
'Use a different file, or backup and remove %s. (%s)' %
(state_filename, e)
)
sys.exit(1)
except StateContractAddrMismatch as e:
log.error(
'Channel contract address mismatch. '
'Saved state file is %s. Backup it, remove, then start proxy again (%s)' %
(state_filename, e)
)
sys.exit(1)
[docs]def make_paywalled_proxy(
private_key: str,
state_filename: str,
contract_address=None,
flask_app=None,
web3=None
) -> PaywalledProxy:
"""
Args:
private_key (str): receiver's private key
state_filename (str): path to the state DB.
If database doesn't exist, it'll be created and initialized.
contract_address (str, optional): address of the channel manager contract.
flask_app (optional): make proxy use this flask app
web3 (Web3, optional): do not create a new web3 provider, but use this param instead
Returns:
PaywalledProxy: an initialized proxy.
Do not forget to call `run()` to start serving requests.
"""
if web3 is None:
web3 = Web3(HTTPProvider(constants.WEB3_PROVIDER_DEFAULT, request_kwargs={'timeout': 60}))
contract_address = contract_address or NETWORK_CFG.CHANNEL_MANAGER_ADDRESS
channel_manager = make_channel_manager(private_key, contract_address, state_filename, web3)
return PaywalledProxy(channel_manager, flask_app, constants.HTML_DIR, constants.JSLIB_DIR)