mirror of https://github.com/nucypher/nucypher.git
Introduce StakeHolder
parent
a560845bcd
commit
8c11576c40
|
@ -53,6 +53,7 @@ from nucypher.blockchain.eth.interfaces import BlockchainInterface
|
||||||
from nucypher.blockchain.eth.registry import AllocationRegistry
|
from nucypher.blockchain.eth.registry import AllocationRegistry
|
||||||
from nucypher.blockchain.eth.token import NU, Stake, StakeTracker
|
from nucypher.blockchain.eth.token import NU, Stake, StakeTracker
|
||||||
from nucypher.blockchain.eth.utils import datetime_to_period, calculate_period_duration
|
from nucypher.blockchain.eth.utils import datetime_to_period, calculate_period_duration
|
||||||
|
from nucypher.config.base import BaseConfiguration
|
||||||
from nucypher.config.constants import DEFAULT_CONFIG_ROOT
|
from nucypher.config.constants import DEFAULT_CONFIG_ROOT
|
||||||
from nucypher.crypto.powers import TransactingPower
|
from nucypher.crypto.powers import TransactingPower
|
||||||
|
|
||||||
|
@ -656,3 +657,83 @@ class Investigator(NucypherTokenActor):
|
||||||
receipt = self.adjudicator_agent.evaluate_cfrag(evidence=evidence,
|
receipt = self.adjudicator_agent.evaluate_cfrag(evidence=evidence,
|
||||||
sender_address=self.checksum_address)
|
sender_address=self.checksum_address)
|
||||||
return receipt
|
return receipt
|
||||||
|
|
||||||
|
|
||||||
|
class StakeHolder(BaseConfiguration):
|
||||||
|
|
||||||
|
def __init__(self,
|
||||||
|
blockchain: BlockchainInterface = None,
|
||||||
|
staking_agent: StakingEscrowAgent = None,
|
||||||
|
trezor: bool = False,
|
||||||
|
*args, **kwargs):
|
||||||
|
|
||||||
|
if not staking_agent:
|
||||||
|
staking_agent = StakingEscrowAgent(blockchain=blockchain)
|
||||||
|
|
||||||
|
self.staking_agent = staking_agent
|
||||||
|
self.blockchain = staking_agent.blockchain
|
||||||
|
|
||||||
|
self.trezor = trezor
|
||||||
|
self.device = NO_STAKING_DEVICE
|
||||||
|
self.setup_device()
|
||||||
|
|
||||||
|
self.__accounts = list()
|
||||||
|
self.__stakers = dict()
|
||||||
|
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def static_payload(self) -> dict:
|
||||||
|
payload = dict(trezor=self.trezor)
|
||||||
|
return payload
|
||||||
|
|
||||||
|
def setup_device(self) -> None:
|
||||||
|
device = NO_STAKING_DEVICE
|
||||||
|
if self.trezor:
|
||||||
|
device = NotImplemented # Trezor()
|
||||||
|
self.device = device
|
||||||
|
|
||||||
|
def add_account(self, address: str) -> None:
|
||||||
|
self.blockchain.interface.client.unlock_account(address=address)
|
||||||
|
self.__accounts.append(address)
|
||||||
|
|
||||||
|
def get_accounts(self):
|
||||||
|
if self.device is not NO_STAKING_DEVICE:
|
||||||
|
self.__accounts.extend(self.device.accounts)
|
||||||
|
|
||||||
|
def get_stakers(self) -> None:
|
||||||
|
for account in self.__accounts:
|
||||||
|
staker = Staker(is_me=True, checksum_address=account)
|
||||||
|
self.__stakers[account] = staker
|
||||||
|
|
||||||
|
def get_staker(self, address: str) -> Staker:
|
||||||
|
try:
|
||||||
|
staker = self.__stakers[address]
|
||||||
|
except KeyError:
|
||||||
|
if address not in self.__accounts:
|
||||||
|
raise RuntimeError(f"Unknown or locked account {address}")
|
||||||
|
staker = Staker(is_me=True, checksum_address=address)
|
||||||
|
return staker
|
||||||
|
|
||||||
|
def set_worker(self, index: int, worker_address: str):
|
||||||
|
stake = self.__stakers[index]
|
||||||
|
result = self.staking_agent.set_worker(staker_address=stake.owner_address, worker_address=worker_address)
|
||||||
|
return result
|
||||||
|
|
||||||
|
def initialize_stake(self, address: str, amount: NU, duration: int):
|
||||||
|
staker = self.get_staker(address=address)
|
||||||
|
new_stake = Stake.initialize_stake(staker=staker, amount=amount)
|
||||||
|
return new_stake
|
||||||
|
|
||||||
|
def divide_stake(self, address: str, index: int):
|
||||||
|
|
||||||
|
try:
|
||||||
|
staker = self.__stakers[address]
|
||||||
|
except KeyError:
|
||||||
|
raise RuntimeError(f"No active stakes for {address}")
|
||||||
|
|
||||||
|
try:
|
||||||
|
stake = staker.stakes[index]
|
||||||
|
except IndexError:
|
||||||
|
raise
|
||||||
|
|
||||||
|
stake.divide(target_value=0)
|
||||||
|
|
Loading…
Reference in New Issue