From 9555d7d320d873353a1aa3078afcd048509aea1a Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 18:10:44 +0800 Subject: [PATCH 01/12] fix: Lack of validating the _mergeToken --- contracts/merge/MergeTokenPortal.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 1d31581..beb8abc 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -18,12 +18,15 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea // @dev Security Council address address public securityCouncil; + /// @dev A mapping merge token address => is merge token supported. + mapping(address mergeToken => bool) public isMergeTokenSupported; + /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ - uint256[48] private __gap; + uint256[47] private __gap; modifier onlyOwnerOrSecurityCouncil() { require( @@ -99,6 +102,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea function addSourceToken(address _sourceToken, address _mergeToken, uint256 _depositLimit) external onlyOwner { SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(!tokenInfo.isSupported, "Source token is already supported"); + require(!isMergeTokenSupported[_mergeToken], "Merge token is already supported"); require(_sourceToken != address(0) && _mergeToken != address(0), "Invalid token address"); sourceTokenInfoMap[_sourceToken] = SourceTokenInfo({ isSupported: true, @@ -107,6 +111,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea balance: 0, depositLimit: _depositLimit }); + isMergeTokenSupported[_mergeToken] = true; emit SourceTokenAdded(_sourceToken, _mergeToken, _depositLimit); } @@ -116,6 +121,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.balance == 0, "Source Token balance is not zero"); delete sourceTokenInfoMap[_sourceToken]; + delete isMergeTokenSupported[tokenInfo.mergeToken]; emit SourceTokenRemoved(_sourceToken); } From b36d9284051de8e0703dce86fc244f1c9d4b45f1 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 18:49:40 +0800 Subject: [PATCH 02/12] fix: The incoming parameter check is missing in setDepositLimit::MergeTokenPortal function --- contracts/merge/MergeTokenPortal.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index beb8abc..ab5e773 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -140,6 +140,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea function setDepositLimit(address _sourceToken, uint256 _limit) external onlyOwner { SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.isSupported, "Source token is not supported"); + require(_limit > tokenInfo.balance, "_limit must be greater than tokenInfo.balance."); tokenInfo.depositLimit = _limit; From 8b4d74aa7452865a6e605e19cbc29227f33a2894 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 18:52:20 +0800 Subject: [PATCH 03/12] fix: removeSourceToken() function will DoS if source token doesn't exist --- contracts/merge/MergeTokenPortal.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index ab5e773..eee8813 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -119,6 +119,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea /// @notice Remove source token function removeSourceToken(address _sourceToken) external onlyOwnerOrSecurityCouncil { SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; + require(tokenInfo.isSupported, "Source token is already removed"); require(tokenInfo.balance == 0, "Source Token balance is not zero"); delete sourceTokenInfoMap[_sourceToken]; delete isMergeTokenSupported[tokenInfo.mergeToken]; From 5d1c67b285817151995841ebf74002ed1bcdb0c9 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 19:19:18 +0800 Subject: [PATCH 04/12] fix: Incompatibility With Deflationary Tokens --- contracts/merge/MergeTokenPortal.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index eee8813..985d5b3 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -71,7 +71,10 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea require(afterBalance <= tokenInfo.depositLimit, "Source token deposit limit exceeded"); tokenInfo.balance = afterBalance; + uint256 _sourceTokenBeforeBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); IERC20Upgradeable(_sourceToken).safeTransferFrom(msg.sender, address(this), _amount); + uint256 _sourceTokenAfterBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); + require(_sourceTokenAfterBalance - _sourceTokenBeforeBalance == _amount, "Not support deflationary token"); address mergeToken = tokenInfo.mergeToken; IERC20MergeToken(mergeToken).mint(_receiver, _amount); @@ -92,8 +95,11 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea address mergeToken = tokenInfo.mergeToken; IERC20MergeToken(mergeToken).burn(msg.sender, _amount); - + uint256 _sourceTokenBeforeBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); IERC20Upgradeable(_sourceToken).safeTransfer(_receiver, _amount); + uint256 _sourceTokenAfterBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); + + require(_sourceTokenAfterBalance + _amount == _sourceTokenBeforeBalance, "Not support deflationary token"); emit WithdrawFromMerge(_sourceToken, mergeToken, msg.sender, _amount, _receiver); } From 4fa07c9333954cd6d35190fa95e545c858b5e634 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 19:29:37 +0800 Subject: [PATCH 05/12] fix: Misleading event name --- contracts/interfaces/IMergeTokenPortal.sol | 2 +- contracts/merge/MergeTokenPortal.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/interfaces/IMergeTokenPortal.sol b/contracts/interfaces/IMergeTokenPortal.sol index e89bbe6..318b297 100644 --- a/contracts/interfaces/IMergeTokenPortal.sol +++ b/contracts/interfaces/IMergeTokenPortal.sol @@ -22,7 +22,7 @@ interface IMergeTokenPortal { event SourceTokenRemoved(address indexed sourceToken); - event SourceTokenLocked(address indexed sourceToken, bool isLocked); + event SourceTokenStatusUpdated(address indexed sourceToken, bool isLocked); event DepositLimitUpdated(address indexed sourceToken, uint256 depositLimit); diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 985d5b3..657fe17 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -140,7 +140,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea tokenInfo.isLocked = _isLocked; - emit SourceTokenLocked(_sourceToken, _isLocked); + emit SourceTokenStatusUpdated(_sourceToken, _isLocked); } /// @notice Set deposit limit From ce1462974269e33eedb8245b5b0f3ecba4bceafa Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 19:39:55 +0800 Subject: [PATCH 06/12] fix: Lack of check whether the decimal of source token is the same with the decimal of merged token --- contracts/merge/MergeTokenPortal.sol | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 657fe17..5db3e22 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -1,7 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; -import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import {IERC20MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; @@ -10,7 +10,7 @@ import {IMergeTokenPortal} from "../interfaces/IMergeTokenPortal.sol"; import {IERC20MergeToken} from "../interfaces/IERC20MergeToken.sol"; contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradeable, ReentrancyGuardUpgradeable { - using SafeERC20Upgradeable for IERC20Upgradeable; + using SafeERC20Upgradeable for IERC20MetadataUpgradeable; /// @dev A mapping source token address => source token status. mapping(address sourceToken => SourceTokenInfo) public sourceTokenInfoMap; @@ -71,9 +71,9 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea require(afterBalance <= tokenInfo.depositLimit, "Source token deposit limit exceeded"); tokenInfo.balance = afterBalance; - uint256 _sourceTokenBeforeBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); - IERC20Upgradeable(_sourceToken).safeTransferFrom(msg.sender, address(this), _amount); - uint256 _sourceTokenAfterBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); + uint256 _sourceTokenBeforeBalance = IERC20MetadataUpgradeable(_sourceToken).balanceOf(address(this)); + IERC20MetadataUpgradeable(_sourceToken).safeTransferFrom(msg.sender, address(this), _amount); + uint256 _sourceTokenAfterBalance = IERC20MetadataUpgradeable(_sourceToken).balanceOf(address(this)); require(_sourceTokenAfterBalance - _sourceTokenBeforeBalance == _amount, "Not support deflationary token"); address mergeToken = tokenInfo.mergeToken; @@ -95,9 +95,9 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea address mergeToken = tokenInfo.mergeToken; IERC20MergeToken(mergeToken).burn(msg.sender, _amount); - uint256 _sourceTokenBeforeBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); - IERC20Upgradeable(_sourceToken).safeTransfer(_receiver, _amount); - uint256 _sourceTokenAfterBalance = IERC20Upgradeable(_sourceToken).balanceOf(address(this)); + uint256 _sourceTokenBeforeBalance = IERC20MetadataUpgradeable(_sourceToken).balanceOf(address(this)); + IERC20MetadataUpgradeable(_sourceToken).safeTransfer(_receiver, _amount); + uint256 _sourceTokenAfterBalance = IERC20MetadataUpgradeable(_sourceToken).balanceOf(address(this)); require(_sourceTokenAfterBalance + _amount == _sourceTokenBeforeBalance, "Not support deflationary token"); @@ -110,6 +110,10 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea require(!tokenInfo.isSupported, "Source token is already supported"); require(!isMergeTokenSupported[_mergeToken], "Merge token is already supported"); require(_sourceToken != address(0) && _mergeToken != address(0), "Invalid token address"); + uint8 _sourceTokenDecimals = IERC20MetadataUpgradeable(_sourceToken).decimals(); + uint8 _mergeTokenDecimals = IERC20MetadataUpgradeable(_mergeToken).decimals(); + require(_sourceTokenDecimals == _mergeTokenDecimals, "Token decimals are not the same"); + sourceTokenInfoMap[_sourceToken] = SourceTokenInfo({ isSupported: true, isLocked: false, From ea8b90455e6cdc340ba271f03af3ed95d3d9fd46 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 20:01:55 +0800 Subject: [PATCH 07/12] fix: Deposit will break and will not work due to inappropriate limit --- contracts/merge/MergeTokenPortal.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 5db3e22..2ad9bca 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -151,7 +151,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea function setDepositLimit(address _sourceToken, uint256 _limit) external onlyOwner { SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.isSupported, "Source token is not supported"); - require(_limit > tokenInfo.balance, "_limit must be greater than tokenInfo.balance."); + require(_limit >= tokenInfo.balance, "Invalid Specification"); tokenInfo.depositLimit = _limit; From 801c81d5120ee4709f6f1955bf6fc65932226f6e Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 20:03:38 +0800 Subject: [PATCH 08/12] fix: Do not allow adding sourceToken == MergeToken --- contracts/merge/MergeTokenPortal.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 2ad9bca..627e7a5 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -110,6 +110,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea require(!tokenInfo.isSupported, "Source token is already supported"); require(!isMergeTokenSupported[_mergeToken], "Merge token is already supported"); require(_sourceToken != address(0) && _mergeToken != address(0), "Invalid token address"); + require(_sourceToken != _mergeToken, "Should not Match"); uint8 _sourceTokenDecimals = IERC20MetadataUpgradeable(_sourceToken).decimals(); uint8 _mergeTokenDecimals = IERC20MetadataUpgradeable(_mergeToken).decimals(); require(_sourceTokenDecimals == _mergeTokenDecimals, "Token decimals are not the same"); From 65d49d6c393276b26be059615bfa095beecc5e77 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 20:07:32 +0800 Subject: [PATCH 09/12] fix: Missing zero address check --- contracts/merge/MergeTokenPortal.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 627e7a5..1b83d3e 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -62,6 +62,8 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea /// @notice Deposit source token to mint merge token function deposit(address _sourceToken, uint256 _amount, address _receiver) external override nonReentrant { + require(_sourceToken != address(0), "Invalid source token address"); + require(_receiver != address(0), "Invalid receiver address"); require(_amount > 0, "Deposit amount is zero"); SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.isSupported, "Source token is not supported"); @@ -84,6 +86,8 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea /// @notice Burn merge token and get source token back function withdraw(address _sourceToken, uint256 _amount, address _receiver) external override nonReentrant { + require(_sourceToken != address(0), "Invalid source token address"); + require(_receiver != address(0), "Invalid receiver address"); require(_amount > 0, "Withdraw amount is zero"); SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.isSupported, "Source token is not supported"); From 9c2d99e331cfd667dc806b3715f2c79de0b31df1 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 23:05:06 +0800 Subject: [PATCH 10/12] fix: Lack of validating the _mergeToken --- contracts/merge/MergeTokenPortal.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 1b83d3e..95bf891 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -19,7 +19,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea address public securityCouncil; /// @dev A mapping merge token address => is merge token supported. - mapping(address mergeToken => bool) public isMergeTokenSupported; + mapping(address mergeToken => mapping(address sourceToken => bool)) public isMergeTokenSupported; /** * @dev This empty reserved space is put in place to allow future versions to add new @@ -112,7 +112,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea function addSourceToken(address _sourceToken, address _mergeToken, uint256 _depositLimit) external onlyOwner { SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(!tokenInfo.isSupported, "Source token is already supported"); - require(!isMergeTokenSupported[_mergeToken], "Merge token is already supported"); + require(!isMergeTokenSupported[_mergeToken][_sourceToken], "Merge token is already supported"); require(_sourceToken != address(0) && _mergeToken != address(0), "Invalid token address"); require(_sourceToken != _mergeToken, "Should not Match"); uint8 _sourceTokenDecimals = IERC20MetadataUpgradeable(_sourceToken).decimals(); @@ -126,7 +126,7 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea balance: 0, depositLimit: _depositLimit }); - isMergeTokenSupported[_mergeToken] = true; + isMergeTokenSupported[_mergeToken][_sourceToken] = true; emit SourceTokenAdded(_sourceToken, _mergeToken, _depositLimit); } @@ -136,8 +136,8 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; require(tokenInfo.isSupported, "Source token is already removed"); require(tokenInfo.balance == 0, "Source Token balance is not zero"); + delete isMergeTokenSupported[tokenInfo.mergeToken][_sourceToken]; delete sourceTokenInfoMap[_sourceToken]; - delete isMergeTokenSupported[tokenInfo.mergeToken]; emit SourceTokenRemoved(_sourceToken); } From f9dd20335c9d98f6d28a6e489e0c479cecf5a842 Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 23:19:26 +0800 Subject: [PATCH 11/12] fix: Unnecessary storage variable used in removeSourceToken --- contracts/merge/MergeTokenPortal.sol | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/contracts/merge/MergeTokenPortal.sol b/contracts/merge/MergeTokenPortal.sol index 95bf891..97a0cc0 100644 --- a/contracts/merge/MergeTokenPortal.sol +++ b/contracts/merge/MergeTokenPortal.sol @@ -110,8 +110,8 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea /// @notice Add source token function addSourceToken(address _sourceToken, address _mergeToken, uint256 _depositLimit) external onlyOwner { - SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; - require(!tokenInfo.isSupported, "Source token is already supported"); + bool isSupported = sourceTokenInfoMap[_sourceToken].isSupported; + require(!isSupported, "Source token is already supported"); require(!isMergeTokenSupported[_mergeToken][_sourceToken], "Merge token is already supported"); require(_sourceToken != address(0) && _mergeToken != address(0), "Invalid token address"); require(_sourceToken != _mergeToken, "Should not Match"); @@ -133,10 +133,13 @@ contract MergeTokenPortal is IMergeTokenPortal, UUPSUpgradeable, OwnableUpgradea /// @notice Remove source token function removeSourceToken(address _sourceToken) external onlyOwnerOrSecurityCouncil { - SourceTokenInfo storage tokenInfo = sourceTokenInfoMap[_sourceToken]; - require(tokenInfo.isSupported, "Source token is already removed"); - require(tokenInfo.balance == 0, "Source Token balance is not zero"); - delete isMergeTokenSupported[tokenInfo.mergeToken][_sourceToken]; + bool isSupported = sourceTokenInfoMap[_sourceToken].isSupported; + require(isSupported, "Source token is already removed"); + uint256 balance = sourceTokenInfoMap[_sourceToken].balance; + require(balance == 0, "Source Token balance is not zero"); + + address mergeToken = sourceTokenInfoMap[_sourceToken].mergeToken; + delete isMergeTokenSupported[mergeToken][_sourceToken]; delete sourceTokenInfoMap[_sourceToken]; emit SourceTokenRemoved(_sourceToken); From 75ecc87a5978e5dbc24984f5293186cee793ff5d Mon Sep 17 00:00:00 2001 From: zkJoaquin Date: Sun, 7 Apr 2024 23:20:18 +0800 Subject: [PATCH 12/12] fix: test case --- test/MergeTokenPortal.test.ts | 44 ++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 16 deletions(-) diff --git a/test/MergeTokenPortal.test.ts b/test/MergeTokenPortal.test.ts index 915afa3..b3eb71b 100644 --- a/test/MergeTokenPortal.test.ts +++ b/test/MergeTokenPortal.test.ts @@ -86,23 +86,25 @@ describe('MergeToeknPortal', function () { erc20MergeAddr2Token = await ERC20TokenFactory.deploy(mergeTokenPortal.target, 'user2', 'ADD2TK', 18); }); it('Should add source token correctly', async function () { - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 100); - const sourceTokenInfo = await mergeTokenPortal.connect(owner).getSourceTokenInfos(ownerAddr); + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 100); + const sourceTokenInfo = await mergeTokenPortal.connect(owner).getSourceTokenInfos(erc20MergeAddr1Token); expect(sourceTokenInfo.isSupported).to.equal(true); expect(sourceTokenInfo.isLocked).to.equal(false); - expect(sourceTokenInfo.mergeToken).to.equal(recipientAddr); + expect(sourceTokenInfo.mergeToken).to.equal(erc20MergeAddr2Token); expect(sourceTokenInfo.balance).to.equal(0n); expect(sourceTokenInfo.depositLimit).to.equal(100n); }); it('Should add source token correctly2', async function () { - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 100); - await mergeTokenPortal.removeSourceToken(ownerAddr); - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 1000); - const sourceTokenInfo = await mergeTokenPortal.connect(owner).getSourceTokenInfos(ownerAddr); + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 100); + await mergeTokenPortal.connect(owner).removeSourceToken(erc20MergeAddr1Token); + expect(await mergeTokenPortal.isMergeTokenSupported(erc20MergeAddr2Token, erc20MergeAddr1Token)).to.equal(false); + + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 1000); + const sourceTokenInfo = await mergeTokenPortal.connect(owner).getSourceTokenInfos(erc20MergeAddr1Token); expect(sourceTokenInfo.isSupported).to.equal(true); expect(sourceTokenInfo.isLocked).to.equal(false); - expect(sourceTokenInfo.mergeToken).to.equal(recipientAddr); + expect(sourceTokenInfo.mergeToken).to.equal(erc20MergeAddr2Token); expect(sourceTokenInfo.balance).to.equal(0n); expect(sourceTokenInfo.depositLimit).to.equal(1000n); }); @@ -116,20 +118,30 @@ describe('MergeToeknPortal', function () { }); it('Should allow owner remove a source token', async function () { - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 100); - await mergeTokenPortal.connect(owner).removeSourceToken(ownerAddr); - const sourceTokenInfo = await mergeTokenPortal.getSourceTokenInfos(ownerAddr); + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 100); + let sourceTokenInfo = await mergeTokenPortal.getSourceTokenInfos(erc20MergeAddr1Token); + expect(sourceTokenInfo.isSupported).to.equal(true); + expect(sourceTokenInfo.isLocked).to.equal(false); + expect(sourceTokenInfo.balance).to.equal(0n); + expect(sourceTokenInfo.depositLimit).to.equal(100n); + expect(sourceTokenInfo.mergeToken).to.equal(erc20MergeAddr2Token); + expect(await mergeTokenPortal.isMergeTokenSupported(erc20MergeAddr2Token, erc20MergeAddr1Token)).to.equal(true); + + await mergeTokenPortal.connect(owner).removeSourceToken(erc20MergeAddr1Token); + sourceTokenInfo = await mergeTokenPortal.getSourceTokenInfos(erc20MergeAddr1Token); expect(sourceTokenInfo.isSupported).to.equal(false); expect(sourceTokenInfo.isLocked).to.equal(false); expect(sourceTokenInfo.balance).to.equal(0n); expect(sourceTokenInfo.depositLimit).to.equal(0n); + expect(sourceTokenInfo.mergeToken).to.equal(ZERO_ADDRESS); + expect(await mergeTokenPortal.isMergeTokenSupported(erc20MergeAddr2Token, erc20MergeAddr1Token)).to.equal(false); }); it('Should allow commitee remove a source token2', async function () { - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 100); - await mergeTokenPortal.connect(commitee).removeSourceToken(ownerAddr); + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 100); + await mergeTokenPortal.connect(commitee).removeSourceToken(erc20MergeAddr1Token); - const sourceTokenInfo = await mergeTokenPortal.getSourceTokenInfos(ownerAddr); + const sourceTokenInfo = await mergeTokenPortal.getSourceTokenInfos(erc20MergeAddr1Token); expect(sourceTokenInfo.isSupported).to.equal(false); expect(sourceTokenInfo.isLocked).to.equal(false); expect(sourceTokenInfo.balance).to.equal(0n); @@ -137,8 +149,8 @@ describe('MergeToeknPortal', function () { }); it('Should not allow non-owner or non-commitee remove a source token', async function () { - await mergeTokenPortal.connect(owner).addSourceToken(ownerAddr, recipientAddr, 100); - await expect(mergeTokenPortal.connect(user1).removeSourceToken(ownerAddr)).to.be.revertedWith( + await mergeTokenPortal.connect(owner).addSourceToken(erc20MergeAddr1Token, erc20MergeAddr2Token, 100); + await expect(mergeTokenPortal.connect(user1).removeSourceToken(erc20MergeAddr1Token)).to.be.revertedWith( 'Only owner or commitee can call this function', ); });