github.com/platonnetwork/platon-go@v0.7.6/cases/tests/ppos/Incentive_for_additional_issuance.py (about)

     1  import math
     2  import time
     3  
     4  import pytest
     5  from dacite import from_dict
     6  from common.log import log
     7  from client_sdk_python import Web3
     8  from decimal import Decimal
     9  from tests.conftest import get_client_consensus
    10  from tests.lib import EconomicConfig, Genesis, assert_code, von_amount, Client
    11  
    12  
    13  @pytest.mark.P1
    14  def test_AL_FI_001_to_003(new_genesis_env, staking_cfg):
    15      """
    16      AL_FI_001:查看每年释放补贴激励池变化
    17      AL_FI_002:查看每年固定增发变化
    18      AL_FI_003:第十年固定增发token分配
    19      :param new_genesis_env:
    20      :return:
    21      """
    22      # Initialization genesis file Initial amount
    23      node_count = len(new_genesis_env.consensus_node_list)
    24      default_pledge_amount = Web3.toWei(node_count * 1500000, 'ether')
    25      community_amount = default_pledge_amount + 259096239000000000000000000 + 62215742000000000000000000
    26      genesis = from_dict(data_class=Genesis, data=new_genesis_env.genesis_config)
    27      genesis.economicModel.innerAcc.cdfBalance = community_amount
    28      surplus_amount = str(EconomicConfig.TOKEN_TOTAL - community_amount - 200000000000000000000000000)
    29      genesis.alloc = {
    30          "1000000000000000000000000000000000000003": {
    31              "balance": "200000000000000000000000000"
    32          },
    33          "0x2e95E3ce0a54951eB9A99152A6d5827872dFB4FD": {
    34              "balance": surplus_amount
    35          }
    36      }
    37      new_file = new_genesis_env.cfg.env_tmp + "/genesis.json"
    38      genesis.to_file(new_file)
    39      new_genesis_env.deploy_all(new_file)
    40  
    41      client = get_client_consensus(new_genesis_env, staking_cfg)
    42      economic = client.economic
    43      node = client.node
    44      # Query the initial amount of incentive pool
    45      current_incentive_pool = 262215742000000000000000000
    46      # Query the initial amount of a warehouse lock plan
    47      init_foundationlockup = 259096239000000000000000000
    48      # Issued token amount
    49      init_token = 10000000000000000000000000000
    50      # Query developer foundation initial amount
    51      developer_foundation = 0
    52      # Query the initial amount of the foundation
    53      foundation_balance = 0
    54      # Additional amount
    55      total_amount_of_issuance = 0
    56      remaining_settlement_cycle = 0
    57      end_cycle_timestamp = None
    58      # Annual issuance
    59      for i in range(10):
    60          if i == 0:
    61              incentive_pool = current_incentive_pool
    62              log.info("Amount of initial incentive pool: {}".format(incentive_pool))
    63              foundation_lock_up = init_foundationlockup
    64              log.info("Initial Lockup Plan Amount: {}".format(foundation_lock_up))
    65              total_amount_of_issuance = int(init_token + Decimal(str(init_token)) / Decimal(str(40)))
    66              log.info("Current year Total amount of issuance: {}".format(total_amount_of_issuance))
    67              # Query the current annual incentive pool amount
    68              current_annual_incentive_pool_amount = node.eth.getBalance(EconomicConfig.INCENTIVEPOOL_ADDRESS, 0)
    69              # Query current annual developer foundation amount
    70              DEVELOPER_FOUNDATAION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS)
    71              current_annual_developer_foundation_amount = node.eth.getBalance(DEVELOPER_FOUNDATAION_ADDRESS, 0)
    72              # Query current annual fund amount
    73              FOUNDATION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.FOUNDATION_ADDRESS)
    74              current_annual_foundation_amount = node.eth.getBalance(FOUNDATION_ADDRESS, 0)
    75              log.info(
    76                  "{} Year Incentive Pool Address: {} Balance: {}".format(i + 1, EconomicConfig.INCENTIVEPOOL_ADDRESS,
    77                                                                          incentive_pool))
    78              log.info('{} Year Foundation Address: {} Balance: {}'.format(i + 1, EconomicConfig.FOUNDATION_ADDRESS,
    79                                                                           foundation_balance))
    80              log.info("{} Year Developer Foundation Address:{} Balance:{}".format(i + 1,
    81                                                                                   EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS,
    82                                                                                   developer_foundation))
    83              log.info("{} Year Foundation Locking Address: {} Balance: {}".format(i + 1,
    84                                                                                   EconomicConfig.FOUNDATION_LOCKUP_ADDRESS,
    85                                                                                   foundation_lock_up))
    86              assert current_annual_incentive_pool_amount == incentive_pool, "{} Year Incentive Pool Address: {} Balance: {}".format(
    87                  i + 1, EconomicConfig.INCENTIVEPOOL_ADDRESS, incentive_pool)
    88              assert current_annual_developer_foundation_amount == developer_foundation, "{} Year Developer Foundation Address:{} Balance:{}".format(
    89                  i + 1,
    90                  EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS,
    91                  developer_foundation)
    92              assert current_annual_foundation_amount == foundation_balance, "{} Year Developer Foundation Address:{} Balance:{}".format(
    93                  i + 1,
    94                  EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS,
    95                  developer_foundation)
    96              # log.info("{} Year additional Balance:{}".format(i + 1, total_amount_of_issuance))
    97              time.sleep(5)
    98              economic.wait_settlement_blocknum(node)
    99              while remaining_settlement_cycle != 1:
   100                  tmp_current_block = node.eth.blockNumber
   101                  if tmp_current_block % economic.settlement_size == 0:
   102                      time.sleep(1)
   103                  block_info = node.eth.getBlock(1)
   104                  log.info("block_info:{}".format(block_info))
   105                  first_timestamp = block_info['timestamp']
   106                  log.info("First block timestamp: {}".format(first_timestamp))
   107                  end_cycle_timestamp = first_timestamp + (economic.additional_cycle_time * 60000)
   108                  log.info("End time stamp of current issue cycle: {}".format(end_cycle_timestamp))
   109  
   110                  last_settlement_block = (math.ceil(tmp_current_block / economic.settlement_size) - 1) * economic.settlement_size
   111                  log.info("The last block height of the previous settlement period: {}".format(last_settlement_block))
   112                  settlement_block_info = node.eth.getBlock(last_settlement_block)
   113                  settlement_timestamp = settlement_block_info['timestamp']
   114                  log.info("High block timestamp at the end settlement cycle: {}".format(settlement_timestamp))
   115                  remaining_additional_time = end_cycle_timestamp - settlement_timestamp
   116                  log.info("Remaining time of current issuance cycle: {}".format(remaining_additional_time))
   117                  average_interval = (settlement_timestamp - first_timestamp) // (last_settlement_block - 1)
   118                  log.info("Block interval in the last settlement cycle: {}".format(average_interval))
   119                  number_of_remaining_blocks = math.ceil(remaining_additional_time / average_interval)
   120                  log.info("Remaining block height of current issuance cycle: {}".format(number_of_remaining_blocks))
   121                  remaining_settlement_cycle = math.ceil(number_of_remaining_blocks / economic.settlement_size)
   122                  log.info(
   123                      "remaining settlement cycles in the current issuance cycle: {}".format(remaining_settlement_cycle))
   124                  economic.wait_settlement_blocknum(node)
   125  
   126          elif 0 < i < 9:
   127              annual_last_block = (math.ceil(node.eth.blockNumber / economic.settlement_size) - 1) * economic.settlement_size
   128              log.info("The last block height in the last issue cycle: {}".format(annual_last_block))
   129              # Current annual total issuance
   130              additional_amount = int(Decimal(str(total_amount_of_issuance)) / Decimal(str(40)))
   131              log.info("Current annual quota: {}".format(additional_amount))
   132              # Incentive pool additional amount
   133              incentive_pool_additional_amount = int(Decimal(str(additional_amount)) * Decimal(str((80 / 100))))
   134              log.info("Additional quota for the current annual incentive pool: {}".format(incentive_pool_additional_amount))
   135              # developer foundation s additional amount
   136              developer_foundation_s_additional_amount = additional_amount - incentive_pool_additional_amount
   137              log.info("Current annual developer foundation additional quota: {}".format(developer_foundation_s_additional_amount))
   138              # Total amount of additional issuance
   139              total_amount_of_issuance = total_amount_of_issuance + additional_amount
   140              log.info("Total current hairstyle:{}".format(total_amount_of_issuance))
   141              # Current annual incentive pool amount
   142              current_incentive_pool = current_incentive_pool + incentive_pool_additional_amount + EconomicConfig.release_info[i - 1]['amount']
   143              log.info("Balance to be allocated for the current annual incentive pool:{}".format(current_incentive_pool))
   144              # Current annual Developer Fund Amount
   145              developer_foundation = developer_foundation + developer_foundation_s_additional_amount
   146              log.info("Current Annual Developer Foundation Total: {}".format(developer_foundation))
   147              # Query the current annual incentive pool amount
   148              current_annual_incentive_pool_amount = node.eth.getBalance(EconomicConfig.INCENTIVEPOOL_ADDRESS, annual_last_block)
   149              # Query current annual developer foundation amount
   150              DEVELOPER_FOUNDATAION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS)
   151              current_annual_developer_foundation_amount = node.eth.getBalance(DEVELOPER_FOUNDATAION_ADDRESS, annual_last_block)
   152              # Query current annual fund amount
   153              FOUNDATION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.FOUNDATION_ADDRESS)
   154              current_annual_foundation_amount = node.eth.getBalance(FOUNDATION_ADDRESS, annual_last_block)
   155              log.info("{} year initialization incentive pool address: {} balance: {}".format(i + 1,
   156                                                                                              EconomicConfig.INCENTIVEPOOL_ADDRESS,
   157                                                                                              current_incentive_pool))
   158              log.info('{} Year Initialization Foundation Address: {} balance: {}'.format(i + 1,
   159                                                                                          EconomicConfig.FOUNDATION_ADDRESS,
   160                                                                                          foundation_balance))
   161              log.info("{} Year Developer Fund Address: {} balance: {}".format(i + 1,
   162                                                                               EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS,
   163                                                                               developer_foundation))
   164              log.info("{} Year additional balance:{}".format(i + 1, additional_amount))
   165              assert current_annual_incentive_pool_amount == current_incentive_pool, "{} year initialization incentive pool address: {} balance: {}".format(
   166                  i + 1, EconomicConfig.INCENTIVEPOOL_ADDRESS, current_incentive_pool)
   167              assert current_annual_developer_foundation_amount == developer_foundation, "{} Year Developer Fund Address: {} balance: {}".format(
   168                  i + 1, EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS, developer_foundation)
   169              assert current_annual_foundation_amount == 0, '{} Year Initialization Foundation Address: {} balance: {}'.format(
   170                  i + 1, EconomicConfig.FOUNDATION_ADDRESS, foundation_balance)
   171              # Waiting for the end of the annual issuance cycle
   172              end_cycle_timestamp = end_cycle_timestamp + (economic.additional_cycle_time * 60000)
   173              log.info("End time stamp of current issue cycle: {}".format(end_cycle_timestamp))
   174              settlement_block_info = node.eth.getBlock(annual_last_block)
   175              settlement_timestamp = settlement_block_info['timestamp']
   176              log.info("High block timestamp at the end of settlement cycle: {}".format(settlement_timestamp))
   177              remaining_additional_time = end_cycle_timestamp - settlement_timestamp
   178              log.info("Remaining time of current issuance cycle: {}".format(remaining_additional_time))
   179              result = client.ppos.getAvgPackTime()
   180              average_interval = result['Ret']
   181              log.info("Block interval on the chain:{}".format(average_interval))
   182              log.info("Block interval on the chain:{}".format(average_interval))
   183              number_of_remaining_blocks = math.ceil(remaining_additional_time / average_interval)
   184              log.info("Remaining block height of current issuance cycle: {}".format(number_of_remaining_blocks))
   185              remaining_settlement_cycle = math.ceil(number_of_remaining_blocks / economic.settlement_size)
   186              log.info("remaining settlement cycles issuance cycle: {}".format(remaining_settlement_cycle))
   187              while remaining_settlement_cycle != 1:
   188                  tmp_current_block = node.eth.blockNumber
   189                  if tmp_current_block % economic.settlement_size == 0:
   190                      time.sleep(economic.interval)
   191                  tmp_current_block = node.eth.blockNumber
   192                  last_settlement_block = (math.ceil(
   193                      tmp_current_block / economic.settlement_size) - 1) * economic.settlement_size
   194                  log.info("The last block height of the previous settlement period: {}".format(last_settlement_block))
   195                  settlement_block_info = node.eth.getBlock(last_settlement_block)
   196                  settlement_timestamp = settlement_block_info['timestamp']
   197                  log.info("High block timestamp at the end of settlement cycle: {}".format(settlement_timestamp))
   198                  remaining_additional_time = end_cycle_timestamp - settlement_timestamp
   199                  log.info("Remaining time of current issuance cycle: {}".format(remaining_additional_time))
   200                  result = client.ppos.getAvgPackTime()
   201                  average_interval = result['Ret']
   202                  log.info("Block interval on the chain:{}".format(average_interval))
   203                  number_of_remaining_blocks = math.ceil(remaining_additional_time / average_interval)
   204                  log.info("Remaining block height of current issuance cycle: {}".format(number_of_remaining_blocks))
   205                  remaining_settlement_cycle = math.ceil(number_of_remaining_blocks / economic.settlement_size)
   206                  log.info("remaining settlement cycles issuance cycle: {}".format(remaining_settlement_cycle))
   207                  economic.wait_settlement_blocknum(node)
   208          else:
   209              annual_last_block = (math.ceil(node.eth.blockNumber / economic.settlement_size) - 1) * economic.settlement_size
   210              # Current annual total issuance
   211              additional_amount = int(Decimal(str(total_amount_of_issuance)) / Decimal(str(40)))
   212              # Incentive pool additional amount
   213              incentive_pool_additional_amount = int(Decimal(str(additional_amount)) * Decimal(str((80 / 100))))
   214              # developer foundation s additional amount
   215              developer_foundation_s_additional_amount = int(
   216                  Decimal(str(additional_amount - incentive_pool_additional_amount)) * Decimal(str((50 / 100))))
   217              # Foundation grant additional amount
   218              foundation_grant_amount = additional_amount - incentive_pool_additional_amount - developer_foundation_s_additional_amount
   219              # Total amount of additional issuance
   220              total_amount_of_issuance = total_amount_of_issuance + additional_amount
   221              # Current annual incentive pool amount
   222              current_incentive_pool = current_incentive_pool + incentive_pool_additional_amount
   223              # Current annual Developer Fund Amount
   224              developer_foundation = developer_foundation + developer_foundation_s_additional_amount
   225              # Current annual fund amount
   226              foundation_balance = foundation_balance + foundation_grant_amount
   227              # Query the current annual incentive pool amount
   228              current_annual_incentive_pool_amount = node.eth.getBalance(EconomicConfig.INCENTIVEPOOL_ADDRESS, annual_last_block)
   229              # Query current annual developer foundation amount
   230              DEVELOPER_FOUNDATAION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS)
   231              current_annual_developer_foundation_amount = node.eth.getBalance(DEVELOPER_FOUNDATAION_ADDRESS, annual_last_block)
   232              # Query current annual fund amount
   233              FOUNDATION_ADDRESS = node.web3.toChecksumAddress(EconomicConfig.FOUNDATION_ADDRESS)
   234              current_annual_foundation_amount = node.eth.getBalance(FOUNDATION_ADDRESS, annual_last_block)
   235              log.info("{} year initialization incentive pool address: {} balance: {}".format(i + 1,
   236                                                                                              EconomicConfig.INCENTIVEPOOL_ADDRESS,
   237                                                                                              current_incentive_pool))
   238              log.info('{} Year Initialization Foundation Address: {} balance: {}'.format(i + 1,
   239                                                                                          EconomicConfig.FOUNDATION_ADDRESS,
   240                                                                                          foundation_balance))
   241              log.info("{} Year Developer Fund Address: {} balance: {}".format(i + 1,
   242                                                                               EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS,
   243                                                                               developer_foundation))
   244              log.info("{} Year additional balance:{}".format(i + 1, additional_amount))
   245              assert current_annual_incentive_pool_amount == current_incentive_pool, "{} year initialization incentive pool address: {} balance: {}".format(
   246                  i + 1, EconomicConfig.INCENTIVEPOOL_ADDRESS, current_incentive_pool)
   247              assert current_annual_developer_foundation_amount == developer_foundation, "{} Year Developer Fund Address: {} balance: {}".format(
   248                  i + 1, EconomicConfig.DEVELOPER_FOUNDATAION_ADDRESS, developer_foundation)
   249              assert current_annual_foundation_amount == foundation_balance, '{} Year Initialization Foundation Address: {} balance: {}'.format(
   250                  i + 1, EconomicConfig.FOUNDATION_ADDRESS, foundation_balance)
   251  
   252  
   253  @pytest.mark.p1
   254  def test_AL_FI_004_005(new_genesis_env, staking_cfg):
   255      """
   256      AL_FI_004:查看每年区块奖励变化
   257      AL_FI_005:查看每年质押奖励变化
   258      :param new_genesis_env:
   259      :param staking_cfg:
   260      :return:
   261      """
   262      # Initialization genesis file Initial amount
   263      node_count = len(new_genesis_env.consensus_node_list)
   264      default_pledge_amount = Web3.toWei(node_count * 1500000, 'ether')
   265      community_amount = default_pledge_amount + 259096239000000000000000000 + 62215742000000000000000000
   266      genesis = from_dict(data_class=Genesis, data=new_genesis_env.genesis_config)
   267      genesis.economicModel.innerAcc.cdfBalance = community_amount
   268      surplus_amount = str(EconomicConfig.TOKEN_TOTAL - community_amount - 200000000000000000000000000)
   269      genesis.alloc = {
   270          "1000000000000000000000000000000000000003": {
   271              "balance": "200000000000000000000000000"
   272          },
   273          "0x2e95E3ce0a54951eB9A99152A6d5827872dFB4FD": {
   274              "balance": surplus_amount
   275          }
   276      }
   277      new_file = new_genesis_env.cfg.env_tmp + "/genesis.json"
   278      genesis.to_file(new_file)
   279      new_genesis_env.deploy_all(new_file)
   280      normal_node = new_genesis_env.get_a_normal_node()
   281      client = Client(new_genesis_env, normal_node, staking_cfg)
   282      economic = client.economic
   283      node = client.node
   284      log.info("Current connection node:{}".format(node.node_mark))
   285      log.info("Current connection nodeid:{}".format(node.node_id))
   286      address, _ = economic.account.generate_account(node.web3, von_amount(economic.create_staking_limit, 2))
   287      log.info("address: {}".format(address))
   288      address1, _ = economic.account.generate_account(node.web3, 0)
   289      log.info("address1: {}".format(address1))
   290      end_cycle_timestamp = None
   291      for i in range(10):
   292          result = client.staking.create_staking(0, address1, address)
   293          assert_code(result, 0)
   294          # view account amount
   295          benifit_balance = node.eth.getBalance(address1)
   296          log.info("benifit_balance: {}".format(benifit_balance))
   297          # Wait for the settlement round to end
   298          economic.wait_settlement_blocknum(node)
   299          # 获取当前结算周期验证人
   300          verifier_list = node.ppos.getVerifierList()
   301          log.info("verifier_list: {}".format(verifier_list))
   302          # view block_reward
   303          block_reward, staking_reward = economic.get_current_year_reward(node)
   304          log.info("block_reward: {} staking_reward: {}".format(block_reward, staking_reward))
   305          # withdrew of pledge
   306          result = client.staking.withdrew_staking(address)
   307          assert_code(result, 0)
   308          # wait settlement block
   309          economic.wait_settlement_blocknum(node)
   310          # wait consensus block
   311          economic.wait_consensus_blocknum(node)
   312          # count the number of blocks
   313          blocknumber = economic.get_block_count_number(node, 10)
   314          log.info("blocknumber: {}".format(blocknumber))
   315          # view account amount again
   316          benifit_balance1 = node.eth.getBalance(address1)
   317          log.info("benifit_balance: {}".format(benifit_balance1))
   318          reward = int(blocknumber * Decimal(str(block_reward)))
   319          assert benifit_balance1 == benifit_balance + staking_reward + reward, "ErrMsg:benifit_balance: {}".format(
   320              benifit_balance1)
   321          if i == 0:
   322              block_info = node.eth.getBlock(1)
   323              log.info("block_info:{}".format(block_info))
   324              first_timestamp = block_info['timestamp']
   325              log.info("First block timestamp: {}".format(first_timestamp))
   326              end_cycle_timestamp = first_timestamp + (economic.additional_cycle_time * 60000)
   327              log.info("End time stamp of current issue cycle: {}".format(end_cycle_timestamp))
   328          else:
   329              # Waiting for the end of the annual issuance cycle
   330              end_cycle_timestamp = end_cycle_timestamp + (economic.additional_cycle_time * 60000)
   331              log.info("End time stamp of current issue cycle: {}".format(end_cycle_timestamp))
   332          annual_last_block = (math.ceil(node.eth.blockNumber / economic.settlement_size) - 1) * economic.settlement_size
   333          log.info("The last block height in the last issue cycle: {}".format(annual_last_block))
   334          settlement_block_info = node.eth.getBlock(annual_last_block)
   335          settlement_timestamp = settlement_block_info['timestamp']
   336          log.info("High block timestamp at the end of settlement cycle: {}".format(settlement_timestamp))
   337          remaining_additional_time = end_cycle_timestamp - settlement_timestamp
   338          log.info("Remaining time of current issuance cycle: {}".format(remaining_additional_time))
   339          result = client.ppos.getAvgPackTime()
   340          average_interval = result['Ret']
   341          log.info("Block interval on the chain:{}".format(average_interval))
   342          log.info("Block interval on the chain:{}".format(average_interval))
   343          number_of_remaining_blocks = math.ceil(remaining_additional_time / average_interval)
   344          log.info("Remaining block height of current issuance cycle: {}".format(number_of_remaining_blocks))
   345          remaining_settlement_cycle = math.ceil(number_of_remaining_blocks / economic.settlement_size)
   346          log.info("remaining settlement cycles issuance cycle: {}".format(remaining_settlement_cycle))
   347          while remaining_settlement_cycle != 1:
   348              tmp_current_block = node.eth.blockNumber
   349              if tmp_current_block % economic.settlement_size == 0:
   350                  time.sleep(economic.interval)
   351              tmp_current_block = node.eth.blockNumber
   352              last_settlement_block = (math.ceil(
   353                  tmp_current_block / economic.settlement_size) - 1) * economic.settlement_size
   354              log.info("The last block height of the previous settlement period: {}".format(last_settlement_block))
   355              settlement_block_info = node.eth.getBlock(last_settlement_block)
   356              settlement_timestamp = settlement_block_info['timestamp']
   357              log.info("High block timestamp at the end of settlement cycle: {}".format(settlement_timestamp))
   358              remaining_additional_time = end_cycle_timestamp - settlement_timestamp
   359              log.info("Remaining time of current issuance cycle: {}".format(remaining_additional_time))
   360              result = client.ppos.getAvgPackTime()
   361              average_interval = result['Ret']
   362              log.info("Block interval on the chain:{}".format(average_interval))
   363              number_of_remaining_blocks = math.ceil(remaining_additional_time / average_interval)
   364              log.info("Remaining block height of current issuance cycle: {}".format(number_of_remaining_blocks))
   365              remaining_settlement_cycle = math.ceil(number_of_remaining_blocks / economic.settlement_size)
   366              log.info("remaining settlement cycles issuance cycle: {}".format(remaining_settlement_cycle))
   367              economic.wait_settlement_blocknum(node)
   368