2023-06-19 00:08:10 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
< html lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=UTF-8" >
< title > LCOV - lcov.info - reference/RelayerRegistry.sol< / title >
< link rel = "stylesheet" type = "text/css" href = "../gcov.css" >
< / head >
< body >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "title" > LCOV - code coverage report< / td > < / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr >
< td width = "100%" >
< table cellpadding = 1 border = 0 width = "100%" >
< tr >
< td width = "10%" class = "headerItem" > Current view:< / td >
< td width = "35%" class = "headerValue" > < a href = "../index.html" > top level< / a > - < a href = "index.html" > reference< / a > - RelayerRegistry.sol< span style = "font-size: 80%;" > (source / < a href = "RelayerRegistry.sol.func-sort-c.html" > functions< / a > )< / span > < / td >
< td width = "5%" > < / td >
< td width = "15%" > < / td >
< td width = "10%" class = "headerCovTableHead" > Hit< / td >
< td width = "10%" class = "headerCovTableHead" > Total< / td >
< td width = "15%" class = "headerCovTableHead" > Coverage< / td >
< / tr >
< tr >
< td class = "headerItem" > Test:< / td >
< td class = "headerValue" > lcov.info< / td >
< td > < / td >
< td class = "headerItem" > Lines:< / td >
< td class = "headerCovTableEntry" > 0< / td >
< td class = "headerCovTableEntry" > 65< / td >
< td class = "headerCovTableEntryLo" > 0.0 %< / td >
< / tr >
< tr >
< td class = "headerItem" > Date:< / td >
2023-06-20 21:04:29 +00:00
< td class = "headerValue" > 2023-06-20 21:04:08< / td >
2023-06-19 00:08:10 +00:00
< td > < / td >
< td class = "headerItem" > Functions:< / td >
< td class = "headerCovTableEntry" > 0< / td >
< td class = "headerCovTableEntry" > 21< / td >
< td class = "headerCovTableEntryLo" > 0.0 %< / td >
< / tr >
< tr >
< td class = "headerItem" > Legend:< / td >
< td class = "headerValueLeg" > Lines:
< span class = "coverLegendCov" > hit< / span >
< span class = "coverLegendNoCov" > not hit< / span >
< / td >
< td > < / td >
< / tr >
< tr > < td > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< / td >
< / tr >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< / table >
< table cellpadding = 0 cellspacing = 0 border = 0 >
< tr >
< td > < br > < / td >
< / tr >
< tr >
< td >
< pre class = "sourceHeading" > Line data Source code< / pre >
< pre class = "source" >
< a name = "1" > < span class = "lineNum" > 1 < / span > : // SPDX-License-Identifier: MIT< / a >
< a name = "2" > < span class = "lineNum" > 2 < / span > : < / a >
< a name = "3" > < span class = "lineNum" > 3 < / span > : pragma solidity ^0.6.12;< / a >
< a name = "4" > < span class = "lineNum" > 4 < / span > : pragma experimental ABIEncoderV2;< / a >
< a name = "5" > < span class = "lineNum" > 5 < / span > : < / a >
< a name = "6" > < span class = "lineNum" > 6 < / span > : import { SafeMath } from " @openzeppelin/contracts/math/SafeMath.sol" ;< / a >
< a name = "7" > < span class = "lineNum" > 7 < / span > : import { IERC20 } from " @openzeppelin/contracts/token/ERC20/IERC20.sol" ;< / a >
< a name = "8" > < span class = "lineNum" > 8 < / span > : import { Initializable } from " @openzeppelin/contracts/proxy/Initializable.sol" ;< / a >
< a name = "9" > < span class = "lineNum" > 9 < / span > : import { SafeERC20 } from " @openzeppelin/contracts/token/ERC20/SafeERC20.sol" ;< / a >
< a name = "10" > < span class = "lineNum" > 10 < / span > : import { EnsResolve } from " torn-token/contracts/ENS.sol" ;< / a >
< a name = "11" > < span class = "lineNum" > 11 < / span > : import { TORN } from " torn-token/contracts/TORN.sol" ;< / a >
< a name = "12" > < span class = "lineNum" > 12 < / span > : import { TornadoStakingRewards } from " ../v1/staking/TornadoStakingRewards.sol" ;< / a >
< a name = "13" > < span class = "lineNum" > 13 < / span > : < / a >
< a name = "14" > < span class = "lineNum" > 14 < / span > : interface ITornadoInstance {< / a >
< a name = "15" > < span class = "lineNum" > 15 < / span > : function token() external view returns (address);< / a >
< a name = "16" > < span class = "lineNum" > 16 < / span > : < / a >
< a name = "17" > < span class = "lineNum" > 17 < / span > : function denomination() external view returns (uint256);< / a >
< a name = "18" > < span class = "lineNum" > 18 < / span > : < / a >
< a name = "19" > < span class = "lineNum" > 19 < / span > : function deposit(bytes32 commitment) external payable;< / a >
< a name = "20" > < span class = "lineNum" > 20 < / span > : < / a >
< a name = "21" > < span class = "lineNum" > 21 < / span > : function withdraw(< / a >
< a name = "22" > < span class = "lineNum" > 22 < / span > : bytes calldata proof,< / a >
< a name = "23" > < span class = "lineNum" > 23 < / span > : bytes32 root,< / a >
< a name = "24" > < span class = "lineNum" > 24 < / span > : bytes32 nullifierHash,< / a >
< a name = "25" > < span class = "lineNum" > 25 < / span > : address payable recipient,< / a >
< a name = "26" > < span class = "lineNum" > 26 < / span > : address payable relayer,< / a >
< a name = "27" > < span class = "lineNum" > 27 < / span > : uint256 fee,< / a >
< a name = "28" > < span class = "lineNum" > 28 < / span > : uint256 refund< / a >
< a name = "29" > < span class = "lineNum" > 29 < / span > : ) external payable;< / a >
< a name = "30" > < span class = "lineNum" > 30 < / span > : }< / a >
< a name = "31" > < span class = "lineNum" > 31 < / span > : < / a >
< a name = "32" > < span class = "lineNum" > 32 < / span > : interface IENS {< / a >
< a name = "33" > < span class = "lineNum" > 33 < / span > : function owner(bytes32 node) external view returns (address);< / a >
< a name = "34" > < span class = "lineNum" > 34 < / span > : }< / a >
< a name = "35" > < span class = "lineNum" > 35 < / span > : < / a >
< a name = "36" > < span class = "lineNum" > 36 < / span > : /*< / a >
< a name = "37" > < span class = "lineNum" > 37 < / span > : * @dev Solidity implementation of the ENS namehash algorithm.< / a >
< a name = "38" > < span class = "lineNum" > 38 < / span > : *< / a >
< a name = "39" > < span class = "lineNum" > 39 < / span > : * Warning! Does not normalize or validate names before hashing.< / a >
< a name = "40" > < span class = "lineNum" > 40 < / span > : * Original version can be found here https://github.com/JonahGroendal/ens-namehash/< / a >
< a name = "41" > < span class = "lineNum" > 41 < / span > : */< / a >
< a name = "42" > < span class = "lineNum" > 42 < / span > : library ENSNamehash {< / a >
< a name = "43" > < span class = "lineNum" > 43 < / span > : function namehash(bytes memory domain) internal pure returns (bytes32) {< / a >
< a name = "44" > < span class = "lineNum" > 44 < / span > < span class = "lineNoCov" > 0 : return namehash(domain, 0);< / span > < / a >
< a name = "45" > < span class = "lineNum" > 45 < / span > : }< / a >
< a name = "46" > < span class = "lineNum" > 46 < / span > : < / a >
< a name = "47" > < span class = "lineNum" > 47 < / span > : function namehash(bytes memory domain, uint256 i) internal pure returns (bytes32) {< / a >
< a name = "48" > < span class = "lineNum" > 48 < / span > < span class = "lineNoCov" > 0 : if (domain.length < = i) return 0x0000000000000000000000000000000000000000000000000000000000000000;< / span > < / a >
< a name = "49" > < span class = "lineNum" > 49 < / span > : < / a >
< a name = "50" > < span class = "lineNum" > 50 < / span > < span class = "lineNoCov" > 0 : uint256 len = labelLength(domain, i);< / span > < / a >
< a name = "51" > < span class = "lineNum" > 51 < / span > : < / a >
< a name = "52" > < span class = "lineNum" > 52 < / span > < span class = "lineNoCov" > 0 : return keccak256(abi.encodePacked(namehash(domain, i + len + 1), keccak(domain, i, len)));< / span > < / a >
< a name = "53" > < span class = "lineNum" > 53 < / span > : }< / a >
< a name = "54" > < span class = "lineNum" > 54 < / span > : < / a >
< a name = "55" > < span class = "lineNum" > 55 < / span > : function labelLength(bytes memory domain, uint256 i) private pure returns (uint256) {< / a >
< a name = "56" > < span class = "lineNum" > 56 < / span > < span class = "lineNoCov" > 0 : uint256 len;< / span > < / a >
< a name = "57" > < span class = "lineNum" > 57 < / span > < span class = "lineNoCov" > 0 : while (i + len != domain.length & & domain[i + len] != 0x2e) {< / span > < / a >
< a name = "58" > < span class = "lineNum" > 58 < / span > < span class = "lineNoCov" > 0 : len++;< / span > < / a >
< a name = "59" > < span class = "lineNum" > 59 < / span > : }< / a >
< a name = "60" > < span class = "lineNum" > 60 < / span > < span class = "lineNoCov" > 0 : return len;< / span > < / a >
< a name = "61" > < span class = "lineNum" > 61 < / span > : }< / a >
< a name = "62" > < span class = "lineNum" > 62 < / span > : < / a >
< a name = "63" > < span class = "lineNum" > 63 < / span > : function keccak(bytes memory data, uint256 offset, uint256 len) private pure returns (bytes32 ret) {< / a >
< a name = "64" > < span class = "lineNum" > 64 < / span > < span class = "lineNoCov" > 0 : require(offset + len < = data.length);< / span > < / a >
< a name = "65" > < span class = "lineNum" > 65 < / span > : assembly {< / a >
< a name = "66" > < span class = "lineNum" > 66 < / span > < span class = "lineNoCov" > 0 : ret := keccak256(add(add(data, 32), offset), len)< / span > < / a >
< a name = "67" > < span class = "lineNum" > 67 < / span > : }< / a >
< a name = "68" > < span class = "lineNum" > 68 < / span > : }< / a >
< a name = "69" > < span class = "lineNum" > 69 < / span > : }< / a >
< a name = "70" > < span class = "lineNum" > 70 < / span > : < / a >
< a name = "71" > < span class = "lineNum" > 71 < / span > : interface IFeeManager {< / a >
< a name = "72" > < span class = "lineNum" > 72 < / span > : function instanceFeeWithUpdate(ITornadoInstance _instance) external returns (uint160);< / a >
< a name = "73" > < span class = "lineNum" > 73 < / span > : }< / a >
< a name = "74" > < span class = "lineNum" > 74 < / span > : < / a >
< a name = "75" > < span class = "lineNum" > 75 < / span > : struct RelayerState {< / a >
< a name = "76" > < span class = "lineNum" > 76 < / span > : uint256 balance;< / a >
< a name = "77" > < span class = "lineNum" > 77 < / span > : bytes32 ensHash;< / a >
< a name = "78" > < span class = "lineNum" > 78 < / span > : }< / a >
< a name = "79" > < span class = "lineNum" > 79 < / span > : < / a >
< a name = "80" > < span class = "lineNum" > 80 < / span > : /**< / a >
< a name = "81" > < span class = "lineNum" > 81 < / span > : * @notice Registry contract, one of the main contracts of this protocol upgrade.< / a >
< a name = "82" > < span class = "lineNum" > 82 < / span > : * The contract should store relayers' addresses and data attributed to the< / a >
< a name = "83" > < span class = "lineNum" > 83 < / span > : * master address of the relayer. This data includes the relayers stake and< / a >
< a name = "84" > < span class = "lineNum" > 84 < / span > : * his ensHash.< / a >
< a name = "85" > < span class = "lineNum" > 85 < / span > : * A relayers master address has a number of subaddresses called " workers" ,< / a >
< a name = "86" > < span class = "lineNum" > 86 < / span > : * these are all addresses which burn stake in communication with the proxy.< / a >
< a name = "87" > < span class = "lineNum" > 87 < / span > : * If a relayer is not registered, he is not displayed on the frontend.< / a >
< a name = "88" > < span class = "lineNum" > 88 < / span > : * @dev CONTRACT RISKS:< / a >
< a name = "89" > < span class = "lineNum" > 89 < / span > : * - if setter functions are compromised, relayer metadata would be at risk, including the noted amount< / a >
< a name = "90" > < span class = "lineNum" > 90 < / span > : * of his balance< / a >
< a name = "91" > < span class = "lineNum" > 91 < / span > : * - if burn function is compromised, relayers run the risk of being unable to handle withdrawals< / a >
< a name = "92" > < span class = "lineNum" > 92 < / span > : * - the above risk also applies to the nullify balance function< / a >
< a name = "93" > < span class = "lineNum" > 93 < / span > : *< / a >
< a name = "94" > < span class = "lineNum" > 94 < / span > : */< / a >
< a name = "95" > < span class = "lineNum" > 95 < / span > : contract RelayerRegistry is Initializable, EnsResolve {< / a >
< a name = "96" > < span class = "lineNum" > 96 < / span > : using SafeMath for uint256;< / a >
< a name = "97" > < span class = "lineNum" > 97 < / span > : using SafeERC20 for TORN;< / a >
< a name = "98" > < span class = "lineNum" > 98 < / span > : using ENSNamehash for bytes;< / a >
< a name = "99" > < span class = "lineNum" > 99 < / span > : < / a >
< a name = "100" > < span class = "lineNum" > 100 < / span > : TORN public immutable torn;< / a >
< a name = "101" > < span class = "lineNum" > 101 < / span > : address public immutable governance;< / a >
< a name = "102" > < span class = "lineNum" > 102 < / span > : IENS public immutable ens;< / a >
< a name = "103" > < span class = "lineNum" > 103 < / span > : TornadoStakingRewards public immutable staking;< / a >
< a name = "104" > < span class = "lineNum" > 104 < / span > : IFeeManager public immutable feeManager;< / a >
< a name = "105" > < span class = "lineNum" > 105 < / span > : < / a >
< a name = "106" > < span class = "lineNum" > 106 < / span > : address public tornadoRouter;< / a >
< a name = "107" > < span class = "lineNum" > 107 < / span > : uint256 public minStakeAmount;< / a >
< a name = "108" > < span class = "lineNum" > 108 < / span > : < / a >
< a name = "109" > < span class = "lineNum" > 109 < / span > : mapping(address => RelayerState) public relayers;< / a >
< a name = "110" > < span class = "lineNum" > 110 < / span > : mapping(address => address) public workers;< / a >
< a name = "111" > < span class = "lineNum" > 111 < / span > : < / a >
< a name = "112" > < span class = "lineNum" > 112 < / span > : event RelayerBalanceNullified(address relayer);< / a >
< a name = "113" > < span class = "lineNum" > 113 < / span > : event WorkerRegistered(address relayer, address worker);< / a >
< a name = "114" > < span class = "lineNum" > 114 < / span > : event WorkerUnregistered(address relayer, address worker);< / a >
< a name = "115" > < span class = "lineNum" > 115 < / span > : event StakeAddedToRelayer(address relayer, uint256 amountStakeAdded);< / a >
< a name = "116" > < span class = "lineNum" > 116 < / span > : event StakeBurned(address relayer, uint256 amountBurned);< / a >
< a name = "117" > < span class = "lineNum" > 117 < / span > : event MinimumStakeAmount(uint256 minStakeAmount);< / a >
< a name = "118" > < span class = "lineNum" > 118 < / span > : event RouterRegistered(address tornadoRouter);< / a >
< a name = "119" > < span class = "lineNum" > 119 < / span > : event RelayerRegistered(bytes32 relayer, string ensName, address relayerAddress, uint256 stakedAmount);< / a >
< a name = "120" > < span class = "lineNum" > 120 < / span > : < / a >
< a name = "121" > < span class = "lineNum" > 121 < / span > : modifier onlyGovernance() {< / a >
< a name = "122" > < span class = "lineNum" > 122 < / span > : require(msg.sender == governance, " only governance" );< / a >
< a name = "123" > < span class = "lineNum" > 123 < / span > : _;< / a >
< a name = "124" > < span class = "lineNum" > 124 < / span > : }< / a >
< a name = "125" > < span class = "lineNum" > 125 < / span > : < / a >
< a name = "126" > < span class = "lineNum" > 126 < / span > : modifier onlyTornadoRouter() {< / a >
< a name = "127" > < span class = "lineNum" > 127 < / span > : require(msg.sender == tornadoRouter, " only proxy" );< / a >
< a name = "128" > < span class = "lineNum" > 128 < / span > : _;< / a >
< a name = "129" > < span class = "lineNum" > 129 < / span > : }< / a >
< a name = "130" > < span class = "lineNum" > 130 < / span > : < / a >
< a name = "131" > < span class = "lineNum" > 131 < / span > : modifier onlyRelayer(address sender, address relayer) {< / a >
< a name = "132" > < span class = "lineNum" > 132 < / span > : require(workers[sender] == relayer, " only relayer" );< / a >
< a name = "133" > < span class = "lineNum" > 133 < / span > : _;< / a >
< a name = "134" > < span class = "lineNum" > 134 < / span > : }< / a >
< a name = "135" > < span class = "lineNum" > 135 < / span > : < / a >
< a name = "136" > < span class = "lineNum" > 136 < / span > : constructor(address _torn, address _governance, address _ens, address _staking, address _feeManager)< / a >
< a name = "137" > < span class = "lineNum" > 137 < / span > : public< / a >
< a name = "138" > < span class = "lineNum" > 138 < / span > : {< / a >
< a name = "139" > < span class = "lineNum" > 139 < / span > : torn = TORN(_torn);< / a >
< a name = "140" > < span class = "lineNum" > 140 < / span > : governance = _governance;< / a >
< a name = "141" > < span class = "lineNum" > 141 < / span > : ens = IENS(_ens);< / a >
< a name = "142" > < span class = "lineNum" > 142 < / span > : staking = TornadoStakingRewards(_staking);< / a >
< a name = "143" > < span class = "lineNum" > 143 < / span > : feeManager = IFeeManager(_feeManager);< / a >
< a name = "144" > < span class = "lineNum" > 144 < / span > : }< / a >
< a name = "145" > < span class = "lineNum" > 145 < / span > : < / a >
< a name = "146" > < span class = "lineNum" > 146 < / span > : /**< / a >
< a name = "147" > < span class = "lineNum" > 147 < / span > : * @notice initialize function for upgradeability< / a >
< a name = "148" > < span class = "lineNum" > 148 < / span > : * @dev this contract will be deployed behind a proxy and should not assign values at logic address,< / a >
< a name = "149" > < span class = "lineNum" > 149 < / span > : * params left out because self explainable< / a >
< a name = "150" > < span class = "lineNum" > 150 < / span > : *< / a >
< a name = "151" > < span class = "lineNum" > 151 < / span > : */< / a >
< a name = "152" > < span class = "lineNum" > 152 < / span > : function initialize(bytes32 _tornadoRouter) external initializer {< / a >
< a name = "153" > < span class = "lineNum" > 153 < / span > < span class = "lineNoCov" > 0 : tornadoRouter = resolve(_tornadoRouter);< / span > < / a >
< a name = "154" > < span class = "lineNum" > 154 < / span > : }< / a >
< a name = "155" > < span class = "lineNum" > 155 < / span > : < / a >
< a name = "156" > < span class = "lineNum" > 156 < / span > : /**< / a >
< a name = "157" > < span class = "lineNum" > 157 < / span > : * @notice This function should register a master address and optionally a set of workeres for a relayer +< / a >
< a name = "158" > < span class = "lineNum" > 158 < / span > : * metadata< / a >
< a name = "159" > < span class = "lineNum" > 159 < / span > : * @dev Relayer can't steal other relayers workers since they are registered, and a wallet (msg.sender< / a >
< a name = "160" > < span class = "lineNum" > 160 < / span > : * check) can always unregister itself< / a >
< a name = "161" > < span class = "lineNum" > 161 < / span > : * @param ensName ens name of the relayer< / a >
< a name = "162" > < span class = "lineNum" > 162 < / span > : * @param stake the initial amount of stake in TORN the relayer is depositing< / a >
< a name = "163" > < span class = "lineNum" > 163 < / span > : *< / a >
< a name = "164" > < span class = "lineNum" > 164 < / span > : */< / a >
< a name = "165" > < span class = "lineNum" > 165 < / span > : function register(string calldata ensName, uint256 stake, address[] calldata workersToRegister)< / a >
< a name = "166" > < span class = "lineNum" > 166 < / span > : external< / a >
< a name = "167" > < span class = "lineNum" > 167 < / span > : {< / a >
< a name = "168" > < span class = "lineNum" > 168 < / span > < span class = "lineNoCov" > 0 : _register(msg.sender, ensName, stake, workersToRegister);< / span > < / a >
< a name = "169" > < span class = "lineNum" > 169 < / span > : }< / a >
< a name = "170" > < span class = "lineNum" > 170 < / span > : < / a >
< a name = "171" > < span class = "lineNum" > 171 < / span > : /**< / a >
< a name = "172" > < span class = "lineNum" > 172 < / span > : * @dev Register function equivalent with permit-approval instead of regular approve.< / a >
< a name = "173" > < span class = "lineNum" > 173 < / span > : *< / a >
< a name = "174" > < span class = "lineNum" > 174 < / span > : */< / a >
< a name = "175" > < span class = "lineNum" > 175 < / span > : function registerPermit(< / a >
< a name = "176" > < span class = "lineNum" > 176 < / span > : string calldata ensName,< / a >
< a name = "177" > < span class = "lineNum" > 177 < / span > : uint256 stake,< / a >
< a name = "178" > < span class = "lineNum" > 178 < / span > : address[] calldata workersToRegister,< / a >
< a name = "179" > < span class = "lineNum" > 179 < / span > : address relayer,< / a >
< a name = "180" > < span class = "lineNum" > 180 < / span > : uint256 deadline,< / a >
< a name = "181" > < span class = "lineNum" > 181 < / span > : uint8 v,< / a >
< a name = "182" > < span class = "lineNum" > 182 < / span > : bytes32 r,< / a >
< a name = "183" > < span class = "lineNum" > 183 < / span > : bytes32 s< / a >
< a name = "184" > < span class = "lineNum" > 184 < / span > : ) external {< / a >
< a name = "185" > < span class = "lineNum" > 185 < / span > < span class = "lineNoCov" > 0 : torn.permit(relayer, address(this), stake, deadline, v, r, s);< / span > < / a >
< a name = "186" > < span class = "lineNum" > 186 < / span > < span class = "lineNoCov" > 0 : _register(relayer, ensName, stake, workersToRegister);< / span > < / a >
< a name = "187" > < span class = "lineNum" > 187 < / span > : }< / a >
< a name = "188" > < span class = "lineNum" > 188 < / span > : < / a >
< a name = "189" > < span class = "lineNum" > 189 < / span > : function _register(< / a >
< a name = "190" > < span class = "lineNum" > 190 < / span > : address relayer,< / a >
< a name = "191" > < span class = "lineNum" > 191 < / span > : string calldata ensName,< / a >
< a name = "192" > < span class = "lineNum" > 192 < / span > : uint256 stake,< / a >
< a name = "193" > < span class = "lineNum" > 193 < / span > : address[] calldata workersToRegister< / a >
< a name = "194" > < span class = "lineNum" > 194 < / span > : ) internal {< / a >
< a name = "195" > < span class = "lineNum" > 195 < / span > < span class = "lineNoCov" > 0 : bytes32 ensHash = bytes(ensName).namehash();< / span > < / a >
< a name = "196" > < span class = "lineNum" > 196 < / span > < span class = "lineNoCov" > 0 : require(relayer == ens.owner(ensHash), " only ens owner" );< / span > < / a >
< a name = "197" > < span class = "lineNum" > 197 < / span > < span class = "lineNoCov" > 0 : require(workers[relayer] == address(0), " cant register again" );< / span > < / a >
< a name = "198" > < span class = "lineNum" > 198 < / span > < span class = "lineNoCov" > 0 : RelayerState storage metadata = relayers[relayer];< / span > < / a >
< a name = "199" > < span class = "lineNum" > 199 < / span > : < / a >
< a name = "200" > < span class = "lineNum" > 200 < / span > < span class = "lineNoCov" > 0 : require(metadata.ensHash == bytes32(0), " registered already" );< / span > < / a >
< a name = "201" > < span class = "lineNum" > 201 < / span > < span class = "lineNoCov" > 0 : require(stake > = minStakeAmount, " !min_stake" );< / span > < / a >
< a name = "202" > < span class = "lineNum" > 202 < / span > : < / a >
< a name = "203" > < span class = "lineNum" > 203 < / span > < span class = "lineNoCov" > 0 : torn.safeTransferFrom(relayer, address(staking), stake);< / span > < / a >
< a name = "204" > < span class = "lineNum" > 204 < / span > < span class = "lineNoCov" > 0 : emit StakeAddedToRelayer(relayer, stake);< / span > < / a >
< a name = "205" > < span class = "lineNum" > 205 < / span > : < / a >
< a name = "206" > < span class = "lineNum" > 206 < / span > < span class = "lineNoCov" > 0 : metadata.balance = stake;< / span > < / a >
< a name = "207" > < span class = "lineNum" > 207 < / span > < span class = "lineNoCov" > 0 : metadata.ensHash = ensHash;< / span > < / a >
< a name = "208" > < span class = "lineNum" > 208 < / span > < span class = "lineNoCov" > 0 : workers[relayer] = relayer;< / span > < / a >
< a name = "209" > < span class = "lineNum" > 209 < / span > : < / a >
< a name = "210" > < span class = "lineNum" > 210 < / span > < span class = "lineNoCov" > 0 : for (uint256 i = 0; i < workersToRegister.length; i++) {< / span > < / a >
< a name = "211" > < span class = "lineNum" > 211 < / span > < span class = "lineNoCov" > 0 : address worker = workersToRegister[i];< / span > < / a >
< a name = "212" > < span class = "lineNum" > 212 < / span > < span class = "lineNoCov" > 0 : _registerWorker(relayer, worker);< / span > < / a >
< a name = "213" > < span class = "lineNum" > 213 < / span > : }< / a >
< a name = "214" > < span class = "lineNum" > 214 < / span > : < / a >
< a name = "215" > < span class = "lineNum" > 215 < / span > < span class = "lineNoCov" > 0 : emit RelayerRegistered(ensHash, ensName, relayer, stake);< / span > < / a >
< a name = "216" > < span class = "lineNum" > 216 < / span > : }< / a >
< a name = "217" > < span class = "lineNum" > 217 < / span > : < / a >
< a name = "218" > < span class = "lineNum" > 218 < / span > : /**< / a >
< a name = "219" > < span class = "lineNum" > 219 < / span > : * @notice This function should allow relayers to register more workeres< / a >
< a name = "220" > < span class = "lineNum" > 220 < / span > : * @param relayer Relayer which should send message from any worker which is already registered< / a >
< a name = "221" > < span class = "lineNum" > 221 < / span > : * @param worker Address to register< / a >
< a name = "222" > < span class = "lineNum" > 222 < / span > : *< / a >
< a name = "223" > < span class = "lineNum" > 223 < / span > : */< / a >
< a name = "224" > < span class = "lineNum" > 224 < / span > : function registerWorker(address relayer, address worker) external onlyRelayer(msg.sender, relayer) {< / a >
< a name = "225" > < span class = "lineNum" > 225 < / span > < span class = "lineNoCov" > 0 : _registerWorker(relayer, worker);< / span > < / a >
< a name = "226" > < span class = "lineNum" > 226 < / span > : }< / a >
< a name = "227" > < span class = "lineNum" > 227 < / span > : < / a >
< a name = "228" > < span class = "lineNum" > 228 < / span > : function _registerWorker(address relayer, address worker) internal {< / a >
< a name = "229" > < span class = "lineNum" > 229 < / span > < span class = "lineNoCov" > 0 : require(workers[worker] == address(0), " can't steal an address" );< / span > < / a >
< a name = "230" > < span class = "lineNum" > 230 < / span > < span class = "lineNoCov" > 0 : workers[worker] = relayer;< / span > < / a >
< a name = "231" > < span class = "lineNum" > 231 < / span > < span class = "lineNoCov" > 0 : emit WorkerRegistered(relayer, worker);< / span > < / a >
< a name = "232" > < span class = "lineNum" > 232 < / span > : }< / a >
< a name = "233" > < span class = "lineNum" > 233 < / span > : < / a >
< a name = "234" > < span class = "lineNum" > 234 < / span > : /**< / a >
< a name = "235" > < span class = "lineNum" > 235 < / span > : * @notice This function should allow anybody to unregister an address they own< / a >
< a name = "236" > < span class = "lineNum" > 236 < / span > : * @dev designed this way as to allow someone to unregister themselves in case a relayer misbehaves< / a >
< a name = "237" > < span class = "lineNum" > 237 < / span > : * - this should be followed by an action like burning relayer stake< / a >
< a name = "238" > < span class = "lineNum" > 238 < / span > : * - there was an option of allowing the sender to burn relayer stake in case of malicious behaviour,< / a >
< a name = "239" > < span class = "lineNum" > 239 < / span > : * this feature was not included in the end< / a >
< a name = "240" > < span class = "lineNum" > 240 < / span > : * - reverts if trying to unregister master, otherwise contract would break. in general, there should< / a >
< a name = "241" > < span class = "lineNum" > 241 < / span > : * be no reason to unregister master at all< / a >
< a name = "242" > < span class = "lineNum" > 242 < / span > : *< / a >
< a name = "243" > < span class = "lineNum" > 243 < / span > : */< / a >
< a name = "244" > < span class = "lineNum" > 244 < / span > : function unregisterWorker(address worker) external {< / a >
< a name = "245" > < span class = "lineNum" > 245 < / span > < span class = "lineNoCov" > 0 : if (worker != msg.sender) require(workers[worker] == msg.sender, " only owner of worker" );< / span > < / a >
< a name = "246" > < span class = "lineNum" > 246 < / span > < span class = "lineNoCov" > 0 : require(workers[worker] != worker, " cant unregister master" );< / span > < / a >
< a name = "247" > < span class = "lineNum" > 247 < / span > < span class = "lineNoCov" > 0 : emit WorkerUnregistered(workers[worker], worker);< / span > < / a >
< a name = "248" > < span class = "lineNum" > 248 < / span > < span class = "lineNoCov" > 0 : workers[worker] = address(0);< / span > < / a >
< a name = "249" > < span class = "lineNum" > 249 < / span > : }< / a >
< a name = "250" > < span class = "lineNum" > 250 < / span > : < / a >
< a name = "251" > < span class = "lineNum" > 251 < / span > : /**< / a >
< a name = "252" > < span class = "lineNum" > 252 < / span > : * @notice This function should allow anybody to stake to a relayer more TORN< / a >
< a name = "253" > < span class = "lineNum" > 253 < / span > : * @param relayer Relayer main address to stake to< / a >
< a name = "254" > < span class = "lineNum" > 254 < / span > : * @param stake Stake to be added to relayer< / a >
< a name = "255" > < span class = "lineNum" > 255 < / span > : *< / a >
< a name = "256" > < span class = "lineNum" > 256 < / span > : */< / a >
< a name = "257" > < span class = "lineNum" > 257 < / span > : function stakeToRelayer(address relayer, uint256 stake) external {< / a >
< a name = "258" > < span class = "lineNum" > 258 < / span > < span class = "lineNoCov" > 0 : _stakeToRelayer(msg.sender, relayer, stake);< / span > < / a >
< a name = "259" > < span class = "lineNum" > 259 < / span > : }< / a >
< a name = "260" > < span class = "lineNum" > 260 < / span > : < / a >
< a name = "261" > < span class = "lineNum" > 261 < / span > : /**< / a >
< a name = "262" > < span class = "lineNum" > 262 < / span > : * @dev stakeToRelayer function equivalent with permit-approval instead of regular approve.< / a >
< a name = "263" > < span class = "lineNum" > 263 < / span > : * @param staker address from that stake is paid< / a >
< a name = "264" > < span class = "lineNum" > 264 < / span > : *< / a >
< a name = "265" > < span class = "lineNum" > 265 < / span > : */< / a >
< a name = "266" > < span class = "lineNum" > 266 < / span > : function stakeToRelayerPermit(< / a >
< a name = "267" > < span class = "lineNum" > 267 < / span > : address relayer,< / a >
< a name = "268" > < span class = "lineNum" > 268 < / span > : uint256 stake,< / a >
< a name = "269" > < span class = "lineNum" > 269 < / span > : address staker,< / a >
< a name = "270" > < span class = "lineNum" > 270 < / span > : uint256 deadline,< / a >
< a name = "271" > < span class = "lineNum" > 271 < / span > : uint8 v,< / a >
< a name = "272" > < span class = "lineNum" > 272 < / span > : bytes32 r,< / a >
< a name = "273" > < span class = "lineNum" > 273 < / span > : bytes32 s< / a >
< a name = "274" > < span class = "lineNum" > 274 < / span > : ) external {< / a >
< a name = "275" > < span class = "lineNum" > 275 < / span > < span class = "lineNoCov" > 0 : torn.permit(staker, address(this), stake, deadline, v, r, s);< / span > < / a >
< a name = "276" > < span class = "lineNum" > 276 < / span > < span class = "lineNoCov" > 0 : _stakeToRelayer(staker, relayer, stake);< / span > < / a >
< a name = "277" > < span class = "lineNum" > 277 < / span > : }< / a >
< a name = "278" > < span class = "lineNum" > 278 < / span > : < / a >
< a name = "279" > < span class = "lineNum" > 279 < / span > : function _stakeToRelayer(address staker, address relayer, uint256 stake) internal {< / a >
< a name = "280" > < span class = "lineNum" > 280 < / span > < span class = "lineNoCov" > 0 : require(workers[relayer] == relayer, " !registered" );< / span > < / a >
< a name = "281" > < span class = "lineNum" > 281 < / span > < span class = "lineNoCov" > 0 : torn.safeTransferFrom(staker, address(staking), stake);< / span > < / a >
< a name = "282" > < span class = "lineNum" > 282 < / span > < span class = "lineNoCov" > 0 : relayers[relayer].balance = stake.add(relayers[relayer].balance);< / span > < / a >
< a name = "283" > < span class = "lineNum" > 283 < / span > < span class = "lineNoCov" > 0 : emit StakeAddedToRelayer(relayer, stake);< / span > < / a >
< a name = "284" > < span class = "lineNum" > 284 < / span > : }< / a >
< a name = "285" > < span class = "lineNum" > 285 < / span > : < / a >
< a name = "286" > < span class = "lineNum" > 286 < / span > : /**< / a >
< a name = "287" > < span class = "lineNum" > 287 < / span > : * @notice This function should burn some relayer stake on withdraw and notify staking of this< / a >
< a name = "288" > < span class = "lineNum" > 288 < / span > : * @dev IMPORTANT FUNCTION:< / a >
< a name = "289" > < span class = "lineNum" > 289 < / span > : * - This should be only called by the tornado proxy< / a >
< a name = "290" > < span class = "lineNum" > 290 < / span > : * - Should revert if relayer does not call proxy from valid worker< / a >
< a name = "291" > < span class = "lineNum" > 291 < / span > : * - Should not overflow< / a >
< a name = "292" > < span class = "lineNum" > 292 < / span > : * - Should underflow and revert (SafeMath) on not enough stake (balance)< / a >
< a name = "293" > < span class = "lineNum" > 293 < / span > : * @param sender worker to check sender == relayer< / a >
< a name = "294" > < span class = "lineNum" > 294 < / span > : * @param relayer address of relayer who's stake is being burned< / a >
< a name = "295" > < span class = "lineNum" > 295 < / span > : * @param pool instance to get fee for< / a >
< a name = "296" > < span class = "lineNum" > 296 < / span > : *< / a >
< a name = "297" > < span class = "lineNum" > 297 < / span > : */< / a >
< a name = "298" > < span class = "lineNum" > 298 < / span > : function burn(address sender, address relayer, ITornadoInstance pool) external onlyTornadoRouter {< / a >
< a name = "299" > < span class = "lineNum" > 299 < / span > < span class = "lineNoCov" > 0 : address masterAddress = workers[sender];< / span > < / a >
< a name = "300" > < span class = "lineNum" > 300 < / span > < span class = "lineNoCov" > 0 : if (masterAddress == address(0)) {< / span > < / a >
< a name = "301" > < span class = "lineNum" > 301 < / span > < span class = "lineNoCov" > 0 : require(workers[relayer] == address(0), " Only custom relayer" );< / span > < / a >
< a name = "302" > < span class = "lineNum" > 302 < / span > < span class = "lineNoCov" > 0 : return;< / span > < / a >
< a name = "303" > < span class = "lineNum" > 303 < / span > : }< / a >
< a name = "304" > < span class = "lineNum" > 304 < / span > : < / a >
< a name = "305" > < span class = "lineNum" > 305 < / span > < span class = "lineNoCov" > 0 : require(masterAddress == relayer, " only relayer" );< / span > < / a >
< a name = "306" > < span class = "lineNum" > 306 < / span > < span class = "lineNoCov" > 0 : uint256 toBurn = feeManager.instanceFeeWithUpdate(pool);< / span > < / a >
< a name = "307" > < span class = "lineNum" > 307 < / span > < span class = "lineNoCov" > 0 : relayers[relayer].balance = relayers[relayer].balance.sub(toBurn);< / span > < / a >
< a name = "308" > < span class = "lineNum" > 308 < / span > < span class = "lineNoCov" > 0 : staking.addBurnRewards(toBurn);< / span > < / a >
< a name = "309" > < span class = "lineNum" > 309 < / span > < span class = "lineNoCov" > 0 : emit StakeBurned(relayer, toBurn);< / span > < / a >
< a name = "310" > < span class = "lineNum" > 310 < / span > : }< / a >
< a name = "311" > < span class = "lineNum" > 311 < / span > : < / a >
< a name = "312" > < span class = "lineNum" > 312 < / span > : /**< / a >
< a name = "313" > < span class = "lineNum" > 313 < / span > : * @notice This function should allow governance to set the minimum stake amount< / a >
< a name = "314" > < span class = "lineNum" > 314 < / span > : * @param minAmount new minimum stake amount< / a >
< a name = "315" > < span class = "lineNum" > 315 < / span > : *< / a >
< a name = "316" > < span class = "lineNum" > 316 < / span > : */< / a >
< a name = "317" > < span class = "lineNum" > 317 < / span > : function setMinStakeAmount(uint256 minAmount) external onlyGovernance {< / a >
< a name = "318" > < span class = "lineNum" > 318 < / span > < span class = "lineNoCov" > 0 : minStakeAmount = minAmount;< / span > < / a >
< a name = "319" > < span class = "lineNum" > 319 < / span > < span class = "lineNoCov" > 0 : emit MinimumStakeAmount(minAmount);< / span > < / a >
< a name = "320" > < span class = "lineNum" > 320 < / span > : }< / a >
< a name = "321" > < span class = "lineNum" > 321 < / span > : < / a >
< a name = "322" > < span class = "lineNum" > 322 < / span > : /**< / a >
< a name = "323" > < span class = "lineNum" > 323 < / span > : * @notice This function should allow governance to set a new tornado proxy address< / a >
< a name = "324" > < span class = "lineNum" > 324 < / span > : * @param tornadoRouterAddress address of the new proxy< / a >
< a name = "325" > < span class = "lineNum" > 325 < / span > : *< / a >
< a name = "326" > < span class = "lineNum" > 326 < / span > : */< / a >
< a name = "327" > < span class = "lineNum" > 327 < / span > : function setTornadoRouter(address tornadoRouterAddress) external onlyGovernance {< / a >
< a name = "328" > < span class = "lineNum" > 328 < / span > < span class = "lineNoCov" > 0 : tornadoRouter = tornadoRouterAddress;< / span > < / a >
< a name = "329" > < span class = "lineNum" > 329 < / span > < span class = "lineNoCov" > 0 : emit RouterRegistered(tornadoRouterAddress);< / span > < / a >
< a name = "330" > < span class = "lineNum" > 330 < / span > : }< / a >
< a name = "331" > < span class = "lineNum" > 331 < / span > : < / a >
< a name = "332" > < span class = "lineNum" > 332 < / span > : /**< / a >
< a name = "333" > < span class = "lineNum" > 333 < / span > : * @notice This function should allow governance to nullify a relayers balance< / a >
< a name = "334" > < span class = "lineNum" > 334 < / span > : * @dev IMPORTANT FUNCTION:< / a >
< a name = "335" > < span class = "lineNum" > 335 < / span > : * - Should nullify the balance< / a >
< a name = "336" > < span class = "lineNum" > 336 < / span > : * - Adding nullified balance as rewards was refactored to allow for the flexibility of these funds< / a >
< a name = "337" > < span class = "lineNum" > 337 < / span > : * (for gov to operate with them)< / a >
< a name = "338" > < span class = "lineNum" > 338 < / span > : * @param relayer address of relayer who's balance is to nullify< / a >
< a name = "339" > < span class = "lineNum" > 339 < / span > : *< / a >
< a name = "340" > < span class = "lineNum" > 340 < / span > : */< / a >
< a name = "341" > < span class = "lineNum" > 341 < / span > : function nullifyBalance(address relayer) external onlyGovernance {< / a >
< a name = "342" > < span class = "lineNum" > 342 < / span > < span class = "lineNoCov" > 0 : address masterAddress = workers[relayer];< / span > < / a >
< a name = "343" > < span class = "lineNum" > 343 < / span > < span class = "lineNoCov" > 0 : require(relayer == masterAddress, " must be master" );< / span > < / a >
< a name = "344" > < span class = "lineNum" > 344 < / span > < span class = "lineNoCov" > 0 : relayers[masterAddress].balance = 0;< / span > < / a >
< a name = "345" > < span class = "lineNum" > 345 < / span > < span class = "lineNoCov" > 0 : emit RelayerBalanceNullified(relayer);< / span > < / a >
< a name = "346" > < span class = "lineNum" > 346 < / span > : }< / a >
< a name = "347" > < span class = "lineNum" > 347 < / span > : < / a >
< a name = "348" > < span class = "lineNum" > 348 < / span > : /**< / a >
< a name = "349" > < span class = "lineNum" > 349 < / span > : * @notice This function should check if a worker is associated with a relayer< / a >
< a name = "350" > < span class = "lineNum" > 350 < / span > : * @param toResolve address to check< / a >
< a name = "351" > < span class = "lineNum" > 351 < / span > : * @return true if is associated< / a >
< a name = "352" > < span class = "lineNum" > 352 < / span > : *< / a >
< a name = "353" > < span class = "lineNum" > 353 < / span > : */< / a >
< a name = "354" > < span class = "lineNum" > 354 < / span > : function isRelayer(address toResolve) external view returns (bool) {< / a >
< a name = "355" > < span class = "lineNum" > 355 < / span > < span class = "lineNoCov" > 0 : return workers[toResolve] != address(0);< / span > < / a >
< a name = "356" > < span class = "lineNum" > 356 < / span > : }< / a >
< a name = "357" > < span class = "lineNum" > 357 < / span > : < / a >
< a name = "358" > < span class = "lineNum" > 358 < / span > : /**< / a >
< a name = "359" > < span class = "lineNum" > 359 < / span > : * @notice This function should check if a worker is registered to the relayer stated< / a >
< a name = "360" > < span class = "lineNum" > 360 < / span > : * @param relayer relayer to check< / a >
< a name = "361" > < span class = "lineNum" > 361 < / span > : * @param toResolve address to check< / a >
< a name = "362" > < span class = "lineNum" > 362 < / span > : * @return true if registered< / a >
< a name = "363" > < span class = "lineNum" > 363 < / span > : *< / a >
< a name = "364" > < span class = "lineNum" > 364 < / span > : */< / a >
< a name = "365" > < span class = "lineNum" > 365 < / span > : function isRelayerRegistered(address relayer, address toResolve) external view returns (bool) {< / a >
< a name = "366" > < span class = "lineNum" > 366 < / span > < span class = "lineNoCov" > 0 : return workers[toResolve] == relayer;< / span > < / a >
< a name = "367" > < span class = "lineNum" > 367 < / span > : }< / a >
< a name = "368" > < span class = "lineNum" > 368 < / span > : < / a >
< a name = "369" > < span class = "lineNum" > 369 < / span > : /**< / a >
< a name = "370" > < span class = "lineNum" > 370 < / span > : * @notice This function should get a relayers ensHash< / a >
< a name = "371" > < span class = "lineNum" > 371 < / span > : * @param relayer address to fetch for< / a >
< a name = "372" > < span class = "lineNum" > 372 < / span > : * @return relayer's ensHash< / a >
< a name = "373" > < span class = "lineNum" > 373 < / span > : *< / a >
< a name = "374" > < span class = "lineNum" > 374 < / span > : */< / a >
< a name = "375" > < span class = "lineNum" > 375 < / span > : function getRelayerEnsHash(address relayer) external view returns (bytes32) {< / a >
< a name = "376" > < span class = "lineNum" > 376 < / span > < span class = "lineNoCov" > 0 : return relayers[workers[relayer]].ensHash;< / span > < / a >
< a name = "377" > < span class = "lineNum" > 377 < / span > : }< / a >
< a name = "378" > < span class = "lineNum" > 378 < / span > : < / a >
< a name = "379" > < span class = "lineNum" > 379 < / span > : /**< / a >
< a name = "380" > < span class = "lineNum" > 380 < / span > : * @notice This function should get a relayers balance< / a >
< a name = "381" > < span class = "lineNum" > 381 < / span > : * @param relayer relayer who's balance is to fetch< / a >
< a name = "382" > < span class = "lineNum" > 382 < / span > : * @return relayer's balance< / a >
< a name = "383" > < span class = "lineNum" > 383 < / span > : *< / a >
< a name = "384" > < span class = "lineNum" > 384 < / span > : */< / a >
< a name = "385" > < span class = "lineNum" > 385 < / span > : function getRelayerBalance(address relayer) external view returns (uint256) {< / a >
< a name = "386" > < span class = "lineNum" > 386 < / span > < span class = "lineNoCov" > 0 : return relayers[workers[relayer]].balance;< / span > < / a >
< a name = "387" > < span class = "lineNum" > 387 < / span > : }< / a >
< a name = "388" > < span class = "lineNum" > 388 < / span > : }< / a >
< / pre >
< / td >
< / tr >
< / table >
< br >
< table width = "100%" border = 0 cellspacing = 0 cellpadding = 0 >
< tr > < td class = "ruler" > < img src = "../glass.png" width = 3 height = 3 alt = "" > < / td > < / tr >
< tr > < td class = "versionInfo" > Generated by: < a href = "https://github.com/linux-test-project/lcov" target = "_parent" > LCOV version 1.16< / a > < / td > < / tr >
< / table >
< br >
< / body >
< / html >