From 1d9c1e2ef7a0dc83a8d2fac45e826ecd8a068013 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 15 Nov 2022 10:27:44 +0000 Subject: [PATCH 01/84] Add new proposed functions skeleton --- contracts/RelayerHub.sol | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f4545dbc..3f81133c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -19,6 +19,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ mapping(address =>relayer) relayers; mapping(address =>bool) relayersExistMap; + mapping(address =>bool) relayAdminsExistMap; + mapping(address =>address) adminsAndRelayers; struct relayer{ uint256 deposit; @@ -83,6 +85,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ uint256 newDues = BytesToTypes.bytesToUint256(32, value); require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); dues = newDues; + } else if (Memory.compareStrings(key,"addAdmin")) { + // TODO check and parse value + // addAdminAddress(...) + } else if (Memory.compareStrings(key,"removeAdmin")) { + // TODO check and parse value + // removeAdminAddress(...) } else { require(false, "unknown param"); } @@ -92,4 +100,32 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ function isRelayer(address sender) external override view returns (bool) { return relayersExistMap[sender]; } + + function removeAdminAddress(address) external onlyGov{ + + } + + function removeAdmin() external onlyAdmin { + + } + + function addAdminAddress(address) external onlyGov{ + + } + + function registerAdmin() external payable onlyAdmin { + + } + + function addRelayer(address) external onlyAdmin{ + + } + + function registerAdminAddRelayer(address) external payable onlyAdmin { + + } + + function removeRelayer() external onlyAdmin { + + } } From 9c9423afdc6c6b925a6d1004bd3c3bd66d056bb3 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 15 Nov 2022 12:24:32 +0000 Subject: [PATCH 02/84] admin struct & removeAdminAddress code --- contracts/RelayerHub.sol | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 3f81133c..f01039f7 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -19,6 +19,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ mapping(address =>relayer) relayers; mapping(address =>bool) relayersExistMap; + + mapping(address =>admin) admins; mapping(address =>bool) relayAdminsExistMap; mapping(address =>address) adminsAndRelayers; @@ -27,6 +29,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ uint256 dues; } + struct admin{ + uint256 deposit; + uint256 dues; + } + modifier notContract() { require(!isContract(msg.sender), "contract is not allowed to be a relayer"); _; @@ -51,6 +58,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); + event removeAdminAddress(address _removedAdmin); + function init() external onlyNotInit{ requiredDeposit = INIT_REQUIRED_DEPOSIT; @@ -101,8 +110,23 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ return relayersExistMap[sender]; } - function removeAdminAddress(address) external onlyGov{ + function removeAdminAddress(address adminToBeRemoved) external onlyGov{ + // todo more pre-checks if any + + // check if the admin address already exists + require(relayAdminsExistMap[adminToBeRemoved], "admin doesn't exist"); + + delete(relayAdminsExistMap[adminToBeRemoved]); + delete(adminsAndRelayers[adminToBeRemoved]); + + // todo transfer dues and deposits BNB -> check + admin memory a = admins[adminToBeRemoved]; + adminToBeRemoved.transfer(a.deposit.sub(a.dues)); + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(a.dues); + // emit success event + emit removeAdminAddress(adminToBeRemoved); } function removeAdmin() external onlyAdmin { From 646ba57f7a7d83ac8686b904752b32910cb85562 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 15 Nov 2022 12:41:55 +0000 Subject: [PATCH 03/84] remove, register, add admin + onlyAdmin modifier --- contracts/RelayerHub.sol | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f01039f7..615891a9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -54,11 +54,18 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ _; } + modifier onlyAdmin() { + require(admins[msg.sender], "admin does not exist"); + _; + } + event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); event removeAdminAddress(address _removedAdmin); + event addAdminAddress(address _addedAdmin); + event registerAdmin(address _registeredAdmin); function init() external onlyNotInit{ @@ -111,7 +118,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } function removeAdminAddress(address adminToBeRemoved) external onlyGov{ - // todo more pre-checks if any + // fixme more pre-checks if any // check if the admin address already exists require(relayAdminsExistMap[adminToBeRemoved], "admin doesn't exist"); @@ -119,7 +126,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ delete(relayAdminsExistMap[adminToBeRemoved]); delete(adminsAndRelayers[adminToBeRemoved]); - // todo transfer dues and deposits BNB -> check + // fixme transfer dues and deposits BNB -> check admin memory a = admins[adminToBeRemoved]; adminToBeRemoved.transfer(a.deposit.sub(a.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); @@ -130,15 +137,37 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } function removeAdmin() external onlyAdmin { + // here the admin removes himself + // check if the admin address already exists + require(relayAdminsExistMap[msg.sender], "admin doesn't exist"); + + delete(relayAdminsExistMap[msg.sender]); + delete(adminsAndRelayers[msg.sender]); + // fixme transfer dues and deposits BNB -> check + admin memory a = admins[msg.sender]; + msg.sender.transfer(a.deposit.sub(a.dues)); + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(a.dues); + + // emit success event + emit removeAdminAddress(msg.sender); } - function addAdminAddress(address) external onlyGov{ + function addAdminAddress(address adminToBeAdded) external onlyGov{ + require(!relayAdminsExistMap[adminToBeAdded], "admin already exists"); + relayAdminsExistMap[adminToBeAdded] = true; + // admins[adminToBeAdded] = admin(requiredDeposit, dues); todo this will be done when admin registers himself in registerAdmin(?) + + emit addAdminAddress(adminToBeAdded); } function registerAdmin() external payable onlyAdmin { - + require(relayAdminsExistMap[msg.sender], "admin not added by Gov yet"); + require(msg.value == requiredDeposit, "deposit value is not exactly the same"); + admins[msg.sender] = admin(requiredDeposit, dues); + emit registerAdmin(msg.sender); } function addRelayer(address) external onlyAdmin{ From 2747fcb83f3bbfa62b21ba0fc2be977759132c1c Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 15 Nov 2022 13:23:21 +0000 Subject: [PATCH 04/84] add relayer functions --- contracts/RelayerHub.sol | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 615891a9..e0bc8ab8 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -55,6 +55,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } modifier onlyAdmin() { + require(relayAdminsExistMap[msg.sender], "admin does not exist"); require(admins[msg.sender], "admin does not exist"); _; } @@ -66,6 +67,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ event removeAdminAddress(address _removedAdmin); event addAdminAddress(address _addedAdmin); event registerAdmin(address _registeredAdmin); + event addRelayer(address _relayerToBeAdded); + event removeRelayer(address _removedRelayer); function init() external onlyNotInit{ @@ -102,10 +105,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); dues = newDues; } else if (Memory.compareStrings(key,"addAdmin")) { - // TODO check and parse value + // fixme check and parse value // addAdminAddress(...) } else if (Memory.compareStrings(key,"removeAdmin")) { - // TODO check and parse value + // fixme check and parse value // removeAdminAddress(...) } else { require(false, "unknown param"); @@ -164,21 +167,27 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } function registerAdmin() external payable onlyAdmin { - require(relayAdminsExistMap[msg.sender], "admin not added by Gov yet"); +// require(relayAdminsExistMap[msg.sender], "admin not added by Gov yet"); require(msg.value == requiredDeposit, "deposit value is not exactly the same"); admins[msg.sender] = admin(requiredDeposit, dues); emit registerAdmin(msg.sender); } - function addRelayer(address) external onlyAdmin{ - + function addRelayer(address relayerToBeAdded) external onlyAdmin{ + adminsAndRelayers[msg.sender] = relayerToBeAdded; + emit addRelayer(relayerToBeAdded); } - function registerAdminAddRelayer(address) external payable onlyAdmin { - + function registerAdminAddRelayer(address relayer) external payable onlyAdmin { + registerAdmin(); + addRelayer(relayer); } function removeRelayer() external onlyAdmin { + require(adminsAndRelayers[msg.sender], "relayer doesn't exist for this admin"); + emit removeRelayer(adminsAndRelayers[msg.sender]); + + delete(adminsAndRelayers[msg.sender]); } } From 0065836537df01775a13a63706526129602b087a Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 16 Nov 2022 08:23:19 +0000 Subject: [PATCH 05/84] helper function to avoid repeat of code --- contracts/RelayerHub.sol | 32 +++++++++++--------------------- 1 file changed, 11 insertions(+), 21 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index e0bc8ab8..96417306 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -122,39 +122,29 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ function removeAdminAddress(address adminToBeRemoved) external onlyGov{ // fixme more pre-checks if any - - // check if the admin address already exists - require(relayAdminsExistMap[adminToBeRemoved], "admin doesn't exist"); - - delete(relayAdminsExistMap[adminToBeRemoved]); - delete(adminsAndRelayers[adminToBeRemoved]); - - // fixme transfer dues and deposits BNB -> check - admin memory a = admins[adminToBeRemoved]; - adminToBeRemoved.transfer(a.deposit.sub(a.dues)); - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(a.dues); - - // emit success event - emit removeAdminAddress(adminToBeRemoved); + removeAdminHelper(adminToBeRemoved); } function removeAdmin() external onlyAdmin { // here the admin removes himself + removeAdminHelper(msg.sender); + } + + function removeAdminHelper(address adminAddress) { // check if the admin address already exists - require(relayAdminsExistMap[msg.sender], "admin doesn't exist"); + require(relayAdminsExistMap[adminAddress], "admin doesn't exist"); - delete(relayAdminsExistMap[msg.sender]); - delete(adminsAndRelayers[msg.sender]); + delete(relayAdminsExistMap[adminAddress]); + delete(adminsAndRelayers[adminAddress]); // fixme transfer dues and deposits BNB -> check - admin memory a = admins[msg.sender]; - msg.sender.transfer(a.deposit.sub(a.dues)); + admin memory a = admins[adminAddress]; + adminAddress.transfer(a.deposit.sub(a.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); systemPayable.transfer(a.dues); // emit success event - emit removeAdminAddress(msg.sender); + emit removeAdminAddress(adminAddress); } function addAdminAddress(address adminToBeAdded) external onlyGov{ From 981c2256f0777c5bbab74c48c2937332f29d7a6a Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 16 Nov 2022 21:15:38 +0000 Subject: [PATCH 06/84] verifyRelayer and relayerExistsMap --- contracts/RelayerHub.sol | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 96417306..5a46e910 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -23,6 +23,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ mapping(address =>admin) admins; mapping(address =>bool) relayAdminsExistMap; mapping(address =>address) adminsAndRelayers; + mapping(address =>bool) relayerExistsMap; struct relayer{ uint256 deposit; @@ -121,7 +122,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } function removeAdminAddress(address adminToBeRemoved) external onlyGov{ - // fixme more pre-checks if any removeAdminHelper(adminToBeRemoved); } @@ -137,7 +137,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ delete(relayAdminsExistMap[adminAddress]); delete(adminsAndRelayers[adminAddress]); - // fixme transfer dues and deposits BNB -> check admin memory a = admins[adminAddress]; adminAddress.transfer(a.deposit.sub(a.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); @@ -151,7 +150,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ require(!relayAdminsExistMap[adminToBeAdded], "admin already exists"); relayAdminsExistMap[adminToBeAdded] = true; - // admins[adminToBeAdded] = admin(requiredDeposit, dues); todo this will be done when admin registers himself in registerAdmin(?) emit addAdminAddress(adminToBeAdded); } @@ -165,6 +163,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ function addRelayer(address relayerToBeAdded) external onlyAdmin{ adminsAndRelayers[msg.sender] = relayerToBeAdded; + relayerExistsMap[relayerToBeAdded] = true; emit addRelayer(relayerToBeAdded); } @@ -179,5 +178,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ emit removeRelayer(adminsAndRelayers[msg.sender]); delete(adminsAndRelayers[msg.sender]); + + relayer memory r = adminsAndRelayers[msg.sender]; + + delete(relayerExistsMap[r]); + } + + function verifyRelayer(address relayerAddress) external returns (bool){ + if (relayerExistsMap[relayerAddress]) { + return true; + } + return false; } } From d31bc5da88d44f46695f9dffacea091570d767e1 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 16 Nov 2022 21:21:04 +0000 Subject: [PATCH 07/84] updateParam changes --- contracts/RelayerHub.sol | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 5a46e910..0fb521bd 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -106,11 +106,17 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); dues = newDues; } else if (Memory.compareStrings(key,"addAdmin")) { - // fixme check and parse value - // addAdminAddress(...) + + require(value.length == 32, "length of admin address mismatch"); // fixme: check if the length is correct + address newAdmin = BytesToTypes.bytesToAddress(32, value); + addAdminAddress(newAdmin); + } else if (Memory.compareStrings(key,"removeAdmin")) { - // fixme check and parse value - // removeAdminAddress(...) + + require(value.length == 32, "length of admin address mismatch"); + address admin = BytesToTypes.bytesToAddress(32, value); + removeAdminAddress(admin); + } else { require(false, "unknown param"); } From 7513b3ff4d92f7d0f294e2388e47c490329928bc Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 16 Nov 2022 21:44:00 +0000 Subject: [PATCH 08/84] Remove unwanted code and variables --- contracts/RelayerHub.sol | 47 ---------------------------------------- 1 file changed, 47 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 0fb521bd..01972753 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -17,44 +17,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ uint256 public requiredDeposit; uint256 public dues; - mapping(address =>relayer) relayers; - mapping(address =>bool) relayersExistMap; - mapping(address =>admin) admins; mapping(address =>bool) relayAdminsExistMap; mapping(address =>address) adminsAndRelayers; mapping(address =>bool) relayerExistsMap; - struct relayer{ - uint256 deposit; - uint256 dues; - } - struct admin{ uint256 deposit; uint256 dues; } - modifier notContract() { - require(!isContract(msg.sender), "contract is not allowed to be a relayer"); - _; - } - - modifier noProxy() { - require(msg.sender == tx.origin, "no proxy is allowed"); - _; - } - - modifier noExist() { - require(!relayersExistMap[msg.sender], "relayer already exist"); - _; - } - - modifier exist() { - require(relayersExistMap[msg.sender], "relayer do not exist"); - _; - } - modifier onlyAdmin() { require(relayAdminsExistMap[msg.sender], "admin does not exist"); require(admins[msg.sender], "admin does not exist"); @@ -77,21 +49,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ dues = INIT_DUES; alreadyInit = true; } - - function register() external payable noExist onlyInit notContract noProxy{ - revert("register suspended"); - } - - - function unregister() external exist onlyInit{ - relayer memory r = relayers[msg.sender]; - msg.sender.transfer(r.deposit.sub(r.dues)); - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(r.dues); - delete relayersExistMap[msg.sender]; - delete relayers[msg.sender]; - emit relayerUnRegister(msg.sender); - } /*********************** Param update ********************************/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov{ @@ -123,10 +80,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ emit paramChange(key, value); } - function isRelayer(address sender) external override view returns (bool) { - return relayersExistMap[sender]; - } - function removeAdminAddress(address adminToBeRemoved) external onlyGov{ removeAdminHelper(adminToBeRemoved); } From 38224e572dc1735d7894fcd6087768ed3a092e1d Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 16 Nov 2022 21:51:28 +0000 Subject: [PATCH 09/84] Remove old code --- contracts/RelayerHub.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 01972753..4fbb1e07 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -114,7 +114,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ } function registerAdmin() external payable onlyAdmin { -// require(relayAdminsExistMap[msg.sender], "admin not added by Gov yet"); require(msg.value == requiredDeposit, "deposit value is not exactly the same"); admins[msg.sender] = admin(requiredDeposit, dues); emit registerAdmin(msg.sender); From 5a5bb13f091e0946c9d3dafb1110cfd7a9d7d126 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 17 Nov 2022 12:53:35 +0000 Subject: [PATCH 10/84] Formatting + efficient return for verify function --- contracts/RelayerHub.sol | 238 +++++++++++++++++++-------------------- 1 file changed, 118 insertions(+), 120 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 4fbb1e07..c9531abb 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -8,144 +8,142 @@ import "./System.sol"; import "./lib/SafeMath.sol"; -contract RelayerHub is IRelayerHub, System, IParamSubscriber{ - using SafeMath for uint256; - - uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; - uint256 public constant INIT_DUES = 1e17; - - uint256 public requiredDeposit; - uint256 public dues; - - mapping(address =>admin) admins; - mapping(address =>bool) relayAdminsExistMap; - mapping(address =>address) adminsAndRelayers; - mapping(address =>bool) relayerExistsMap; - - struct admin{ - uint256 deposit; - uint256 dues; - } - - modifier onlyAdmin() { - require(relayAdminsExistMap[msg.sender], "admin does not exist"); - require(admins[msg.sender], "admin does not exist"); - _; - } - - event relayerRegister(address _relayer); - event relayerUnRegister(address _relayer); - event paramChange(string key, bytes value); - - event removeAdminAddress(address _removedAdmin); - event addAdminAddress(address _addedAdmin); - event registerAdmin(address _registeredAdmin); - event addRelayer(address _relayerToBeAdded); - event removeRelayer(address _removedRelayer); - - - function init() external onlyNotInit{ - requiredDeposit = INIT_REQUIRED_DEPOSIT; - dues = INIT_DUES; - alreadyInit = true; - } - - /*********************** Param update ********************************/ - function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov{ - if (Memory.compareStrings(key,"requiredDeposit")) { - require(value.length == 32, "length of requiredDeposit mismatch"); - uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); - require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); - requiredDeposit = newRequiredDeposit; - } else if (Memory.compareStrings(key,"dues")) { - require(value.length == 32, "length of dues mismatch"); - uint256 newDues = BytesToTypes.bytesToUint256(32, value); - require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); - dues = newDues; - } else if (Memory.compareStrings(key,"addAdmin")) { - - require(value.length == 32, "length of admin address mismatch"); // fixme: check if the length is correct - address newAdmin = BytesToTypes.bytesToAddress(32, value); - addAdminAddress(newAdmin); - - } else if (Memory.compareStrings(key,"removeAdmin")) { - - require(value.length == 32, "length of admin address mismatch"); - address admin = BytesToTypes.bytesToAddress(32, value); - removeAdminAddress(admin); - - } else { - require(false, "unknown param"); +contract RelayerHub is IRelayerHub, System, IParamSubscriber { + using SafeMath for uint256; + + uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; + uint256 public constant INIT_DUES = 1e17; + + uint256 public requiredDeposit; + uint256 public dues; + + mapping(address => admin) admins; + mapping(address => bool) relayAdminsExistMap; + mapping(address => address) adminsAndRelayers; + mapping(address => bool) relayerExistsMap; + + struct admin { + uint256 deposit; + uint256 dues; } - emit paramChange(key, value); - } - function removeAdminAddress(address adminToBeRemoved) external onlyGov{ - removeAdminHelper(adminToBeRemoved); - } + modifier onlyAdmin() { + require(relayAdminsExistMap[msg.sender], "admin does not exist"); + require(admins[msg.sender], "admin does not exist"); + _; + } - function removeAdmin() external onlyAdmin { - // here the admin removes himself - removeAdminHelper(msg.sender); - } + event relayerRegister(address _relayer); + event relayerUnRegister(address _relayer); + event paramChange(string key, bytes value); - function removeAdminHelper(address adminAddress) { - // check if the admin address already exists - require(relayAdminsExistMap[adminAddress], "admin doesn't exist"); + event removeAdminAddress(address _removedAdmin); + event addAdminAddress(address _addedAdmin); + event registerAdmin(address _registeredAdmin); + event addRelayer(address _relayerToBeAdded); + event removeRelayer(address _removedRelayer); - delete(relayAdminsExistMap[adminAddress]); - delete(adminsAndRelayers[adminAddress]); - admin memory a = admins[adminAddress]; - adminAddress.transfer(a.deposit.sub(a.dues)); - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(a.dues); + function init() external onlyNotInit { + requiredDeposit = INIT_REQUIRED_DEPOSIT; + dues = INIT_DUES; + alreadyInit = true; + } - // emit success event - emit removeAdminAddress(adminAddress); - } + /*********************** Param update ********************************/ + function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { + if (Memory.compareStrings(key, "requiredDeposit")) { + require(value.length == 32, "length of requiredDeposit mismatch"); + uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); + require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); + requiredDeposit = newRequiredDeposit; + } else if (Memory.compareStrings(key, "dues")) { + require(value.length == 32, "length of dues mismatch"); + uint256 newDues = BytesToTypes.bytesToUint256(32, value); + require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); + dues = newDues; + } else if (Memory.compareStrings(key, "addAdmin")) { + + require(value.length == 32, "length of admin address mismatch"); + // fixme: check if the length is correct + address newAdmin = BytesToTypes.bytesToAddress(32, value); + addAdminAddress(newAdmin); + + } else if (Memory.compareStrings(key, "removeAdmin")) { + + require(value.length == 32, "length of admin address mismatch"); + address admin = BytesToTypes.bytesToAddress(32, value); + removeAdminAddress(admin); + + } else { + require(false, "unknown param"); + } + emit paramChange(key, value); + } - function addAdminAddress(address adminToBeAdded) external onlyGov{ - require(!relayAdminsExistMap[adminToBeAdded], "admin already exists"); + function removeAdminAddress(address adminToBeRemoved) external onlyGov { + removeAdminHelper(adminToBeRemoved); + } - relayAdminsExistMap[adminToBeAdded] = true; + function removeAdmin() external onlyAdmin { + // here the admin removes himself + removeAdminHelper(msg.sender); + } - emit addAdminAddress(adminToBeAdded); - } + function removeAdminHelper(address adminAddress) { + // check if the admin address already exists + require(relayAdminsExistMap[adminAddress], "admin doesn't exist"); - function registerAdmin() external payable onlyAdmin { - require(msg.value == requiredDeposit, "deposit value is not exactly the same"); - admins[msg.sender] = admin(requiredDeposit, dues); - emit registerAdmin(msg.sender); - } + delete (relayAdminsExistMap[adminAddress]); + delete (adminsAndRelayers[adminAddress]); - function addRelayer(address relayerToBeAdded) external onlyAdmin{ - adminsAndRelayers[msg.sender] = relayerToBeAdded; - relayerExistsMap[relayerToBeAdded] = true; - emit addRelayer(relayerToBeAdded); - } + admin memory a = admins[adminAddress]; + adminAddress.transfer(a.deposit.sub(a.dues)); + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(a.dues); - function registerAdminAddRelayer(address relayer) external payable onlyAdmin { - registerAdmin(); - addRelayer(relayer); - } + // emit success event + emit removeAdminAddress(adminAddress); + } - function removeRelayer() external onlyAdmin { - require(adminsAndRelayers[msg.sender], "relayer doesn't exist for this admin"); + function addAdminAddress(address adminToBeAdded) external onlyGov { + require(!relayAdminsExistMap[adminToBeAdded], "admin already exists"); - emit removeRelayer(adminsAndRelayers[msg.sender]); + relayAdminsExistMap[adminToBeAdded] = true; - delete(adminsAndRelayers[msg.sender]); + emit addAdminAddress(adminToBeAdded); + } - relayer memory r = adminsAndRelayers[msg.sender]; + function registerAdmin() external payable onlyAdmin { + require(msg.value == requiredDeposit, "deposit value is not exactly the same"); + admins[msg.sender] = admin(requiredDeposit, dues); + emit registerAdmin(msg.sender); + } + + function addRelayer(address relayerToBeAdded) external onlyAdmin { + adminsAndRelayers[msg.sender] = relayerToBeAdded; + relayerExistsMap[relayerToBeAdded] = true; + emit addRelayer(relayerToBeAdded); + } + + function registerAdminAddRelayer(address relayer) external payable onlyAdmin { + registerAdmin(); + addRelayer(relayer); + } - delete(relayerExistsMap[r]); - } + function removeRelayer() external onlyAdmin { + require(adminsAndRelayers[msg.sender], "relayer doesn't exist for this admin"); + + emit removeRelayer(adminsAndRelayers[msg.sender]); + + delete (adminsAndRelayers[msg.sender]); + + relayer memory r = adminsAndRelayers[msg.sender]; + + delete (relayerExistsMap[r]); + } - function verifyRelayer(address relayerAddress) external returns (bool){ - if (relayerExistsMap[relayerAddress]) { - return true; + function verifyRelayer(address relayerAddress) external returns (bool){ + return relayerExistsMap[relayerAddress]; } - return false; - } } From a40d34c86a7a7a448fadcf8bc354facba7078094 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 17 Nov 2022 13:11:13 +0000 Subject: [PATCH 11/84] decouple registered and nonregistered admins, remove relayer before deleting, correct address size, --- contracts/RelayerHub.sol | 42 +++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 16 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index c9531abb..733b47ca 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -27,9 +27,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } - modifier onlyAdmin() { + modifier onlyNonRegisteredAdmin() { require(relayAdminsExistMap[msg.sender], "admin does not exist"); - require(admins[msg.sender], "admin does not exist"); + _; + } + + modifier onlyRegisteredAdmin() { + require(relayAdminsExistMap[msg.sender], "admin does not exist"); + require(admins[msg.sender], "admin not registered"); _; } @@ -64,15 +69,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { dues = newDues; } else if (Memory.compareStrings(key, "addAdmin")) { - require(value.length == 32, "length of admin address mismatch"); - // fixme: check if the length is correct - address newAdmin = BytesToTypes.bytesToAddress(32, value); + require(value.length == 20, "length of admin address mismatch"); + address newAdmin = BytesToTypes.bytesToAddress(20, value); addAdminAddress(newAdmin); } else if (Memory.compareStrings(key, "removeAdmin")) { - require(value.length == 32, "length of admin address mismatch"); - address admin = BytesToTypes.bytesToAddress(32, value); + require(value.length == 20, "length of admin address mismatch"); + address admin = BytesToTypes.bytesToAddress(20, value); removeAdminAddress(admin); } else { @@ -85,7 +89,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { removeAdminHelper(adminToBeRemoved); } - function removeAdmin() external onlyAdmin { + function removeAdmin() external onlyRegisteredAdmin { // here the admin removes himself removeAdminHelper(msg.sender); } @@ -94,6 +98,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // check if the admin address already exists require(relayAdminsExistMap[adminAddress], "admin doesn't exist"); + relayer memory relayerAddress = adminsAndRelayers[adminAddress]; + delete (relayAdminsExistMap[adminAddress]); delete (adminsAndRelayers[adminAddress]); @@ -102,8 +108,13 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); systemPayable.transfer(a.dues); + delete (admins[adminAddress]); + // emit success event emit removeAdminAddress(adminAddress); + if (relayerAddress != address(0)) { + emit removeRelayer(relayerAddress); + } } function addAdminAddress(address adminToBeAdded) external onlyGov { @@ -114,33 +125,32 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit addAdminAddress(adminToBeAdded); } - function registerAdmin() external payable onlyAdmin { + function registerAdmin() external payable onlyNonRegisteredAdmin { require(msg.value == requiredDeposit, "deposit value is not exactly the same"); admins[msg.sender] = admin(requiredDeposit, dues); emit registerAdmin(msg.sender); } - function addRelayer(address relayerToBeAdded) external onlyAdmin { + function addRelayer(address relayerToBeAdded) external onlyRegisteredAdmin { adminsAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; emit addRelayer(relayerToBeAdded); } - function registerAdminAddRelayer(address relayer) external payable onlyAdmin { + function registerAdminAddRelayer(address relayer) external payable onlyNonRegisteredAdmin { registerAdmin(); addRelayer(relayer); } - function removeRelayer() external onlyAdmin { + function removeRelayer() external onlyRegisteredAdmin { require(adminsAndRelayers[msg.sender], "relayer doesn't exist for this admin"); - emit removeRelayer(adminsAndRelayers[msg.sender]); - - delete (adminsAndRelayers[msg.sender]); - relayer memory r = adminsAndRelayers[msg.sender]; delete (relayerExistsMap[r]); + delete (adminsAndRelayers[msg.sender]); + + emit removeRelayer(r); } function verifyRelayer(address relayerAddress) external returns (bool){ From 744819c173127016231eb340cc3e6d4ed436bd83 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 17 Nov 2022 13:16:34 +0000 Subject: [PATCH 12/84] add old modifier checks before adding relayer --- contracts/RelayerHub.sol | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 733b47ca..6173664c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -38,6 +38,21 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } + modifier notContract() { + require(!isContract(msg.sender), "contract is not allowed to be a relayer"); + _; + } + + modifier noProxy() { + require(msg.sender == tx.origin, "no proxy is allowed"); + _; + } + + modifier noExist() { + require(!relayerExistsMap[msg.sender], "relayer already exists"); + _; + } + event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -131,7 +146,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerAdmin(msg.sender); } - function addRelayer(address relayerToBeAdded) external onlyRegisteredAdmin { + function addRelayer(address relayerToBeAdded) external onlyRegisteredAdmin noExist notContract noProxy { adminsAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; emit addRelayer(relayerToBeAdded); From 0994f270dda34f8a07c40a0a147a8683976b1c59 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 18 Nov 2022 08:20:49 +0000 Subject: [PATCH 13/84] seed with current whitelists.todo: add relayers --- contracts/RelayerHub.sol | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 6173664c..0a1abf4f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -13,6 +13,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; + address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; + address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; uint256 public requiredDeposit; uint256 public dues; @@ -68,6 +70,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { requiredDeposit = INIT_REQUIRED_DEPOSIT; dues = INIT_DUES; alreadyInit = true; + + // todo initialise the currently existing admins and their relayer keys + + admins[WHITELIST_1] = admin(requiredDeposit, dues); + admins[WHITELIST_2] = admin(requiredDeposit, dues); + + relayAdminsExistMap[WHITELIST_1] = true; + relayAdminsExistMap[WHITELIST_2] = true; + + adminsAndRelayers[WHITELIST_1] = WHITELIST_1; // fixme current relayer + adminsAndRelayers[WHITELIST_2] = WHITELIST_2; // fixme current relayer + + // fixme initialise relayerExistsMap } /*********************** Param update ********************************/ From 1f1135c05892557d1a8f313bf2a48109d9a82efe Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 21 Nov 2022 09:26:39 +0000 Subject: [PATCH 14/84] Refactor: replace admin with manager --- contracts/RelayerHub.sol | 114 +++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 57 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 0a1abf4f..c72bfe49 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -19,24 +19,24 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public requiredDeposit; uint256 public dues; - mapping(address => admin) admins; - mapping(address => bool) relayAdminsExistMap; - mapping(address => address) adminsAndRelayers; + mapping(address => manager) managers; + mapping(address => bool) relayManagersExistMap; + mapping(address => address) managersAndRelayers; mapping(address => bool) relayerExistsMap; - struct admin { + struct manager { uint256 deposit; uint256 dues; } - modifier onlyNonRegisteredAdmin() { - require(relayAdminsExistMap[msg.sender], "admin does not exist"); + modifier onlyNonRegisteredManager() { + require(relayManagersExistMap[msg.sender], "manager does not exist"); _; } - modifier onlyRegisteredAdmin() { - require(relayAdminsExistMap[msg.sender], "admin does not exist"); - require(admins[msg.sender], "admin not registered"); + modifier onlyRegisteredManager() { + require(relayManagersExistMap[msg.sender], "manager does not exist"); + require(managers[msg.sender], "manager not registered"); _; } @@ -59,9 +59,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeAdminAddress(address _removedAdmin); - event addAdminAddress(address _addedAdmin); - event registerAdmin(address _registeredAdmin); + event removeManagerAddress(address _removedManager); + event addManagerAddress(address _addedManager); + event registerManager(address _registeredManager); event addRelayer(address _relayerToBeAdded); event removeRelayer(address _removedRelayer); @@ -71,16 +71,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { dues = INIT_DUES; alreadyInit = true; - // todo initialise the currently existing admins and their relayer keys + // todo initialise the currently existing Managers and their relayer keys - admins[WHITELIST_1] = admin(requiredDeposit, dues); - admins[WHITELIST_2] = admin(requiredDeposit, dues); + managers[WHITELIST_1] = manager(requiredDeposit, dues); + managers[WHITELIST_2] = manager(requiredDeposit, dues); - relayAdminsExistMap[WHITELIST_1] = true; - relayAdminsExistMap[WHITELIST_2] = true; + relayManagersExistMap[WHITELIST_1] = true; + relayManagersExistMap[WHITELIST_2] = true; - adminsAndRelayers[WHITELIST_1] = WHITELIST_1; // fixme current relayer - adminsAndRelayers[WHITELIST_2] = WHITELIST_2; // fixme current relayer + managersAndRelayers[WHITELIST_1] = WHITELIST_1; // fixme current relayer + managersAndRelayers[WHITELIST_2] = WHITELIST_2; // fixme current relayer // fixme initialise relayerExistsMap } @@ -97,17 +97,17 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 newDues = BytesToTypes.bytesToUint256(32, value); require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); dues = newDues; - } else if (Memory.compareStrings(key, "addAdmin")) { + } else if (Memory.compareStrings(key, "addManager")) { - require(value.length == 20, "length of admin address mismatch"); - address newAdmin = BytesToTypes.bytesToAddress(20, value); - addAdminAddress(newAdmin); + require(value.length == 20, "length of manager address mismatch"); + address newManager = BytesToTypes.bytesToAddress(20, value); + addManagerAddress(newManager); - } else if (Memory.compareStrings(key, "removeAdmin")) { + } else if (Memory.compareStrings(key, "removeManager")) { - require(value.length == 20, "length of admin address mismatch"); - address admin = BytesToTypes.bytesToAddress(20, value); - removeAdminAddress(admin); + require(value.length == 20, "length of manager address mismatch"); + address manager = BytesToTypes.bytesToAddress(20, value); + removeManagerAddress(manager); } else { require(false, "unknown param"); @@ -115,70 +115,70 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit paramChange(key, value); } - function removeAdminAddress(address adminToBeRemoved) external onlyGov { - removeAdminHelper(adminToBeRemoved); + function removeManagerAddress(address managerToBeRemoved) external onlyGov { + removeManagerHelper(managerToBeRemoved); } - function removeAdmin() external onlyRegisteredAdmin { - // here the admin removes himself - removeAdminHelper(msg.sender); + function removeManager() external onlyRegisteredManager { + // here the manager removes himself + removeManagerHelper(msg.sender); } - function removeAdminHelper(address adminAddress) { - // check if the admin address already exists - require(relayAdminsExistMap[adminAddress], "admin doesn't exist"); + function removeManagerHelper(address managerAddress) { + // check if the manager address already exists + require(relayManagersExistMap[managerAddress], "manager doesn't exist"); - relayer memory relayerAddress = adminsAndRelayers[adminAddress]; + relayer memory relayerAddress = managersAndRelayers[managerAddress]; - delete (relayAdminsExistMap[adminAddress]); - delete (adminsAndRelayers[adminAddress]); + delete (relayManagersExistMap[managerAddress]); + delete (managersAndRelayers[managerAddress]); - admin memory a = admins[adminAddress]; - adminAddress.transfer(a.deposit.sub(a.dues)); + manager memory a = managers[managerAddress]; + managerAddress.transfer(a.deposit.sub(a.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); systemPayable.transfer(a.dues); - delete (admins[adminAddress]); + delete (managers[managerAddress]); // emit success event - emit removeAdminAddress(adminAddress); + emit removeManagerAddress(managerAddress); if (relayerAddress != address(0)) { emit removeRelayer(relayerAddress); } } - function addAdminAddress(address adminToBeAdded) external onlyGov { - require(!relayAdminsExistMap[adminToBeAdded], "admin already exists"); + function addManagerAddress(address managerToBeAdded) external onlyGov { + require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); - relayAdminsExistMap[adminToBeAdded] = true; + relayManagersExistMap[managerToBeAdded] = true; - emit addAdminAddress(adminToBeAdded); + emit addManagerAddress(managerToBeAdded); } - function registerAdmin() external payable onlyNonRegisteredAdmin { + function registerManager() external payable onlyNonRegisteredManager { require(msg.value == requiredDeposit, "deposit value is not exactly the same"); - admins[msg.sender] = admin(requiredDeposit, dues); - emit registerAdmin(msg.sender); + managers[msg.sender] = manager(requiredDeposit, dues); + emit registerManager(msg.sender); } - function addRelayer(address relayerToBeAdded) external onlyRegisteredAdmin noExist notContract noProxy { - adminsAndRelayers[msg.sender] = relayerToBeAdded; + function addRelayer(address relayerToBeAdded) external onlyRegisteredManager noExist notContract noProxy { + managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; emit addRelayer(relayerToBeAdded); } - function registerAdminAddRelayer(address relayer) external payable onlyNonRegisteredAdmin { - registerAdmin(); + function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { + registerManager(); addRelayer(relayer); } - function removeRelayer() external onlyRegisteredAdmin { - require(adminsAndRelayers[msg.sender], "relayer doesn't exist for this admin"); + function removeRelayer() external onlyRegisteredManager { + require(managersAndRelayers[msg.sender], "relayer doesn't exist for this manager"); - relayer memory r = adminsAndRelayers[msg.sender]; + relayer memory r = managersAndRelayers[msg.sender]; delete (relayerExistsMap[r]); - delete (adminsAndRelayers[msg.sender]); + delete (managersAndRelayers[msg.sender]); emit removeRelayer(r); } From 3efc715902b47f0f9ff97060a9a906fbf22200cb Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 21 Nov 2022 11:54:53 +0000 Subject: [PATCH 15/84] contract and exist checks inside function --- contracts/RelayerHub.sol | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index c72bfe49..e9faedac 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -40,21 +40,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - modifier notContract() { - require(!isContract(msg.sender), "contract is not allowed to be a relayer"); - _; - } - modifier noProxy() { require(msg.sender == tx.origin, "no proxy is allowed"); _; } - modifier noExist() { - require(!relayerExistsMap[msg.sender], "relayer already exists"); - _; - } - event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -161,7 +151,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManager(msg.sender); } - function addRelayer(address relayerToBeAdded) external onlyRegisteredManager noExist notContract noProxy { + function addRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { + require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; emit addRelayer(relayerToBeAdded); From e8088195389fce054dc7fdd978dfacd0722efe4e Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 22 Nov 2022 14:28:48 +0000 Subject: [PATCH 16/84] remove onlyWhitelabelRelayer for the most part. --- contracts/CrossChain.sol | 2 +- contracts/CrossChain.template | 2 +- contracts/System.sol | 9 +-------- contracts/TendermintLightClient.sol | 2 +- contracts/TendermintLightClient.template | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/contracts/CrossChain.sol b/contracts/CrossChain.sol index b3b18d4e..7185f7b5 100644 --- a/contracts/CrossChain.sol +++ b/contracts/CrossChain.sol @@ -200,7 +200,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber{ return (true, packageType, relayFee, msgBytes); } - function handlePackage(bytes calldata payload, bytes calldata proof, uint64 height, uint64 packageSequence, uint8 channelId) onlyInit onlyRelayer onlyWhitelabelRelayer + function handlePackage(bytes calldata payload, bytes calldata proof, uint64 height, uint64 packageSequence, uint8 channelId) onlyInit onlyRelayer sequenceInOrder(packageSequence, channelId) blockSynced(height) channelSupported(channelId) headerInOrder(height, channelId) external { bytes memory payloadLocal = payload; // fix error: stack too deep, try removing local variables bytes memory proofLocal = proof; // fix error: stack too deep, try removing local variables diff --git a/contracts/CrossChain.template b/contracts/CrossChain.template index 614b8830..ccb31403 100644 --- a/contracts/CrossChain.template +++ b/contracts/CrossChain.template @@ -201,7 +201,7 @@ contract CrossChain is System, ICrossChain, IParamSubscriber{ return (true, packageType, relayFee, msgBytes); } - function handlePackage(bytes calldata payload, bytes calldata proof, uint64 height, uint64 packageSequence, uint8 channelId) onlyInit onlyRelayer onlyWhitelabelRelayer + function handlePackage(bytes calldata payload, bytes calldata proof, uint64 height, uint64 packageSequence, uint8 channelId) onlyInit onlyRelayer sequenceInOrder(packageSequence, channelId) blockSynced(height) channelSupported(channelId) headerInOrder(height, channelId) external { bytes memory payloadLocal = payload; // fix error: stack too deep, try removing local variables bytes memory proofLocal = proof; // fix error: stack too deep, try removing local variables diff --git a/contracts/System.sol b/contracts/System.sol index 1db84db4..9b0aeea2 100644 --- a/contracts/System.sol +++ b/contracts/System.sol @@ -79,17 +79,10 @@ contract System { } modifier onlyRelayer() { - require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer"); + require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).verifyRelayer(msg.sender), "the msg sender is not a relayer"); _; } - - modifier onlyWhitelabelRelayer() { - require(msg.sender == 0xb005741528b86F5952469d80A8614591E3c5B632 || msg.sender == 0x446AA6E0DC65690403dF3F127750da1322941F3e, "the msg sender is not a whitelabel relayer"); - _; - } - - modifier onlyTokenManager() { require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager"); _; diff --git a/contracts/TendermintLightClient.sol b/contracts/TendermintLightClient.sol index d8db849c..418dbe32 100644 --- a/contracts/TendermintLightClient.sol +++ b/contracts/TendermintLightClient.sol @@ -57,7 +57,7 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber{ emit initConsensusState(initialHeight, cs.appHash); } - function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer onlyWhitelabelRelayer returns (bool) { + function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer returns (bool) { require(submitters[height] == address(0x0), "can't sync duplicated header"); require(height > initialHeight, "can't sync header before initialHeight"); diff --git a/contracts/TendermintLightClient.template b/contracts/TendermintLightClient.template index efdba652..13511ed7 100644 --- a/contracts/TendermintLightClient.template +++ b/contracts/TendermintLightClient.template @@ -57,7 +57,7 @@ contract TendermintLightClient is ILightClient, System, IParamSubscriber{ emit initConsensusState(initialHeight, cs.appHash); } - function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer onlyWhitelabelRelayer returns (bool) { + function syncTendermintHeader(bytes calldata header, uint64 height) external onlyRelayer returns (bool) { require(submitters[height] == address(0x0), "can't sync duplicated header"); require(height > initialHeight, "can't sync header before initialHeight"); From 0fc3985687ba392e534a75e7592966f90082da78 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 23 Nov 2022 09:04:12 +0000 Subject: [PATCH 17/84] Remove register unregister from template file --- contracts/RelayerHub.template | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 7950ff9a..629fcf33 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -55,28 +55,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber{ dues = INIT_DUES; alreadyInit = true; } - {% if mock %} - function register() external payable noExist onlyInit notContract noProxy{ - require(msg.value == requiredDeposit, "deposit value is not exactly the same"); - relayers[msg.sender] = relayer(requiredDeposit, dues); - relayersExistMap[msg.sender] = true; - emit relayerRegister(msg.sender); - } - {% else %} - function register() external payable noExist onlyInit notContract noProxy{ - revert("register suspended"); - } - {% endif %} - - function unregister() external exist onlyInit{ - relayer memory r = relayers[msg.sender]; - msg.sender.transfer(r.deposit.sub(r.dues)); - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); - systemPayable.transfer(r.dues); - delete relayersExistMap[msg.sender]; - delete relayers[msg.sender]; - emit relayerUnRegister(msg.sender); - } /*********************** Param update ********************************/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov{ From ef4e08694a906e0b44fba5604952c7ad1445d420 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 23 Nov 2022 12:29:29 +0000 Subject: [PATCH 18/84] isRelayer, not verifyRelayer --- contracts/RelayerHub.sol | 2 +- contracts/System.sol | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index e9faedac..ab344cc9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -176,7 +176,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit removeRelayer(r); } - function verifyRelayer(address relayerAddress) external returns (bool){ + function isRelayer(address relayerAddress) external view returns (bool){ return relayerExistsMap[relayerAddress]; } } diff --git a/contracts/System.sol b/contracts/System.sol index 9b0aeea2..56d49b69 100644 --- a/contracts/System.sol +++ b/contracts/System.sol @@ -79,7 +79,7 @@ contract System { } modifier onlyRelayer() { - require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).verifyRelayer(msg.sender), "the msg sender is not a relayer"); + require(IRelayerHub(RELAYERHUB_CONTRACT_ADDR).isRelayer(msg.sender), "the msg sender is not a relayer"); _; } From 9304110285a08b87ad65826ef5f2f723cf5aaaad Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 23 Nov 2022 12:31:31 +0000 Subject: [PATCH 19/84] isContract check for manager --- contracts/RelayerHub.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index ab344cc9..ac1ab14a 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -139,6 +139,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function addManagerAddress(address managerToBeAdded) external onlyGov { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); + require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); relayManagersExistMap[managerToBeAdded] = true; From 7f5751ef64401f508cc763dfd808115a50bdae69 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 23 Nov 2022 12:59:20 +0000 Subject: [PATCH 20/84] override in isRelayer --- contracts/RelayerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index ac1ab14a..fa2a2d61 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -177,7 +177,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit removeRelayer(r); } - function isRelayer(address relayerAddress) external view returns (bool){ + function isRelayer(address relayerAddress) external override view returns (bool){ return relayerExistsMap[relayerAddress]; } } From 5b757c72c89b5a4e96e16e5dab96e203fc620aa2 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 24 Nov 2022 14:32:11 +0000 Subject: [PATCH 21/84] refactor naming --- contracts/RelayerHub.sol | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index fa2a2d61..8229bb3c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -49,8 +49,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerAddress(address _removedManager); - event addManagerAddress(address _addedManager); + event removeManagerByGov(address _removedManager); + event addManagerByGov(address _addedManager); event registerManager(address _registeredManager); event addRelayer(address _relayerToBeAdded); event removeRelayer(address _removedRelayer); @@ -91,13 +91,13 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(value.length == 20, "length of manager address mismatch"); address newManager = BytesToTypes.bytesToAddress(20, value); - addManagerAddress(newManager); + addManagerByGov(newManager); } else if (Memory.compareStrings(key, "removeManager")) { require(value.length == 20, "length of manager address mismatch"); address manager = BytesToTypes.bytesToAddress(20, value); - removeManagerAddress(manager); + removeManagerByGov(manager); } else { require(false, "unknown param"); @@ -105,7 +105,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit paramChange(key, value); } - function removeManagerAddress(address managerToBeRemoved) external onlyGov { + function removeManagerByGov(address managerToBeRemoved) external onlyGov { removeManagerHelper(managerToBeRemoved); } @@ -131,19 +131,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (managers[managerAddress]); // emit success event - emit removeManagerAddress(managerAddress); + emit removeManagerByGov(managerAddress); if (relayerAddress != address(0)) { emit removeRelayer(relayerAddress); } } - function addManagerAddress(address managerToBeAdded) external onlyGov { + function addManagerByGov(address managerToBeAdded) external onlyGov { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); relayManagersExistMap[managerToBeAdded] = true; - emit addManagerAddress(managerToBeAdded); + emit addManagerByGov(managerToBeAdded); } function registerManager() external payable onlyNonRegisteredManager { From ea38c55ce07e914fec6393d46f5a3ba8d79d888d Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 24 Nov 2022 17:55:21 +0000 Subject: [PATCH 22/84] addRelayer -> editRelayer --- contracts/RelayerHub.sol | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 8229bb3c..badb034f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -52,7 +52,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event removeManagerByGov(address _removedManager); event addManagerByGov(address _addedManager); event registerManager(address _registeredManager); - event addRelayer(address _relayerToBeAdded); + event editRelayer(address _relayerToBeAdded); event removeRelayer(address _removedRelayer); @@ -152,18 +152,18 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManager(msg.sender); } - function addRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { + function editRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; - emit addRelayer(relayerToBeAdded); + emit editRelayer(relayerToBeAdded); } function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { registerManager(); - addRelayer(relayer); + editRelayer(relayer); } function removeRelayer() external onlyRegisteredManager { From 9a6385c31b8bbcfe8db2cc919c50ab1b644a5ea0 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 25 Nov 2022 07:42:53 +0000 Subject: [PATCH 23/84] remove most compilation errors apart from transfer --- contracts/RelayerHub.sol | 55 +++++++++++++++++++++++++--------------- 1 file changed, 35 insertions(+), 20 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index badb034f..f5ce71c9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -20,6 +20,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public dues; mapping(address => manager) managers; + mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; mapping(address => address) managersAndRelayers; mapping(address => bool) relayerExistsMap; @@ -36,7 +37,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { modifier onlyRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); - require(managers[msg.sender], "manager not registered"); + require(managersRegistered[msg.sender], "manager not registered"); _; } @@ -49,11 +50,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerByGov(address _removedManager); - event addManagerByGov(address _addedManager); - event registerManager(address _registeredManager); - event editRelayer(address _relayerToBeAdded); - event removeRelayer(address _removedRelayer); + event removeManagerByGovEvent(address _removedManager); + event addManagerByGovEvent(address _addedManager); + event registerManagerEvent(address _registeredManager); + event editRelayerEvent(address _relayerToBeAdded); + event removeRelayerEvent(address _removedRelayer); function init() external onlyNotInit { @@ -66,6 +67,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { managers[WHITELIST_1] = manager(requiredDeposit, dues); managers[WHITELIST_2] = manager(requiredDeposit, dues); + managersRegistered[WHITELIST_1] = true; + managersRegistered[WHITELIST_2] = true; + relayManagersExistMap[WHITELIST_1] = true; relayManagersExistMap[WHITELIST_2] = true; @@ -96,8 +100,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } else if (Memory.compareStrings(key, "removeManager")) { require(value.length == 20, "length of manager address mismatch"); - address manager = BytesToTypes.bytesToAddress(20, value); - removeManagerByGov(manager); + address managerAddress = BytesToTypes.bytesToAddress(20, value); + removeManagerByGov(managerAddress); } else { require(false, "unknown param"); @@ -105,7 +109,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit paramChange(key, value); } - function removeManagerByGov(address managerToBeRemoved) external onlyGov { + function removeManagerByGov(address managerToBeRemoved) internal { removeManagerHelper(managerToBeRemoved); } @@ -114,11 +118,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { removeManagerHelper(msg.sender); } - function removeManagerHelper(address managerAddress) { + function removeManagerHelper(address managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); - relayer memory relayerAddress = managersAndRelayers[managerAddress]; + address relayerAddress = managersAndRelayers[managerAddress]; delete (relayManagersExistMap[managerAddress]); delete (managersAndRelayers[managerAddress]); @@ -129,27 +133,38 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { systemPayable.transfer(a.dues); delete (managers[managerAddress]); + delete (managersRegistered[managerAddress]); // emit success event emit removeManagerByGov(managerAddress); if (relayerAddress != address(0)) { - emit removeRelayer(relayerAddress); + emit removeRelayerEvent(relayerAddress); } } - function addManagerByGov(address managerToBeAdded) external onlyGov { + function addManagerByGov(address managerToBeAdded) internal { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); relayManagersExistMap[managerToBeAdded] = true; - emit addManagerByGov(managerToBeAdded); + emit addManagerByGovEvent(managerToBeAdded); } - function registerManager() external payable onlyNonRegisteredManager { + function registerManager() internal payable onlyNonRegisteredManager { require(msg.value == requiredDeposit, "deposit value is not exactly the same"); managers[msg.sender] = manager(requiredDeposit, dues); - emit registerManager(msg.sender); + managersRegistered[msg.sender] = true; + emit registerManagerEvent(msg.sender); + } + + function addRelayer(address relayerToBeAdded) internal onlyRegisteredManager noProxy { + require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + + managersAndRelayers[msg.sender] = relayerToBeAdded; + relayerExistsMap[relayerToBeAdded] = true; + emit editRelayerEvent(relayerToBeAdded); } function editRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { @@ -158,23 +173,23 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; - emit editRelayer(relayerToBeAdded); + emit editRelayerEvent(relayerToBeAdded); } function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { registerManager(); - editRelayer(relayer); + addRelayer(relayer); } function removeRelayer() external onlyRegisteredManager { require(managersAndRelayers[msg.sender], "relayer doesn't exist for this manager"); - relayer memory r = managersAndRelayers[msg.sender]; + address r = managersAndRelayers[msg.sender]; delete (relayerExistsMap[r]); delete (managersAndRelayers[msg.sender]); - emit removeRelayer(r); + emit removeRelayerEvent(r); } function isRelayer(address relayerAddress) external override view returns (bool){ From ba4c474b3748915818eee3322e060947e4ef12be Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 25 Nov 2022 08:10:56 +0000 Subject: [PATCH 24/84] compilation error fix: payable+map --- contracts/RelayerHub.sol | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f5ce71c9..820cd986 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -100,7 +100,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } else if (Memory.compareStrings(key, "removeManager")) { require(value.length == 20, "length of manager address mismatch"); - address managerAddress = BytesToTypes.bytesToAddress(20, value); + address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); removeManagerByGov(managerAddress); } else { @@ -109,7 +109,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit paramChange(key, value); } - function removeManagerByGov(address managerToBeRemoved) internal { + function removeManagerByGov(address payable managerToBeRemoved) internal { removeManagerHelper(managerToBeRemoved); } @@ -118,7 +118,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { removeManagerHelper(msg.sender); } - function removeManagerHelper(address managerAddress) internal { + function removeManagerHelper(address payable managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); @@ -136,7 +136,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (managersRegistered[managerAddress]); // emit success event - emit removeManagerByGov(managerAddress); + emit removeManagerByGovEvent(managerAddress); if (relayerAddress != address(0)) { emit removeRelayerEvent(relayerAddress); } @@ -151,7 +151,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit addManagerByGovEvent(managerToBeAdded); } - function registerManager() internal payable onlyNonRegisteredManager { + function registerManager() internal onlyNonRegisteredManager { require(msg.value == requiredDeposit, "deposit value is not exactly the same"); managers[msg.sender] = manager(requiredDeposit, dues); managersRegistered[msg.sender] = true; @@ -182,7 +182,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function removeRelayer() external onlyRegisteredManager { - require(managersAndRelayers[msg.sender], "relayer doesn't exist for this manager"); + if (managersAndRelayers[msg.sender] == address(0)) { + require(false, "relayer doesn't exist for this manager"); + } address r = managersAndRelayers[msg.sender]; From c3cdc8d9781fb47fe3f82a037a2e278a1e3fbce5 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 25 Nov 2022 13:22:22 +0000 Subject: [PATCH 25/84] extra payables --- contracts/RelayerHub.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 820cd986..58714e70 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -115,7 +115,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function removeManager() external onlyRegisteredManager { // here the manager removes himself - removeManagerHelper(msg.sender); + removeManagerHelper(payable(msg.sender)); } function removeManagerHelper(address payable managerAddress) internal { @@ -129,7 +129,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { manager memory a = managers[managerAddress]; managerAddress.transfer(a.deposit.sub(a.dues)); - address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); systemPayable.transfer(a.dues); delete (managers[managerAddress]); From 5d67e91360a43156f5a8b50a55709e2225f8857d Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Fri, 9 Dec 2022 14:42:09 +0100 Subject: [PATCH 26/84] modify templates --- contracts/RelayerHub.sol | 31 ++-- contracts/RelayerHub.template | 265 +++++++++++++++++++++++++--------- contracts/System.template | 22 --- 3 files changed, 210 insertions(+), 108 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 58714e70..03f32ae6 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -58,25 +58,17 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function init() external onlyNotInit { - requiredDeposit = INIT_REQUIRED_DEPOSIT; - dues = INIT_DUES; alreadyInit = true; + addInitRelayer(WHITELIST_1); + addInitRelayer(WHITELIST_1); + } - // todo initialise the currently existing Managers and their relayer keys - - managers[WHITELIST_1] = manager(requiredDeposit, dues); - managers[WHITELIST_2] = manager(requiredDeposit, dues); - - managersRegistered[WHITELIST_1] = true; - managersRegistered[WHITELIST_2] = true; - - relayManagersExistMap[WHITELIST_1] = true; - relayManagersExistMap[WHITELIST_2] = true; - - managersAndRelayers[WHITELIST_1] = WHITELIST_1; // fixme current relayer - managersAndRelayers[WHITELIST_2] = WHITELIST_2; // fixme current relayer - - // fixme initialise relayerExistsMap + function addInitRelayer(address addr) internal { + managers[addr] = manager(INIT_REQUIRED_DEPOSIT, INIT_DUES); + managersRegistered[addr] = true; + relayManagersExistMap[addr] = true; + managersAndRelayers[addr] = addr; // fixme current relayer + relayerExistsMap[addr] = true; } /*********************** Param update ********************************/ @@ -197,4 +189,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function isRelayer(address relayerAddress) external override view returns (bool){ return relayerExistsMap[relayerAddress]; } + + // TODO remove just for testing + function isManager(address relayerAddress) external view returns (bool){ + return managersRegistered[relayerAddress]; + } } diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 629fcf33..bf2380c5 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -8,73 +8,200 @@ import "./System.sol"; import "./lib/SafeMath.sol"; -contract RelayerHub is IRelayerHub, System, IParamSubscriber{ - using SafeMath for uint256; - - uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; - uint256 public constant INIT_DUES = 1e17; - - uint256 public requiredDeposit; - uint256 public dues; - - mapping(address =>relayer) relayers; - mapping(address =>bool) relayersExistMap; - - struct relayer{ - uint256 deposit; - uint256 dues; - } - - modifier notContract() { - require(!isContract(msg.sender), "contract is not allowed to be a relayer"); - _; - } - - modifier noProxy() { - require(msg.sender == tx.origin, "no proxy is allowed"); - _; - } - - modifier noExist() { - require(!relayersExistMap[msg.sender], "relayer already exist"); - _; - } - - modifier exist() { - require(relayersExistMap[msg.sender], "relayer do not exist"); - _; - } - - event relayerRegister(address _relayer); - event relayerUnRegister(address _relayer); - event paramChange(string key, bytes value); - - - function init() external onlyNotInit{ - requiredDeposit = INIT_REQUIRED_DEPOSIT; - dues = INIT_DUES; - alreadyInit = true; - } - - /*********************** Param update ********************************/ - function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov{ - if (Memory.compareStrings(key,"requiredDeposit")) { - require(value.length == 32, "length of requiredDeposit mismatch"); - uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); - require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); - requiredDeposit = newRequiredDeposit; - } else if (Memory.compareStrings(key,"dues")) { - require(value.length == 32, "length of dues mismatch"); - uint256 newDues = BytesToTypes.bytesToUint256(32, value); - require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); - dues = newDues; - } else { - require(false, "unknown param"); - } - emit paramChange(key, value); - } - - function isRelayer(address sender) external override view returns (bool) { - return relayersExistMap[sender]; - } +contract RelayerHub is IRelayerHub, System, IParamSubscriber { + using SafeMath for uint256; + + uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; + uint256 public constant INIT_DUES = 1e17; + {% if network == 'local' %} + address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; + address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; + {% elif network == 'QA' %} + address public constant WHITELIST_1 = 0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD; + address public constant WHITELIST_2 = 0x42D596440775C90db8d9187b47650986E1063493; + {% elif network == 'testnet' %} + address public constant WHITELIST_1 = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; + address public constant WHITELIST_2 = 0x37B8516a0F88E65D677229b402ec6C1e0E333004; + {% else %} + address public constant WHITELIST_1 = 0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186; + address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; + {% endif %} + uint256 public requiredDeposit; + uint256 public dues; + + mapping(address => manager) managers; + mapping(address => bool) managersRegistered; + mapping(address => bool) relayManagersExistMap; + mapping(address => address) managersAndRelayers; + mapping(address => bool) relayerExistsMap; + + struct manager { + uint256 deposit; + uint256 dues; + } + + modifier onlyNonRegisteredManager() { + require(relayManagersExistMap[msg.sender], "manager does not exist"); + _; + } + + modifier onlyRegisteredManager() { + require(relayManagersExistMap[msg.sender], "manager does not exist"); + require(managersRegistered[msg.sender], "manager not registered"); + _; + } + + modifier noProxy() { + require(msg.sender == tx.origin, "no proxy is allowed"); + _; + } + + event relayerRegister(address _relayer); + event relayerUnRegister(address _relayer); + event paramChange(string key, bytes value); + + event removeManagerByGovEvent(address _removedManager); + event addManagerByGovEvent(address _addedManager); + event registerManagerEvent(address _registeredManager); + event editRelayerEvent(address _relayerToBeAdded); + event removeRelayerEvent(address _removedRelayer); + + + function init() external onlyNotInit { + alreadyInit = true; + addInitRelayer(WHITELIST_1); + addInitRelayer(WHITELIST_1); + } + + function addInitRelayer(address addr) internal { + managers[addr] = manager(INIT_REQUIRED_DEPOSIT, INIT_DUES); + managersRegistered[addr] = true; + relayManagersExistMap[addr] = true; + managersAndRelayers[addr] = addr; // fixme current relayer + relayerExistsMap[addr] = true; + } + + /*********************** Param update ********************************/ + function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { + if (Memory.compareStrings(key, "requiredDeposit")) { + require(value.length == 32, "length of requiredDeposit mismatch"); + uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); + require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); + requiredDeposit = newRequiredDeposit; + } else if (Memory.compareStrings(key, "dues")) { + require(value.length == 32, "length of dues mismatch"); + uint256 newDues = BytesToTypes.bytesToUint256(32, value); + require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); + dues = newDues; + } else if (Memory.compareStrings(key, "addManager")) { + + require(value.length == 20, "length of manager address mismatch"); + address newManager = BytesToTypes.bytesToAddress(20, value); + addManagerByGov(newManager); + + } else if (Memory.compareStrings(key, "removeManager")) { + + require(value.length == 20, "length of manager address mismatch"); + address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); + removeManagerByGov(managerAddress); + + } else { + require(false, "unknown param"); + } + emit paramChange(key, value); + } + + function removeManagerByGov(address payable managerToBeRemoved) internal { + removeManagerHelper(managerToBeRemoved); + } + + function removeManager() external onlyRegisteredManager { + // here the manager removes himself + removeManagerHelper(payable(msg.sender)); + } + + function removeManagerHelper(address payable managerAddress) internal { + // check if the manager address already exists + require(relayManagersExistMap[managerAddress], "manager doesn't exist"); + + address relayerAddress = managersAndRelayers[managerAddress]; + + delete (relayManagersExistMap[managerAddress]); + delete (managersAndRelayers[managerAddress]); + + manager memory a = managers[managerAddress]; + managerAddress.transfer(a.deposit.sub(a.dues)); + address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); + systemPayable.transfer(a.dues); + + delete (managers[managerAddress]); + delete (managersRegistered[managerAddress]); + + // emit success event + emit removeManagerByGovEvent(managerAddress); + if (relayerAddress != address(0)) { + emit removeRelayerEvent(relayerAddress); + } + } + + function addManagerByGov(address managerToBeAdded) internal { + require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); + require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); + + relayManagersExistMap[managerToBeAdded] = true; + + emit addManagerByGovEvent(managerToBeAdded); + } + + function registerManager() internal onlyNonRegisteredManager { + require(msg.value == requiredDeposit, "deposit value is not exactly the same"); + managers[msg.sender] = manager(requiredDeposit, dues); + managersRegistered[msg.sender] = true; + emit registerManagerEvent(msg.sender); + } + + function addRelayer(address relayerToBeAdded) internal onlyRegisteredManager noProxy { + require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + + managersAndRelayers[msg.sender] = relayerToBeAdded; + relayerExistsMap[relayerToBeAdded] = true; + emit editRelayerEvent(relayerToBeAdded); + } + + function editRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { + require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + + managersAndRelayers[msg.sender] = relayerToBeAdded; + relayerExistsMap[relayerToBeAdded] = true; + emit editRelayerEvent(relayerToBeAdded); + } + + function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { + registerManager(); + addRelayer(relayer); + } + + function removeRelayer() external onlyRegisteredManager { + if (managersAndRelayers[msg.sender] == address(0)) { + require(false, "relayer doesn't exist for this manager"); + } + + address r = managersAndRelayers[msg.sender]; + + delete (relayerExistsMap[r]); + delete (managersAndRelayers[msg.sender]); + + emit removeRelayerEvent(r); + } + + function isRelayer(address relayerAddress) external override view returns (bool){ + return relayerExistsMap[relayerAddress]; + } + + // TODO remove just for testing + function isManager(address relayerAddress) external view returns (bool){ + return managersRegistered[relayerAddress]; + } } diff --git a/contracts/System.template b/contracts/System.template index 6089c896..7daf4f7d 100644 --- a/contracts/System.template +++ b/contracts/System.template @@ -116,28 +116,6 @@ contract System { _; } - {% if network == 'local' %} - modifier onlyWhitelabelRelayer() { - require(msg.sender == 0xA904540818AC9c47f2321F97F1069B9d8746c6DB || msg.sender == 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344, "the msg sender is not a whitelabel relayer"); - _; - } - {% elif network == 'QA' %} - modifier onlyWhitelabelRelayer() { - require(msg.sender == 0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD || msg.sender == 0x42D596440775C90db8d9187b47650986E1063493, "the msg sender is not a whitelabel relayer"); - _; - } - {% elif network == 'testnet' %} - modifier onlyWhitelabelRelayer() { - require(msg.sender == 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791 || msg.sender == 0x37B8516a0F88E65D677229b402ec6C1e0E333004, "the msg sender is not a whitelabel relayer"); - _; - } - {% else %} - modifier onlyWhitelabelRelayer() { - require(msg.sender == 0xb005741528b86F5952469d80A8614591E3c5B632 || msg.sender == 0x446AA6E0DC65690403dF3F127750da1322941F3e, "the msg sender is not a whitelabel relayer"); - _; - } - {% endif %} - modifier onlyTokenManager() { require(msg.sender == TOKEN_MANAGER_ADDR, "the msg sender must be tokenManager"); _; From 5ee2dc0ebf7ec8f80a2d72cf642d7fc4b4290313 Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Tue, 13 Dec 2022 15:27:26 +0100 Subject: [PATCH 27/84] fix bugs in contract --- contracts/RelayerHub.sol | 31 +++++++++++++++---------------- contracts/RelayerHub.template | 31 +++++++++++++++---------------- 2 files changed, 30 insertions(+), 32 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 03f32ae6..613a0df8 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -53,18 +53,20 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event removeManagerByGovEvent(address _removedManager); event addManagerByGovEvent(address _addedManager); event registerManagerEvent(address _registeredManager); - event editRelayerEvent(address _relayerToBeAdded); + event addRelayerEvent(address _relayerToBeAdded); event removeRelayerEvent(address _removedRelayer); function init() external onlyNotInit { - alreadyInit = true; - addInitRelayer(WHITELIST_1); + requiredDeposit = INIT_REQUIRED_DEPOSIT; + dues = INIT_DUES; addInitRelayer(WHITELIST_1); + addInitRelayer(WHITELIST_2); + alreadyInit = true; } function addInitRelayer(address addr) internal { - managers[addr] = manager(INIT_REQUIRED_DEPOSIT, INIT_DUES); + managers[addr] = manager(requiredDeposit, dues); managersRegistered[addr] = true; relayManagersExistMap[addr] = true; managersAndRelayers[addr] = addr; // fixme current relayer @@ -150,22 +152,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManagerEvent(msg.sender); } - function addRelayer(address relayerToBeAdded) internal onlyRegisteredManager noProxy { - require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); - require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - - managersAndRelayers[msg.sender] = relayerToBeAdded; - relayerExistsMap[relayerToBeAdded] = true; - emit editRelayerEvent(relayerToBeAdded); - } - - function editRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { + function addRelayer(address relayerToBeAdded) public onlyRegisteredManager noProxy { require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + if(managersAndRelayers[msg.sender] != address(0)) { + address r = managersAndRelayers[msg.sender]; + delete (relayerExistsMap[r]); + emit removeRelayerEvent(r); + } + managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; - emit editRelayerEvent(relayerToBeAdded); + emit addRelayerEvent(relayerToBeAdded); } function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { @@ -192,6 +191,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // TODO remove just for testing function isManager(address relayerAddress) external view returns (bool){ - return managersRegistered[relayerAddress]; + return relayManagersExistMap[relayerAddress]; } } diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index bf2380c5..045dadfa 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -63,18 +63,20 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event removeManagerByGovEvent(address _removedManager); event addManagerByGovEvent(address _addedManager); event registerManagerEvent(address _registeredManager); - event editRelayerEvent(address _relayerToBeAdded); + event addRelayerEvent(address _relayerToBeAdded); event removeRelayerEvent(address _removedRelayer); function init() external onlyNotInit { - alreadyInit = true; - addInitRelayer(WHITELIST_1); + requiredDeposit = INIT_REQUIRED_DEPOSIT; + dues = INIT_DUES; addInitRelayer(WHITELIST_1); + addInitRelayer(WHITELIST_2); + alreadyInit = true; } function addInitRelayer(address addr) internal { - managers[addr] = manager(INIT_REQUIRED_DEPOSIT, INIT_DUES); + managers[addr] = manager(requiredDeposit, dues); managersRegistered[addr] = true; relayManagersExistMap[addr] = true; managersAndRelayers[addr] = addr; // fixme current relayer @@ -160,22 +162,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManagerEvent(msg.sender); } - function addRelayer(address relayerToBeAdded) internal onlyRegisteredManager noProxy { - require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); - require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - - managersAndRelayers[msg.sender] = relayerToBeAdded; - relayerExistsMap[relayerToBeAdded] = true; - emit editRelayerEvent(relayerToBeAdded); - } - - function editRelayer(address relayerToBeAdded) external onlyRegisteredManager noProxy { + function addRelayer(address relayerToBeAdded) public onlyRegisteredManager noProxy { require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); + if(managersAndRelayers[msg.sender] != address(0)) { + address r = managersAndRelayers[msg.sender]; + delete (relayerExistsMap[r]); + emit removeRelayerEvent(r); + } + managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; - emit editRelayerEvent(relayerToBeAdded); + emit addRelayerEvent(relayerToBeAdded); } function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { @@ -202,6 +201,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // TODO remove just for testing function isManager(address relayerAddress) external view returns (bool){ - return managersRegistered[relayerAddress]; + return relayManagersExistMap[relayerAddress]; } } From 5c501c445f40b670b5b3b97b809345ade5159b7b Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 20 Dec 2022 13:04:47 +0000 Subject: [PATCH 28/84] Remove unneeded modifier + properly remove relayer --- contracts/RelayerHub.sol | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 613a0df8..ca244f32 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -107,7 +107,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { removeManagerHelper(managerToBeRemoved); } - function removeManager() external onlyRegisteredManager { + function removeManager() external { // here the manager removes himself removeManagerHelper(payable(msg.sender)); } @@ -132,6 +132,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // emit success event emit removeManagerByGovEvent(managerAddress); if (relayerAddress != address(0)) { + delete (relayerExistsMap[relayerAddress]); emit removeRelayerEvent(relayerAddress); } } @@ -152,7 +153,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManagerEvent(msg.sender); } - function addRelayer(address relayerToBeAdded) public onlyRegisteredManager noProxy { + function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); @@ -169,7 +170,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { registerManager(); - addRelayer(relayer); + updateRelayer(relayer); } function removeRelayer() external onlyRegisteredManager { From ce2ea8fc213672665cfcf3c9e03a3a7c8e4c6c15 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 20 Dec 2022 13:25:27 +0000 Subject: [PATCH 29/84] updateRelayer event and no need for removeRelayer --- contracts/RelayerHub.sol | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index ca244f32..21e43f17 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -55,6 +55,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event registerManagerEvent(address _registeredManager); event addRelayerEvent(address _relayerToBeAdded); event removeRelayerEvent(address _removedRelayer); + event updateRelayerEvent(address _from, address _to); function init() external onlyNotInit { @@ -153,19 +154,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit registerManagerEvent(msg.sender); } + // updateRelayer() can be used to add relayer for the first time, update it in future and remove it + // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - if(managersAndRelayers[msg.sender] != address(0)) { - address r = managersAndRelayers[msg.sender]; - delete (relayerExistsMap[r]); - emit removeRelayerEvent(r); - } - + address oldRelayer = managersAndRelayers[msg.sender]; + relayerExistsMap[oldRelayer] = false; + managersAndRelayers[msg.sender] = relayerToBeAdded; relayerExistsMap[relayerToBeAdded] = true; - emit addRelayerEvent(relayerToBeAdded); + + emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { @@ -173,19 +174,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { updateRelayer(relayer); } - function removeRelayer() external onlyRegisteredManager { - if (managersAndRelayers[msg.sender] == address(0)) { - require(false, "relayer doesn't exist for this manager"); - } - - address r = managersAndRelayers[msg.sender]; - - delete (relayerExistsMap[r]); - delete (managersAndRelayers[msg.sender]); - - emit removeRelayerEvent(r); - } - function isRelayer(address relayerAddress) external override view returns (bool){ return relayerExistsMap[relayerAddress]; } From 6dfa1690db3275431c080108c54e7571013fb988 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 20 Dec 2022 13:38:28 +0000 Subject: [PATCH 30/84] For smooth transition and let old relayers exit --- contracts/RelayerHub.sol | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 21e43f17..8117881c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -19,6 +19,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public requiredDeposit; uint256 public dues; + mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit + mapping(address => bool) relayersExistMap; + mapping(address => manager) managers; mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; @@ -30,6 +33,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } + modifier onlyPreviousRegisteredRelayer() { + require(relayersExistMap[msg.sender], "relayer do not exist"); + _; + } + modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); _; @@ -46,6 +54,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } + modifier onlyAllowedParty() { + require(msg.sender == 0xb005741528b86F5952469d80A8614591E3c5B632 || msg.sender == 0x446AA6E0DC65690403dF3F127750da1322941F3e, "the msg sender is not allowed to call update to ensure smooth transition"); + // todo change the above address to appropriate ones + _; + } + + event relayerUnRegister(address _relayer); + event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -57,13 +73,25 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event removeRelayerEvent(address _removedRelayer); event updateRelayerEvent(address _from, address _to); + function exitOldRelayers() external onlyPreviousRegisteredRelayer { + relayer memory r = relayers[msg.sender]; + msg.sender.transfer(r.deposit.sub(r.dues)); + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(r.dues); + delete relayersExistMap[msg.sender]; + delete relayers[msg.sender]; + emit relayerUnRegister(msg.sender); + } function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; dues = INIT_DUES; + alreadyInit = true; + } + + function update() external onlyAllowedParty { addInitRelayer(WHITELIST_1); addInitRelayer(WHITELIST_2); - alreadyInit = true; } function addInitRelayer(address addr) internal { From 21fd9d690962e22b2d3f7a9e3feadfeae7eabf05 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 21 Dec 2022 08:21:00 +0000 Subject: [PATCH 31/84] Only use updateRelayerEvent + Refacoring functions --- contracts/RelayerHub.sol | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 8117881c..4202931b 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -34,7 +34,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } modifier onlyPreviousRegisteredRelayer() { - require(relayersExistMap[msg.sender], "relayer do not exist"); + require(relayersExistMap[msg.sender], "relayer does not exist"); _; } @@ -56,7 +56,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { modifier onlyAllowedParty() { require(msg.sender == 0xb005741528b86F5952469d80A8614591E3c5B632 || msg.sender == 0x446AA6E0DC65690403dF3F127750da1322941F3e, "the msg sender is not allowed to call update to ensure smooth transition"); - // todo change the above address to appropriate ones + // todo change the above address to appropriate ones which can call update() _; } @@ -69,8 +69,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event removeManagerByGovEvent(address _removedManager); event addManagerByGovEvent(address _addedManager); event registerManagerEvent(address _registeredManager); - event addRelayerEvent(address _relayerToBeAdded); - event removeRelayerEvent(address _removedRelayer); event updateRelayerEvent(address _from, address _to); function exitOldRelayers() external onlyPreviousRegisteredRelayer { @@ -133,15 +131,15 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function removeManagerByGov(address payable managerToBeRemoved) internal { - removeManagerHelper(managerToBeRemoved); + removeManager(managerToBeRemoved); } - function removeManager() external { + function removeManagerByHimself() external { // here the manager removes himself - removeManagerHelper(payable(msg.sender)); + removeManager(payable(msg.sender)); } - function removeManagerHelper(address payable managerAddress) internal { + function removeManager(address payable managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); @@ -162,7 +160,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit removeManagerByGovEvent(managerAddress); if (relayerAddress != address(0)) { delete (relayerExistsMap[relayerAddress]); - emit removeRelayerEvent(relayerAddress); + emit updateRelayerEvent(relayerAddress, address(0)); } } From b570b674a00a16b6582a5672de5f8f38dae25cee Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 21 Dec 2022 08:38:59 +0000 Subject: [PATCH 32/84] Better naming of some maps --- contracts/RelayerHub.sol | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 4202931b..7ddea7cc 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -25,8 +25,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => manager) managers; mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; - mapping(address => address) managersAndRelayers; - mapping(address => bool) relayerExistsMap; + mapping(address => address) managerToRelayer; + mapping(address => bool) currentRelayers; struct manager { uint256 deposit; @@ -96,8 +96,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { managers[addr] = manager(requiredDeposit, dues); managersRegistered[addr] = true; relayManagersExistMap[addr] = true; - managersAndRelayers[addr] = addr; // fixme current relayer - relayerExistsMap[addr] = true; + managerToRelayer[addr] = addr; // fixme current relayer + currentRelayers[addr] = true; } /*********************** Param update ********************************/ @@ -143,10 +143,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); - address relayerAddress = managersAndRelayers[managerAddress]; + address relayerAddress = managerToRelayer[managerAddress]; delete (relayManagersExistMap[managerAddress]); - delete (managersAndRelayers[managerAddress]); + delete (managerToRelayer[managerAddress]); manager memory a = managers[managerAddress]; managerAddress.transfer(a.deposit.sub(a.dues)); @@ -159,7 +159,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // emit success event emit removeManagerByGovEvent(managerAddress); if (relayerAddress != address(0)) { - delete (relayerExistsMap[relayerAddress]); + delete (currentRelayers[relayerAddress]); emit updateRelayerEvent(relayerAddress, address(0)); } } @@ -183,14 +183,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { - require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); + require(!currentRelayers[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - address oldRelayer = managersAndRelayers[msg.sender]; - relayerExistsMap[oldRelayer] = false; + address oldRelayer = managerToRelayer[msg.sender]; + currentRelayers[oldRelayer] = false; - managersAndRelayers[msg.sender] = relayerToBeAdded; - relayerExistsMap[relayerToBeAdded] = true; + managerToRelayer[msg.sender] = relayerToBeAdded; + currentRelayers[relayerToBeAdded] = true; emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } @@ -201,7 +201,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function isRelayer(address relayerAddress) external override view returns (bool){ - return relayerExistsMap[relayerAddress]; + return currentRelayers[relayerAddress]; } // TODO remove just for testing From dacd6ec2cce74229756daf309798b35a42751eed Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 21 Dec 2022 09:46:23 +0000 Subject: [PATCH 33/84] update only once --- contracts/RelayerHub.sol | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 7ddea7cc..f2c67e09 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -11,6 +11,8 @@ import "./lib/SafeMath.sol"; contract RelayerHub is IRelayerHub, System, IParamSubscriber { using SafeMath for uint256; + bool public alreadyUpdate; + uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; @@ -88,8 +90,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function update() external onlyAllowedParty { + require(!alreadyUpdate, "the contract already updated"); addInitRelayer(WHITELIST_1); addInitRelayer(WHITELIST_2); + alreadyUpdate = true; } function addInitRelayer(address addr) internal { From 744320e2afcbc8da56d5097ab1e1b175d62f777c Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 21 Dec 2022 13:26:49 +0000 Subject: [PATCH 34/84] Remove repeated event --- contracts/RelayerHub.sol | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f2c67e09..433ee414 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -62,8 +62,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - event relayerUnRegister(address _relayer); - event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -152,10 +150,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); - manager memory a = managers[managerAddress]; - managerAddress.transfer(a.deposit.sub(a.dues)); + manager memory m = managers[managerAddress]; + managerAddress.transfer(m.deposit.sub(m.dues)); address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); - systemPayable.transfer(a.dues); + systemPayable.transfer(m.dues); delete (managers[managerAddress]); delete (managersRegistered[managerAddress]); @@ -177,7 +175,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit addManagerByGovEvent(managerToBeAdded); } - function registerManager() internal onlyNonRegisteredManager { + function registerManager() internal { require(msg.value == requiredDeposit, "deposit value is not exactly the same"); managers[msg.sender] = manager(requiredDeposit, dues); managersRegistered[msg.sender] = true; From 2820ea46ab935a98e382b28e21f34b5b51c69d0c Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 23 Dec 2022 14:05:28 +0000 Subject: [PATCH 35/84] Remove onlyAllowedParty + correct var order --- contracts/RelayerHub.sol | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 433ee414..ea34071b 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -11,8 +11,6 @@ import "./lib/SafeMath.sol"; contract RelayerHub is IRelayerHub, System, IParamSubscriber { using SafeMath for uint256; - bool public alreadyUpdate; - uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; @@ -24,12 +22,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit mapping(address => bool) relayersExistMap; + struct relayer{ + uint256 deposit; + uint256 dues; + } + mapping(address => manager) managers; mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; + bool public alreadyUpdate; + struct manager { uint256 deposit; uint256 dues; @@ -56,12 +61,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - modifier onlyAllowedParty() { - require(msg.sender == 0xb005741528b86F5952469d80A8614591E3c5B632 || msg.sender == 0x446AA6E0DC65690403dF3F127750da1322941F3e, "the msg sender is not allowed to call update to ensure smooth transition"); - // todo change the above address to appropriate ones which can call update() - _; - } - event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -87,7 +86,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { alreadyInit = true; } - function update() external onlyAllowedParty { + function update() external { require(!alreadyUpdate, "the contract already updated"); addInitRelayer(WHITELIST_1); addInitRelayer(WHITELIST_2); From 627bb00ad435e2a9d9b45502f8aae754226f69d6 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 2 Jan 2023 10:41:20 +0000 Subject: [PATCH 36/84] remove deposit + bring back old withdraw --- contracts/RelayerHub.sol | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index ea34071b..eef9fdb2 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -16,13 +16,13 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - uint256 public requiredDeposit; + uint256 public requiredDeposit; // have to keep it to not break the storage layout uint256 public dues; mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit mapping(address => bool) relayersExistMap; - struct relayer{ + struct relayer { uint256 deposit; uint256 dues; } @@ -36,15 +36,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { bool public alreadyUpdate; struct manager { - uint256 deposit; uint256 dues; } - modifier onlyPreviousRegisteredRelayer() { - require(relayersExistMap[msg.sender], "relayer does not exist"); - _; - } - modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); _; @@ -61,6 +55,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } + modifier exist() { + require(relayersExistMap[msg.sender], "relayer do not exist"); + _; + } + event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); @@ -70,7 +69,13 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event registerManagerEvent(address _registeredManager); event updateRelayerEvent(address _from, address _to); - function exitOldRelayers() external onlyPreviousRegisteredRelayer { + function init() external onlyNotInit { + requiredDeposit = INIT_REQUIRED_DEPOSIT; + dues = INIT_DUES; + alreadyInit = true; + } + + function unregister() external exist onlyInit { relayer memory r = relayers[msg.sender]; msg.sender.transfer(r.deposit.sub(r.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); @@ -80,12 +85,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit relayerUnRegister(msg.sender); } - function init() external onlyNotInit { - requiredDeposit = INIT_REQUIRED_DEPOSIT; - dues = INIT_DUES; - alreadyInit = true; - } - function update() external { require(!alreadyUpdate, "the contract already updated"); addInitRelayer(WHITELIST_1); @@ -94,7 +93,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { - managers[addr] = manager(requiredDeposit, dues); + managers[addr] = manager(dues); managersRegistered[addr] = true; relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // fixme current relayer @@ -150,7 +149,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (managerToRelayer[managerAddress]); manager memory m = managers[managerAddress]; - managerAddress.transfer(m.deposit.sub(m.dues)); address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); systemPayable.transfer(m.dues); @@ -175,8 +173,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function registerManager() internal { - require(msg.value == requiredDeposit, "deposit value is not exactly the same"); - managers[msg.sender] = manager(requiredDeposit, dues); + managers[msg.sender] = manager(dues); managersRegistered[msg.sender] = true; emit registerManagerEvent(msg.sender); } @@ -196,9 +193,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } - function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { + function registerManagerAddRelayer(address r) external payable onlyNonRegisteredManager { registerManager(); - updateRelayer(relayer); + updateRelayer(r); } function isRelayer(address relayerAddress) external override view returns (bool){ From 14f9aada3bdabfa5e95a28fa5f1096617e064cbb Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 5 Jan 2023 06:10:01 +0000 Subject: [PATCH 37/84] test for adding new param which doesn't work --- lib/interface/IRelayerHub.sol | 1 + test/RelayerHub.t.sol | 115 ++++++++++++++++++++-------------- 2 files changed, 70 insertions(+), 46 deletions(-) diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 105a5d80..314fdf6c 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -36,4 +36,5 @@ interface RelayerHub { function requiredDeposit() external view returns (uint256); function unregister() external; function updateParam(string memory key, bytes memory value) external; + function registerManagerAddRelayer(address r) external payable; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index ce8c9a7e..f4b297de 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -3,50 +3,73 @@ pragma solidity ^0.8.10; import "../lib/Deployer.sol"; contract RelayerHubTest is Deployer { - event relayerRegister(address _relayer); - event relayerUnRegister(address _relayer); - event paramChange(string key, bytes value); - - uint256 public requiredDeposit; - uint256 public dues; - - function setUp() public { - requiredDeposit = relayerHub.requiredDeposit(); - dues = relayerHub.dues(); - } - - // new relayer register is suspended - function testRegister() public { - address newRelayer = addrSet[addrIdx++]; - vm.prank(newRelayer, newRelayer); - vm.expectRevert(bytes("register suspended")); - relayerHub.register{value: 100 ether}(); - } - - // function testCannotRegister() public { - // address newRelayer = addrSet[addrIdx++]; - // vm.startPrank(newRelayer, newRelayer); - // relayerHub.register{value: 100 ether}(); - // - // // re-register - // vm.expectRevert(bytes("relayer already exist")); - // relayerHub.register{value: 100 ether}(); - // - // relayerHub.unregister(); - // // re-unregister - // vm.expectRevert(bytes("relayer do not exist")); - // relayerHub.unregister(); - // - // vm.stopPrank(); - // newRelayer = addrSet[addrIdx++]; - // vm.startPrank(newRelayer, newRelayer); - // - // // send 200 ether - // vm.expectRevert(bytes("deposit value is not exactly the same")); - // relayerHub.register{value: 200 ether}(); - // - // // send 10 ether - // vm.expectRevert(bytes("deposit value is not exactly the same")); - // relayerHub.register{value: 10 ether}(); - // } + event relayerRegister(address _relayer); + event relayerUnRegister(address _relayer); + event paramChange(string key, bytes value); + + uint256 public requiredDeposit; + uint256 public dues; + + function setUp() public { + requiredDeposit = relayerHub.requiredDeposit(); + dues = relayerHub.dues(); + } + + // new relayer register is suspended + function testRegister() public { + address newRelayer = addrSet[addrIdx++]; + vm.prank(newRelayer, newRelayer); + vm.expectRevert(bytes("register suspended")); + relayerHub.register{value : 100 ether}(); + } + + function testAddManager() public { + address manager = payable(addrSet[addrIdx++]); + address newRelayer = payable(addrSet[addrIdx++]); + + // testing if we can update "dues" param which is currently there on mainnet. + // this works fine in forge test + bytes memory keyDues = "dues"; + uint256 valueDues = 23; + bytes memory testValueBytes = abi.encode(valueDues); + updateParamByGovHub(keyDues, testValueBytes, address(relayerHub)); + + // testing if we can update "addManager" param which is currently NOT there on mainnet but exists locally. + // this gives error of "unknown param" in "forge test -vvvv --match-test testAddManager" + bytes memory key = "addManager"; + bytes memory valueBytes = abi.encode(manager); + updateParamByGovHub(key, valueBytes, address(relayerHub)); + + // check if manager is there + vm.prank(manager, manager); + relayerHub.registerManagerAddRelayer(newRelayer); + + } + + // function testCannotRegister() public { + // address newRelayer = addrSet[addrIdx++]; + // vm.startPrank(newRelayer, newRelayer); + // relayerHub.register{value: 100 ether}(); + // + // // re-register + // vm.expectRevert(bytes("relayer already exist")); + // relayerHub.register{value: 100 ether}(); + // + // relayerHub.unregister(); + // // re-unregister + // vm.expectRevert(bytes("relayer do not exist")); + // relayerHub.unregister(); + // + // vm.stopPrank(); + // newRelayer = addrSet[addrIdx++]; + // vm.startPrank(newRelayer, newRelayer); + // + // // send 200 ether + // vm.expectRevert(bytes("deposit value is not exactly the same")); + // relayerHub.register{value: 200 ether}(); + // + // // send 10 ether + // vm.expectRevert(bytes("deposit value is not exactly the same")); + // relayerHub.register{value: 10 ether}(); + // } } From 0ad173aad6096d6e5350c64b726642e99a34b234 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 5 Jan 2023 11:46:01 +0000 Subject: [PATCH 38/84] correct the test --- test/RelayerHub.t.sol | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index f4b297de..6316a9e4 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -24,26 +24,28 @@ contract RelayerHubTest is Deployer { } function testAddManager() public { - address manager = payable(addrSet[addrIdx++]); - address newRelayer = payable(addrSet[addrIdx++]); + RelayerHub newRelayerHub; - // testing if we can update "dues" param which is currently there on mainnet. - // this works fine in forge test - bytes memory keyDues = "dues"; - uint256 valueDues = 23; - bytes memory testValueBytes = abi.encode(valueDues); - updateParamByGovHub(keyDues, testValueBytes, address(relayerHub)); + bytes memory relayerCode = vm.getDeployedCode("RelayerHub.sol"); + vm.etch(RELAYERHUB_CONTRACT_ADDR, relayerCode); + newRelayerHub = RelayerHub(RELAYERHUB_CONTRACT_ADDR); - // testing if we can update "addManager" param which is currently NOT there on mainnet but exists locally. - // this gives error of "unknown param" in "forge test -vvvv --match-test testAddManager" bytes memory key = "addManager"; - bytes memory valueBytes = abi.encode(manager); - updateParamByGovHub(key, valueBytes, address(relayerHub)); + address manager = payable(addrSet[addrIdx++]); + address newRelayer = payable(addrSet[addrIdx++]); + bytes memory valueBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueBytes.length == 20, "length of manager address mismatch in tests"); + + updateParamByGovHub(key, valueBytes, address(newRelayerHub)); - // check if manager is there + // check if manager is there and can add a relayer vm.prank(manager, manager); - relayerHub.registerManagerAddRelayer(newRelayer); + newRelayerHub.registerManagerAddRelayer(newRelayer); + // do illegal call + vm.prank(newRelayer, newRelayer); + vm.expectRevert(bytes("manager does not exist")); + newRelayerHub.registerManagerAddRelayer(manager); } // function testCannotRegister() public { From af5b457d35e13568343b811562c7103e24844f65 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 9 Jan 2023 11:32:47 +0000 Subject: [PATCH 39/84] testunregister --- contracts/RelayerHub.sol | 2 +- test/RelayerHub.t.sol | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index eef9fdb2..b324dd0b 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -96,7 +96,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { managers[addr] = manager(dues); managersRegistered[addr] = true; relayManagersExistMap[addr] = true; - managerToRelayer[addr] = addr; // fixme current relayer + managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 6316a9e4..2c58088a 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -48,6 +48,37 @@ contract RelayerHubTest is Deployer { newRelayerHub.registerManagerAddRelayer(manager); } + // todo test data + + + // this checks if the previously existing unregister() function can support safe exit for existing relayers after hardfork + function testunregister() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + address existingRelayer1 = 0xb005741528b86F5952469d80A8614591E3c5B632; + vm.prank(existingRelayer1, existingRelayer1); + newRelayerHub.unregister(); + + address existingRelayer2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; + vm.prank(existingRelayer2, existingRelayer2); + newRelayerHub.unregister(); + + address nonExistingRelayer = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; + vm.prank(nonExistingRelayer, nonExistingRelayer); + vm.expectRevert(bytes("relayer do not exist")); + newRelayerHub.unregister(); + } + + function helperGetNewRelayerHub() internal returns (RelayerHub) { + RelayerHub newRelayerHub; + + bytes memory relayerCode = vm.getDeployedCode("RelayerHub.sol"); + vm.etch(RELAYERHUB_CONTRACT_ADDR, relayerCode); + newRelayerHub = RelayerHub(RELAYERHUB_CONTRACT_ADDR); + + return newRelayerHub; + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From f0b45900c9ae2812638cf9f6caafe6c6ef360aa6 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 9 Jan 2023 14:11:13 +0000 Subject: [PATCH 40/84] Check emit event --- test/RelayerHub.t.sol | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 2c58088a..7207068f 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -6,6 +6,7 @@ contract RelayerHubTest is Deployer { event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); + event updateRelayerEvent(address _from, address _to); uint256 public requiredDeposit; uint256 public dues; @@ -24,11 +25,7 @@ contract RelayerHubTest is Deployer { } function testAddManager() public { - RelayerHub newRelayerHub; - - bytes memory relayerCode = vm.getDeployedCode("RelayerHub.sol"); - vm.etch(RELAYERHUB_CONTRACT_ADDR, relayerCode); - newRelayerHub = RelayerHub(RELAYERHUB_CONTRACT_ADDR); + RelayerHub newRelayerHub = helperGetNewRelayerHub(); bytes memory key = "addManager"; address manager = payable(addrSet[addrIdx++]); @@ -40,6 +37,8 @@ contract RelayerHubTest is Deployer { // check if manager is there and can add a relayer vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(payable(address(0)), newRelayer); newRelayerHub.registerManagerAddRelayer(newRelayer); // do illegal call From 96d1b633c0d4c7796eec45c53cdd5d79e3e3fbd6 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 9 Jan 2023 17:17:51 +0000 Subject: [PATCH 41/84] remove manager and ismanger, isrelayer test --- lib/interface/IRelayerHub.sol | 1 + test/RelayerHub.t.sol | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 314fdf6c..68b3fb5a 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -37,4 +37,5 @@ interface RelayerHub { function unregister() external; function updateParam(string memory key, bytes memory value) external; function registerManagerAddRelayer(address r) external payable; + function isManager(address relayerAddress) external view returns (bool); } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 7207068f..55674f9d 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -7,6 +7,7 @@ contract RelayerHubTest is Deployer { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); event updateRelayerEvent(address _from, address _to); + event removeManagerByGovEvent(address _manager); uint256 public requiredDeposit; uint256 public dues; @@ -27,13 +28,13 @@ contract RelayerHubTest is Deployer { function testAddManager() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - bytes memory key = "addManager"; + bytes memory keyAddManager = "addManager"; address manager = payable(addrSet[addrIdx++]); address newRelayer = payable(addrSet[addrIdx++]); - bytes memory valueBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueBytes.length == 20, "length of manager address mismatch in tests"); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(key, valueBytes, address(newRelayerHub)); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); // check if manager is there and can add a relayer vm.prank(manager, manager); @@ -45,6 +46,22 @@ contract RelayerHubTest is Deployer { vm.prank(newRelayer, newRelayer); vm.expectRevert(bytes("manager does not exist")); newRelayerHub.registerManagerAddRelayer(manager); + + bool isRelayerTrue = newRelayerHub.isRelayer(newRelayer); + assertTrue(isRelayerTrue); + + bool isManagerTrue = newRelayerHub.isManager(manager); + assertTrue(isManagerTrue); + + // remove manager test i.e. for removeManager() + bytes memory keyRemoveManager = "removeManager"; + vm.expectEmit(true, true, false, true); + emit removeManagerByGovEvent(manager); + updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); + +// bool isRelayerFalse = newRelayerHub.isRelayer(manager); +// assertFalse(isRelayerFalse); + } // todo test data From 7c5f2a0c38f5f8ab092af181f45a840e2f87fea3 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 10 Jan 2023 07:23:53 +0000 Subject: [PATCH 42/84] removeManagerByHimself test + comments --- contracts/RelayerHub.sol | 1 + lib/interface/IRelayerHub.sol | 1 + test/RelayerHub.t.sol | 21 ++++++++++++++++----- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index b324dd0b..2e015a37 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -85,6 +85,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit relayerUnRegister(msg.sender); } + // todo this is probably no longer needed, so remove this function update() external { require(!alreadyUpdate, "the contract already updated"); addInitRelayer(WHITELIST_1); diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 68b3fb5a..b46a4928 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -38,4 +38,5 @@ interface RelayerHub { function updateParam(string memory key, bytes memory value) external; function registerManagerAddRelayer(address r) external payable; function isManager(address relayerAddress) external view returns (bool); + function removeManagerByHimself() external; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 55674f9d..c0ba94f0 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -47,9 +47,11 @@ contract RelayerHubTest is Deployer { vm.expectRevert(bytes("manager does not exist")); newRelayerHub.registerManagerAddRelayer(manager); + // check if relayer is added bool isRelayerTrue = newRelayerHub.isRelayer(newRelayer); assertTrue(isRelayerTrue); + // check if manager is added bool isManagerTrue = newRelayerHub.isManager(manager); assertTrue(isManagerTrue); @@ -59,15 +61,22 @@ contract RelayerHubTest is Deployer { emit removeManagerByGovEvent(manager); updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); -// bool isRelayerFalse = newRelayerHub.isRelayer(manager); -// assertFalse(isRelayerFalse); + // check if relayer got removed + bool isRelayerFalse = newRelayerHub.isRelayer(newRelayer); + assertFalse(isRelayerFalse); - } - - // todo test data + // check if manager got removed + bool isManagerFalse = newRelayerHub.isManager(manager); + assertFalse(isManagerFalse); + // check if the manager can remove himself + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + vm.prank(manager, manager); + newRelayerHub.removeManagerByHimself(); + } // this checks if the previously existing unregister() function can support safe exit for existing relayers after hardfork + // this indirectly tests whether update() was called or not function testunregister() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); @@ -85,6 +94,8 @@ contract RelayerHubTest is Deployer { newRelayerHub.unregister(); } + // helperGetNewRelayerHub() deploys the new RelayerHub into the existing mainnet data so that we can test + // data compatibility function helperGetNewRelayerHub() internal returns (RelayerHub) { RelayerHub newRelayerHub; From 466688db87877076c43849109db894519952e56c Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 10 Jan 2023 08:42:20 +0000 Subject: [PATCH 43/84] testCurrentRelayerTransition() and update() --- lib/interface/IRelayerHub.sol | 1 + test/RelayerHub.t.sol | 28 +++++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index b46a4928..0baeef58 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -39,4 +39,5 @@ interface RelayerHub { function registerManagerAddRelayer(address r) external payable; function isManager(address relayerAddress) external view returns (bool); function removeManagerByHimself() external; + function update() external; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index c0ba94f0..b20dab7d 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -76,7 +76,6 @@ contract RelayerHubTest is Deployer { } // this checks if the previously existing unregister() function can support safe exit for existing relayers after hardfork - // this indirectly tests whether update() was called or not function testunregister() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); @@ -94,6 +93,33 @@ contract RelayerHubTest is Deployer { newRelayerHub.unregister(); } + function testCurrentRelayerTransition() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + // an existing manager/relayer won't be shown to be valid since update() isn't called + // note that for pre-hardfork, the relayer and manager are the same for simplicity + address existingRelayer1 = 0xb005741528b86F5952469d80A8614591E3c5B632; + bool isManagerFalse = newRelayerHub.isManager(existingRelayer1); + assertFalse(isManagerFalse); + bool isRelayerFalse = newRelayerHub.isRelayer(existingRelayer1); + assertFalse(isRelayerFalse); + + + // now we call update() and the existing relayer/manager should be shown to be valid + newRelayerHub.update(); + bool isManagerTrue = newRelayerHub.isManager(existingRelayer1); + assertTrue(isManagerTrue); + bool isRelayerTrue = newRelayerHub.isRelayer(existingRelayer1); + assertTrue(isRelayerTrue); + + // for completeness, now we test that a non-existing address isn't a relayer or manager + address nonExistingRelayer = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; + bool isManagerFalse2 = newRelayerHub.isManager(nonExistingRelayer); + assertFalse(isManagerFalse2); + bool isRelayerFalse2 = newRelayerHub.isRelayer(nonExistingRelayer); + assertFalse(isRelayerFalse2); + } + // helperGetNewRelayerHub() deploys the new RelayerHub into the existing mainnet data so that we can test // data compatibility function helperGetNewRelayerHub() internal returns (RelayerHub) { From d0b9e2ad1dc6c4b2f776895b04976ef67263c6b9 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 10 Jan 2023 12:38:35 +0000 Subject: [PATCH 44/84] Remove manager struct --- contracts/RelayerHub.sol | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 2e015a37..27b1200e 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -27,7 +27,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } - mapping(address => manager) managers; + mapping(address => uint256) managerDeus; mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; @@ -35,10 +35,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { bool public alreadyUpdate; - struct manager { - uint256 dues; - } - modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); _; @@ -94,7 +90,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { - managers[addr] = manager(dues); + managerDeus[addr] = dues; managersRegistered[addr] = true; relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same @@ -149,11 +145,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); - manager memory m = managers[managerAddress]; + uint256 mDues = managerDeus[managerAddress]; address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); - systemPayable.transfer(m.dues); + systemPayable.transfer(mDues); - delete (managers[managerAddress]); + delete (managerDeus[managerAddress]); delete (managersRegistered[managerAddress]); // emit success event @@ -174,7 +170,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function registerManager() internal { - managers[msg.sender] = manager(dues); + managerDeus[msg.sender] = dues; managersRegistered[msg.sender] = true; emit registerManagerEvent(msg.sender); } From 58f82eb262cc49e4ed655215eb6812f3e8b57636 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 11 Jan 2023 13:55:03 +0000 Subject: [PATCH 45/84] Refactor + remove unwanted functions --- contracts/RelayerHub.sol | 37 +++++++++++++------------------------ test/RelayerHub.t.sol | 4 ++-- 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 27b1200e..f1f8093c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -27,7 +27,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } - mapping(address => uint256) managerDeus; + mapping(address => uint256) managerDues; mapping(address => bool) managersRegistered; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; @@ -46,11 +46,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - modifier noProxy() { - require(msg.sender == tx.origin, "no proxy is allowed"); - _; - } - modifier exist() { require(relayersExistMap[msg.sender], "relayer do not exist"); _; @@ -60,7 +55,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerByGovEvent(address _removedManager); + event removeManagerEvent(address _removedManager); event addManagerByGovEvent(address _addedManager); event registerManagerEvent(address _registeredManager); event updateRelayerEvent(address _from, address _to); @@ -90,7 +85,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { - managerDeus[addr] = dues; + managerDues[addr] = dues; managersRegistered[addr] = true; relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same @@ -119,7 +114,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(value.length == 20, "length of manager address mismatch"); address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); - removeManagerByGov(managerAddress); + removeManager(managerAddress); } else { require(false, "unknown param"); @@ -127,10 +122,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit paramChange(key, value); } - function removeManagerByGov(address payable managerToBeRemoved) internal { - removeManager(managerToBeRemoved); - } - function removeManagerByHimself() external { // here the manager removes himself removeManager(payable(msg.sender)); @@ -145,15 +136,15 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); - uint256 mDues = managerDeus[managerAddress]; + uint256 mDues = managerDues[managerAddress]; address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); systemPayable.transfer(mDues); - delete (managerDeus[managerAddress]); + delete (managerDues[managerAddress]); delete (managersRegistered[managerAddress]); // emit success event - emit removeManagerByGovEvent(managerAddress); + emit removeManagerEvent(managerAddress); if (relayerAddress != address(0)) { delete (currentRelayers[relayerAddress]); emit updateRelayerEvent(relayerAddress, address(0)); @@ -169,12 +160,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit addManagerByGovEvent(managerToBeAdded); } - function registerManager() internal { - managerDeus[msg.sender] = dues; - managersRegistered[msg.sender] = true; - emit registerManagerEvent(msg.sender); - } - // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { @@ -182,7 +167,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; - currentRelayers[oldRelayer] = false; + delete currentRelayers[oldRelayer]; managerToRelayer[msg.sender] = relayerToBeAdded; currentRelayers[relayerToBeAdded] = true; @@ -191,7 +176,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function registerManagerAddRelayer(address r) external payable onlyNonRegisteredManager { - registerManager(); + // register manager + managerDues[msg.sender] = dues; + managersRegistered[msg.sender] = true; + emit registerManagerEvent(msg.sender); + updateRelayer(r); } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index b20dab7d..842e3b10 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -7,7 +7,7 @@ contract RelayerHubTest is Deployer { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); event updateRelayerEvent(address _from, address _to); - event removeManagerByGovEvent(address _manager); + event removeManagerEvent(address _manager); uint256 public requiredDeposit; uint256 public dues; @@ -58,7 +58,7 @@ contract RelayerHubTest is Deployer { // remove manager test i.e. for removeManager() bytes memory keyRemoveManager = "removeManager"; vm.expectEmit(true, true, false, true); - emit removeManagerByGovEvent(manager); + emit removeManagerEvent(manager); updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); // check if relayer got removed From 673f92992ab73b88cb805d880df26eb302c979bf Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 11 Jan 2023 14:02:53 +0000 Subject: [PATCH 46/84] Remove check that is not needed --- contracts/RelayerHub.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f1f8093c..a5c3bfc9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -41,7 +41,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } modifier onlyRegisteredManager() { - require(relayManagersExistMap[msg.sender], "manager does not exist"); require(managersRegistered[msg.sender], "manager not registered"); _; } From 001e9b3482306b24505b7d67ce9e815d09952af4 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 11 Jan 2023 14:08:49 +0000 Subject: [PATCH 47/84] Refactor to less confusing name --- contracts/RelayerHub.sol | 9 ++++----- lib/interface/IRelayerHub.sol | 2 +- test/RelayerHub.t.sol | 2 +- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index a5c3bfc9..50ededf3 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -33,7 +33,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; - bool public alreadyUpdate; + bool public whitelistInitDone; modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); @@ -75,12 +75,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit relayerUnRegister(msg.sender); } - // todo this is probably no longer needed, so remove this - function update() external { - require(!alreadyUpdate, "the contract already updated"); + function whitelistInit() external { + require(!whitelistInitDone, "the whitelists already updated"); addInitRelayer(WHITELIST_1); addInitRelayer(WHITELIST_2); - alreadyUpdate = true; + whitelistInitDone = true; } function addInitRelayer(address addr) internal { diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 0baeef58..e524d4e9 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -39,5 +39,5 @@ interface RelayerHub { function registerManagerAddRelayer(address r) external payable; function isManager(address relayerAddress) external view returns (bool); function removeManagerByHimself() external; - function update() external; + function whitelistInit() external; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 842e3b10..3963f77d 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -106,7 +106,7 @@ contract RelayerHubTest is Deployer { // now we call update() and the existing relayer/manager should be shown to be valid - newRelayerHub.update(); + newRelayerHub.whitelistInit(); bool isManagerTrue = newRelayerHub.isManager(existingRelayer1); assertTrue(isManagerTrue); bool isRelayerTrue = newRelayerHub.isRelayer(existingRelayer1); From 286f4cebb905d182ab7fadc75356c3a8d16919b1 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 12 Jan 2023 08:12:36 +0000 Subject: [PATCH 48/84] Ensure manager isn't already registered --- contracts/RelayerHub.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 50ededf3..dffb73b5 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -37,6 +37,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); + require(!managersRegistered[msg.sender], "manager already registered"); _; } From ee7473186856adc6d46ed830a238ef17dab42ef6 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 13 Jan 2023 14:26:18 +0000 Subject: [PATCH 49/84] bug info --- contracts/RelayerHub.sol | 1 + lib/interface/IRelayerHub.sol | 1 + 2 files changed, 2 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index dffb73b5..f1dcf939 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -162,6 +162,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { + // todo this is a bug which the current test doesn't capture. Write test which captures this and then add separate case for 0 address require(!currentRelayers[relayerToBeAdded], "relayer already exists"); require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index e524d4e9..ea8644d3 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -40,4 +40,5 @@ interface RelayerHub { function isManager(address relayerAddress) external view returns (bool); function removeManagerByHimself() external; function whitelistInit() external; + function updateRelayer(address relayerToBeAdded) public; } From e94195874f74794ced1ebbcf7ea34af4cdcd2a75 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 13 Jan 2023 16:21:28 +0000 Subject: [PATCH 50/84] Test for relayer address 0 which had a bug --- contracts/RelayerHub.sol | 4 +- lib/interface/IRelayerHub.sol | 19 +++++-- test/RelayerHub.t.sol | 101 +++++++++++++++++++++++++++++++--- 3 files changed, 109 insertions(+), 15 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index f1dcf939..e90e93b1 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -163,7 +163,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { // todo this is a bug which the current test doesn't capture. Write test which captures this and then add separate case for 0 address - require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + if (relayerToBeAdded != address(0)){ + require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + } require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index ea8644d3..9de78e29 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -1,9 +1,13 @@ pragma solidity ^0.8.10; interface RelayerHub { + event addManagerByGovEvent(address _addedManager); event paramChange(string key, bytes value); + event registerManagerEvent(address _registeredManager); event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); + event removeManagerEvent(address _removedManager); + event updateRelayerEvent(address _from, address _to); function BIND_CHANNELID() external view returns (uint8); function CODE_OK() external view returns (uint32); @@ -27,18 +31,21 @@ interface RelayerHub { function TRANSFER_IN_CHANNELID() external view returns (uint8); function TRANSFER_OUT_CHANNELID() external view returns (uint8); function VALIDATOR_CONTRACT_ADDR() external view returns (address); + function WHITELIST_1() external view returns (address); + function WHITELIST_2() external view returns (address); function alreadyInit() external view returns (bool); function bscChainID() external view returns (uint16); function dues() external view returns (uint256); function init() external; - function isRelayer(address sender) external view returns (bool); - function register() external payable; + function isManager(address relayerAddress) external view returns (bool); + function isRelayer(address relayerAddress) external view returns (bool); + function registerManagerAddRelayer(address r) external payable; + function removeManagerByHimself() external; function requiredDeposit() external view returns (uint256); function unregister() external; function updateParam(string memory key, bytes memory value) external; - function registerManagerAddRelayer(address r) external payable; - function isManager(address relayerAddress) external view returns (bool); - function removeManagerByHimself() external; + function updateRelayer(address relayerToBeAdded) external; function whitelistInit() external; - function updateRelayer(address relayerToBeAdded) public; + function whitelistInitDone() external view returns (bool); } + diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 3963f77d..9845709e 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -17,14 +17,6 @@ contract RelayerHubTest is Deployer { dues = relayerHub.dues(); } - // new relayer register is suspended - function testRegister() public { - address newRelayer = addrSet[addrIdx++]; - vm.prank(newRelayer, newRelayer); - vm.expectRevert(bytes("register suspended")); - relayerHub.register{value : 100 ether}(); - } - function testAddManager() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); @@ -55,6 +47,20 @@ contract RelayerHubTest is Deployer { bool isManagerTrue = newRelayerHub.isManager(manager); assertTrue(isManagerTrue); + // set relayer to something else + address newRelayer2 = payable(addrSet[addrIdx++]); + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer, newRelayer2); + newRelayerHub.updateRelayer(newRelayer2); + + // set relayer to 0 + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer2, payable(address(0))); + newRelayerHub.updateRelayer(payable(address(0))); + + // remove manager test i.e. for removeManager() bytes memory keyRemoveManager = "removeManager"; vm.expectEmit(true, true, false, true); @@ -75,6 +81,45 @@ contract RelayerHubTest is Deployer { newRelayerHub.removeManagerByHimself(); } + function testRelayerAddingRemoving() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + address newRelayer = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(payable(address(0)), newRelayer); + newRelayerHub.registerManagerAddRelayer(newRelayer); + + // set relayer to 0 + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer, payable(address(0))); + newRelayerHub.updateRelayer(payable(address(0))); + + // get a new manager, have its relayer registered and then try to remove the relayer for this manager + address manager2 = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); + require(valueManagerBytes2.length == 20, "length of manager2 address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes2, address(newRelayerHub)); + address newRelayer2 = payable(addrSet[addrIdx++]); + vm.prank(manager2, manager2); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(payable(address(0)), newRelayer2); + newRelayerHub.registerManagerAddRelayer(newRelayer2); + // set relayer to 0 + vm.prank(manager2, manager2); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer2, payable(address(0))); + newRelayerHub.updateRelayer(payable(address(0))); + + } + // this checks if the previously existing unregister() function can support safe exit for existing relayers after hardfork function testunregister() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); @@ -132,6 +177,46 @@ contract RelayerHubTest is Deployer { return newRelayerHub; } + function testRelayerAddingRemoving2() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + address newRelayer = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(payable(address(0)), newRelayer); + newRelayerHub.registerManagerAddRelayer(newRelayer); + + address manager2 = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); + require(valueManagerBytes2.length == 20, "length of manager2 address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes2, address(newRelayerHub)); + address newRelayer2 = payable(addrSet[addrIdx++]); + vm.prank(manager2, manager2); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(payable(address(0)), newRelayer2); + newRelayerHub.registerManagerAddRelayer(newRelayer2); + + // set relayer to 0 for first manager + vm.prank(manager, manager); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer, payable(address(0))); + newRelayerHub.updateRelayer(payable(address(0))); + + + // set relayer to 0 for second manager + vm.prank(manager2, manager2); + vm.expectEmit(true, true, false, true); + emit updateRelayerEvent(newRelayer2, payable(address(0))); + newRelayerHub.updateRelayer(payable(address(0))); + + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From 07efff46b7c95c9b1a1a599f96aaa39a9089acdb Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 13 Jan 2023 16:22:23 +0000 Subject: [PATCH 51/84] Remove todo which is already done now --- contracts/RelayerHub.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index e90e93b1..85e0ff96 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -162,8 +162,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { - // todo this is a bug which the current test doesn't capture. Write test which captures this and then add separate case for 0 address - if (relayerToBeAdded != address(0)){ + if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); } require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); From 1e4ab6840810d5a04d02becae2b66c17959dbaad Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 16 Jan 2023 08:48:34 +0000 Subject: [PATCH 52/84] Combine to one manager struct --- contracts/RelayerHub.sol | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 85e0ff96..90cf52c9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -27,8 +27,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } - mapping(address => uint256) managerDues; - mapping(address => bool) managersRegistered; + struct manager { + uint256 dues; + bool registered; + } + + mapping(address => manager) managers; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; @@ -37,12 +41,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { modifier onlyNonRegisteredManager() { require(relayManagersExistMap[msg.sender], "manager does not exist"); - require(!managersRegistered[msg.sender], "manager already registered"); + require(!managers[msg.sender].registered, "manager already registered"); _; } modifier onlyRegisteredManager() { - require(managersRegistered[msg.sender], "manager not registered"); + require(managers[msg.sender].registered, "manager not registered"); _; } @@ -84,8 +88,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { - managerDues[addr] = dues; - managersRegistered[addr] = true; + managers[addr] = manager(dues, true); relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; @@ -132,15 +135,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address relayerAddress = managerToRelayer[managerAddress]; + manager memory m = managers[managerAddress]; + delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); - uint256 mDues = managerDues[managerAddress]; address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); - systemPayable.transfer(mDues); + systemPayable.transfer(m.dues); + + delete(managers[managerAddress]); - delete (managerDues[managerAddress]); - delete (managersRegistered[managerAddress]); // emit success event emit removeManagerEvent(managerAddress); @@ -178,8 +182,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function registerManagerAddRelayer(address r) external payable onlyNonRegisteredManager { // register manager - managerDues[msg.sender] = dues; - managersRegistered[msg.sender] = true; + managers[msg.sender] = manager(dues, true); emit registerManagerEvent(msg.sender); updateRelayer(r); From 876f9ef2afb573a006b6bf24e92da7ad6f6d4c23 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 16 Jan 2023 15:02:25 +0000 Subject: [PATCH 53/84] Remove dues --- contracts/RelayerHub.sol | 31 ++++++------------------------- test/RelayerHub.t.sol | 12 ++++++------ 2 files changed, 12 insertions(+), 31 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 90cf52c9..21b5aaf9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -32,21 +32,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { bool registered; } - mapping(address => manager) managers; + // mapping(address => manager) managers; + // address payable[] managerS; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; bool public whitelistInitDone; - modifier onlyNonRegisteredManager() { + modifier onlyManager(){ require(relayManagersExistMap[msg.sender], "manager does not exist"); - require(!managers[msg.sender].registered, "manager already registered"); - _; - } - - modifier onlyRegisteredManager() { - require(managers[msg.sender].registered, "manager not registered"); _; } @@ -88,7 +83,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { - managers[addr] = manager(dues, true); +// managers[addr] = manager(dues, true); +// managerS.push(addr); relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; @@ -135,17 +131,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address relayerAddress = managerToRelayer[managerAddress]; - manager memory m = managers[managerAddress]; - delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); - address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); - systemPayable.transfer(m.dues); - - delete(managers[managerAddress]); - - // emit success event emit removeManagerEvent(managerAddress); if (relayerAddress != address(0)) { @@ -165,7 +153,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account - function updateRelayer(address relayerToBeAdded) public onlyRegisteredManager { + function updateRelayer(address relayerToBeAdded) public onlyManager { if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); } @@ -180,13 +168,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } - function registerManagerAddRelayer(address r) external payable onlyNonRegisteredManager { - // register manager - managers[msg.sender] = manager(dues, true); - emit registerManagerEvent(msg.sender); - - updateRelayer(r); - } function isRelayer(address relayerAddress) external override view returns (bool){ return currentRelayers[relayerAddress]; diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 9845709e..e476a92b 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -32,12 +32,12 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); emit updateRelayerEvent(payable(address(0)), newRelayer); - newRelayerHub.registerManagerAddRelayer(newRelayer); + newRelayerHub.updateRelayer(newRelayer); // do illegal call vm.prank(newRelayer, newRelayer); vm.expectRevert(bytes("manager does not exist")); - newRelayerHub.registerManagerAddRelayer(manager); + newRelayerHub.updateRelayer(manager); // check if relayer is added bool isRelayerTrue = newRelayerHub.isRelayer(newRelayer); @@ -94,7 +94,7 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); emit updateRelayerEvent(payable(address(0)), newRelayer); - newRelayerHub.registerManagerAddRelayer(newRelayer); + newRelayerHub.updateRelayer(newRelayer); // set relayer to 0 vm.prank(manager, manager); @@ -111,7 +111,7 @@ contract RelayerHubTest is Deployer { vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); emit updateRelayerEvent(payable(address(0)), newRelayer2); - newRelayerHub.registerManagerAddRelayer(newRelayer2); + newRelayerHub.updateRelayer(newRelayer2); // set relayer to 0 vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); @@ -190,7 +190,7 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); emit updateRelayerEvent(payable(address(0)), newRelayer); - newRelayerHub.registerManagerAddRelayer(newRelayer); + newRelayerHub.updateRelayer(newRelayer); address manager2 = payable(addrSet[addrIdx++]); bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); @@ -200,7 +200,7 @@ contract RelayerHubTest is Deployer { vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); emit updateRelayerEvent(payable(address(0)), newRelayer2); - newRelayerHub.registerManagerAddRelayer(newRelayer2); + newRelayerHub.updateRelayer(newRelayer2); // set relayer to 0 for first manager vm.prank(manager, manager); From 3d05cbfed44a30529915eec0edda35c7cf45d3bc Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 16 Jan 2023 15:03:41 +0000 Subject: [PATCH 54/84] remove unwanted code --- contracts/RelayerHub.sol | 9 --------- 1 file changed, 9 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 21b5aaf9..8a772b1e 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -27,13 +27,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 dues; } - struct manager { - uint256 dues; - bool registered; - } - - // mapping(address => manager) managers; - // address payable[] managerS; mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; @@ -83,8 +76,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function addInitRelayer(address addr) internal { -// managers[addr] = manager(dues, true); -// managerS.push(addr); relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; From 6186657a3919fe9806f106eaafcc49dad75a7ebc Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 17 Jan 2023 13:00:52 +0000 Subject: [PATCH 55/84] ensure 0 address is not a relayer --- contracts/RelayerHub.sol | 2 +- test/RelayerHub.t.sol | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 8a772b1e..5b08ed12 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -147,6 +147,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function updateRelayer(address relayerToBeAdded) public onlyManager { if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + currentRelayers[relayerToBeAdded] = true; } require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); @@ -154,7 +155,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete currentRelayers[oldRelayer]; managerToRelayer[msg.sender] = relayerToBeAdded; - currentRelayers[relayerToBeAdded] = true; emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index e476a92b..8d7c484b 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -60,6 +60,8 @@ contract RelayerHubTest is Deployer { emit updateRelayerEvent(newRelayer2, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); + // ensure 0 address is not a relayer + assertFalse(newRelayerHub.isRelayer(address(0))); // remove manager test i.e. for removeManager() bytes memory keyRemoveManager = "removeManager"; From 164c20a8c2768564466e7eea5893bf007f2cfa81 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 17 Jan 2023 13:05:14 +0000 Subject: [PATCH 56/84] remove deposit and dues code in updateParam --- contracts/RelayerHub.sol | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 5b08ed12..e14dd50f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -83,28 +83,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { /*********************** Param update ********************************/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "requiredDeposit")) { - require(value.length == 32, "length of requiredDeposit mismatch"); - uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); - require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); - requiredDeposit = newRequiredDeposit; - } else if (Memory.compareStrings(key, "dues")) { - require(value.length == 32, "length of dues mismatch"); - uint256 newDues = BytesToTypes.bytesToUint256(32, value); - require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); - dues = newDues; - } else if (Memory.compareStrings(key, "addManager")) { - + if (Memory.compareStrings(key, "addManager")) { require(value.length == 20, "length of manager address mismatch"); address newManager = BytesToTypes.bytesToAddress(20, value); addManagerByGov(newManager); - } else if (Memory.compareStrings(key, "removeManager")) { - require(value.length == 20, "length of manager address mismatch"); address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); removeManager(managerAddress); - } else { require(false, "unknown param"); } @@ -159,12 +145,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } - function isRelayer(address relayerAddress) external override view returns (bool){ return currentRelayers[relayerAddress]; } - // TODO remove just for testing function isManager(address relayerAddress) external view returns (bool){ return relayManagersExistMap[relayerAddress]; } From d1c4947c1e51b97a2da97e82973278c8d43d6bac Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 17 Jan 2023 13:52:54 +0000 Subject: [PATCH 57/84] template file update + correct whitelist mainnet addr --- contracts/RelayerHub.template | 153 +++++++++++++--------------------- 1 file changed, 57 insertions(+), 96 deletions(-) diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 045dadfa..020cbfed 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -13,6 +13,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; + {% if network == 'local' %} address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; @@ -23,36 +24,34 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address public constant WHITELIST_1 = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; address public constant WHITELIST_2 = 0x37B8516a0F88E65D677229b402ec6C1e0E333004; {% else %} - address public constant WHITELIST_1 = 0x04d63aBCd2b9b1baa327f2Dda0f873F197ccd186; + address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; {% endif %} - uint256 public requiredDeposit; + + uint256 public requiredDeposit; // have to keep it to not break the storage layout uint256 public dues; - mapping(address => manager) managers; - mapping(address => bool) managersRegistered; - mapping(address => bool) relayManagersExistMap; - mapping(address => address) managersAndRelayers; - mapping(address => bool) relayerExistsMap; + mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit + mapping(address => bool) relayersExistMap; - struct manager { + struct relayer { uint256 deposit; uint256 dues; } - modifier onlyNonRegisteredManager() { - require(relayManagersExistMap[msg.sender], "manager does not exist"); - _; - } + mapping(address => bool) relayManagersExistMap; + mapping(address => address) managerToRelayer; + mapping(address => bool) currentRelayers; + + bool public whitelistInitDone; - modifier onlyRegisteredManager() { + modifier onlyManager(){ require(relayManagersExistMap[msg.sender], "manager does not exist"); - require(managersRegistered[msg.sender], "manager not registered"); _; } - modifier noProxy() { - require(msg.sender == tx.origin, "no proxy is allowed"); + modifier exist() { + require(relayersExistMap[msg.sender], "relayer do not exist"); _; } @@ -60,89 +59,75 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerByGovEvent(address _removedManager); + event removeManagerEvent(address _removedManager); event addManagerByGovEvent(address _addedManager); event registerManagerEvent(address _registeredManager); - event addRelayerEvent(address _relayerToBeAdded); - event removeRelayerEvent(address _removedRelayer); - + event updateRelayerEvent(address _from, address _to); function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; dues = INIT_DUES; + alreadyInit = true; + } + + function unregister() external exist onlyInit { + relayer memory r = relayers[msg.sender]; + msg.sender.transfer(r.deposit.sub(r.dues)); + address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); + systemPayable.transfer(r.dues); + delete relayersExistMap[msg.sender]; + delete relayers[msg.sender]; + emit relayerUnRegister(msg.sender); + } + + function whitelistInit() external { + require(!whitelistInitDone, "the whitelists already updated"); addInitRelayer(WHITELIST_1); addInitRelayer(WHITELIST_2); - alreadyInit = true; + whitelistInitDone = true; } function addInitRelayer(address addr) internal { - managers[addr] = manager(requiredDeposit, dues); - managersRegistered[addr] = true; relayManagersExistMap[addr] = true; - managersAndRelayers[addr] = addr; // fixme current relayer - relayerExistsMap[addr] = true; + managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same + currentRelayers[addr] = true; } /*********************** Param update ********************************/ function updateParam(string calldata key, bytes calldata value) external override onlyInit onlyGov { - if (Memory.compareStrings(key, "requiredDeposit")) { - require(value.length == 32, "length of requiredDeposit mismatch"); - uint256 newRequiredDeposit = BytesToTypes.bytesToUint256(32, value); - require(newRequiredDeposit > 1 && newRequiredDeposit <= 1e21 && newRequiredDeposit > dues, "the requiredDeposit out of range"); - requiredDeposit = newRequiredDeposit; - } else if (Memory.compareStrings(key, "dues")) { - require(value.length == 32, "length of dues mismatch"); - uint256 newDues = BytesToTypes.bytesToUint256(32, value); - require(newDues > 0 && newDues < requiredDeposit, "the dues out of range"); - dues = newDues; - } else if (Memory.compareStrings(key, "addManager")) { - + if (Memory.compareStrings(key, "addManager")) { require(value.length == 20, "length of manager address mismatch"); address newManager = BytesToTypes.bytesToAddress(20, value); addManagerByGov(newManager); - } else if (Memory.compareStrings(key, "removeManager")) { - require(value.length == 20, "length of manager address mismatch"); address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); - removeManagerByGov(managerAddress); - + removeManager(managerAddress); } else { require(false, "unknown param"); } emit paramChange(key, value); } - function removeManagerByGov(address payable managerToBeRemoved) internal { - removeManagerHelper(managerToBeRemoved); - } - - function removeManager() external onlyRegisteredManager { + function removeManagerByHimself() external { // here the manager removes himself - removeManagerHelper(payable(msg.sender)); + removeManager(payable(msg.sender)); } - function removeManagerHelper(address payable managerAddress) internal { + function removeManager(address payable managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); - address relayerAddress = managersAndRelayers[managerAddress]; + address relayerAddress = managerToRelayer[managerAddress]; delete (relayManagersExistMap[managerAddress]); - delete (managersAndRelayers[managerAddress]); - - manager memory a = managers[managerAddress]; - managerAddress.transfer(a.deposit.sub(a.dues)); - address payable systemPayable = payable(address(uint160(SYSTEM_REWARD_ADDR))); - systemPayable.transfer(a.dues); - - delete (managers[managerAddress]); - delete (managersRegistered[managerAddress]); + delete (managerToRelayer[managerAddress]); // emit success event - emit removeManagerByGovEvent(managerAddress); + emit removeManagerEvent(managerAddress); if (relayerAddress != address(0)) { - emit removeRelayerEvent(relayerAddress); + delete (currentRelayers[relayerAddress]); + emit updateRelayerEvent(relayerAddress, address(0)); } } @@ -155,51 +140,27 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { emit addManagerByGovEvent(managerToBeAdded); } - function registerManager() internal onlyNonRegisteredManager { - require(msg.value == requiredDeposit, "deposit value is not exactly the same"); - managers[msg.sender] = manager(requiredDeposit, dues); - managersRegistered[msg.sender] = true; - emit registerManagerEvent(msg.sender); - } - - function addRelayer(address relayerToBeAdded) public onlyRegisteredManager noProxy { - require(!relayerExistsMap[relayerToBeAdded], "relayer already exists"); - require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - - if(managersAndRelayers[msg.sender] != address(0)) { - address r = managersAndRelayers[msg.sender]; - delete (relayerExistsMap[r]); - emit removeRelayerEvent(r); - } - - managersAndRelayers[msg.sender] = relayerToBeAdded; - relayerExistsMap[relayerToBeAdded] = true; - emit addRelayerEvent(relayerToBeAdded); - } - - function registerManagerAddRelayer(address relayer) external payable onlyNonRegisteredManager { - registerManager(); - addRelayer(relayer); - } - - function removeRelayer() external onlyRegisteredManager { - if (managersAndRelayers[msg.sender] == address(0)) { - require(false, "relayer doesn't exist for this manager"); + // updateRelayer() can be used to add relayer for the first time, update it in future and remove it + // in case of removal we can simply update it to a non-existing account + function updateRelayer(address relayerToBeAdded) public onlyManager { + if (relayerToBeAdded != address(0)) { + require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + currentRelayers[relayerToBeAdded] = true; } + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - address r = managersAndRelayers[msg.sender]; + address oldRelayer = managerToRelayer[msg.sender]; + delete currentRelayers[oldRelayer]; - delete (relayerExistsMap[r]); - delete (managersAndRelayers[msg.sender]); + managerToRelayer[msg.sender] = relayerToBeAdded; - emit removeRelayerEvent(r); + emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } function isRelayer(address relayerAddress) external override view returns (bool){ - return relayerExistsMap[relayerAddress]; + return currentRelayers[relayerAddress]; } - // TODO remove just for testing function isManager(address relayerAddress) external view returns (bool){ return relayManagersExistMap[relayerAddress]; } From 1ebc8fd26d6269f182dc8c60c1eef278e4b987e0 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 17 Jan 2023 14:57:02 +0000 Subject: [PATCH 58/84] check contract first --- contracts/RelayerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index e14dd50f..39d976ea 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -131,11 +131,11 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyManager { + require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); currentRelayers[relayerToBeAdded] = true; } - require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; From 919c2bb4c282fa4dd40958dfeee4ed871e8f0619 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 17 Jan 2023 15:25:30 +0000 Subject: [PATCH 59/84] refactor --- contracts/RelayerHub.sol | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 39d976ea..1382b802 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -132,15 +132,17 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyManager { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - if (relayerToBeAdded != address(0)) { - require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - currentRelayers[relayerToBeAdded] = true; - } address oldRelayer = managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; - managerToRelayer[msg.sender] = relayerToBeAdded; + if (relayerToBeAdded != address(0)) { + require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + currentRelayers[relayerToBeAdded] = true; + managerToRelayer[msg.sender] = relayerToBeAdded; + } else { + delete managerToRelayer[msg.sender]; + } emit updateRelayerEvent(oldRelayer, relayerToBeAdded); } From ae24743e813c9b4124034cb54246f907ddd54d99 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 20 Jan 2023 11:42:19 +0000 Subject: [PATCH 60/84] Refactor even names and regenerate interface --- contracts/RelayerHub.sol | 15 +++++----- contracts/RelayerHub.template | 53 ++++++++++++++++++----------------- lib/interface/IRelayerHub.sol | 8 ++---- test/RelayerHub.t.sol | 28 +++++++++--------- 4 files changed, 51 insertions(+), 53 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 1382b802..426d1ef3 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -47,10 +47,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerEvent(address _removedManager); - event addManagerByGovEvent(address _addedManager); - event registerManagerEvent(address _registeredManager); - event updateRelayerEvent(address _from, address _to); + event managerRemoved(address _removedManager); + event managerAdded(address _addedManager); + event relayerUpdated(address _from, address _to); function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; @@ -112,10 +111,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (managerToRelayer[managerAddress]); // emit success event - emit removeManagerEvent(managerAddress); + emit managerRemoved(managerAddress); if (relayerAddress != address(0)) { delete (currentRelayers[relayerAddress]); - emit updateRelayerEvent(relayerAddress, address(0)); + emit relayerUpdated(relayerAddress, address(0)); } } @@ -125,7 +124,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { relayManagersExistMap[managerToBeAdded] = true; - emit addManagerByGovEvent(managerToBeAdded); + emit managerAdded(managerToBeAdded); } // updateRelayer() can be used to add relayer for the first time, update it in future and remove it @@ -144,7 +143,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete managerToRelayer[msg.sender]; } - emit updateRelayerEvent(oldRelayer, relayerToBeAdded); + emit relayerUpdated(oldRelayer, relayerToBeAdded); } function isRelayer(address relayerAddress) external override view returns (bool){ diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 020cbfed..06b7cafc 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -14,19 +14,19 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; - {% if network == 'local' %} - address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; - address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; - {% elif network == 'QA' %} - address public constant WHITELIST_1 = 0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD; - address public constant WHITELIST_2 = 0x42D596440775C90db8d9187b47650986E1063493; - {% elif network == 'testnet' %} - address public constant WHITELIST_1 = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; - address public constant WHITELIST_2 = 0x37B8516a0F88E65D677229b402ec6C1e0E333004; - {% else %} - address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; - address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - {% endif %} + {% if network == 'local' %} + address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; + address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; + {% elif network == 'QA' %} + address public constant WHITELIST_1 = 0x88cb4D8F77742c24d647BEf8049D3f3C56067cDD; + address public constant WHITELIST_2 = 0x42D596440775C90db8d9187b47650986E1063493; + {% elif network == 'testnet' %} + address public constant WHITELIST_1 = 0x9fB29AAc15b9A4B7F17c3385939b007540f4d791; + address public constant WHITELIST_2 = 0x37B8516a0F88E65D677229b402ec6C1e0E333004; + {% else %} + address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; + address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; + {% endif %} uint256 public requiredDeposit; // have to keep it to not break the storage layout uint256 public dues; @@ -59,10 +59,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event removeManagerEvent(address _removedManager); - event addManagerByGovEvent(address _addedManager); - event registerManagerEvent(address _registeredManager); - event updateRelayerEvent(address _from, address _to); + event managerRemoved(address _removedManager); + event managerAdded(address _addedManager); + event relayerUpdated(address _from, address _to); function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; @@ -124,10 +123,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (managerToRelayer[managerAddress]); // emit success event - emit removeManagerEvent(managerAddress); + emit managerRemoved(managerAddress); if (relayerAddress != address(0)) { delete (currentRelayers[relayerAddress]); - emit updateRelayerEvent(relayerAddress, address(0)); + emit relayerUpdated(relayerAddress, address(0)); } } @@ -137,24 +136,26 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { relayManagersExistMap[managerToBeAdded] = true; - emit addManagerByGovEvent(managerToBeAdded); + emit managerAdded(managerToBeAdded); } // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account function updateRelayer(address relayerToBeAdded) public onlyManager { - if (relayerToBeAdded != address(0)) { - require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - currentRelayers[relayerToBeAdded] = true; - } require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; - managerToRelayer[msg.sender] = relayerToBeAdded; + if (relayerToBeAdded != address(0)) { + require(!currentRelayers[relayerToBeAdded], "relayer already exists"); + currentRelayers[relayerToBeAdded] = true; + managerToRelayer[msg.sender] = relayerToBeAdded; + } else { + delete managerToRelayer[msg.sender]; + } - emit updateRelayerEvent(oldRelayer, relayerToBeAdded); + emit relayerUpdated(oldRelayer, relayerToBeAdded); } function isRelayer(address relayerAddress) external override view returns (bool){ diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 9de78e29..7ef268cb 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -1,13 +1,12 @@ pragma solidity ^0.8.10; interface RelayerHub { - event addManagerByGovEvent(address _addedManager); + event managerAdded(address _addedManager); + event managerRemoved(address _removedManager); event paramChange(string key, bytes value); - event registerManagerEvent(address _registeredManager); event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); - event removeManagerEvent(address _removedManager); - event updateRelayerEvent(address _from, address _to); + event relayerUpdated(address _from, address _to); function BIND_CHANNELID() external view returns (uint8); function CODE_OK() external view returns (uint32); @@ -39,7 +38,6 @@ interface RelayerHub { function init() external; function isManager(address relayerAddress) external view returns (bool); function isRelayer(address relayerAddress) external view returns (bool); - function registerManagerAddRelayer(address r) external payable; function removeManagerByHimself() external; function requiredDeposit() external view returns (uint256); function unregister() external; diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 8d7c484b..b6883b97 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -6,8 +6,8 @@ contract RelayerHubTest is Deployer { event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); - event updateRelayerEvent(address _from, address _to); - event removeManagerEvent(address _manager); + event relayerUpdated(address _from, address _to); + event managerRemoved(address _manager); uint256 public requiredDeposit; uint256 public dues; @@ -31,7 +31,7 @@ contract RelayerHubTest is Deployer { // check if manager is there and can add a relayer vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(payable(address(0)), newRelayer); + emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.updateRelayer(newRelayer); // do illegal call @@ -51,13 +51,13 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer, newRelayer2); + emit relayerUpdated(newRelayer, newRelayer2); newRelayerHub.updateRelayer(newRelayer2); // set relayer to 0 vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer2, payable(address(0))); + emit relayerUpdated(newRelayer2, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); // ensure 0 address is not a relayer @@ -66,7 +66,7 @@ contract RelayerHubTest is Deployer { // remove manager test i.e. for removeManager() bytes memory keyRemoveManager = "removeManager"; vm.expectEmit(true, true, false, true); - emit removeManagerEvent(manager); + emit managerRemoved(manager); updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); // check if relayer got removed @@ -95,13 +95,13 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(payable(address(0)), newRelayer); + emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.updateRelayer(newRelayer); // set relayer to 0 vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer, payable(address(0))); + emit relayerUpdated(newRelayer, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); // get a new manager, have its relayer registered and then try to remove the relayer for this manager @@ -112,12 +112,12 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(payable(address(0)), newRelayer2); + emit relayerUpdated(payable(address(0)), newRelayer2); newRelayerHub.updateRelayer(newRelayer2); // set relayer to 0 vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer2, payable(address(0))); + emit relayerUpdated(newRelayer2, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); } @@ -191,7 +191,7 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(payable(address(0)), newRelayer); + emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.updateRelayer(newRelayer); address manager2 = payable(addrSet[addrIdx++]); @@ -201,20 +201,20 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(payable(address(0)), newRelayer2); + emit relayerUpdated(payable(address(0)), newRelayer2); newRelayerHub.updateRelayer(newRelayer2); // set relayer to 0 for first manager vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer, payable(address(0))); + emit relayerUpdated(newRelayer, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); // set relayer to 0 for second manager vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit updateRelayerEvent(newRelayer2, payable(address(0))); + emit relayerUpdated(newRelayer2, payable(address(0))); newRelayerHub.updateRelayer(payable(address(0))); } From 805581498153c1a5a4ebf6ea7cd32e88ccd2177a Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 23 Jan 2023 06:22:42 +0000 Subject: [PATCH 61/84] payable manager not required --- contracts/RelayerHub.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 426d1ef3..3c3f88c9 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -88,7 +88,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { addManagerByGov(newManager); } else if (Memory.compareStrings(key, "removeManager")) { require(value.length == 20, "length of manager address mismatch"); - address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); + address managerAddress = BytesToTypes.bytesToAddress(20, value); removeManager(managerAddress); } else { require(false, "unknown param"); @@ -98,10 +98,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function removeManagerByHimself() external { // here the manager removes himself - removeManager(payable(msg.sender)); + removeManager(msg.sender); } - function removeManager(address payable managerAddress) internal { + function removeManager(address managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); From 195eccb280c42781d4df1be32991fc85cd30dd36 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 23 Jan 2023 06:28:21 +0000 Subject: [PATCH 62/84] bug fix of twice adding of same relayer + test --- contracts/RelayerHub.sol | 2 +- test/RelayerHub.t.sol | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 3c3f88c9..c61e45d8 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -133,7 +133,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; - delete currentRelayers[oldRelayer]; if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); @@ -143,6 +142,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete managerToRelayer[msg.sender]; } + delete currentRelayers[oldRelayer]; emit relayerUpdated(oldRelayer, relayerToBeAdded); } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index b6883b97..e3b18a3c 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -34,6 +34,11 @@ contract RelayerHubTest is Deployer { emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.updateRelayer(newRelayer); + // do updateRelayer() with the existing relayer + vm.prank(manager, manager); + vm.expectRevert(bytes("relayer already exists")); + newRelayerHub.updateRelayer(newRelayer); + // do illegal call vm.prank(newRelayer, newRelayer); vm.expectRevert(bytes("manager does not exist")); From 8ad0ad768023c0da404f01a944f283820aa5d01f Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 23 Jan 2023 06:46:29 +0000 Subject: [PATCH 63/84] emit events in initialisation as well --- contracts/RelayerHub.sol | 2 ++ test/RelayerHub.t.sol | 3 +++ 2 files changed, 5 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index c61e45d8..efc4982f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -78,6 +78,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; + emit managerAdded(addr); + emit relayerUpdated(address(0), addr); } /*********************** Param update ********************************/ diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index e3b18a3c..097b5543 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -8,6 +8,7 @@ contract RelayerHubTest is Deployer { event paramChange(string key, bytes value); event relayerUpdated(address _from, address _to); event managerRemoved(address _manager); + event managerAdded(address _manager); uint256 public requiredDeposit; uint256 public dues; @@ -158,6 +159,8 @@ contract RelayerHubTest is Deployer { // now we call update() and the existing relayer/manager should be shown to be valid + vm.expectEmit(true, true, false, true); + emit relayerUpdated(payable(address(0)), newRelayerHub.WHITELIST_1()); newRelayerHub.whitelistInit(); bool isManagerTrue = newRelayerHub.isManager(existingRelayer1); assertTrue(isManagerTrue); From ba6aac5b80abcf10be53c947717293424156ff3e Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 26 Jan 2023 11:52:51 +0000 Subject: [PATCH 64/84] update the template file based on recent changes --- contracts/RelayerHub.template | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 06b7cafc..0e4143ed 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -13,7 +13,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; - + {% if network == 'local' %} address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; @@ -90,6 +90,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { relayManagersExistMap[addr] = true; managerToRelayer[addr] = addr; // for the current whitelisted relayers we are keeping manager and relayer address the same currentRelayers[addr] = true; + emit managerAdded(addr); + emit relayerUpdated(address(0), addr); } /*********************** Param update ********************************/ @@ -100,7 +102,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { addManagerByGov(newManager); } else if (Memory.compareStrings(key, "removeManager")) { require(value.length == 20, "length of manager address mismatch"); - address payable managerAddress = payable(BytesToTypes.bytesToAddress(20, value)); + address managerAddress = BytesToTypes.bytesToAddress(20, value); removeManager(managerAddress); } else { require(false, "unknown param"); @@ -110,10 +112,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function removeManagerByHimself() external { // here the manager removes himself - removeManager(payable(msg.sender)); + removeManager(msg.sender); } - function removeManager(address payable managerAddress) internal { + function removeManager(address managerAddress) internal { // check if the manager address already exists require(relayManagersExistMap[managerAddress], "manager doesn't exist"); @@ -145,7 +147,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; - delete currentRelayers[oldRelayer]; if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); @@ -155,6 +156,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete managerToRelayer[msg.sender]; } + delete currentRelayers[oldRelayer]; emit relayerUpdated(oldRelayer, relayerToBeAdded); } From 06927b44c121ffe6a20e982c7c61097eb9c86d42 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 3 Feb 2023 16:47:45 +0000 Subject: [PATCH 65/84] public to internal + remove unused event --- contracts/RelayerHub.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index efc4982f..bf1a845f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -16,8 +16,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address public constant WHITELIST_1 = 0xb005741528b86F5952469d80A8614591E3c5B632; address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; - uint256 public requiredDeposit; // have to keep it to not break the storage layout - uint256 public dues; + uint256 internal requiredDeposit; // have to keep it to not break the storage layout + uint256 internal dues; mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit mapping(address => bool) relayersExistMap; @@ -43,7 +43,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); From 0785d1dbe5ef4cc20f9032f9b205b4e74756465f Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 9 Feb 2023 12:07:42 +0000 Subject: [PATCH 66/84] Test to ensure a contract can't be a relayer --- test/RelayerHub.t.sol | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 097b5543..2e1922e3 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -227,6 +227,43 @@ contract RelayerHubTest is Deployer { } + function testContractRelayer() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + address newRelayer = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + +// vm.prank(manager, manager); + + + uint64 nonceManager = vm.getNonce(manager); +// vm.setNonce(manager, nonceManager++); + + address contractAddress = address(bytes20(keccak256(abi.encodePacked(manager, nonceManager)))); + + // add the above address as relayer address which currently doesn't have code + vm.prank(manager, manager); + newRelayerHub.updateRelayer(contractAddress); + + bytes memory bytecode = "0x60606040525b600080fd00a165627a7a7230582012c9bd00152fa1c480f6827f81515bb19c3e63bf7ed9ffbb5fda0265983ac7980029"; + +// vm.prank(manager, manager); +// (bool success, bytes memory returnData) = address(contractAddress).deploy(bytecode); + +// require(success, "Deployment failed"); + vm.etch(contractAddress, bytecode); + + assertEq(bytes32(bytecode), bytes32(address(contractAddress).code)); + + // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer + assertFalse(newRelayerHub.isRelayer(contractAddress)); + + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From c9298afe73adac40a65f19a267765e79cdf08be0 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Fri, 10 Feb 2023 11:01:09 +0000 Subject: [PATCH 67/84] 2 step relayer registration. todo: test update --- contracts/RelayerHub.sol | 37 +++++++++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 4 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index bf1a845f..c41707d8 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -30,6 +30,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; + mapping(address => bool) provisionalRelayers; bool public whitelistInitDone; @@ -43,12 +44,18 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } + modifier onlyProvisionalRelayer() { + require(provisionalRelayers[msg.sender], "relayer is not a provisional relayer"); + _; + } + event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); event managerRemoved(address _removedManager); event managerAdded(address _addedManager); event relayerUpdated(address _from, address _to); + event relayerAddedProvisionally(address _relayer); function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; @@ -130,21 +137,43 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account - function updateRelayer(address relayerToBeAdded) public onlyManager { + function updateRelayer(address relayerToBeAdded) public onlyManager {// todo make it 2 step if relayer isn't address(0) require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - currentRelayers[relayerToBeAdded] = true; - managerToRelayer[msg.sender] = relayerToBeAdded; + // currentRelayers[relayerToBeAdded] = true; + + provisionalRelayers[relayerToBeAdded] = true; + // managerToRelayer[msg.sender] = relayerToBeAdded; } else { delete managerToRelayer[msg.sender]; + + delete currentRelayers[oldRelayer]; + emit relayerUpdated(oldRelayer, relayerToBeAdded); } + // delete currentRelayers[oldRelayer]; + // emit relayerUpdated(oldRelayer, relayerToBeAdded); + + emit relayerAddedProvisionally(relayerToBeAdded); + } + + // acceptBeingRelayer needs to be called by the relayer after being added provisionally. + // This 2 step process of relayer updating is required to avoid having a contract as a relayer. + function acceptBeingRelayer(address manager) external onlyProvisionalRelayer { + address oldRelayer = managerToRelayer[manager]; + + currentRelayers[msg.sender] = true; + managerToRelayer[manager] = msg.sender; + + delete (provisionalRelayers[msg.sender]); + delete currentRelayers[oldRelayer]; - emit relayerUpdated(oldRelayer, relayerToBeAdded); + emit relayerUpdated(oldRelayer, msg.sender); + } function isRelayer(address relayerAddress) external override view returns (bool){ From 15380dcb71ff8cce389df4286841cd0bb6df3c98 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 13 Feb 2023 12:46:47 +0000 Subject: [PATCH 68/84] Fix testAddManager --- contracts/RelayerHub.sol | 1 + lib/interface/IRelayerHub.sol | 2 ++ test/RelayerHub.t.sol | 18 +++++++++++++++--- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index c41707d8..223e9243 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -153,6 +153,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete currentRelayers[oldRelayer]; emit relayerUpdated(oldRelayer, relayerToBeAdded); + return; } // delete currentRelayers[oldRelayer]; diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 7ef268cb..2c5fbe84 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -7,6 +7,7 @@ interface RelayerHub { event relayerRegister(address _relayer); event relayerUnRegister(address _relayer); event relayerUpdated(address _from, address _to); + event relayerAddedProvisionally(address _relayer); function BIND_CHANNELID() external view returns (uint8); function CODE_OK() external view returns (uint32); @@ -45,5 +46,6 @@ interface RelayerHub { function updateRelayer(address relayerToBeAdded) external; function whitelistInit() external; function whitelistInitDone() external view returns (bool); + function acceptBeingRelayer(address manager) external; } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 2e1922e3..7999626c 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -9,6 +9,7 @@ contract RelayerHubTest is Deployer { event relayerUpdated(address _from, address _to); event managerRemoved(address _manager); event managerAdded(address _manager); + event relayerAddedProvisionally(address _relayer); uint256 public requiredDeposit; uint256 public dues; @@ -32,8 +33,13 @@ contract RelayerHubTest is Deployer { // check if manager is there and can add a relayer vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer); + emit relayerAddedProvisionally(newRelayer); newRelayerHub.updateRelayer(newRelayer); + assertFalse(newRelayerHub.isRelayer(newRelayer)); + + vm.prank(newRelayer, newRelayer); + emit relayerUpdated(payable(address(0)), newRelayer); + newRelayerHub.acceptBeingRelayer(manager); // do updateRelayer() with the existing relayer vm.prank(manager, manager); @@ -57,8 +63,14 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit relayerUpdated(newRelayer, newRelayer2); +// emit relayerUpdated(newRelayer, newRelayer2); + emit relayerAddedProvisionally(newRelayer2); newRelayerHub.updateRelayer(newRelayer2); + assertFalse(newRelayerHub.isRelayer(newRelayer2)); + + vm.prank(newRelayer2, newRelayer2); + emit relayerUpdated(newRelayer, newRelayer2); + newRelayerHub.acceptBeingRelayer(manager); // set relayer to 0 vm.prank(manager, manager); @@ -76,7 +88,7 @@ contract RelayerHubTest is Deployer { updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); // check if relayer got removed - bool isRelayerFalse = newRelayerHub.isRelayer(newRelayer); + bool isRelayerFalse = newRelayerHub.isRelayer(newRelayer2); assertFalse(isRelayerFalse); // check if manager got removed From e4afcdb8dedafdd6a29d1594c4793160c2e0ae8d Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 13 Feb 2023 17:06:38 +0000 Subject: [PATCH 69/84] Fix the rest of the tests --- test/RelayerHub.t.sol | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 7999626c..40d6e92b 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -38,6 +38,7 @@ contract RelayerHubTest is Deployer { assertFalse(newRelayerHub.isRelayer(newRelayer)); vm.prank(newRelayer, newRelayer); + vm.expectEmit(true, true, false, true); emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.acceptBeingRelayer(manager); @@ -113,8 +114,14 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer); + emit relayerAddedProvisionally(newRelayer); newRelayerHub.updateRelayer(newRelayer); + assertFalse(newRelayerHub.isRelayer(newRelayer)); + + vm.prank(newRelayer, newRelayer); + vm.expectEmit(true, true, false, true); + emit relayerUpdated(payable(address(0)), newRelayer); + newRelayerHub.acceptBeingRelayer(manager); // set relayer to 0 vm.prank(manager, manager); @@ -130,8 +137,15 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer2); + emit relayerAddedProvisionally(newRelayer2); newRelayerHub.updateRelayer(newRelayer2); + assertFalse(newRelayerHub.isRelayer(newRelayer2)); + + vm.prank(newRelayer2, newRelayer2); + vm.expectEmit(true, true, false, true); + emit relayerUpdated(payable(address(0)), newRelayer2); + newRelayerHub.acceptBeingRelayer(manager2); + // set relayer to 0 vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); @@ -211,18 +225,29 @@ contract RelayerHubTest is Deployer { vm.prank(manager, manager); vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer); + emit relayerAddedProvisionally(newRelayer); newRelayerHub.updateRelayer(newRelayer); + assertFalse(newRelayerHub.isRelayer(newRelayer)); + + vm.prank(newRelayer, newRelayer); + emit relayerUpdated(payable(address(0)), newRelayer); + newRelayerHub.acceptBeingRelayer(manager); address manager2 = payable(addrSet[addrIdx++]); bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); require(valueManagerBytes2.length == 20, "length of manager2 address mismatch in tests"); updateParamByGovHub(keyAddManager, valueManagerBytes2, address(newRelayerHub)); address newRelayer2 = payable(addrSet[addrIdx++]); + vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); - emit relayerUpdated(payable(address(0)), newRelayer2); + emit relayerAddedProvisionally(newRelayer2); newRelayerHub.updateRelayer(newRelayer2); + assertFalse(newRelayerHub.isRelayer(newRelayer2)); + + vm.prank(newRelayer2, newRelayer2); + emit relayerUpdated(payable(address(0)), newRelayer2); + newRelayerHub.acceptBeingRelayer(manager2); // set relayer to 0 for first manager vm.prank(manager, manager); From 0f4ff88aad9bfb24ebee3672717cd49e85942162 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 13 Feb 2023 17:10:55 +0000 Subject: [PATCH 70/84] Remove unused comments --- contracts/RelayerHub.sol | 9 +-------- test/RelayerHub.t.sol | 10 ---------- 2 files changed, 1 insertion(+), 18 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 223e9243..d5e896d2 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -137,28 +137,21 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal we can simply update it to a non-existing account - function updateRelayer(address relayerToBeAdded) public onlyManager {// todo make it 2 step if relayer isn't address(0) + function updateRelayer(address relayerToBeAdded) public onlyManager { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - // currentRelayers[relayerToBeAdded] = true; - provisionalRelayers[relayerToBeAdded] = true; - // managerToRelayer[msg.sender] = relayerToBeAdded; } else { delete managerToRelayer[msg.sender]; - delete currentRelayers[oldRelayer]; emit relayerUpdated(oldRelayer, relayerToBeAdded); return; } - // delete currentRelayers[oldRelayer]; - // emit relayerUpdated(oldRelayer, relayerToBeAdded); - emit relayerAddedProvisionally(relayerToBeAdded); } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 40d6e92b..28ec5946 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -64,7 +64,6 @@ contract RelayerHubTest is Deployer { address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager, manager); vm.expectEmit(true, true, false, true); -// emit relayerUpdated(newRelayer, newRelayer2); emit relayerAddedProvisionally(newRelayer2); newRelayerHub.updateRelayer(newRelayer2); assertFalse(newRelayerHub.isRelayer(newRelayer2)); @@ -269,16 +268,11 @@ contract RelayerHubTest is Deployer { bytes memory keyAddManager = "addManager"; address manager = payable(addrSet[addrIdx++]); - address newRelayer = payable(addrSet[addrIdx++]); bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); -// vm.prank(manager, manager); - - uint64 nonceManager = vm.getNonce(manager); -// vm.setNonce(manager, nonceManager++); address contractAddress = address(bytes20(keccak256(abi.encodePacked(manager, nonceManager)))); @@ -288,10 +282,6 @@ contract RelayerHubTest is Deployer { bytes memory bytecode = "0x60606040525b600080fd00a165627a7a7230582012c9bd00152fa1c480f6827f81515bb19c3e63bf7ed9ffbb5fda0265983ac7980029"; -// vm.prank(manager, manager); -// (bool success, bytes memory returnData) = address(contractAddress).deploy(bytecode); - -// require(success, "Deployment failed"); vm.etch(contractAddress, bytecode); assertEq(bytes32(bytecode), bytes32(address(contractAddress).code)); From e1068898c5c6fc414082cc6805e6fa8c2cd5742a Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Tue, 14 Feb 2023 10:19:34 +0000 Subject: [PATCH 71/84] check for code and proxy relayer + test --- contracts/RelayerHub.sol | 8 ++++++++ test/RelayerHub.t.sol | 31 +++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index d5e896d2..7469d4d8 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -158,6 +158,14 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // acceptBeingRelayer needs to be called by the relayer after being added provisionally. // This 2 step process of relayer updating is required to avoid having a contract as a relayer. function acceptBeingRelayer(address manager) external onlyProvisionalRelayer { + + // ensure code is zero for msg.sender and it is not a proxy + uint size; + address sender = msg.sender; + assembly { size := extcodesize(sender) } + require(size == 0, "provisional relayer is a contract"); + require(tx.origin == msg.sender, "provisional relayer is a proxy"); + address oldRelayer = managerToRelayer[manager]; currentRelayers[msg.sender] = true; diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 28ec5946..e7253c3b 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -289,6 +289,37 @@ contract RelayerHubTest is Deployer { // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer assertFalse(newRelayerHub.isRelayer(contractAddress)); + // check if a contract relayer fails + vm.prank(contractAddress, contractAddress); + vm.expectRevert(bytes("provisional relayer is a contract")); + newRelayerHub.acceptBeingRelayer(manager); + } + + function testProxyContractRelayer() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + uint64 nonceManager = vm.getNonce(manager); + + address contractAddress = address(bytes20(keccak256(abi.encodePacked(manager, nonceManager)))); + + // add the above address as relayer address which currently doesn't have code + vm.prank(manager, manager); + newRelayerHub.updateRelayer(contractAddress); + + // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer + assertFalse(newRelayerHub.isRelayer(contractAddress)); + + // check if a proxy relayer fails + vm.prank(contractAddress, manager); + vm.expectRevert(bytes("provisional relayer is a proxy")); + newRelayerHub.acceptBeingRelayer(manager); + } // function testCannotRegister() public { From d2f96430a7974efe49a96efad6295261f8252620 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 15 Feb 2023 13:50:01 +0000 Subject: [PATCH 72/84] edge case where manager gets removed before accept --- contracts/RelayerHub.sol | 9 +++++++++ lib/interface/IRelayerHub.sol | 4 +++- test/RelayerHub.t.sol | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 7469d4d8..aeca8371 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -31,6 +31,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; mapping(address => bool) provisionalRelayers; + mapping(address => address) managerToProvisionalRelayer; bool public whitelistInitDone; @@ -118,6 +119,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); + delete (provisionalRelayers[managerToProvisionalRelayer[managerAddress]]); + delete (managerToProvisionalRelayer[managerAddress]); + // emit success event emit managerRemoved(managerAddress); if (relayerAddress != address(0)) { @@ -145,6 +149,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); provisionalRelayers[relayerToBeAdded] = true; + managerToProvisionalRelayer[msg.sender] = relayerToBeAdded; } else { delete managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; @@ -182,6 +187,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { return currentRelayers[relayerAddress]; } + function isProvisionalRelayer(address relayerAddress) external view returns (bool){ + return provisionalRelayers[relayerAddress]; + } + function isManager(address relayerAddress) external view returns (bool){ return relayManagersExistMap[relayerAddress]; } diff --git a/lib/interface/IRelayerHub.sol b/lib/interface/IRelayerHub.sol index 2c5fbe84..66bb2706 100644 --- a/lib/interface/IRelayerHub.sol +++ b/lib/interface/IRelayerHub.sol @@ -47,5 +47,7 @@ interface RelayerHub { function whitelistInit() external; function whitelistInitDone() external view returns (bool); function acceptBeingRelayer(address manager) external; -} + function isProvisionalRelayer(address relayerAddress) external view returns (bool); + + } diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index e7253c3b..1a032699 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -322,6 +322,41 @@ contract RelayerHubTest is Deployer { } + // testManagerDeleteProvisionalRelayerRegistration checks the following scenario: + // If a relayer is added provisionally and the manager gets deleted by governance BEFORE relayer registers itself + // then it shouldn't be able to register. + function testManagerDeleteProvisionalRelayerRegistration() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + address newRelayer = payable(addrSet[addrIdx++]); + + // add the above address as relayer address which currently doesn't have code + vm.prank(manager, manager); + newRelayerHub.updateRelayer(newRelayer); + + // here because the added relayer hasn't done the second step, therefore it shouldn't be added as a relayer + assertFalse(newRelayerHub.isRelayer(newRelayer)); + + // now delete manager before the relayer accepts being a relayer + bytes memory keyRemoveManager = "removeManager"; + updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); + + assertFalse(newRelayerHub.isProvisionalRelayer(newRelayer)); + + // now the relayer tries to register itself which should fail as its manager is already removed + vm.prank(newRelayer, newRelayer); + vm.expectRevert(bytes("relayer is not a provisional relayer")); + newRelayerHub.acceptBeingRelayer(manager); + assertFalse(newRelayerHub.isRelayer(newRelayer)); + + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From 979cd80ab60695616bd545088e64767e1d140845 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Thu, 16 Feb 2023 10:37:39 +0000 Subject: [PATCH 73/84] name change to be consistent --- contracts/RelayerHub.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index aeca8371..b0c8393f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -19,7 +19,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 internal requiredDeposit; // have to keep it to not break the storage layout uint256 internal dues; - mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit + mapping(address => relayer) deprecatedRelayers; // old map holding the relayers which are to be allowed safe exit mapping(address => bool) relayersExistMap; struct relayer { @@ -65,12 +65,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function unregister() external exist onlyInit { - relayer memory r = relayers[msg.sender]; + relayer memory r = deprecatedRelayers[msg.sender]; msg.sender.transfer(r.deposit.sub(r.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); systemPayable.transfer(r.dues); delete relayersExistMap[msg.sender]; - delete relayers[msg.sender]; + delete deprecatedRelayers[msg.sender]; emit relayerUnRegister(msg.sender); } From e094a54bc232ff66bfda592adefaa38e9f0a2233 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 20 Feb 2023 12:05:50 +0000 Subject: [PATCH 74/84] delete provisional relayer when relayer is deleted --- contracts/RelayerHub.sol | 9 ++++----- test/RelayerHub.t.sol | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index b0c8393f..a691560c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -145,6 +145,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); address oldRelayer = managerToRelayer[msg.sender]; + address oldProvisionalRelayer = managerToProvisionalRelayer[msg.sender]; if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); @@ -153,6 +154,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } else { delete managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; + delete provisionalRelayers[oldProvisionalRelayer]; emit relayerUpdated(oldRelayer, relayerToBeAdded); return; } @@ -164,11 +166,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // This 2 step process of relayer updating is required to avoid having a contract as a relayer. function acceptBeingRelayer(address manager) external onlyProvisionalRelayer { - // ensure code is zero for msg.sender and it is not a proxy - uint size; - address sender = msg.sender; - assembly { size := extcodesize(sender) } - require(size == 0, "provisional relayer is a contract"); + // ensure msg.sender is not contract and it is not a proxy + require(!isContract(msg.sender), "provisional relayer is a contract"); require(tx.origin == msg.sender, "provisional relayer is a proxy"); address oldRelayer = managerToRelayer[manager]; diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 1a032699..9a30cf15 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -357,6 +357,30 @@ contract RelayerHubTest is Deployer { } + function testDeleteProvisionalRelayerWhileRemovingRelayer() public { + // Say a manager is there and adds its relayer provisionally and then decides to set it to address(0) + // In this case the relayer is added as a provisional only and not full relayer + // So the provisional relayer should also be deleted, especially if the relayer is yet to add itself as a full relayer + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + address newRelayer = payable(addrSet[addrIdx++]); + + vm.prank(manager, manager); + newRelayerHub.updateRelayer(newRelayer); + assertTrue(newRelayerHub.isProvisionalRelayer(newRelayer)); + + // Now remove the relayer and ensure that it is deleted being a provisional relayer as well + vm.prank(manager, manager); + newRelayerHub.updateRelayer(address(0)); + assertFalse(newRelayerHub.isProvisionalRelayer(newRelayer)); + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From 1ecf7d0919857fe9bc67cf24f1bd3afc6599c1eb Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 20 Feb 2023 12:38:23 +0000 Subject: [PATCH 75/84] Check for correct manager --- contracts/RelayerHub.sol | 1 + test/RelayerHub.t.sol | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index a691560c..64827a9c 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -169,6 +169,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // ensure msg.sender is not contract and it is not a proxy require(!isContract(msg.sender), "provisional relayer is a contract"); require(tx.origin == msg.sender, "provisional relayer is a proxy"); + require(managerToProvisionalRelayer[manager] == msg.sender, "provisional is not set for this manager"); address oldRelayer = managerToRelayer[manager]; diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index 9a30cf15..b8594571 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -381,6 +381,28 @@ contract RelayerHubTest is Deployer { assertFalse(newRelayerHub.isProvisionalRelayer(newRelayer)); } + function testCorrectManagerForAcceptRelayer() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + + bytes memory keyAddManager = "addManager"; + address manager = payable(addrSet[addrIdx++]); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); + require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + + address newRelayer = payable(addrSet[addrIdx++]); + + vm.prank(manager, manager); + newRelayerHub.updateRelayer(newRelayer); + assertTrue(newRelayerHub.isProvisionalRelayer(newRelayer)); + + address randomManager = payable(addrSet[addrIdx++]); + vm.prank(newRelayer, newRelayer); + vm.expectRevert("provisional is not set for this manager"); + newRelayerHub.acceptBeingRelayer(randomManager); + + } + // function testCannotRegister() public { // address newRelayer = addrSet[addrIdx++]; // vm.startPrank(newRelayer, newRelayer); From f79183d087312525693aa5e432684efeb163b1d9 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 20 Feb 2023 12:43:19 +0000 Subject: [PATCH 76/84] update comment --- contracts/RelayerHub.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 64827a9c..279747c1 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -140,7 +140,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } // updateRelayer() can be used to add relayer for the first time, update it in future and remove it - // in case of removal we can simply update it to a non-existing account + // in case of removal, we set relayerToBeAdded to be address(0) function updateRelayer(address relayerToBeAdded) public onlyManager { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); From eb06f3845817c1185da21f3873ffd3f866b24125 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 20 Feb 2023 15:50:03 +0000 Subject: [PATCH 77/84] dlt managerToProvisionalRelayer when dltng relayer --- contracts/RelayerHub.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 279747c1..2146214f 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -155,6 +155,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; delete provisionalRelayers[oldProvisionalRelayer]; + delete managerToProvisionalRelayer[msg.sender]; emit relayerUpdated(oldRelayer, relayerToBeAdded); return; } From e326cd0106f13d9795a6426105ac97e3c815fd22 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 22 Feb 2023 11:28:06 +0000 Subject: [PATCH 78/84] address pr comments --- contracts/RelayerHub.sol | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 2146214f..b2738004 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -141,17 +141,16 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { // updateRelayer() can be used to add relayer for the first time, update it in future and remove it // in case of removal, we set relayerToBeAdded to be address(0) - function updateRelayer(address relayerToBeAdded) public onlyManager { + function updateRelayer(address relayerToBeAdded) external onlyManager { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - address oldRelayer = managerToRelayer[msg.sender]; - address oldProvisionalRelayer = managerToProvisionalRelayer[msg.sender]; - if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); provisionalRelayers[relayerToBeAdded] = true; managerToProvisionalRelayer[msg.sender] = relayerToBeAdded; } else { + address oldRelayer = managerToRelayer[msg.sender]; + address oldProvisionalRelayer = managerToProvisionalRelayer[msg.sender]; delete managerToRelayer[msg.sender]; delete currentRelayers[oldRelayer]; delete provisionalRelayers[oldProvisionalRelayer]; @@ -177,8 +176,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { currentRelayers[msg.sender] = true; managerToRelayer[manager] = msg.sender; - delete (provisionalRelayers[msg.sender]); - + delete provisionalRelayers[msg.sender]; + delete managerToProvisionalRelayer[manager]; delete currentRelayers[oldRelayer]; emit relayerUpdated(oldRelayer, msg.sender); @@ -192,7 +191,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { return provisionalRelayers[relayerAddress]; } - function isManager(address relayerAddress) external view returns (bool){ - return relayManagersExistMap[relayerAddress]; + function isManager(address managerAddress) external view returns (bool){ + return relayManagersExistMap[managerAddress]; } } From 1099e1b8b78ff6e14d9416b906698ccdfc5fc122 Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Mon, 27 Feb 2023 10:25:37 +0000 Subject: [PATCH 79/84] update template --- contracts/RelayerHub.template | 71 +++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 16 deletions(-) diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index 0e4143ed..e2a8c5bc 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -13,7 +13,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { uint256 public constant INIT_REQUIRED_DEPOSIT = 1e20; uint256 public constant INIT_DUES = 1e17; - + {% if network == 'local' %} address public constant WHITELIST_1 = 0xA904540818AC9c47f2321F97F1069B9d8746c6DB; address public constant WHITELIST_2 = 0x316b2Fa7C8a2ab7E21110a4B3f58771C01A71344; @@ -28,10 +28,10 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { address public constant WHITELIST_2 = 0x446AA6E0DC65690403dF3F127750da1322941F3e; {% endif %} - uint256 public requiredDeposit; // have to keep it to not break the storage layout - uint256 public dues; + uint256 internal requiredDeposit; // have to keep it to not break the storage layout + uint256 internal dues; - mapping(address => relayer) relayers; // old map holding the relayers which are to be allowed safe exit + mapping(address => relayer) deprecatedRelayers; // old map holding the relayers which are to be allowed safe exit mapping(address => bool) relayersExistMap; struct relayer { @@ -42,6 +42,8 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { mapping(address => bool) relayManagersExistMap; mapping(address => address) managerToRelayer; mapping(address => bool) currentRelayers; + mapping(address => bool) provisionalRelayers; + mapping(address => address) managerToProvisionalRelayer; bool public whitelistInitDone; @@ -55,13 +57,18 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { _; } - event relayerRegister(address _relayer); + modifier onlyProvisionalRelayer() { + require(provisionalRelayers[msg.sender], "relayer is not a provisional relayer"); + _; + } + event relayerUnRegister(address _relayer); event paramChange(string key, bytes value); event managerRemoved(address _removedManager); event managerAdded(address _addedManager); event relayerUpdated(address _from, address _to); + event relayerAddedProvisionally(address _relayer); function init() external onlyNotInit { requiredDeposit = INIT_REQUIRED_DEPOSIT; @@ -70,12 +77,12 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } function unregister() external exist onlyInit { - relayer memory r = relayers[msg.sender]; + relayer memory r = deprecatedRelayers[msg.sender]; msg.sender.transfer(r.deposit.sub(r.dues)); address payable systemPayable = address(uint160(SYSTEM_REWARD_ADDR)); systemPayable.transfer(r.dues); delete relayersExistMap[msg.sender]; - delete relayers[msg.sender]; + delete deprecatedRelayers[msg.sender]; emit relayerUnRegister(msg.sender); } @@ -124,6 +131,9 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { delete (relayManagersExistMap[managerAddress]); delete (managerToRelayer[managerAddress]); + delete (provisionalRelayers[managerToProvisionalRelayer[managerAddress]]); + delete (managerToProvisionalRelayer[managerAddress]); + // emit success event emit managerRemoved(managerAddress); if (relayerAddress != address(0)) { @@ -142,29 +152,58 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { } // updateRelayer() can be used to add relayer for the first time, update it in future and remove it - // in case of removal we can simply update it to a non-existing account - function updateRelayer(address relayerToBeAdded) public onlyManager { + // in case of removal, we set relayerToBeAdded to be address(0) + function updateRelayer(address relayerToBeAdded) external onlyManager { require(!isContract(relayerToBeAdded), "contract is not allowed to be a relayer"); - address oldRelayer = managerToRelayer[msg.sender]; - if (relayerToBeAdded != address(0)) { require(!currentRelayers[relayerToBeAdded], "relayer already exists"); - currentRelayers[relayerToBeAdded] = true; - managerToRelayer[msg.sender] = relayerToBeAdded; + provisionalRelayers[relayerToBeAdded] = true; + managerToProvisionalRelayer[msg.sender] = relayerToBeAdded; } else { + address oldRelayer = managerToRelayer[msg.sender]; + address oldProvisionalRelayer = managerToProvisionalRelayer[msg.sender]; delete managerToRelayer[msg.sender]; + delete currentRelayers[oldRelayer]; + delete provisionalRelayers[oldProvisionalRelayer]; + delete managerToProvisionalRelayer[msg.sender]; + emit relayerUpdated(oldRelayer, relayerToBeAdded); + return; } + emit relayerAddedProvisionally(relayerToBeAdded); + } + + // acceptBeingRelayer needs to be called by the relayer after being added provisionally. + // This 2 step process of relayer updating is required to avoid having a contract as a relayer. + function acceptBeingRelayer(address manager) external onlyProvisionalRelayer { + + // ensure msg.sender is not contract and it is not a proxy + require(!isContract(msg.sender), "provisional relayer is a contract"); + require(tx.origin == msg.sender, "provisional relayer is a proxy"); + require(managerToProvisionalRelayer[manager] == msg.sender, "provisional is not set for this manager"); + + address oldRelayer = managerToRelayer[manager]; + + currentRelayers[msg.sender] = true; + managerToRelayer[manager] = msg.sender; + + delete provisionalRelayers[msg.sender]; + delete managerToProvisionalRelayer[manager]; delete currentRelayers[oldRelayer]; - emit relayerUpdated(oldRelayer, relayerToBeAdded); + emit relayerUpdated(oldRelayer, msg.sender); + } function isRelayer(address relayerAddress) external override view returns (bool){ return currentRelayers[relayerAddress]; } - function isManager(address relayerAddress) external view returns (bool){ - return relayManagersExistMap[relayerAddress]; + function isProvisionalRelayer(address relayerAddress) external view returns (bool){ + return provisionalRelayers[relayerAddress]; + } + + function isManager(address managerAddress) external view returns (bool){ + return relayManagersExistMap[managerAddress]; } } From f01246139c642970c7770f38583df4a4471f7211 Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Wed, 1 Mar 2023 09:55:11 +0100 Subject: [PATCH 80/84] remove check for contracts on relayer manager --- contracts/RelayerHub.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index b2738004..40dea886 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -132,7 +132,6 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function addManagerByGov(address managerToBeAdded) internal { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); - require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); relayManagersExistMap[managerToBeAdded] = true; From ac8698d2ba3070c350460395cc8eaf782f7fb2bf Mon Sep 17 00:00:00 2001 From: emailtovamos Date: Wed, 1 Mar 2023 10:36:38 +0000 Subject: [PATCH 81/84] remove unused onlyWhitelabelRelayer --- contracts/CrossChain.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/CrossChain.sol b/contracts/CrossChain.sol index 6f259cac..777e0758 100644 --- a/contracts/CrossChain.sol +++ b/contracts/CrossChain.sol @@ -276,7 +276,6 @@ contract CrossChain is System, ICrossChain, IParamSubscriber{ function handlePackage(bytes calldata payload, bytes calldata proof, uint64 height, uint64 packageSequence, uint8 channelId) onlyInit onlyRelayer - onlyWhitelabelRelayer sequenceInOrder(packageSequence, channelId) blockSynced(height) channelSupported(channelId) From 0acc05897852b1cc0223736664b335771b4209ab Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Wed, 1 Mar 2023 12:55:45 +0100 Subject: [PATCH 82/84] relayer: update template --- contracts/RelayerHub.sol | 2 +- contracts/RelayerHub.template | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/RelayerHub.sol b/contracts/RelayerHub.sol index 40dea886..d5b6176e 100644 --- a/contracts/RelayerHub.sol +++ b/contracts/RelayerHub.sol @@ -132,7 +132,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function addManagerByGov(address managerToBeAdded) internal { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); - + relayManagersExistMap[managerToBeAdded] = true; emit managerAdded(managerToBeAdded); diff --git a/contracts/RelayerHub.template b/contracts/RelayerHub.template index e2a8c5bc..9fbfcc7f 100644 --- a/contracts/RelayerHub.template +++ b/contracts/RelayerHub.template @@ -144,8 +144,7 @@ contract RelayerHub is IRelayerHub, System, IParamSubscriber { function addManagerByGov(address managerToBeAdded) internal { require(!relayManagersExistMap[managerToBeAdded], "manager already exists"); - require(!isContract(managerToBeAdded), "contract is not allowed to be a manager"); - + relayManagersExistMap[managerToBeAdded] = true; emit managerAdded(managerToBeAdded); From df9bd2c146e063e330f46c825a1a2425f405c96c Mon Sep 17 00:00:00 2001 From: Mister-EA Date: Mon, 27 Feb 2023 09:59:50 +0100 Subject: [PATCH 83/84] extract helper function addNewManager in tests --- test/RelayerHub.t.sol | 106 +++++++++--------------------------------- 1 file changed, 22 insertions(+), 84 deletions(-) diff --git a/test/RelayerHub.t.sol b/test/RelayerHub.t.sol index b8594571..b6dddfa9 100644 --- a/test/RelayerHub.t.sol +++ b/test/RelayerHub.t.sol @@ -21,14 +21,8 @@ contract RelayerHubTest is Deployer { function testAddManager() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); + address manager = addNewManager(newRelayerHub); address newRelayer = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); // check if manager is there and can add a relayer vm.prank(manager, manager); @@ -85,6 +79,7 @@ contract RelayerHubTest is Deployer { bytes memory keyRemoveManager = "removeManager"; vm.expectEmit(true, true, false, true); emit managerRemoved(manager); + bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); updateParamByGovHub(keyRemoveManager, valueManagerBytes, address(newRelayerHub)); // check if relayer got removed @@ -96,6 +91,7 @@ contract RelayerHubTest is Deployer { assertFalse(isManagerFalse); // check if the manager can remove himself + bytes memory keyAddManager = "addManager"; updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); vm.prank(manager, manager); newRelayerHub.removeManagerByHimself(); @@ -103,13 +99,8 @@ contract RelayerHubTest is Deployer { function testRelayerAddingRemoving() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); + address manager = addNewManager(newRelayerHub); address newRelayer = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); vm.prank(manager, manager); vm.expectEmit(true, true, false, true); @@ -129,10 +120,7 @@ contract RelayerHubTest is Deployer { newRelayerHub.updateRelayer(payable(address(0))); // get a new manager, have its relayer registered and then try to remove the relayer for this manager - address manager2 = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); - require(valueManagerBytes2.length == 20, "length of manager2 address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes2, address(newRelayerHub)); + address manager2 = addNewManager(newRelayerHub); address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager2, manager2); vm.expectEmit(true, true, false, true); @@ -212,15 +200,21 @@ contract RelayerHubTest is Deployer { return newRelayerHub; } - function testRelayerAddingRemoving2() public { - RelayerHub newRelayerHub = helperGetNewRelayerHub(); - + // Helper function to add a new manager through RelayerHub + function addNewManager(RelayerHub relayerHub) internal returns (address) { bytes memory keyAddManager = "addManager"; address manager = payable(addrSet[addrIdx++]); - address newRelayer = payable(addrSet[addrIdx++]); bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + updateParamByGovHub(keyAddManager, valueManagerBytes, address(relayerHub)); + return manager; + } + + + function testRelayerAddingRemoving2() public { + RelayerHub newRelayerHub = helperGetNewRelayerHub(); + address manager = addNewManager(newRelayerHub); + address newRelayer = payable(addrSet[addrIdx++]); vm.prank(manager, manager); vm.expectEmit(true, true, false, true); @@ -232,10 +226,7 @@ contract RelayerHubTest is Deployer { emit relayerUpdated(payable(address(0)), newRelayer); newRelayerHub.acceptBeingRelayer(manager); - address manager2 = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes2 = abi.encodePacked(bytes20(uint160(manager2))); - require(valueManagerBytes2.length == 20, "length of manager2 address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes2, address(newRelayerHub)); + address manager2 = addNewManager(newRelayerHub); address newRelayer2 = payable(addrSet[addrIdx++]); vm.prank(manager2, manager2); @@ -265,12 +256,7 @@ contract RelayerHubTest is Deployer { function testContractRelayer() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + address manager = addNewManager(newRelayerHub); uint64 nonceManager = vm.getNonce(manager); @@ -297,12 +283,7 @@ contract RelayerHubTest is Deployer { function testProxyContractRelayer() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); + address manager = addNewManager(newRelayerHub); uint64 nonceManager = vm.getNonce(manager); @@ -327,13 +308,8 @@ contract RelayerHubTest is Deployer { // then it shouldn't be able to register. function testManagerDeleteProvisionalRelayerRegistration() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); + address manager = addNewManager(newRelayerHub); bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); - address newRelayer = payable(addrSet[addrIdx++]); // add the above address as relayer address which currently doesn't have code @@ -362,13 +338,7 @@ contract RelayerHubTest is Deployer { // In this case the relayer is added as a provisional only and not full relayer // So the provisional relayer should also be deleted, especially if the relayer is yet to add itself as a full relayer RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); - + address manager = addNewManager(newRelayerHub); address newRelayer = payable(addrSet[addrIdx++]); vm.prank(manager, manager); @@ -383,13 +353,7 @@ contract RelayerHubTest is Deployer { function testCorrectManagerForAcceptRelayer() public { RelayerHub newRelayerHub = helperGetNewRelayerHub(); - - bytes memory keyAddManager = "addManager"; - address manager = payable(addrSet[addrIdx++]); - bytes memory valueManagerBytes = abi.encodePacked(bytes20(uint160(manager))); - require(valueManagerBytes.length == 20, "length of manager address mismatch in tests"); - updateParamByGovHub(keyAddManager, valueManagerBytes, address(newRelayerHub)); - + address manager = addNewManager(newRelayerHub); address newRelayer = payable(addrSet[addrIdx++]); vm.prank(manager, manager); @@ -403,30 +367,4 @@ contract RelayerHubTest is Deployer { } - // function testCannotRegister() public { - // address newRelayer = addrSet[addrIdx++]; - // vm.startPrank(newRelayer, newRelayer); - // relayerHub.register{value: 100 ether}(); - // - // // re-register - // vm.expectRevert(bytes("relayer already exist")); - // relayerHub.register{value: 100 ether}(); - // - // relayerHub.unregister(); - // // re-unregister - // vm.expectRevert(bytes("relayer do not exist")); - // relayerHub.unregister(); - // - // vm.stopPrank(); - // newRelayer = addrSet[addrIdx++]; - // vm.startPrank(newRelayer, newRelayer); - // - // // send 200 ether - // vm.expectRevert(bytes("deposit value is not exactly the same")); - // relayerHub.register{value: 200 ether}(); - // - // // send 10 ether - // vm.expectRevert(bytes("deposit value is not exactly the same")); - // relayerHub.register{value: 10 ether}(); - // } } From b13d05550c3b6a0c40f19f7cf244daed7ac4f0a1 Mon Sep 17 00:00:00 2001 From: Matus Kysel Date: Tue, 7 Mar 2023 08:59:51 +0100 Subject: [PATCH 84/84] relayer: fix generation scripts --- generate-relayerhub.js | 1 + generate-system.js | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/generate-relayerhub.js b/generate-relayerhub.js index 7a62f56c..656c77e3 100644 --- a/generate-relayerhub.js +++ b/generate-relayerhub.js @@ -23,6 +23,7 @@ program.parse(process.argv); const data = { mock: program.mock, + network: program.network, }; const templateString = fs.readFileSync(program.template).toString(); diff --git a/generate-system.js b/generate-system.js index a42c90cb..b46759c9 100644 --- a/generate-system.js +++ b/generate-system.js @@ -32,7 +32,6 @@ const data = { fromChainId: program.fromChainId, bscChainId: program.bscChainId, mock: program.mock, - network: program.network, }; const templateString = fs.readFileSync(program.template).toString(); const resultString = nunjucks.renderString(templateString, data);