Skip to content

Commit ad4dd7e

Browse files
author
Michał Sieczkowski
authored
✍️ Add PoR feature control functions to TokenControllerV3 (#1205)
* Add Proof of Reserve feature control functions to TokenControllerV3 * Reorder elements of IPoRToken interface * Make TrueUSDWithPoR implement ITrueCurrency interface * Remove unusable refundGasWithHook function * Add missing licence declarations * Emit events at the end of the function for consistency * Always emit ProofOfReserveDisabled when proofOfReserveEnabled is set to false * Emit an event when Proof Of Reserve enabler is set * Revert line reorder in two setters * Remove placeholder test * Add previousEnabler param to ProofOfReserveEnablerSet event
1 parent 598a572 commit ad4dd7e

File tree

10 files changed

+77
-46
lines changed

10 files changed

+77
-46
lines changed

packages/contracts-por/contracts/TokenControllerV3.sol

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity 0.6.10;
23

34
import {SafeMath} from "@openzeppelin/contracts/math/SafeMath.sol";
45
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
56
import {IRegistry} from "./interface/IRegistry.sol";
67
import {IOwnedUpgradeabilityProxy} from "./interface/IOwnedUpgradeabilityProxy.sol";
78
import {ITrueCurrency} from "./interface/ITrueCurrency.sol";
9+
import {IPoRToken} from "./interface/IPoRToken.sol";
810

911
/**
1012
* @dev Contract that can be called with a gas refund
@@ -78,11 +80,13 @@ contract TokenControllerV3 {
7880
address public fastPause; // deprecated
7981
address public trueRewardManager; // deprecated
8082

83+
address public proofOfReserveEnabler;
84+
8185
// Registry attributes for admin keys
8286
bytes32 public constant IS_MINT_PAUSER = "isTUSDMintPausers";
8387
bytes32 public constant IS_MINT_RATIFIER = "isTUSDMintRatifier";
8488
bytes32 public constant IS_REDEMPTION_ADMIN = "isTUSDRedemptionAdmin";
85-
bytes32 public constant IS_GAS_REFUNDER = "isGasRefunder";
89+
// bytes32 public constant IS_GAS_REFUNDER = "isGasRefunder"; // deprecated
8690
bytes32 public constant IS_REGISTRY_ADMIN = "isRegistryAdmin";
8791

8892
// paused version of TrueCurrency in Production
@@ -114,11 +118,6 @@ contract TokenControllerV3 {
114118
_;
115119
}
116120

117-
modifier onlyGasRefunder() {
118-
require(registry.hasAttribute(msg.sender, IS_GAS_REFUNDER) || msg.sender == owner, "must be gas refunder or owner");
119-
_;
120-
}
121-
122121
modifier onlyRegistryAdmin() {
123122
require(registry.hasAttribute(msg.sender, IS_REGISTRY_ADMIN) || msg.sender == owner, "must be registry admin or owner");
124123
_;
@@ -153,6 +152,8 @@ contract TokenControllerV3 {
153152

154153
/// @dev Emitted when mint key was replaced
155154
event TransferMintKey(address indexed previousMintKey, address indexed newMintKey);
155+
/// @dev Emitted when Proof Of Reserve enabler was set
156+
event ProofOfReserveEnablerSet(address previousEnabler, address newEnabler);
156157
/// @dev Emitted when mint was ratified
157158
event MintRatified(uint256 indexed opIndex, address indexed ratifier);
158159
/// @dev Emitted when mint is revoked
@@ -199,6 +200,14 @@ contract TokenControllerV3 {
199200
_;
200201
}
201202

203+
/**
204+
* @dev Modifier throws if called by any account other than proofOfReserveEnabler or owner.
205+
*/
206+
modifier onlyProofOfReserveEnablerOrOwner() {
207+
require(msg.sender == proofOfReserveEnabler || msg.sender == owner, "only proofOfReserveEnabler or owner");
208+
_;
209+
}
210+
202211
/**
203212
* @dev Allows the current owner to set the pendingOwner address.
204213
* @param newOwner The address to transfer ownership to.
@@ -451,7 +460,7 @@ contract TokenControllerV3 {
451460

452461
/*
453462
========================================
454-
Key management
463+
Key and role management
455464
========================================
456465
*/
457466

@@ -465,6 +474,11 @@ contract TokenControllerV3 {
465474
mintKey = _newMintKey;
466475
}
467476

477+
function setProofOfReserveEnabler(address enabler) external onlyOwner {
478+
emit ProofOfReserveEnablerSet(proofOfReserveEnabler, enabler);
479+
proofOfReserveEnabler = enabler;
480+
}
481+
468482
/*
469483
========================================
470484
Mint Pausing
@@ -616,19 +630,37 @@ contract TokenControllerV3 {
616630
token.setCanBurn(burner, canBurn);
617631
}
618632

633+
/*
634+
========================================
635+
Proof of Reserve, administrative
636+
========================================
637+
*/
638+
639+
/**
640+
* Set new chainReserveFeed address
641+
*/
642+
function setChainReserveFeed(address newFeed) external onlyOwner {
643+
IPoRToken(address(token)).setChainReserveFeed(newFeed);
644+
}
645+
646+
/**
647+
* Set new chainReserveHeartbeat
648+
*/
649+
function setChainReserveHeartbeat(uint256 newHeartbeat) external onlyProofOfReserveEnablerOrOwner {
650+
IPoRToken(address(token)).setChainReserveHeartbeat(newHeartbeat);
651+
}
652+
653+
/**
654+
* Disable Proof of Reserve check
655+
*/
656+
function disableProofOfReserve() external onlyProofOfReserveEnablerOrOwner {
657+
IPoRToken(address(token)).disableProofOfReserve();
658+
}
659+
619660
/**
620-
* Call hook in `hookContract` with gas refund
661+
* Enable Proof of Reserve check
621662
*/
622-
function refundGasWithHook(IHook hookContract) external onlyGasRefunder {
623-
// calculate start gas amount
624-
uint256 startGas = gasleft();
625-
// call hook
626-
hookContract.hook();
627-
// calculate gas used
628-
uint256 gasUsed = startGas.sub(gasleft());
629-
// 1 refund = 15,000 gas. EVM refunds maximum half of used gas, so divide by 2.
630-
// Add 20% to compensate inter contract communication
631-
// (x + 20%) / 2 / 15000 = x / 25000
632-
token.refundGas(gasUsed.div(25000));
663+
function enableProofOfReserve() external onlyProofOfReserveEnablerOrOwner {
664+
IPoRToken(address(token)).enableProofOfReserve();
633665
}
634666
}

packages/contracts-por/contracts/TrueCurrency.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ abstract contract TrueCurrency is BurnableTokenWithBounds {
6868
* - `account` cannot be blacklisted.
6969
* - `account` cannot be a redemption address.
7070
*/
71-
function mint(address account, uint256 amount) external onlyOwner {
71+
function mint(address account, uint256 amount) override external onlyOwner {
7272
require(!isBlacklisted[account], "TrueCurrency: account is blacklisted");
7373
require(!isRedemptionAddress(account), "TrueCurrency: account is a redemption address");
7474
_mint(account, amount);
@@ -99,7 +99,7 @@ abstract contract TrueCurrency is BurnableTokenWithBounds {
9999
*
100100
* - `msg.sender` should be owner.
101101
*/
102-
function setCanBurn(address account, bool _canBurn) external onlyOwner {
102+
function setCanBurn(address account, bool _canBurn) override external onlyOwner {
103103
canBurn[account] = _canBurn;
104104
}
105105

packages/contracts-por/contracts/TrueCurrencyWithPoR.sol

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,9 @@ abstract contract TrueCurrencyWithPoR is TrueCurrency, IPoRToken {
5959
function setChainReserveFeed(address newFeed) external override onlyOwner {
6060
emit NewChainReserveFeed(chainReserveFeed, newFeed);
6161
chainReserveFeed = newFeed;
62-
if (newFeed == address(0) && proofOfReserveEnabled) {
62+
if (newFeed == address(0)) {
6363
proofOfReserveEnabled = false;
64+
emit ProofOfReserveDisabled();
6465
}
6566
}
6667

@@ -79,8 +80,8 @@ abstract contract TrueCurrencyWithPoR is TrueCurrency, IPoRToken {
7980
* @dev Admin function to disable Proof of Reserve
8081
*/
8182
function disableProofOfReserve() external override onlyOwner {
82-
emit ProofOfReserveDisabled();
8383
proofOfReserveEnabled = false;
84+
emit ProofOfReserveDisabled();
8485
}
8586

8687
/**
@@ -89,7 +90,7 @@ abstract contract TrueCurrencyWithPoR is TrueCurrency, IPoRToken {
8990
*/
9091
function enableProofOfReserve() external override onlyOwner {
9192
require(chainReserveFeed != address(0), "TrueCurrency: chainReserveFeed not set");
92-
emit ProofOfReserveEnabled();
9393
proofOfReserveEnabled = true;
94+
emit ProofOfReserveEnabled();
9495
}
9596
}

packages/contracts-por/contracts/common/BurnableTokenWithBounds.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ abstract contract BurnableTokenWithBounds is ReclaimerToken {
5252
* @param _min minimum amount that can be burned at once
5353
* @param _max maximum amount that can be burned at once
5454
*/
55-
function setBurnBounds(uint256 _min, uint256 _max) external onlyOwner {
55+
function setBurnBounds(uint256 _min, uint256 _max) override external onlyOwner {
5656
require(_min <= _max, "BurnableTokenWithBounds: min > max");
5757
burnMin = _min;
5858
burnMax = _max;

packages/contracts-por/contracts/common/ReclaimerToken.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,20 @@
22
pragma solidity 0.6.10;
33

44
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
5-
5+
import {ITrueCurrency} from "../interface/ITrueCurrency.sol";
66
import {ERC20} from "./ERC20.sol";
77

88
/**
99
* @title ReclaimerToken
1010
* @dev ERC20 token which allows owner to reclaim ERC20 tokens
1111
* or ether sent to this contract
1212
*/
13-
abstract contract ReclaimerToken is ERC20 {
13+
abstract contract ReclaimerToken is ERC20, ITrueCurrency {
1414
/**
1515
* @dev send all eth balance in the contract to another address
1616
* @param _to address to send eth balance to
1717
*/
18-
function reclaimEther(address payable _to) external onlyOwner {
18+
function reclaimEther(address payable _to) override external onlyOwner {
1919
_to.transfer(address(this).balance);
2020
}
2121

@@ -25,7 +25,7 @@ abstract contract ReclaimerToken is ERC20 {
2525
* @param token token to reclaim
2626
* @param _to address to send eth balance to
2727
*/
28-
function reclaimToken(IERC20 token, address _to) external onlyOwner {
28+
function reclaimToken(IERC20 token, address _to) override external onlyOwner {
2929
uint256 balance = token.balanceOf(address(this));
3030
token.transfer(_to, balance);
3131
}

packages/contracts-por/contracts/interface/IOwnedUpgradeabilityProxy.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity 0.6.10;
23

34
interface IOwnedUpgradeabilityProxy {

packages/contracts-por/contracts/interface/IPoRToken.sol

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22
pragma solidity 0.6.10;
33

44
interface IPoRToken {
5+
/*** Admin Functions ***/
6+
7+
function setChainReserveFeed(address newFeed) external;
8+
9+
function setChainReserveHeartbeat(uint256 newHeartbeat) external;
10+
11+
function enableProofOfReserve() external;
12+
13+
function disableProofOfReserve() external;
14+
15+
/*** Events ***/
16+
517
/**
618
* @notice Event emitted when the feed is updated
719
*/
@@ -21,14 +33,4 @@ interface IPoRToken {
2133
* @notice Event emitted when Proof of Reserve is disabled
2234
*/
2335
event ProofOfReserveDisabled();
24-
25-
/*** Admin Functions ***/
26-
27-
function setChainReserveFeed(address newFeed) external;
28-
29-
function setChainReserveHeartbeat(uint256 newHeartbeat) external;
30-
31-
function enableProofOfReserve() external;
32-
33-
function disableProofOfReserve() external;
3436
}

packages/contracts-por/contracts/interface/IRegistry.sol

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity 0.6.10;
23

34
interface IRegistry {

packages/contracts-por/contracts/interface/ITrueCurrency.sol

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// SPDX-License-Identifier: MIT
12
pragma solidity 0.6.10;
23

34
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
@@ -9,8 +10,6 @@ interface ITrueCurrency {
910

1011
function setBurnBounds(uint256 _min, uint256 _max) external;
1112

12-
function refundGas(uint256 amount) external;
13-
1413
function reclaimEther(address payable _to) external;
1514

1615
function reclaimToken(IERC20 token, address _to) external;

packages/contracts-por/test/Placeholder.test.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

0 commit comments

Comments
 (0)