mirror of https://github.com/nucypher/nucypher.git
Remove test for sampling in contract
parent
49932b4c14
commit
9d88930e3c
|
@ -1,143 +0,0 @@
|
|||
"""
|
||||
This file is part of nucypher.
|
||||
|
||||
nucypher is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
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
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with nucypher. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
|
||||
import pytest
|
||||
from eth_tester.exceptions import TransactionFailed
|
||||
|
||||
from nucypher.blockchain.eth.interfaces import BlockchainInterface
|
||||
|
||||
@pytest.mark.slow
|
||||
def test_sampling(testerchain, token, escrow_contract):
|
||||
escrow = escrow_contract(5 * 10 ** 8)
|
||||
creator = testerchain.etherbase_account
|
||||
|
||||
# Give Escrow tokens for reward and initialize contract
|
||||
tx = token.functions.transfer(escrow.address, 10 ** 9).transact({'from': creator})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
tx = escrow.functions.initialize().transact({'from': creator})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
|
||||
stakers = testerchain.stakers_accounts
|
||||
amount = token.functions.balanceOf(creator).call() // 2
|
||||
largest_locked = amount
|
||||
|
||||
# Airdrop
|
||||
for staker in stakers:
|
||||
tx = token.functions.transfer(staker, amount).transact({'from': creator})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
amount = amount // 2
|
||||
|
||||
# Can't use sample without points, with zero periods value, or not sorted in ascending order.
|
||||
with pytest.raises(TransactionFailed):
|
||||
escrow.functions.sample([], 1).call()
|
||||
with pytest.raises(TransactionFailed):
|
||||
escrow.functions.sample([1], 0).call()
|
||||
with pytest.raises(TransactionFailed):
|
||||
escrow.functions.sample([3, 2, 1], 0).call()
|
||||
|
||||
# No stakers yet
|
||||
addresses = escrow.functions.sample([1], 1).call()
|
||||
assert 1 == len(addresses)
|
||||
assert BlockchainInterface.NULL_ADDRESS == addresses[0]
|
||||
|
||||
all_locked_tokens = 0
|
||||
# All stakers lock tokens for different lock periods
|
||||
for index, staker in enumerate(stakers):
|
||||
balance = token.functions.balanceOf(staker).call()
|
||||
tx = token.functions.approve(escrow.address, balance).transact({'from': staker})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
tx = escrow.functions.deposit(balance, index + 2).transact({'from': staker})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
tx = escrow.functions.setWorker(staker).transact({'from': staker})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
tx = escrow.functions.confirmActivity().transact({'from': staker})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
all_locked_tokens += balance
|
||||
|
||||
# Stakers are active starting from the next period
|
||||
assert 0 == escrow.functions.getAllLockedTokens(1).call()
|
||||
|
||||
# So sampling in current period is useless
|
||||
addresses = escrow.functions.sample([1], 1).call()
|
||||
assert 1 == len(addresses)
|
||||
assert BlockchainInterface.NULL_ADDRESS == addresses[0]
|
||||
|
||||
# Wait next period and check all locked tokens
|
||||
testerchain.time_travel(hours=1)
|
||||
assert all_locked_tokens == escrow.functions.getAllLockedTokens(1).call()
|
||||
assert all_locked_tokens > escrow.functions.getAllLockedTokens(2).call()
|
||||
assert 0 < escrow.functions.getAllLockedTokens(len(stakers)).call()
|
||||
assert 0 == escrow.functions.getAllLockedTokens(len(stakers) + 1).call()
|
||||
|
||||
# All stakers confirm activity
|
||||
for staker in stakers:
|
||||
tx = escrow.functions.confirmActivity().transact({'from': staker})
|
||||
testerchain.wait_for_receipt(tx)
|
||||
|
||||
# Sample one staker by value less than first staker's stake
|
||||
addresses = escrow.functions.sample([largest_locked - 1], 1).call()
|
||||
assert 1 == len(addresses)
|
||||
assert stakers[0] == addresses[0]
|
||||
|
||||
# Sample two stakers by values that are equal to first and second stakes
|
||||
# In the result must be second and third stakers because of strict condition in the sampling
|
||||
addresses = escrow.functions.sample([largest_locked, largest_locked + largest_locked // 2], 1).call()
|
||||
assert 2 == len(addresses)
|
||||
assert stakers[1] == addresses[0]
|
||||
assert stakers[2] == addresses[1]
|
||||
|
||||
# Sample two stakers by values that within first and second stakes
|
||||
# In the result must be second and third stakers because of strict condition in the sampling
|
||||
# sumOfLockedTokens > point
|
||||
addresses = escrow.functions.sample([largest_locked - 1, largest_locked + 1], 1).call()
|
||||
assert 2 == len(addresses)
|
||||
assert stakers[0] == addresses[0]
|
||||
assert stakers[1] == addresses[1]
|
||||
|
||||
# Sample staker by the max duration of the longest stake
|
||||
# The result is the staker who has the longest stake
|
||||
addresses = escrow.functions.sample([1], len(stakers)).call()
|
||||
assert 1 == len(addresses)
|
||||
assert stakers[-1] == addresses[0]
|
||||
|
||||
# Sample staker using the duration more than the longest stake
|
||||
# The result is empty
|
||||
addresses = escrow.functions.sample([1], len(stakers) + 1).call()
|
||||
assert 1 == len(addresses)
|
||||
assert BlockchainInterface.NULL_ADDRESS == addresses[0]
|
||||
|
||||
# Sample stakers by different durations and minimum value
|
||||
# Each result is the first appropriate stake by length
|
||||
for index, _ in enumerate(stakers[:-1], start=1):
|
||||
addresses = escrow.functions.sample([1], index + 1).call()
|
||||
assert 1 == len(addresses)
|
||||
assert stakers[index] == addresses[0]
|
||||
|
||||
# Sample all stakers by values as stake minus one
|
||||
# The result must contain all stakers
|
||||
points = [escrow.functions.getLockedTokens(staker).call() for staker in stakers]
|
||||
points[0] = points[0] - 1
|
||||
for i in range(1, len(points)):
|
||||
points[i] += points[i-1]
|
||||
addresses = escrow.functions.sample(points, 1).call()
|
||||
assert stakers == addresses
|
||||
|
||||
# Test stakers iteration
|
||||
assert len(stakers) == escrow.functions.getStakersLength().call()
|
||||
for index, staker in enumerate(stakers):
|
||||
assert stakers[index] == escrow.functions.stakers(index).call()
|
Loading…
Reference in New Issue