2018-03-19 00:46:48 +00:00
|
|
|
#!/usr/bin/env python3
|
2018-12-03 01:06:40 +00:00
|
|
|
|
|
|
|
|
2018-11-04 19:23:11 +00:00
|
|
|
"""
|
|
|
|
This file is part of nucypher.
|
|
|
|
|
|
|
|
nucypher is free software: you can redistribute it and/or modify
|
2019-03-05 02:50:11 +00:00
|
|
|
it under the terms of the GNU Affero General Public License as published by
|
2018-11-04 19:23:11 +00:00
|
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
nucypher is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
2019-03-05 02:50:11 +00:00
|
|
|
GNU Affero General Public License for more details.
|
2018-11-04 19:23:11 +00:00
|
|
|
|
2019-03-05 02:50:11 +00:00
|
|
|
You should have received a copy of the GNU Affero General Public License
|
2018-11-04 19:23:11 +00:00
|
|
|
along with nucypher. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
"""
|
2018-03-19 00:46:48 +00:00
|
|
|
|
2019-05-03 07:55:24 +00:00
|
|
|
import io
|
2018-12-13 22:56:16 +00:00
|
|
|
import json
|
2018-03-23 05:05:03 +00:00
|
|
|
import os
|
2019-05-03 07:55:24 +00:00
|
|
|
import re
|
2019-05-13 08:27:50 +00:00
|
|
|
import sys
|
2018-12-13 22:56:16 +00:00
|
|
|
import time
|
2019-06-19 11:34:44 +00:00
|
|
|
from mock import Mock
|
2018-12-08 20:23:26 +00:00
|
|
|
from os.path import abspath, dirname
|
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
from eth_account import Account
|
|
|
|
from eth_account.messages import encode_defunct
|
2019-06-19 23:49:11 +00:00
|
|
|
from eth_utils import to_canonical_address
|
2018-12-08 20:23:26 +00:00
|
|
|
from twisted.logger import globalLogPublisher, Logger, jsonFileLogObserver, ILogObserver
|
2019-05-03 07:55:24 +00:00
|
|
|
from umbral.keys import UmbralPrivateKey
|
|
|
|
from umbral.signing import Signer
|
2019-06-19 23:49:11 +00:00
|
|
|
from zope.interface import provider
|
2019-05-03 07:55:24 +00:00
|
|
|
|
|
|
|
from nucypher.blockchain.economics import TokenEconomics
|
2019-06-06 10:43:53 +00:00
|
|
|
from nucypher.blockchain.eth.agents import NucypherTokenAgent, StakingEscrowAgent, PolicyAgent, AdjudicatorAgent
|
2019-05-13 08:27:50 +00:00
|
|
|
from nucypher.crypto.signing import SignatureStamp
|
|
|
|
from nucypher.policy.models import Policy
|
2018-12-03 01:06:40 +00:00
|
|
|
from nucypher.utilities.sandbox.blockchain import TesterBlockchain
|
2018-03-07 19:22:59 +00:00
|
|
|
|
2019-05-13 08:27:50 +00:00
|
|
|
# FIXME: Needed to use a fixture here, but now estimate_gas.py only runs if executed from main directory
|
|
|
|
sys.path.insert(0, abspath('tests'))
|
|
|
|
from fixtures import _mock_ursula_reencrypts as mock_ursula_reencrypts
|
|
|
|
|
|
|
|
|
2019-02-05 12:46:11 +00:00
|
|
|
ALGORITHM_SHA256 = 1
|
2019-03-20 04:22:23 +00:00
|
|
|
TOKEN_ECONOMICS = TokenEconomics()
|
2019-03-22 03:36:38 +00:00
|
|
|
MIN_ALLOWED_LOCKED = TOKEN_ECONOMICS.minimum_allowed_locked
|
2019-03-20 04:22:23 +00:00
|
|
|
MIN_LOCKED_PERIODS = TOKEN_ECONOMICS.minimum_locked_periods
|
|
|
|
MAX_ALLOWED_LOCKED = TOKEN_ECONOMICS.maximum_allowed_locked
|
|
|
|
MAX_MINTING_PERIODS = TOKEN_ECONOMICS.maximum_locked_periods
|
2019-02-05 12:46:11 +00:00
|
|
|
|
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
class AnalyzeGas:
|
2018-12-14 18:10:08 +00:00
|
|
|
"""
|
|
|
|
Callable twisted log observer with built-in record-keeping for gas estimation runs.
|
|
|
|
"""
|
2018-12-08 20:23:26 +00:00
|
|
|
|
2018-12-14 18:10:08 +00:00
|
|
|
# Logging
|
2018-12-13 22:56:16 +00:00
|
|
|
LOG_NAME = 'estimate-gas'
|
|
|
|
LOG_FILENAME = '{}.log.json'.format(LOG_NAME)
|
|
|
|
OUTPUT_DIR = os.path.join(abspath(dirname(__file__)), 'results')
|
2018-12-14 18:10:08 +00:00
|
|
|
JSON_OUTPUT_FILENAME = '{}.json'.format(LOG_NAME)
|
|
|
|
|
|
|
|
_PATTERN = re.compile(r'''
|
|
|
|
^ # Anchor at the start of a string
|
|
|
|
(.+) # Any character sequence longer than 1; Captured
|
|
|
|
\s=\s # Space-Equal-Space
|
|
|
|
(\d+) # A sequence of digits; Captured
|
|
|
|
$ # Anchor at the end of the string
|
|
|
|
''', re.VERBOSE)
|
2018-12-08 20:23:26 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
def __init__(self) -> None:
|
2018-12-14 18:10:08 +00:00
|
|
|
|
|
|
|
self.log = Logger(self.__class__.__name__)
|
2018-12-13 22:56:16 +00:00
|
|
|
self.gas_estimations = dict()
|
2018-12-08 20:23:26 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
if not os.path.isdir(self.OUTPUT_DIR):
|
|
|
|
os.mkdir(self.OUTPUT_DIR)
|
2018-12-08 20:23:26 +00:00
|
|
|
|
|
|
|
@provider(ILogObserver)
|
2018-12-13 22:56:16 +00:00
|
|
|
def __call__(self, event, *args, **kwargs) -> None:
|
2018-12-14 18:10:08 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
if event.get('log_namespace') == self.LOG_NAME:
|
2018-12-08 20:23:26 +00:00
|
|
|
message = event.get("log_format")
|
2018-12-14 18:10:08 +00:00
|
|
|
|
|
|
|
matches = self._PATTERN.match(message)
|
|
|
|
if not matches:
|
|
|
|
self.log.debug("No match for {} with pattern {}".format(message, self._PATTERN))
|
2018-12-08 20:23:26 +00:00
|
|
|
return
|
2018-12-14 18:10:08 +00:00
|
|
|
|
|
|
|
label, gas = matches.groups()
|
2018-12-13 22:56:16 +00:00
|
|
|
self.paint_line(label, gas)
|
2018-12-08 20:23:26 +00:00
|
|
|
self.gas_estimations[label] = int(gas)
|
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
@staticmethod
|
|
|
|
def paint_line(label: str, gas: str) -> None:
|
2018-12-21 13:59:38 +00:00
|
|
|
print('{label} {gas:,}'.format(label=label.ljust(70, '.'), gas=int(gas)))
|
2018-01-27 13:05:19 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
def to_json_file(self) -> None:
|
|
|
|
print('Saving JSON Output...')
|
2018-06-15 05:51:28 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
epoch_time = str(int(time.time()))
|
|
|
|
timestamped_filename = '{}-{}'.format(epoch_time, self.JSON_OUTPUT_FILENAME)
|
|
|
|
filepath = os.path.join(self.OUTPUT_DIR, timestamped_filename)
|
|
|
|
with open(filepath, 'w') as file:
|
|
|
|
file.write(json.dumps(self.gas_estimations, indent=4))
|
2018-06-15 05:51:28 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
def start_collection(self) -> None:
|
|
|
|
print("Starting Data Collection...")
|
2018-12-08 20:23:26 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
json_filepath = os.path.join(self.OUTPUT_DIR, AnalyzeGas.LOG_FILENAME)
|
|
|
|
json_io = io.open(json_filepath, "w")
|
|
|
|
json_observer = jsonFileLogObserver(json_io)
|
|
|
|
globalLogPublisher.addObserver(json_observer)
|
|
|
|
globalLogPublisher.addObserver(self)
|
2018-06-15 05:51:28 +00:00
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
def mock_ursula(testerchain, account):
|
2019-05-13 08:27:50 +00:00
|
|
|
ursula_privkey = UmbralPrivateKey.gen_key()
|
|
|
|
ursula_stamp = SignatureStamp(verifying_key=ursula_privkey.pubkey,
|
|
|
|
signer=Signer(ursula_privkey))
|
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
# Sign Umbral public key using eth-key
|
|
|
|
address = to_canonical_address(account)
|
|
|
|
sig_key = testerchain.provider.ethereum_tester.backend._key_lookup[address]
|
|
|
|
signable_message = encode_defunct(primitive=bytes(ursula_stamp))
|
|
|
|
signature = Account.sign_message(signable_message=signable_message,
|
|
|
|
private_key=sig_key)
|
|
|
|
signed_stamp = bytes(signature.signature)
|
2019-05-13 08:27:50 +00:00
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
ursula = Mock(stamp=ursula_stamp, decentralized_identity_evidence=signed_stamp)
|
|
|
|
return ursula
|
2019-02-05 12:46:11 +00:00
|
|
|
|
2019-05-03 07:55:24 +00:00
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
def generate_args_for_slashing(ursula, corrupt_cfrag: bool = True):
|
2019-05-13 08:27:50 +00:00
|
|
|
evidence = mock_ursula_reencrypts(ursula, corrupt_cfrag=corrupt_cfrag)
|
|
|
|
args = list(evidence.evaluation_arguments())
|
|
|
|
return args
|
2019-02-05 12:46:11 +00:00
|
|
|
|
|
|
|
|
2018-12-14 18:10:08 +00:00
|
|
|
def estimate_gas(analyzer: AnalyzeGas = None) -> None:
|
|
|
|
"""
|
|
|
|
Execute a linear sequence of NyCypher transactions mimicking
|
|
|
|
post-deployment usage on a local PyEVM blockchain;
|
|
|
|
Record the resulting estimated transaction gas expenditure.
|
|
|
|
|
|
|
|
Note: The function calls below are *order dependant*
|
|
|
|
"""
|
2018-12-13 22:56:16 +00:00
|
|
|
|
|
|
|
#
|
|
|
|
# Setup
|
|
|
|
#
|
2018-12-15 01:36:48 +00:00
|
|
|
|
2018-12-18 18:31:41 +00:00
|
|
|
if analyzer is None:
|
2018-12-14 18:10:08 +00:00
|
|
|
analyzer = AnalyzeGas()
|
|
|
|
|
2018-12-13 22:56:16 +00:00
|
|
|
log = Logger(AnalyzeGas.LOG_NAME)
|
|
|
|
|
2018-12-14 18:10:08 +00:00
|
|
|
# Blockchain
|
2018-12-18 18:31:41 +00:00
|
|
|
testerchain, agents = TesterBlockchain.bootstrap_network()
|
2019-06-17 21:10:19 +00:00
|
|
|
web3 = testerchain.w3
|
2018-12-13 22:56:16 +00:00
|
|
|
|
2018-12-15 01:36:48 +00:00
|
|
|
# Accounts
|
2019-06-18 23:59:55 +00:00
|
|
|
origin, ursula1, ursula2, ursula3, alice1, *everyone_else = testerchain.client.accounts
|
2018-12-15 01:36:48 +00:00
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
ursula_with_stamp = mock_ursula(testerchain, ursula1)
|
2019-05-13 08:27:50 +00:00
|
|
|
|
2018-12-14 18:10:08 +00:00
|
|
|
# Contracts
|
2018-12-15 01:36:48 +00:00
|
|
|
token_agent = NucypherTokenAgent(blockchain=testerchain)
|
2019-06-06 10:43:53 +00:00
|
|
|
staking_agent = StakingEscrowAgent(blockchain=testerchain)
|
2018-12-15 01:36:48 +00:00
|
|
|
policy_agent = PolicyAgent(blockchain=testerchain)
|
2019-06-19 23:49:11 +00:00
|
|
|
adjudicator_agent = AdjudicatorAgent(blockchain=testerchain)
|
2018-12-15 01:36:48 +00:00
|
|
|
|
|
|
|
# Contract Callers
|
2018-12-14 17:11:09 +00:00
|
|
|
token_functions = token_agent.contract.functions
|
2019-05-29 14:15:18 +00:00
|
|
|
staker_functions = staking_agent.contract.functions
|
2018-12-14 17:11:09 +00:00
|
|
|
policy_functions = policy_agent.contract.functions
|
2019-03-22 03:36:38 +00:00
|
|
|
adjudicator_functions = adjudicator_agent.contract.functions
|
2018-12-08 20:23:26 +00:00
|
|
|
|
2018-12-14 18:10:08 +00:00
|
|
|
analyzer.start_collection()
|
2018-12-13 22:56:16 +00:00
|
|
|
print("********* Estimating Gas *********")
|
2018-06-15 05:51:28 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-02 17:10:49 +00:00
|
|
|
# Pre deposit tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approve(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 5).transact({'from': origin})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Pre-deposit tokens for 5 owners = " + str(staker_functions.preDeposit(everyone_else[0:5],
|
2018-12-14 17:11:09 +00:00
|
|
|
[MIN_ALLOWED_LOCKED] * 5,
|
|
|
|
[MIN_LOCKED_PERIODS] * 5)
|
2019-02-05 12:46:11 +00:00
|
|
|
.estimateGas({'from': origin})))
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Give Ursula and Alice some coins
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Transfer tokens = " + str(
|
|
|
|
token_functions.transfer(ursula1, MIN_ALLOWED_LOCKED * 10).estimateGas({'from': origin})))
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = token_functions.transfer(ursula1, MIN_ALLOWED_LOCKED * 10).transact({'from': origin})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = token_functions.transfer(ursula2, MIN_ALLOWED_LOCKED * 10).transact({'from': origin})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = token_functions.transfer(ursula3, MIN_ALLOWED_LOCKED * 10).transact({'from': origin})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Ursula and Alice give Escrow rights to transfer
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
|
|
|
log.info("Approving transfer = "
|
2019-02-05 12:46:11 +00:00
|
|
|
+ str(
|
2019-05-29 14:15:18 +00:00
|
|
|
token_functions.approve(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 6).estimateGas({'from': ursula1})))
|
|
|
|
tx = token_functions.approve(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 6).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approve(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 6).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approve(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 6).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Ursula and Alice transfer some tokens to the escrow and lock them
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("First initial deposit tokens = " + str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second initial deposit tokens = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third initial deposit tokens = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 3, MIN_LOCKED_PERIODS).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-04-26 13:28:37 +00:00
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setWorker(ursula1).transact({'from': ursula1})
|
2019-05-26 19:59:57 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setWorker(ursula2).transact({'from': ursula2})
|
2019-05-26 19:59:57 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setWorker(ursula3).transact({'from': ursula3})
|
2019-05-26 19:59:57 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2019-04-26 13:28:37 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2019-04-26 13:28:37 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2019-04-26 13:28:37 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Wait 1 period and confirm activity
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First confirm activity = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second confirm activity = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third confirm activity = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Wait 1 period and mint tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("First mining (1 stake) = " + str(staker_functions.mint().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Second mining (1 stake) = " + str(staker_functions.mint().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Third/last mining (1 stake) = " + str(staker_functions.mint().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First confirm activity again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second confirm activity again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third confirm activity again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Confirm again
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First confirm activity + mint = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second confirm activity + mint = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third confirm activity + mint = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Get locked tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Getting locked tokens = " + str(staker_functions.getLockedTokens(ursula1).estimateGas()))
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Wait 1 period and withdraw tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("First withdraw = " + str(staker_functions.withdraw(1).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.withdraw(1).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Second withdraw = " + str(staker_functions.withdraw(1).estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.withdraw(1).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Third withdraw = " + str(staker_functions.withdraw(1).estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.withdraw(1).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-03-10 14:33:33 +00:00
|
|
|
# Confirm activity with re-stake
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(True).transact({'from': ursula1})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(True).transact({'from': ursula2})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(True).transact({'from': ursula3})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
log.info("First confirm activity + mint with re-stake = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
log.info("Second confirm activity + mint with re-stake = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
log.info("Third confirm activity + mint with re-stake = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(False).transact({'from': ursula1})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(False).transact({'from': ursula2})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setReStake(False).transact({'from': ursula3})
|
2019-03-10 14:33:33 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
#
|
|
|
|
# Wait 2 periods and confirm activity after downtime
|
|
|
|
#
|
|
|
|
testerchain.time_travel(periods=2)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First confirm activity after downtime = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second confirm activity after downtime = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third confirm activity after downtime = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.confirmActivity().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Ursula and Alice deposit some tokens to the escrow again
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First deposit tokens again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second deposit tokens again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third deposit tokens again = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED * 2, MIN_LOCKED_PERIODS).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-02-08 09:29:32 +00:00
|
|
|
# Wait 1 period and mint tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("First mining again = " + str(staker_functions.mint().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Second mining again = " + str(staker_functions.mint().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Third/last mining again = " + str(staker_functions.mint().estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-02-08 09:29:32 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-10 13:04:11 +00:00
|
|
|
# Create policy
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-03-20 04:22:23 +00:00
|
|
|
policy_id_1 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
|
|
|
policy_id_2 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
2018-03-10 13:04:11 +00:00
|
|
|
number_of_periods = 10
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First creating policy (1 node, 10 periods) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_1, number_of_periods, 0, [ursula1]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 10000})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_1, number_of_periods, 0, [ursula1]).transact(
|
|
|
|
{'from': alice1, 'value': 10000})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second creating policy (1 node, 10 periods) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_2, number_of_periods, 0, [ursula1]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 10000})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_2, number_of_periods, 0, [ursula1]).transact(
|
|
|
|
{'from': alice1, 'value': 10000})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-03-10 13:04:11 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-10 13:04:11 +00:00
|
|
|
# Revoke policy
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
|
|
|
log.info("Revoking policy = " + str(policy_functions.revokePolicy(policy_id_1).estimateGas({'from': alice1})))
|
|
|
|
tx = policy_functions.revokePolicy(policy_id_1).transact({'from': alice1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = policy_functions.revokePolicy(policy_id_2).transact({'from': alice1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-03-10 13:04:11 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-10 13:04:11 +00:00
|
|
|
# Create policy with more periods
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-03-20 04:22:23 +00:00
|
|
|
policy_id_1 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
|
|
|
policy_id_2 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
|
|
|
policy_id_3 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
2018-03-10 13:04:11 +00:00
|
|
|
number_of_periods = 100
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First creating policy (1 node, " + str(number_of_periods) + " periods, first reward) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_1, number_of_periods, 50, [ursula2]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 10050})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_1, number_of_periods, 50, [ursula2]).transact(
|
|
|
|
{'from': alice1, 'value': 10050})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
testerchain.time_travel(periods=1)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second creating policy (1 node, " + str(number_of_periods) + " periods, first reward) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_2, number_of_periods, 50, [ursula2]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 10050})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_2, number_of_periods, 50, [ursula2]).transact(
|
|
|
|
{'from': alice1, 'value': 10050})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third creating policy (1 node, " + str(number_of_periods) + " periods, first reward) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_3, number_of_periods, 50, [ursula1]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 10050})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_3, number_of_periods, 50, [ursula1]).transact(
|
|
|
|
{'from': alice1, 'value': 10050})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-03-10 13:04:11 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-10 13:04:11 +00:00
|
|
|
# Mine and revoke policy
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=10)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("First mining after downtime = " + str(staker_functions.mint().estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
log.info("Second mining after downtime = " + str(staker_functions.mint().estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.mint().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
testerchain.time_travel(periods=10)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First revoking policy after downtime = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.revokePolicy(policy_id_1).estimateGas({'from': alice1})))
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = policy_functions.revokePolicy(policy_id_1).transact({'from': alice1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second revoking policy after downtime = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.revokePolicy(policy_id_2).estimateGas({'from': alice1})))
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = policy_functions.revokePolicy(policy_id_2).transact({'from': alice1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second revoking policy after downtime = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.revokePolicy(policy_id_3).estimateGas({'from': alice1})))
|
2018-12-14 17:11:09 +00:00
|
|
|
tx = policy_functions.revokePolicy(policy_id_3).transact({'from': alice1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-03-16 18:44:20 +00:00
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-03-16 18:44:20 +00:00
|
|
|
# Create policy with multiple nodes
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-03-20 04:22:23 +00:00
|
|
|
policy_id_1 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
|
|
|
policy_id_2 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
|
|
|
policy_id_3 = os.urandom(int(Policy.POLICY_ID_LENGTH))
|
2018-03-16 18:44:20 +00:00
|
|
|
number_of_periods = 100
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First creating policy (3 nodes, 100 periods, first reward) = " +
|
2018-12-14 17:11:09 +00:00
|
|
|
str(policy_functions
|
|
|
|
.createPolicy(policy_id_1, number_of_periods, 50, [ursula1, ursula2, ursula3])
|
|
|
|
.estimateGas({'from': alice1, 'value': 30150})))
|
2019-02-05 12:46:11 +00:00
|
|
|
tx = policy_functions.createPolicy(policy_id_1, number_of_periods, 50, [ursula1, ursula2, ursula3]).transact(
|
|
|
|
{'from': alice1, 'value': 30150})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second creating policy (3 nodes, 100 periods, first reward) = " +
|
2018-12-14 17:11:09 +00:00
|
|
|
str(policy_functions
|
|
|
|
.createPolicy(policy_id_2, number_of_periods, 50, [ursula1, ursula2, ursula3])
|
|
|
|
.estimateGas({'from': alice1, 'value': 30150})))
|
2019-02-05 12:46:11 +00:00
|
|
|
tx = policy_functions.createPolicy(policy_id_2, number_of_periods, 50, [ursula1, ursula2, ursula3]).transact(
|
|
|
|
{'from': alice1, 'value': 30150})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third creating policy (2 nodes, 100 periods, first reward) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(policy_functions.createPolicy(policy_id_3, number_of_periods, 50, [ursula1, ursula2]).estimateGas(
|
|
|
|
{'from': alice1, 'value': 20100})))
|
|
|
|
tx = policy_functions.createPolicy(policy_id_3, number_of_periods, 50, [ursula1, ursula2]).transact(
|
|
|
|
{'from': alice1, 'value': 20100})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
for index in range(5):
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
testerchain.time_travel(periods=1)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
# Check regular deposit
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("First deposit tokens = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Second deposit tokens = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Third deposit tokens = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.deposit(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
# ApproveAndCall
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.mint().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First approveAndCall = " +
|
2019-05-29 14:15:18 +00:00
|
|
|
str(token_functions.approveAndCall(staking_agent.contract_address,
|
2018-12-14 17:11:09 +00:00
|
|
|
MIN_ALLOWED_LOCKED * 2,
|
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).estimateGas({'from': ursula1})))
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approveAndCall(staking_agent.contract_address,
|
2018-12-14 17:11:09 +00:00
|
|
|
MIN_ALLOWED_LOCKED * 2,
|
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second approveAndCall = " +
|
2019-05-29 14:15:18 +00:00
|
|
|
str(token_functions.approveAndCall(staking_agent.contract_address, MIN_ALLOWED_LOCKED * 2,
|
2018-12-14 17:11:09 +00:00
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).estimateGas({'from': ursula2})))
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approveAndCall(staking_agent.contract_address,
|
2018-12-14 17:11:09 +00:00
|
|
|
MIN_ALLOWED_LOCKED * 2,
|
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third approveAndCall = " +
|
2019-05-29 14:15:18 +00:00
|
|
|
str(token_functions.approveAndCall(staking_agent.contract_address,
|
2018-12-14 17:11:09 +00:00
|
|
|
MIN_ALLOWED_LOCKED * 2,
|
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).estimateGas({'from': ursula3})))
|
2019-05-29 14:15:18 +00:00
|
|
|
tx = token_functions.approveAndCall(staking_agent.contract_address,
|
2018-12-14 17:11:09 +00:00
|
|
|
MIN_ALLOWED_LOCKED * 2,
|
|
|
|
web3.toBytes(MIN_LOCKED_PERIODS)).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
# Locking tokens
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("First locking tokens = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Second locking tokens = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula2})))
|
|
|
|
tx = staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula2})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-08 20:23:26 +00:00
|
|
|
log.info("Third locking tokens = " +
|
2019-05-29 13:53:23 +00:00
|
|
|
str(staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).estimateGas({'from': ursula3})))
|
|
|
|
tx = staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula3})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
# Divide stake
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("First divide stake = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.divideStake(1, MIN_ALLOWED_LOCKED, 2).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.divideStake(1, MIN_ALLOWED_LOCKED, 2).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Second divide stake = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.divideStake(3, MIN_ALLOWED_LOCKED, 2).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.divideStake(3, MIN_ALLOWED_LOCKED, 2).transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
# Divide almost finished stake
|
2018-12-14 17:11:09 +00:00
|
|
|
#
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-06-15 05:51:28 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
testerchain.time_travel(periods=1)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Divide stake (next period is not confirmed) = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.divideStake(0, MIN_ALLOWED_LOCKED, 2).estimateGas({'from': ursula1})))
|
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-12-14 17:11:09 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Divide stake (next period is confirmed) = " + str(
|
2019-05-29 13:53:23 +00:00
|
|
|
staker_functions.divideStake(0, MIN_ALLOWED_LOCKED, 2).estimateGas({'from': ursula1})))
|
2018-12-14 18:10:08 +00:00
|
|
|
|
2019-03-10 14:33:33 +00:00
|
|
|
#
|
2018-12-21 13:59:38 +00:00
|
|
|
# Slashing tests
|
2019-03-10 14:33:33 +00:00
|
|
|
#
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
testerchain.time_travel(periods=1)
|
2019-05-29 13:53:23 +00:00
|
|
|
# Deploy adjudicator to estimate slashing method in StakingEscrow contract
|
2019-06-17 21:10:19 +00:00
|
|
|
adjudicator, _ = testerchain.deploy_contract(
|
2019-05-29 14:15:18 +00:00
|
|
|
'Adjudicator', staking_agent.contract.address, ALGORITHM_SHA256, MIN_ALLOWED_LOCKED - 1, 0, 2, 2
|
2018-12-21 13:59:38 +00:00
|
|
|
)
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.setAdjudicator(adjudicator.address).transact()
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
adjudicator_functions = adjudicator.functions
|
|
|
|
|
2019-03-10 14:33:33 +00:00
|
|
|
#
|
2018-12-21 13:59:38 +00:00
|
|
|
# Slashing
|
2019-03-10 14:33:33 +00:00
|
|
|
#
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Slash just value = " + str(
|
|
|
|
adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
deposit = staker_functions.stakerInfo(ursula1).call()[0]
|
|
|
|
unlocked = deposit - staker_functions.getLockedTokens(ursula1).call()
|
|
|
|
tx = staker_functions.withdraw(unlocked).transact({'from': ursula1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("First slashing one sub stake and saving old one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("Second slashing one sub stake and saving old one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-02-05 12:46:11 +00:00
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("Third slashing one sub stake and saving old one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("Slashing two sub stakes and saving old one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
|
|
|
for index in range(18):
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.confirmActivity().transact({'from': ursula1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
testerchain.time_travel(periods=1)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
tx = staker_functions.lock(MIN_ALLOWED_LOCKED, MIN_LOCKED_PERIODS).transact({'from': ursula1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
2019-05-29 13:53:23 +00:00
|
|
|
deposit = staker_functions.stakerInfo(ursula1).call()[0]
|
|
|
|
unlocked = deposit - staker_functions.getLockedTokens(ursula1, 1).call()
|
|
|
|
tx = staker_functions.withdraw(unlocked).transact({'from': ursula1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("Slashing two sub stakes, shortest and new one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-05-29 13:53:23 +00:00
|
|
|
sub_stakes_length = str(staker_functions.getSubStakesLength(ursula1).call())
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp)
|
2019-02-24 09:48:30 +00:00
|
|
|
log.info("Slashing three sub stakes, two shortest and new one (" + sub_stakes_length + " sub stakes) = " +
|
2019-02-05 12:46:11 +00:00
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
2018-12-21 13:59:38 +00:00
|
|
|
testerchain.wait_for_receipt(tx)
|
|
|
|
|
2019-06-19 11:34:44 +00:00
|
|
|
slashing_args = generate_args_for_slashing(ursula_with_stamp, corrupt_cfrag=False)
|
2019-02-05 12:46:11 +00:00
|
|
|
log.info("Evaluating correct CFrag = " +
|
|
|
|
str(adjudicator_functions.evaluateCFrag(*slashing_args).estimateGas({'from': alice1})))
|
|
|
|
tx = adjudicator_functions.evaluateCFrag(*slashing_args).transact({'from': alice1})
|
|
|
|
testerchain.wait_for_receipt(tx)
|
2018-12-21 13:59:38 +00:00
|
|
|
|
2018-12-08 20:23:26 +00:00
|
|
|
print("********* All Done! *********")
|
2018-01-27 13:05:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2018-12-08 20:23:26 +00:00
|
|
|
print("Starting Up...")
|
2018-12-13 22:56:16 +00:00
|
|
|
analyzer = AnalyzeGas()
|
2018-12-14 18:10:08 +00:00
|
|
|
estimate_gas(analyzer=analyzer)
|
2018-12-13 22:56:16 +00:00
|
|
|
analyzer.to_json_file()
|