diff --git a/solidity/contracts/TokenStaking.sol b/solidity/contracts/TokenStaking.sol index a0b7b899a8..acca7ab5d1 100644 --- a/solidity/contracts/TokenStaking.sol +++ b/solidity/contracts/TokenStaking.sol @@ -20,8 +20,8 @@ import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "./StakeDelegatable.sol"; import "./libraries/staking/MinimumStakeSchedule.sol"; import "./libraries/staking/GrantStaking.sol"; +import "./libraries/staking/Locks.sol"; import "./utils/PercentUtils.sol"; -import "./utils/LockUtils.sol"; import "./utils/BytesLib.sol"; import "./Authorizations.sol"; import "./TokenStakingEscrow.sol"; @@ -39,6 +39,7 @@ contract TokenStaking is Authorizations, StakeDelegatable { using LockUtils for LockUtils.LockSet; using SafeERC20 for ERC20Burnable; using GrantStaking for GrantStaking.Storage; + using Locks for Locks.Storage; event Staked( address owner, @@ -55,8 +56,6 @@ contract TokenStaking is Authorizations, StakeDelegatable { event LockReleased(address indexed operator, address lockCreator); event ExpiredLockReleased(address indexed operator, address lockCreator); - uint256 public constant maximumLockDuration = 86400 * 200; // 200 days in seconds - uint256 public initializationPeriod; uint256 public undelegationPeriod; @@ -68,14 +67,11 @@ contract TokenStaking is Authorizations, StakeDelegatable { GrantStaking.Storage internal grantStaking; + Locks.Storage internal locks; + // KEEP token grant contract. TokenGrant internal tokenGrant; - // Locks placed on the operator. - // `operatorLocks[operator]` returns all locks placed on the operator. - // Each authorized operator contract can place one lock on an operator. - mapping(address => LockUtils.LockSet) internal operatorLocks; - /// @notice Creates a token staking contract for a provided Standard ERC20Burnable token. /// @param _token KEEP token contract. /// @param _tokenGrant KEEP token grant contract. @@ -281,7 +277,6 @@ contract TokenStaking is Authorizations, StakeDelegatable { isAuthorizedForOperator(operator, msg.sender), "Not authorized" ); - require(duration <= maximumLockDuration, "Lock duration too long"); uint256 operatorParams = operators[operator].packedParams; @@ -294,11 +289,7 @@ contract TokenStaking is Authorizations, StakeDelegatable { "Operator undelegating" ); - operatorLocks[operator].setLock( - msg.sender, - uint96(block.timestamp.add(duration)) - ); - emit StakeLocked(operator, msg.sender, block.timestamp.add(duration)); + locks.lockStake(operator, duration); } /// @notice Removes a lock the caller had previously placed on the operator. @@ -318,8 +309,7 @@ contract TokenStaking is Authorizations, StakeDelegatable { isAuthorizedForOperator(operator, msg.sender), "Not authorized" ); - operatorLocks[operator].releaseLock(msg.sender); - emit LockReleased(operator, msg.sender); + locks.releaseLock(operator); } /// @notice Removes the lock of the specified operator contract @@ -332,38 +322,14 @@ contract TokenStaking is Authorizations, StakeDelegatable { address operator, address operatorContract ) public { - LockUtils.LockSet storage locks = operatorLocks[operator]; - require( - locks.contains(operatorContract), - "No matching lock present" - ); - bool expired = block.timestamp >= locks.getLockTime(operatorContract); - bool disabled = !registry.isApprovedOperatorContract(operatorContract); - require( - expired || disabled, - "Lock still active and valid" - ); - locks.releaseLock(operatorContract); - emit ExpiredLockReleased(operator, operatorContract); + locks.releaseExpiredLock(operator, operatorContract, registry); } /// @notice Check whether the operator has any active locks /// that haven't expired yet /// and whose creators aren't disabled by the panic button. - function isStakeLocked( - address operator - ) public view returns (bool) { - LockUtils.Lock[] storage _locks = operatorLocks[operator].locks; - LockUtils.Lock memory lock; - for (uint i = 0; i < _locks.length; i++) { - lock = _locks[i]; - if (block.timestamp < lock.expiresAt) { - if (registry.isApprovedOperatorContract(lock.creator)) { - return true; - } - } - } - return false; + function isStakeLocked(address operator) public view returns (bool) { + return locks.isStakeLocked(operator, registry); } /// @notice Get the locks placed on the operator. @@ -375,15 +341,7 @@ contract TokenStaking is Authorizations, StakeDelegatable { public view returns (address[] memory creators, uint256[] memory expirations) { - uint256 lockCount = operatorLocks[operator].locks.length; - creators = new address[](lockCount); - expirations = new uint256[](lockCount); - LockUtils.Lock memory lock; - for (uint i = 0; i < lockCount; i++) { - lock = operatorLocks[operator].locks[i]; - creators[i] = lock.creator; - expirations[i] = lock.expiresAt; - } + return locks.getLocks(operator); } /// @notice Slash provided token amount from every member in the misbehaved @@ -609,10 +567,7 @@ contract TokenStaking is Authorizations, StakeDelegatable { return false; } // Undelegating finished, so check locks - LockUtils.LockSet storage locks = operatorLocks[_operator]; - // `getLockTime` returns 0 if the lock doesn't exist, - // thus we don't need to check for its presence separately. - return block.timestamp >= locks.getLockTime(_operatorContract); + return locks.isStakeReleased(_operator, _operatorContract); } function transferOrDeposit( diff --git a/solidity/contracts/utils/LockUtils.sol b/solidity/contracts/libraries/staking/LockUtils.sol similarity index 100% rename from solidity/contracts/utils/LockUtils.sol rename to solidity/contracts/libraries/staking/LockUtils.sol diff --git a/solidity/contracts/libraries/staking/Locks.sol b/solidity/contracts/libraries/staking/Locks.sol new file mode 100644 index 0000000000..cd97441442 --- /dev/null +++ b/solidity/contracts/libraries/staking/Locks.sol @@ -0,0 +1,109 @@ +pragma solidity 0.5.17; + +import "openzeppelin-solidity/contracts/math/SafeMath.sol"; +import "../../KeepRegistry.sol"; +import "./LockUtils.sol"; + +library Locks { + using SafeMath for uint256; + using LockUtils for LockUtils.LockSet; + + event StakeLocked(address indexed operator, address lockCreator, uint256 until); + event LockReleased(address indexed operator, address lockCreator); + event ExpiredLockReleased(address indexed operator, address lockCreator); + + uint256 public constant maximumLockDuration = 86400 * 200; // 200 days in seconds + + struct Storage { + // Locks placed on the operator. + // `operatorLocks[operator]` returns all locks placed on the operator. + // Each authorized operator contract can place one lock on an operator. + mapping(address => LockUtils.LockSet) operatorLocks; + } + + function lockStake( + Storage storage self, + address operator, + uint256 duration + ) public { + require(duration <= maximumLockDuration, "Lock duration too long"); + self.operatorLocks[operator].setLock( + msg.sender, + uint96(block.timestamp.add(duration)) + ); + emit StakeLocked(operator, msg.sender, block.timestamp.add(duration)); + } + + function releaseLock( + Storage storage self, + address operator + ) public { + self.operatorLocks[operator].releaseLock(msg.sender); + emit LockReleased(operator, msg.sender); + } + + function releaseExpiredLock( + Storage storage self, + address operator, + address operatorContract, + KeepRegistry registry + ) public { + LockUtils.LockSet storage locks = self.operatorLocks[operator]; + require( + locks.contains(operatorContract), + "No matching lock present" + ); + bool expired = block.timestamp >= locks.getLockTime(operatorContract); + bool disabled = !registry.isApprovedOperatorContract(operatorContract); + require( + expired || disabled, + "Lock still active and valid" + ); + locks.releaseLock(operatorContract); + emit ExpiredLockReleased(operator, operatorContract); + } + + function isStakeLocked( + Storage storage self, + address operator, + KeepRegistry registry + ) public view returns (bool) { + LockUtils.Lock[] storage _locks = self.operatorLocks[operator].locks; + LockUtils.Lock memory lock; + for (uint i = 0; i < _locks.length; i++) { + lock = _locks[i]; + if (block.timestamp < lock.expiresAt) { + if (registry.isApprovedOperatorContract(lock.creator)) { + return true; + } + } + } + return false; + } + + function isStakeReleased( + Storage storage self, + address operator, + address operatorContract + ) public view returns (bool) { + LockUtils.LockSet storage locks = self.operatorLocks[operator]; + // `getLockTime` returns 0 if the lock doesn't exist, + // thus we don't need to check for its presence separately. + return block.timestamp >= locks.getLockTime(operatorContract); + } + + function getLocks( + Storage storage self, + address operator + ) public view returns (address[] memory creators, uint256[] memory expirations) { + uint256 lockCount = self.operatorLocks[operator].locks.length; + creators = new address[](lockCount); + expirations = new uint256[](lockCount); + LockUtils.Lock memory lock; + for (uint i = 0; i < lockCount; i++) { + lock = self.operatorLocks[operator].locks[i]; + creators[i] = lock.creator; + expirations[i] = lock.expiresAt; + } + } +} diff --git a/solidity/contracts/stubs/LockStub.sol b/solidity/contracts/stubs/LockStub.sol index b36c0f16ed..caae631e27 100644 --- a/solidity/contracts/stubs/LockStub.sol +++ b/solidity/contracts/stubs/LockStub.sol @@ -1,6 +1,6 @@ pragma solidity 0.5.17; -import "../utils/LockUtils.sol"; +import "../libraries/staking/LockUtils.sol"; contract LockStub { using LockUtils for LockUtils.LockSet; diff --git a/solidity/migrations/2_deploy_contracts.js b/solidity/migrations/2_deploy_contracts.js index e9a9989606..6a0ac042dd 100644 --- a/solidity/migrations/2_deploy_contracts.js +++ b/solidity/migrations/2_deploy_contracts.js @@ -4,6 +4,7 @@ const AltBn128 = artifacts.require("./cryptography/AltBn128.sol"); const BLS = artifacts.require("./cryptography/BLS.sol"); const MinimumStakeSchedule = artifacts.require("./MinimumStakeSchedule.sol"); const GrantStaking = artifacts.require("./GrantStaking.sol"); +const Locks = artifacts.require("./Locks.sol"); const TokenStaking = artifacts.require("./TokenStaking.sol"); const TokenStakingEscrow = artifacts.require("./TokenStakingEscrow.sol"); const PermissiveStakingPolicy = artifacts.require('./PermissiveStakingPolicy.sol'); @@ -43,8 +44,10 @@ module.exports = async function(deployer, network) { await deployer.deploy(TokenStakingEscrow, KeepToken.address, TokenGrant.address); await deployer.deploy(MinimumStakeSchedule); await deployer.deploy(GrantStaking); + await deployer.deploy(Locks); await deployer.link(MinimumStakeSchedule, TokenStaking); await deployer.link(GrantStaking, TokenStaking); + await deployer.link(Locks, TokenStaking); await deployer.deploy( TokenStaking, KeepToken.address, diff --git a/solidity/test/RolesLookupTest.js b/solidity/test/RolesLookupTest.js index 0d84acf554..fa089ac33f 100644 --- a/solidity/test/RolesLookupTest.js +++ b/solidity/test/RolesLookupTest.js @@ -1,5 +1,6 @@ const {accounts, contract} = require('@openzeppelin/test-environment') const {time, expectRevert} = require('@openzeppelin/test-helpers') +const {initTokenStaking} = require('./helpers/initContracts') const {grantTokens} = require('./helpers/grantTokens') const { delegateStake, @@ -10,10 +11,6 @@ const {createSnapshot, restoreSnapshot} = require('./helpers/snapshot') const assert = require('chai').assert const KeepToken = contract.fromArtifact('KeepToken') -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const TokenStaking = contract.fromArtifact('TokenStaking') -const GrantStaking = contract.fromArtifact('GrantStaking') -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow') const TokenGrant = contract.fromArtifact('TokenGrant') const KeepRegistry = contract.fromArtifact('KeepRegistry') const PermissiveStakingPolicy = contract.fromArtifact('PermissiveStakingPolicy') @@ -47,7 +44,6 @@ describe('RolesLookup', () => { let token, tokenGrant, tokenStaking, - tokenStakingEscrow, tokenGrantStakingPolicy, managedGrantFactory, lookup @@ -56,30 +52,16 @@ describe('RolesLookup', () => { const registry = await KeepRegistry.new({from: deployer}) token = await KeepToken.new({from: deployer}) tokenGrant = await TokenGrant.new(token.address, {from: deployer}) - tokenStakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: deployer} - ) - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: deployer})).address - ) - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: deployer})).address - ); - tokenStaking = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, tokenGrant.address, - tokenStakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: deployer} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ) - await tokenStakingEscrow.transferOwnership(tokenStaking.address, {from: deployer}) + tokenStaking = stakingContracts.tokenStaking tokenGrantStakingPolicy = await PermissiveStakingPolicy.new() managedGrantFactory = await ManagedGrantFactory.new( token.address, diff --git a/solidity/test/helpers/initContracts.js b/solidity/test/helpers/initContracts.js index 63831e29bf..e10ab1369e 100644 --- a/solidity/test/helpers/initContracts.js +++ b/solidity/test/helpers/initContracts.js @@ -10,8 +10,57 @@ const KeepRegistry = contract.fromArtifact("KeepRegistry"); const KeepToken = contract.fromArtifact('KeepToken'); const TokenGrant = contract.fromArtifact('TokenGrant'); const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const GrantStaking = contract.fromArtifact('GrantStaking'); +const Locks = contract.fromArtifact('Locks'); + +async function initTokenStaking( + tokenAddress, + tokenGrantAddress, + keepRegistryAddress, + stakeInitializationPeriod, + stakeUndelegationPeriod, + TokenStakingEscrow, + TokenStaking +) { + let tokenStakingEscrow = await TokenStakingEscrow.new( + tokenAddress, + tokenGrantAddress, + {from: accounts[0]} + ) + + await TokenStaking.detectNetwork() + await TokenStaking.link( + 'MinimumStakeSchedule', + (await MinimumStakeSchedule.new({from: accounts[0]})).address + ) + await TokenStaking.link( + 'GrantStaking', + (await GrantStaking.new({from: accounts[0]})).address + ) + await TokenStaking.link( + 'Locks', + (await Locks.new({from: accounts[0]})).address + ) + + let tokenStaking = await TokenStaking.new( + tokenAddress, + tokenGrantAddress, + tokenStakingEscrow.address, + keepRegistryAddress, + stakeInitializationPeriod, + stakeUndelegationPeriod, + {from: accounts[0]} + ); + await tokenStakingEscrow.transferOwnership( + tokenStaking.address, + {from: accounts[0]} + ); + + return { + tokenStakingEscrow: tokenStakingEscrow, + tokenStaking: tokenStaking + }; +} async function initContracts(TokenStaking, KeepRandomBeaconService, KeepRandomBeaconServiceImplV1, KeepRandomBeaconOperator) { @@ -29,29 +78,16 @@ async function initContracts(TokenStaking, KeepRandomBeaconService, registry = await KeepRegistry.new({from: accounts[0]}); // Initialize staking contract - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ) - stakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: accounts[0]} - ) - const grantStakingInfoLib = await GrantStaking.new({from: accounts[0]}); - await TokenStaking.detectNetwork(); - await TokenStaking.link("GrantStaking", grantStakingInfoLib.address); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, tokenGrant.address, - stakingEscrow.address, registry.address, stakeInitializationPeriod, stakeUndelegationPeriod, - {from: accounts[0]} - ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + contract.fromArtifact('TokenStakingEscrow'), + TokenStaking + ) + stakingContract = stakingContracts.tokenStaking // Initialize Keep Random Beacon service contract serviceContractImplV1 = await KeepRandomBeaconServiceImplV1.new({from: accounts[0]}); @@ -113,4 +149,5 @@ async function initContracts(TokenStaking, KeepRandomBeaconService, }; }; -module.exports = initContracts; +module.exports.initTokenStaking = initTokenStaking; +module.exports.initContracts = initContracts; \ No newline at end of file diff --git a/solidity/test/random_beacon_operator/TestDkgMisbehavior.js b/solidity/test/random_beacon_operator/TestDkgMisbehavior.js index 2112221337..e7edf90c7d 100644 --- a/solidity/test/random_beacon_operator/TestDkgMisbehavior.js +++ b/solidity/test/random_beacon_operator/TestDkgMisbehavior.js @@ -2,7 +2,7 @@ const blsData = require("../helpers/data") const { contract, web3, accounts } = require("@openzeppelin/test-environment") const { time } = require("@openzeppelin/test-helpers") var assert = require('chai').assert -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const sign = require('../helpers/signature') const stakeDelegate = require('../helpers/stakeDelegate') const packTicket = require('../helpers/packTicket') diff --git a/solidity/test/random_beacon_operator/TestGroupSelection.js b/solidity/test/random_beacon_operator/TestGroupSelection.js index a144c2f999..c0ab643009 100644 --- a/solidity/test/random_beacon_operator/TestGroupSelection.js +++ b/solidity/test/random_beacon_operator/TestGroupSelection.js @@ -1,7 +1,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") const assert = require('chai').assert -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const stakeDelegate = require('../helpers/stakeDelegate') const packTicket = require('../helpers/packTicket') const generateTickets = require('../helpers/generateTickets') diff --git a/solidity/test/random_beacon_operator/TestInitialization.js b/solidity/test/random_beacon_operator/TestInitialization.js index 573b6d2d78..7266a27795 100644 --- a/solidity/test/random_beacon_operator/TestInitialization.js +++ b/solidity/test/random_beacon_operator/TestInitialization.js @@ -1,4 +1,4 @@ -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const {contract} = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_operator/TestManageServiceContracts.js b/solidity/test/random_beacon_operator/TestManageServiceContracts.js index a9ddb6c948..01d5f2746c 100644 --- a/solidity/test/random_beacon_operator/TestManageServiceContracts.js +++ b/solidity/test/random_beacon_operator/TestManageServiceContracts.js @@ -1,6 +1,6 @@ const {contract, accounts} = require("@openzeppelin/test-environment") const {expectRevert} = require("@openzeppelin/test-helpers") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const blsData = require("../helpers/data.js") diff --git a/solidity/test/random_beacon_operator/TestPricingRewards.js b/solidity/test/random_beacon_operator/TestPricingRewards.js index 82cca0f8bd..5a4f068804 100644 --- a/solidity/test/random_beacon_operator/TestPricingRewards.js +++ b/solidity/test/random_beacon_operator/TestPricingRewards.js @@ -1,6 +1,5 @@ const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') -const assert = require('chai').assert +const {initContracts} = require('../helpers/initContracts') const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {time} = require("@openzeppelin/test-helpers") diff --git a/solidity/test/random_beacon_operator/TestPricingRewardsWithdraw.js b/solidity/test/random_beacon_operator/TestPricingRewardsWithdraw.js index cd097635ff..1aa01633ec 100644 --- a/solidity/test/random_beacon_operator/TestPricingRewardsWithdraw.js +++ b/solidity/test/random_beacon_operator/TestPricingRewardsWithdraw.js @@ -1,4 +1,4 @@ -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const {expectRevert, time} = require("@openzeppelin/test-helpers") const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const {contract, accounts, web3} = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_operator/TestPublishDkgResult.js b/solidity/test/random_beacon_operator/TestPublishDkgResult.js index f6d4c3d981..ade23406dc 100644 --- a/solidity/test/random_beacon_operator/TestPublishDkgResult.js +++ b/solidity/test/random_beacon_operator/TestPublishDkgResult.js @@ -3,7 +3,7 @@ const sign = require('../helpers/signature'); const packTicket = require('../helpers/packTicket') const generateTickets = require('../helpers/generateTickets'); const shuffleArray = require('../helpers/shuffle'); -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") const { contract, accounts, web3 } = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_operator/TestRelayEntry.js b/solidity/test/random_beacon_operator/TestRelayEntry.js index e181007ded..78958a3732 100644 --- a/solidity/test/random_beacon_operator/TestRelayEntry.js +++ b/solidity/test/random_beacon_operator/TestRelayEntry.js @@ -1,5 +1,5 @@ const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {expectRevert} = require("@openzeppelin/test-helpers") const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") diff --git a/solidity/test/random_beacon_operator/TestRelayEntryTimeout.js b/solidity/test/random_beacon_operator/TestRelayEntryTimeout.js index 03377c2e81..7460ac384d 100644 --- a/solidity/test/random_beacon_operator/TestRelayEntryTimeout.js +++ b/solidity/test/random_beacon_operator/TestRelayEntryTimeout.js @@ -1,6 +1,6 @@ const blsData = require("../helpers/data.js") const {expectRevert, time} = require("@openzeppelin/test-helpers") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const {contract, accounts, web3} = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_operator/TestSlashing.js b/solidity/test/random_beacon_operator/TestSlashing.js index 976bd08dd1..9dea33acd1 100644 --- a/solidity/test/random_beacon_operator/TestSlashing.js +++ b/solidity/test/random_beacon_operator/TestSlashing.js @@ -1,5 +1,5 @@ const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const { createSnapshot, restoreSnapshot } = require("../helpers/snapshot.js") const { contract, accounts, web3 } = require("@openzeppelin/test-environment") const { expectRevert, time } = require("@openzeppelin/test-helpers") diff --git a/solidity/test/random_beacon_service/TestPricing.js b/solidity/test/random_beacon_service/TestPricing.js index 8d00c9ba60..a632944593 100644 --- a/solidity/test/random_beacon_service/TestPricing.js +++ b/solidity/test/random_beacon_service/TestPricing.js @@ -1,6 +1,6 @@ const stakeDelegate = require('../helpers/stakeDelegate') const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {time} = require("@openzeppelin/test-helpers") diff --git a/solidity/test/random_beacon_service/TestPricingDkg.js b/solidity/test/random_beacon_service/TestPricingDkg.js index 4a0123130a..314eb50cc3 100644 --- a/solidity/test/random_beacon_service/TestPricingDkg.js +++ b/solidity/test/random_beacon_service/TestPricingDkg.js @@ -1,7 +1,7 @@ const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const stakeAndGenesis = require('../helpers/stakeAndGenesis') const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {contract, accounts, web3} = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_service/TestPricingFees.js b/solidity/test/random_beacon_service/TestPricingFees.js index 2b4d07c681..444595832d 100644 --- a/solidity/test/random_beacon_service/TestPricingFees.js +++ b/solidity/test/random_beacon_service/TestPricingFees.js @@ -1,6 +1,6 @@ const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {contract, accounts} = require("@openzeppelin/test-environment") diff --git a/solidity/test/random_beacon_service/TestRelayRequestCallback.js b/solidity/test/random_beacon_service/TestRelayRequestCallback.js index ac10f490a3..9e4aa65567 100644 --- a/solidity/test/random_beacon_service/TestRelayRequestCallback.js +++ b/solidity/test/random_beacon_service/TestRelayRequestCallback.js @@ -1,7 +1,7 @@ const stakeAndGenesis = require('../helpers/stakeAndGenesis') const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const {contract, web3, accounts} = require("@openzeppelin/test-environment") const {expectRevert} = require("@openzeppelin/test-helpers") diff --git a/solidity/test/random_beacon_service/TestSelectOperator.js b/solidity/test/random_beacon_service/TestSelectOperator.js index 37f6d9537a..b751fb8232 100644 --- a/solidity/test/random_beacon_service/TestSelectOperator.js +++ b/solidity/test/random_beacon_service/TestSelectOperator.js @@ -1,6 +1,6 @@ const {expectRevert} = require("@openzeppelin/test-helpers") const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {contract, accounts} = require("@openzeppelin/test-environment") const OperatorContract = contract.fromArtifact('KeepRandomBeaconOperatorStub') diff --git a/solidity/test/random_beacon_service/TestViaProxy.js b/solidity/test/random_beacon_service/TestViaProxy.js index a39003075d..a4a14d9169 100644 --- a/solidity/test/random_beacon_service/TestViaProxy.js +++ b/solidity/test/random_beacon_service/TestViaProxy.js @@ -1,6 +1,6 @@ const {createSnapshot, restoreSnapshot} = require("../helpers/snapshot.js") const blsData = require("../helpers/data.js") -const initContracts = require('../helpers/initContracts') +const {initContracts} = require('../helpers/initContracts') const assert = require('chai').assert const {contract, web3, accounts} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") diff --git a/solidity/test/token_grant/TestManagedGrant.js b/solidity/test/token_grant/TestManagedGrant.js index f2ae5951f3..65ffe53c25 100644 --- a/solidity/test/token_grant/TestManagedGrant.js +++ b/solidity/test/token_grant/TestManagedGrant.js @@ -2,6 +2,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") const {grantTokens} = require('../helpers/grantTokens'); const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); +const {initTokenStaking} = require('../helpers/initContracts') const BN = web3.utils.BN const chai = require('chai') @@ -9,10 +10,6 @@ chai.use(require('bn-chai')(BN)) const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy"); @@ -23,7 +20,7 @@ const ManagedGrant = contract.fromArtifact('ManagedGrant'); const nullAddress = '0x0000000000000000000000000000000000000000'; describe('TokenGrant/ManagedGrant', () => { - let token, registry, tokenGrant, staking; + let token, registry, tokenGrant, staking, stakingEscrow; let permissivePolicy, minimumPolicy; let minimumStake, grantAmount; @@ -52,30 +49,17 @@ describe('TokenGrant/ManagedGrant', () => { token = await KeepToken.new({from: grantCreator}); registry = await KeepRegistry.new({from: grantCreator}); tokenGrant = await TokenGrant.new(token.address, {from: grantCreator}); - stakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: grantCreator} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: grantCreator})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: grantCreator})).address - ); - staking = await TokenStaking.new( + const contracts = await initTokenStaking( token.address, tokenGrant.address, - stakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: grantCreator} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); - await stakingEscrow.transferOwnership(staking.address, {from: grantCreator}) + staking = contracts.tokenStaking; + stakingEscrow = contracts.tokenStakingEscrow; await tokenGrant.authorizeStakingContract(staking.address, {from: grantCreator}); diff --git a/solidity/test/token_grant/TestManagedGrantFactory.js b/solidity/test/token_grant/TestManagedGrantFactory.js index 964cc76274..565f01f785 100644 --- a/solidity/test/token_grant/TestManagedGrantFactory.js +++ b/solidity/test/token_grant/TestManagedGrantFactory.js @@ -1,6 +1,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); +const {initTokenStaking} = require('../helpers/initContracts'); const BN = web3.utils.BN const chai = require('chai') @@ -8,10 +9,6 @@ chai.use(require('bn-chai')(BN)) const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy"); @@ -43,30 +40,16 @@ describe('TokenGrant/ManagedGrantFactory', () => { token = await KeepToken.new({from: grantCreator}); tokenGrant = await TokenGrant.new(token.address, {from: grantCreator}); registry = await KeepRegistry.new({from: grantCreator}); - stakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: grantCreator} - ); - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: grantCreator})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: grantCreator})).address - ); - staking = await TokenStaking.new( + const contracts = await initTokenStaking( token.address, tokenGrant.address, - stakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: grantCreator} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); - await stakingEscrow.transferOwnership(staking.address, {from: grantCreator}) + staking = contracts.tokenStaking; await tokenGrant.authorizeStakingContract(staking.address, {from: grantCreator}); diff --git a/solidity/test/token_grant/TestStakingPolicy.js b/solidity/test/token_grant/TestStakingPolicy.js index 27028adf34..877481dc7c 100644 --- a/solidity/test/token_grant/TestStakingPolicy.js +++ b/solidity/test/token_grant/TestStakingPolicy.js @@ -1,15 +1,15 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") -const BN = web3.utils.BN -const chai = require('chai') -chai.use(require('bn-chai')(BN)) -const expect = chai.expect -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); +const {initTokenStaking} = require('../helpers/initContracts'); + const PermissiveStakingPolicy = contract.fromArtifact('PermissiveStakingPolicy'); const GuaranteedMinimumStakingPolicy = contract.fromArtifact('GuaranteedMinimumStakingPolicy'); const AdaptiveStakingPolicy = contract.fromArtifact('AdaptiveStakingPolicy'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); + +const BN = web3.utils.BN +const chai = require('chai') +chai.use(require('bn-chai')(BN)) +const expect = chai.expect describe('PermissiveStakingPolicy', async () => { let policy; @@ -75,22 +75,16 @@ describe('GuaranteedMinimumStakingPolicy', async () => { function tokens(n) { return minimumStake.divn(100000).muln(n); } before(async () => { - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new()).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new()).address - ); - stakingContract = await TokenStaking.new( + const contracts = await initTokenStaking( accounts[9], accounts[9], accounts[9], - accounts[9], - 0, 0 + 0, + 0, + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); + stakingContract = contracts.tokenStaking; policy = await GuaranteedMinimumStakingPolicy.new(stakingContract.address); minimumStake = await stakingContract.minimumStake(); largeGrant = tokens(500000); // 5x minimum stake @@ -244,22 +238,16 @@ describe('AdaptiveStakingPolicy', async () => { function tokens(n) { return minimumStake.divn(100000).muln(n); } before(async () => { - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new()).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new()).address - ); - stakingContract = await TokenStaking.new( - accounts[9], + let contracts = await initTokenStaking( accounts[9], accounts[9], accounts[9], - 0, 0 + 0, + 0, + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); + stakingContract = contracts.tokenStaking; cliffPolicy = await AdaptiveStakingPolicy.new( stakingContract.address, minimumMultiplier, diff --git a/solidity/test/token_grant/TestTokenGrant.js b/solidity/test/token_grant/TestTokenGrant.js index 6752a23b88..eea34a9cdc 100644 --- a/solidity/test/token_grant/TestTokenGrant.js +++ b/solidity/test/token_grant/TestTokenGrant.js @@ -1,14 +1,13 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") +const {initTokenStaking} = require('../helpers/initContracts') const {grantTokens} = require('../helpers/grantTokens'); + const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const PermissiveStakingPolicy = contract.fromArtifact('PermissiveStakingPolicy'); + const assert = require('chai').assert describe('TokenGrant', function() { @@ -23,30 +22,17 @@ describe('TokenGrant', function() { token = await KeepToken.new({from: accounts[0]}); registry = await KeepRegistry.new({from: accounts[0]}); grantContract = await TokenGrant.new(token.address, {from: accounts[0]}); - stakingEscrow = await TokenStakingEscrow.new( - token.address, - grantContract.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: accounts[0]})).address - ); - stakingContract = await TokenStaking.new( + const contracts = await initTokenStaking( token.address, grantContract.address, - stakingEscrow.address, registry.address, time.duration.days(1), time.duration.days(30), - {from: accounts[0]} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + stakingContract = contracts.tokenStaking; + await grantContract.authorizeStakingContract(stakingContract.address, {from: accounts[0]}); permissivePolicy = await PermissiveStakingPolicy.new() amount = web3.utils.toBN(100); @@ -56,7 +42,6 @@ describe('TokenGrant', function() { }); it("should grant tokens correctly", async function() { - let amount = web3.utils.toBN(1000000000); let unlockingDuration = time.duration.days(30); let start = await time.latest(); @@ -115,7 +100,6 @@ describe('TokenGrant', function() { }); it("token holder should be able to grant it's tokens to a grantee.", async function() { - let grant_manager_starting_balance = await token.balanceOf.call(grant_manager); let id = await grantTokens( diff --git a/solidity/test/token_grant/TestTokenGrantRevoke.js b/solidity/test/token_grant/TestTokenGrantRevoke.js index ea919414dd..c83f3ad927 100644 --- a/solidity/test/token_grant/TestTokenGrantRevoke.js +++ b/solidity/test/token_grant/TestTokenGrantRevoke.js @@ -1,6 +1,7 @@ const { delegateStakeFromGrant } = require('../helpers/delegateStake') const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") +const {initTokenStaking} = require('../helpers/initContracts') const {grantTokens} = require('../helpers/grantTokens'); const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); @@ -10,17 +11,14 @@ chai.use(require('bn-chai')(BN)) const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const GuaranteedMinimumStakingPolicy = contract.fromArtifact("GuaranteedMinimumStakingPolicy"); describe('TokenGrant/Revoke', function() { - let tokenContract, registryContract, grantContract, stakingContract, minimumPolicy; + let tokenContract, registryContract, grantContract, + stakingContract, stakingEscrowContract, minimumPolicy; const tokenOwner = accounts[0], grantee = accounts[1], @@ -44,30 +42,17 @@ describe('TokenGrant/Revoke', function() { tokenContract = await KeepToken.new( {from: accounts[0]}); grantContract = await TokenGrant.new(tokenContract.address, {from: accounts[0]}); registryContract = await KeepRegistry.new( {from: accounts[0]}); - stakingEscrow = await TokenStakingEscrow.new( - tokenContract.address, - grantContract.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: accounts[0]})).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( tokenContract.address, grantContract.address, - stakingEscrow.address, - registryContract.address, - initializationPeriod, + registryContract.address, + initializationPeriod, undelegationPeriod, - {from: accounts[0]} - ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking + stakingEscrowContract = stakingContracts.tokenStakingEscrow minimumStake = await stakingContract.minimumStake(); grantAmount = minimumStake.muln(10); @@ -274,7 +259,7 @@ describe('TokenGrant/Revoke', function() { await grantContract.withdrawRevoked(grantId, { from: tokenOwner }); const grantManagerKeepBalanceMidWithdraw = await tokenContract.balanceOf(tokenOwner); await grantContract.cancelRevokedStake(operator, { from: tokenOwner }); - await stakingEscrow.withdrawRevoked(operator, { from: tokenOwner }); + await stakingEscrowContract.withdrawRevoked(operator, { from: tokenOwner }); const grantManagerKeepBalanceAfterWithdraw = await tokenContract.balanceOf(tokenOwner); expect(grantManagerKeepBalanceMidWithdraw).to.eq.BN( @@ -315,7 +300,7 @@ describe('TokenGrant/Revoke', function() { await time.increase(undelegationPeriod.add(time.duration.minutes(5))); await grantContract.recoverStake(operator, { from: tokenOwner }); - await stakingEscrow.withdrawRevoked(operator, { from: tokenOwner }); + await stakingEscrowContract.withdrawRevoked(operator, { from: tokenOwner }); const grantManagerKeepBalanceAfterWithdraw = await tokenContract.balanceOf(tokenOwner); expect(grantManagerKeepBalanceMidWithdraw).to.eq.BN( diff --git a/solidity/test/token_grant/TestTokenGrantStake.js b/solidity/test/token_grant/TestTokenGrantStake.js index 207b8b39ee..e5cf680004 100644 --- a/solidity/test/token_grant/TestTokenGrantStake.js +++ b/solidity/test/token_grant/TestTokenGrantStake.js @@ -1,6 +1,7 @@ const { delegateStake, delegateStakeFromGrant } = require('../helpers/delegateStake') const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") +const {initTokenStaking} = require('../helpers/initContracts') const {grantTokens} = require('../helpers/grantTokens'); const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); @@ -15,10 +16,6 @@ const expect = chai.expect const timeRoundMargin = time.duration.minutes(1) const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const PermissiveStakingPolicy = contract.fromArtifact("PermissiveStakingPolicy"); @@ -55,30 +52,17 @@ describe('TokenGrant/Stake', function() { tokenContract = await KeepToken.new({from: accounts[0]}); grantContract = await TokenGrant.new(tokenContract.address, {from: accounts[0]}); registryContract = await KeepRegistry.new({from: accounts[0]}); - stakingEscrow = await TokenStakingEscrow.new( - tokenContract.address, - grantContract.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: accounts[0]})).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( tokenContract.address, grantContract.address, - stakingEscrow.address, registryContract.address, initializationPeriod, undelegationPeriod, - {from: accounts[0]} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + stakingContract = stakingContracts.tokenStaking; + stakingEscrowContract = stakingContracts.tokenStakingEscrow; await grantContract.authorizeStakingContract(stakingContract.address, {from: accounts[0]}); @@ -222,7 +206,7 @@ describe('TokenGrant/Stake', function() { await time.increaseTo(undelegatedAt.add(undelegationPeriod).addn(1)) await grantContract.recoverStake(operatorOne); - let availableForStaking = await stakingEscrow.depositedAmount(operatorOne); + let availableForStaking = await stakingEscrowContract.depositedAmount(operatorOne); let operatorBalance = await stakingContract.balanceOf.call(operatorOne); expect(availableForStaking).to.eq.BN( @@ -240,7 +224,7 @@ describe('TokenGrant/Stake', function() { await grantContract.cancelStake(operatorOne, {from: grantee}); - let availableForStaking = await stakingEscrow.depositedAmount.call(operatorOne) + let availableForStaking = await stakingEscrowContract.depositedAmount.call(operatorOne) let operatorBalance = await stakingContract.balanceOf.call(operatorOne); expect(availableForStaking).to.eq.BN( @@ -261,7 +245,7 @@ describe('TokenGrant/Stake', function() { await grantContract.cancelStake(operatorOne, {from: grantee}); - let availableForStaking = await stakingEscrow.depositedAmount.call(operatorOne) + let availableForStaking = await stakingEscrowContract.depositedAmount.call(operatorOne) let operatorBalance = await stakingContract.balanceOf.call(operatorOne); expect(availableForStaking).to.eq.BN( @@ -318,7 +302,7 @@ describe('TokenGrant/Stake', function() { tx = await grantContract.undelegate(operatorOne, {from: grantee}) await time.increaseTo(createdAt.add(grantUnlockingDuration)) await grantContract.recoverStake(operatorOne, {from: grantee}); - await stakingEscrow.withdraw(operatorOne, {from: grantee}); + await stakingEscrowContract.withdraw(operatorOne, {from: grantee}); await expectRevert( delegateLiquid(grantee, operatorOne, minimumStake), diff --git a/solidity/test/token_grant/TestTokenGrantWithdraw.js b/solidity/test/token_grant/TestTokenGrantWithdraw.js index f45e9c1a62..41681b710c 100644 --- a/solidity/test/token_grant/TestTokenGrantWithdraw.js +++ b/solidity/test/token_grant/TestTokenGrantWithdraw.js @@ -1,6 +1,7 @@ const { delegateStakeFromGrant } = require('../helpers/delegateStake') const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") +const {initTokenStaking} = require('../helpers/initContracts') const {grantTokens} = require('../helpers/grantTokens'); const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); @@ -10,10 +11,6 @@ chai.use(require('bn-chai')(BN)) const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const TokenGrant = contract.fromArtifact('TokenGrant'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const PermissiveStakingPolicy = contract.fromArtifact('PermissiveStakingPolicy'); @@ -41,30 +38,16 @@ describe('TokenGrant/Withdraw', function() { tokenContract = await KeepToken.new({from: accounts[0]}); grantContract = await TokenGrant.new(tokenContract.address, {from: accounts[0]}); registryContract = await KeepRegistry.new({from: accounts[0]}); - stakingEscrow = await TokenStakingEscrow.new( - tokenContract.address, - grantContract.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: accounts[0]})).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( tokenContract.address, grantContract.address, - stakingEscrow.address, registryContract.address, - initializationPeriod, + initializationPeriod, undelegationPeriod, - {from: accounts[0]} - ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking await grantContract.authorizeStakingContract(stakingContract.address, {from: accounts[0]}); grantAmount = (await stakingContract.minimumStake()).muln(10); diff --git a/solidity/test/token_stake/TestDelegatedAuthority.js b/solidity/test/token_stake/TestDelegatedAuthority.js index fa298a7140..84e1563270 100644 --- a/solidity/test/token_stake/TestDelegatedAuthority.js +++ b/solidity/test/token_stake/TestDelegatedAuthority.js @@ -1,6 +1,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); +const {initTokenStaking} = require('../helpers/initContracts') const BN = web3.utils.BN const chai = require('chai') @@ -9,10 +10,6 @@ const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); const TokenGrant = contract.fromArtifact('TokenGrant'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const DelegatedAuthorityStub = contract.fromArtifact("DelegatedAuthorityStub"); @@ -38,29 +35,16 @@ describe("TokenStaking/DelegatedAuthority", async () => { token = await KeepToken.new({from: accounts[0]}); grant = await TokenGrant.new(token.address, {from: accounts[0]}); registry = await KeepRegistry.new(); - escrow = await TokenStakingEscrow.new( - token.address, - grant.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new()).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new()).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, grant.address, - escrow.address, registry.address, initializationPeriod, - undelegationPeriod - ); - await escrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + undelegationPeriod, + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking; minimumStake = await stakingContract.minimumStake(); stakingAmount = minimumStake.muln(20); diff --git a/solidity/test/TestLockUtils.js b/solidity/test/token_stake/TestLockUtils.js similarity index 97% rename from solidity/test/TestLockUtils.js rename to solidity/test/token_stake/TestLockUtils.js index 41c00e33fb..1eafdf2065 100644 --- a/solidity/test/TestLockUtils.js +++ b/solidity/test/token_stake/TestLockUtils.js @@ -1,5 +1,5 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment"); -const {createSnapshot, restoreSnapshot} = require('./helpers/snapshot.js'); +const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot.js'); const BN = web3.utils.BN const chai = require('chai') diff --git a/solidity/test/token_stake/TestMinimumStake.js b/solidity/test/token_stake/TestMinimumStake.js index bc4d223221..a233f59cb1 100644 --- a/solidity/test/token_stake/TestMinimumStake.js +++ b/solidity/test/token_stake/TestMinimumStake.js @@ -1,7 +1,8 @@ const {contract, web3} = require("@openzeppelin/test-environment") const {time} = require("@openzeppelin/test-helpers") -const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); +const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot'); +const {initTokenStaking} = require('../helpers/initContracts') const BN = web3.utils.BN const chai = require('chai') @@ -10,10 +11,6 @@ const expect = chai.expect const KeepToken = contract.fromArtifact('KeepToken'); const TokenGrant = contract.fromArtifact('TokenGrant'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); describe('TokenStaking/MinimumStake', function() { @@ -29,25 +26,16 @@ describe('TokenStaking/MinimumStake', function() { token = await KeepToken.new(); grant = await TokenGrant.new(token.address); registry = await KeepRegistry.new(); - escrow = await TokenStakingEscrow.new(token.address, grant.address); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new()).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new()).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, grant.address, - escrow.address, registry.address, initializationPeriod, - undelegationPeriod - ); - await escrow.transferOwnership(stakingContract.address); + undelegationPeriod, + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking; keepDecimals = web3.utils.toBN(10).pow(web3.utils.toBN(18)); }); diff --git a/solidity/test/token_stake/TestPunishment.js b/solidity/test/token_stake/TestPunishment.js index 5a6a8b6027..211018c379 100644 --- a/solidity/test/token_stake/TestPunishment.js +++ b/solidity/test/token_stake/TestPunishment.js @@ -1,14 +1,11 @@ const { contract, accounts, web3 } = require("@openzeppelin/test-environment") const { expectRevert, time } = require("@openzeppelin/test-helpers") const { createSnapshot, restoreSnapshot } = require('../helpers/snapshot'); +const {initTokenStaking} = require('../helpers/initContracts') const stakeDelegate = require('../helpers/stakeDelegate') const KeepToken = contract.fromArtifact('KeepToken'); const TokenGrant = contract.fromArtifact('TokenGrant'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); const BN = web3.utils.BN @@ -35,29 +32,16 @@ describe('TokenStaking/Punishment', () => { token = await KeepToken.new({ from: owner }) tokenGrant = await TokenGrant.new(token.address, {from: owner}) registry = await KeepRegistry.new({ from: owner }) - stakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: owner} - ) - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: owner})).address - ) - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: owner})).address - ) - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, tokenGrant.address, - stakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - { from: owner } + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ) + stakingContract = stakingContracts.tokenStaking; await registry.setRegistryKeeper(registryKeeper, { from: owner }) diff --git a/solidity/test/token_stake/TestStakingGrant.js b/solidity/test/token_stake/TestStakingGrant.js index 5ed75a4bd2..d3214470f3 100644 --- a/solidity/test/token_stake/TestStakingGrant.js +++ b/solidity/test/token_stake/TestStakingGrant.js @@ -1,6 +1,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") -const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot'); +const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot') +const {initTokenStaking} = require('../helpers/initContracts') const {grantTokens, grantTokensToManagedGrant} = require('../helpers/grantTokens'); const { @@ -10,14 +11,10 @@ const { const KeepToken = contract.fromArtifact('KeepToken') const KeepRegistry = contract.fromArtifact('KeepRegistry') -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') -const GrantStaking = contract.fromArtifact('GrantStaking') -const TokenStaking = contract.fromArtifact('TokenStaking') const TokenGrant = contract.fromArtifact('TokenGrant') const PermissiveStakingPolicy = contract.fromArtifact('PermissiveStakingPolicy') const ManagedGrantFactory = contract.fromArtifact('ManagedGrantFactory') const ManagedGrant = contract.fromArtifact('ManagedGrant') -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow') const BN = web3.utils.BN const chai = require('chai') @@ -65,34 +62,18 @@ describe('TokenStaking/StakingGrant', () => { {from: deployer} ) - tokenStakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: deployer} - ) - - await TokenStaking.detectNetwork() - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: deployer})).address - ) - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: deployer})).address - ) - tokenStaking = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, tokenGrant.address, - tokenStakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: deployer} - ) - await tokenStakingEscrow.transferOwnership( - tokenStaking.address, - {from: deployer} + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') ) + tokenStaking = stakingContracts.tokenStaking; + tokenStakingEscrow = stakingContracts.tokenStakingEscrow; + await tokenGrant.authorizeStakingContract(tokenStaking.address, { from: grantManager, }) diff --git a/solidity/test/token_stake/TestTokenStake.js b/solidity/test/token_stake/TestTokenStake.js index 9510508734..cb0842a7a4 100644 --- a/solidity/test/token_stake/TestTokenStake.js +++ b/solidity/test/token_stake/TestTokenStake.js @@ -1,6 +1,7 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment") const {expectRevert, time} = require("@openzeppelin/test-helpers") -const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot'); +const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot') +const {initTokenStaking} = require('../helpers/initContracts') const BN = web3.utils.BN const chai = require('chai') @@ -13,11 +14,7 @@ const expect = chai.expect const timeRoundMargin = time.duration.minutes(1) const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule'); const TokenGrant = contract.fromArtifact('TokenGrant'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); describe('TokenStaking', function() { @@ -38,30 +35,17 @@ describe('TokenStaking', function() { token = await KeepToken.new({from: accounts[0]}); tokenGrant = await TokenGrant.new(token.address, {from: accounts[0]}); registry = await KeepRegistry.new({from: accounts[0]}); - stakingEscrow = await TokenStakingEscrow.new( - token.address, - tokenGrant.address, - {from: accounts[0]} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: accounts[0]})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: accounts[0]})).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, tokenGrant.address, - stakingEscrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: accounts[0]} - ); - await stakingEscrow.transferOwnership(stakingContract.address, {from: accounts[0]}); + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking; + await registry.approveOperatorContract(operatorContract, {from: accounts[0]}); minimumStake = await stakingContract.minimumStake(); diff --git a/solidity/test/token_stake/TestTokenStakeLock.js b/solidity/test/token_stake/TestTokenStakeLock.js index fef8825eae..848e738f88 100644 --- a/solidity/test/token_stake/TestTokenStakeLock.js +++ b/solidity/test/token_stake/TestTokenStakeLock.js @@ -1,13 +1,10 @@ const {contract, accounts, web3} = require("@openzeppelin/test-environment"); const {expectRevert, time} = require("@openzeppelin/test-helpers"); const {createSnapshot, restoreSnapshot} = require('../helpers/snapshot.js'); +const {initTokenStaking} = require('../helpers/initContracts') const KeepToken = contract.fromArtifact('KeepToken'); -const MinimumStakeSchedule = contract.fromArtifact('MinimumStakeSchedule') const TokenGrant = contract.fromArtifact('TokenGrant'); -const TokenStaking = contract.fromArtifact('TokenStaking'); -const GrantStaking = contract.fromArtifact('GrantStaking'); -const TokenStakingEscrow = contract.fromArtifact('TokenStakingEscrow'); const KeepRegistry = contract.fromArtifact("KeepRegistry"); describe('TokenStaking/Lock', () => { @@ -32,30 +29,17 @@ describe('TokenStaking/Lock', () => { token = await KeepToken.new({from: owner}); grant = await TokenGrant.new(token.address, {from: owner}); registry = await KeepRegistry.new({from: owner}); - escrow = await TokenStakingEscrow.new( - token.address, - grant.address, - {from: owner} - ); - await TokenStaking.detectNetwork(); - await TokenStaking.link( - 'MinimumStakeSchedule', - (await MinimumStakeSchedule.new({from: owner})).address - ); - await TokenStaking.link( - 'GrantStaking', - (await GrantStaking.new({from: owner})).address - ); - stakingContract = await TokenStaking.new( + const stakingContracts = await initTokenStaking( token.address, grant.address, - escrow.address, registry.address, initializationPeriod, undelegationPeriod, - {from: owner} - ); - await escrow.transferOwnership(stakingContract.address, {from: owner}); + contract.fromArtifact('TokenStakingEscrow'), + contract.fromArtifact('TokenStaking') + ) + stakingContract = stakingContracts.tokenStaking; + await registry.approveOperatorContract(operatorContract, {from: owner}); await registry.approveOperatorContract(operatorContract2, {from: owner}); @@ -153,13 +137,12 @@ describe('TokenStaking/Lock', () => { it("should not permit locks that exceed the maximum lock duration", async () => { await time.increaseTo(initializationPeriod.add(createdAt).addn(1)) - let maximumDuration = await stakingContract.maximumLockDuration(); - let longPeriod = maximumDuration.addn(1); + const maximumDuration = time.duration.days(200); + const longPeriod = maximumDuration.addn(1); await expectRevert( stakingContract.lockStake(operator, longPeriod, {from: operatorContract}), "Lock duration too long" ) - }) })