Make accomodations for geth managed wallets (#1117) in TransactingPower.

pull/1092/head
Kieran Prasch 2019-07-11 13:13:03 -07:00
parent be4661ec1f
commit 118262a9f4
No known key found for this signature in database
GPG Key ID: 199AB839D4125A62
20 changed files with 179 additions and 131 deletions

View File

@ -26,7 +26,6 @@ import maya
from constant_sorrow.constants import (
CONTRACT_NOT_DEPLOYED,
NO_DEPLOYER_ADDRESS,
NO_STAKING_DEVICE,
WORKER_NOT_RUNNING
)
from eth_tester.exceptions import TransactionFailed
@ -141,7 +140,6 @@ class Deployer(NucypherTokenActor):
def __init__(self,
blockchain: BlockchainInterface,
deployer_address: str = None,
device = NO_STAKING_DEVICE,
client_password: str = None,
bare: bool = True
) -> None:
@ -162,8 +160,7 @@ class Deployer(NucypherTokenActor):
blockchain.transacting_power = TransactingPower(blockchain=blockchain,
account=deployer_address,
password=client_password,
device=device)
password=client_password)
blockchain.transacting_power.activate()
self.log = Logger("Deployment-Actor")

View File

@ -80,6 +80,7 @@ class Character(Learner):
keyring_root: str = None,
crypto_power: CryptoPower = None,
crypto_power_ups: List[CryptoPowerUp] = None,
additional_powers: List[CryptoPower] = None,
*args, **kwargs
) -> None:

View File

@ -28,8 +28,7 @@ import requests
from bytestring_splitter import BytestringKwargifier, BytestringSplittingError
from bytestring_splitter import BytestringSplitter, VariableLengthBytestring
from constant_sorrow import constants
from constant_sorrow.constants import INCLUDED_IN_BYTESTRING, PUBLIC_ONLY, FEDERATED_POLICY, STRANGER_ALICE, \
NO_STAKING_DEVICE
from constant_sorrow.constants import INCLUDED_IN_BYTESTRING, PUBLIC_ONLY, FEDERATED_POLICY, STRANGER_ALICE
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurve
from cryptography.hazmat.primitives.serialization import Encoding
@ -90,7 +89,6 @@ class Alice(Character, PolicyAuthor):
network_middleware=None,
controller=True,
policy_agent=None,
device = NO_STAKING_DEVICE,
client_password: str = None,
*args, **kwargs) -> None:
@ -122,9 +120,9 @@ class Alice(Character, PolicyAuthor):
if is_me and not federated_only: # TODO: #289
transacting_power = TransactingPower(account=self.checksum_address,
device=device,
password=client_password,
blockchain=self.blockchain)
self._crypto_power.consume_power_up(transacting_power, password=client_password)
self._crypto_power.consume_power_up(transacting_power)
PolicyAuthor.__init__(self,
blockchain=self.blockchain,
@ -844,8 +842,6 @@ class Ursula(Teacher, Character, Worker):
checksum_address: str = None, # Staker address
worker_address: str = None,
stake_tracker: StakeTracker = None,
staking_agent: StakingEscrowAgent = None,
device = NO_STAKING_DEVICE,
client_password: str = None,
# Character
@ -895,8 +891,10 @@ class Ursula(Teacher, Character, Worker):
if not federated_only:
# Access staking node via node's transacting keys
transacting_power = TransactingPower(account=worker_address, device=device, blockchain=self.blockchain)
self._crypto_power.consume_power_up(transacting_power, client_password)
transacting_power = TransactingPower(account=worker_address,
password=client_password,
blockchain=self.blockchain)
self._crypto_power.consume_power_up(transacting_power)
# Use blockchain power to substantiate stamp
self.substantiate_stamp(client_password=password)

View File

@ -1,12 +1,15 @@
import click
from constant_sorrow.constants import NO_BLOCKCHAIN_CONNECTION
from nucypher.blockchain.eth.interfaces import BlockchainInterface
from nucypher.blockchain.eth.registry import EthereumContractRegistry
from nucypher.characters.banners import ALICE_BANNER
from nucypher.cli import actions, painting, types
from nucypher.cli.actions import get_password
from nucypher.cli.config import nucypher_click_config
from nucypher.cli.types import NETWORK_PORT, EXISTING_READABLE_FILE, EIP55_CHECKSUM_ADDRESS
from nucypher.config.characters import AliceConfiguration
from nucypher.crypto.powers import TransactingPower
@click.command()
@ -24,6 +27,7 @@ from nucypher.config.characters import AliceConfiguration
@click.option('--config-file', help="Path to configuration file", type=EXISTING_READABLE_FILE)
@click.option('--provider-uri', help="Blockchain provider's URI", type=click.STRING)
@click.option('--sync/--no-sync', default=True)
@click.option('--device/--no-device', default=False)
@click.option('--geth', '-G', help="Run using the built-in geth node", is_flag=True)
@click.option('--poa', help="Inject POA middleware", is_flag=True, default=None)
@click.option('--no-registry', help="Skip importing the default contract registry", is_flag=True)
@ -68,6 +72,7 @@ def alice(click_config,
poa,
no_registry,
registry_filepath,
device,
# Alice
bob_encrypting_key,
@ -79,7 +84,7 @@ def alice(click_config,
rate,
duration,
expiration,
message_kit
message_kit,
):

View File

@ -11,6 +11,7 @@ from nucypher.cli.config import nucypher_click_config
from nucypher.cli.types import NETWORK_PORT, EXISTING_READABLE_FILE, EIP55_CHECKSUM_ADDRESS
from nucypher.config.characters import FelixConfiguration
from nucypher.config.constants import DEFAULT_CONFIG_ROOT
from nucypher.crypto.powers import TransactingPower
@click.command()
@ -118,6 +119,11 @@ def felix(click_config,
f"Check the filepath or run 'nucypher felix init' to create a new system configuration.")
raise click.Abort
transacting_power = TransactingPower(account=felix_config.checksum_address,
device=False,
password=get_password(confirm=False),
blockchain=felix_config.blockchain)
try:
# Connect to Blockchain
@ -134,7 +140,9 @@ def felix(click_config,
network_middleware=click_config.middleware)
# Produce Felix
FELIX = felix_config.produce(domains=network, known_nodes=teacher_nodes)
FELIX = felix_config.produce(domains=network,
known_nodes=teacher_nodes,
additional_power=[transacting_power])
FELIX.make_web_app() # attach web application, but dont start service
except Exception as e:

View File

@ -18,16 +18,13 @@ along with nucypher. If not, see <https://www.gnu.org/licenses/>.
import click
import socket
from constant_sorrow.constants import NO_BLOCKCHAIN_CONNECTION
from twisted.internet import stdio
from nucypher.blockchain.eth.clients import NuCypherGethDevnetProcess, NuCypherGethGoerliProcess
from nucypher.blockchain.eth.token import NU
from nucypher.characters.banners import URSULA_BANNER
from nucypher.cli import actions, painting
from nucypher.cli.actions import UnknownIPAddress, get_password
from nucypher.cli.actions import get_password
from nucypher.cli.config import nucypher_click_config
from nucypher.cli.processes import UrsulaCommandProtocol
from nucypher.cli.types import (
@ -36,8 +33,7 @@ from nucypher.cli.types import (
EXISTING_READABLE_FILE,
STAKE_DURATION,
STAKE_EXTENSION,
STAKE_VALUE,
IPV4_ADDRESS)
STAKE_VALUE)
from nucypher.config.characters import UrsulaConfiguration
from nucypher.utilities.sandbox.constants import (
TEMPORARY_DOMAIN,
@ -66,6 +62,7 @@ from nucypher.utilities.sandbox.constants import (
@click.option('--config-file', help="Path to configuration file", type=EXISTING_READABLE_FILE)
@click.option('--poa', help="Inject POA middleware", is_flag=True, default=None)
@click.option('--sync/--no-sync', default=True)
@click.option('--device/--no-device', default=False)
@click.option('--geth', '-G', help="Run using the built-in geth node", is_flag=True)
@click.option('--provider-uri', help="Blockchain provider's URI", type=click.STRING)
@click.option('--no-registry', help="Skip importing the default contract registry", is_flag=True)
@ -105,6 +102,7 @@ def ursula(click_config,
list_,
divide,
sync,
device,
interactive,
) -> None:
@ -244,7 +242,6 @@ def ursula(click_config,
raise click.BadOptionUsage(option_name='--dev', message=message)
return actions.destroy_configuration(character_config=ursula_config, force=force)
#
# Make Ursula
#

View File

@ -19,7 +19,6 @@ import time
import click
import maya
from constant_sorrow.constants import NO_STAKING_DEVICE
from nucypher.blockchain.eth.actors import Deployer
from nucypher.blockchain.eth.agents import NucypherTokenAgent
@ -42,6 +41,7 @@ from nucypher.config.constants import DEFAULT_CONFIG_ROOT
@click.option('--provider-uri', help="Blockchain provider's URI", type=click.STRING)
@click.option('--geth', '-G', help="Run using the built-in geth node", is_flag=True)
@click.option('--sync/--no-sync', default=True)
@click.option('--device/--no-device', default=True)
@click.option('--enode', help="An ethereum bootnode enode address to start learning from", type=click.STRING)
@click.option('--config-root', help="Custom configuration directory", type=click.Path())
@click.option('--contract-name', help="Deploy a single contract by name", type=click.STRING)
@ -70,6 +70,7 @@ def deploy(click_config,
recipient_address,
config_root,
sync,
device,
force):
"""Manage contract and registry deployment"""
@ -100,7 +101,6 @@ def deploy(click_config,
if registry_filepath is not None:
registry = EthereumContractRegistry(registry_filepath=registry_filepath)
# TODO: Move to Deployer with TransactingPower
# Deployment-tuned blockchain connection
blockchain = BlockchainDeployerInterface(provider_uri=provider_uri,
poa=poa,
@ -124,9 +124,12 @@ def deploy(click_config,
if not force:
click.confirm("Selected {} - Continue?".format(deployer_address), abort=True)
password = None
if not device:
password = get_password(confirm=False)
deployer = Deployer(blockchain=blockchain,
device=NO_STAKING_DEVICE,
client_password=get_password(confirm=False),
client_password=password,
deployer_address=deployer_address)
# Verify ETH Balance

View File

@ -19,7 +19,7 @@ along with nucypher. If not, see <https://www.gnu.org/licenses/>.
import inspect
from typing import List, Tuple, Optional
from constant_sorrow.constants import NO_STAKING_DEVICE, NO_BLOCKCHAIN_CONNECTION
from constant_sorrow.constants import NO_BLOCKCHAIN_CONNECTION
from cytoolz.dicttoolz import dissoc
from eth_account._utils.transactions import assert_valid_fields
from hexbytes import HexBytes
@ -116,25 +116,18 @@ class TransactingPower(CryptoPowerUp):
def __init__(self,
blockchain,
account: str,
password: str = None,
device=NO_STAKING_DEVICE):
password: str = None):
"""
Instantiates a TransactingPower for the given checksum_address.
"""
if password and (device is not NO_STAKING_DEVICE):
raise ValueError(f"Cannot create a {self.__class__.__name__} with both a client and an device signer.")
self.blockchain = blockchain
if blockchain.is_connected:
self.client = blockchain.client
else:
self.client = NO_BLOCKCHAIN_CONNECTION
self.account = account
self.device = device
self.__activated = False
self.device = True if not password else False
self.__password = password
self.__unlocked = False
@ -157,30 +150,22 @@ class TransactingPower(CryptoPowerUp):
self.unlock_account(password=password) # Unlock
self.blockchain.transacting_power = self # Attach
self.__password = None # Discard
self.__activated = True # Remember
def lock_account(self):
if self.device is not NO_STAKING_DEVICE:
# TODO: Implement TrustedDevice
_result = self.device.lock()
if self.device:
# TODO: Force Disconnect Devices
pass
else:
_result = self.client.lock_account(address=self.account)
self.__unlocked = False
def unlock_account(self, password: str = None):
if self.device is not NO_STAKING_DEVICE:
# TODO: Embed in TrustedDevice
ping = 'PING|PONG'
pong = self.device.client.ping(ping)
if not ping == pong:
raise self.device.NoDeviceDetected
if self.device:
unlocked = True
else:
if self.client is NO_BLOCKCHAIN_CONNECTION:
raise self.NoBlockchainConnection
unlocked = self.client.unlock_account(address=self.account, password=password)
self.__unlocked = unlocked
def sign_message(self, message: bytes) -> bytes:
@ -189,16 +174,7 @@ class TransactingPower(CryptoPowerUp):
"""
if not self.is_unlocked:
raise self.AccountLocked("Failed to unlock account {}".format(self.account))
# Hardware Wallet
if self.device is not NO_STAKING_DEVICE:
# TODO: Use a common message signature type from clients and devices
signature = self.device.sign_message(checksum_address=self.account, message=message)
signature = signature.signature
# Software Wallet
else:
signature = self.client.sign_message(account=self.account, message=message)
signature = self.client.sign_message(account=self.account, message=message)
return signature
def sign_transaction(self, unsigned_transaction: dict) -> HexBytes:
@ -219,15 +195,8 @@ class TransactingPower(CryptoPowerUp):
except TypeError as e:
raise self.InvalidSigningRequest(f"Invalid Transaction: '{str(e)}'")
# HW Signer
if self.device is not NO_STAKING_DEVICE:
# TODO: Use a common tx_sign return type from clients and devices
signed_raw_transaction = self.device.sign_eth_transaction(unsigned_transaction=unsigned_transaction,
checksum_address=self.account)
# Web3 Signer
else:
signed_raw_transaction = self.blockchain.client.sign_transaction(transaction=unsigned_transaction,
account=self.account)
signed_raw_transaction = self.blockchain.client.sign_transaction(transaction=unsigned_transaction,
account=self.account)
return signed_raw_transaction

View File

@ -213,8 +213,10 @@ class TesterBlockchain(BlockchainDeployerInterface):
"""For use with metric testing scripts"""
testerchain = cls(compiler=SolidityCompiler())
power = TransactingPower(blockchain=testerchain, account=testerchain.etherbase_account)
power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.etherbase_account)
power.activate()
testerchain.transacting_power = power
origin = testerchain.client.etherbase

View File

@ -23,11 +23,12 @@ from nucypher.blockchain.eth.interfaces import BlockchainInterface
from nucypher.blockchain.eth.token import StakeTracker
from nucypher.characters.lawful import Ursula
from nucypher.config.characters import UrsulaConfiguration
from nucypher.crypto.powers import TransactingPower
from nucypher.utilities.sandbox.constants import (
MOCK_KNOWN_URSULAS_CACHE,
MOCK_URSULA_STARTING_PORT,
NUMBER_OF_URSULAS_IN_DEVELOPMENT_NETWORK,
MOCK_URSULA_DB_FILEPATH)
MOCK_URSULA_DB_FILEPATH, INSECURE_DEVELOPMENT_PASSWORD)
def make_federated_ursulas(ursula_config: UrsulaConfiguration,

View File

@ -22,12 +22,15 @@ from web3.contract import Contract
from nucypher.blockchain.eth.deployers import DispatcherDeployer
from nucypher.crypto.powers import TransactingPower
from nucypher.utilities.sandbox.constants import INSECURE_DEVELOPMENT_PASSWORD
@pytest.fixture()
def escrow(testerchain):
# Mock Powerup consumption (Deployer)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.etherbase_account)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.etherbase_account)
testerchain.transacting_power.activate()
escrow, _ = testerchain.deploy_contract('StakingEscrowForAdjudicatorMock')
return escrow

View File

@ -48,8 +48,10 @@ def test_rapid_deployment(token_economics):
compiler=compiler)
# TODO: #1092 - TransactingPower
blockchain.transacting_power = TransactingPower(blockchain=blockchain, account=blockchain.etherbase_account)
blockchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
blockchain.transacting_power = TransactingPower(blockchain=blockchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=blockchain.etherbase_account)
blockchain.transacting_power.activate()
deployer_address = blockchain.etherbase_account
deployer = Deployer(blockchain=blockchain, deployer_address=deployer_address)

View File

@ -43,8 +43,10 @@ def test_staker_locking_tokens(testerchain, agency, staker, token_economics):
token_agent, staking_agent, policy_agent = agency
# Mock Powerup consumption (Ursula-Staker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker.checksum_address)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker.checksum_address)
testerchain.transacting_power.activate()
assert NU(token_economics.minimum_allowed_locked, 'NuNit') < staker.token_balance, "Insufficient staker balance"
@ -108,8 +110,10 @@ def test_staker_collects_staking_reward(testerchain, staker, blockchain_ursulas,
assert token_agent.get_balance(staker.checksum_address) == initial_balance
# Mock Powerup consumption (Ursula-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker.checksum_address)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker.checksum_address)
testerchain.transacting_power.activate()
staker.initialize_stake(amount=NU(token_economics.minimum_allowed_locked, 'NuNit'), # Lock the minimum amount of tokens
lock_periods=int(token_economics.minimum_locked_periods)) # ... for the fewest number of periods
@ -134,8 +138,10 @@ def test_staker_collects_staking_reward(testerchain, staker, blockchain_ursulas,
testerchain.time_travel(periods=2)
# Mock Powerup consumption (Ursula-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker.checksum_address)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker.checksum_address)
testerchain.transacting_power.activate()
# Profit!
staker.collect_staking_reward()

View File

@ -59,7 +59,9 @@ def test_adjudicator_slashes(agency,
locked_tokens = token_economics.minimum_allowed_locked * 5
# Mock Powerup consumption (Deployer)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.etherbase_account)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.etherbase_account)
testerchain.transacting_power.activate()
# The staker receives an initial amount of tokens
@ -68,7 +70,9 @@ def test_adjudicator_slashes(agency,
sender_address=testerchain.etherbase_account)
# Mock Powerup consumption (Staker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker_account)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker_account)
testerchain.transacting_power.activate()
# Deposit: The staker deposits tokens in the StakingEscrow contract.
@ -100,7 +104,9 @@ def test_adjudicator_slashes(agency,
bobby_old_balance = bobby.token_balance
# Mock Powerup consumption (Bob)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=bob_account)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=bob_account)
testerchain.transacting_power.activate()
adjudicator_agent.evaluate_cfrag(evidence=evidence, sender_address=bob_account)

View File

@ -51,8 +51,10 @@ def test_create_policy(testerchain, agency, token_economics):
agent = policy_agent
# Mock Powerup consumption
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.alice_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.alice_account)
testerchain.transacting_power.activate()
policy_id = os.urandom(16)
node_addresses = list(staking_agent.sample(quantity=3, duration=1))
@ -113,15 +115,19 @@ def test_calculate_refund(testerchain, agency, policy_meta):
worker = staking_agent.get_worker_from_staker(staker)
# Mock Powerup consumption (Ursula-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=worker)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=worker)
testerchain.transacting_power.activate()
testerchain.time_travel(hours=9)
_receipt = staking_agent.confirm_activity(worker_address=worker)
# Mock Powerup consumption (Alice)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.alice_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.alice_account)
testerchain.transacting_power.activate()
receipt = agent.calculate_refund(policy_id=policy_meta.policy_id, author_address=policy_meta.author)
assert receipt['status'] == 1, "Transaction Rejected"
@ -148,8 +154,10 @@ def test_collect_policy_reward(testerchain, agency, policy_meta, token_economics
worker = staking_agent.get_worker_from_staker(staker)
# Mock Powerup consumption (Ursula-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=worker)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=worker)
testerchain.transacting_power.activate()
old_eth_balance = token_agent.blockchain.client.get_balance(staker)
@ -158,8 +166,10 @@ def test_collect_policy_reward(testerchain, agency, policy_meta, token_economics
testerchain.time_travel(periods=1)
# Mock Powerup consumption (Ursula-Staker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker)
testerchain.transacting_power.activate()
receipt = agent.collect_policy_reward(collector_address=staker, staker_address=staker)
assert receipt['status'] == 1, "Transaction Rejected"

View File

@ -35,8 +35,10 @@ def test_deposit_tokens(testerchain, agency, token_economics):
staker_account = testerchain.unassigned_accounts[0]
# Mock Powerup consumption (Deployer)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.etherbase_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.etherbase_account)
testerchain.transacting_power.activate()
balance = token_agent.get_balance(address=staker_account)
assert balance == 0
@ -47,8 +49,10 @@ def test_deposit_tokens(testerchain, agency, token_economics):
sender_address=testerchain.etherbase_account)
# Mock Powerup consumption (Ursula-Staker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker_account)
testerchain.transacting_power.activate()
#
# Deposit: The staker deposits tokens in the StakingEscrow contract.
@ -168,8 +172,10 @@ def test_confirm_activity(agency, testerchain):
staker_account, worker_account, *other = testerchain.unassigned_accounts
# Mock Powerup consumption (Ursula-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=worker_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=worker_account)
testerchain.transacting_power.activate()
receipt = staking_agent.confirm_activity(worker_address=worker_account)
assert receipt['status'] == 1, "Transaction Rejected"
@ -223,8 +229,10 @@ def test_collect_staking_reward(agency, testerchain):
testerchain.time_travel(periods=2)
# Mock Powerup consumption (Ursula-Staker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=staker_account)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=staker_account)
testerchain.transacting_power.activate()
# Mint
_receipt = staking_agent.mint(staker_address=staker_account)

View File

@ -68,8 +68,10 @@ def test_approve_transfer(agent, token_economics):
deployer, someone, *everybody_else = testerchain.client.accounts
# Mock Powerup consumption
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=someone)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=someone)
testerchain.transacting_power.activate()
# Approve
receipt = agent.approve_transfer(amount=token_economics.minimum_allowed_locked,
@ -85,8 +87,10 @@ def test_transfer(agent, token_economics):
origin, someone, *everybody_else = testerchain.client.accounts
# Mock Powerup consumption (Deployer)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=origin)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=origin)
testerchain.transacting_power.activate()
old_balance = agent.get_balance(someone)
receipt = agent.transfer(amount=token_economics.minimum_allowed_locked,

View File

@ -57,8 +57,10 @@ def agent(testerchain, proxy_deployer, allocation_value) -> UserEscrowAgent:
deployer_address, beneficiary_address, *everybody_else = testerchain.client.accounts
# Mock Powerup consumption (Deployer)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=deployer_address)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=deployer_address)
testerchain.transacting_power.activate()
# Escrow
escrow_deployer = UserEscrowDeployer(deployer_address=deployer_address,
@ -143,8 +145,10 @@ def test_deposit_and_withdraw_as_staker(testerchain, agent, agency, allocation_v
assert token_agent.get_balance(address=agent.contract_address) == allocation_value
# Mock Powerup consumption (Beneficiary)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=agent.beneficiary)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=agent.beneficiary)
testerchain.transacting_power.activate()
# Move the tokens to the StakingEscrow
receipt = agent.deposit_as_staker(value=token_economics.minimum_allowed_locked, periods=token_economics.minimum_locked_periods)
@ -162,8 +166,10 @@ def test_deposit_and_withdraw_as_staker(testerchain, agent, agency, allocation_v
assert staking_agent.get_locked_tokens(staker_address=agent.contract_address, periods=token_economics.minimum_locked_periods+1) == 0
# Mock Powerup consumption (Beneficiary-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=worker)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=worker)
testerchain.transacting_power.activate()
for _ in range(token_economics.minimum_locked_periods):
staking_agent.confirm_activity(worker_address=worker)
@ -171,8 +177,10 @@ def test_deposit_and_withdraw_as_staker(testerchain, agent, agency, allocation_v
testerchain.time_travel(periods=1)
# Mock Powerup consumption (Beneficiary)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=agent.beneficiary)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=agent.beneficiary)
testerchain.transacting_power.activate()
agent.mint()
@ -195,8 +203,10 @@ def test_collect_policy_reward(testerchain, agent, agency, token_economics):
deployer_address, beneficiary_address, author, ursula, *everybody_else = testerchain.client.accounts
# Mock Powerup consumption (Beneficiary)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=agent.beneficiary)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=agent.beneficiary)
testerchain.transacting_power.activate()
_txhash = agent.deposit_as_staker(value=token_economics.minimum_allowed_locked, periods=token_economics.minimum_locked_periods)
@ -207,8 +217,10 @@ def test_collect_policy_reward(testerchain, agent, agency, token_economics):
testerchain.time_travel(periods=1)
# Mock Powerup consumption (Alice)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=author)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=author)
testerchain.transacting_power.activate()
_txhash = policy_agent.create_policy(policy_id=os.urandom(16),
author_address=author,
@ -218,8 +230,10 @@ def test_collect_policy_reward(testerchain, agent, agency, token_economics):
node_addresses=[agent.contract_address])
# Mock Powerup consumption (Beneficiary-Worker)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=worker)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=worker)
testerchain.transacting_power.activate()
_txhash = staking_agent.confirm_activity(worker_address=worker)
testerchain.time_travel(periods=2)
@ -228,8 +242,10 @@ def test_collect_policy_reward(testerchain, agent, agency, token_economics):
old_balance = testerchain.client.get_balance(account=agent.beneficiary)
# Mock Powerup consumption (Beneficiary)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=agent.beneficiary)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=agent.beneficiary)
testerchain.transacting_power.activate()
txhash = agent.collect_policy_reward()
assert txhash # TODO
@ -241,8 +257,10 @@ def test_withdraw_tokens(testerchain, agent, agency, allocation_value):
deployer_address, beneficiary_address, *everybody_else = testerchain.client.accounts
# Mock Powerup consumption (Beneficiary)
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=agent.beneficiary)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=agent.beneficiary)
testerchain.transacting_power.activate()
assert token_agent.get_balance(address=agent.contract_address) == agent.unvested_tokens
with pytest.raises((TransactionFailed, ValueError)):

View File

@ -14,7 +14,9 @@ def test_transacting_power_sign_message(testerchain):
# Manually create a TransactingPower
testerchain.connect()
eth_address = testerchain.etherbase_account
power = TransactingPower(blockchain=testerchain, account=eth_address)
power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=eth_address)
# The default state of the account is locked.
# Test a signature without unlocking the account

View File

@ -293,7 +293,6 @@ def capsule_side_channel(enacted_federated_policy):
self.messages = []
self()
return _CapsuleSideChannel()
@ -313,8 +312,12 @@ def federated_alice(alice_federated_test_config):
@pytest.fixture(scope="module")
def blockchain_alice(alice_blockchain_test_config):
_alice = alice_blockchain_test_config.produce()
def blockchain_alice(alice_blockchain_test_config, testerchain):
transacting_power = TransactingPower(blockchain=testerchain,
account=alice_blockchain_test_config.checksum_address,
password=INSECURE_DEVELOPMENT_PASSWORD)
transacting_power.activate()
_alice = alice_blockchain_test_config.produce(additional_powers=[transacting_power])
return _alice
@ -325,8 +328,11 @@ def federated_bob(bob_federated_test_config):
@pytest.fixture(scope="module")
def blockchain_bob(bob_blockchain_test_config):
_bob = bob_blockchain_test_config.produce()
def blockchain_bob(bob_blockchain_test_config, testerchain):
transacting_power = TransactingPower(blockchain=testerchain,
account=bob_blockchain_test_config.checksum_address,
password=INSECURE_DEVELOPMENT_PASSWORD)
_bob = bob_blockchain_test_config.produce(additional_powers=[transacting_power])
return _bob
@ -370,8 +376,10 @@ def testerchain():
# Mock TransactingPower Consumption (Deployer)
testerchain.deployer_address = testerchain.etherbase_account
testerchain.transacting_power = TransactingPower(blockchain=testerchain, account=testerchain.deployer_address)
testerchain.transacting_power.activate(password=INSECURE_DEVELOPMENT_PASSWORD)
testerchain.transacting_power = TransactingPower(blockchain=testerchain,
password=INSECURE_DEVELOPMENT_PASSWORD,
account=testerchain.deployer_address)
testerchain.transacting_power.activate()
yield testerchain
testerchain.disconnect()