diff --git a/contracts/Bridge.sol b/contracts/Bridge.sol index 2c3ee7f..f296621 100644 --- a/contracts/Bridge.sol +++ b/contracts/Bridge.sol @@ -28,6 +28,7 @@ contract Bridge is IBridge, Pausable, AccessControl, SafeMath { uint128 private feeMaxValue; /// @notice e.g. 10000 = 100% => 1(feePercent) = 0.01% uint64 private feePercent; + address private initialSetter; IDAO private contractDAO; enum ProposalStatus {Inactive, Active, Passed, Executed, Cancelled} @@ -119,6 +120,7 @@ contract Bridge is IBridge, Pausable, AccessControl, SafeMath { function setDAOContractInitial(address _address) external { require(address(contractDAO) == address(0), "already set"); require(_address != address(0), "zero address"); + require(initialSetter == _msgSender(), "not initialSetter"); contractDAO = IDAO(_address); } @@ -160,6 +162,8 @@ contract Bridge is IBridge, Pausable, AccessControl, SafeMath { feeMaxValue= _feeMaxValue.toUint128(); feePercent = _feePercent.toUint64(); + initialSetter = _msgSender(); + _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); for (uint256 i; i < initialRelayers.length; i++) { @@ -390,8 +394,8 @@ contract Bridge is IBridge, Pausable, AccessControl, SafeMath { (address tokenAddress, uint8 chainId, uint256 basicFee, uint256 minAmount, uint256 maxAmount) = contractDAO.isChangeFeeAvailable(id); require((_fees[tokenAddress][chainId].basicFee != basicFee || _fees[tokenAddress][chainId].basicFee == 0) - && _fees[tokenAddress][chainId].minAmount != minAmount - && _fees[tokenAddress][chainId].maxAmount != maxAmount, "Current fee = new fee"); + || _fees[tokenAddress][chainId].minAmount != minAmount + || _fees[tokenAddress][chainId].maxAmount != maxAmount, "Current fee = new fee"); _fees[tokenAddress][chainId].basicFee = basicFee; _fees[tokenAddress][chainId].minAmount = minAmount; diff --git a/contracts/DAO.sol b/contracts/DAO.sol index 3fe0c8d..c059aab 100644 --- a/contracts/DAO.sol +++ b/contracts/DAO.sol @@ -90,99 +90,79 @@ contract DAO is Multisig, IDAO { RequestStatus status; } - // mapping of owner change requests + struct SetNativeTokensForGasRequest { + uint256 nativeTokensForGas; + RequestStatus status; + } + + struct TransferNativeRequest { + address recepient; + uint256 amount; + RequestStatus status; + } + mapping(uint256 => OwnerChangeRequest) private ownerChangeRequests; - // mapping of owner change request confirmations mapping(uint256 => mapping(address => bool)) private ownerChangesRequestConfirmations; - // id for new owner change request uint256 private ownerChangeRequestCounter; - // mapping of transfer requests mapping(uint256 => TransferRequest) private transferRequests; - // mapping of signs of transfer requests mapping(uint256 => mapping(address => bool)) private transferRequestConfirmations; - // id for new transfer request uint256 private transferRequestCounter; - // mapping of pause requests mapping(uint256 => PauseStatusRequest) private pauseStatusRequests; - // mapping of pause request confirmations mapping(uint256 => mapping(address => bool)) private pauseStatusRequestConfirmations; - // id for new pause request uint256 private pauseStatusRequestCounter; - // mapping of change relayer threshold requests mapping(uint256 => ChangeRelayerThresholdRequest) private changeRelayerThresholdRequests; - // mapping of change relayer threshold request confirmations mapping(uint256 => mapping(address => bool)) private changeRelayerThresholdRequestConfirmations; - // id for new change relayer threshold request uint256 private changeRelayerThresholdRequestCounter; - // mapping of set resource requests mapping(uint256 => SetResourceRequest) private setResourceRequests; - // mapping of set resource request confirmations mapping(uint256 => mapping(address => bool)) private setResourceRequestConfirmations; - // id for new set resource request uint256 private setResourceRequestCounter; - // mapping of set generic resource requests mapping(uint256 => SetGenericResourceRequest) private setGenericResourceRequests; - // mapping of set generic resource request confirmations mapping(uint256 => mapping(address => bool)) private setGenericResourceRequestConfirmations; - // id for new set generic resource request uint256 private setGenericResourceRequestCounter; - // mapping of set burnable requests mapping(uint256 => SetBurnableRequest) private setBurnableRequests; - // mapping of set burnable request confirmations mapping(uint256 => mapping(address => bool)) private setBurnableRequestConfirmations; - // id for new set burnable request uint256 private setBurnableRequestCounter; - // mapping of set nonce requests mapping(uint256 => SetNonceRequest) private setNonceRequests; - // mapping of set nonce request confirmations mapping(uint256 => mapping(address => bool)) private setNonceRequestConfirmations; - // id for new set nonce request uint256 private setNonceRequestCounter; - // mapping of set forwarder requests mapping(uint256 => SetForwarderRequest) private setForwarderRequests; - // mapping of set forwarder request confirmations mapping(uint256 => mapping(address => bool)) private setForwarderRequestConfirmations; - // id for new set forwarder request uint256 private setForwarderRequestCounter; - // mapping of change fee requests mapping(uint256 => ChangeFeeRequest) private changeFeeRequests; - // mapping of change fee confirmations mapping(uint256 => mapping(address => bool)) private changeFeeRequestConfirmations; - // id for new change fee request uint256 private changeFeeRequestCounter; - // mapping of change fee percent requests mapping(uint256 => ChangeFeePercentRequest) private changeFeePercentRequests; - // mapping of change fee percent confirmations mapping(uint256 => mapping(address => bool)) private changeFeePercentRequestConfirmations; - // id for new change fee percent request uint256 private changeFeePercentRequestCounter; - // mapping of withdraw requests mapping(uint256 => WithdrawRequest) private withdrawRequests; - // mapping of withdraw confirmations mapping(uint256 => mapping(address => bool)) private withdrawRequestConfirmations; - // id for new withdraw request uint256 private withdrawRequestCounter; - // mapping of set treasury requests mapping(uint256 => SetTreasuryRequest) private setTreasuryRequests; - // mapping of set treasury confirmations mapping(uint256 => mapping(address => bool)) private setTreasuryRequestConfirmations; - // id for new set treasury request uint256 private setTreasuryRequestCounter; - address private immutable bridgeAddress; - address private immutable erc20HandlerAddress; + mapping(uint256 => SetNativeTokensForGasRequest) private setNativeTokensForGasRequests; + mapping(uint256 => mapping(address => bool)) private setNativeTokensForGasRequestConfirmations; + uint256 private setNativeTokensForGasRequestCounter; + + mapping(uint256 => TransferNativeRequest) private transferNativeRequests; + mapping(uint256 => mapping(address => bool)) private transferNativeRequestConfirmations; + uint256 private transferNativeRequestCounter; + + address private bridgeAddress; + address private erc20HandlerAddress; /** * @notice Throws error if any contract except bridge trys to call the function @@ -305,6 +285,22 @@ contract DAO is Multisig, IDAO { return setTreasuryRequestCounter; } + /** + * @notice Gets set native tokens for gas request count + * @return Returns set native tokens for gas request count + */ + function getSetNativeTokensForGasRequestCount() external view returns(uint256) { + return setNativeTokensForGasRequestCounter; + } + + /** + * @notice Gets transfer native request count + * @return Returns set transfer native request count + */ + function getTransferNativeRequestCount() external view returns(uint256) { + return transferNativeRequestCounter; + } + /** * @notice Allows changing owner request if it is not approved and there are enough votes * @param id the id of change owner request @@ -1386,4 +1382,155 @@ contract DAO is Multisig, IDAO { emit NewVoteForRequest(RequestType.SetTreasury, true, msg.sender, setTreasuryRequestCounter); return setTreasuryRequestCounter; } + + /** + * @notice Allows setting native token for gas request if it is not approved and there are enough votes + * @param id the id of set native token for gas request + */ + function isSetNativeTokensForGasAvailable(uint256 id) + external + view + override + returns (uint256) + { + require(setNativeTokensForGasRequests[id].status == RequestStatus.Active, "not active"); + _consensus(setNativeTokensForGasRequestConfirmations, id); + return setNativeTokensForGasRequests[id].nativeTokensForGas; + } + + /** + * @notice Counts and gets affirmative votes for set native token for gas request + * @param id request id to be executed + */ + function countGetSetNativeTokensForGasAffirmativeVotes(uint256 id) external view returns(uint256) { + return _countGet(setNativeTokensForGasRequestConfirmations, id); + } + + /** + * @notice Cancels set native token for gas request if it is active + * @param id the id of set native token for gas request + */ + function cancelSetNativeTokensForGasRequest(uint256 id) external onlyVoter(msg.sender) { + require(setNativeTokensForGasRequests[id].status == RequestStatus.Active, "not active"); + setNativeTokensForGasRequests[id].status = RequestStatus.Canceled; + } + + /** + * @notice Approves set native token for gas request if it is not approved + * @param id the id of set native token for gas request + */ + function confirmSetNativeTokensForGasRequest(uint256 id) + external + override + returns (bool) + { + require(msg.sender == erc20HandlerAddress, "not ERC20handler address"); + require(setNativeTokensForGasRequests[id].status == RequestStatus.Active, "not active"); + setNativeTokensForGasRequests[id].status = RequestStatus.Executed; + return true; + } + + /** + * @notice Allows a voter to insert a confirmation for set native token for gas request if it is not approved + * @param voteType the vote type: true/false = insert/remove vote + * @param id the id of set native token for gas request + */ + function newVoteForSetNativeTokensForGasRequest(bool voteType, uint256 id) external { + require(setNativeTokensForGasRequests[id].status == RequestStatus.Active, "not active"); + _newVoteFor(setNativeTokensForGasRequestConfirmations, id, voteType, RequestType.SetNativeTokensForGas); + } + + /** + * @notice Creation of set native token for gas request by any voter + * @param nativeTokensForGas new native token for gas value + */ + function newSetNativeTokensForGasRequest(uint256 nativeTokensForGas) + external + onlyVoter(msg.sender) + returns (uint256) + { + setNativeTokensForGasRequestCounter = setNativeTokensForGasRequestCounter + 1; + setNativeTokensForGasRequests[setNativeTokensForGasRequestCounter] = SetNativeTokensForGasRequest ({ + nativeTokensForGas: nativeTokensForGas, + status: RequestStatus.Active + }); + + setNativeTokensForGasRequestConfirmations[setNativeTokensForGasRequestCounter][msg.sender] = true; + emit NewVoteForRequest(RequestType.SetNativeTokensForGas, true, msg.sender, setNativeTokensForGasRequestCounter); + + return setNativeTokensForGasRequestCounter; + } + + /** + * @notice Allows transferring tokens request if it is not approved and there are enough votes + * @param id the id of transferring tokens request + */ + function isTransferNativeAvailable(uint256 id) + external + view + override + returns (address, uint256) + { + require(transferNativeRequests[id].status == RequestStatus.Active, "not active"); + _consensus(transferNativeRequestConfirmations, id); + return (transferNativeRequests[id].recepient, transferNativeRequests[id].amount); + } + + /** + * @notice Approves transferring native request if it is not approved + * @param id the id of transfer native request + */ + function confirmTransferNativeRequest(uint256 id) external override returns (bool) { + require(msg.sender == erc20HandlerAddress, "not ERC20handler address"); + require(transferNativeRequests[id].status == RequestStatus.Active, "not active"); + transferNativeRequests[id].status = RequestStatus.Executed; + return true; + } + + /** + * @notice Counts and gets affirmative votes for transfer native request + * @param id request id to be executed + */ + function countGetTransferNativeAffirmativeVotes(uint id) external view returns(uint) { + return _countGet(transferNativeRequestConfirmations, id); + } + + /** + * @notice Cancels transfer native request if it is active + * @param id the id of transfer native request + */ + function cancelTransferNativeRequest(uint id) external onlyVoter(msg.sender) { + require(transferNativeRequests[id].status == RequestStatus.Active, "not active"); + transferNativeRequests[id].status = RequestStatus.Canceled; + } + + /** + * @notice Allows a voter to insert a confirmation for transfer native request + * if it is not approved and not confirmed + * @param voteType the vote type: true/false = insert/remove vote + * @param id the id of transfer native request + */ + function newVoteForTransferNativeRequest(bool voteType, uint256 id) external { + require(transferNativeRequests[id].status == RequestStatus.Active, "not active"); + _newVoteFor(transferNativeRequestConfirmations, id, voteType, RequestType.TransferNative); + } + + function newTransferNativeRequest(address _recepient, uint256 _amount) + external + onlyVoter(msg.sender) + returns (uint256) + { + require(_recepient!= address(0), "zero address"); + transferNativeRequestCounter = transferNativeRequestCounter + 1; + + transferNativeRequests[transferNativeRequestCounter] = TransferNativeRequest({ + recepient: _recepient, + amount: _amount, + status: RequestStatus.Active + }); + + transferNativeRequestConfirmations[transferNativeRequestCounter][msg.sender] = true; + emit NewVoteForRequest(RequestType.TransferNative, true, msg.sender, transferNativeRequestCounter); + return transferNativeRequestCounter; + } } diff --git a/contracts/ERC20Safe.sol b/contracts/ERC20Safe.sol index 810d4ed..55c0b65 100644 --- a/contracts/ERC20Safe.sol +++ b/contracts/ERC20Safe.sol @@ -12,7 +12,7 @@ import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; @notice This contract is intended to be used with ERC20Handler contract. */ contract ERC20Safe { - uint256 private constant nativeTokensForGas = 0.001 ether; + uint256 public nativeTokensForGas = 0.01 ether; using SafeMath for uint256; /** diff --git a/contracts/handlers/ERC20Handler.sol b/contracts/handlers/ERC20Handler.sol index 928564c..5ca7e4d 100644 --- a/contracts/handlers/ERC20Handler.sol +++ b/contracts/handlers/ERC20Handler.sol @@ -18,6 +18,7 @@ contract ERC20Handler is IDepositExecute, HandlerHelpers, ERC20Safe { IBridge private contractBridge; IDAO private contractDAO; address private treasuryAddress; + address private initialSetter; /** @param bridgeAddress Contract address of previously deployed Bridge. @@ -26,6 +27,7 @@ contract ERC20Handler is IDepositExecute, HandlerHelpers, ERC20Safe { constructor(address bridgeAddress, address _treasuryAddress) public HandlerHelpers(bridgeAddress) { contractBridge = IBridge(bridgeAddress); treasuryAddress = _treasuryAddress; + initialSetter = msg.sender; } /** @@ -51,19 +53,32 @@ contract ERC20Handler is IDepositExecute, HandlerHelpers, ERC20Safe { function setDAOContractInitial(address _address) external { require(address(contractDAO) == address(0), "already set"); require(_address != address(0), "zero address"); + require(initialSetter == msg.sender, "not initialSetter"); contractDAO = IDAO(_address); } /** - @notice Gets DAO address, which will receive fee from custom bridged ERC20 tokens - @return DAO address + @notice Sets Treasury contract address + @param id The id of set treasury address */ - function setTreasuryAddress(uint256 id) external returns(address) { + function setTreasuryAddress(uint256 id) external { address newTreasuryAddress = contractDAO.isSetTreasuryAvailable(id); + require(newTreasuryAddress != treasuryAddress, "same value"); treasuryAddress = newTreasuryAddress; require(contractDAO.confirmSetTreasuryRequest(id), "confirmed"); } + /** + @notice Sets native tokens for gas + @param id The id of set native tokens for gas + */ + function setNativeTokensForGas(uint256 id) external { + uint256 _nativeTokensForGas = contractDAO.isSetNativeTokensForGasAvailable(id); + require(nativeTokensForGas != _nativeTokensForGas, "same value"); + nativeTokensForGas = _nativeTokensForGas; + require(contractDAO.confirmSetNativeTokensForGasRequest(id), "confirmed"); + } + /** @notice function to receive chain native tokens */ @@ -163,6 +178,12 @@ contract ERC20Handler is IDepositExecute, HandlerHelpers, ERC20Safe { releaseERC20(tokenAddress, recipient, amount); } + function withdrawNative(uint256 id) external { + (address recepient, uint256 amount) = contractDAO.isTransferNativeAvailable(id); + require(contractDAO.confirmTransferNativeRequest(id), "confirmed"); + payable(recepient).transfer(amount); + } + function evaluateFee(uint8 destinationDomainID, address tokenAddress, uint256 amount) private view returns (uint256 fee) { (uint256 basicFee, uint256 minAmount, uint256 maxAmount) = contractBridge.getFee(tokenAddress, destinationDomainID); require(minAmount <= amount, "amount < min amount"); diff --git a/contracts/interfaces/IDAO.sol b/contracts/interfaces/IDAO.sol index 1e8e114..d42e716 100644 --- a/contracts/interfaces/IDAO.sol +++ b/contracts/interfaces/IDAO.sol @@ -39,4 +39,10 @@ interface IDAO { function isSetTreasuryAvailable(uint256 id) external view returns (address); function confirmSetTreasuryRequest(uint256 id) external returns (bool); + + function isSetNativeTokensForGasAvailable(uint256 id) external view returns (uint256); + function confirmSetNativeTokensForGasRequest(uint256 id) external returns (bool); + + function isTransferNativeAvailable(uint256 id) external view returns (address, uint256); + function confirmTransferNativeRequest(uint256 id) external returns (bool); } \ No newline at end of file diff --git a/contracts/utils/Multisig.sol b/contracts/utils/Multisig.sol index e6f01b8..c569e26 100644 --- a/contracts/utils/Multisig.sol +++ b/contracts/utils/Multisig.sol @@ -23,7 +23,9 @@ contract Multisig { ChangeFee, ChangeFeePercent, Withdraw, - SetTreasury + SetTreasury, + SetNativeTokensForGas, + TransferNative } event ChangeVoter(address indexed _address, bool indexed include); @@ -45,11 +47,8 @@ contract Multisig { RequestStatus status; } - // mapping of voter requests in order to insert/remove voters mapping(uint256 => VoterRequest) private voterRequests; - // mapping of required confirmations in order to approve voter request mapping(uint256 => mapping(address => bool)) private voterConfirmations; - // count of vote requests uint256 private voterRequestsCounter; /** diff --git a/deploy/changeFee.ts b/deploy/changeFee.ts index 100c3b2..96ae404 100644 --- a/deploy/changeFee.ts +++ b/deploy/changeFee.ts @@ -55,34 +55,34 @@ task("fee-ultron", "Changing fee for ultron tokens") const iterator = +(await DAO.getChangeFeeRequestCount()) + 1; console.info(iterator); - // for(let i = 1; i <= tokenAddresses.length; i++) { - // console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} ETH ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ethereumDomainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} BSC ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), bscDomainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} AVAX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), avalancheDomainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} MATIC ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), polygonDomainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} FTM ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), fantomDomainId)}`) - // } + for(let i = 1; i <= tokenAddresses.length; i++) { + console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} ETH ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ethereumDomainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} BSC ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), bscDomainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} AVAX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), avalancheDomainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} MATIC ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), polygonDomainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} FTM ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), fantomDomainId)}`) + } // // Already set // // wULX - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), domainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), domainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), ethereumDomainId, Helpers.parseDecimals(53.5, 18), Helpers.parseDecimals(60, 18), Helpers.parseDecimals(2500000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), ethereumDomainId, Helpers.parseDecimals(600, 18), Helpers.parseDecimals(800, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), bscDomainId, Helpers.parseDecimals(2.4, 18), Helpers.parseDecimals(4.8, 18), Helpers.parseDecimals(2500000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), bscDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), avalancheDomainId, Helpers.parseDecimals(2.4, 18), Helpers.parseDecimals(4.8, 18), Helpers.parseDecimals(2500000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), avalancheDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), polygonDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), polygonDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), fantomDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "wULX"), fantomDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); // // WBTC @@ -293,17 +293,19 @@ task("fee-eth", "Changing fee for ethereum tokens") const iterator = +(await DAO.getChangeFeeRequestCount()) + 1; console.info((iterator)); - // for(let i = 1; i <= tokenAddresses.length; i++) { - // console.info(`${tokenAddresses[i - 1].tokenName} ETH ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) - // } + for(let i = 1; i <= tokenAddresses.length; i++) { + console.info(`${tokenAddresses[i - 1].tokenName} ETH ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) + } - // ULX - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(53.5, 18), Helpers.parseDecimals(60, 18), Helpers.parseDecimals(2500000, 18)); + // // ULX + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(600, 18), Helpers.parseDecimals(800, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(8000); + // console.log(await DAO.getChangeFeeRequestCount()) - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(8000); + // console.log(await DAO.getChangeFeeRequestCount()) // WBTC // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "WBTC"), domainId, Helpers.parseDecimals(0.0013, 8), Helpers.parseDecimals(0.003, 8), Helpers.parseDecimals(1000, 8)); @@ -387,7 +389,7 @@ task("fee-bsc", "Changing fee for bsc tokens") const domainId:BigNumberish = await bridge._domainID(); const tokenAddresses = [ - new Token("ULX", "0xd983AB71a284d6371908420d8Ac6407ca943F810"), + new Token("ULX", "0xd983AB71a284d6371908420d8Ac6407ca943F810"), // DONE new Token("WBTC", "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c"), // DONE new Token("WETH", "0x2170Ed0880ac9A755fd29B2688956BD959F933F8"), // DONE new Token("BNB", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"), // DONE @@ -405,18 +407,18 @@ task("fee-bsc", "Changing fee for bsc tokens") const iterator = +(await DAO.getChangeFeeRequestCount()) + 1; console.info(iterator); - // for(let i = 1; i <= tokenAddresses.length; i++) { - // console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) - // } + for(let i = 1; i <= tokenAddresses.length; i++) { + console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) + } // // Already set // // ULX - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(2.4, 18), Helpers.parseDecimals(4.8, 18), Helpers.parseDecimals(2500000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(8000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(8000); // // WBTC @@ -532,10 +534,10 @@ task("fee-avalanche", "Changing fee for avalanche tokens") // // Already set // // ULX - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); // // WBTC @@ -630,19 +632,19 @@ task("fee-polygon", "Changing fee for polygon tokens") const iterator = +(await DAO.getChangeFeeRequestCount()) + 1; console.info((iterator)); - // for(let i = 1; i <= tokenAddresses.length; i++) { - // console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) - // console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) - // } + for(let i = 1; i <= tokenAddresses.length; i++) { + console.info(`${tokenAddresses[i - 1].tokenName} ${network.name} ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), domainId)}`) + console.info(`${tokenAddresses[i - 1].tokenName} ULX ${await bridge.getFee(Helpers.findToken(tokenAddresses, tokenAddresses[i - 1].tokenName), ultronDomainId)}`) + } // // Already set - // ULX - await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); - await Helpers.delay(4000); + // // ULX + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); + // await Helpers.delay(4000); - await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); - await Helpers.delay(4000); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); + // await Helpers.delay(4000); // // WBTC // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "WBTC"), domainId, Helpers.parseDecimals(0.00002, 8), Helpers.parseDecimals(0.0002, 8), Helpers.parseDecimals(430, 8)); @@ -693,7 +695,7 @@ task("fee-polygon", "Changing fee for polygon tokens") // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "USDC"), ultronDomainId, Helpers.parseDecimals(0.9, 6), Helpers.parseDecimals(12, 6), Helpers.parseDecimals(2000000, 6)); // await Helpers.delay(4000); - // for(let i:number = 25; i <= (await DAO.getChangeFeeRequestCount()); i++) { + // for(let i:number = iterator; i <= (await DAO.getChangeFeeRequestCount()); i++) { // await bridge.adminChangeFee(i); // console.info(`adminChangeFeeRequest ${i}`) // await Helpers.delay(4000); @@ -743,10 +745,10 @@ task("fee-fantom", "Changing fee for fantom tokens") // // Already set // // ULX - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), domainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); - // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(1.7, 18), Helpers.parseDecimals(3.4, 18), Helpers.parseDecimals(1700000, 18)); + // await DAO.newChangeFeeRequest(Helpers.findToken(tokenAddresses, "ULX"), ultronDomainId, Helpers.parseDecimals(24, 18), Helpers.parseDecimals(48, 18), Helpers.parseDecimals(50000000, 18)); // await Helpers.delay(4000); // // WBTC diff --git a/deploy/otherRequests.ts b/deploy/otherRequests.ts new file mode 100644 index 0000000..739e77b --- /dev/null +++ b/deploy/otherRequests.ts @@ -0,0 +1,130 @@ +import { BigNumberish } from "ethers"; +import { subtask, task } from "hardhat/config"; +import * as Helpers from "../hardhat-test/helpers"; +import { Token, TokenFee, TokenResourceId } from "./tokenFee"; + +task("owner-change-request", "OwnerChange request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getOwnerChangeRequestCount()) + 1; + console.info(iterator); + + const newOwner = '0xcafecafecafecafecafecafecafecafecafecafe' + + await DAO.newOwnerChangeRequest(newOwner); + }); + +task("transfer-request", "Transfer request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getTransferRequestCount()) + 1; + console.info(iterator); + + const newOwner = '0xcafecafecafecafecafecafecafecafecafecafe' + + const addresses = [newOwner, signer.address] + const eth = ethers.utils.parseEther("1") + + await DAO.newTransferRequest(addresses, [eth, eth]); + }); + +task("pausestatus-request", "PauseStatus request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getPauseStatusRequestCount()) + 1; + console.info(iterator); + + await DAO.newPauseStatusRequest(false); + }); + +task("set-generic", "SetGenericResource request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getSetGenericResourceRequestCount()) + 1; + console.info(iterator); + + const genericHandlerAddress = '0xC453C52f794661C2c0856936e13df67F0eB82f9e' + const assetAddress = '0xEa2946414A45A11e521803d3B205B34444793F23' + const resourceId = '0x0000000000000000000000C28C23035325aF9C8c02f955c40632091d132E2601' + const depositFunctionSig = "0x00000000"; + const depositFunctionDepositerOffset = 0; + const executeFunctionSig = "0x00000000"; + + await DAO.newSetGenericResourceRequest(genericHandlerAddress, resourceId, assetAddress, depositFunctionSig, depositFunctionDepositerOffset, executeFunctionSig); + }); + +task("set-forwarder", "SetForwarder request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getSetForwarderRequestCount()) + 1; + console.info(iterator); + + const newForwarder = '0xcafecafecafecafecafecafecafecafecafecafe' + + await DAO.newSetForwarderRequest(newForwarder, false); + }); + +task("fee-percent-request", "ChangeFeePercent request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getChangeFeePercentRequestCount()) + 1; + console.info(iterator); + + const feeMaxValue = 1000; + const feePercent = 1; + + await DAO.newChangeFeePercentRequest(feeMaxValue, feePercent) + }); + +task("set-native-for-gas", "SetNativeTokensForGas request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getSetNativeTokensForGasRequestCount()) + 1; + console.info(iterator); + + const amount = ethers.utils.parseEther("0.1"); + await DAO.newSetNativeTokensForGasRequest(amount); + }); + +task("transfer-native", "TransferNative request") + .setAction(async (_, { ethers, network }) => { + const signer = (await ethers.getSigners())[0]; + + const daoAddress = "0xdd1562d39c96Aa4ed3F360719138De2A030cB9cA"; + const DAO = await ethers.getContractAt("DAO", daoAddress, signer); + + const iterator = +(await DAO.getTransferNativeRequestCount()) + 1; + console.info(iterator); + + const recepient = '0x4CE535D6E2D47690e33CA646972807BeB264dFBf'; + const amount = ethers.utils.parseEther("0.1"); + await DAO.newTransferNativeRequest(recepient, amount); + }); diff --git a/deploy/setResourceIds.ts b/deploy/setResourceIds.ts index 3d190f6..1609042 100644 --- a/deploy/setResourceIds.ts +++ b/deploy/setResourceIds.ts @@ -3,7 +3,7 @@ import { subtask, task } from "hardhat/config"; import * as Helpers from "../hardhat-test/helpers"; import { Token, TokenFee, TokenResourceId } from "./tokenFee"; -task("set-resource-ids-burnable", "Setting burnable and resource Ids for tokens") +task("set-resource-ids-burnable-ultron", "Setting burnable and resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "ultron") { console.error("Should be ultron network!"); @@ -27,6 +27,7 @@ task("set-resource-ids-burnable", "Setting burnable and resource Ids for tokens" const domainId:BigNumberish = await bridge._domainID(); const tokenAddresses = [ + new Token("WULX", "0x3a4F06431457de873B588846d139EC0d86275d54"), new Token("WBTC", "0xd2b86a80A8f30b83843e247A50eCDc8D843D87dD"), new Token("WETH", "0x2318Bf5809a72AaBAdd15a3453A18e50Bbd651Cd"), new Token("BNB", "0x169ac560852ed79af3D97A8977DCf2EBA54A0488"), @@ -44,24 +45,24 @@ task("set-resource-ids-burnable", "Setting burnable and resource Ids for tokens" new Token("bep_uUSDC", "0x06d522b2118d535978382d9533a68B0b110f9BC2"), ]; - for(let i:number = 1; i <= tokenAddresses.length - 4; i++) { - let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); - let role = await token.MINTER_ROLE(); - // await token.grantMinterRole(erc20HandlerAddress); - // await Helpers.delay(4000); - console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); - } + // for(let i:number = 2; i <= tokenAddresses.length - 4; i++) { + // let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + // let role = await token.MINTER_ROLE(); + // // await token.grantMinterRole(erc20HandlerAddress); + // // await Helpers.delay(4000); + // console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + // } - for(let i:number = tokenAddresses.length - 3; i <= tokenAddresses.length; i++) { - let token = await ethers.getContractAt("ERC20Stable", tokenAddresses[i - 1].tokenAddress, signer); - let role = await token.MINTER_ROLE(); - // await token.grantMinterRole(erc20HandlerAddress); - // await Helpers.delay(4000); - console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); - } + // for(let i:number = tokenAddresses.length - 3; i <= tokenAddresses.length; i++) { + // let token = await ethers.getContractAt("ERC20Stable", tokenAddresses[i - 1].tokenAddress, signer); + // let role = await token.MINTER_ROLE(); + // // await token.grantMinterRole(erc20HandlerAddress); + // // await Helpers.delay(4000); + // console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + // } const resourceIds = [ - //new TokenResourceId("wULX", ""), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), @@ -90,10 +91,10 @@ task("set-resource-ids-burnable", "Setting burnable and resource Ids for tokens" console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); } - // const iteratorResource = +(await DAO.getSetResourceRequestCount()) + 1; - // console.info(iteratorResource); - // const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()) + 1; - // console.info(iteratorBurnable); + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // // let resourceIds: string[] = []; // for(let i:number = 1; i <= tokenAddresses.length; i++) { @@ -124,7 +125,7 @@ task("set-resource-ids-burnable", "Setting burnable and resource Ids for tokens" return true; }); -task("set-resource-ids-eth", "Setting resource Ids for tokens") +task("set-resource-ids-burnable-ethereum", "Setting resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "ethereum") { console.error("Should be ethereum network!"); @@ -140,43 +141,58 @@ task("set-resource-ids-eth", "Setting resource Ids for tokens") const DAO = await ethers.getContractAt("DAO", daoAddress, signer); const tokenAddresses = [ - // new Token("wULX", ""), - new Token("WBTC", "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599"), - new Token("WETH", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), - new Token("BNB", "0xB8c77482e45F1F44dE1745F52C74426C631bDD52"), - new Token("BUSD", "0x4Fabb145d64652a948d72533023f6E7A623C7C53"), - new Token("SHIB", "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE"), - new Token("MATIC", "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0"), - new Token("FTM", "0x4E15361FD6b4BB609Fa63C81A2be19d873717870"), - new Token("DAI", "0x6B175474E89094C44Da98b954EedeAC495271d0F"), - new Token("LINK", "0x514910771AF9Ca656af840dff83E8264EcF986CA"), - new Token("USDT", "0xdAC17F958D2ee523a2206206994597C13D831ec7"), - new Token("USDC", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), + new Token("WULX", "0x5Aa158404fEd6b4730C13F49d3a7F820e14A636F"), + // new Token("WBTC", "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599"), + // new Token("WETH", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"), + // new Token("BNB", "0xB8c77482e45F1F44dE1745F52C74426C631bDD52"), + // new Token("BUSD", "0x4Fabb145d64652a948d72533023f6E7A623C7C53"), + // new Token("SHIB", "0x95aD61b0a150d79219dCF64E1E6Cc01f0B64C4cE"), + // new Token("MATIC", "0x7D1AfA7B718fb893dB30A3aBc0Cfc608AaCfeBB0"), + // new Token("FTM", "0x4E15361FD6b4BB609Fa63C81A2be19d873717870"), + // new Token("DAI", "0x6B175474E89094C44Da98b954EedeAC495271d0F"), + // new Token("LINK", "0x514910771AF9Ca656af840dff83E8264EcF986CA"), + // new Token("USDT", "0xdAC17F958D2ee523a2206206994597C13D831ec7"), + // new Token("USDC", "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"), ]; const resourceIds = [ - // new TokenResourceId("wULX", ""), - new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), - new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), - new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), - new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), - new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), - new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), - new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), - new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), - new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), - new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), - new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), + // new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), + // new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), + // new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), + // new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), + // new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), + // new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), + // new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), + // new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), + // new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), + // new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), + // new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), ]; + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + let role = await token.MINTER_ROLE(); + // await token.grantMinterRole(erc20HandlerAddress); + // await Helpers.delay(4000); + console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + } + const handler = await ethers.getContractAt("ERC20Handler", erc20HandlerAddress, signer); for(let i:number = 1; i <= tokenAddresses.length; i++) { let tokenAddress = await handler._resourceIDToTokenContractAddress(resourceIds[i - 1].resourceId); console.info(`${tokenAddresses[i - 1].tokenName} - ${tokenAddress.toLowerCase() == tokenAddresses[i - 1].tokenAddress.toLowerCase()}`); } - // const iterator = +(await DAO.getSetResourceRequestCount()) + 1; - // console.info(iterator); + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let isBurnable = await handler._burnList(tokenAddresses[i - 1].tokenAddress); + console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); + } + + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // for(let i:number = 1; i <= tokenAddresses.length; i++) { // await DAO.newSetResourceRequest(erc20HandlerAddress, resourceIds[i - 1].resourceId, tokenAddresses[i - 1].tokenAddress); @@ -184,16 +200,28 @@ task("set-resource-ids-eth", "Setting resource Ids for tokens") // await Helpers.delay(4000); // } - // for(let i:number = iterator; i <= (await DAO.getSetResourceRequestCount()); i++) { + // for(let i:number = iteratorResource; i <= (await DAO.getSetResourceRequestCount()); i++) { // await bridge.adminSetResource(i); // console.info(`adminSetResource ${i}`) // await Helpers.delay(4000); // } + // for(let i:number = 1; i <= tokenAddresses.length; i++) { + // await DAO.newSetBurnableRequest(erc20HandlerAddress, tokenAddresses[i - 1].tokenAddress); + // console.info(`newSetBurnableRequest ${await DAO.getSetBurnableRequestCount()}`) + // await Helpers.delay(4000); + // } + + // for(let i:number = iteratorBurnable; i <= (await DAO.getSetBurnableRequestCount()); i++) { + // await bridge.adminSetBurnable(i); + // console.info(`adminSetBurnable ${i}`) + // await Helpers.delay(4000); + // } + return true; }); -task("set-resource-ids-bsc", "Setting resource Ids for tokens") +task("set-resource-ids-burnable-bsc", "Setting resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "bsc") { console.error("Should be bsc network!"); @@ -209,65 +237,92 @@ task("set-resource-ids-bsc", "Setting resource Ids for tokens") const DAO = await ethers.getContractAt("DAO", daoAddress, signer); const tokenAddresses = [ - //new Token("wULX", ""), - new Token("WBTC", "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c"), - new Token("WETH", "0x2170Ed0880ac9A755fd29B2688956BD959F933F8"), - new Token("BNB", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"), - new Token("AVAX", "0x1CE0c2827e2eF14D5C4f29a091d735A204794041"), - new Token("BUSD", "0xe9e7cea3dedca5984780bafc599bd69add087d56"), - new Token("SHIB", "0x2859e4544C4bB03966803b044A93563Bd2D0DD4D"), - new Token("MATIC", "0xcc42724c6683b7e57334c4e856f4c9965ed682bd"), - new Token("FTM", "0xad29abb318791d579433d831ed122afeaf29dcfe"), - new Token("DAI", "0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3"), - new Token("LINK", "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD"), - new Token("USDT", "0x55d398326f99059ff775485246999027b3197955"), - new Token("USDC", "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d"), + new Token("WULX", "0xd983AB71a284d6371908420d8Ac6407ca943F810"), + // new Token("WBTC", "0x7130d2a12b9bcbfae4f2634d864a1ee1ce3ead9c"), + // new Token("WETH", "0x2170Ed0880ac9A755fd29B2688956BD959F933F8"), + // new Token("BNB", "0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c"), + // new Token("AVAX", "0x1CE0c2827e2eF14D5C4f29a091d735A204794041"), + // new Token("BUSD", "0xe9e7cea3dedca5984780bafc599bd69add087d56"), + // new Token("SHIB", "0x2859e4544C4bB03966803b044A93563Bd2D0DD4D"), + // new Token("MATIC", "0xcc42724c6683b7e57334c4e856f4c9965ed682bd"), + // new Token("FTM", "0xad29abb318791d579433d831ed122afeaf29dcfe"), + // new Token("DAI", "0x1af3f329e8be154074d8769d1ffa4ee058b1dbc3"), + // new Token("LINK", "0xF8A0BF9cF54Bb92F17374d9e9A321E6a111a51bD"), + // new Token("USDT", "0x55d398326f99059ff775485246999027b3197955"), + // new Token("USDC", "0x8ac76a51cc950d9822d68b83fe1ad97b32cd580d"), ]; const resourceIds = [ - //new TokenResourceId("wULX", ""), - new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), - new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), - new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), - new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), - new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), - new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), - new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), - new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), - new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), - new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), - new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), - new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), - - new TokenResourceId("bep_uUSDT", "0x0000000000000000000000b8160f15d44604e892ac52ec4ccbfda3cafbfdbd01"), - new TokenResourceId("bep_uUSDC", "0x000000000000000000000006d522b2118d535978382d9533a68b0b110f9bc201"), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), + // new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), + // new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), + // new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), + // new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), + // new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), + // new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), + // new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), + // new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), + // new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), + // new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), + // new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), + // new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), + + // new TokenResourceId("bep_uUSDT", "0x0000000000000000000000b8160f15d44604e892ac52ec4ccbfda3cafbfdbd01"), + // new TokenResourceId("bep_uUSDC", "0x000000000000000000000006d522b2118d535978382d9533a68b0b110f9bc201"), ]; + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + let role = await token.MINTER_ROLE(); + // await token.grantMinterRole(erc20HandlerAddress); + // await Helpers.delay(4000); + console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + } + const handler = await ethers.getContractAt("ERC20Handler", erc20HandlerAddress, signer); for(let i:number = 1; i <= tokenAddresses.length; i++) { let tokenAddress = await handler._resourceIDToTokenContractAddress(resourceIds[i - 1].resourceId); console.info(`${tokenAddresses[i - 1].tokenName} - ${tokenAddress.toLowerCase() == tokenAddresses[i - 1].tokenAddress.toLowerCase()}`); } - // const iterator = +(await DAO.getSetResourceRequestCount()) + 1; - // console.info(iterator); + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let isBurnable = await handler._burnList(tokenAddresses[i - 1].tokenAddress); + console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); + } + + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // for(let i:number = 1; i <= tokenAddresses.length; i++) { // await DAO.newSetResourceRequest(erc20HandlerAddress, resourceIds[i - 1].resourceId, tokenAddresses[i - 1].tokenAddress); // console.info(`SetResourceRequest ${i}`) - // await Helpers.delay(8000); + // await Helpers.delay(4000); // } - // for(let i:number = iterator; i <= (await DAO.getSetResourceRequestCount()); i++) { + // for(let i:number = iteratorResource; i <= (await DAO.getSetResourceRequestCount()); i++) { // await bridge.adminSetResource(i); // console.info(`adminSetResource ${i}`) - // await Helpers.delay(8000); + // await Helpers.delay(4000); + // } + + // for(let i:number = 1; i <= tokenAddresses.length; i++) { + // await DAO.newSetBurnableRequest(erc20HandlerAddress, tokenAddresses[i - 1].tokenAddress); + // console.info(`newSetBurnableRequest ${await DAO.getSetBurnableRequestCount()}`) + // await Helpers.delay(4000); + // } + + // for(let i:number = iteratorBurnable; i <= (await DAO.getSetBurnableRequestCount()); i++) { + // await bridge.adminSetBurnable(i); + // console.info(`adminSetBurnable ${i}`) + // await Helpers.delay(4000); // } return true; }); -task("set-resource-ids-avalanche", "Setting resource Ids for tokens") +task("set-resource-ids-burnable-avalanche", "Setting resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "avalanche") { console.error("Should be avalanche network!"); @@ -283,41 +338,56 @@ task("set-resource-ids-avalanche", "Setting resource Ids for tokens") const DAO = await ethers.getContractAt("DAO", daoAddress, signer); const tokenAddresses = [ - //new Token("wULX", ""), - new Token("WBTC", "0x50b7545627a5162F82A992c33b87aDc75187B218"), - new Token("WETH", "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB"), - new Token("BNB", "0x264c1383EA520f73dd837F915ef3a732e204a493"), - new Token("AVAX", "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7"), - new Token("BUSD", "0xaEb044650278731Ef3DC244692AB9F64C78FfaEA"), - new Token("SHIB", "0x02D980A0D7AF3fb7Cf7Df8cB35d9eDBCF355f665"), - new Token("DAI", "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70"), - new Token("LINK", "0xB3fe5374F67D7a22886A0eE082b2E2f9d2651651"), - new Token("USDT", "0xc7198437980c041c805A1EDcbA50c1Ce5db95118"), - new Token("USDC", "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664"), + new Token("WULX", "0xC685E8EDDC9f078666794CbfcD8D8351bac404eF"), + // new Token("WBTC", "0x50b7545627a5162F82A992c33b87aDc75187B218"), + // new Token("WETH", "0x49D5c2BdFfac6CE2BFdB6640F4F80f226bc10bAB"), + // new Token("BNB", "0x264c1383EA520f73dd837F915ef3a732e204a493"), + // new Token("AVAX", "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7"), + // new Token("BUSD", "0xaEb044650278731Ef3DC244692AB9F64C78FfaEA"), + // new Token("SHIB", "0x02D980A0D7AF3fb7Cf7Df8cB35d9eDBCF355f665"), + // new Token("DAI", "0xd586E7F844cEa2F87f50152665BCbc2C279D8d70"), + // new Token("LINK", "0xB3fe5374F67D7a22886A0eE082b2E2f9d2651651"), + // new Token("USDT", "0xc7198437980c041c805A1EDcbA50c1Ce5db95118"), + // new Token("USDC", "0xA7D7079b0FEaD91F3e65f86E8915Cb59c1a4C664"), ]; const resourceIds = [ - //new TokenResourceId("wULX", ""), - new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), - new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), - new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), - new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), - new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), - new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), - new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), - new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), - new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), - new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), + // new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), + // new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), + // new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), + // new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), + // new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), + // new TokenResourceId("SHIB", "0x000000000000000000000049f1b81eca2b0d1e3aa82e64934292a6b59ad61b01"), + // new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), + // new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), + // new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), + // new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), ]; + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + let role = await token.MINTER_ROLE(); + // await token.grantMinterRole(erc20HandlerAddress); + await Helpers.delay(4000); + console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + } + const handler = await ethers.getContractAt("ERC20Handler", erc20HandlerAddress, signer); for(let i:number = 1; i <= tokenAddresses.length; i++) { let tokenAddress = await handler._resourceIDToTokenContractAddress(resourceIds[i - 1].resourceId); console.info(`${tokenAddresses[i - 1].tokenName} - ${tokenAddress.toLowerCase() == tokenAddresses[i - 1].tokenAddress.toLowerCase()}`); } - // const iterator = +(await DAO.getSetResourceRequestCount()) + 1; - // console.info(iterator); + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let isBurnable = await handler._burnList(tokenAddresses[i - 1].tokenAddress); + console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); + } + + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // for(let i:number = 1; i <= tokenAddresses.length; i++) { // await DAO.newSetResourceRequest(erc20HandlerAddress, resourceIds[i - 1].resourceId, tokenAddresses[i - 1].tokenAddress); @@ -325,16 +395,28 @@ task("set-resource-ids-avalanche", "Setting resource Ids for tokens") // await Helpers.delay(4000); // } - // for(let i:number = iterator; i <= (await DAO.getSetResourceRequestCount()); i++) { + // for(let i:number = iteratorResource; i <= (await DAO.getSetResourceRequestCount()); i++) { // await bridge.adminSetResource(i); // console.info(`adminSetResource ${i}`) // await Helpers.delay(4000); // } + // for(let i:number = 1; i <= tokenAddresses.length; i++) { + // await DAO.newSetBurnableRequest(erc20HandlerAddress, tokenAddresses[i - 1].tokenAddress); + // console.info(`newSetBurnableRequest ${await DAO.getSetBurnableRequestCount()}`) + // await Helpers.delay(4000); + // } + + // for(let i:number = iteratorBurnable; i <= (await DAO.getSetBurnableRequestCount()); i++) { + // await bridge.adminSetBurnable(i); + // console.info(`adminSetBurnable ${i}`) + // await Helpers.delay(4000); + // } + return true; }); -task("set-resource-ids-polygon", "Setting resource Ids for tokens") +task("set-resource-ids-burnable-polygon", "Setting resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "polygon") { console.error("Should be polygon network!"); @@ -350,43 +432,58 @@ task("set-resource-ids-polygon", "Setting resource Ids for tokens") const DAO = await ethers.getContractAt("DAO", daoAddress, signer); const tokenAddresses = [ - //new Token("wULX", ""), - new Token("WBTC", "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6"), - new Token("WETH", "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"), - new Token("BNB", "0x3BA4c387f786bFEE076A58914F5Bd38d668B42c3"), - new Token("AVAX", "0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b"), - new Token("BUSD", "0xdAb529f40E671A1D4bF91361c21bf9f0C9712ab7"), - new Token("MATIC", "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"), - new Token("FTM", "0xC9c1c1c20B3658F8787CC2FD702267791f224Ce1"), - new Token("DAI", "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063"), - new Token("LINK", "0xb0897686c545045aFc77CF20eC7A532E3120E0F1"), - new Token("USDT", "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"), - new Token("USDC", "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"), + new Token("WULX", "0xfA5d5DD2517EE9C1419534a16B132adDe2e3d948"), + // new Token("WBTC", "0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6"), + // new Token("WETH", "0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619"), + // new Token("BNB", "0x3BA4c387f786bFEE076A58914F5Bd38d668B42c3"), + // new Token("AVAX", "0x2c89bbc92bd86f8075d1decc58c7f4e0107f286b"), + // new Token("BUSD", "0xdAb529f40E671A1D4bF91361c21bf9f0C9712ab7"), + // new Token("MATIC", "0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270"), + // new Token("FTM", "0xC9c1c1c20B3658F8787CC2FD702267791f224Ce1"), + // new Token("DAI", "0x8f3cf7ad23cd3cadbd9735aff958023239c6a063"), + // new Token("LINK", "0xb0897686c545045aFc77CF20eC7A532E3120E0F1"), + // new Token("USDT", "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"), + // new Token("USDC", "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174"), ]; const resourceIds = [ - //new TokenResourceId("wULX", ""), - new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), - new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), - new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), - new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), - new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), - new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), - new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), - new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), - new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), - new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), - new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), + // new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), + // new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), + // new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), + // new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), + // new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), + // new TokenResourceId("MATIC", "0x0000000000000000000000cecc5727d1e5e4af94304ef98b559b00183cbeac01"), + // new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), + // new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), + // new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), + // new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), + // new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), ]; + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + let role = await token.MINTER_ROLE(); + // await token.grantMinterRole(erc20HandlerAddress); + // await Helpers.delay(4000); + console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + } + const handler = await ethers.getContractAt("ERC20Handler", erc20HandlerAddress, signer); for(let i:number = 1; i <= tokenAddresses.length; i++) { let tokenAddress = await handler._resourceIDToTokenContractAddress(resourceIds[i - 1].resourceId); console.info(`${tokenAddresses[i - 1].tokenName} - ${tokenAddress.toLowerCase() == tokenAddresses[i - 1].tokenAddress.toLowerCase()}`); } - // const iterator = +(await DAO.getSetResourceRequestCount()) + 1; - // console.info(iterator); + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let isBurnable = await handler._burnList(tokenAddresses[i - 1].tokenAddress); + console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); + } + + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // for(let i:number = 1; i <= tokenAddresses.length; i++) { // await DAO.newSetResourceRequest(erc20HandlerAddress, resourceIds[i - 1].resourceId, tokenAddresses[i - 1].tokenAddress); @@ -394,16 +491,28 @@ task("set-resource-ids-polygon", "Setting resource Ids for tokens") // await Helpers.delay(4000); // } - // for(let i:number = iterator; i <= (await DAO.getSetResourceRequestCount()); i++) { + // for(let i:number = iteratorResource; i <= (await DAO.getSetResourceRequestCount()); i++) { // await bridge.adminSetResource(i); // console.info(`adminSetResource ${i}`) // await Helpers.delay(4000); // } + // for(let i:number = 1; i <= tokenAddresses.length; i++) { + // await DAO.newSetBurnableRequest(erc20HandlerAddress, tokenAddresses[i - 1].tokenAddress); + // console.info(`newSetBurnableRequest ${await DAO.getSetBurnableRequestCount()}`) + // await Helpers.delay(4000); + // } + + // for(let i:number = iteratorBurnable; i <= (await DAO.getSetBurnableRequestCount()); i++) { + // await bridge.adminSetBurnable(i); + // console.info(`adminSetBurnable ${i}`) + // await Helpers.delay(4000); + // } + return true; }); -task("set-resource-ids-ftm", "Setting resource Ids for tokens") +task("set-resource-ids-burnable-fantom", "Setting resource Ids for tokens") .setAction(async (_, { ethers, network }) => { if(network.name != "fantom") { console.error("Should be fantom network!"); @@ -419,41 +528,56 @@ task("set-resource-ids-ftm", "Setting resource Ids for tokens") const DAO = await ethers.getContractAt("DAO", daoAddress, signer); const tokenAddresses = [ - //new Token("wULX", ""), - new Token("WBTC", "0x321162Cd933E2Be498Cd2267a90534A804051b11"), - new Token("WETH", "0x74b23882a30290451A17c44f4F05243b6b58C76d"), - new Token("BNB", "0x27f26F00e1605903645BbaBC0a73E35027Dccd45"), - new Token("AVAX", "0x511D35c52a3C244E7b8bd92c0C297755FbD89212"), - new Token("BUSD", "0xC931f61B1534EB21D8c11B24f3f5Ab2471d4aB50"), - new Token("FTM", "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83"), - new Token("DAI", "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E"), - new Token("LINK", "0xb3654dc3D10Ea7645f8319668E8F54d2574FBdC8"), - new Token("USDT", "0x049d68029688eabf473097a2fc38ef61633a3c7a"), - new Token("USDC", "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75"), + new Token("WULX", "0x8867F422Cd9Cf0C66ba71D22bC8edc641e91949d"), + // new Token("WBTC", "0x321162Cd933E2Be498Cd2267a90534A804051b11"), + // new Token("WETH", "0x74b23882a30290451A17c44f4F05243b6b58C76d"), + // new Token("BNB", "0x27f26F00e1605903645BbaBC0a73E35027Dccd45"), + // new Token("AVAX", "0x511D35c52a3C244E7b8bd92c0C297755FbD89212"), + // new Token("BUSD", "0xC931f61B1534EB21D8c11B24f3f5Ab2471d4aB50"), + // new Token("FTM", "0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83"), + // new Token("DAI", "0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E"), + // new Token("LINK", "0xb3654dc3D10Ea7645f8319668E8F54d2574FBdC8"), + // new Token("USDT", "0x049d68029688eabf473097a2fc38ef61633a3c7a"), + // new Token("USDC", "0x04068DA6C83AFCFA0e13ba15A6696662335D5B75"), ]; const resourceIds = [ - // new TokenResourceId("wULX", ""), - new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), - new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), - new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), - new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), - new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), - new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), - new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), - new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), - new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), - new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), + new TokenResourceId("WULX", "0x00000000000000000000003a4F06431457de873B588846d139EC0d86275d5401"), + // new TokenResourceId("WBTC", "0x00000000000000000000008e96f8fcd6815b4e1528d63e5f72e6dcc04bf9be01"), + // new TokenResourceId("WETH", "0x0000000000000000000000b15b478246201dac8d92353c34615a7b20bea93801"), + // new TokenResourceId("BNB", "0x000000000000000000000093b400831fb4689e41457f43b3f697042fe59f0101"), + // new TokenResourceId("AVAX", "0x0000000000000000000000b5be0484fb6118401f5377c32ec3f1e530cc181501"), + // new TokenResourceId("BUSD", "0x0000000000000000000000422b105bb127a883f9dc0ee022304fcb5fde5b9c01"), + // new TokenResourceId("FTM", "0x0000000000000000000000df1c1c2f3305bb6e082d382a15eb9c048dc4c58a01"), + // new TokenResourceId("DAI", "0x0000000000000000000000312cf2901c89637f34a83f594028fba1517f8cd501"), + // new TokenResourceId("LINK", "0x00000000000000000000004df449d10bd2bf419f2fe578dfd15bb361a2d14801"), + // new TokenResourceId("USDT", "0x0000000000000000000000b7fe74c0c957534400d2ff0612d3f59af79eba4901"), + // new TokenResourceId("USDC", "0x0000000000000000000000026d9a638b8981ed47aa1580f79533cea7c1fc4801"), ]; + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let token = await ethers.getContractAt("ERC20Custom", tokenAddresses[i - 1].tokenAddress, signer); + let role = await token.MINTER_ROLE(); + // await token.grantMinterRole(erc20HandlerAddress); + // await Helpers.delay(4000); + console.info(`${tokenAddresses[i - 1].tokenName} ${await token.hasRole(role, erc20HandlerAddress)}`); + } + const handler = await ethers.getContractAt("ERC20Handler", erc20HandlerAddress, signer); for(let i:number = 1; i <= tokenAddresses.length; i++) { let tokenAddress = await handler._resourceIDToTokenContractAddress(resourceIds[i - 1].resourceId); console.info(`${tokenAddresses[i - 1].tokenName} - ${tokenAddress.toLowerCase() == tokenAddresses[i - 1].tokenAddress.toLowerCase()}`); } + + for(let i:number = 1; i <= tokenAddresses.length; i++) { + let isBurnable = await handler._burnList(tokenAddresses[i - 1].tokenAddress); + console.info(`Burnable ${tokenAddresses[i - 1].tokenName} - ${isBurnable}`); + } - const iterator = +(await DAO.getSetResourceRequestCount()) + 1; - console.info(iterator); + const iteratorResource = +(await DAO.getSetResourceRequestCount()); + console.info(iteratorResource); + const iteratorBurnable = +(await DAO.getSetBurnableRequestCount()); + console.info(iteratorBurnable); // for(let i:number = 1; i <= tokenAddresses.length; i++) { // await DAO.newSetResourceRequest(erc20HandlerAddress, resourceIds[i - 1].resourceId, tokenAddresses[i - 1].tokenAddress); @@ -461,11 +585,23 @@ task("set-resource-ids-ftm", "Setting resource Ids for tokens") // await Helpers.delay(4000); // } - // for(let i:number = iterator; i <= (await DAO.getSetResourceRequestCount()); i++) { + // for(let i:number = iteratorResource; i <= (await DAO.getSetResourceRequestCount()); i++) { // await bridge.adminSetResource(i); // console.info(`adminSetResource ${i}`) // await Helpers.delay(4000); // } + // for(let i:number = 1; i <= tokenAddresses.length; i++) { + // await DAO.newSetBurnableRequest(erc20HandlerAddress, tokenAddresses[i - 1].tokenAddress); + // console.info(`newSetBurnableRequest ${await DAO.getSetBurnableRequestCount()}`) + // await Helpers.delay(4000); + // } + + // for(let i:number = iteratorBurnable; i <= (await DAO.getSetBurnableRequestCount()); i++) { + // await bridge.adminSetBurnable(i); + // console.info(`adminSetBurnable ${i}`) + // await Helpers.delay(4000); + // } + return true; }); diff --git a/hardhat-test/Bridge.test.ts b/hardhat-test/Bridge.test.ts index c4479de..4f670ec 100644 --- a/hardhat-test/Bridge.test.ts +++ b/hardhat-test/Bridge.test.ts @@ -1,6 +1,6 @@ import {ethers} from "hardhat"; import { DAO, DAO__factory, Bridge, Bridge__factory, ERC20Handler__factory, -GenericHandler__factory, ERC20PresetMinterPauser__factory, CentrifugeAsset__factory } from "../typechain"; +GenericHandler__factory, ERC20PresetMinterPauser__factory, CentrifugeAsset__factory, ERC20Handler } from "../typechain-types"; import {expect} from "chai"; import * as Helpers from "./helpers"; import { BigNumber, utils } from "ethers"; @@ -18,7 +18,6 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { const zeroAddress = "0x0000000000000000000000000000000000000000"; const someAddress = "0xcafecafecafecafecafecafecafecafecafecafe"; let provider: any; - let accounts: SignerWithAddress[]; let owner: SignerWithAddress; let voterFirst: SignerWithAddress; @@ -35,12 +34,11 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { let dao: DAO; let bridge: Bridge; + let handler: ERC20Handler; before(async () => { provider = ethers.provider; - accounts = await ethers.getSigners(); - [ owner, voterFirst, voterSecond, newVoterFirst, newVoterSecond ] = await ethers.getSigners(); const initialRelayers:string[] = [owner.address, voterFirst.address, voterSecond.address]; @@ -48,16 +46,18 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { bridge = await (await new Bridge__factory(owner).deploy(domainId, initialRelayers, initialRelayerThreshold, expiry, feeMaxValue, feePercent)).deployed(); console.log(`${beforeTest}Deployed bridge contract: ${colorBlue}${bridge.address}${colorReset}`); - const ERC20HandlerInstance = await (await new ERC20Handler__factory(owner).deploy(bridge.address, someAddress)).deployed(); - const handlerAddress = ERC20HandlerInstance.address; + handler = await (await new ERC20Handler__factory(owner).deploy(bridge.address, someAddress)).deployed(); - dao = await (await new DAO__factory(owner).deploy(bridge.address, handlerAddress)).deployed(); + dao = await (await new DAO__factory(owner).deploy(bridge.address, handler.address)).deployed(); console.log(`${beforeTest}Deployed DAO contract: ${colorBlue}${dao.address}${colorReset}`) console.log(`${beforeTest}Inserted initial voter : ${colorBlue}${owner.address}${colorReset}`); await bridge.setDAOContractInitial(dao.address); console.log(`${beforeTest}${colorBlue}Inserted${colorReset} initial dao address to bridge: ${colorGreen}${dao.address}${colorReset}`); + await handler.setDAOContractInitial(dao.address); + console.log(`${beforeTest}${colorBlue}Inserted${colorReset} initial dao address to handler: ${colorGreen}${dao.address}${colorReset}`); + ADMIN_ROLE = await bridge.DEFAULT_ADMIN_ROLE(); }); @@ -108,13 +108,11 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { it("Set resource request execution\n", async () => { const ERC20MintableInstance = await (await new ERC20PresetMinterPauser__factory(owner).deploy("token", "TOK")).deployed(); - const ERC20HandlerInstance = await (await new ERC20Handler__factory(owner).deploy(bridge.address, someAddress)).deployed(); - const handlerAddress = ERC20HandlerInstance.address; const tokenAddress = ERC20MintableInstance.address; const resourceId = Helpers.createResourceID(tokenAddress, domainId); console.log(`${insideTest}Creates new set resource request`); - await dao.connect(owner).newSetResourceRequest(handlerAddress, resourceId, tokenAddress); + await dao.connect(owner).newSetResourceRequest(handler.address, resourceId, tokenAddress); console.log(`${insideTest}${colorBlue}Setting resource${colorReset}`); await bridge.connect(owner).adminSetResource(1); @@ -154,8 +152,6 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { it("Withdraw request execution\n", async () => { const ERC20MintableInstance = await (await new ERC20PresetMinterPauser__factory(owner).deploy("token", "TOK")).deployed(); - const ERC20HandlerInstance = await (await new ERC20Handler__factory(owner).deploy(bridge.address, someAddress)).deployed(); - const handlerAddress = ERC20HandlerInstance.address; const tokenAddress = ERC20MintableInstance.address; const numTokens = 10; const tokenOwner = owner.address; @@ -169,19 +165,19 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { expect(ownerBalance).equals(numTokens); console.log(`${insideTest}${colorBlue}Transfers${colorReset} tokens ${numTokens} to handler`); - await ERC20MintableInstance.transfer(handlerAddress, numTokens); + await ERC20MintableInstance.transfer(handler.address, numTokens); ownerBalance = await ERC20MintableInstance.balanceOf(tokenOwner); console.log(`${insideTest}Compares owner balance after transfer [${colorBlue}${ownerBalance}${colorReset}] with minted tokens [${colorGreen}${0}${colorReset}]`); expect(ownerBalance).equals(0); - handlerBalance = await ERC20MintableInstance.balanceOf(handlerAddress); + handlerBalance = await ERC20MintableInstance.balanceOf(handler.address); console.log(`${insideTest}Compares handler balance after transfer [${colorBlue}${handlerBalance}${colorReset}] with minted tokens [${colorGreen}${numTokens}${colorReset}]`); expect(handlerBalance).equals(numTokens); const withdrawData = Helpers.createERCWithdrawData(tokenAddress, tokenOwner, numTokens); console.log(`${insideTest}Creates new withdraw request`); - await dao.connect(owner).newWithdrawRequest(handlerAddress, withdrawData); + await dao.connect(owner).newWithdrawRequest(handler.address, withdrawData); console.log(`${insideTest}${colorBlue}Withdrawing${colorReset}`); await bridge.connect(owner).adminWithdraw(1); @@ -191,13 +187,11 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { it("Set burnable request execution\n", async () => { const ERC20MintableInstance = await (await new ERC20PresetMinterPauser__factory(owner).deploy("token", "TOK")).deployed(); - const ERC20HandlerInstance = await (await new ERC20Handler__factory(owner).deploy(bridge.address, someAddress)).deployed(); - const handlerAddress = ERC20HandlerInstance.address; const tokenAddress = ERC20MintableInstance.address; const resourceId = Helpers.createResourceID(tokenAddress, domainId); console.log(`${insideTest}Creates new set resource request`); - await dao.connect(owner).newSetResourceRequest(handlerAddress, resourceId, tokenAddress); + await dao.connect(owner).newSetResourceRequest(handler.address, resourceId, tokenAddress); console.log(`${insideTest}${colorBlue}Setting resource${colorReset}`); await bridge.connect(owner).adminSetResource(2); @@ -205,7 +199,7 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { await expect(dao.connect(owner).isSetResourceAvailable(2)).revertedWith("not active"); console.log(`${insideTest}Creates new set burnable request`); - await dao.connect(owner).newSetBurnableRequest(handlerAddress, tokenAddress); + await dao.connect(owner).newSetBurnableRequest(handler.address, tokenAddress); console.log(`${insideTest}${colorBlue}Setting burnable${colorReset}`); await bridge.connect(owner).adminSetBurnable(1); @@ -285,17 +279,17 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { console.log(`${insideTest}${colorBlue}Transferring${colorReset} funds`); await bridge.connect(owner).transferFunds(1); - console.log(`${insideTest}${colorRed}Reverts${colorReset} if owner request is not active`); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if transfer funds is not active`); await expect(dao.connect(owner).isTransferAvailable(1)).revertedWith("not active"); }); - it("Set Treasury request is available and returns correct address\n", async () => { + it("Set Treasury request execution\n", async () => { console.log(`${insideTest}${colorRed}Reverts${colorReset} if sender is not a voter`); await expect(dao.connect(newVoterSecond).newSetTreasuryRequest(newVoterFirst.address)).revertedWith("not a voter"); console.log(`${insideTest}${colorRed}Reverts${colorReset} if new owner is zero address`); await expect(dao.connect(owner).newSetTreasuryRequest(zeroAddress)).revertedWith("zero address"); - console.log(`${insideTest}Creates new owner change request`); + console.log(`${insideTest}Creates new set treasury request`); await dao.connect(owner).newSetTreasuryRequest(newVoterFirst.address); console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); @@ -309,8 +303,73 @@ describe("\x1b[33mBridge test\x1b[0m\n", () => { await dao.connect(owner).newVoteForSetTreasuryRequest(true, 1); - const address = await dao.connect(owner).isSetTreasuryAvailable(1); - console.log(`${insideTest}Compares treasury address [${colorBlue}${newVoterFirst.address}${colorReset}] with returned value: [${colorGreen}${address}${colorReset}]`); - expect(newVoterFirst.address).equals(address); + console.log(`${insideTest}${colorBlue}Setting${colorReset} treasury address`); + await handler.connect(owner).setTreasuryAddress(1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if set treasury request is not active`); + await expect(dao.connect(owner).isSetTreasuryAvailable(1)).revertedWith("not active"); + }); + + it("Set Native Tokens For Gas request execution\n", async () => { + const oldAmount = await handler.nativeTokensForGas(); + expect(ethers.utils.parseEther("0.01")).equals(oldAmount); + + const amount = ethers.utils.parseEther("0.001"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if sender is not a voter`); + await expect(dao.connect(newVoterSecond).newSetNativeTokensForGasRequest(amount)).revertedWith("not a voter"); + + console.log(`${insideTest}Creates new Set Native Tokens For Gas request`); + await dao.connect(owner).newSetNativeTokensForGasRequest(amount); + + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); + await expect(dao.connect(owner).newVoteForSetNativeTokensForGasRequest(true, 1)).revertedWith("already confirmed"); + + await dao.connect(owner).newVoteForSetNativeTokensForGasRequest(false, 1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if not enough votes`); + await expect(dao.connect(owner).isSetNativeTokensForGasAvailable(1)).revertedWith("not enough votes"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already removed(false)`); + await expect(dao.connect(owner).newVoteForSetNativeTokensForGasRequest(false, 1)).revertedWith("not confirmed"); + + await dao.connect(owner).newVoteForSetNativeTokensForGasRequest(true, 1); + + console.log(`${insideTest}${colorBlue}Setting${colorReset} new native tokens for gas`); + await handler.connect(owner).setNativeTokensForGas(1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if set native tokens for gas request is not active`); + await expect(dao.connect(owner).isSetNativeTokensForGasAvailable(1)).revertedWith("not active"); + + expect(await handler.nativeTokensForGas()).equals(amount); + }); + + it("Withdraw Native request execution\n", async () => { + const amount = ethers.utils.parseEther("10"); + const recepient = owner.address; + + await owner.sendTransaction({ + to: handler.address, + value: amount, + }); + + console.log(`${insideTest}${colorRed}Reverts${colorReset} if sender is not a voter`); + await expect(dao.connect(newVoterSecond).newTransferNativeRequest(recepient, amount)).revertedWith("not a voter"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if new owner is zero address`); + await expect(dao.connect(owner).newTransferNativeRequest(zeroAddress, amount)).revertedWith("zero address"); + + console.log(`${insideTest}Creates new transfer native request`); + await dao.connect(owner).newTransferNativeRequest(recepient, amount); + + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); + await expect(dao.connect(owner).newVoteForTransferNativeRequest(true, 1)).revertedWith("already confirmed"); + + await dao.connect(owner).newVoteForTransferNativeRequest(false, 1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if not enough votes`); + await expect(dao.connect(owner).isTransferNativeAvailable(1)).revertedWith("not enough votes"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already removed(false)`); + await expect(dao.connect(owner).newVoteForTransferNativeRequest(false, 1)).revertedWith("not confirmed"); + + await dao.connect(owner).newVoteForTransferNativeRequest(true, 1); + + console.log(`${insideTest}${colorBlue}Withdrawing${colorReset} native`); + await handler.connect(owner).withdrawNative(1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if transfer native is not active`); + await expect(dao.connect(owner).isTransferNativeAvailable(1)).revertedWith("not active"); }); }) \ No newline at end of file diff --git a/hardhat-test/DAO.test.ts b/hardhat-test/DAO.test.ts index d6e713f..99dba69 100644 --- a/hardhat-test/DAO.test.ts +++ b/hardhat-test/DAO.test.ts @@ -1,6 +1,6 @@ import {ethers} from "hardhat"; import { DAO, DAO__factory, Bridge, Bridge__factory, ERC20Handler__factory, -GenericHandler__factory, ERC20PresetMinterPauser__factory, CentrifugeAsset__factory } from "../typechain"; +GenericHandler__factory, ERC20PresetMinterPauser__factory, CentrifugeAsset__factory } from "../typechain-types"; import {expect} from "chai"; import * as Helpers from "./helpers"; import { BigNumber, utils } from "ethers"; @@ -453,7 +453,7 @@ describe("\x1b[33mDAO test\x1b[0m\n", () => { console.log(`${insideTest}${colorRed}Reverts${colorReset} if new owner is zero address`); await expect(dao.connect(owner).newSetTreasuryRequest(zeroAddress)).revertedWith("zero address"); - console.log(`${insideTest}Creates new owner change request`); + console.log(`${insideTest}Creates new treasury change request`); await dao.connect(owner).newSetTreasuryRequest(newVoterFirst.address); console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); @@ -471,4 +471,57 @@ describe("\x1b[33mDAO test\x1b[0m\n", () => { console.log(`${insideTest}Compares treasury address [${colorBlue}${newVoterFirst.address}${colorReset}] with returned value: [${colorGreen}${address}${colorReset}]`); expect(newVoterFirst.address).equals(address); }); + + it("Set Native Tokens For Gas request is available and returns correct amount\n", async () => { + const amount = ethers.utils.parseEther("0.001"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if sender is not a voter`); + await expect(dao.connect(newVoterSecond).newSetNativeTokensForGasRequest(amount)).revertedWith("not a voter"); + + console.log(`${insideTest}Creates new Set Native Tokens For Gas request`); + await dao.connect(owner).newSetNativeTokensForGasRequest(amount); + + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); + await expect(dao.connect(owner).newVoteForSetNativeTokensForGasRequest(true, 1)).revertedWith("already confirmed"); + + await dao.connect(owner).newVoteForSetNativeTokensForGasRequest(false, 1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if not enough votes`); + await expect(dao.connect(owner).isSetNativeTokensForGasAvailable(1)).revertedWith("not enough votes"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already removed(false)`); + await expect(dao.connect(owner).newVoteForSetNativeTokensForGasRequest(false, 1)).revertedWith("not confirmed"); + + await dao.connect(owner).newVoteForSetNativeTokensForGasRequest(true, 1); + + const newAmount = await dao.connect(owner).isSetNativeTokensForGasAvailable(1); + console.log(`${insideTest}Compares new amount [${colorBlue}${newAmount}${colorReset}] with returned value: [${colorGreen}${amount}${colorReset}]`); + expect(amount).equals(newAmount); + }); + + it("Transfer Native request is available and returns correct amount\n", async () => { + const recepient = owner.address; + const amount = ethers.utils.parseEther("0.001"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if sender is not a voter`); + await expect(dao.connect(newVoterSecond).newTransferNativeRequest(recepient, amount)).revertedWith("not a voter"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if recepient is zero address`); + await expect(dao.connect(owner).newTransferNativeRequest(zeroAddress, amount)).revertedWith("zero address"); + + console.log(`${insideTest}Creates new Transfer Native request`); + await dao.connect(owner).newTransferNativeRequest(recepient, amount); + + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already confirmed(true)`); + await expect(dao.connect(owner).newVoteForTransferNativeRequest(true, 1)).revertedWith("already confirmed"); + + await dao.connect(owner).newVoteForTransferNativeRequest(false, 1); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if not enough votes`); + await expect(dao.connect(owner).isTransferNativeAvailable(1)).revertedWith("not enough votes"); + console.log(`${insideTest}${colorRed}Reverts${colorReset} if vote is already removed(false)`); + await expect(dao.connect(owner).newVoteForTransferNativeRequest(false, 1)).revertedWith("not confirmed"); + + await dao.connect(owner).newVoteForTransferNativeRequest(true, 1); + + const res = await dao.connect(owner).isTransferNativeAvailable(1); + console.log(`${insideTest}Compares recepient address [${colorBlue}${recepient}${colorReset}] with returned value [${colorGreen}${res[0]}${colorReset}]`); + console.log(`${insideTest}Compares withdrawal amount [${colorBlue}${amount}${colorReset}] with returned value [${colorGreen}${res[1]}${colorReset}]`); + expect(res[0]).equals(recepient); + expect(res[1]).equals(amount); + }); }) \ No newline at end of file diff --git a/hardhat-test/multisig.test.ts b/hardhat-test/multisig.test.ts index e91fcee..ff1c27e 100644 --- a/hardhat-test/multisig.test.ts +++ b/hardhat-test/multisig.test.ts @@ -1,5 +1,5 @@ import { ethers } from "hardhat"; -import { Multisig, Multisig__factory } from "../typechain"; +import { Multisig, Multisig__factory } from "../typechain-types"; import {expect} from "chai"; import { BigNumber, utils } from 'ethers'; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; diff --git a/hardhat.config.ts b/hardhat.config.ts index 79a34c1..e375719 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -18,6 +18,7 @@ import "./deploy/changeNonce"; import "./deploy/multisig"; import "./deploy/changeTreasury"; + import "./deploy/otherRequests"; require("dotenv").config(); const config: HardhatUserConfig = {